VectorMathNode.hx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package arm.logic;
  2. import iron.math.Vec4;
  3. import zui.Nodes;
  4. import arm.logic.LogicNode;
  5. import arm.logic.LogicParser.f32;
  6. import arm.Translator._tr;
  7. @:keep
  8. class VectorMathNode extends LogicNode {
  9. public var operation: String;
  10. var v = new Vec4();
  11. public function new(tree: LogicTree) {
  12. super(tree);
  13. }
  14. override function get(from: Int, done: Dynamic->Void) {
  15. inputs[0].get(function(v1: Vec4) {
  16. inputs[1].get(function(v2: Vec4) {
  17. v.setFrom(v1);
  18. var f = 0.0;
  19. switch (operation) {
  20. case "Add":
  21. v.add(v2);
  22. case "Subtract":
  23. v.sub(v2);
  24. case "Average":
  25. v.add(v2);
  26. v.x *= 0.5;
  27. v.y *= 0.5;
  28. v.z *= 0.5;
  29. case "Dot Product":
  30. f = v.dot(v2);
  31. v.set(f, f, f);
  32. case "Cross Product":
  33. v.cross(v2);
  34. case "Normalize":
  35. v.normalize();
  36. case "Multiply":
  37. v.x *= v2.x;
  38. v.y *= v2.y;
  39. v.z *= v2.z;
  40. case "Divide":
  41. v.x /= v2.x == 0.0 ? 0.000001 : v2.x;
  42. v.y /= v2.y == 0.0 ? 0.000001 : v2.y;
  43. v.z /= v2.z == 0.0 ? 0.000001 : v2.z;
  44. case "Length":
  45. f = v.length();
  46. v.set(f, f, f);
  47. case "Distance":
  48. f = v.distanceTo(v2);
  49. v.set(f, f, f);
  50. case "Project":
  51. v.setFrom(v2);
  52. v.mult(v1.dot(v2) / v2.dot(v2));
  53. case "Reflect":
  54. var tmp = new Vec4();
  55. tmp.setFrom(v2);
  56. tmp.normalize();
  57. v.reflect(tmp);
  58. case "Scale":
  59. v.x *= v2.x;
  60. v.y *= v2.x;
  61. v.z *= v2.x;
  62. case "Absolute":
  63. v.x = Math.abs(v.x);
  64. v.y = Math.abs(v.y);
  65. v.z = Math.abs(v.z);
  66. case "Minimum":
  67. v.x = Math.min(v1.x, v2.x);
  68. v.y = Math.min(v1.y, v2.y);
  69. v.z = Math.min(v1.z, v2.z);
  70. case "Maximum":
  71. v.x = Math.max(v1.x, v2.x);
  72. v.y = Math.max(v1.y, v2.y);
  73. v.z = Math.max(v1.z, v2.z);
  74. case "Floor":
  75. v.x = Math.floor(v1.x);
  76. v.y = Math.floor(v1.y);
  77. v.z = Math.floor(v1.z);
  78. case "Ceil":
  79. v.x = Math.ceil(v1.x);
  80. v.y = Math.ceil(v1.y);
  81. v.z = Math.ceil(v1.z);
  82. case "Fraction":
  83. v.x = v1.x - Math.floor(v1.x);
  84. v.y = v1.y - Math.floor(v1.y);
  85. v.z = v1.z - Math.floor(v1.z);
  86. case "Modulo":
  87. v.x = v1.x % v2.x;
  88. v.y = v1.y % v2.y;
  89. v.z = v1.z % v2.z;
  90. case "Snap":
  91. v.x = Math.floor(v1.x / v2.x) * v2.x;
  92. v.y = Math.floor(v1.y / v2.y) * v2.y;
  93. v.z = Math.floor(v1.z / v2.z) * v2.z;
  94. case "Sine":
  95. v.x = Math.sin(v1.x);
  96. v.y = Math.sin(v1.y);
  97. v.z = Math.sin(v1.z);
  98. case "Cosine":
  99. v.x = Math.cos(v1.x);
  100. v.y = Math.cos(v1.y);
  101. v.z = Math.cos(v1.z);
  102. case "Tangent":
  103. v.x = Math.tan(v1.x);
  104. v.y = Math.tan(v1.y);
  105. v.z = Math.tan(v1.z);
  106. }
  107. if (from == 0) done(v);
  108. else done(f);
  109. });
  110. });
  111. }
  112. public static var def: TNode = {
  113. id: 0,
  114. name: _tr("Vector Math"),
  115. type: "VectorMathNode",
  116. x: 0,
  117. y: 0,
  118. color: 0xff4982a0,
  119. inputs: [
  120. {
  121. id: 0,
  122. node_id: 0,
  123. name: _tr("Vector"),
  124. type: "VECTOR",
  125. color: 0xff6363c7,
  126. default_value: f32([0.0, 0.0, 0.0])
  127. },
  128. {
  129. id: 0,
  130. node_id: 0,
  131. name: _tr("Vector"),
  132. type: "VECTOR",
  133. color: 0xff6363c7,
  134. default_value: f32([0.0, 0.0, 0.0])
  135. }
  136. ],
  137. outputs: [
  138. {
  139. id: 0,
  140. node_id: 0,
  141. name: _tr("Vector"),
  142. type: "VECTOR",
  143. color: 0xff6363c7,
  144. default_value: f32([0.0, 0.0, 0.0])
  145. },
  146. {
  147. id: 0,
  148. node_id: 0,
  149. name: _tr("Value"),
  150. type: "VALUE",
  151. color: 0xffa1a1a1,
  152. default_value: 0.0
  153. }
  154. ],
  155. buttons: [
  156. {
  157. name: _tr("operation"),
  158. type: "ENUM",
  159. data: ["Add", "Subtract", "Multiply", "Divide", "Average", "Cross Product", "Project", "Reflect", "Dot Product", "Distance", "Length", "Scale", "Normalize", "Absolute", "Minimum", "Maximum", "Floor", "Ceil", "Fraction", "Modulo", "Snap", "Sine", "Cosine", "Tangent"],
  160. default_value: 0,
  161. output: 0
  162. }
  163. ]
  164. };
  165. }