WebGLObjects.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. function WebGLObjects( gl, geometries, attributes, info ) {
  2. let updateMap = new WeakMap();
  3. function update( object ) {
  4. const frame = info.render.frame;
  5. const geometry = object.geometry;
  6. const buffergeometry = geometries.get( object, geometry );
  7. // Update once per frame
  8. if ( updateMap.get( buffergeometry ) !== frame ) {
  9. geometries.update( buffergeometry );
  10. updateMap.set( buffergeometry, frame );
  11. }
  12. if ( object.isInstancedMesh ) {
  13. if ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {
  14. object.addEventListener( 'dispose', onInstancedMeshDispose );
  15. }
  16. attributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );
  17. if ( object.instanceColor !== null ) {
  18. attributes.update( object.instanceColor, gl.ARRAY_BUFFER );
  19. }
  20. }
  21. if ( object.isSkinnedMesh ) {
  22. if ( object.skeleton.frame !== info.render.frame ) {
  23. object.skeleton.update();
  24. object.skeleton.frame = info.render.frame;
  25. }
  26. }
  27. return buffergeometry;
  28. }
  29. function dispose() {
  30. updateMap = new WeakMap();
  31. }
  32. function onInstancedMeshDispose( event ) {
  33. const instancedMesh = event.target;
  34. instancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );
  35. attributes.remove( instancedMesh.instanceMatrix );
  36. if ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );
  37. }
  38. return {
  39. update: update,
  40. dispose: dispose
  41. };
  42. }
  43. export { WebGLObjects };