VarNode.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import Node, { addNodeClass } from './Node.js';
  2. import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
  3. class VarNode extends Node {
  4. constructor( node, name = null ) {
  5. super();
  6. this.node = node;
  7. this.name = name;
  8. }
  9. assign( node ) {
  10. node.traverse( ( childNode, replaceNode ) => {
  11. if ( replaceNode && childNode.uuid === this.uuid ) {
  12. replaceNode( this.node );
  13. }
  14. } );
  15. this.node = node;
  16. return this;
  17. }
  18. isGlobal() {
  19. return true;
  20. }
  21. getHash( builder ) {
  22. return this.name || super.getHash( builder );
  23. }
  24. getNodeType( builder ) {
  25. return this.node.getNodeType( builder );
  26. }
  27. generate( builder ) {
  28. const node = this.node;
  29. const name = this.name;
  30. if ( name === null && node.isTempNode === true ) {
  31. return node.build( builder );
  32. }
  33. const type = builder.getVectorType( this.getNodeType( builder ) );
  34. const snippet = node.build( builder, type );
  35. const nodeVar = builder.getVarFromNode( this, type );
  36. if ( name !== null ) {
  37. nodeVar.name = name;
  38. }
  39. const propertyName = builder.getPropertyName( nodeVar );
  40. builder.addLineFlowCode( `${propertyName} = ${snippet}` );
  41. return propertyName;
  42. }
  43. }
  44. export default VarNode;
  45. export const label = nodeProxy( VarNode );
  46. export const temp = label;
  47. addNodeElement( 'label', label );
  48. addNodeElement( 'temp', temp );
  49. addNodeClass( VarNode );