Spaces:
Running
Running
/** | |
* @author mrdoob / http://mrdoob.com/ | |
*/ | |
import { Uint16BufferAttribute, Uint32BufferAttribute } from '../../core/BufferAttribute.js'; | |
import { BufferGeometry } from '../../core/BufferGeometry.js'; | |
import { arrayMax } from '../../utils.js'; | |
function WebGLGeometries( gl, attributes, info ) { | |
var geometries = {}; | |
var wireframeAttributes = {}; | |
function onGeometryDispose( event ) { | |
var geometry = event.target; | |
var buffergeometry = geometries[ geometry.id ]; | |
if ( buffergeometry.index !== null ) { | |
attributes.remove( buffergeometry.index ); | |
} | |
for ( var name in buffergeometry.attributes ) { | |
attributes.remove( buffergeometry.attributes[ name ] ); | |
} | |
geometry.removeEventListener( 'dispose', onGeometryDispose ); | |
delete geometries[ geometry.id ]; | |
var attribute = wireframeAttributes[ buffergeometry.id ]; | |
if ( attribute ) { | |
attributes.remove( attribute ); | |
delete wireframeAttributes[ buffergeometry.id ]; | |
} | |
// | |
info.memory.geometries --; | |
} | |
function get( object, geometry ) { | |
var buffergeometry = geometries[ geometry.id ]; | |
if ( buffergeometry ) return buffergeometry; | |
geometry.addEventListener( 'dispose', onGeometryDispose ); | |
if ( geometry.isBufferGeometry ) { | |
buffergeometry = geometry; | |
} else if ( geometry.isGeometry ) { | |
if ( geometry._bufferGeometry === undefined ) { | |
geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); | |
} | |
buffergeometry = geometry._bufferGeometry; | |
} | |
geometries[ geometry.id ] = buffergeometry; | |
info.memory.geometries ++; | |
return buffergeometry; | |
} | |
function update( geometry ) { | |
var index = geometry.index; | |
var geometryAttributes = geometry.attributes; | |
if ( index !== null ) { | |
attributes.update( index, gl.ELEMENT_ARRAY_BUFFER ); | |
} | |
for ( var name in geometryAttributes ) { | |
attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER ); | |
} | |
// morph targets | |
var morphAttributes = geometry.morphAttributes; | |
for ( var name in morphAttributes ) { | |
var array = morphAttributes[ name ]; | |
for ( var i = 0, l = array.length; i < l; i ++ ) { | |
attributes.update( array[ i ], gl.ARRAY_BUFFER ); | |
} | |
} | |
} | |
function getWireframeAttribute( geometry ) { | |
var attribute = wireframeAttributes[ geometry.id ]; | |
if ( attribute ) return attribute; | |
var indices = []; | |
var geometryIndex = geometry.index; | |
var geometryAttributes = geometry.attributes; | |
// console.time( 'wireframe' ); | |
if ( geometryIndex !== null ) { | |
var array = geometryIndex.array; | |
for ( var i = 0, l = array.length; i < l; i += 3 ) { | |
var a = array[ i + 0 ]; | |
var b = array[ i + 1 ]; | |
var c = array[ i + 2 ]; | |
indices.push( a, b, b, c, c, a ); | |
} | |
} else { | |
var array = geometryAttributes.position.array; | |
for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { | |
var a = i + 0; | |
var b = i + 1; | |
var c = i + 2; | |
indices.push( a, b, b, c, c, a ); | |
} | |
} | |
// console.timeEnd( 'wireframe' ); | |
attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); | |
attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER ); | |
wireframeAttributes[ geometry.id ] = attribute; | |
return attribute; | |
} | |
return { | |
get: get, | |
update: update, | |
getWireframeAttribute: getWireframeAttribute | |
}; | |
} | |
export { WebGLGeometries }; | |