WebGLObjects.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. return buffergeometry;
  22. }
  23. function dispose() {
  24. updateMap = new WeakMap();
  25. }
  26. function onInstancedMeshDispose( event ) {
  27. const instancedMesh = event.target;
  28. instancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );
  29. attributes.remove( instancedMesh.instanceMatrix );
  30. if ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );
  31. }
  32. return {
  33. update: update,
  34. dispose: dispose
  35. };
  36. }
  37. export { WebGLObjects };