Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/flo-bit/shapecraft. flo-bit.dev/shapecraft
Something went wrong. Try again.
1.6 kB · 92 lines
JavaScript
at commit da69385e
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293function 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 );
}
if ( updateMap.get( object ) !== frame ) {
attributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );
if ( object.instanceColor !== null ) {
attributes.update( object.instanceColor, gl.ARRAY_BUFFER );
}
updateMap.set( object, frame );
}
}
if ( object.isSkinnedMesh ) {
const skeleton = object.skeleton;
if ( updateMap.get( skeleton ) !== frame ) {
skeleton.update();
updateMap.set( skeleton, 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 };