WebGLNodes.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { WebGLNodeBuilder } from './WebGLNodeBuilder.js';
  2. import { NodeFrame } from 'three/nodes';
  3. import { Material } from 'three';
  4. const builders = new WeakMap();
  5. export const nodeFrame = new NodeFrame();
  6. Material.prototype.onBuild = function ( object, parameters, renderer ) {
  7. if ( Array.isArray( object.material ) ) {
  8. for ( const material of object.material ) {
  9. if ( material.isNodeMaterial === true ) {
  10. builders.set( material, new WebGLNodeBuilder( object, renderer, parameters, material ).build() );
  11. }
  12. }
  13. } else if ( object.material.isNodeMaterial === true ) {
  14. builders.set( object.material, new WebGLNodeBuilder( object, renderer, parameters ).build() );
  15. }
  16. };
  17. Material.prototype.onBeforeRender = function ( renderer, scene, camera, geometry, object ) {
  18. const nodeBuilder = builders.get( this );
  19. if ( nodeBuilder !== undefined ) {
  20. nodeFrame.material = this;
  21. nodeFrame.camera = camera;
  22. nodeFrame.object = object;
  23. nodeFrame.renderer = renderer;
  24. const updateNodes = nodeBuilder.updateNodes;
  25. if ( updateNodes.length > 0 ) {
  26. // force refresh material uniforms
  27. renderer.state.useProgram( null );
  28. //this.uniformsNeedUpdate = true;
  29. for ( const node of updateNodes ) {
  30. nodeFrame.updateNode( node );
  31. }
  32. }
  33. }
  34. };