| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- function math2_node_init() {
- array_push(nodes_material_utilities, math2_node_def);
- map_set(parser_material_node_values, "MATH", math2_node_value);
- }
- function math2_node_value(node: ui_node_t, socket: ui_node_socket_t): string {
- let val1: string = parser_material_parse_value_input(node.inputs[0]);
- let val2: string = parser_material_parse_value_input(node.inputs[1]);
- let but: ui_node_button_t = node.buttons[0]; // operation
- let op: string = to_upper_case(u8_array_string_at(but.data, but.default_value[0]));
- op = string_replace_all(op, " ", "_");
- let use_clamp: bool = node.buttons[1].default_value[0] > 0;
- let out_val: string = "";
- if (op == "ADD") {
- out_val = "(" + val1 + " + " + val2 + ")";
- }
- else if (op == "SUBTRACT") {
- out_val = "(" + val1 + " - " + val2 + ")";
- }
- else if (op == "MULTIPLY") {
- out_val = "(" + val1 + " * " + val2 + ")";
- }
- else if (op == "DIVIDE") {
- let store: string = parser_material_store_var_name(node) + "_divide";
- parser_material_write(parser_material_kong, "var " + store + ": float = " + val2 + ";");
- parser_material_write(parser_material_kong, "if (" + store + " == 0.0) { " + store + " = " + parser_material_eps + "; }");
- out_val = "(" + val1 + " / " + store + ")";
- }
- else if (op == "POWER") {
- out_val = "pow(" + val1 + ", " + val2 + ")";
- }
- else if (op == "LOGARITHM") {
- out_val = "log(" + val1 + ")";
- }
- else if (op == "SQUARE_ROOT") {
- out_val = "sqrt(" + val1 + ")";
- }
- else if (op == "INVERSE_SQUARE_ROOT") {
- out_val = "rsqrt(" + val1 + ")";
- }
- else if (op == "EXPONENT") {
- out_val = "exp(" + val1 + ")";
- }
- else if (op == "ABSOLUTE") {
- out_val = "abs(" + val1 + ")";
- }
- else if (op == "MINIMUM") {
- out_val = "min(" + val1 + ", " + val2 + ")";
- }
- else if (op == "MAXIMUM") {
- out_val = "max(" + val1 + ", " + val2 + ")";
- }
- else if (op == "LESS_THAN") {
- // out_val = "float(" + val1 + " < " + val2 + ")";
- let store: string = parser_material_store_var_name(node) + "_lessthan";
- parser_material_write(parser_material_kong, "var " + store + ": float = 0.0;");
- parser_material_write(parser_material_kong, "if (" + val1 + " < " + val2 + ") { " + store + " = 1.0; }");
- out_val = store;
- }
- else if (op == "GREATER_THAN") {
- // out_val = "float(" + val1 + " > " + val2 + ")";
- let store: string = parser_material_store_var_name(node) + "_greaterthan";
- parser_material_write(parser_material_kong, "var " + store + ": float = 0.0;");
- parser_material_write(parser_material_kong, "if (" + val1 + " > " + val2 + ") { " + store + " = 1.0; }");
- out_val = store;
- }
- else if (op == "SIGN") {
- out_val = "sign(" + val1 + ")";
- }
- else if (op == "ROUND") {
- out_val = "floor(" + val1 + " + 0.5)";
- }
- else if (op == "FLOOR") {
- out_val = "floor(" + val1 + ")";
- }
- else if (op == "CEIL") {
- out_val = "ceil(" + val1 + ")";
- }
- else if (op == "SNAP") {
- out_val = "(floor(" + val1 + " / " + val2 + ") * " + val2 + ")";
- }
- else if (op == "TRUNCATE") {
- out_val = "trunc(" + val1 + ")";
- }
- else if (op == "FRACTION") {
- out_val = "frac(" + val1 + ")";
- }
- else if (op == "MODULO") {
- out_val = "(" + val1 + " % " + val2 + ")";
- }
- else if (op == "PING-PONG") {
- let store: string = parser_material_store_var_name(node) + "_pingpong";
- parser_material_write(parser_material_kong, "var " + store + ": float = 0.0;");
- parser_material_write(parser_material_kong, "if (" + val2 + " != 0.0) { " + store + " = abs(frac((" + val1 + " - " + val2 + ") / (" + val2 +
- " * 2.0)) * " + val2 + " * 2.0 - " + val2 + "); }");
- out_val = store;
- }
- else if (op == "SINE") {
- out_val = "sin(" + val1 + ")";
- }
- else if (op == "COSINE") {
- out_val = "cos(" + val1 + ")";
- }
- else if (op == "TANGENT") {
- out_val = "tan(" + val1 + ")";
- }
- else if (op == "ARCSINE") {
- out_val = "asin(" + val1 + ")";
- }
- else if (op == "ARCCOSINE") {
- out_val = "acos(" + val1 + ")";
- }
- else if (op == "ARCTANGENT") {
- out_val = "atan(" + val1 + ")";
- }
- else if (op == "ARCTAN2") {
- out_val = "atan2(" + val1 + ", " + val2 + ")";
- }
- else if (op == "HYPERBOLIC_SINE") {
- out_val = "sinh(" + val1 + ")";
- }
- else if (op == "HYPERBOLIC_COSINE") {
- out_val = "cosh(" + val1 + ")";
- }
- else if (op == "HYPERBOLIC_TANGENT") {
- out_val = "tanh(" + val1 + ")";
- }
- else if (op == "TO_RADIANS") {
- out_val = "radians(" + val1 + ")";
- }
- else if (op == "TO_DEGREES") {
- out_val = "degrees(" + val1 + ")";
- }
- if (use_clamp) {
- return "clamp(" + out_val + ", 0.0, 1.0)";
- }
- else {
- return out_val;
- }
- }
- let math2_node_def: ui_node_t = {
- id : 0,
- name : _tr("Math"),
- type : "MATH",
- x : 0,
- y : 0,
- color : 0xff62676d,
- inputs : [
- {
- id : 0,
- node_id : 0,
- name : _tr("Value"),
- type : "VALUE",
- color : 0xffa1a1a1,
- default_value : f32_array_create_x(0.5),
- min : 0.0,
- max : 1.0,
- precision : 100,
- display : 0
- },
- {
- id : 0,
- node_id : 0,
- name : _tr("Value"),
- type : "VALUE",
- color : 0xffa1a1a1,
- default_value : f32_array_create_x(0.5),
- min : 0.0,
- max : 1.0,
- precision : 100,
- display : 0
- }
- ],
- outputs : [ {
- id : 0,
- node_id : 0,
- name : _tr("Value"),
- type : "VALUE",
- color : 0xffa1a1a1,
- default_value : f32_array_create_x(0.0),
- min : 0.0,
- max : 1.0,
- precision : 100,
- display : 0
- } ],
- buttons : [
- {
- name : _tr("operation"),
- type : "ENUM",
- output : 0,
- default_value : f32_array_create_x(0),
- data : u8_array_create_from_string(
- _tr("Add") + "\n" + _tr("Subtract") + "\n" + _tr("Multiply") + "\n" + _tr("Divide") + "\n" + _tr("Power") + "\n" + _tr("Logarithm") + "\n" +
- _tr("Square Root") + "\n" + _tr("Inverse Square Root") + "\n" + _tr("Absolute") + "\n" + _tr("Exponent") + "\n" + _tr("Minimum") + "\n" +
- _tr("Maximum") + "\n" + _tr("Less Than") + "\n" + _tr("Greater Than") + "\n" + _tr("Sign") + "\n" + _tr("Round") + "\n" + _tr("Floor") + "\n" +
- _tr("Ceil") + "\n" + _tr("Truncate") + "\n" + _tr("Fraction") + "\n" + _tr("Modulo") + "\n" + _tr("Snap") + "\n" + _tr("Ping-Pong") + "\n" +
- _tr("Sine") + "\n" + _tr("Cosine") + "\n" + _tr("Tangent") + "\n" + _tr("Arcsine") + "\n" + _tr("Arccosine") + "\n" + _tr("Arctangent") + "\n" +
- _tr("Arctan2") + "\n" + _tr("Hyperbolic Sine") + "\n" + _tr("Hyperbolic Cosine") + "\n" + _tr("Hyperbolic Tangent") + "\n" + _tr("To Radians") +
- "\n" + _tr("To Degrees")),
- min : 0.0,
- max : 1.0,
- precision : 100,
- height : 0
- },
- {
- name : _tr("Clamp"),
- type : "BOOL",
- output : 0,
- default_value : f32_array_create_x(0),
- data : null,
- min : 0.0,
- max : 1.0,
- precision : 100,
- height : 0
- }
- ],
- width : 0,
- flags : 0
- };
|