WebGPUNodes.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import WebGPUNodeBuilder from './WebGPUNodeBuilder.js';
  2. import { NodeFrame } from 'three/nodes';
  3. class WebGPUNodes {
  4. constructor( renderer, properties ) {
  5. this.renderer = renderer;
  6. this.properties = properties;
  7. this.nodeFrame = new NodeFrame();
  8. }
  9. get( object ) {
  10. const objectProperties = this.properties.get( object );
  11. let nodeBuilder = objectProperties.nodeBuilder;
  12. if ( nodeBuilder === undefined ) {
  13. const scene = objectProperties.scene;
  14. const lightsNode = objectProperties.lightsNode;
  15. nodeBuilder = new WebGPUNodeBuilder( object, this.renderer );
  16. nodeBuilder.lightsNode = lightsNode;
  17. nodeBuilder.fogNode = scene?.fogNode;
  18. nodeBuilder.scene = scene;
  19. nodeBuilder.build();
  20. objectProperties.nodeBuilder = nodeBuilder;
  21. }
  22. return nodeBuilder;
  23. }
  24. remove( object ) {
  25. const objectProperties = this.properties.get( object );
  26. delete objectProperties.nodeBuilder;
  27. }
  28. updateFrame() {
  29. this.nodeFrame.update();
  30. }
  31. update( object, camera ) {
  32. const renderer = this.renderer;
  33. const material = object.material;
  34. const nodeBuilder = this.get( object );
  35. const nodeFrame = this.nodeFrame;
  36. nodeFrame.object = object;
  37. nodeFrame.camera = camera;
  38. nodeFrame.renderer = renderer;
  39. nodeFrame.material = material;
  40. for ( const node of nodeBuilder.updateNodes ) {
  41. nodeFrame.updateNode( node );
  42. }
  43. }
  44. dispose() {
  45. this.nodeFrame = new NodeFrame();
  46. }
  47. }
  48. export default WebGPUNodes;