OperatorNode.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /**
  2. * @author sunag / http://www.sunag.com.br/
  3. */
  4. import { TempNode } from '../core/TempNode.js';
  5. function OperatorNode( a, b, op ) {
  6. TempNode.call( this );
  7. this.a = a;
  8. this.b = b;
  9. this.op = op || OperatorNode.ADD;
  10. };
  11. OperatorNode.ADD = '+';
  12. OperatorNode.SUB = '-';
  13. OperatorNode.MUL = '*';
  14. OperatorNode.DIV = '/';
  15. OperatorNode.prototype = Object.create( TempNode.prototype );
  16. OperatorNode.prototype.constructor = OperatorNode;
  17. OperatorNode.prototype.nodeType = "Operator";
  18. OperatorNode.prototype.getType = function ( builder ) {
  19. var a = this.a.getType( builder ),
  20. b = this.b.getType( builder );
  21. if ( builder.isTypeMatrix( a ) ) {
  22. return 'v4';
  23. } else if ( builder.getTypeLength( b ) > builder.getTypeLength( a ) ) {
  24. // use the greater length vector
  25. return b;
  26. }
  27. return a;
  28. };
  29. OperatorNode.prototype.generate = function ( builder, output ) {
  30. var data = builder.getNodeData( this ),
  31. type = this.getType( builder );
  32. var a = this.a.build( builder, type ),
  33. b = this.b.build( builder, type );
  34. return builder.format( '( ' + a + ' ' + this.op + ' '+ b + ' )', type, output );
  35. };
  36. OperatorNode.prototype.copy = function ( source ) {
  37. TempNode.prototype.copy.call( this, source );
  38. this.a = source.a;
  39. this.b = source.b;
  40. this.op = source.op;
  41. };
  42. OperatorNode.prototype.toJSON = function ( meta ) {
  43. var data = this.getJSONNode( meta );
  44. if ( ! data ) {
  45. data = this.createJSONNode( meta );
  46. data.a = this.a.toJSON( meta ).uuid;
  47. data.b = this.b.toJSON( meta ).uuid;
  48. data.op = this.op;
  49. }
  50. return data;
  51. };
  52. export { OperatorNode };