math2_node.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. function math2_node_init() {
  2. array_push(nodes_material_utilities, math2_node_def);
  3. map_set(parser_material_node_values, "MATH", math2_node_value);
  4. }
  5. function math2_node_value(node: ui_node_t, socket: ui_node_socket_t): string {
  6. let val1: string = parser_material_parse_value_input(node.inputs[0]);
  7. let val2: string = parser_material_parse_value_input(node.inputs[1]);
  8. let but: ui_node_button_t = node.buttons[0]; // operation
  9. let op: string = to_upper_case(u8_array_string_at(but.data, but.default_value[0]));
  10. op = string_replace_all(op, " ", "_");
  11. let use_clamp: bool = node.buttons[1].default_value[0] > 0;
  12. let out_val: string = "";
  13. if (op == "ADD") {
  14. out_val = "(" + val1 + " + " + val2 + ")";
  15. }
  16. else if (op == "SUBTRACT") {
  17. out_val = "(" + val1 + " - " + val2 + ")";
  18. }
  19. else if (op == "MULTIPLY") {
  20. out_val = "(" + val1 + " * " + val2 + ")";
  21. }
  22. else if (op == "DIVIDE") {
  23. let store: string = parser_material_store_var_name(node) + "_divide";
  24. parser_material_write(parser_material_kong, "var " + store + ": float = " + val2 + ";");
  25. parser_material_write(parser_material_kong, "if (" + store + " == 0.0) { " + store + " = " + parser_material_eps + "; }");
  26. out_val = "(" + val1 + " / " + store + ")";
  27. }
  28. else if (op == "POWER") {
  29. out_val = "pow(" + val1 + ", " + val2 + ")";
  30. }
  31. else if (op == "LOGARITHM") {
  32. out_val = "log(" + val1 + ")";
  33. }
  34. else if (op == "SQUARE_ROOT") {
  35. out_val = "sqrt(" + val1 + ")";
  36. }
  37. else if (op == "INVERSE_SQUARE_ROOT") {
  38. out_val = "rsqrt(" + val1 + ")";
  39. }
  40. else if (op == "EXPONENT") {
  41. out_val = "exp(" + val1 + ")";
  42. }
  43. else if (op == "ABSOLUTE") {
  44. out_val = "abs(" + val1 + ")";
  45. }
  46. else if (op == "MINIMUM") {
  47. out_val = "min(" + val1 + ", " + val2 + ")";
  48. }
  49. else if (op == "MAXIMUM") {
  50. out_val = "max(" + val1 + ", " + val2 + ")";
  51. }
  52. else if (op == "LESS_THAN") {
  53. // out_val = "float(" + val1 + " < " + val2 + ")";
  54. let store: string = parser_material_store_var_name(node) + "_lessthan";
  55. parser_material_write(parser_material_kong, "var " + store + ": float = 0.0;");
  56. parser_material_write(parser_material_kong, "if (" + val1 + " < " + val2 + ") { " + store + " = 1.0; }");
  57. out_val = store;
  58. }
  59. else if (op == "GREATER_THAN") {
  60. // out_val = "float(" + val1 + " > " + val2 + ")";
  61. let store: string = parser_material_store_var_name(node) + "_greaterthan";
  62. parser_material_write(parser_material_kong, "var " + store + ": float = 0.0;");
  63. parser_material_write(parser_material_kong, "if (" + val1 + " > " + val2 + ") { " + store + " = 1.0; }");
  64. out_val = store;
  65. }
  66. else if (op == "SIGN") {
  67. out_val = "sign(" + val1 + ")";
  68. }
  69. else if (op == "ROUND") {
  70. out_val = "floor(" + val1 + " + 0.5)";
  71. }
  72. else if (op == "FLOOR") {
  73. out_val = "floor(" + val1 + ")";
  74. }
  75. else if (op == "CEIL") {
  76. out_val = "ceil(" + val1 + ")";
  77. }
  78. else if (op == "SNAP") {
  79. out_val = "(floor(" + val1 + " / " + val2 + ") * " + val2 + ")";
  80. }
  81. else if (op == "TRUNCATE") {
  82. out_val = "trunc(" + val1 + ")";
  83. }
  84. else if (op == "FRACTION") {
  85. out_val = "frac(" + val1 + ")";
  86. }
  87. else if (op == "MODULO") {
  88. out_val = "(" + val1 + " % " + val2 + ")";
  89. }
  90. else if (op == "PING-PONG") {
  91. let store: string = parser_material_store_var_name(node) + "_pingpong";
  92. parser_material_write(parser_material_kong, "var " + store + ": float = 0.0;");
  93. parser_material_write(parser_material_kong, "if (" + val2 + " != 0.0) { " + store + " = abs(frac((" + val1 + " - " + val2 + ") / (" + val2 +
  94. " * 2.0)) * " + val2 + " * 2.0 - " + val2 + "); }");
  95. out_val = store;
  96. }
  97. else if (op == "SINE") {
  98. out_val = "sin(" + val1 + ")";
  99. }
  100. else if (op == "COSINE") {
  101. out_val = "cos(" + val1 + ")";
  102. }
  103. else if (op == "TANGENT") {
  104. out_val = "tan(" + val1 + ")";
  105. }
  106. else if (op == "ARCSINE") {
  107. out_val = "asin(" + val1 + ")";
  108. }
  109. else if (op == "ARCCOSINE") {
  110. out_val = "acos(" + val1 + ")";
  111. }
  112. else if (op == "ARCTANGENT") {
  113. out_val = "atan(" + val1 + ")";
  114. }
  115. else if (op == "ARCTAN2") {
  116. out_val = "atan2(" + val1 + ", " + val2 + ")";
  117. }
  118. else if (op == "HYPERBOLIC_SINE") {
  119. out_val = "sinh(" + val1 + ")";
  120. }
  121. else if (op == "HYPERBOLIC_COSINE") {
  122. out_val = "cosh(" + val1 + ")";
  123. }
  124. else if (op == "HYPERBOLIC_TANGENT") {
  125. out_val = "tanh(" + val1 + ")";
  126. }
  127. else if (op == "TO_RADIANS") {
  128. out_val = "radians(" + val1 + ")";
  129. }
  130. else if (op == "TO_DEGREES") {
  131. out_val = "degrees(" + val1 + ")";
  132. }
  133. if (use_clamp) {
  134. return "clamp(" + out_val + ", 0.0, 1.0)";
  135. }
  136. else {
  137. return out_val;
  138. }
  139. }
  140. let math2_node_def: ui_node_t = {
  141. id : 0,
  142. name : _tr("Math"),
  143. type : "MATH",
  144. x : 0,
  145. y : 0,
  146. color : 0xff62676d,
  147. inputs : [
  148. {
  149. id : 0,
  150. node_id : 0,
  151. name : _tr("Value"),
  152. type : "VALUE",
  153. color : 0xffa1a1a1,
  154. default_value : f32_array_create_x(0.5),
  155. min : 0.0,
  156. max : 1.0,
  157. precision : 100,
  158. display : 0
  159. },
  160. {
  161. id : 0,
  162. node_id : 0,
  163. name : _tr("Value"),
  164. type : "VALUE",
  165. color : 0xffa1a1a1,
  166. default_value : f32_array_create_x(0.5),
  167. min : 0.0,
  168. max : 1.0,
  169. precision : 100,
  170. display : 0
  171. }
  172. ],
  173. outputs : [ {
  174. id : 0,
  175. node_id : 0,
  176. name : _tr("Value"),
  177. type : "VALUE",
  178. color : 0xffa1a1a1,
  179. default_value : f32_array_create_x(0.0),
  180. min : 0.0,
  181. max : 1.0,
  182. precision : 100,
  183. display : 0
  184. } ],
  185. buttons : [
  186. {
  187. name : _tr("operation"),
  188. type : "ENUM",
  189. output : 0,
  190. default_value : f32_array_create_x(0),
  191. data : u8_array_create_from_string(
  192. _tr("Add") + "\n" + _tr("Subtract") + "\n" + _tr("Multiply") + "\n" + _tr("Divide") + "\n" + _tr("Power") + "\n" + _tr("Logarithm") + "\n" +
  193. _tr("Square Root") + "\n" + _tr("Inverse Square Root") + "\n" + _tr("Absolute") + "\n" + _tr("Exponent") + "\n" + _tr("Minimum") + "\n" +
  194. _tr("Maximum") + "\n" + _tr("Less Than") + "\n" + _tr("Greater Than") + "\n" + _tr("Sign") + "\n" + _tr("Round") + "\n" + _tr("Floor") + "\n" +
  195. _tr("Ceil") + "\n" + _tr("Truncate") + "\n" + _tr("Fraction") + "\n" + _tr("Modulo") + "\n" + _tr("Snap") + "\n" + _tr("Ping-Pong") + "\n" +
  196. _tr("Sine") + "\n" + _tr("Cosine") + "\n" + _tr("Tangent") + "\n" + _tr("Arcsine") + "\n" + _tr("Arccosine") + "\n" + _tr("Arctangent") + "\n" +
  197. _tr("Arctan2") + "\n" + _tr("Hyperbolic Sine") + "\n" + _tr("Hyperbolic Cosine") + "\n" + _tr("Hyperbolic Tangent") + "\n" + _tr("To Radians") +
  198. "\n" + _tr("To Degrees")),
  199. min : 0.0,
  200. max : 1.0,
  201. precision : 100,
  202. height : 0
  203. },
  204. {
  205. name : _tr("Clamp"),
  206. type : "BOOL",
  207. output : 0,
  208. default_value : f32_array_create_x(0),
  209. data : null,
  210. min : 0.0,
  211. max : 1.0,
  212. precision : 100,
  213. height : 0
  214. }
  215. ],
  216. width : 0,
  217. flags : 0
  218. };