WebGPURenderObjects.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import WebGPUWeakMap from './WebGPUWeakMap.js';
  2. import WebGPURenderObject from './WebGPURenderObject.js';
  3. import { PerspectiveCamera, OrthographicCamera } from 'three';
  4. const dummyCameras = {
  5. PerspectiveCamera: new PerspectiveCamera(),
  6. OrthographicCamera: new OrthographicCamera()
  7. };
  8. function getChainKeys( object, material, scene, camera, lightsNode ) {
  9. // use dummy camera for optimize cache in case of use others cameras with the same type
  10. return [ object, material, scene, dummyCameras[ camera.type ], lightsNode ];
  11. }
  12. class WebGPURenderObjects {
  13. constructor( renderer, nodes, geometries, info ) {
  14. this.renderer = renderer;
  15. this.nodes = nodes;
  16. this.geometries = geometries;
  17. this.info = info;
  18. this.cache = new WebGPUWeakMap();
  19. }
  20. get( object, material, scene, camera, lightsNode ) {
  21. const chainKey = getChainKeys( object, material, scene, camera, lightsNode );
  22. let renderObject = this.cache.get( chainKey );
  23. if ( renderObject === undefined ) {
  24. renderObject = new WebGPURenderObject( this.renderer, this.nodes, object, material, scene, camera, lightsNode );
  25. this.cache.set( chainKey, renderObject );
  26. }
  27. return renderObject;
  28. }
  29. remove( object, material, scene, camera, lightsNode ) {
  30. const chainKey = getChainKeys( object, material, scene, camera, lightsNode );
  31. this.cache.delete( chainKey );
  32. }
  33. dispose() {
  34. this.cache = new WebGPUWeakMap();
  35. this.updateMap = new WeakMap();
  36. }
  37. }
  38. export default WebGPURenderObjects;