three
Version:
JavaScript 3D library
144 lines (74 loc) • 2.52 kB
JavaScript
/**
* @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;
};