UNPKG

three

Version:

JavaScript 3D library

144 lines (74 loc) 2.52 kB
/** * @author mrdoob / http://mrdoob.com/ */ THREE.WebGLGeometries = function ( gl, properties, info ) { var geometries = {}; function get( object ) { var geometry = object.geometry; if ( geometries[ geometry.id ] !== undefined ) { return geometries[ geometry.id ]; } geometry.addEventListener( 'dispose', onGeometryDispose ); var buffergeometry; if ( geometry instanceof THREE.BufferGeometry ) { buffergeometry = geometry; } else if ( geometry instanceof THREE.Geometry ) { if ( geometry._bufferGeometry === undefined ) { geometry._bufferGeometry = new THREE.BufferGeometry().setFromObject( object ); } buffergeometry = geometry._bufferGeometry; } geometries[ geometry.id ] = buffergeometry; info.memory.geometries ++; return buffergeometry; } function onGeometryDispose( event ) { var geometry = event.target; var buffergeometry = geometries[ geometry.id ]; if ( buffergeometry.index !== null ) { deleteAttribute( buffergeometry.index ); } deleteAttributes( buffergeometry.attributes ); geometry.removeEventListener( 'dispose', onGeometryDispose ); delete geometries[ geometry.id ]; // TODO var property = properties.get( geometry ); if ( property.wireframe ) { deleteAttribute( property.wireframe ); } properties.delete( geometry ); var bufferproperty = properties.get( buffergeometry ); if ( bufferproperty.wireframe ) { deleteAttribute( bufferproperty.wireframe ); } properties.delete( buffergeometry ); // info.memory.geometries --; } function getAttributeBuffer( attribute ) { if ( attribute instanceof THREE.InterleavedBufferAttribute ) { return properties.get( attribute.data ).__webglBuffer; } return properties.get( attribute ).__webglBuffer; } function deleteAttribute( attribute ) { var buffer = getAttributeBuffer( attribute ); if ( buffer !== undefined ) { gl.deleteBuffer( buffer ); removeAttributeBuffer( attribute ); } } function deleteAttributes( attributes ) { for ( var name in attributes ) { deleteAttribute( attributes[ name ] ); } } function removeAttributeBuffer( attribute ) { if ( attribute instanceof THREE.InterleavedBufferAttribute ) { properties.delete( attribute.data ); } else { properties.delete( attribute ); } } this.get = get; };