AssignNode.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { addNodeClass } from '../core/Node.js';
  2. import TempNode from '../core/TempNode.js';
  3. import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
  4. class AssignNode extends TempNode {
  5. constructor( targetNode, sourceNode ) {
  6. super();
  7. this.targetNode = targetNode;
  8. this.sourceNode = sourceNode;
  9. }
  10. hasDependencies() {
  11. return false;
  12. }
  13. getNodeType( builder, output ) {
  14. return output !== 'void' ? this.targetNode.getNodeType( builder ) : 'void';
  15. }
  16. generate( builder, output ) {
  17. const { targetNode, sourceNode } = this;
  18. const targetType = targetNode.getNodeType( builder );
  19. const target = targetNode.context( { assign: true } ).build( builder );
  20. const source = sourceNode.build( builder, targetType );
  21. const snippet = `${ target } = ${ source }`;
  22. if ( output === 'void' ) {
  23. builder.addLineFlowCode( snippet );
  24. return;
  25. } else {
  26. const sourceType = sourceNode.getNodeType( builder );
  27. if ( sourceType === 'void' ) {
  28. builder.addLineFlowCode( snippet );
  29. return target;
  30. }
  31. return builder.format( snippet, targetType, output );
  32. }
  33. }
  34. }
  35. export default AssignNode;
  36. export const assign = nodeProxy( AssignNode );
  37. addNodeClass( 'AssignNode', AssignNode );
  38. addNodeElement( 'assign', assign );