/** * @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 ( object._bufferGeometry === undefined ) { object._bufferGeometry = new THREE.BufferGeometry().setFromObject( object ); } geometries[ geometry.id ] = object._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 ); }; }; };