WebGLObjects.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. if ( geometry.isGeometry ) {
  10. buffergeometry.updateFromObject( object );
  11. }
  12. geometries.update( buffergeometry );
  13. updateMap.set( buffergeometry, frame );
  14. }
  15. if ( object.isInstancedMesh ) {
  16. if ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {
  17. object.addEventListener( 'dispose', onInstancedMeshDispose );
  18. }
  19. attributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );
  20. if ( object.instanceColor !== null ) {
  21. attributes.update( object.instanceColor, gl.ARRAY_BUFFER );
  22. }
  23. }
  24. return buffergeometry;
  25. }
  26. function dispose() {
  27. updateMap = new WeakMap();
  28. }
  29. function onInstancedMeshDispose( event ) {
  30. const instancedMesh = event.target;
  31. instancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );
  32. attributes.remove( instancedMesh.instanceMatrix );
  33. if ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );
  34. }
  35. return {
  36. update: update,
  37. dispose: dispose
  38. };
  39. }
  40. export { WebGLObjects };
粤ICP备19079148号