VarNode.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 temp = nodeProxy( VarNode );
  46. addNodeElement( 'temp', temp );
  47. addNodeClass( VarNode );