/** * @author mrdoob / http://mrdoob.com/ */ THREE.WebGLGeometries = function ( gl, properties, info ) { var geometries = {}; this.get = function ( object ) { var geometry = object.geometry; if ( geometries[ geometry.id ] !== undefined ) { return geometries[ geometry.id ]; } geometry.addEventListener( 'dispose', onGeometryDispose ); if ( geometry instanceof THREE.BufferGeometry ) { geometries[ geometry.id ] = geometry; } else if ( geometry instanceof THREE.Geometry ) { if ( geometry._bufferGeometry === undefined ) { geometry._bufferGeometry = new THREE.BufferGeometry().setFromObject( object ); } geometries[ geometry.id ] = geometry._bufferGeometry; } info.memory.geometries ++; return geometries[ geometry.id ]; }; 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 ); delete geometries[ geometry.id ]; info.memory.geometries --; } 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 ); } } };