1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- function WebGLObjects( gl, geometries, attributes, info ) {
- let updateMap = new WeakMap();
- function update( object ) {
- const frame = info.render.frame;
- const geometry = object.geometry;
- const buffergeometry = geometries.get( object, geometry );
- // Update once per frame
- if ( updateMap.get( buffergeometry ) !== frame ) {
- geometries.update( buffergeometry );
- updateMap.set( buffergeometry, frame );
- }
- if ( object.isInstancedMesh ) {
- if ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {
- object.addEventListener( 'dispose', onInstancedMeshDispose );
- }
- attributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );
- if ( object.instanceColor !== null ) {
- attributes.update( object.instanceColor, gl.ARRAY_BUFFER );
- }
- }
- if ( object.isSkinnedMesh ) {
- if ( object.skeleton.frame !== info.render.frame ) {
- object.skeleton.update();
- object.skeleton.frame = info.render.frame;
- }
- }
- return buffergeometry;
- }
- function dispose() {
- updateMap = new WeakMap();
- }
- function onInstancedMeshDispose( event ) {
- const instancedMesh = event.target;
- instancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );
- attributes.remove( instancedMesh.instanceMatrix );
- if ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );
- }
- return {
- update: update,
- dispose: dispose
- };
- }
- export { WebGLObjects };
|