WebGLObjects.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. // update skeleton only once in a frame
  23. if ( object.skeleton.frame !== info.render.frame ) {
  24. object.skeleton.update();
  25. object.skeleton.frame = info.render.frame;
  26. }
  27. }
  28. return buffergeometry;
  29. }
  30. function dispose() {
  31. updateMap = new WeakMap();
  32. }
  33. function onInstancedMeshDispose( event ) {
  34. const instancedMesh = event.target;
  35. instancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );
  36. attributes.remove( instancedMesh.instanceMatrix );
  37. if ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );
  38. }
  39. return {
  40. update: update,
  41. dispose: dispose
  42. };
  43. }
  44. export { WebGLObjects };
粤ICP备19079148号