math_node.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. type math_node_t = {
  2. base?: logic_node_t;
  3. operation?: string;
  4. use_clamp?: bool;
  5. };
  6. function math_node_create(raw: ui_node_t, args: f32_array_t): math_node_t {
  7. let n: math_node_t = {};
  8. n.base = logic_node_create(n);
  9. n.base.get = math_node_get;
  10. return n;
  11. }
  12. function math_node_get(self: math_node_t, from: i32): logic_node_value_t {
  13. let v1: f32 = logic_node_input_get(self.base.inputs[0])._f32;
  14. let v2: f32 = logic_node_input_get(self.base.inputs[1])._f32;
  15. let f: f32 = 0.0;
  16. let op: string = self.operation;
  17. if (op == "Add") {
  18. f = v1 + v2;
  19. }
  20. else if (op == "Multiply") {
  21. f = v1 * v2;
  22. }
  23. else if (op == "Sine") {
  24. f = math_sin(v1);
  25. }
  26. else if (op == "Cosine") {
  27. f = math_cos(v1);
  28. }
  29. else if (op == "Max") {
  30. f = math_max(v1, v2);
  31. }
  32. else if (op == "Min") {
  33. f = math_min(v1, v2);
  34. }
  35. else if (op == "Absolute") {
  36. f = math_abs(v1);
  37. }
  38. else if (op == "Subtract") {
  39. f = v1 - v2;
  40. }
  41. else if (op == "Divide") {
  42. f = v1 / (v2 == 0.0 ? 0.000001 : v2);
  43. }
  44. else if (op == "Tangent") {
  45. f = math_tan(v1);
  46. }
  47. else if (op == "Arcsine") {
  48. f = math_asin(v1);
  49. }
  50. else if (op == "Arccosine") {
  51. f = math_acos(v1);
  52. }
  53. else if (op == "Arctangent") {
  54. f = math_atan(v1);
  55. }
  56. else if (op == "Arctan2") {
  57. f = math_atan2(v2, v1);
  58. }
  59. else if (op == "Power") {
  60. f = math_pow(v1, v2);
  61. }
  62. else if (op == "Logarithm") {
  63. f = math_log(v1);
  64. }
  65. else if (op == "Round") {
  66. f = math_round(v1);
  67. }
  68. else if (op == "Floor") {
  69. f = math_floor(v1);
  70. }
  71. else if (op == "Ceil") {
  72. f = math_ceil(v1);
  73. }
  74. else if (op == "Truncate") {
  75. f = math_floor(v1);
  76. }
  77. else if (op == "Fraction") {
  78. f = v1 - math_floor(v1);
  79. }
  80. else if (op == "Less Than") {
  81. f = v1 < v2 ? 1.0 : 0.0;
  82. }
  83. else if (op == "Greater Than") {
  84. f = v1 > v2 ? 1.0 : 0.0;
  85. }
  86. else if (op == "Modulo") {
  87. f = math_fmod(v1, v2);
  88. }
  89. else if (op == "Snap") {
  90. f = math_floor(v1 / v2) * v2;
  91. }
  92. else if (op == "Square Root") {
  93. f = math_sqrt(v1);
  94. }
  95. else if (op == "Inverse Square Root") {
  96. f = 1.0 / math_sqrt(v1);
  97. }
  98. else if (op == "Exponent") {
  99. f = math_exp(v1);
  100. }
  101. else if (op == "Sign") {
  102. f = v1 > 0 ? 1.0 : (v1 < 0 ? -1.0 : 0);
  103. }
  104. else if (op == "Ping-Pong") {
  105. f = (v2 != 0.0) ? v2 - math_abs(math_fmod(math_abs(v1), (2 * v2)) - v2) : 0.0;
  106. }
  107. else if (op == "Hyperbolic Sine") {
  108. f = (math_exp(v1) - math_exp(-v1)) / 2.0;
  109. }
  110. else if (op == "Hyperbolic Cosine") {
  111. f = (math_exp(v1) + math_exp(-v1)) / 2.0;
  112. }
  113. else if (op == "Hyperbolic Tangent") {
  114. f = 1.0 - (2.0 / (math_exp(2 * v1) + 1));
  115. }
  116. else if (op == "To Radians") {
  117. f = v1 / 180.0 * math_pi();
  118. }
  119. else if (op == "To Degrees") {
  120. f = v1 / math_pi() * 180.0;
  121. }
  122. if (self.use_clamp) {
  123. f = f < 0.0 ? 0.0 : (f > 1.0 ? 1.0 : f);
  124. }
  125. let v: logic_node_value_t = {
  126. _f32: f
  127. };
  128. return v;
  129. }
  130. let math_node_def: ui_node_t = {
  131. id: 0,
  132. name: _tr("Math"),
  133. type: "math_node",
  134. x: 0,
  135. y: 0,
  136. color: 0xff4982a0,
  137. inputs: [
  138. {
  139. id: 0,
  140. node_id: 0,
  141. name: _tr("Value"),
  142. type: "VALUE",
  143. color: 0xffa1a1a1,
  144. default_value: f32_array_create_x(0.5),
  145. min: 0.0,
  146. max: 1.0,
  147. precision: 100,
  148. display: 0
  149. },
  150. {
  151. id: 0,
  152. node_id: 0,
  153. name: _tr("Value"),
  154. type: "VALUE",
  155. color: 0xffa1a1a1,
  156. default_value: f32_array_create_x(0.5),
  157. min: 0.0,
  158. max: 1.0,
  159. precision: 100,
  160. display: 0
  161. }
  162. ],
  163. outputs: [
  164. {
  165. id: 0,
  166. node_id: 0,
  167. name: _tr("Value"),
  168. type: "VALUE",
  169. color: 0xffa1a1a1,
  170. default_value: f32_array_create_x(0.0),
  171. min: 0.0,
  172. max: 1.0,
  173. precision: 100,
  174. display: 0
  175. }
  176. ],
  177. buttons: [
  178. {
  179. name: _tr("operation"),
  180. type: "ENUM",
  181. output: 0,
  182. default_value: f32_array_create_x(0),
  183. data: u8_array_create_from_string("Add\nSubtract\nMultiply\nDivide\nPower\nLogarithm\nSquare Root\nInverse Square Root\nAbsolute\nExponent\nMinimum\nMaximum\nLess Than\nGreater Than\nSign\nRound\nFloor\nCeil\nTruncate\nFraction\nModulo\nSnap\nPing-Pong\nSine\nCosine\nTangent\nArcsine\nArccosine\nArctangent\nArctan2\nHyperbolic Sine\nHyperbolic Cosine\nHyperbolic Tangent\nTo Radians\nTo Degrees"),
  184. min: 0.0,
  185. max: 1.0,
  186. precision: 100,
  187. height: 0
  188. },
  189. {
  190. name: _tr("use_clamp"),
  191. type: "BOOL",
  192. output: 0,
  193. default_value: f32_array_create_x(0),
  194. data: null,
  195. min: 0.0,
  196. max: 1.0,
  197. precision: 100,
  198. height: 0
  199. }
  200. ],
  201. width: 0
  202. };