From bf09feec646d9dec3bba12bb7fc2992702de1d84 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Mon, 8 Sep 2025 19:11:22 +0200 Subject: [PATCH] Shader fixes --- paint/sources/make_material.ts | 28 +++++++++++++++++++++------- paint/sources/make_mesh.ts | 4 ++-- paint/sources/parser_material.ts | 22 ++++++++++++++++------ 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/paint/sources/make_material.ts b/paint/sources/make_material.ts index 12fb6b6c..9739ff9a 100644 --- a/paint/sources/make_material.ts +++ b/paint/sources/make_material.ts @@ -407,11 +407,21 @@ function make_material_blend_mode(kong: node_shader_t, blending: i32, cola: stri return "lerp3(" + cola + ", " + cola + " + " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.OVERLAY) { - return "lerp3(" + cola + ", float3( \ - " + cola + ".r < 0.5 ? 2.0 * " + cola + ".r * " + colb + ".r : 1.0 - 2.0 * (1.0 - " + cola + ".r) * (1.0 - " + colb + ".r), \ - " + cola + ".g < 0.5 ? 2.0 * " + cola + ".g * " + colb + ".g : 1.0 - 2.0 * (1.0 - " + cola + ".g) * (1.0 - " + colb + ".g), \ - " + cola + ".b < 0.5 ? 2.0 * " + cola + ".b * " + colb + ".b : 1.0 - 2.0 * (1.0 - " + cola + ".b) * (1.0 - " + colb + ".b) \ - ), " + opac + ")"; + // return "lerp3(" + cola + ", float3( \ + // " + cola + ".r < 0.5 ? 2.0 * " + cola + ".r * " + colb + ".r : 1.0 - 2.0 * (1.0 - " + cola + ".r) * (1.0 - " + colb + ".r), \ + // " + cola + ".g < 0.5 ? 2.0 * " + cola + ".g * " + colb + ".g : 1.0 - 2.0 * (1.0 - " + cola + ".g) * (1.0 - " + colb + ".g), \ + // " + cola + ".b < 0.5 ? 2.0 * " + cola + ".b * " + colb + ".b : 1.0 - 2.0 * (1.0 - " + cola + ".b) * (1.0 - " + colb + ".b) \ + // ), " + opac + ")"; + let res_r: string = string_replace_all(cola, ".", "_") + "_res_r"; + let res_g: string = string_replace_all(cola, ".", "_") + "_res_g"; + let res_b: string = string_replace_all(cola, ".", "_") + "_res_b"; + node_shader_write_frag(kong, "var " + res_r + ": float;"); + node_shader_write_frag(kong, "var " + res_g + ": float;"); + node_shader_write_frag(kong, "var " + res_b + ": float;"); + node_shader_write_frag(kong, "if (" + cola + ".r < 0.5) { " + res_r + " = 2.0 * " + cola + ".r * " + colb + ".r; } else { " + res_r + " = 1.0 - 2.0 * (1.0 - " + cola + ".r) * (1.0 - " + colb + ".r); }"); + node_shader_write_frag(kong, "if (" + cola + ".g < 0.5) { " + res_g + " = 2.0 * " + cola + ".g * " + colb + ".g; } else { " + res_g + " = 1.0 - 2.0 * (1.0 - " + cola + ".g) * (1.0 - " + colb + ".g); }"); + node_shader_write_frag(kong, "if (" + cola + ".b < 0.5) { " + res_b + " = 2.0 * " + cola + ".b * " + colb + ".b; } else { " + res_b + " = 1.0 - 2.0 * (1.0 - " + cola + ".b) * (1.0 - " + colb + ".b); }"); + return "lerp3(" + cola + ", float3(" + res_r + ", " + res_g + ", " + res_b + "), " + opac + ")"; } else if (blending == blend_type_t.SOFT_LIGHT) { return "((1.0 - " + opac + ") * " + cola + " + " + opac + " * ((float3(1.0, 1.0, 1.0) - " + cola + ") * " + colb + " * " + cola + " + " + cola + " * (float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - " + colb + ") * (float3(1.0, 1.0, 1.0) - " + cola + "))))"; @@ -446,7 +456,7 @@ function make_material_blend_mode(kong: node_shader_t, blending: i32, cola: stri } } -function make_material_blend_mode_mask(blending: i32, cola: string, colb: string, opac: string): string { +function make_material_blend_mode_mask(kong: node_shader_t, blending: i32, cola: string, colb: string, opac: string): string { if (blending == blend_type_t.MIX) { return "lerp(" + cola + ", " + colb + ", " + opac + ")"; } @@ -472,7 +482,11 @@ function make_material_blend_mode_mask(blending: i32, cola: string, colb: string return "lerp(" + cola + ", " + cola + " + " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.OVERLAY) { - return "lerp(" + cola + ", " + cola + " < 0.5 ? 2.0 * " + cola + " * " + colb + " : 1.0 - 2.0 * (1.0 - " + cola + ") * (1.0 - " + colb + "), " + opac + ")"; + // return "lerp(" + cola + ", " + cola + " < 0.5 ? 2.0 * " + cola + " * " + colb + " : 1.0 - 2.0 * (1.0 - " + cola + ") * (1.0 - " + colb + "), " + opac + ")"; + let res: string = string_replace_all(cola, ".", "_") + "_res"; + node_shader_write_frag(kong, "var " + res + ": float;"); + node_shader_write_frag(kong, "if (" + cola + " < 0.5) { " + res + " = 2.0 * " + cola + " * " + colb + "; } else { " + res + " = 1.0 - 2.0 * (1.0 - " + cola + ") * (1.0 - " + colb + "); }"); + return "lerp(" + cola + ", " + res + ", " + opac + ")"; } else if (blending == blend_type_t.SOFT_LIGHT) { return "((1.0 - " + opac + ") * " + cola + " + " + opac + " * ((1.0 - " + cola + ") * " + colb + " * " + cola + " + " + cola + " * (1.0 - (1.0 - " + colb + ") * (1.0 - " + cola + "))))"; diff --git a/paint/sources/make_mesh.ts b/paint/sources/make_mesh.ts index 2fce4bfe..4924e76e 100644 --- a/paint/sources/make_mesh.ts +++ b/paint/sources/make_mesh.ts @@ -242,7 +242,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "{"); // Group mask is sampled across multiple layers node_shader_write_frag(kong, "var texpaint_mask_sample" + m.id + ": float = sample_lod(texpaint" + m.id + ", sampler_linear, tex_coord, 0.0).r;"); let opac: f32 = slot_layer_get_opacity(m); - let mask: string = make_material_blend_mode_mask(m.blending, texpaint_mask, "texpaint_mask_sample" + m.id, "float(" + opac + ")"); + let mask: string = make_material_blend_mode_mask(kong, m.blending, texpaint_mask, "texpaint_mask_sample" + m.id, "float(" + opac + ")"); node_shader_write_frag(kong, texpaint_mask + " = " + mask + ";"); node_shader_write_frag(kong, "}"); } @@ -503,7 +503,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } node_shader_write_frag(kong, "var mask_sample" + m.id + ": float = sample_lod(texpaint_view_mask" + m.id + ", sampler_linear, tex_coord, 0.0).r;"); let opac: f32 = slot_layer_get_opacity(m); - let mask: string = make_material_blend_mode_mask(m.blending, "mask_view", "mask_sample" + m.id, "float(" + opac + ")"); + let mask: string = make_material_blend_mode_mask(kong, m.blending, "mask_view", "mask_sample" + m.id, "float(" + opac + ")"); node_shader_write_frag(kong, "mask_view = " + mask + ";"); } } diff --git a/paint/sources/parser_material.ts b/paint/sources/parser_material.ts index f36a3fb5..b39af77c 100644 --- a/paint/sources/parser_material.ts +++ b/paint/sources/parser_material.ts @@ -716,11 +716,21 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) out_col = "lerp3(" + col1 + ", " + col1 + " + " + col2 + ", " + fac_var + ")"; } else if (blend == "OVERLAY") { - out_col = "lerp3(" + col1 + ", float3( \ - " + col1 + ".r < 0.5 ? 2.0 * " + col1 + ".r * " + col2 + ".r : 1.0 - 2.0 * (1.0 - " + col1 + ".r) * (1.0 - " + col2 + ".r), \ - " + col1 + ".g < 0.5 ? 2.0 * " + col1 + ".g * " + col2 + ".g : 1.0 - 2.0 * (1.0 - " + col1 + ".g) * (1.0 - " + col2 + ".g), \ - " + col1 + ".b < 0.5 ? 2.0 * " + col1 + ".b * " + col2 + ".b : 1.0 - 2.0 * (1.0 - " + col1 + ".b) * (1.0 - " + col2 + ".b) \ - ), " + fac_var + ")"; + // out_col = "lerp3(" + col1 + ", float3( \ + // " + col1 + ".r < 0.5 ? 2.0 * " + col1 + ".r * " + col2 + ".r : 1.0 - 2.0 * (1.0 - " + col1 + ".r) * (1.0 - " + col2 + ".r), \ + // " + col1 + ".g < 0.5 ? 2.0 * " + col1 + ".g * " + col2 + ".g : 1.0 - 2.0 * (1.0 - " + col1 + ".g) * (1.0 - " + col2 + ".g), \ + // " + col1 + ".b < 0.5 ? 2.0 * " + col1 + ".b * " + col2 + ".b : 1.0 - 2.0 * (1.0 - " + col1 + ".b) * (1.0 - " + col2 + ".b) \ + // ), " + fac_var + ")"; + let res_r: string = parser_material_node_name(node) + "_res_r"; + let res_g: string = parser_material_node_name(node) + "_res_g"; + let res_b: string = parser_material_node_name(node) + "_res_b"; + parser_material_write(parser_material_kong, "var " + res_r + ": float;"); + parser_material_write(parser_material_kong, "var " + res_g + ": float;"); + parser_material_write(parser_material_kong, "var " + res_b + ": float;"); + parser_material_write(parser_material_kong, "if (" + col1 + ".r < 0.5) { " + res_r + " = 2.0 * " + col1 + ".r * " + col2 + ".r; } else { " + res_r + " = 1.0 - 2.0 * (1.0 - " + col1 + ".r) * (1.0 - " + col2 + ".r); }"); + parser_material_write(parser_material_kong, "if (" + col1 + ".g < 0.5) { " + res_g + " = 2.0 * " + col1 + ".g * " + col2 + ".g; } else { " + res_g + " = 1.0 - 2.0 * (1.0 - " + col1 + ".g) * (1.0 - " + col2 + ".g); }"); + parser_material_write(parser_material_kong, "if (" + col1 + ".b < 0.5) { " + res_b + " = 2.0 * " + col1 + ".b * " + col2 + ".b; } else { " + res_b + " = 1.0 - 2.0 * (1.0 - " + col1 + ".b) * (1.0 - " + col2 + ".b); }"); + out_col = "lerp3(" + col1 + ", float3(" + res_r + ", " + res_g + ", " + res_b + "), " + fac_var + ")"; } else if (blend == "SOFT_LIGHT") { out_col = "((1.0 - " + fac_var + ") * " + col1 + " + " + fac_var + " * ((float3(1.0, 1.0, 1.0) - " + col1 + ") * " + col2 + " * " + col1 + " + " + col1 + " * (float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - " + col2 + ") * (float3(1.0, 1.0, 1.0) - " + col1 + "))))"; @@ -737,7 +747,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) else if (blend == "DIVIDE") { let eps: f32 = 0.000001; col2 = "max3(" + col2 + ", float3(" + eps + ", " + eps + ", " + eps + "))"; - let v3: string = parser_material_to_vec3("(1.0 - " + fac_var + ") * " + col1 + " + " + fac_var + " * " + col1 + " / " + col2); + let v3: string = "(float3(1.0, 1.0, 1.0) - float3(" + fac_var + ", " + fac_var + ", " + fac_var + ")) * " + col1 + " + float3(" + fac_var + ", " + fac_var + ", " + fac_var + ") * " + col1 + " / " + col2; out_col = "(" + v3 + ")"; } else if (blend == "HUE") {