Browse Source

Merge branch 'fixGPUMemory' of https://github.com/gero3/three.js into dev

Conflicts:
	src/renderers/webgl/WebGLGeometries.js
Mr.doob 10 years ago
parent
commit
d42a72fc79
2 changed files with 43 additions and 2 deletions
  1. 42 1
      src/renderers/webgl/WebGLGeometries.js
  2. 1 1
      src/renderers/webgl/WebGLObjects.js

+ 42 - 1
src/renderers/webgl/WebGLGeometries.js

@@ -2,7 +2,7 @@
 * @author mrdoob / http://mrdoob.com/
 */
 
-THREE.WebGLGeometries = function ( gl, info ) {
+THREE.WebGLGeometries = function ( gl, properties, info ) {
 
 	var geometries = {};
 
@@ -43,6 +43,21 @@ THREE.WebGLGeometries = function ( gl, info ) {
 	function onGeometryDispose( event ) {
 
 		var geometry = event.target;
+		var buffergeometry = geometries[ geometry.id ];
+
+		for ( var name in buffergeometry.attributes ) {
+
+			var attribute = buffergeometry.attributes[ name ];
+			var buffer = getAttributeBuffer( attribute );
+
+			if ( buffer !== undefined ) {
+
+				gl.deleteBuffer( buffer );
+				removeAttributeBuffer( attribute );
+
+			}
+
+		}
 
 		geometry.removeEventListener( 'dispose', onGeometryDispose );
 
@@ -52,4 +67,30 @@ THREE.WebGLGeometries = function ( gl, info ) {
 
 	}
 
+	function getAttributeBuffer( attribute ) {
+
+		if ( attribute instanceof THREE.InterleavedBufferAttribute ) {
+
+			return properties.get( attribute.data ).__webglBuffer;
+
+		}
+
+		return properties.get( attribute ).__webglBuffer;
+
+	}
+
+	function removeAttributeBuffer( attribute ) {
+
+		if ( attribute instanceof THREE.InterleavedBufferAttribute ) {
+
+			properties.delete( attribute.data );
+
+		} else {
+
+			properties.delete( attribute );
+
+		}
+
+	}
+
 };

+ 1 - 1
src/renderers/webgl/WebGLObjects.js

@@ -8,7 +8,7 @@ THREE.WebGLObjects = function ( gl, properties, info ) {
 
 	var morphInfluences = new Float32Array( 8 );
 
-	var geometries = new THREE.WebGLGeometries( gl, info );
+	var geometries = new THREE.WebGLGeometries( gl, properties, info );
 
 	//