|
@@ -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 );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
};
|