2
0

Math2Node.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /**
  2. * @author sunag / http://www.sunag.com.br/
  3. */
  4. THREE.Math2Node = function ( a, b, method ) {
  5. THREE.TempNode.call( this );
  6. this.a = a;
  7. this.b = b;
  8. this.method = method || THREE.Math2Node.DISTANCE;
  9. };
  10. THREE.Math2Node.MIN = 'min';
  11. THREE.Math2Node.MAX = 'max';
  12. THREE.Math2Node.MOD = 'mod';
  13. THREE.Math2Node.STEP = 'step';
  14. THREE.Math2Node.REFLECT = 'reflect';
  15. THREE.Math2Node.DISTANCE = 'distance';
  16. THREE.Math2Node.DOT = 'dot';
  17. THREE.Math2Node.CROSS = 'cross';
  18. THREE.Math2Node.POW = 'pow';
  19. THREE.Math2Node.prototype = Object.create( THREE.TempNode.prototype );
  20. THREE.Math2Node.prototype.constructor = THREE.Math2Node;
  21. THREE.Math2Node.prototype.nodeType = "Math2";
  22. THREE.Math2Node.prototype.getInputType = function ( builder ) {
  23. // use the greater length vector
  24. if ( builder.getFormatLength( this.b.getType( builder ) ) > builder.getFormatLength( this.a.getType( builder ) ) ) {
  25. return this.b.getType( builder );
  26. }
  27. return this.a.getType( builder );
  28. };
  29. THREE.Math2Node.prototype.getType = function ( builder ) {
  30. switch ( this.method ) {
  31. case THREE.Math2Node.DISTANCE:
  32. case THREE.Math2Node.DOT:
  33. return 'fv1';
  34. case THREE.Math2Node.CROSS:
  35. return 'v3';
  36. }
  37. return this.getInputType( builder );
  38. };
  39. THREE.Math2Node.prototype.generate = function ( builder, output ) {
  40. var material = builder.material;
  41. var type = this.getInputType( builder );
  42. var a, b,
  43. al = builder.getFormatLength( this.a.getType( builder ) ),
  44. bl = builder.getFormatLength( this.b.getType( builder ) );
  45. // optimzer
  46. switch ( this.method ) {
  47. case THREE.Math2Node.CROSS:
  48. a = this.a.build( builder, 'v3' );
  49. b = this.b.build( builder, 'v3' );
  50. break;
  51. case THREE.Math2Node.STEP:
  52. a = this.a.build( builder, al == 1 ? 'fv1' : type );
  53. b = this.b.build( builder, type );
  54. break;
  55. case THREE.Math2Node.MIN:
  56. case THREE.Math2Node.MAX:
  57. case THREE.Math2Node.MOD:
  58. a = this.a.build( builder, type );
  59. b = this.b.build( builder, bl == 1 ? 'fv1' : type );
  60. break;
  61. default:
  62. a = this.a.build( builder, type );
  63. b = this.b.build( builder, type );
  64. break;
  65. }
  66. return builder.format( this.method + '(' + a + ',' + b + ')', this.getType( builder ), output );
  67. };
  68. THREE.Math2Node.prototype.toJSON = function ( meta ) {
  69. var data = this.getJSONNode( meta );
  70. if ( ! data ) {
  71. data = this.createJSONNode( meta );
  72. data.a = this.a.toJSON( meta ).uuid;
  73. data.b = this.b.toJSON( meta ).uuid;
  74. data.method = this.method;
  75. }
  76. return data;
  77. };