123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- /**
- * @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 );
- }
- }
- };
|