vector_math_node.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. type vector_math_node_t = {
  2. base?: logic_node_t;
  3. operation?: string;
  4. v?: vec4_t;
  5. };
  6. function vector_math_node_create(arg: any): vector_math_node_t {
  7. let n: vector_math_node_t = {};
  8. n.base = logic_node_create();
  9. n.base.get = vector_math_node_get;
  10. n.v = vec4_create();
  11. return n;
  12. }
  13. function vector_math_node_get(self: vector_math_node_t, from: i32): logic_node_value_t {
  14. let v1: vec4_t = logic_node_input_get(self.base.inputs[0])._any;
  15. let v2: vec4_t = logic_node_input_get(self.base.inputs[1])._any;
  16. vec4_set_from(self.v, v1);
  17. let f: f32 = 0.0;
  18. let op: string = self.operation;
  19. if (op == "Add") {
  20. vec4_add(self.v, v2);
  21. }
  22. else if (op == "Subtract") {
  23. vec4_sub(self.v, v2);
  24. }
  25. else if (op == "Average") {
  26. vec4_add(self.v, v2);
  27. self.v.x *= 0.5;
  28. self.v.y *= 0.5;
  29. self.v.z *= 0.5;
  30. }
  31. else if (op == "Dot Product") {
  32. f = vec4_dot(self.v, v2);
  33. vec4_set(self.v, f, f, f);
  34. }
  35. else if (op == "Cross Product") {
  36. vec4_cross(self.v, v2);
  37. }
  38. else if (op == "Normalize") {
  39. vec4_normalize(self.v, );
  40. }
  41. else if (op == "Multiply") {
  42. self.v.x *= v2.x;
  43. self.v.y *= v2.y;
  44. self.v.z *= v2.z;
  45. }
  46. else if (op == "Divide") {
  47. self.v.x /= v2.x == 0.0 ? 0.000001 : v2.x;
  48. self.v.y /= v2.y == 0.0 ? 0.000001 : v2.y;
  49. self.v.z /= v2.z == 0.0 ? 0.000001 : v2.z;
  50. }
  51. else if (op == "Length") {
  52. f = vec4_len(self.v);
  53. vec4_set(self.v, f, f, f);
  54. }
  55. else if (op == "Distance") {
  56. f = vec4_dist_to(self.v, v2);
  57. vec4_set(self.v, f, f, f);
  58. }
  59. else if (op == "Project") {
  60. vec4_set_from(self.v, v2);
  61. vec4_mult(self.v, vec4_dot(v1, v2) / vec4_dot(v2, v2));
  62. }
  63. else if (op == "Reflect") {
  64. let tmp: vec4_t = vec4_create();
  65. vec4_set_from(tmp, v2);
  66. vec4_normalize(tmp);
  67. vec4_reflect(self.v, tmp);
  68. }
  69. else if (op == "Scale") {
  70. self.v.x *= v2.x;
  71. self.v.y *= v2.x;
  72. self.v.z *= v2.x;
  73. }
  74. else if (op == "Absolute") {
  75. self.v.x = math_abs(self.v.x);
  76. self.v.y = math_abs(self.v.y);
  77. self.v.z = math_abs(self.v.z);
  78. }
  79. else if (op == "Minimum") {
  80. self.v.x = math_min(v1.x, v2.x);
  81. self.v.y = math_min(v1.y, v2.y);
  82. self.v.z = math_min(v1.z, v2.z);
  83. }
  84. else if (op == "Maximum") {
  85. self.v.x = math_max(v1.x, v2.x);
  86. self.v.y = math_max(v1.y, v2.y);
  87. self.v.z = math_max(v1.z, v2.z);
  88. }
  89. else if (op == "Floor") {
  90. self.v.x = math_floor(v1.x);
  91. self.v.y = math_floor(v1.y);
  92. self.v.z = math_floor(v1.z);
  93. }
  94. else if (op == "Ceil") {
  95. self.v.x = math_ceil(v1.x);
  96. self.v.y = math_ceil(v1.y);
  97. self.v.z = math_ceil(v1.z);
  98. }
  99. else if (op == "Fraction") {
  100. self.v.x = v1.x - math_floor(v1.x);
  101. self.v.y = v1.y - math_floor(v1.y);
  102. self.v.z = v1.z - math_floor(v1.z);
  103. }
  104. else if (op == "Modulo") {
  105. self.v.x = v1.x % v2.x;
  106. self.v.y = v1.y % v2.y;
  107. self.v.z = v1.z % v2.z;
  108. }
  109. else if (op == "Snap") {
  110. self.v.x = math_floor(v1.x / v2.x) * v2.x;
  111. self.v.y = math_floor(v1.y / v2.y) * v2.y;
  112. self.v.z = math_floor(v1.z / v2.z) * v2.z;
  113. }
  114. else if (op == "Sine") {
  115. self.v.x = math_sin(v1.x);
  116. self.v.y = math_sin(v1.y);
  117. self.v.z = math_sin(v1.z);
  118. }
  119. else if (op == "Cosine") {
  120. self.v.x = math_cos(v1.x);
  121. self.v.y = math_cos(v1.y);
  122. self.v.z = math_cos(v1.z);
  123. }
  124. else if (op == "Tangent") {
  125. self.v.x = math_tan(v1.x);
  126. self.v.y = math_tan(v1.y);
  127. self.v.z = math_tan(v1.z);
  128. }
  129. if (from == 0) {
  130. let v: logic_node_value_t = { _any: self.v };
  131. return v;
  132. }
  133. else {
  134. let v: logic_node_value_t = { _f32: f };
  135. return v;
  136. }
  137. }
  138. let vector_math_node_def: zui_node_t = {
  139. id: 0,
  140. name: _tr("Vector Math"),
  141. type: "vector_math_node",
  142. x: 0,
  143. y: 0,
  144. color: 0xff4982a0,
  145. inputs: [
  146. {
  147. id: 0,
  148. node_id: 0,
  149. name: _tr("Vector"),
  150. type: "VECTOR",
  151. color: 0xff6363c7,
  152. default_value: f32_array_create_xyz(0.0, 0.0, 0.0),
  153. min: 0.0,
  154. max: 1.0,
  155. precision: 100,
  156. display: 0
  157. },
  158. {
  159. id: 0,
  160. node_id: 0,
  161. name: _tr("Vector"),
  162. type: "VECTOR",
  163. color: 0xff6363c7,
  164. default_value: f32_array_create_xyz(0.0, 0.0, 0.0),
  165. min: 0.0,
  166. max: 1.0,
  167. precision: 100,
  168. display: 0
  169. }
  170. ],
  171. outputs: [
  172. {
  173. id: 0,
  174. node_id: 0,
  175. name: _tr("Vector"),
  176. type: "VECTOR",
  177. color: 0xff6363c7,
  178. default_value: f32_array_create_xyz(0.0, 0.0, 0.0),
  179. min: 0.0,
  180. max: 1.0,
  181. precision: 100,
  182. display: 0
  183. },
  184. {
  185. id: 0,
  186. node_id: 0,
  187. name: _tr("Value"),
  188. type: "VALUE",
  189. color: 0xffa1a1a1,
  190. default_value: f32_array_create_x(0.0),
  191. min: 0.0,
  192. max: 1.0,
  193. precision: 100,
  194. display: 0
  195. }
  196. ],
  197. buttons: [
  198. {
  199. name: _tr("operation"),
  200. type: "ENUM",
  201. output: 0,
  202. default_value: f32_array_create_x(0),
  203. data: u8_array_create_from_string("Add\0Subtract\0Multiply\0Divide\0Average\0Cross Product\0Project\0Reflect\0Dot Product\0Distance\0Length\0Scale\0Normalize\0Absolute\0Minimum\0Maximum\0Floor\0Ceil\0Fraction\0Modulo\0Snap\0Sine\0Cosine\0Tangent"),
  204. min: 0.0,
  205. max: 1.0,
  206. precision: 100,
  207. height: 0
  208. }
  209. ],
  210. width: 0
  211. };