VectorMathNode.hx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package arm.node.brush;
  2. import iron.math.Vec4;
  3. @:keep
  4. class VectorMathNode extends LogicNode {
  5. public var operation: String;
  6. var v = new Vec4();
  7. public function new(tree: LogicTree) {
  8. super(tree);
  9. }
  10. override function get(from: Int): Dynamic {
  11. var v1: Vec4 = inputs[0].get();
  12. var v2: Vec4 = inputs[1].get();
  13. v.setFrom(v1);
  14. var f = 0.0;
  15. switch (operation) {
  16. case "Add":
  17. v.add(v2);
  18. case "Subtract":
  19. v.sub(v2);
  20. case "Average":
  21. v.add(v2);
  22. v.x *= 0.5;
  23. v.y *= 0.5;
  24. v.z *= 0.5;
  25. case "Dot Product":
  26. f = v.dot(v2);
  27. v.set(f, f, f);
  28. case "Cross Product":
  29. v.cross(v2);
  30. case "Normalize":
  31. v.normalize();
  32. case "Multiply":
  33. v.x *= v2.x;
  34. v.y *= v2.y;
  35. v.z *= v2.z;
  36. case "Divide":
  37. v.x /= v2.x == 0.0 ? 0.000001 : v2.x;
  38. v.y /= v2.y == 0.0 ? 0.000001 : v2.y;
  39. v.z /= v2.z == 0.0 ? 0.000001 : v2.z;
  40. case "Length":
  41. f = v.length();
  42. v.set(f, f, f);
  43. case "Distance":
  44. f = v.distanceTo(v2);
  45. v.set(f, f, f);
  46. case "Project":
  47. v.setFrom(v2);
  48. v.mult(v1.dot(v2) / v2.dot(v2));
  49. case "Reflect":
  50. var tmp = new Vec4();
  51. tmp.setFrom(v2);
  52. tmp.normalize();
  53. v.reflect(tmp);
  54. case "Scale":
  55. v.x *= v2.x;
  56. v.y *= v2.x;
  57. v.z *= v2.x;
  58. case "Absolute":
  59. v.x = Math.abs(v.x);
  60. v.y = Math.abs(v.y);
  61. v.z = Math.abs(v.z);
  62. case "Minimum":
  63. v.x = Math.min(v1.x, v2.x);
  64. v.y = Math.min(v1.y, v2.y);
  65. v.z = Math.min(v1.z, v2.z);
  66. case "Maximum":
  67. v.x = Math.max(v1.x, v2.x);
  68. v.y = Math.max(v1.y, v2.y);
  69. v.z = Math.max(v1.z, v2.z);
  70. case "Floor":
  71. v.x = Math.floor(v1.x);
  72. v.y = Math.floor(v1.y);
  73. v.z = Math.floor(v1.z);
  74. case "Ceil":
  75. v.x = Math.ceil(v1.x);
  76. v.y = Math.ceil(v1.y);
  77. v.z = Math.ceil(v1.z);
  78. case "Fraction":
  79. v.x = v1.x - Math.floor(v1.x);
  80. v.y = v1.y - Math.floor(v1.y);
  81. v.z = v1.z - Math.floor(v1.z);
  82. case "Modulo":
  83. v.x = v1.x % v2.x;
  84. v.y = v1.y % v2.y;
  85. v.z = v1.z % v2.z;
  86. case "Snap":
  87. v.x = Math.floor(v1.x / v2.x) * v2.x;
  88. v.y = Math.floor(v1.y / v2.y) * v2.y;
  89. v.z = Math.floor(v1.z / v2.z) * v2.z;
  90. case "Sine":
  91. v.x = Math.sin(v1.x);
  92. v.y = Math.sin(v1.y);
  93. v.z = Math.sin(v1.z);
  94. case "Cosine":
  95. v.x = Math.cos(v1.x);
  96. v.y = Math.cos(v1.y);
  97. v.z = Math.cos(v1.z);
  98. case "Tangent":
  99. v.x = Math.tan(v1.x);
  100. v.y = Math.tan(v1.y);
  101. v.z = Math.tan(v1.z);
  102. }
  103. if (from == 0) return v;
  104. else return f;
  105. }
  106. }