2
0
luboslenco 1 долоо хоног өмнө
parent
commit
6d659ca425

+ 10 - 0
base/sources/libs/kong/functions.c

@@ -853,6 +853,16 @@ void functions_init(void) {
 	////
 	// add_func_float3_float3("abs");
 	add_func_float_float("abs");
+	add_func_float_float("tan");
+	add_func_float_float("log");
+	add_func_float_float("exp");
+	add_func_float_float("sign");
+	add_func_float_float("trunc");
+	add_func_float_float("sinh");
+	add_func_float_float("cosh");
+	add_func_float_float("tanh");
+	add_func_float_float("radians");
+	add_func_float_float("degrees");
 	////
 	add_func_float_float_float("floor");
 	add_func_float_float_float("ceil");

+ 17 - 7
paint/sources/parser_material.ts

@@ -1150,7 +1150,12 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t)
 			return "(" + vec1 + " * " + vec2 + ")";
 		}
 		else if (op == "DIVIDE") {
-			return "float3(" + vec1 + ".x / (" + vec2 + ".x == 0 ? 0.000001 : " + vec2 + ".x), " + vec1 + ".y / (" + vec2 + ".y == 0 ? 0.000001 : " + vec2 + ".y), " + vec1 + ".z / (" + vec2 + ".z == 0 ? 0.000001 : " + vec2 + ".z))";
+			let store: string = parser_material_store_var_name(node) + "_vec2";
+			parser_material_write(parser_material_kong, "var " + store + ": float3 = " + vec2 + ";");
+			parser_material_write(parser_material_kong, "if (" + store + ".x == 0.0) { " + store + ".x = 0.000001; }");
+			parser_material_write(parser_material_kong, "if (" + store + ".y == 0.0) { " + store + ".y = 0.000001; }");
+			parser_material_write(parser_material_kong, "if (" + store + ".z == 0.0) { " + store + ".z = 0.000001; }");
+			return "(" + vec1 + " / " + vec2 + ")";
 		}
 		else if (op == "PROJECT") {
 			return "(dot(" + vec1 + ", " + vec2 + ") / dot(" + vec2 + ", " + vec2 + ") * " + vec2 + ")";
@@ -1186,13 +1191,13 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t)
 			return "(floor3(" + vec1 + " / " + vec2 + ") * " + vec2 + ")";
 		}
 		else if (op == "SINE") {
-			return "sin(" + vec1 + ")";
+			return "float3(sin(" + vec1 + ".x), sin(" + vec1 + ".y), sin(" + vec1 + ".z))";
 		}
 		else if (op == "COSINE") {
-			return "cos(" + vec1 + ")";
+			return "float3(cos(" + vec1 + ".x), cos(" + vec1 + ".y), cos(" + vec1 + ".z))";
 		}
 		else if (op == "TANGENT") {
-			return "tan(" + vec1 + ")";
+			return "float3(tan(" + vec1 + ".x), tan(" + vec1 + ".y), tan(" + vec1 + ".z))";
 		}
 	}
 	else if (node.type == "Displacement") {
@@ -1561,8 +1566,10 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t):
 			out_val = "(" + val1 + " * " + val2 + ")";
 		}
 		else if (op == "DIVIDE") {
-			val2 = "(" + val2 + " == 0.0 ? " + parser_material_eps + " : " + val2 + ")";
-			out_val = "(" + val1 + " / " + val2 + ")";
+			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 + ")";
@@ -1619,7 +1626,10 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t):
 			out_val = "(" + val1 + " % " + val2 + ")";
 		}
 		else if (op == "PING-PONG") {
-			out_val = "((" + val2 + " != 0.0) ? abs(frac((" + val1 + " - " + val2 + ") / (" + val2 + " * 2.0)) * " + val2 + " * 2.0 - " + val2 + ") : 0.0)";
+			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 + ")";