VarNode.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import Node from './Node.js';
  2. import OperatorNode from '../math/OperatorNode.js';
  3. class VarNode extends Node {
  4. constructor( node, name = null ) {
  5. super();
  6. this.node = node;
  7. this.name = name;
  8. }
  9. op( op, ...params ) {
  10. this.node = new OperatorNode( op, this.node, ...params );
  11. return this;
  12. }
  13. assign( ...params ) {
  14. return this.op( '=', ...params );
  15. }
  16. add( ...params ) {
  17. return this.op( '+', ...params );
  18. }
  19. sub( ...params ) {
  20. return this.op( '-', ...params );
  21. }
  22. mul( ...params ) {
  23. return this.op( '*', ...params );
  24. }
  25. div( ...params ) {
  26. return this.op( '/', ...params );
  27. }
  28. getHash( builder ) {
  29. return this.name || super.getHash( builder );
  30. }
  31. getNodeType( builder ) {
  32. return this.node.getNodeType( builder );
  33. }
  34. generate( builder ) {
  35. const node = this.node;
  36. const name = this.name;
  37. if ( name === null && node.isTempNode === true ) {
  38. return node.build( builder );
  39. }
  40. const type = builder.getVectorType( this.getNodeType( builder ) );
  41. const snippet = node.build( builder, type );
  42. const nodeVar = builder.getVarFromNode( this, type );
  43. if ( name !== null ) {
  44. nodeVar.name = name;
  45. }
  46. const propertyName = builder.getPropertyName( nodeVar );
  47. builder.addFlowCode( `${propertyName} = ${snippet}` );
  48. return propertyName;
  49. }
  50. }
  51. export default VarNode;