Преглед изворни кода

Added .deallocate() to RenderTarget.

Mr.doob пре 12 година
родитељ
комит
3f29e1a912
2 измењених фајлова са 75 додато и 180 уклоњено
  1. 8 0
      src/renderers/WebGLRenderTarget.js
  2. 67 180
      src/renderers/WebGLRenderer.js

+ 8 - 0
src/renderers/WebGLRenderTarget.js

@@ -5,6 +5,8 @@
 
 THREE.WebGLRenderTarget = function ( width, height, options ) {
 
+	THREE.EventTarget.call( this );
+
 	this.width = width;
 	this.height = height;
 
@@ -57,3 +59,9 @@ THREE.WebGLRenderTarget.prototype.clone = function() {
 	return tmp;
 
 };
+
+THREE.WebGLRenderTarget.prototype.deallocate = function () {
+
+	this.dispatchEvent( { type: 'deallocate' } );
+
+};

+ 67 - 180
src/renderers/WebGLRenderer.js

@@ -364,155 +364,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
-	// Deallocation
-
-	/*
-	this.deallocateObject = function ( object ) {
-
-		if ( ! object.__webglInit ) return;
-
-		object.__webglInit = false;
-
-		delete object._modelViewMatrix;
-		delete object._normalMatrix;
-
-		if ( object instanceof THREE.Mesh ) {
-
-			for ( var g in object.geometry.geometryGroups ) {
-
-				deleteMeshBuffers( object.geometry.geometryGroups[ g ] );
-
-			}
-
-		} else if ( object instanceof THREE.Ribbon ) {
-
-			deleteRibbonBuffers( object.geometry );
-
-		} else if ( object instanceof THREE.Line ) {
-
-			deleteLineBuffers( object.geometry );
-
-		} else if ( object instanceof THREE.ParticleSystem ) {
-
-			deleteParticleBuffers( object.geometry );
-
-		}
-
-	};
-
-	this.deallocateTexture = function ( texture ) {
-
-		// cube texture
-
-		if ( texture.image && texture.image.__webglTextureCube ) {
-
-			_gl.deleteTexture( texture.image.__webglTextureCube );
-
-		// 2D texture
-
-		} else {
-
-			if ( ! texture.__webglInit ) return;
-
-			texture.__webglInit = false;
-			_gl.deleteTexture( texture.__webglTexture );
-
-		}
-
-		_this.info.memory.textures --;
-
-	};
-	*/
-
-	this.deallocateRenderTarget = function ( renderTarget ) {
-
-		if ( !renderTarget || ! renderTarget.__webglTexture ) return;
-
-		_gl.deleteTexture( renderTarget.__webglTexture );
-
-		if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {
-
-			for ( var i = 0; i < 6; i ++ ) {
-
-				_gl.deleteFramebuffer( renderTarget.__webglFramebuffer[ i ] );
-				_gl.deleteRenderbuffer( renderTarget.__webglRenderbuffer[ i ] );
-
-			}
-
-		} else {
-
-			_gl.deleteFramebuffer( renderTarget.__webglFramebuffer );
-			_gl.deleteRenderbuffer( renderTarget.__webglRenderbuffer );
-
-		}
-
-	};
-
-	/*
-	this.deallocateMaterial = function ( material ) {
-
-		var program = material.program;
-
-		if ( ! program ) return;
-
-		material.program = undefined;
-
-		// only deallocate GL program if this was the last use of shared program
-		// assumed there is only single copy of any program in the _programs list
-		// (that's how it's constructed)
-
-		var i, il, programInfo;
-		var deleteProgram = false;
-
-		for ( i = 0, il = _programs.length; i < il; i ++ ) {
-
-			programInfo = _programs[ i ];
-
-			if ( programInfo.program === program ) {
-
-				programInfo.usedTimes --;
-
-				if ( programInfo.usedTimes === 0 ) {
-
-					deleteProgram = true;
-
-				}
-
-				break;
-
-			}
-
-		}
-
-		if ( deleteProgram ) {
-
-			// avoid using array.splice, this is costlier than creating new array from scratch
-
-			var newPrograms = [];
-
-			for ( i = 0, il = _programs.length; i < il; i ++ ) {
-
-				programInfo = _programs[ i ];
-
-				if ( programInfo.program !== program ) {
-
-					newPrograms.push( programInfo );
-
-				}
-
-			}
-
-			_programs = newPrograms;
-
-			_gl.deleteProgram( program );
-
-			_this.info.memory.programs --;
-
-		}
-
-	};
-	*/
-
 	// Rendering
 
 	this.updateShadowMap = function ( scene, camera ) {
@@ -531,37 +382,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
-	// Events
-
-	var onGeometryDeallocate = function () {
-
-		this.removeEventListener( 'deallocate', onGeometryDeallocate );
-
-		deallocateGeometry( this );
-
-		_this.info.memory.geometries --;
-
-	};
-
-	var onTextureDeallocate = function () {
-
-		this.removeEventListener( 'deallocate', onTextureDeallocate );
-
-		deallocateTexture( this );
-
-		_this.info.memory.textures --;
-
-
-	};
-
-	var onMaterialDeallocate = function () {
-
-		this.removeEventListener( 'deallocate', onMaterialDeallocate );
-
-		deallocateMaterial( this );
-
-	};
-
 	// Internal functions
 
 	// Buffer allocation
@@ -640,6 +460,47 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
+	// Events
+
+	var onGeometryDeallocate = function () {
+
+		this.removeEventListener( 'deallocate', onGeometryDeallocate );
+
+		deallocateGeometry( this );
+
+		_this.info.memory.geometries --;
+
+	};
+
+	var onTextureDeallocate = function () {
+
+		this.removeEventListener( 'deallocate', onTextureDeallocate );
+
+		deallocateTexture( this );
+
+		_this.info.memory.textures --;
+
+
+	};
+
+	var onRenderTargetDeallocate = function () {
+
+		this.removeEventListener( 'deallocate', onRenderTargetDeallocate );
+
+		deallocateRenderTarget( this );
+
+		_this.info.memory.textures --;
+
+	};
+
+	var onMaterialDeallocate = function () {
+
+		this.removeEventListener( 'deallocate', onMaterialDeallocate );
+
+		deallocateMaterial( this );
+
+	};
+
 	// Buffer deallocation
 
 	var deallocateGeometry = function ( geometry ) {
@@ -720,6 +581,30 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
+	var deallocateRenderTarget = function ( renderTarget ) {
+
+		if ( !renderTarget || ! renderTarget.__webglTexture ) return;
+
+		_gl.deleteTexture( renderTarget.__webglTexture );
+
+		if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {
+
+			for ( var i = 0; i < 6; i ++ ) {
+
+				_gl.deleteFramebuffer( renderTarget.__webglFramebuffer[ i ] );
+				_gl.deleteRenderbuffer( renderTarget.__webglRenderbuffer[ i ] );
+
+			}
+
+		} else {
+
+			_gl.deleteFramebuffer( renderTarget.__webglFramebuffer );
+			_gl.deleteRenderbuffer( renderTarget.__webglRenderbuffer );
+
+		}
+
+	};
+
 	var deallocateMaterial = function ( material ) {
 
 		var program = material.program;
@@ -7114,6 +6999,8 @@ THREE.WebGLRenderer = function ( parameters ) {
 			if ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true;
 			if ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true;
 
+			renderTarget.addEventListener( 'deallocate', onRenderTargetDeallocate );
+
 			renderTarget.__webglTexture = _gl.createTexture();
 
 			_this.info.memory.textures ++;