From 4ccc0a37829ed46bda2e099a98c4603f1264e30c Mon Sep 17 00:00:00 2001 From: luboslenco Date: Fri, 18 Jul 2025 16:50:01 +0200 Subject: [PATCH] Shader fixes --- armorlab/sources/make_mesh.ts | 10 ++--- armorlab/sources/make_paint.ts | 4 +- armorpaint/assets/plugins/hello_node.js | 2 +- armorpaint/sources/make_bake.ts | 20 +++++----- armorpaint/sources/make_mesh.ts | 47 +++++++++++++----------- armorpaint/sources/make_mesh_preview.ts | 5 ++- armorpaint/sources/make_node_preview.ts | 1 + armorpaint/sources/make_paint.ts | 32 ++++++++-------- armorpaint/sources/make_texcoord.ts | 6 +-- armorsculpt/sources/make_brush.ts | 2 +- armorsculpt/sources/make_mesh.ts | 15 ++++---- armorsculpt/sources/make_mesh_preview.ts | 5 ++- armorsculpt/sources/make_sculpt.ts | 3 +- base/shaders/deferred_light.kong | 1 - base/sources/ts/node_shader.ts | 4 +- base/sources/ts/parser_material.ts | 38 +++++++++---------- 16 files changed, 100 insertions(+), 95 deletions(-) diff --git a/armorlab/sources/make_mesh.ts b/armorlab/sources/make_mesh.ts index 51459b3b..f396aac1 100644 --- a/armorlab/sources/make_mesh.ts +++ b/armorlab/sources/make_mesh.ts @@ -94,15 +94,15 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } node_shader_add_texture(kong, "texpaint"); - node_shader_write_frag(kong, "texpaint_sample = sample_lod(texpaint, sampler_linear, input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "texpaint_sample = sample_lod(texpaint, sampler_linear, tex_coord, 0.0);"); node_shader_write_frag(kong, "texpaint_opac = texpaint_sample.a;"); node_shader_write_frag(kong, "basecol = texpaint_sample.rgb * texpaint_opac;"); node_shader_add_texture(kong, "texpaint_nor"); - node_shader_write_frag(kong, "texpaint_nor_sample = sample_lod(texpaint_nor, sampler_linear, input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "texpaint_nor_sample = sample_lod(texpaint_nor, sampler_linear, tex_coord, 0.0);"); node_shader_write_frag(kong, "ntex = lerp3(ntex, texpaint_nor_sample.rgb, texpaint_opac);"); node_shader_add_texture(kong, "texpaint_pack"); - node_shader_write_frag(kong, "texpaint_pack_sample = sample_lod(texpaint_pack, sampler_linear, input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "texpaint_pack_sample = sample_lod(texpaint_pack, sampler_linear, tex_coord, 0.0);"); node_shader_write_frag(kong, "occlusion = lerp(occlusion, texpaint_pack_sample.r, texpaint_opac);"); node_shader_write_frag(kong, "roughness = lerp(roughness, texpaint_pack_sample.g, texpaint_opac);"); node_shader_write_frag(kong, "metallic = lerp(metallic, texpaint_pack_sample.b, texpaint_opac);"); @@ -120,7 +120,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } kong.frag_vvec = true; - node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, input.tex_coord);"); + node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); node_shader_write_frag(kong, "n = ntex * 2.0 - 1.0;"); node_shader_write_frag(kong, "n.y = -n.y;"); node_shader_write_frag(kong, "n = normalize(TBN * n);"); @@ -211,7 +211,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte // node_shader_write_frag(kong, "n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy);"); node_shader_write_frag(kong, "if (n.z < 0.0) { n.xy = octahedron_wrap(n.xy); }"); node_shader_write_frag(kong, "output[0] = float4(n.xy, roughness, pack_f32_i16(metallic, uint(float(int(matid * 255.0)) % float(3))));"); - node_shader_write_frag(kong, "output[2] = float4(0.0, 0.0, input.tex_coord.xy);"); + node_shader_write_frag(kong, "output[2] = float4(0.0, 0.0, tex_coord.xy);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; diff --git a/armorlab/sources/make_paint.ts b/armorlab/sources/make_paint.ts index a000c5f1..748783b6 100644 --- a/armorlab/sources/make_paint.ts +++ b/armorlab/sources/make_paint.ts @@ -48,7 +48,9 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_add_constant(kong, "gbuffer_size: float2", "_gbuffer_size"); node_shader_add_constant(kong, "inp: float4", "_input_brush"); - node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[uint2(constants.inp.x * constants.gbuffer_size.x, constants.inp.y * constants.gbuffer_size.y)].ba;"); + // node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[uint2(constants.inp.x * constants.gbuffer_size.x, constants.inp.y * constants.gbuffer_size.y)].ba;"); + node_shader_write_frag(kong, "var tex_coord_inp4: float4 = gbuffer2[uint2(constants.inp.x * constants.gbuffer_size.x, constants.inp.y * constants.gbuffer_size.y)];"); + node_shader_write_frag(kong, "var tex_coord_inp: float2 = tex_coord_inp4.ba;"); kong.frag_out = "float4[4]"; node_shader_add_texture(kong, "texpaint"); diff --git a/armorpaint/assets/plugins/hello_node.js b/armorpaint/assets/plugins/hello_node.js index ddbbded5..2e14fb9c 100644 --- a/armorpaint/assets/plugins/hello_node.js +++ b/armorpaint/assets/plugins/hello_node.js @@ -68,7 +68,7 @@ parser_material_custom_nodes_set(node_type, function(node, socket_name) { let my_out = "my_out"; node_shader_write_frag(kong, - "var " + my_out + ": float = cos(sin(input.tex_coord.x * 200.0 * " + scale + ") + cos(input.tex_coord.y * 200.0 * " + scale + "));" + "var " + my_out + ": float = cos(sin(tex_coord.x * 200.0 * " + scale + ") + cos(tex_coord.y * 200.0 * " + scale + "));" ); if (socket_name == "Color") { diff --git a/armorpaint/sources/make_bake.ts b/armorpaint/sources/make_bake.ts index 97810340..47a2a859 100644 --- a/armorpaint/sources/make_bake.ts +++ b/armorpaint/sources/make_bake.ts @@ -22,10 +22,10 @@ function make_bake_run(con: node_shader_context_t, kong: node_shader_t) { else if (context_raw.bake_type == bake_type_t.NORMAL) { // Tangent kong.frag_n = true; node_shader_add_texture(kong, "texpaint_undo", "_texpaint_undo"); // Baked high-poly normals - node_shader_write_frag(kong, "var n0: float3 = sample_lod(texpaint_undo, sampler_linear, input.tex_coord, 0.0).rgb * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); + node_shader_write_frag(kong, "var n0: float3 = sample_lod(texpaint_undo, sampler_linear, tex_coord, 0.0).rgb * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); node_shader_add_function(kong, str_cotangent_frame); node_shader_add_function(kong, str_transpose); - node_shader_write_frag(kong, "var invTBN: float3x3 = _transpose(cotangent_frame(n, n, input.tex_coord));"); + node_shader_write_frag(kong, "var invTBN: float3x3 = _transpose(cotangent_frame(n, n, tex_coord));"); node_shader_write_frag(kong, "var res: float3 = normalize(invTBN * n0) * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5);"); node_shader_write_frag(kong, "output[0] = float4(res, 1.0);"); } @@ -39,17 +39,17 @@ function make_bake_run(con: node_shader_context_t, kong: node_shader_t) { else if (context_raw.bake_type == bake_type_t.HEIGHT) { kong.frag_wposition = true; node_shader_add_texture(kong, "texpaint_undo", "_texpaint_undo"); // Baked high-poly positions - node_shader_write_frag(kong, "var wpos0: float3 = sample_lod(texpaint_undo, sampler_linear, input.tex_coord, 0.0).rgb * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); + node_shader_write_frag(kong, "var wpos0: float3 = sample_lod(texpaint_undo, sampler_linear, tex_coord, 0.0).rgb * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); node_shader_write_frag(kong, "var res: float = distance(wpos0, input.wposition) * 10.0;"); node_shader_write_frag(kong, "output[0] = float4(res, res, res, 1.0);"); } else if (context_raw.bake_type == bake_type_t.DERIVATIVE) { node_shader_add_texture(kong, "texpaint_undo", "_texpaint_undo"); // Baked height - node_shader_write_frag(kong, "var tex_dx: float2 = ddx2(input.tex_coord);"); - node_shader_write_frag(kong, "var tex_dy: float2 = ddy2(input.tex_coord);"); - node_shader_write_frag(kong, "var h0: float = sample_lod(texpaint_undo, sampler_linear, input.tex_coord, 0.0).r * 100;"); - node_shader_write_frag(kong, "var h1: float = sample_lod(texpaint_undo, sampler_linear, input.tex_coord + tex_dx, 0.0).r * 100;"); - node_shader_write_frag(kong, "var h2: float = sample_lod(texpaint_undo, sampler_linear, input.tex_coord + tex_dy, 0.0).r * 100;"); + node_shader_write_frag(kong, "var tex_dx: float2 = ddx2(tex_coord);"); + node_shader_write_frag(kong, "var tex_dy: float2 = ddy2(tex_coord);"); + node_shader_write_frag(kong, "var h0: float = sample_lod(texpaint_undo, sampler_linear, tex_coord, 0.0).r * 100;"); + node_shader_write_frag(kong, "var h1: float = sample_lod(texpaint_undo, sampler_linear, tex_coord + tex_dx, 0.0).r * 100;"); + node_shader_write_frag(kong, "var h2: float = sample_lod(texpaint_undo, sampler_linear, tex_coord + tex_dy, 0.0).r * 100;"); node_shader_write_frag(kong, "output[0] = float4((h1 - h0) * 0.5 + 0.5, (h2 - h0) * 0.5 + 0.5, 0.0, 1.0);"); } else if (context_raw.bake_type == bake_type_t.POSITION) { @@ -60,11 +60,11 @@ function make_bake_run(con: node_shader_context_t, kong: node_shader_t) { } } else if (context_raw.bake_type == bake_type_t.TEXCOORD) { - node_shader_write_frag(kong, "output[0] = float4(input.tex_coord.xy, 0.0, 1.0);"); + node_shader_write_frag(kong, "output[0] = float4(tex_coord.xy, 0.0, 1.0);"); } else if (context_raw.bake_type == bake_type_t.MATERIALID) { node_shader_add_texture(kong, "texpaint_nor_undo", "_texpaint_nor_undo"); - node_shader_write_frag(kong, "var sample_matid: float = sample_lod(texpaint_nor_undo, sampler_linear, input.tex_coord, 0.0).a + 1.0 / 255.0;"); + node_shader_write_frag(kong, "var sample_matid: float = sample_lod(texpaint_nor_undo, sampler_linear, tex_coord, 0.0).a + 1.0 / 255.0;"); node_shader_write_frag(kong, "var matid_r: float = frac(sin(dot(float2(sample_matid, sample_matid * 20.0), float2(12.9898, 78.233))) * 43758.5453);"); node_shader_write_frag(kong, "var matid_g: float = frac(sin(dot(float2(sample_matid * 20.0, sample_matid), float2(12.9898, 78.233))) * 43758.5453);"); node_shader_write_frag(kong, "var matid_b: float = frac(sin(dot(float2(sample_matid, sample_matid * 40.0), float2(12.9898, 78.233))) * 43758.5453);"); diff --git a/armorpaint/sources/make_mesh.ts b/armorpaint/sources/make_mesh.ts index 81233137..facb4b6d 100644 --- a/armorpaint/sources/make_mesh.ts +++ b/armorpaint/sources/make_mesh.ts @@ -74,6 +74,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_vert(kong, "output.pos = constants.VP * float4(output.wposition.xyz, 1.0);"); node_shader_write_vert(kong, "output.tex_coord = input.tex;"); + node_shader_write_attrib_frag(kong, "var tex_coord: float2 = input.tex_coord;"); kong.frag_out = "float4[3]"; kong.frag_n = true; @@ -83,7 +84,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte texture_count++; node_shader_add_texture(kong, "texcolorid", "_texcolorid"); node_shader_write_frag(kong, "output[0] = float4(n.xy, 1.0, pack_f32_i16(0.0, uint(0)));"); - node_shader_write_frag(kong, "var idcol: float3 = pow3(sample_lod(texcolorid, sampler_linear, input.tex_coord, 0.0).rgb, float3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "var idcol: float3 = pow3(sample_lod(texcolorid, sampler_linear, tex_coord, 0.0).rgb, float3(2.2, 2.2, 2.2));"); node_shader_write_frag(kong, "output[1] = float4(idcol.rgb, 1.0);"); // occ } else { @@ -211,7 +212,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } node_shader_add_texture(kong, "texpaint" + l.id); - node_shader_write_frag(kong, "texpaint_sample = sample_lod(texpaint" + l.id + ", sampler_linear, input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "texpaint_sample = sample_lod(texpaint" + l.id + ", sampler_linear, tex_coord, 0.0);"); node_shader_write_frag(kong, "texpaint_opac = texpaint_sample.a;"); // ///if (arm_direct3d12 || arm_vulkan) // if (raw.viewport_mode == viewport_mode_t.LIT) { @@ -239,7 +240,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } node_shader_add_texture(kong, "texpaint" + m.id); 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, input.tex_coord, 0.0).r;"); + 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 + ")"); node_shader_write_frag(kong, texpaint_mask + " = " + mask + ";"); @@ -265,10 +266,14 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (l.paint_nor || make_material_emis_used) { node_shader_add_texture(kong, "texpaint_nor" + l.id); - node_shader_write_frag(kong, "texpaint_nor_sample = sample_lod(texpaint_nor" + l.id + ", sampler_linear, input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "texpaint_nor_sample = sample_lod(texpaint_nor" + l.id + ", sampler_linear, tex_coord, 0.0);"); if (make_material_emis_used) { - node_shader_write_frag(kong, "if (texpaint_opac > 0.0) { matid = texpaint_nor_sample.a; }"); + node_shader_write_frag(kong, "if (texpaint_opac > 0.0) {"); + node_shader_add_constant(kong, "texpaint_size: float2", "_texpaint_size"); + node_shader_write_frag(kong, " var texpaint_nor_raw: float4 = texpaint_nor" + l.id + "[uint2(uint(tex_coord.x * constants.texpaint_size.x), uint(tex_coord.y * constants.texpaint_size.y))];"); + node_shader_write_frag(kong, " matid = texpaint_nor_raw.a;"); + node_shader_write_frag(kong, "}"); } if (l.paint_nor) { @@ -288,7 +293,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (l.paint_occ || l.paint_rough || l.paint_met || (l.paint_height && make_material_height_used)) { node_shader_add_texture(kong, "texpaint_pack" + l.id); - node_shader_write_frag(kong, "texpaint_pack_sample = sample_lod(texpaint_pack" + l.id + ", sampler_linear, input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "texpaint_pack_sample = sample_lod(texpaint_pack" + l.id + ", sampler_linear, tex_coord, 0.0);"); if (l.paint_occ) { node_shader_write_frag(kong, "occlusion = lerp(occlusion, texpaint_pack_sample.r, texpaint_opac);"); @@ -305,10 +310,10 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "{"); node_shader_add_constant(kong, "texpaint_size: float2", "_texpaint_size"); node_shader_write_frag(kong, "var tex_step: float = 1.0 / constants.texpaint_size.x;"); - node_shader_write_frag(kong, "height0 " + assign + " sample_lod(texpaint_pack" + l.id + ", sampler_linear, float2(input.tex_coord.x - tex_step, input.tex_coord.y), 0.0).a * texpaint_opac;"); - node_shader_write_frag(kong, "height1 " + assign + " sample_lod(texpaint_pack" + l.id + ", sampler_linear, float2(input.tex_coord.x + tex_step, input.tex_coord.y), 0.0).a * texpaint_opac;"); - node_shader_write_frag(kong, "height2 " + assign + " sample_lod(texpaint_pack" + l.id + ", sampler_linear, float2(input.tex_coord.x, input.tex_coord.y - tex_step), 0.0).a * texpaint_opac;"); - node_shader_write_frag(kong, "height3 " + assign + " sample_lod(texpaint_pack" + l.id + ", sampler_linear, float2(input.tex_coord.x, input.tex_coord.y + tex_step), 0.0).a * texpaint_opac;"); + node_shader_write_frag(kong, "height0 " + assign + " sample_lod(texpaint_pack" + l.id + ", sampler_linear, float2(tex_coord.x - tex_step, tex_coord.y), 0.0).a * texpaint_opac;"); + node_shader_write_frag(kong, "height1 " + assign + " sample_lod(texpaint_pack" + l.id + ", sampler_linear, float2(tex_coord.x + tex_step, tex_coord.y), 0.0).a * texpaint_opac;"); + node_shader_write_frag(kong, "height2 " + assign + " sample_lod(texpaint_pack" + l.id + ", sampler_linear, float2(tex_coord.x, tex_coord.y - tex_step), 0.0).a * texpaint_opac;"); + node_shader_write_frag(kong, "height3 " + assign + " sample_lod(texpaint_pack" + l.id + ", sampler_linear, float2(tex_coord.x, tex_coord.y + tex_step), 0.0).a * texpaint_opac;"); node_shader_write_frag(kong, "}"); } } @@ -320,9 +325,9 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (last_pass && context_raw.draw_texels) { node_shader_add_constant(kong, "texpaint_size: float2", "_texpaint_size"); - node_shader_write_frag(kong, "var texel0: float2 = input.tex_coord * constants.texpaint_size * 0.01;"); - node_shader_write_frag(kong, "var texel1: float2 = input.tex_coord * constants.texpaint_size * 0.1;"); - node_shader_write_frag(kong, "var texel2: float2 = input.tex_coord * constants.texpaint_size;"); + node_shader_write_frag(kong, "var texel0: float2 = tex_coord * constants.texpaint_size * 0.01;"); + node_shader_write_frag(kong, "var texel1: float2 = tex_coord * constants.texpaint_size * 0.1;"); + node_shader_write_frag(kong, "var texel2: float2 = tex_coord * constants.texpaint_size;"); // node_shader_write_frag(kong, "basecol = basecol * max(float((int(texel0.x) % 2.0) == (int(texel0.y) % 2.0)), 0.9);"); // node_shader_write_frag(kong, "basecol = basecol * max(float((int(texel1.x) % 2.0) == (int(texel1.y) % 2.0)), 0.9);"); // node_shader_write_frag(kong, "basecol = basecol * max(float((int(texel2.x) % 2.0) == (int(texel2.y) % 2.0)), 0.9);"); @@ -338,7 +343,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (last_pass && context_raw.draw_wireframe) { - node_shader_write_frag(kong, "var wireframe: float = sample_lod(texuvmap, sampler_linear, input.tex_coord, 0.0).a;"); + node_shader_write_frag(kong, "var wireframe: float = sample_lod(texuvmap, sampler_linear, tex_coord, 0.0).a;"); node_shader_write_frag(kong, "basecol = basecol * (1.0 - wireframe * 0.25);"); node_shader_write_frag(kong, "roughness = max(roughness, wireframe);"); } @@ -365,7 +370,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } kong.frag_vvec = true; - node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, input.tex_coord);"); + node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); node_shader_write_frag(kong, "n = ntex * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); node_shader_write_frag(kong, "n.y = -n.y;"); node_shader_write_frag(kong, "n = normalize(TBN * n);"); @@ -458,7 +463,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "output[1] = float4(float3(subs, subs, subs), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.TEXCOORD) { - node_shader_write_frag(kong, "output[1] = float4(input.tex_coord, 0.0, 1.0);"); + node_shader_write_frag(kong, "output[1] = float4(tex_coord, 0.0, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) { kong.frag_nattr = true; @@ -468,8 +473,8 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte let id: i32 = context_raw.layer.id; node_shader_add_texture(kong, "texpaint_nor" + id); node_shader_add_constant(kong, "texpaint_size: float2", "_texpaint_size"); - // node_shader_write_frag(kong, "var sample_matid: float = texpaint_nor" + id + "[uint2(input.tex_coord * constants.texpaint_size)].a + 1.0 / 255.0;"); - node_shader_write_frag(kong, "var sample_matid_coord: float2 = input.tex_coord * constants.texpaint_size;"); + // node_shader_write_frag(kong, "var sample_matid: float = texpaint_nor" + id + "[uint2(tex_coord * constants.texpaint_size)].a + 1.0 / 255.0;"); + node_shader_write_frag(kong, "var sample_matid_coord: float2 = tex_coord * constants.texpaint_size;"); node_shader_write_frag(kong, "var sample_matid4: float4 = texpaint_nor" + id + "[uint2(uint(sample_matid_coord.x), uint(sample_matid_coord.y))];"); node_shader_write_frag(kong, "var sample_matid: float = sample_matid4.a + 1.0 / 255.0;"); node_shader_write_frag(kong, "var matid_r: float = frac(sin(dot(float2(sample_matid, sample_matid * 20.0), float2(12.9898, 78.233))) * 43758.5453);"); @@ -488,7 +493,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte else if (context_raw.viewport_mode == viewport_mode_t.MASK && (slot_layer_get_masks(context_raw.layer) != null || slot_layer_is_mask(context_raw.layer))) { if (slot_layer_is_mask(context_raw.layer)) { let id: i32 = context_raw.layer.id; - node_shader_write_frag(kong, "var mask_view: float = sample_lod(texpaint" + id + ", sampler_linear, input.tex_coord, 0.0).r;"); + node_shader_write_frag(kong, "var mask_view: float = sample_lod(texpaint" + id + ", sampler_linear, tex_coord, 0.0).r;"); } else { node_shader_write_frag(kong, "var mask_view: float = 0.0;"); @@ -497,7 +502,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (!slot_layer_is_visible(m)) { continue; } - node_shader_write_frag(kong, "var mask_sample" + m.id + ": float = sample_lod(texpaint_view_mask" + m.id + ", sampler_linear, input.tex_coord, 0.0).r;"); + 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 + ")"); node_shader_write_frag(kong, "mask_view = " + mask + ";"); @@ -519,7 +524,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "output[0] = float4(n.xy, roughness, pack_f32_i16(metallic, uint(float(int(matid * 255.0)) % float(3))));"); } - node_shader_write_frag(kong, "output[2] = float4(0.0, 0.0, input.tex_coord.xy);"); + node_shader_write_frag(kong, "output[2] = float4(0.0, 0.0, tex_coord.xy);"); parser_material_finalize(con_mesh); diff --git a/armorpaint/sources/make_mesh_preview.ts b/armorpaint/sources/make_mesh_preview.ts index 36ef08e1..1fd85059 100644 --- a/armorpaint/sources/make_mesh_preview.ts +++ b/armorpaint/sources/make_mesh_preview.ts @@ -58,6 +58,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no let brush_scale: string = sc + ""; node_shader_add_out(kong, "tex_coord: float2"); node_shader_write_attrib_vert(kong, "output.tex_coord = input.tex * float(" + brush_scale + ");"); + node_shader_write_attrib_frag(kong, "var tex_coord: float2 = input.tex_coord;"); let decal: bool = context_raw.decal_preview; parser_material_sample_keep_aspect = decal; @@ -86,7 +87,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no if (decal) { if (context_raw.tool == workspace_tool_t.TEXT) { node_shader_add_texture(kong, "textexttool", "_textexttool"); - node_shader_write_frag(kong, "opacity *= sample_lod(textexttool, sampler_linear, input.tex_coord / float(" + brush_scale + "), 0.0).r;"); + node_shader_write_frag(kong, "opacity *= sample_lod(textexttool, sampler_linear, tex_coord / float(" + brush_scale + "), 0.0).r;"); } } if (decal) { @@ -118,7 +119,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no } else { kong.frag_vvec = true; - node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, input.tex_coord);"); + node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); node_shader_write_frag(kong, "n = nortan * 2.0 - 1.0;"); node_shader_write_frag(kong, "n.y = -n.y;"); node_shader_write_frag(kong, "n = normalize(TBN * n);"); diff --git a/armorpaint/sources/make_node_preview.ts b/armorpaint/sources/make_node_preview.ts index 1cf3e3bd..b07826b6 100644 --- a/armorpaint/sources/make_node_preview.ts +++ b/armorpaint/sources/make_node_preview.ts @@ -37,6 +37,7 @@ function make_node_preview_run(data: material_t, matcon: material_context_t, nod node_shader_add_out(kong, "tex_coord: float2"); node_shader_write_attrib_vert(kong, "output.tex_coord = output.pos.xy * madd + madd;"); node_shader_write_attrib_vert(kong, "output.tex_coord.y = 1.0 - output.tex_coord.y;"); + node_shader_write_attrib_frag(kong, "var tex_coord: float2 = input.tex_coord;"); parser_material_init(); parser_material_canvases = [context_raw.material.canvas]; diff --git a/armorpaint/sources/make_paint.ts b/armorpaint/sources/make_paint.ts index de99dc13..76ce3c71 100644 --- a/armorpaint/sources/make_paint.ts +++ b/armorpaint/sources/make_paint.ts @@ -143,7 +143,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } if (depth_reject) { - node_shader_write_frag(kong, "if (sp.z > sample_lod(gbufferD, sampler_linear, sp.xy, 0.0).r + 0.0005) { discard; }"); + node_shader_write_frag(kong, "if (sp.z > sample_lod(gbufferD, sampler_linear, sp.xy, 0.0).r - 0.00005) { discard; }"); } make_brush_run(kong); @@ -166,7 +166,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } let stencil_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.brush_stencil_image != null; if (stencil_fill) { - node_shader_write_frag(kong, "if (sp.z > sample_lod(gbufferD, sampler_linear, sp.xy, 0.0).r + 0.0005) { discard; }"); + node_shader_write_frag(kong, "if (sp.z > sample_lod(gbufferD, sampler_linear, sp.xy, 0.0).r - 0.00005) { discard; }"); } } @@ -212,7 +212,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad let uv_type: uv_type_t = context_raw.layer.fill_layer != null ? context_raw.layer.uv_type : context_raw.brush_paint; parser_material_triplanar = uv_type == uv_type_t.TRIPLANAR && !decal; parser_material_sample_keep_aspect = decal; - parser_material_sample_uv_scale = "brush_scale"; + parser_material_sample_uv_scale = "constants.brush_scale"; let sout: shader_out_t = parser_material_parse(ui_nodes_get_canvas_material(), con_paint, kong, matcon); parser_material_parse_emission = false; parser_material_parse_subsurface = false; @@ -248,13 +248,13 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad if (context_raw.material.paint_subs) { node_shader_write_frag(kong, "var subs: float = " + subs + ";"); } - if (height != "0.0" && height != "0" && !make_material_height_used) { + if (!make_material_height_used && parse_float(height) != 0.0) { make_material_height_used = true; // Height used for the first time, also rebuild vertex shader return make_paint_run(data, matcon); } - make_material_emis_used = emis != "0.0" && emis != "0"; - make_material_subs_used = subs != "0.0" && subs != "0"; + make_material_emis_used = parse_float(emis) != 0.0; + make_material_subs_used = parse_float(subs) != 0.0; } if (context_raw.brush_mask_image != null && context_raw.tool == workspace_tool_t.DECAL) { @@ -273,18 +273,18 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } if (context_raw.brush_stencil_image != null && ( - context_raw.tool == workspace_tool_t.BRUSH || + context_raw.tool == workspace_tool_t.BRUSH || context_raw.tool == workspace_tool_t.ERASER || context_raw.tool == workspace_tool_t.FILL || - context_raw.tool == workspace_tool_t.CLONE || - context_raw.tool == workspace_tool_t.BLUR || - context_raw.tool == workspace_tool_t.SMUDGE || + context_raw.tool == workspace_tool_t.CLONE || + context_raw.tool == workspace_tool_t.BLUR || + context_raw.tool == workspace_tool_t.SMUDGE || context_raw.tool == workspace_tool_t.PARTICLE || decal)) { node_shader_add_texture(kong, "texbrushstencil", "_texbrushstencil"); node_shader_add_constant(kong, "texbrushstencil_size: float2", "_size(texbrushstencil)"); node_shader_add_constant(kong, "stencil_transform: float4", "_stencil_transform"); - node_shader_write_frag(kong, "var stencil_uv: float2 = float2((sp.xy - constants.stencil_transform.xy) / constants.stencil_transform.z * float2(constants.aspect_ratio, 1.0));"); + node_shader_write_frag(kong, "var stencil_uv: float2 = (sp.xy - constants.stencil_transform.xy) / constants.stencil_transform.z * float2(constants.aspect_ratio, 1.0);"); node_shader_write_frag(kong, "var stencil_size: float2 = constants.texbrushstencil_size;"); node_shader_write_frag(kong, "var stencil_ratio: float = stencil_size.y / stencil_size.x;"); node_shader_write_frag(kong, "stencil_uv -= float2(0.5 / stencil_ratio, 0.5);"); @@ -292,7 +292,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad stencil_uv.x * sin(constants.stencil_transform.w) + stencil_uv.y * cos(constants.stencil_transform.w));"); node_shader_write_frag(kong, "stencil_uv += float2(0.5 / stencil_ratio, 0.5);"); node_shader_write_frag(kong, "stencil_uv.x *= stencil_ratio;"); - node_shader_write_frag(kong, "if (stencil_uv.x < 0 || stencil_uv.x > 1 || stencil_uv.y < 0 || stencil_uv.y > 1) { discard; }"); + node_shader_write_frag(kong, "if (stencil_uv.x < 0.0 || stencil_uv.x > 1.0 || stencil_uv.y < 0.0 || stencil_uv.y > 1.0) { discard; }"); node_shader_write_frag(kong, "var texbrushstencil_sample: float4 = sample_lod(texbrushstencil, sampler_linear, stencil_uv, 0.0);"); if (context_raw.brush_stencil_image_is_alpha) { node_shader_write_frag(kong, "opacity *= texbrushstencil_sample.a;"); @@ -367,16 +367,14 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad if (context_raw.material.paint_emis && make_material_emis_used) { node_shader_write_frag(kong, "if (emis > 0.0) {"); node_shader_write_frag(kong, " matid += 1.0 / 255.0;"); - // node_shader_write_frag(kong, " if (str == 0.0) { discard; }"); + node_shader_write_frag(kong, " if (str == 0.0) { discard; }"); node_shader_write_frag(kong, "}"); - node_shader_write_frag(kong, " if (emis > 0.0 && str == 0.0) { discard; }"); } else if (context_raw.material.paint_subs && make_material_subs_used) { node_shader_write_frag(kong, "if (subs > 0.0) {"); - node_shader_write_frag(kong, " matid += 2.0 / 255.0;"); - // node_shader_write_frag(kong, " if (str == 0.0) { discard; }"); + node_shader_write_frag(kong, " matid += 2.0 / 255.0;"); + node_shader_write_frag(kong, " if (str == 0.0) { discard; }"); node_shader_write_frag(kong, "}"); - node_shader_write_frag(kong, " if (subs > 0.0 && str == 0.0) { discard; }"); } let is_mask: bool = slot_layer_is_mask(context_raw.layer); diff --git a/armorpaint/sources/make_texcoord.ts b/armorpaint/sources/make_texcoord.ts index 9266c1a3..1a107d92 100644 --- a/armorpaint/sources/make_texcoord.ts +++ b/armorpaint/sources/make_texcoord.ts @@ -48,14 +48,11 @@ function make_texcoord_run(kong: node_shader_t) { node_shader_add_constant(kong, "brush_scale_x: float", "_brush_scale_x"); node_shader_write_attrib_frag(kong, "uvsp.x *= constants.brush_scale_x;"); - node_shader_write_attrib_frag(kong, "uvsp += float2(0.5, 0.5);"); - node_shader_write_attrib_frag(kong, "if (uvsp.x < 0.0 || uvsp.y < 0.0 || uvsp.x > 1.0 || uvsp.y > 1.0) { discard; }"); } else { node_shader_write_attrib_frag(kong, "uvsp.x *= constants.aspect_ratio;"); - if (uv_angle != 0.0) { node_shader_add_constant(kong, "brush_angle: float2", "_brush_angle"); node_shader_write_attrib_frag(kong, "uvsp = float2(uvsp.x * constants.brush_angle.x - uvsp.y * constants.brush_angle.y, uvsp.x * constants.brush_angle.y + uvsp.y * constants.brush_angle.x);"); @@ -68,11 +65,11 @@ function make_texcoord_run(kong: node_shader_t) { node_shader_add_constant(kong, "brush_scale: float", "_brush_scale"); node_shader_add_out(kong, "tex_coord: float2"); node_shader_write_vert(kong, "output.tex_coord = input.tex * constants.brush_scale;"); - if (uv_angle > 0.0) { node_shader_add_constant(kong, "brush_angle: float2", "_brush_angle"); node_shader_write_vert(kong, "output.tex_coord = float2(output.tex_coord.x * constants.brush_angle.x - output.tex_coord.y * constants.brush_angle.y, output.tex_coord.x * constants.brush_angle.y + output.tex_coord.y * constants.brush_angle.x);"); } + node_shader_write_attrib_frag(kong, "var tex_coord: float2 = input.tex_coord;"); } else { // TexCoords - triplanar kong.frag_wposition = true; @@ -85,7 +82,6 @@ function make_texcoord_run(kong: node_shader_t) { node_shader_write_attrib_frag(kong, "var tex_coord: float2 = input.wposition.yz * constants.brush_scale * 0.5;"); node_shader_write_attrib_frag(kong, "var tex_coord1: float2 = input.wposition.xz * constants.brush_scale * 0.5;"); node_shader_write_attrib_frag(kong, "var tex_coord2: float2 = input.wposition.xy * constants.brush_scale * 0.5;"); - if (uv_angle != 0.0) { node_shader_add_constant(kong, "brush_angle: float2", "_brush_angle"); node_shader_write_attrib_frag(kong, "tex_coord = float2(tex_coord.x * constants.brush_angle.x - tex_coord.y * constants.brush_angle.y, tex_coord.x * constants.brush_angle.y + tex_coord.y * constants.brush_angle.x);"); diff --git a/armorsculpt/sources/make_brush.ts b/armorsculpt/sources/make_brush.ts index f847bf42..27ebbf1b 100644 --- a/armorsculpt/sources/make_brush.ts +++ b/armorsculpt/sources/make_brush.ts @@ -15,7 +15,7 @@ function make_brush_run(kong: node_shader_t) { node_shader_add_constant(kong, "texpaint_undo_size: float2", "_size(texpaint_undo)"); - node_shader_write_attrib_frag(kong, "var wposition: float3 = (constants.W * texpaint_undo[uint2(input.tex_coord.x * constants.texpaint_undo_size.x, input.tex_coord.y * constants.texpaint_undo_size.y)]).xyz;"); + node_shader_write_attrib_frag(kong, "var wposition: float3 = (constants.W * texpaint_undo[uint2(tex_coord.x * constants.texpaint_undo_size.x, tex_coord.y * constants.texpaint_undo_size.y)]).xyz;"); node_shader_write_frag(kong, "var depthlast: float = sample_lod(gbufferD, sampler_linear, constants.inplast.xy, 0.0).r;"); diff --git a/armorsculpt/sources/make_mesh.ts b/armorsculpt/sources/make_mesh.ts index 3564de8c..e2bfb0cc 100644 --- a/armorsculpt/sources/make_mesh.ts +++ b/armorsculpt/sources/make_mesh.ts @@ -46,6 +46,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_vert(kong, "output.pos = constants.WVP * float4(meshpos.xyz, 1.0);"); node_shader_write_vert(kong, "output.tex_coord = float2(0.0, 0.0);"); + node_shader_write_attrib_frag(kong, "var tex_coord: float2 = input.tex_coord;"); kong.frag_out = "float4[3]"; @@ -192,7 +193,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (!slot_layer_is_visible(m)) continue; node_shader_add_texture(kong, "texpaint" + m.id); 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_liniear, input.tex_coord, 0.0).r;"); + node_shader_write_frag(kong, "var texpaint_mask_sample" + m.id + ": float = sample_lod(texpaint" + m.id + ", sampler_liniear, tex_coord, 0.0).r;"); node_shader_write_frag(kong, "}"); } node_shader_write_frag(kong, "texpaint_opac *= clamp(" + texpaint_mask + ", 0.0, 1.0);"); @@ -214,16 +215,16 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (last_pass && context_raw.draw_texels) { node_shader_add_constant(kong, "texpaint_size: float2", "_texpaint_size"); - node_shader_write_frag(kong, "var texel0: float2 = input.tex_coord * constants.texpaint_size * 0.01;"); - node_shader_write_frag(kong, "var texel1: float2 = input.tex_coord * constants.texpaint_size * 0.1;"); - node_shader_write_frag(kong, "var texel2: float2 = input.tex_coord * constants.texpaint_size;"); + node_shader_write_frag(kong, "var texel0: float2 = tex_coord * constants.texpaint_size * 0.01;"); + node_shader_write_frag(kong, "var texel1: float2 = tex_coord * constants.texpaint_size * 0.1;"); + node_shader_write_frag(kong, "var texel2: float2 = tex_coord * constants.texpaint_size;"); node_shader_write_frag(kong, "basecol *= max(float((int(texel0.x) % 2.0) == (int(texel0.y) % 2.0)), 0.9);"); node_shader_write_frag(kong, "basecol *= max(float((int(texel1.x) % 2.0) == (int(texel1.y) % 2.0)), 0.9);"); node_shader_write_frag(kong, "basecol *= max(float((int(texel2.x) % 2.0) == (int(texel2.y) % 2.0)), 0.9);"); } if (last_pass && context_raw.draw_wireframe) { - node_shader_write_frag(kong, "basecol *= 1.0 - sample_lod(texuvmap, sampler_linear, input.tex_coord, 0.0).r;"); + node_shader_write_frag(kong, "basecol *= 1.0 - sample_lod(texuvmap, sampler_linear, tex_coord, 0.0).r;"); } if (make_material_height_used) { @@ -248,7 +249,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } kong.frag_vvec = true; - node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, input.tex_coord);"); + node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); node_shader_write_frag(kong, "n = ntex * 2.0 - 1.0;"); node_shader_write_frag(kong, "n.y = -n.y;"); node_shader_write_frag(kong, "n = normalize(TBN * n);"); @@ -335,7 +336,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "output[0] = float4(n.xy, roughness, pack_f32_i16(metallic, uint(float(int(matid * 255.0)) % float(3))));"); } - node_shader_write_frag(kong, "output[2] = float4(0.0, 0.0, input.tex_coord.xy);"); + node_shader_write_frag(kong, "output[2] = float4(0.0, 0.0, tex_coord.xy);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; diff --git a/armorsculpt/sources/make_mesh_preview.ts b/armorsculpt/sources/make_mesh_preview.ts index e3cb66c6..14c7a033 100644 --- a/armorsculpt/sources/make_mesh_preview.ts +++ b/armorsculpt/sources/make_mesh_preview.ts @@ -64,6 +64,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no let brush_scale: string = sc + ""; node_shader_add_out(kong, "tex_coord: float2"); node_shader_write_attrib_vert(kong, "output.tex_coord = input.tex * float(" + brush_scale + ");"); + node_shader_write_attrib_frag(kong, "var tex_coord: float2 = input.tex_coord;"); let decal: bool = context_raw.decal_preview; parser_material_sample_keep_aspect = decal; @@ -91,7 +92,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no if (decal) { if (context_raw.tool == workspace_tool_t.TEXT) { node_shader_add_texture(kong, "textexttool", "_textexttool"); - node_shader_write_frag(kong, "opacity *= sample_lod(textexttool, sampler_linear, input.tex_coord / float(" + brush_scale + "), 0.0).r;"); + node_shader_write_frag(kong, "opacity *= sample_lod(textexttool, sampler_linear, tex_coord / float(" + brush_scale + "), 0.0).r;"); } } if (decal) { @@ -123,7 +124,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no } else { kong.frag_vvec = true; - node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, input.tex_coord);"); + node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); node_shader_write_frag(kong, "n = nortan * 2.0 - 1.0;"); node_shader_write_frag(kong, "n.y = -n.y;"); node_shader_write_frag(kong, "n = normalize(TBN * n);"); diff --git a/armorsculpt/sources/make_sculpt.ts b/armorsculpt/sources/make_sculpt.ts index dd39dc20..0043f2f6 100644 --- a/armorsculpt/sources/make_sculpt.ts +++ b/armorsculpt/sources/make_sculpt.ts @@ -37,6 +37,7 @@ function make_sculpt_run(data: material_t, matcon: material_context_t): node_sha node_shader_write_vert(kong, "output.tex_coord = input.pos.xy * madd + madd;"); node_shader_write_vert(kong, "output.tex_coord.y = 1.0 - output.tex_coord.y;"); node_shader_write_vert(kong, "output.pos = float4(input.pos.xy, 0.0, 1.0);"); + node_shader_write_attrib_frag(kong, "var tex_coord: float2 = input.tex_coord;"); node_shader_add_constant(kong, "inp: float4", "_input_brush"); node_shader_add_constant(kong, "inplast: float4", "_input_brush_last"); @@ -68,7 +69,7 @@ function make_sculpt_run(data: material_t, matcon: material_context_t): node_sha node_shader_write_frag(kong, "var str: float = clamp((constants.brush_radius - dist) * constants.brush_hardness * 400.0, 0.0, 1.0) * opacity;"); node_shader_add_texture(kong, "texpaint_undo", "_texpaint_undo"); - node_shader_write_frag(kong, "var sample_undo: float4 = sample_lod(texpaint_undo, sampler_linear, input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "var sample_undo: float4 = sample_lod(texpaint_undo, sampler_linear, tex_coord, 0.0);"); node_shader_write_frag(kong, "if (sample_undo.r == 0 && sample_undo.g == 0 && sample_undo.b == 0) { discard; }"); diff --git a/base/shaders/deferred_light.kong b/base/shaders/deferred_light.kong index 30cb2c9d..98088fd6 100644 --- a/base/shaders/deferred_light.kong +++ b/base/shaders/deferred_light.kong @@ -279,7 +279,6 @@ fun deferred_light_frag(input: vert_out): float4 { // if (matid == uint(1)) { // Emission if (matid == uint(1.0)) { // Emission - //color.rgb += g1.rgb; // materialid color.rgb = color.rgb + g1.rgb; // materialid albedo = float3(0.0, 0.0, 0.0); } diff --git a/base/sources/ts/node_shader.ts b/base/sources/ts/node_shader.ts index 4644258f..c86cb473 100644 --- a/base/sources/ts/node_shader.ts +++ b/base/sources/ts/node_shader.ts @@ -181,7 +181,7 @@ function node_shader_get(raw: node_shader_t): string { s += "\t" + a + ";\n"; } if (raw.consts.length == 0) { - s += "\tempty: float;\n"; + s += "\tempty: float4;\n"; } s += "}\n\n"; @@ -192,7 +192,7 @@ function node_shader_get(raw: node_shader_t): string { s += "\t" + a + ";\n"; } if (raw.consts.length == 0) { - s += "\tempty: float;\n"; + s += "\tempty: float4;\n"; } s += "};\n\n"; diff --git a/base/sources/ts/parser_material.ts b/base/sources/ts/parser_material.ts index b534a8d3..02e3be3c 100644 --- a/base/sources/ts/parser_material.ts +++ b/base/sources/ts/parser_material.ts @@ -27,7 +27,7 @@ let parser_material_nodes: ui_node_t[]; let parser_material_links: ui_node_link_t[]; let parser_material_cotangent_frame_written: bool; -let parser_material_tex_coord: string = "input.tex_coord"; +let parser_material_tex_coord: string = "tex_coord"; let parser_material_eps: f32 = 0.000001; let parser_material_custom_nodes: map_t = map_create(); // JSValue -> (n: ui_node_t, s: string)=>string @@ -504,7 +504,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } else { // Vector node_shader_context_add_elem(parser_material_kong.context, "tex", "short2norm"); // UVMaps only for now - return "float3(input.tex_coord.x, input.tex_coord.y, 0.0)"; + return "float3(tex_coord.x, tex_coord.y, 0.0)"; } } else if (node.type == "VERTEX_COLOR") { @@ -641,7 +641,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) parser_material_write(parser_material_kong, "var " + store + "_rad: float = " + angle + " * (" + pi + " / 180.0);"); parser_material_write(parser_material_kong, "var " + store + "_x: float = cos(" + store + "_rad);"); parser_material_write(parser_material_kong, "var " + store + "_y: float = sin(" + store + "_rad);"); - return "sample(" + tex_name + ", sampler_linear, input.tex_coord + float2(" + store + "_x, " + store + "_y) * " + mask + ").rgb"; + return "sample(" + tex_name + ", sampler_linear, tex_coord + float2(" + store + "_x, " + store + "_y) * " + mask + ").rgb"; } else if (node.type == "BLUR") { if (parser_material_blur_passthrough) { @@ -659,7 +659,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) parser_material_write(parser_material_kong, "var " + store + "_res: float3 = float3(0.0, 0.0, 0.0);"); parser_material_write(parser_material_kong, "for (var i: int = 0; i <= int(" + steps + " * 2.0); i += 1) {"); parser_material_write(parser_material_kong, "for (var j: int = 0; j <= int(" + steps + " * 2.0); j += 1) {"); - parser_material_write(parser_material_kong, store + "_res += sample(" + tex_name + ", sampler_linear, input.tex_coord + float2(float(i) - " + steps + ", float(j) - " + steps + ") / constants." + tex_name + "_size).rgb;"); + parser_material_write(parser_material_kong, store + "_res += sample(" + tex_name + ", sampler_linear, tex_coord + float2(float(i) - " + steps + ", float(j) - " + steps + ") / constants." + tex_name + "_size).rgb;"); parser_material_write(parser_material_kong, "}"); parser_material_write(parser_material_kong, "}"); parser_material_write(parser_material_kong, store + "_res = " + store + "_res / (" + steps + " * 2.0 + 1.0) * (" + steps + " * 2.0 + 1.0);"); @@ -882,11 +882,11 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) let l: any = node.buttons[0].default_value; if (socket == node.outputs[0]) { // Base node_shader_add_texture(parser_material_kong, "texpaint" + l, "_texpaint" + l); - return "sample(texpaint" + l + ", sampler_linear, input.tex_coord).rgb"; + return "sample(texpaint" + l + ", sampler_linear, tex_coord).rgb"; } else if (socket == node.outputs[5]) { // Normal node_shader_add_texture(parser_material_kong, "texpaint_nor" + l, "_texpaint_nor" + l); - return "sample(texpaint_nor" + l + ", sampler_linear, input.tex_coord).rgb"; + return "sample(texpaint_nor" + l + ", sampler_linear, tex_coord).rgb"; } } else if (node.type == "MATERIAL") { @@ -984,7 +984,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } else if (socket == node.outputs[2]) {// UV node_shader_context_add_elem(parser_material_kong.context, "tex", "short2norm"); - return "float3(input.tex_coord.x, input.tex_coord.y, 0.0)"; + return "float3(tex_coord.x, tex_coord.y, 0.0)"; } else if (socket == node.outputs[3]) { // Object parser_material_kong.frag_mposition = true; @@ -1004,7 +1004,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } else if (node.type == "UVMAP") { node_shader_context_add_elem(parser_material_kong.context, "tex", "short2norm"); - return "float3(input.tex_coord.x, input.tex_coord.y, 0.0)"; + return "float3(tex_coord.x, tex_coord.y, 0.0)"; } else if (node.type == "BUMP") { let strength: string = parser_material_parse_value_input(node.inputs[0]); @@ -1209,7 +1209,7 @@ function parse_normal_map_color_input(inp: ui_node_socket_t) { node_shader_add_function(parser_material_kong, str_cotangent_frame); } parser_material_kong.frag_n = true; - parser_material_write(parser_material_kong, "var TBN: float3x3 = cotangent_frame(n, vvec, input.tex_coord);"); + parser_material_write(parser_material_kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); parser_material_write(parser_material_kong, "n = TBN * normalize(texn);"); } @@ -1262,7 +1262,7 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): node_shader_add_texture(parser_material_kong, "texuvmap", "_texuvmap"); // let use_pixel_size: bool = node.buttons[0].default_value == "true"; // let pixel_size: f32 = parse_value_input(node.inputs[0]); - return "sample_lod(texuvmap, sampler_linear, input.tex_coord, 0.0).r"; + return "sample_lod(texuvmap, sampler_linear, tex_coord, 0.0).r"; } else if (node.type == "CAMERA") { if (socket == node.outputs[1]) { // View Z Depth @@ -1280,30 +1280,30 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): let l: any = node.buttons[0].default_value; if (socket == node.outputs[1]) { // Opac node_shader_add_texture(parser_material_kong, "texpaint" + l, "_texpaint" + l); - return "sample(texpaint" + l + ", sampler_linear, input.tex_coord).a"; + return "sample(texpaint" + l + ", sampler_linear, tex_coord).a"; } else if (socket == node.outputs[2]) { // Occ node_shader_add_texture(parser_material_kong, "texpaint_pack" + l, "_texpaint_pack" + l); - return "sample(texpaint_pack" + l + ", sampler_linear, input.tex_coord).r"; + return "sample(texpaint_pack" + l + ", sampler_linear, tex_coord).r"; } else if (socket == node.outputs[3]) { // Rough node_shader_add_texture(parser_material_kong, "texpaint_pack" + l, "_texpaint_pack" + l); - return "sample(texpaint_pack" + l + ", sampler_linear, input.tex_coord).g"; + return "sample(texpaint_pack" + l + ", sampler_linear, tex_coord).g"; } else if (socket == node.outputs[4]) { // Metal node_shader_add_texture(parser_material_kong, "texpaint_pack" + l, "_texpaint_pack" + l); - return "sample(texpaint_pack" + l + ", sampler_linear, input.tex_coord).b"; + return "sample(texpaint_pack" + l + ", sampler_linear, tex_coord).b"; } else if (socket == node.outputs[7]) { // Height node_shader_add_texture(parser_material_kong, "texpaint_pack" + l, "_texpaint_pack" + l); - return "sample(texpaint_pack" + l + ", sampler_linear, input.tex_coord).a"; + return "sample(texpaint_pack" + l + ", sampler_linear, tex_coord).a"; } } else if (node.type == "LAYER_MASK") { if (socket == node.outputs[0]) { let l: any = node.buttons[0].default_value; node_shader_add_texture(parser_material_kong, "texpaint" + l, "_texpaint" + l); - return "sample(texpaint" + l + ", sampler_linear, input.tex_coord).r"; + return "sample(texpaint" + l + ", sampler_linear, tex_coord).r"; } } else if (node.type == "MATERIAL") { @@ -1518,7 +1518,7 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): let tex_name: string = "texbake_" + parser_material_node_name(node); node_shader_add_texture(parser_material_kong, "" + tex_name, "_" + tex_name); let store: string = parser_material_store_var_name(node); - parser_material_write(parser_material_kong, "var " + store + "_res: float = sample(" + tex_name + ", sampler_linear, input.tex_coord).r;"); + parser_material_write(parser_material_kong, "var " + store + "_res: float = sample(" + tex_name + ", sampler_linear, tex_coord).r;"); return store + "_res"; } else if (node.type == "NORMAL") { @@ -1891,9 +1891,9 @@ function parser_material_texture_store(node: ui_node_t, tex: bind_tex_t, tex_nam parser_material_write(parser_material_kong, "var " + tex_store + "_size: float2 = constants." + tex_name + "_size;"); parser_material_write(parser_material_kong, "var " + tex_store + "_ax: float = " + tex_store + "_size.x / " + tex_store + "_size.y;"); parser_material_write(parser_material_kong, "var " + tex_store + "_ay: float = " + tex_store + "_size.y / " + tex_store + "_size.x;"); - parser_material_write(parser_material_kong, "var " + tex_store + "_uv: float2 = ((" + uv_name + ".xy / " + parser_material_sample_uv_scale + " - float2(0.5, 0.5)) * float2(max(" + tex_store + "_ay, 1.0), max(" + tex_store + "_ax, 1.0))) + float2(0.5, 0.5);"); + parser_material_write(parser_material_kong, "var " + tex_store + "_uv: float2 = ((" + uv_name + ".xy / float(" + parser_material_sample_uv_scale + ") - float2(0.5, 0.5)) * float2(max(" + tex_store + "_ay, 1.0), max(" + tex_store + "_ax, 1.0))) + float2(0.5, 0.5);"); parser_material_write(parser_material_kong, "if (" + tex_store + "_uv.x < 0.0 || " + tex_store + "_uv.y < 0.0 || " + tex_store + "_uv.x > 1.0 || " + tex_store + "_uv.y > 1.0) { discard; }"); - parser_material_write(parser_material_kong, "" + tex_store + "_uv *= " + parser_material_sample_uv_scale + ";"); + parser_material_write(parser_material_kong, tex_store + "_uv = " + tex_store + "_uv * float(" + parser_material_sample_uv_scale + ");"); uv_name = tex_store + "_uv"; }