VarNode.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. if ( node.isTempNode === true ) {
  37. return node.build( builder );
  38. }
  39. const name = this.name;
  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. VarNode.prototype.isVarNode = true;
  52. export default VarNode;