diff --git a/armorlab/sources/make_mesh.ts b/armorlab/sources/make_mesh.ts index 97ab17a2..f9b64898 100644 --- a/armorlab/sources/make_mesh.ts +++ b/armorlab/sources/make_mesh.ts @@ -48,10 +48,10 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_vert(kong, "var height: float = 0.0;"); let num_layers: i32 = 1; let displace_3: string = displace_strength + ", " + displace_strength + ", " + displace_strength; - node_shader_write_vert(kong, "wposition += wnormal * float3(height, height, height) * float3(" + displace_3 + ");"); + node_shader_write_vert(kong, "\wposition += wnormal * float3(height, height, height) * float3(" + displace_3 + ");"); } - node_shader_write_vert(kong, "output.pos = constants.VP * float4(wposition.xyz, 1.0);"); + node_shader_write_vert(kong, "output.pos = constants.VP * float4(\wposition.xyz, 1.0);"); let brush_scale: f32 = context_raw.brush_scale; node_shader_add_constant(kong, "tex_scale: float", "_tex_unpack"); node_shader_write_vert(kong, "output.tex_coord = input.tex * " + brush_scale + " * constants.tex_scale;"); @@ -89,15 +89,15 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } node_shader_add_shared_sampler(kong, "texpaint"); - node_shader_write_frag(kong, "texpaint_sample = sample_lod_shared(texpaint" + ", input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "texpaint_sample = sample_lod(texpaint, shared_sampler, input.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_shared_sampler(kong, "texpaint_nor"); - node_shader_write_frag(kong, "texpaint_nor_sample = sample_lod_shared(texpaint_nor" + ", input.tex_coord, 0.0);"); - node_shader_write_frag(kong, "ntex = lerp(ntex, texpaint_nor_sample.rgb, texpaint_opac);"); + node_shader_write_frag(kong, "texpaint_nor_sample = sample_lod(texpaint_nor, shared_sampler, input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "ntex = lerp3(ntex, texpaint_nor_sample.rgb, texpaint_opac);"); node_shader_add_shared_sampler(kong, "texpaint_pack"); - node_shader_write_frag(kong, "texpaint_pack_sample = sample_lod_shared(texpaint_pack" + ", input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "texpaint_pack_sample = sample_lod(texpaint_pack, shared_sampler, input.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);"); @@ -122,7 +122,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.viewport_mode == viewport_mode_t.LIT || context_raw.viewport_mode == viewport_mode_t.PATH_TRACE) { - node_shader_write_frag(kong, "basecol = pow(basecol, float3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "basecol = pow3(basecol, float3(2.2, 2.2, 2.2));"); if (context_raw.viewport_shader != null) { node_shader_write_frag(kong, "output_color: float3;"); @@ -131,8 +131,8 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } else if (context_raw.render_mode == render_mode_t.FORWARD && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { kong.frag_wposition = true; - node_shader_write_frag(kong, "var albedo: float3 = lerp(basecol, float3(0.0, 0.0, 0.0), metallic);"); - node_shader_write_frag(kong, "var f0: float3 = lerp(float3(0.04, 0.04, 0.04), basecol, metallic);"); + node_shader_write_frag(kong, "var albedo: float3 = lerp3(basecol, float3(0.0, 0.0, 0.0), metallic);"); + node_shader_write_frag(kong, "var f0: float3 = lerp3(float3(0.04, 0.04, 0.04), basecol, metallic);"); kong.frag_vvec = true; node_shader_write_frag(kong, "var dotnv: float = max(0.0, dot(n, vvec));"); node_shader_write_frag(kong, "var env_brdf: float2 = senvmap_brdf[int2(float2(roughness, 1.0 - dotnv) * 256.0)].xy;"); @@ -141,7 +141,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "var wreflect: float3 = reflect(-vvec, n);"); node_shader_write_frag(kong, "var envlod: float = roughness * float(constants.envmap_num_mipmaps);"); node_shader_add_function(frag, str_envmap_equirect); - node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, envmap_equirect(wreflect, constants.envmap_data.x), envlod).rgb;"); + node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, senvmap_radiance_sampler, envmap_equirect(wreflect, constants.envmap_data.x), envlod).rgb;"); // node_shader_add_constant(kong, "shirr: float4[7]", "_envmap_irradiance"); node_shader_add_constant(kong, "shirr0: float4", "_envmap_irradiance0"); node_shader_add_constant(kong, "shirr1: float4", "_envmap_irradiance1"); @@ -186,7 +186,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (context_raw.viewport_mode != viewport_mode_t.LIT && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { - node_shader_write_frag(kong, "output[1].rgb = pow(output[1].rgb, float3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "output[1].rgb = pow3(output[1].rgb, float3(2.2, 2.2, 2.2));"); } node_shader_write_frag(kong, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); diff --git a/armorlab/sources/make_paint.ts b/armorlab/sources/make_paint.ts index db422070..b9409a4d 100644 --- a/armorlab/sources/make_paint.ts +++ b/armorlab/sources/make_paint.ts @@ -54,9 +54,9 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_add_texture(kong, "texpaint"); node_shader_add_texture(kong, "texpaint_nor"); node_shader_add_texture(kong, "texpaint_pack"); - node_shader_write_frag(kong, "output[0].rgba = sample_lod(texpaint, tex_coord_inp, 0.0);"); - node_shader_write_frag(kong, "output[1].rgba = sample_lod(texpaint_nor, tex_coord_inp, 0.0);"); - node_shader_write_frag(kong, "output[2].rgba = sample_lod(texpaint_pack, tex_coord_inp, 0.0);"); + node_shader_write_frag(kong, "output[0].rgba = sample_lod(texpaint, texpaint_sampler, tex_coord_inp, 0.0);"); + node_shader_write_frag(kong, "output[1].rgba = sample_lod(texpaint_nor, texpaint_nor_sampler, tex_coord_inp, 0.0);"); + node_shader_write_frag(kong, "output[2].rgba = sample_lod(texpaint_pack, texpaint_pack_sampler, tex_coord_inp, 0.0);"); node_shader_write_frag(kong, "output[3].rg = tex_coord_inp.xy;"); con_paint.data.shader_from_source = true; gpu_create_shaders_from_kong(node_shader_get(kong), ADDRESS(con_paint.data.vertex_shader), ADDRESS(con_paint.data.fragment_shader)); @@ -98,7 +98,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write_frag(kong, "var dist: float = 0.0;"); - node_shader_write_frag(kong, "var depth: float = sample_lod(gbufferD, constants.inp.xy, 0.0).r;"); + node_shader_write_frag(kong, "var depth: float = sample_lod(gbufferD, gbufferD_sampler, constants.inp.xy, 0.0).r;"); node_shader_add_constant(kong, "invVP: float4x4", "_inv_view_proj_matrix"); node_shader_write_frag(kong, "var winp: float4 = float4(float2(constants.inp.x, 1.0 - constants.inp.y) * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);"); @@ -106,13 +106,13 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write_frag(kong, "winp.xyz /= winp.w;"); kong.frag_wposition = true; - node_shader_write_frag(kong, "var depthlast: float = sample_lod(gbufferD, constants.inplast.xy, 0.0).r;"); + node_shader_write_frag(kong, "var depthlast: float = sample_lod(gbufferD, gbufferD_sampler, constants.inplast.xy, 0.0).r;"); node_shader_write_frag(kong, "var winplast: float4 = float4(float2(constants.inplast.x, 1.0 - constants.inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);"); node_shader_write_frag(kong, "winplast = constants.invVP * winplast;"); node_shader_write_frag(kong, "winplast.xyz /= winplast.w;"); - node_shader_write_frag(kong, "var pa: float3 = wposition - winp.xyz;"); + node_shader_write_frag(kong, "var pa: float3 = input.wposition - winp.xyz;"); node_shader_write_frag(kong, "var ba: float3 = winplast.xyz - winp.xyz;"); // Capsule @@ -142,14 +142,14 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad // Manual blending to preserve memory kong.frag_wvpposition = true; - node_shader_write_frag(kong, "var sample_tc: float2 = float2(wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); + node_shader_write_frag(kong, "var sample_tc: float2 = float2(input.wvpposition.xy / input.wvpposition.w) * 0.5 + 0.5;"); node_shader_write_frag(kong, "sample_tc.y = 1.0 - sample_tc.y;"); node_shader_add_texture(kong, "paintmask"); - node_shader_write_frag(kong, "var sample_mask: float = sample_lod(paintmask, sample_tc, 0.0).r;"); + node_shader_write_frag(kong, "var sample_mask: float = sample_lod(paintmask, paintmask_sampler, sample_tc, 0.0).r;"); node_shader_write_frag(kong, "str = max(str, sample_mask);"); node_shader_add_texture(kong, "texpaint_undo", "_texpaint_undo"); - node_shader_write_frag(kong, "var sample_undo: float4 = sample_lod(texpaint_undo, sample_tc, 0.0);"); + node_shader_write_frag(kong, "var sample_undo: float4 = sample_lod(texpaint_undo, texpaint_undo_sampler, sample_tc, 0.0);"); if (context_raw.tool == workspace_tool_t.ERASER) { node_shader_write_frag(kong, "output[0].rgba = float4(0.0, 0.0, 0.0, 0.0);"); diff --git a/armorpaint/sources/make_bake.ts b/armorpaint/sources/make_bake.ts index 545a0b87..bb6616f8 100644 --- a/armorpaint/sources/make_bake.ts +++ b/armorpaint/sources/make_bake.ts @@ -22,7 +22,7 @@ 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, 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, texpaint_undo_sampler, input.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));"); @@ -39,22 +39,22 @@ 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, 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 res: float = distance(wpos0, wposition) * 10.0;"); + node_shader_write_frag(kong, "var wpos0: float3 = sample_lod(texpaint_undo, texpaint_undo_sampler, 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 res: float = distance(wpos0, input.wposition) * 10.0;"); node_shader_write_frag(kong, "output[0].rgba = 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, input.tex_coord, 0.0).r * 100;"); - node_shader_write_frag(kong, "var h1: float = sample_lod(texpaint_undo, input.tex_coord + tex_dx, 0.0).r * 100;"); - node_shader_write_frag(kong, "var h2: float = sample_lod(texpaint_undo, input.tex_coord + tex_dy, 0.0).r * 100;"); + node_shader_write_frag(kong, "var h0: float = sample_lod(texpaint_undo, texpaint_undo_sampler, input.tex_coord, 0.0).r * 100;"); + node_shader_write_frag(kong, "var h1: float = sample_lod(texpaint_undo, texpaint_undo_sampler, input.tex_coord + tex_dx, 0.0).r * 100;"); + node_shader_write_frag(kong, "var h2: float = sample_lod(texpaint_undo, texpaint_undo_sampler, input.tex_coord + tex_dy, 0.0).r * 100;"); node_shader_write_frag(kong, "output[0].rgba = 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) { kong.frag_wposition = true; - node_shader_write_frag(kong, "output[0].rgba = float4(wposition * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5), 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(input.wposition * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5), 1.0);"); if (context_raw.bake_up_axis == bake_up_axis_t.Y) { node_shader_write_frag(kong, "output[0].rgb = float3(output[0].r, output[0].b, 1.0 - output[0].g);"); } @@ -64,7 +64,7 @@ function make_bake_run(con: node_shader_context_t, kong: node_shader_t) { } 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, input.tex_coord, 0.0).a + 1.0 / 255.0;"); + node_shader_write_frag(kong, "var sample_matid: float = sample_lod(texpaint_nor_undo, texpaint_nor_undo_sampler, input.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_blur.ts b/armorpaint/sources/make_blur.ts index 42f3fbe5..bf4f35b6 100644 --- a/armorpaint/sources/make_blur.ts +++ b/armorpaint/sources/make_blur.ts @@ -31,34 +31,34 @@ function make_blur_run(kong: node_shader_t) { node_shader_write_frag(kong, "var blur_direction: float2 = constants.brush_direction.yx;"); node_shader_write_frag(kong, "for (var i: int = 0; i < 7; i += 1) {"); node_shader_write_frag(kong, "var tex_coord_inp2: float2 = gbuffer2[int2((sp.x + blur_direction.x * blur_step * float(i)) * constants.gbuffer_size.x, (sp.y + blur_direction.y * blur_step * float(i)) * constants.gbuffer_size.y)].ba;"); - node_shader_write_frag(kong, "var texpaint_sample: float4 = sample(texpaint_undo, tex_coord_inp2);"); + node_shader_write_frag(kong, "var texpaint_sample: float4 = sample(texpaint_undo, texpaint_undo_sampler, tex_coord_inp2);"); node_shader_write_frag(kong, "opacity += texpaint_sample.a * blur_weight[i];"); node_shader_write_frag(kong, "basecol += texpaint_sample.rgb * blur_weight[i];"); - node_shader_write_frag(kong, "var texpaint_pack_sample: float4 = sample(texpaint_pack_undo, tex_coord_inp2) * blur_weight[i];"); + node_shader_write_frag(kong, "var texpaint_pack_sample: float4 = sample(texpaint_pack_undo, texpaint_pack_undo_sampler, tex_coord_inp2) * blur_weight[i];"); node_shader_write_frag(kong, "roughness += texpaint_pack_sample.g;"); node_shader_write_frag(kong, "metallic += texpaint_pack_sample.b;"); node_shader_write_frag(kong, "occlusion += texpaint_pack_sample.r;"); node_shader_write_frag(kong, "height += texpaint_pack_sample.a;"); - node_shader_write_frag(kong, "nortan += sample(texpaint_nor_undo, tex_coord_inp2).rgb * blur_weight[i];"); + node_shader_write_frag(kong, "nortan += sample(texpaint_nor_undo, texpaint_nor_undo_sampler, tex_coord_inp2).rgb * blur_weight[i];"); node_shader_write_frag(kong, "}"); } else { node_shader_write_frag(kong, "const blur_weight: float[15] = {0.034619 / 2.0, 0.044859 / 2.0, 0.055857 / 2.0, 0.066833 / 2.0, 0.076841 / 2.0, 0.084894 / 2.0, 0.090126 / 2.0, 0.09194 / 2.0, 0.090126 / 2.0, 0.084894 / 2.0, 0.076841 / 2.0, 0.066833 / 2.0, 0.055857 / 2.0, 0.044859 / 2.0, 0.034619 / 2.0};"); // X node_shader_write_frag(kong, "for (var i: int = -7; i <= 7; i += 1) {"); - node_shader_write_frag(kong, "var texpaint_sample: float4 = sample(texpaint_undo, tex_coord_inp + float2(blur_step * float(i), 0.0));"); + node_shader_write_frag(kong, "var texpaint_sample: float4 = sample(texpaint_undo, texpaint_undo_sampler, tex_coord_inp + float2(blur_step * float(i), 0.0));"); node_shader_write_frag(kong, "opacity += texpaint_sample.a * blur_weight[i + 7];"); node_shader_write_frag(kong, "basecol += texpaint_sample.rgb * blur_weight[i + 7];"); - node_shader_write_frag(kong, "var texpaint_pack_sample: float4 = sample(texpaint_pack_undo, tex_coord_inp + float2(blur_step * float(i), 0.0)) * blur_weight[i + 7];"); + node_shader_write_frag(kong, "var texpaint_pack_sample: float4 = sample(texpaint_pack_undo, texpaint_pack_undo_sampler, tex_coord_inp + float2(blur_step * float(i), 0.0)) * blur_weight[i + 7];"); node_shader_write_frag(kong, "roughness += texpaint_pack_sample.g;"); node_shader_write_frag(kong, "metallic += texpaint_pack_sample.b;"); node_shader_write_frag(kong, "occlusion += texpaint_pack_sample.r;"); node_shader_write_frag(kong, "height += texpaint_pack_sample.a;"); - node_shader_write_frag(kong, "nortan += sample(texpaint_nor_undo, tex_coord_inp + float2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];"); + node_shader_write_frag(kong, "nortan += sample(texpaint_nor_undo, texpaint_nor_undo_sampler, tex_coord_inp + float2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];"); node_shader_write_frag(kong, "}"); // Y node_shader_write_frag(kong, "for (var j: int = -7; j <= 7; j += 1) {"); - node_shader_write_frag(kong, "var texpaint_sample: float4 = sample(texpaint_undo, tex_coord_inp + float2(0.0, blur_step * float(j)));"); + node_shader_write_frag(kong, "var texpaint_sample: float4 = sample(texpaint_undo, texpaint_undo_sampler, tex_coord_inp + float2(0.0, blur_step * float(j)));"); node_shader_write_frag(kong, "opacity += texpaint_sample.a * blur_weight[j + 7];"); node_shader_write_frag(kong, "basecol += texpaint_sample.rgb * blur_weight[j + 7];"); node_shader_write_frag(kong, "var texpaint_pack_sample: float4 = texture(texpaint_pack_undo, tex_coord_inp + float2(0.0, blur_step * float(j))) * blur_weight[j + 7];"); diff --git a/armorpaint/sources/make_brush.ts b/armorpaint/sources/make_brush.ts index 8e39953c..433ff1b6 100644 --- a/armorpaint/sources/make_brush.ts +++ b/armorpaint/sources/make_brush.ts @@ -14,7 +14,7 @@ function make_brush_run(kong: node_shader_t) { } if (config_raw.brush_3d) { - node_shader_write_frag(kong, "var depth: float = sample_lod(gbufferD, constants.inp.xy, 0.0).r;"); + node_shader_write_frag(kong, "var depth: float = sample_lod(gbufferD, gbufferD_sampler, constants.inp.xy, 0.0).r;"); node_shader_add_constant(kong, "invVP: float4x4", "_inv_view_proj_matrix"); node_shader_write_frag(kong, "var winp: float4 = float4(float2(constants.inp.x, 1.0 - constants.inp.y) * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);"); @@ -25,13 +25,13 @@ function make_brush_run(kong: node_shader_t) { if (config_raw.brush_angle_reject || context_raw.xray) { node_shader_add_function(kong, str_octahedron_wrap); node_shader_add_texture(kong, "gbuffer0"); - node_shader_write_frag(kong, "var g0: float2 = sample_lod(gbuffer0, constants.inp.xy, 0.0).rg;"); + node_shader_write_frag(kong, "var g0: float2 = sample_lod(gbuffer0, gbuffer0_sampler, constants.inp.xy, 0.0).rg;"); node_shader_write_frag(kong, "var wn: float3;"); node_shader_write_frag(kong, "wn.z = 1.0 - abs(g0.x) - abs(g0.y);"); // node_shader_write_frag(kong, "wn.xy = wn.z >= 0.0 ? g0.xy : octahedron_wrap(g0.xy);"); node_shader_write_frag(kong, "if (wn.z >= 0.0) { wn.xy = g0.xy; } else { wn.xy = octahedron_wrap(g0.xy); }"); node_shader_write_frag(kong, "wn = normalize(wn);"); - node_shader_write_frag(kong, "var plane_dist: float = dot(wn, winp.xyz - wposition);"); + node_shader_write_frag(kong, "var plane_dist: float = dot(wn, winp.xyz - input.wposition);"); if (config_raw.brush_angle_reject && !context_raw.xray) { node_shader_write_frag(kong, "if (plane_dist < -0.01) { discard; }"); @@ -41,13 +41,13 @@ function make_brush_run(kong: node_shader_t) { } } - node_shader_write_frag(kong, "var depthlast: float = sample_lod(gbufferD, inplast.xy, 0.0).r;"); + node_shader_write_frag(kong, "var depthlast: float = sample_lod(gbufferD, gbufferD_sampler, constants.inplast.xy, 0.0).r;"); - node_shader_write_frag(kong, "var winplast: float4 = float4(float2(inplast.x, 1.0 - inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);"); + node_shader_write_frag(kong, "var winplast: float4 = float4(float2(constants.inplast.x, 1.0 - constants.inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);"); node_shader_write_frag(kong, "winplast = constants.invVP * winplast;"); node_shader_write_frag(kong, "winplast.xyz /= winplast.w;"); - node_shader_write_frag(kong, "var pa: float3 = wposition - winp.xyz;"); + node_shader_write_frag(kong, "var pa: float3 = input.wposition - winp.xyz;"); if (context_raw.xray) { node_shader_write_frag(kong, "pa += wn * float3(plane_dist, plane_dist, plane_dist);"); } @@ -55,7 +55,7 @@ function make_brush_run(kong: node_shader_t) { if (context_raw.brush_lazy_radius > 0 && context_raw.brush_lazy_step > 0) { // Sphere - node_shader_write_frag(kong, "dist = distance(wposition, winp.xyz);"); + node_shader_write_frag(kong, "dist = distance(input.wposition, winp.xyz);"); } else { // Capsule @@ -68,7 +68,7 @@ function make_brush_run(kong: node_shader_t) { node_shader_write_frag(kong, "binp.x *= constants.aspect_ratio;"); node_shader_write_frag(kong, "binp = binp * 0.5 + 0.5;"); - node_shader_write_frag(kong, "var binplast: float2 = inplast.xy * 2.0 - 1.0;"); + node_shader_write_frag(kong, "var binplast: float2 = constants.inplast.xy * 2.0 - 1.0;"); node_shader_write_frag(kong, "binplast.x *= constants.aspect_ratio;"); node_shader_write_frag(kong, "binplast = binplast * 0.5 + 0.5;"); @@ -78,7 +78,7 @@ function make_brush_run(kong: node_shader_t) { node_shader_write_frag(kong, "dist = length(pa - ba * h);"); } - node_shader_write_frag(kong, "if (dist > brush_radius) { discard; }"); + node_shader_write_frag(kong, "if (dist > constants.brush_radius) { discard; }"); if (decal && !fill_layer) { node_shader_write_frag(kong, "}"); diff --git a/armorpaint/sources/make_clone.ts b/armorpaint/sources/make_clone.ts index 022d57b8..0f3ed43e 100644 --- a/armorpaint/sources/make_clone.ts +++ b/armorpaint/sources/make_clone.ts @@ -3,12 +3,12 @@ function make_clone_run(kong: node_shader_t) { node_shader_add_constant(kong, "clone_delta: float2", "_clone_delta"); node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[int2((sp.xy + constants.clone_delta) * gbuffer_size)].ba;"); - node_shader_write_frag(kong, "var texpaint_pack_sample: float3 = sample_lod(texpaint_pack_undo, tex_coord_inp, 0.0).rgb;"); - let base: string = "sample_lod(texpaint_undo, tex_coord_inp, 0.0).rgb"; + node_shader_write_frag(kong, "var texpaint_pack_sample: float3 = sample_lod(texpaint_pack_undo, texpaint_pack_undo_sampler, tex_coord_inp, 0.0).rgb;"); + let base: string = "sample_lod(texpaint_undo, texpaint_undo_sampler, tex_coord_inp, 0.0).rgb"; let rough: string = "texpaint_pack_sample.g"; let met: string = "texpaint_pack_sample.b"; let occ: string = "texpaint_pack_sample.r"; - let nortan: string = "sample_lod(texpaint_nor_undo, tex_coord_inp, 0.0).rgb"; + let nortan: string = "sample_lod(texpaint_nor_undo, texpaint_nor_undo_sampler, tex_coord_inp, 0.0).rgb"; let height: string = "0.0"; let opac: string = "1.0"; node_shader_write_frag(kong, "var basecol: float3 = " + base + ";"); diff --git a/armorpaint/sources/make_colorid_picker.ts b/armorpaint/sources/make_colorid_picker.ts index 05799d0e..d4851f47 100644 --- a/armorpaint/sources/make_colorid_picker.ts +++ b/armorpaint/sources/make_colorid_picker.ts @@ -12,7 +12,7 @@ function make_colorid_picker_run(kong: node_shader_t) { if (context_raw.tool == workspace_tool_t.COLORID) { kong.frag_out = "float4"; node_shader_add_texture(kong, "texcolorid", "_texcolorid"); - node_shader_write_frag(kong, "var idcol: float3 = sample_lod(texcolorid, tex_coord_inp, 0.0).rgb;"); + node_shader_write_frag(kong, "var idcol: float3 = sample_lod(texcolorid, texcolorid_sampler, tex_coord_inp, 0.0).rgb;"); node_shader_write_frag(kong, "output = float4(idcol, 1.0);"); } else if (context_raw.tool == workspace_tool_t.PICKER || context_raw.tool == workspace_tool_t.MATERIAL) { @@ -21,17 +21,17 @@ function make_colorid_picker_run(kong: node_shader_t) { node_shader_add_texture(kong, "gbufferD"); node_shader_add_constant(kong, "invVP: float4x4", "_inv_view_proj_matrix"); node_shader_add_function(kong, str_get_pos_nor_from_depth); - node_shader_write_frag(kong, "output[0].rgba = float4(get_pos_from_depth(float2(constants.inp.x, 1.0 - constants.inp.y), constants.invVP, texturePass(gbufferD)), tex_coord_inp.x);"); - node_shader_write_frag(kong, "output[1].rgba = float4(get_nor_from_depth(output[0].rgb, float2(constants.inp.x, 1.0 - constants.inp.y), constants.invVP, float2(1.0, 1.0) / constants.gbuffer_size, texturePass(gbufferD)), tex_coord_inp.y);"); + node_shader_write_frag(kong, "output[0].rgba = float4(get_pos_from_depth(float2(constants.inp.x, 1.0 - constants.inp.y), constants.invVP), tex_coord_inp.x);"); + node_shader_write_frag(kong, "output[1].rgba = float4(get_nor_from_depth(output[0].rgb, float2(constants.inp.x, 1.0 - constants.inp.y), constants.invVP, float2(1.0, 1.0) / constants.gbuffer_size), tex_coord_inp.y);"); } else { kong.frag_out = "float4[4]"; node_shader_add_texture(kong, "texpaint"); node_shader_add_texture(kong, "texpaint_nor"); node_shader_add_texture(kong, "texpaint_pack"); - node_shader_write_frag(kong, "output[0].rgba = sample_lod(texpaint, tex_coord_inp, 0.0);"); - node_shader_write_frag(kong, "output[1].rgba = sample_lod(texpaint_nor, tex_coord_inp, 0.0);"); - node_shader_write_frag(kong, "output[2].rgba = sample_lod(texpaint_pack, tex_coord_inp, 0.0);"); + node_shader_write_frag(kong, "output[0].rgba = sample_lod(texpaint, texpaint_sampler, tex_coord_inp, 0.0);"); + node_shader_write_frag(kong, "output[1].rgba = sample_lod(texpaint_nor, texpaint_nor_sampler, tex_coord_inp, 0.0);"); + node_shader_write_frag(kong, "output[2].rgba = sample_lod(texpaint_pack, texpaint_pack_sampler, tex_coord_inp, 0.0);"); node_shader_write_frag(kong, "output[3].rg = tex_coord_inp.xy;"); } } diff --git a/armorpaint/sources/make_discard.ts b/armorpaint/sources/make_discard.ts index d21658eb..6ba9e448 100644 --- a/armorpaint/sources/make_discard.ts +++ b/armorpaint/sources/make_discard.ts @@ -3,7 +3,7 @@ function make_discard_color_id(kong: node_shader_t) { node_shader_add_texture(kong, "texpaint_colorid"); // 1x1 picker node_shader_add_texture(kong, "texcolorid", "_texcolorid"); // color map node_shader_write_frag(kong, "var colorid_c1: float3 = texpaint_colorid[int2(0, 0)].rgb;"); - node_shader_write_frag(kong, "var colorid_c2: float3 = sample_lod(texcolorid, tex_coord_pick, 0).rgb;"); + node_shader_write_frag(kong, "var colorid_c2: float3 = sample_lod(texcolorid, texcolorid_sampler, tex_coord_pick, 0).rgb;"); // node_shader_write_frag(kong, "if (any(colorid_c1 != colorid_c2)) { discard };"); node_shader_write_frag(kong, "if (colorid_c1 != colorid_c2) { discard; }"); } @@ -15,21 +15,21 @@ function make_discard_face(kong: node_shader_t) { node_shader_add_constant(kong, "gbuffer_size: float2", "_gbuffer_size"); node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[int2(inp.x * constants.gbuffer_size.x, inp.y * constants.gbuffer_size.y)].ba;"); node_shader_write_frag(kong, "var face_c1: float4 = textrianglemap[int2(tex_coord_inp * constants.textrianglemap_size)];"); - node_shader_write_frag(kong, "var face_c2: float4 = sample_lod(textrianglemap, tex_coord_pick, 0.0);"); + node_shader_write_frag(kong, "var face_c2: float4 = sample_lod(textrianglemap, textrianglemap_sampler, tex_coord_pick, 0.0);"); // node_shader_write_frag(kong, "if (any(face_c1 != face_c2)) { discard; }"); node_shader_write_frag(kong, "if (face_c1 != face_c2) { discard; }"); } function make_discard_uv_island(kong: node_shader_t) { node_shader_add_texture(kong, "texuvislandmap", "_texuvislandmap"); - node_shader_write_frag(kong, "if (sample_lod(texuvislandmap, tex_coord_pick, 0.0).r == 0.0) { discard; }"); + node_shader_write_frag(kong, "if (sample_lod(texuvislandmap, texuvislandmap_sampler, tex_coord_pick, 0.0).r == 0.0) { discard; }"); } function make_discard_material_id(kong: node_shader_t) { kong.frag_wvpposition = true; - node_shader_write_frag(kong, "var picker_sample_tc: float2 = float2(wvpposition.x / wvpposition.w, wvpposition.y / wvpposition.w) * 0.5 + 0.5;"); + node_shader_write_frag(kong, "var picker_sample_tc: float2 = float2(input.wvpposition.x / input.wvpposition.w, input.wvpposition.y / input.wvpposition.w) * 0.5 + 0.5;"); node_shader_write_frag(kong, "picker_sample_tc.y = 1.0 - picker_sample_tc.y;"); node_shader_add_texture(kong, "texpaint_nor_undo", "_texpaint_nor_undo"); let matid: i32 = context_raw.materialid_picked / 255; - node_shader_write_frag(kong, "if (" + matid + " != sample_lod(texpaint_nor_undo, picker_sample_tc, 0.0).a) { discard; }"); + node_shader_write_frag(kong, "if (" + matid + " != sample_lod(texpaint_nor_undo, texpaint_nor_undo_sampler, picker_sample_tc, 0.0).a) { discard; }"); } diff --git a/armorpaint/sources/make_material.ts b/armorpaint/sources/make_material.ts index 2bf16e43..228324cd 100644 --- a/armorpaint/sources/make_material.ts +++ b/armorpaint/sources/make_material.ts @@ -415,31 +415,31 @@ function make_material_parse_brush() { function make_material_blend_mode(kong: node_shader_t, blending: i32, cola: string, colb: string, opac: string): string { if (blending == blend_type_t.MIX) { - return "lerp(" + cola + ", " + colb + ", " + opac + ")"; + return "lerp3(" + cola + ", " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.DARKEN) { - return "lerp(" + cola + ", min(" + cola + ", " + colb + "), " + opac + ")"; + return "lerp3(" + cola + ", min3(" + cola + ", " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.MULTIPLY) { - return "lerp(" + cola + ", " + cola + " * " + colb + ", " + opac + ")"; + return "lerp3(" + cola + ", " + cola + " * " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.BURN) { - return "lerp(" + cola + ", float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - " + cola + ") / " + colb + ", " + opac + ")"; + return "lerp3(" + cola + ", float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - " + cola + ") / " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.LIGHTEN) { - return "max(" + cola + ", " + colb + " * " + opac + ")"; + return "max3(" + cola + ", " + colb + " * " + opac + ")"; } else if (blending == blend_type_t.SCREEN) { return "(float3(1.0, 1.0, 1.0) - (float3(1.0 - " + opac + ", 1.0 - " + opac + ", 1.0 - " + opac + ") + " + opac + " * (float3(1.0, 1.0, 1.0) - " + colb + ")) * (float3(1.0, 1.0, 1.0) - " + cola + "))"; } else if (blending == blend_type_t.DODGE) { - return "lerp(" + cola + ", " + cola + " / (float3(1.0, 1.0, 1.0) - " + colb + "), " + opac + ")"; + return "lerp3(" + cola + ", " + cola + " / (float3(1.0, 1.0, 1.0) - " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.ADD) { - return "lerp(" + cola + ", " + cola + " + " + colb + ", " + opac + ")"; + return "lerp3(" + cola + ", " + cola + " + " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.OVERLAY) { - return "lerp(" + cola + ", float3( \ + 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) \ @@ -452,59 +452,59 @@ function make_material_blend_mode(kong: node_shader_t, blending: i32, cola: stri return "(" + cola + " + " + opac + " * (float3(2.0, 2.0, 2.0) * (" + colb + " - float3(0.5, 0.5, 0.5))))"; } else if (blending == blend_type_t.DIFFERENCE) { - return "lerp(" + cola + ", abs(" + cola + " - " + colb + "), " + opac + ")"; + return "lerp3(" + cola + ", abs3(" + cola + " - " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.SUBTRACT) { - return "lerp(" + cola + ", " + cola + " - " + colb + ", " + opac + ")"; + return "lerp3(" + cola + ", " + cola + " - " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.DIVIDE) { return "float3(1.0 - " + opac + ", 1.0 - " + opac + ", 1.0 - " + opac + ") * " + cola + " + float3(" + opac + ", " + opac + ", " + opac + ") * " + cola + " / " + colb + ""; } else if (blending == blend_type_t.HUE) { node_shader_add_function(kong, str_hue_sat); - return "lerp(" + cola + ", hsv_to_rgb(float3(rgb_to_hsv(" + colb + ").r, rgb_to_hsv(" + cola + ").g, rgb_to_hsv(" + cola + ").b)), " + opac + ")"; + return "lerp3(" + cola + ", hsv_to_rgb(float3(rgb_to_hsv(" + colb + ").r, rgb_to_hsv(" + cola + ").g, rgb_to_hsv(" + cola + ").b)), " + opac + ")"; } else if (blending == blend_type_t.SATURATION) { node_shader_add_function(kong, str_hue_sat); - return "lerp(" + cola + ", hsv_to_rgb(float3(rgb_to_hsv(" + cola + ").r, rgb_to_hsv(" + colb + ").g, rgb_to_hsv(" + cola + ").b)), " + opac + ")"; + return "lerp3(" + cola + ", hsv_to_rgb(float3(rgb_to_hsv(" + cola + ").r, rgb_to_hsv(" + colb + ").g, rgb_to_hsv(" + cola + ").b)), " + opac + ")"; } else if (blending == blend_type_t.COLOR) { node_shader_add_function(kong, str_hue_sat); - return "lerp(" + cola + ", hsv_to_rgb(float3(rgb_to_hsv(" + colb + ").r, rgb_to_hsv(" + colb + ").g, rgb_to_hsv(" + cola + ").b)), " + opac + ")"; + return "lerp3(" + cola + ", hsv_to_rgb(float3(rgb_to_hsv(" + colb + ").r, rgb_to_hsv(" + colb + ").g, rgb_to_hsv(" + cola + ").b)), " + opac + ")"; } else { // BlendValue node_shader_add_function(kong, str_hue_sat); - return "lerp(" + cola + ", hsv_to_rgb(float3(rgb_to_hsv(" + cola + ").r, rgb_to_hsv(" + cola + ").g, rgb_to_hsv(" + colb + ").b)), " + opac + ")"; + return "lerp3(" + cola + ", hsv_to_rgb(float3(rgb_to_hsv(" + cola + ").r, rgb_to_hsv(" + cola + ").g, rgb_to_hsv(" + colb + ").b)), " + opac + ")"; } } function make_material_blend_mode_mask(blending: i32, cola: string, colb: string, opac: string): string { if (blending == blend_type_t.MIX) { - return "lerp(" + cola + ", " + colb + ", " + opac + ")"; + return "lerp3(" + cola + ", " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.DARKEN) { - return "lerp(" + cola + ", min(" + cola + ", " + colb + "), " + opac + ")"; + return "lerp3(" + cola + ", min3(" + cola + ", " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.MULTIPLY) { - return "lerp(" + cola + ", " + cola + " * " + colb + ", " + opac + ")"; + return "lerp3(" + cola + ", " + cola + " * " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.BURN) { - return "lerp(" + cola + ", 1.0 - (1.0 - " + cola + ") / " + colb + ", " + opac + ")"; + return "lerp3(" + cola + ", 1.0 - (1.0 - " + cola + ") / " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.LIGHTEN) { - return "max(" + cola + ", " + colb + " * " + opac + ")"; + return "max3(" + cola + ", " + colb + " * " + opac + ")"; } else if (blending == blend_type_t.SCREEN) { return "(1.0 - ((1.0 - " + opac + ") + " + opac + " * (1.0 - " + colb + ")) * (1.0 - " + cola + "))"; } else if (blending == blend_type_t.DODGE) { - return "lerp(" + cola + ", " + cola + " / (1.0 - " + colb + "), " + opac + ")"; + return "lerp3(" + cola + ", " + cola + " / (1.0 - " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.ADD) { - return "lerp(" + cola + ", " + cola + " + " + colb + ", " + opac + ")"; + return "lerp3(" + 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 "lerp3(" + cola + ", " + cola + " < 0.5 ? 2.0 * " + cola + " * " + colb + " : 1.0 - 2.0 * (1.0 - " + cola + ") * (1.0 - " + colb + "), " + 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 + "))))"; @@ -513,16 +513,16 @@ function make_material_blend_mode_mask(blending: i32, cola: string, colb: string return "(" + cola + " + " + opac + " * (2.0 * (" + colb + " - 0.5)))"; } else if (blending == blend_type_t.DIFFERENCE) { - return "lerp(" + cola + ", abs(" + cola + " - " + colb + "), " + opac + ")"; + return "lerp3(" + cola + ", abs3(" + cola + " - " + colb + "), " + opac + ")"; } else if (blending == blend_type_t.SUBTRACT) { - return "lerp(" + cola + ", " + cola + " - " + colb + ", " + opac + ")"; + return "lerp3(" + cola + ", " + cola + " - " + colb + ", " + opac + ")"; } else if (blending == blend_type_t.DIVIDE) { return "(1.0 - " + opac + ") * " + cola + " + " + opac + " * " + cola + " / " + colb + ""; } else { // BlendHue, BlendSaturation, BlendColor, BlendValue - return "lerp(" + cola + ", " + colb + ", " + opac + ")"; + return "lerp3(" + cola + ", " + colb + ", " + opac + ")"; } } diff --git a/armorpaint/sources/make_mesh.ts b/armorpaint/sources/make_mesh.ts index f3ce175f..6842839f 100644 --- a/armorpaint/sources/make_mesh.ts +++ b/armorpaint/sources/make_mesh.ts @@ -55,7 +55,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte num_layers++; texture_count++; node_shader_add_texture(kong, "texpaint_pack_vert" + l.id, "_texpaint_pack_vert" + l.id); - node_shader_write_vert(kong, "height += sample_lod(texpaint_pack_vert" + l.id + ", input.tex, 0.0).a;"); + node_shader_write_vert(kong, "height += sample_lod(texpaint_pack_vert" + l.id + ", texpaint_pack_vert" + l.id + "_sampler, input.tex, 0.0).a;"); let masks: slot_layer_t[] = slot_layer_get_masks(l); if (masks != null) { for (let i: i32 = 0; i < masks.length; ++i) { @@ -65,7 +65,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } texture_count++; node_shader_add_texture(kong, "texpaint_vert" + m.id, "_texpaint_vert" + m.id); - node_shader_write_vert(kong, "height *= sample_lod(texpaint_vert" + m.id + ", input.tex, 0.0).r;"); + node_shader_write_vert(kong, "height *= sample_lod(texpaint_vert" + m.id + ", texpaint_vert" + m.id + "_sampler, input.tex, 0.0).r;"); } } } @@ -83,7 +83,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].rgba = float4(n.xy, 1.0, pack_f32_i16(0.0, uint(0)));"); - node_shader_write_frag(kong, "var idcol: float3 = pow(sample_lod(texcolorid, 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, texcolorid_sampler, input.tex_coord, 0.0).rgb, float3(2.2, 2.2, 2.2));"); node_shader_write_frag(kong, "output[1].rgba = float4(idcol.rgb, 1.0);"); // occ } else { @@ -93,11 +93,11 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_add_texture(kong, "gbuffer0"); node_shader_add_texture(kong, "gbuffer1"); node_shader_add_texture(kong, "gbuffer2"); - node_shader_write_frag(kong, "var fragcoord: float2 = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); + node_shader_write_frag(kong, "var fragcoord: float2 = (input.wvpposition.xy / input.wvpposition.w) * 0.5 + 0.5;"); node_shader_write_frag(kong, "fragcoord.y = 1.0 - fragcoord.y;"); - node_shader_write_frag(kong, "var gbuffer0_sample: float4 = sample_lod(gbuffer0, fragcoord, 0.0);"); - node_shader_write_frag(kong, "var gbuffer1_sample: float4 = sample_lod(gbuffer1, fragcoord, 0.0);"); - node_shader_write_frag(kong, "var gbuffer2_sample: float4 = sample_lod(gbuffer2, fragcoord, 0.0);"); + node_shader_write_frag(kong, "var gbuffer0_sample: float4 = sample_lod(gbuffer0, gbuffer0_sampler, fragcoord, 0.0);"); + node_shader_write_frag(kong, "var gbuffer1_sample: float4 = sample_lod(gbuffer1, gbuffer1_sampler, fragcoord, 0.0);"); + node_shader_write_frag(kong, "var gbuffer2_sample: float4 = sample_lod(gbuffer2, gbuffer2_sampler, fragcoord, 0.0);"); node_shader_write_frag(kong, "var basecol: float3 = gbuffer0_sample.rgb;"); node_shader_write_frag(kong, "var roughness: float = gbuffer2_sample.g;"); node_shader_write_frag(kong, "var metallic: float = gbuffer2_sample.b;"); @@ -206,7 +206,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } node_shader_add_shared_sampler(kong, "texpaint" + l.id); - node_shader_write_frag(kong, "texpaint_sample = sample_lod_shared(texpaint" + l.id + ", input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "texpaint_sample = sample_lod(texpaint" + l.id + ", shared_sampler, input.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) { @@ -234,7 +234,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } node_shader_add_shared_sampler(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_shared(texpaint" + m.id + ", input.tex_coord, 0.0).r;"); + node_shader_write_frag(kong, "var texpaint_mask_sample" + m.id + ": float = sample_lod(texpaint" + m.id + ", shared_sampler, input.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 + ";"); @@ -260,7 +260,7 @@ 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_shared_sampler(kong, "texpaint_nor" + l.id); - node_shader_write_frag(kong, "texpaint_nor_sample = sample_lod_shared(texpaint_nor" + l.id + ", input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "texpaint_nor_sample = sample_lod(texpaint_nor" + l.id + ", shared_sampler, input.tex_coord, 0.0);"); if (make_material_emis_used) { node_shader_write_frag(kong, "if (texpaint_opac > 0.0) { matid = texpaint_nor_sample.a; }"); @@ -271,19 +271,19 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte // Whiteout blend node_shader_write_frag(kong, "{"); node_shader_write_frag(kong, "var n1: float3 = ntex * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); - node_shader_write_frag(kong, "var n2: float3 = clamp(float3(0.5, 0.5, 1.0), texpaint_nor_sample.rgb, texpaint_opac) * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); + node_shader_write_frag(kong, "var n2: float3 = clamp3(float3(0.5, 0.5, 1.0), texpaint_nor_sample.rgb, texpaint_opac) * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); node_shader_write_frag(kong, "ntex = normalize(float3(n1.xy + n2.xy, n1.z * n2.z)) * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5);"); node_shader_write_frag(kong, "}"); } else { - node_shader_write_frag(kong, "ntex = clamp(ntex, texpaint_nor_sample.rgb, texpaint_opac);"); + node_shader_write_frag(kong, "ntex = clamp3(ntex, texpaint_nor_sample.rgb, texpaint_opac);"); } } } if (l.paint_occ || l.paint_rough || l.paint_met || (l.paint_height && make_material_height_used)) { node_shader_add_shared_sampler(kong, "texpaint_pack" + l.id); - node_shader_write_frag(kong, "texpaint_pack_sample = sample_lod_shared(texpaint_pack" + l.id + ", input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "texpaint_pack_sample = sample_lod(texpaint_pack" + l.id + ", shared_sampler, input.tex_coord, 0.0);"); if (l.paint_occ) { node_shader_write_frag(kong, "occlusion = clamp(occlusion, texpaint_pack_sample.r, texpaint_opac);"); @@ -300,10 +300,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_shared(texpaint_pack" + l.id + ", 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_shared(texpaint_pack" + l.id + ", 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_shared(texpaint_pack" + l.id + ", 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_shared(texpaint_pack" + l.id + ", 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 + ", shared_sampler, 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 + ", shared_sampler, 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 + ", shared_sampler, 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 + ", shared_sampler, float2(input.tex_coord.x, input.tex_coord.y + tex_step), 0.0).a * texpaint_opac;"); node_shader_write_frag(kong, "}"); } } @@ -324,7 +324,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, input.tex_coord, 0.0).a;"); + node_shader_write_frag(kong, "var wireframe: float = sample_lod(texuvmap, texuvmap_sampler, input.tex_coord, 0.0).a;"); node_shader_write_frag(kong, "basecol *= 1.0 - wireframe * 0.25;"); node_shader_write_frag(kong, "roughness = max(roughness, wireframe);"); } @@ -354,10 +354,10 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, input.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(mul(n, TBN));"); + node_shader_write_frag(kong, "n = normalize(TBN * n);"); if (context_raw.viewport_mode == viewport_mode_t.LIT || context_raw.viewport_mode == viewport_mode_t.PATH_TRACE) { - node_shader_write_frag(kong, "basecol = pow(basecol, float3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "basecol = pow3(basecol, float3(2.2, 2.2, 2.2));"); if (context_raw.viewport_shader != null) { node_shader_write_frag(kong, "var output_color: float3;"); @@ -366,8 +366,8 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } else if (context_raw.render_mode == render_mode_t.FORWARD && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { kong.frag_wposition = true; - node_shader_write_frag(kong, "var albedo: float3 = clamp(basecol, float3(0.0, 0.0, 0.0), metallic);"); - node_shader_write_frag(kong, "var f0: float3 = clamp(float3(0.04, 0.04, 0.04), basecol, metallic);"); + node_shader_write_frag(kong, "var albedo: float3 = clamp3(basecol, float3(0.0, 0.0, 0.0), metallic);"); + node_shader_write_frag(kong, "var f0: float3 = clamp3(float3(0.04, 0.04, 0.04), basecol, metallic);"); kong.frag_vvec = true; node_shader_write_frag(kong, "var dotnv: float = max(0.0, dot(n, vvec));"); node_shader_write_frag(kong, "var env_brdf: float2 = senvmap_brdf[int2(float2(roughness, 1.0 - dotnv) * 256.0)].xy;"); @@ -376,7 +376,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "var wreflect: float3 = reflect(-vvec, n);"); node_shader_write_frag(kong, "var envlod: float = roughness * float(constants.envmap_num_mipmaps);"); node_shader_add_function(kong, str_envmap_equirect); - node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, envmap_equirect(wreflect, constants.envmap_data.x), envlod).rgb;"); + node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, senvmap_radiance_sampler, envmap_equirect(wreflect, constants.envmap_data.x), envlod).rgb;"); // node_shader_add_constant(kong, "shirr: float4[7]", "_envmap_irradiance"); node_shader_add_constant(kong, "shirr0: float4", "_envmap_irradiance0"); node_shader_add_constant(kong, "shirr1: float4", "_envmap_irradiance1"); @@ -455,7 +455,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_shared(texpaint" + id + ", input.tex_coord, 0.0).r;"); + node_shader_write_frag(kong, "var mask_view: float = sample_lod(texpaint" + id + ", shared_sampler, input.tex_coord, 0.0).r;"); } else { node_shader_write_frag(kong, "var mask_view: float = 0.0;"); @@ -464,7 +464,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_shared(texpaint_view_mask" + m.id + ", input.tex_coord, 0.0).r;"); + node_shader_write_frag(kong, "var mask_sample" + m.id + ": float = sample_lod(texpaint_view_mask" + m.id + ", shared_sampler, input.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 + ";"); @@ -477,7 +477,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (context_raw.viewport_mode != viewport_mode_t.LIT && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { - node_shader_write_frag(kong, "output[1].rgb = pow(output[1].rgb, float3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "output[1].rgb = pow3(output[1].rgb, float3(2.2, 2.2, 2.2));"); } node_shader_write_frag(kong, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); diff --git a/armorpaint/sources/make_mesh_preview.ts b/armorpaint/sources/make_mesh_preview.ts index 34af2aa3..1c7d004d 100644 --- a/armorpaint/sources/make_mesh_preview.ts +++ b/armorpaint/sources/make_mesh_preview.ts @@ -75,7 +75,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no let opac: string = sout.out_opacity; let height: string = sout.out_height; let nortan: string = parser_material_out_normaltan; - node_shader_write_frag(kong, "var basecol: float3 = pow(" + base + ", float3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "var basecol: float3 = pow3(" + base + ", float3(2.2, 2.2, 2.2));"); node_shader_write_frag(kong, "var roughness: float = " + rough + ";"); node_shader_write_frag(kong, "var metallic: float = " + met + ";"); node_shader_write_frag(kong, "var occlusion: float = " + occ + ";"); @@ -86,7 +86,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, input.tex_coord / float(" + brush_scale + "), 0.0).r;"); + node_shader_write_frag(kong, "opacity *= sample_lod(textexttool, textexttool_sampler, input.tex_coord / float(" + brush_scale + "), 0.0).r;"); } } if (decal) { @@ -135,7 +135,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no } else { node_shader_write_frag(kong, "output[0].rgba = float4(n.x, n.y, lerp(1.0, roughness, opacity), pack_f32_i16(lerp(1.0, metallic, opacity), uint(0)));"); // metallic/matid - node_shader_write_frag(kong, "output[1].rgba = float4(lerp(float3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); + node_shader_write_frag(kong, "output[1].rgba = float4(lerp3(float3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); } node_shader_write_frag(kong, "output[2].rgba = float4(0.0, 0.0, 0.0, 0.0);"); diff --git a/armorpaint/sources/make_paint.ts b/armorpaint/sources/make_paint.ts index 11c95abf..78f30b0e 100644 --- a/armorpaint/sources/make_paint.ts +++ b/armorpaint/sources/make_paint.ts @@ -144,7 +144,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, sp.xy, 0.0).r + 0.0005) { discard; }"); + node_shader_write_frag(kong, "if (sp.z > sample_lod(gbufferD, gbufferD_sampler, sp.xy, 0.0).r + 0.0005) { discard; }"); } make_brush_run(kong); @@ -155,7 +155,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad if (angle_fill) { node_shader_add_function(kong, str_octahedron_wrap); node_shader_add_texture(kong, "gbuffer0"); - node_shader_write_frag(kong, "var g0: float2 = sample_lod(gbuffer0, constants.inp.xy, 0.0).rg;"); + node_shader_write_frag(kong, "var g0: float2 = sample_lod(gbuffer0, gbuffer0_sampler, constants.inp.xy, 0.0).rg;"); node_shader_write_frag(kong, "var wn: float3;"); node_shader_write_frag(kong, "wn.z = 1.0 - abs(g0.x) - abs(g0.y);"); // node_shader_write_frag(kong, "wn.xy = wn.z >= 0.0 ? g0.xy : octahedron_wrap(g0.xy);"); @@ -167,7 +167,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, sp.xy, 0.0).r + 0.0005) { discard; }"); + node_shader_write_frag(kong, "if (sp.z > sample_lod(gbufferD, gbufferD_sampler, sp.xy, 0.0).r + 0.0005) { discard; }"); } } @@ -260,7 +260,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad if (context_raw.brush_mask_image != null && context_raw.tool == workspace_tool_t.DECAL) { node_shader_add_texture(kong, "texbrushmask", "_texbrushmask"); - node_shader_write_frag(kong, "var mask_sample: float4 = sample_lod(texbrushmask, uvsp, 0.0);"); + node_shader_write_frag(kong, "var mask_sample: float4 = sample_lod(texbrushmask, texbrushmask_sampler, uvsp, 0.0);"); if (context_raw.brush_mask_image_is_alpha) { node_shader_write_frag(kong, "opacity *= mask_sample.a;"); } @@ -270,7 +270,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } else if (context_raw.tool == workspace_tool_t.TEXT) { node_shader_add_texture(kong, "textexttool", "_textexttool"); - node_shader_write_frag(kong, "opacity *= sample_lod(textexttool, uvsp, 0.0).r;"); + node_shader_write_frag(kong, "opacity *= sample_lod(textexttool, textexttool_sampler, uvsp, 0.0).r;"); } if (context_raw.brush_stencil_image != null && ( @@ -293,7 +293,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad 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, "var texbrushstencil_sample: float4 = sample_lod(texbrushstencil, stencil_uv, 0.0);"); + node_shader_write_frag(kong, "var texbrushstencil_sample: float4 = sample_lod(texbrushstencil, texbrushstencil_sampler, stencil_uv, 0.0);"); if (context_raw.brush_stencil_image_is_alpha) { node_shader_write_frag(kong, "opacity *= texbrushstencil_sample.a;"); } @@ -324,7 +324,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write_frag(kong, "pa_mask *= distance(constants.eye, winp.xyz) / 1.5;"); } node_shader_write_frag(kong, "pa_mask = pa_mask.xy * 0.5 + 0.5;"); - node_shader_write_frag(kong, "var mask_sample: float4 = sample_lod(texbrushmask, pa_mask, 0.0);"); + node_shader_write_frag(kong, "var mask_sample: float4 = sample_lod(texbrushmask, texbrushmask_sampler, pa_mask, 0.0);"); if (context_raw.brush_mask_image_is_alpha) { node_shader_write_frag(kong, "opacity *= mask_sample.a;"); } @@ -346,15 +346,15 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad // Manual blending to preserve memory kong.frag_wvpposition = true; - node_shader_write_frag(kong, "var sample_tc: float2 = float2(wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); + node_shader_write_frag(kong, "var sample_tc: float2 = float2(input.wvpposition.xy / input.wvpposition.w) * 0.5 + 0.5;"); node_shader_write_frag(kong, "sample_tc.y = 1.0 - sample_tc.y;"); node_shader_add_texture(kong, "paintmask"); - node_shader_write_frag(kong, "var sample_mask: float = sample_lod(paintmask, sample_tc, 0.0).r;"); + node_shader_write_frag(kong, "var sample_mask: float = sample_lod(paintmask, paintmask_sampler, sample_tc, 0.0).r;"); node_shader_write_frag(kong, "str = max(str, sample_mask);"); // write(frag, "str = clamp(str + sample_mask, 0.0, 1.0);"); node_shader_add_texture(kong, "texpaint_undo", "_texpaint_undo"); - node_shader_write_frag(kong, "var sample_undo: float4 = sample_lod(texpaint_undo, sample_tc, 0.0);"); + node_shader_write_frag(kong, "var sample_undo: float4 = sample_lod(texpaint_undo, texpaint_undo_sampler, sample_tc, 0.0);"); let matid: f32 = context_raw.material.id / 255; if (context_raw.picker_mask_handle.position == picker_mask_t.MATERIAL) { @@ -381,7 +381,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad let layered: bool = context_raw.layer != project_layers[0]; if (layered && !is_mask) { if (context_raw.tool == workspace_tool_t.ERASER) { - node_shader_write_frag(kong, "output[0].rgba = float4(lerp(sample_undo.rgb, float3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); + node_shader_write_frag(kong, "output[0].rgba = float4(lerp3(sample_undo.rgb, float3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); node_shader_write_frag(kong, "nortan = float3(0.5, 0.5, 1.0);"); node_shader_write_frag(kong, "occlusion = 1.0;"); node_shader_write_frag(kong, "roughness = 0.0;"); @@ -408,8 +408,8 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad if (decal) { node_shader_add_texture(kong, "texpaint_pack_undo", "_texpaint_pack_undo"); - node_shader_write_frag(kong, "var sample_pack_undo: float4 = sample_lod(texpaint_pack_undo, sample_tc, 0.0);"); - node_shader_write_frag(kong, "output[2].rgba = lerp(sample_pack_undo, float4(occlusion, roughness, metallic, " + height + "), str);"); + node_shader_write_frag(kong, "var sample_pack_undo: float4 = sample_lod(texpaint_pack_undo, texpaint_pack_undo_sampler, sample_tc, 0.0);"); + node_shader_write_frag(kong, "output[2].rgba = lerp4(sample_pack_undo, float4(occlusion, roughness, metallic, " + height + "), str);"); } else { node_shader_write_frag(kong, "output[2].rgba = float4(occlusion, roughness, metallic, " + height + ");"); @@ -417,26 +417,26 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } else { if (context_raw.tool == workspace_tool_t.ERASER) { - node_shader_write_frag(kong, "output[0].rgba = float4(lerp(sample_undo.rgb, float3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); + node_shader_write_frag(kong, "output[0].rgba = float4(lerp3(sample_undo.rgb, float3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); node_shader_write_frag(kong, "output[1].rgba = float4(0.5, 0.5, 1.0, 0.0);"); node_shader_write_frag(kong, "output[2].rgba = float4(1.0, 0.0, 0.0, 0.0);"); } else { node_shader_add_texture(kong, "texpaint_nor_undo", "_texpaint_nor_undo"); node_shader_add_texture(kong, "texpaint_pack_undo", "_texpaint_pack_undo"); - node_shader_write_frag(kong, "var sample_nor_undo: float4 = sample_lod(texpaint_nor_undo, sample_tc, 0.0);"); - node_shader_write_frag(kong, "var sample_pack_undo: float4 = sample_lod(texpaint_pack_undo, sample_tc, 0.0);"); + node_shader_write_frag(kong, "var sample_nor_undo: float4 = sample_lod(texpaint_nor_undo, texpaint_nor_undo_sampler, sample_tc, 0.0);"); + node_shader_write_frag(kong, "var sample_pack_undo: float4 = sample_lod(texpaint_pack_undo, texpaint_pack_undo_sampler, sample_tc, 0.0);"); ///if is_forge node_shader_write_frag(kong, "output[0].rgba = float4(" + make_material_blend_mode(kong, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", mat_opacity);"); ///else node_shader_write_frag(kong, "output[0].rgba = float4(" + make_material_blend_mode(kong, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", max(str, sample_undo.a));"); ///end - node_shader_write_frag(kong, "output[1].rgba = float4(lerp(sample_nor_undo.rgb, nortan, str), matid);"); + node_shader_write_frag(kong, "output[1].rgba = float4(lerp3(sample_nor_undo.rgb, nortan, str), matid);"); if (context_raw.material.paint_height && make_material_height_used) { - node_shader_write_frag(kong, "output[2].rgba = lerp(sample_pack_undo, float4(occlusion, roughness, metallic, height), str);"); + node_shader_write_frag(kong, "output[2].rgba = lerp4(sample_pack_undo, float4(occlusion, roughness, metallic, height), str);"); } else { - node_shader_write_frag(kong, "output[2].rgba = float4(lerp(sample_pack_undo.rgb, float3(occlusion, roughness, metallic), str), 0.0);"); + node_shader_write_frag(kong, "output[2].rgba = float4(lerp3(sample_pack_undo.rgb, float3(occlusion, roughness, metallic), str), 0.0);"); } } } diff --git a/armorpaint/sources/make_texcoord.ts b/armorpaint/sources/make_texcoord.ts index f0e7c8c2..e8735234 100644 --- a/armorpaint/sources/make_texcoord.ts +++ b/armorpaint/sources/make_texcoord.ts @@ -27,7 +27,7 @@ function make_texcoord_run(kong: node_shader_t) { kong.frag_wposition = true; node_shader_add_constant(kong, "decal_layer_loc: float3", "_decal_layer_loc"); node_shader_add_constant(kong, "decal_layer_dim: float", "_decal_layer_dim"); - node_shader_write_attrib_frag(kong, "if (abs(dot(constants.decal_layer_nor, constants.decal_layer_loc - wposition)) > constants.decal_layer_dim) { discard; }"); + node_shader_write_attrib_frag(kong, "if (abs(dot(constants.decal_layer_nor, constants.decal_layer_loc - input.wposition)) > constants.decal_layer_dim) { discard; }"); } else if (decal) { node_shader_add_constant(kong, "decal_mask: float4", "_decal_mask"); @@ -67,7 +67,7 @@ function make_texcoord_run(kong: node_shader_t) { else if (uv_type == uv_type_t.UVMAP) { // TexCoords - uvmap 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 = tex * constants.brush_scale;"); + 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"); @@ -82,9 +82,9 @@ function make_texcoord_run(kong: node_shader_t) { node_shader_write_attrib_frag(kong, "var tri_max: float = max(tri_weight.x, max(tri_weight.y, tri_weight.z));"); node_shader_write_attrib_frag(kong, "tri_weight = max(tri_weight - tri_max * 0.75, 0.0);"); node_shader_write_attrib_frag(kong, "var tex_coord_blend: float3 = tri_weight * (1.0 / (tri_weight.x + tri_weight.y + tri_weight.z));"); - node_shader_write_attrib_frag(kong, "var tex_coord: float2 = wposition.yz * constants.brush_scale * 0.5;"); - node_shader_write_attrib_frag(kong, "var tex_coord1: float2 = wposition.xz * constants.brush_scale * 0.5;"); - node_shader_write_attrib_frag(kong, "var tex_coord2: float2 = wposition.xy * constants.brush_scale * 0.5;"); + 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"); diff --git a/armorsculpt/sources/make_brush.ts b/armorsculpt/sources/make_brush.ts index 9a75a7ca..b01560f3 100644 --- a/armorsculpt/sources/make_brush.ts +++ b/armorsculpt/sources/make_brush.ts @@ -4,7 +4,7 @@ function make_brush_run(kong: node_shader_t) { node_shader_write_frag(kong, "var dist: float = 0.0;"); if (config_raw.brush_3d) { - node_shader_write_frag(kong, "var depth: float = sample_lod(gbufferD, inp.xy, 0.0).r;"); + node_shader_write_frag(kong, "var depth: float = sample_lod(gbufferD, gbufferD_sampler, inp.xy, 0.0).r;"); node_shader_add_constant(kong, "invVP: float4x4", "_inv_view_proj_matrix"); node_shader_write_frag(kong, "var winp: float4 = float4(float2(inp.x, 1.0 - inp.y) * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);"); @@ -15,14 +15,14 @@ function make_brush_run(kong: node_shader_t) { node_shader_write_attrib_frag(kong, "var wposition: float3 = (constants.W * texpaint_undo[int2(tex_coord.x * textureSize(texpaint_undo, 0).x, tex_coord.y * textureSize(texpaint_undo, 0).y)]).xyz;"); - node_shader_write_frag(kong, "var depthlast: float = sample_lod(gbufferD, inplast.xy, 0.0).r;"); + node_shader_write_frag(kong, "var depthlast: float = sample_lod(gbufferD, gbufferD_sampler, constants.inplast.xy, 0.0).r;"); - node_shader_write_frag(kong, "var winplast: float4 = float4(float2(inplast.x, 1.0 - inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);"); + node_shader_write_frag(kong, "var winplast: float4 = float4(float2(constants.inplast.x, 1.0 - constants.inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);"); node_shader_write_frag(kong, "winplast = constants.invVP * winplast;"); node_shader_write_frag(kong, "winplast.xyz /= winplast.w;"); node_shader_write_frag(kong, "dist = distance(wposition, winp.xyz);"); } - node_shader_write_frag(kong, "if (dist > brush_radius) { discard; }"); + node_shader_write_frag(kong, "if (dist > constants.brush_radius) { discard; }"); } diff --git a/armorsculpt/sources/make_mesh.ts b/armorsculpt/sources/make_mesh.ts index 263fec01..3f2e4f10 100644 --- a/armorsculpt/sources/make_mesh.ts +++ b/armorsculpt/sources/make_mesh.ts @@ -40,7 +40,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_add_constant(kong, "WVP: float4x4", "_world_view_proj_matrix"); let lid: i32 = project_layers[0].id; node_shader_add_texture(kong, "texpaint_vert", "_texpaint_vert" + lid); - node_shader_write_vert(kong, "var meshpos: float3 = sample_lod(texpaint_vert, int2(gl_VertexID % textureSize(texpaint_vert, 0).x, gl_VertexID / textureSize(texpaint_vert, 0).y), 0).xyz;"); + node_shader_write_vert(kong, "var meshpos: float3 = sample_lod(texpaint_vert, texpaint_vert_sampler, int2(gl_VertexID % textureSize(texpaint_vert, 0).x, gl_VertexID / textureSize(texpaint_vert, 0).y), 0).xyz;"); // + input.pos.xyz * 0.000001 node_shader_write_vert(kong, "output.pos = constants.WVP * float4(meshpos.xyz, 1.0);"); @@ -54,11 +54,11 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_attrib_vert(kong, "var base_vertex0: int = gl_VertexID - (gl_VertexID % 3);"); node_shader_write_attrib_vert(kong, "var base_vertex1: int = base_vertex0 + 1;"); node_shader_write_attrib_vert(kong, "var base_vertex2: int = base_vertex0 + 2;"); - node_shader_write_attrib_vert(kong, "var meshpos0: float3 = sample_lod(texpaint_vert, int2(base_vertex0 % textureSize(texpaint_vert, 0).x, base_vertex0 / textureSize(texpaint_vert, 0).y), 0).xyz;"); - node_shader_write_attrib_vert(kong, "var meshpos1: float3 = sample_lod(texpaint_vert, int2(base_vertex1 % textureSize(texpaint_vert, 0).x, base_vertex1 / textureSize(texpaint_vert, 0).y), 0).xyz;"); - node_shader_write_attrib_vert(kong, "var meshpos2: float3 = sample_lod(texpaint_vert, int2(base_vertex2 % textureSize(texpaint_vert, 0).x, base_vertex2 / textureSize(texpaint_vert, 0).y), 0).xyz;"); + node_shader_write_attrib_vert(kong, "var meshpos0: float3 = sample_lod(texpaint_vert, texpaint_vert_sampler, int2(base_vertex0 % textureSize(texpaint_vert, 0).x, base_vertex0 / textureSize(texpaint_vert, 0).y), 0).xyz;"); + node_shader_write_attrib_vert(kong, "var meshpos1: float3 = sample_lod(texpaint_vert, texpaint_vert_sampler, int2(base_vertex1 % textureSize(texpaint_vert, 0).x, base_vertex1 / textureSize(texpaint_vert, 0).y), 0).xyz;"); + node_shader_write_attrib_vert(kong, "var meshpos2: float3 = sample_lod(texpaint_vert, texpaint_vert_sampler, int2(base_vertex2 % textureSize(texpaint_vert, 0).x, base_vertex2 / textureSize(texpaint_vert, 0).y), 0).xyz;"); node_shader_write_attrib_vert(kong, "var meshnor: float3 = normalize(cross(meshpos2 - meshpos1, meshpos0 - meshpos1));"); - node_shader_write_attrib_vert(kong, "output.wnormal = mul(meshnor, constants.N);"); + node_shader_write_attrib_vert(kong, "output.wnormal = constants.N * meshnor;"); node_shader_write_attrib_frag(kong, "var n: float3 = normalize(input.wnormal);"); node_shader_add_function(kong, str_pack_float_int16); @@ -68,11 +68,11 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_add_texture(kong, "gbuffer0"); node_shader_add_texture(kong, "gbuffer1"); node_shader_add_texture(kong, "gbuffer2"); - node_shader_write_frag(kong, "var fragcoord: float2 = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); + node_shader_write_frag(kong, "var fragcoord: float2 = (input.wvpposition.xy / input.wvpposition.w) * 0.5 + 0.5;"); node_shader_write_frag(kong, "fragcoord.y = 1.0 - fragcoord.y;"); - node_shader_write_frag(kong, "var gbuffer0_sample: float4 = sample_lod(gbuffer0, fragcoord, 0.0);"); - node_shader_write_frag(kong, "var gbuffer1_sample: float4 = sample_lod(gbuffer1, fragcoord, 0.0);"); - node_shader_write_frag(kong, "var gbuffer2_sample: float4 = sample_lod(gbuffer2, fragcoord, 0.0);"); + node_shader_write_frag(kong, "var gbuffer0_sample: float4 = sample_lod(gbuffer0, gbuffer0_sampler, fragcoord, 0.0);"); + node_shader_write_frag(kong, "var gbuffer1_sample: float4 = sample_lod(gbuffer1, gbuffer1_sampler, fragcoord, 0.0);"); + node_shader_write_frag(kong, "var gbuffer2_sample: float4 = sample_lod(gbuffer2, gbuffer2_sampler, fragcoord, 0.0);"); node_shader_write_frag(kong, "var basecol: float3 = gbuffer0_sample.rgb;"); node_shader_write_frag(kong, "var roughness: float = gbuffer2_sample.g;"); node_shader_write_frag(kong, "var metallic: float = gbuffer2_sample.b;"); @@ -186,7 +186,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_shared_sampler(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_shared(texpaint" + m.id + ", input.tex_coord, 0.0).r;"); + node_shader_write_frag(kong, "var texpaint_mask_sample" + m.id + ": float = sample_lod(texpaint" + m.id + ", shared_sampler, input.tex_coord, 0.0).r;"); node_shader_write_frag(kong, "}"); } node_shader_write_frag(kong, "texpaint_opac *= clamp(" + texpaint_mask + ", 0.0, 1.0);"); @@ -217,7 +217,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, "basecol *= 1.0 - sample_lod(texuvmap, input.tex_coord, 0.0).r;"); + node_shader_write_frag(kong, "basecol *= 1.0 - sample_lod(texuvmap, texuvmap_sampler, input.tex_coord, 0.0).r;"); } if (make_material_height_used) { @@ -249,7 +249,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.viewport_mode == viewport_mode_t.LIT) { - node_shader_write_frag(kong, "basecol = pow(basecol, float3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "basecol = pow3(basecol, float3(2.2, 2.2, 2.2));"); if (context_raw.viewport_shader != null) { node_shader_write_frag(kong, "var output_color: float3;"); @@ -258,8 +258,8 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } else if (context_raw.render_mode == render_mode_t.FORWARD) { kong.frag_wposition = true; - node_shader_write_frag(kong, "var albedo: float3 = lerp(basecol, float3(0.0, 0.0, 0.0), metallic);"); - node_shader_write_frag(kong, "var f0: float3 = lerp(float3(0.04, 0.04, 0.04), basecol, metallic);"); + node_shader_write_frag(kong, "var albedo: float3 = lerp3(basecol, float3(0.0, 0.0, 0.0), metallic);"); + node_shader_write_frag(kong, "var f0: float3 = lerp3(float3(0.04, 0.04, 0.04), basecol, metallic);"); kong.frag_vvec = true; node_shader_write_frag(kong, "var dotnv: float = max(0.0, dot(n, vvec));"); node_shader_write_frag(kong, "var env_brdf: float2 = senvmap_brdf[int2(float2(roughness, 1.0 - dotnv) * 256.0)].xy;"); @@ -268,7 +268,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "var wreflect: float3 = reflect(-vvec, n);"); node_shader_write_frag(kong, "var envlod: float = roughness * float(constants.envmap_num_mipmaps);"); node_shader_add_function(kong, str_envmap_equirect); - node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, envmap_equirect(wreflect, constants.envmap_data.x), envlod).rgb;"); + node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, senvmap_radiance_sampler, envmap_equirect(wreflect, constants.envmap_data.x), envlod).rgb;"); // node_shader_add_constant(kong, "shirr: float4[7]", "_envmap_irradiance"); node_shader_add_constant(kong, "shirr0: float4", "_envmap_irradiance0"); node_shader_add_constant(kong, "shirr1: float4", "_envmap_irradiance1"); @@ -307,7 +307,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (context_raw.viewport_mode != viewport_mode_t.LIT && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { - node_shader_write_frag(kong, "output[1].rgb = pow(output[1].rgb, float3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "output[1].rgb = pow3(output[1].rgb, float3(2.2, 2.2, 2.2));"); } node_shader_write_frag(kong, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); diff --git a/armorsculpt/sources/make_mesh_preview.ts b/armorsculpt/sources/make_mesh_preview.ts index a207960f..9405ef92 100644 --- a/armorsculpt/sources/make_mesh_preview.ts +++ b/armorsculpt/sources/make_mesh_preview.ts @@ -80,7 +80,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no let opac: string = "0.0"; let height: string = "0.0"; let nortan: string = "float3(1.0, 1.0, 1.0)"; - node_shader_write_frag(kong, "var basecol: float3 = pow(" + base + ", float3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "var basecol: float3 = pow3(" + base + ", float3(2.2, 2.2, 2.2));"); node_shader_write_frag(kong, "var roughness: float = " + rough + ";"); node_shader_write_frag(kong, "var metallic: float = " + met + ";"); node_shader_write_frag(kong, "var occlusion: float = " + occ + ";"); @@ -91,7 +91,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, input.tex_coord / float(" + brush_scale + "), 0.0).r;"); + node_shader_write_frag(kong, "opacity *= sample_lod(textexttool, textexttool_sampler, input.tex_coord / float(" + brush_scale + "), 0.0).r;"); } } if (decal) { @@ -126,7 +126,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, input.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(mul(n, TBN));"); + node_shader_write_frag(kong, "n = normalize(TBN * n);"); } node_shader_write_frag(kong, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); @@ -140,7 +140,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no } else { node_shader_write_frag(kong, "output[0].rgba = float4(n.x, n.y, lerp(1.0, roughness, opacity), pack_f32_i16(lerp(1.0, metallic, opacity), uint(0)));"); // metallic/matid - node_shader_write_frag(kong, "output[1].rgba = float4(lerp(float3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); + node_shader_write_frag(kong, "output[1].rgba = float4(lerp3(float3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); } node_shader_write_frag(kong, "output[2].rgba = float4(0.0, 0.0, 0.0, 0.0);"); // veloc diff --git a/armorsculpt/sources/make_sculpt.ts b/armorsculpt/sources/make_sculpt.ts index 50332b96..5f878294 100644 --- a/armorsculpt/sources/make_sculpt.ts +++ b/armorsculpt/sources/make_sculpt.ts @@ -68,13 +68,13 @@ 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, input.tex_coord, 0.0);"); + node_shader_write_frag(kong, "var sample_undo: float4 = sample_lod(texpaint_undo, texpaint_undo_sampler, input.tex_coord, 0.0);"); node_shader_write_frag(kong, "if (sample_undo.r == 0 && sample_undo.g == 0 && sample_undo.b == 0) { discard; }"); node_shader_add_function(kong, str_octahedron_wrap); node_shader_add_texture(kong, "gbuffer0_undo"); - node_shader_write_frag(kong, "var g0_undo: float2 = sample_lod(gbuffer0_undo, constants.inp.xy, 0.0).rg;"); + node_shader_write_frag(kong, "var g0_undo: float2 = sample_lod(gbuffer0_undo, gbuffer0_undo_sampler, constants.inp.xy, 0.0).rg;"); node_shader_write_frag(kong, "var wn: float3;"); node_shader_write_frag(kong, "wn.z = 1.0 - abs(g0_undo.x) - abs(g0_undo.y);"); // node_shader_write_frag(kong, "wn.xy = wn.z >= 0.0 ? g0_undo.xy : octahedron_wrap(g0_undo.xy);"); diff --git a/base/sources/ts/node_shader.ts b/base/sources/ts/node_shader.ts index 0fb1a712..e2713438 100644 --- a/base/sources/ts/node_shader.ts +++ b/base/sources/ts/node_shader.ts @@ -199,11 +199,11 @@ function node_shader_get(raw: node_shader_t): string { s += "}\n\n"; for (let i: i32 = 0; i < raw.textures.length; ++i) { - s += "#[set(everything)]\n"; let a: string = raw.textures[i]; + s += "#[set(everything)]\n"; s += "const " + a + ": tex2d;\n"; s += "#[set(everything)]\n"; - s += "const " + a + "_sampler: sampler;\n"; + s += "const " + a + "_sampler: sampler;\n\n"; } s += "#[set(everything)]\n"; @@ -214,15 +214,15 @@ function node_shader_get(raw: node_shader_t): string { } s += "};\n\n"; - let shared_sampler: string = "shared_sampler"; - // if (raw.shared_samplers.length > 0) { - // shared_sampler = string_split(raw.shared_samplers[0], " ")[1] + "_sampler"; - // } - - // for (let i: i32 = 0; i < raw.shared_samplers.length; ++i) { - // let a: string = raw.shared_samplers[i]; - // s += "uniform " + a + ";\n"; - // } + for (let i: i32 = 0; i < raw.shared_samplers.length; ++i) { + let a: string = raw.shared_samplers[i]; + s += "#[set(everything)]\n"; + s += "const " + a + ": tex2d;\n"; + } + if (raw.shared_samplers.length > 0) { + s += "#[set(everything)]\n"; + s += "const shared_sampler: sampler;\n\n"; + } let keys: string[] = map_keys(raw.functions); for (let i: i32 = 0; i < keys.length; ++i) { diff --git a/base/sources/ts/parser_material.ts b/base/sources/ts/parser_material.ts index ccbc651d..1b0d6e73 100644 --- a/base/sources/ts/parser_material.ts +++ b/base/sources/ts/parser_material.ts @@ -602,11 +602,11 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) coloring = string_replace_all(coloring, " ", "_"); let res: string = ""; if (coloring == "INTENSITY") { - let voronoi: string = "tex_voronoi(" + co + " * " + scale + ", texturePass(snoise256)).a"; + let voronoi: string = "tex_voronoi(" + co + " * " + scale + ").a"; res = parser_material_to_vec3(voronoi); } else { // Cells - res = "tex_voronoi(" + co + " * " + scale + ", texturePass(snoise256)).rgb"; + res = "tex_voronoi(" + co + " * " + scale + ").rgb"; } return res; } @@ -627,7 +627,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) else if (node.type == "GAMMA") { let out_col: string = parser_material_parse_vector_input(node.inputs[0]); let gamma: string = parser_material_parse_value_input(node.inputs[1]); - return "pow(" + out_col + ", " + parser_material_to_vec3(gamma) + ")"; + return "pow3(" + out_col + ", " + parser_material_to_vec3(gamma) + ")"; } else if (node.type == "DIRECT_WARP") { if (parser_material_warp_passthrough) { @@ -642,7 +642,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);"); 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 + ", tex_coord + float2(" + store + "_x, " + store + "_y) * " + mask + ").rgb;"; + return "sample(" + tex_name + ", " + tex_name + "_sampler, + 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 = -" + steps + "; i <= " + steps + "; i += 1) {"); parser_material_write(parser_material_kong, "for (var j: int = -" + steps + "; j <= " + steps + "; j += 1) {"); - parser_material_write(parser_material_kong, store + "_res += sample(" + tex_name + ", tex_coord + float2(i, j) / float2(textureSize(" + tex_name + ", 0))).rgb;"); + parser_material_write(parser_material_kong, store + "_res += sample(" + tex_name + ", " + tex_name + "_sampler, tex_coord + float2(i, j) / float2(textureSize(" + tex_name + ", 0))).rgb;"); parser_material_write(parser_material_kong, "}"); parser_material_write(parser_material_kong, "}"); parser_material_write(parser_material_kong, store + "_res /= (" + steps + " * 2 + 1) * (" + steps + " * 2 + 1);"); @@ -677,7 +677,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) else if (node.type == "INVERT") { let fac: string = parser_material_parse_value_input(node.inputs[0]); let out_col: string = parser_material_parse_vector_input(node.inputs[1]); - return "lerp(" + out_col + ", float3(1.0, 1.0, 1.0) - (" + out_col + "), " + fac + ")"; + return "lerp3(" + out_col + ", float3(1.0, 1.0, 1.0) - (" + out_col + "), " + fac + ")"; } else if (node.type == "MIX_RGB") { let fac: string = parser_material_parse_value_input(node.inputs[0]); @@ -691,32 +691,32 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) let use_clamp: bool = node.buttons[1].default_value[0] > 0; let out_col: string = ""; if (blend == "MIX") { - out_col = "lerp(" + col1 + ", " + col2 + ", " + fac_var + ")"; + out_col = "lerp3(" + col1 + ", " + col2 + ", " + fac_var + ")"; } else if (blend == "DARKEN") { - out_col = "min(" + col1 + ", " + col2 + " * " + fac_var + ")"; + out_col = "min3(" + col1 + ", " + col2 + " * " + fac_var + ")"; } else if (blend == "MULTIPLY") { - out_col = "lerp(" + col1 + ", " + col1 + " * " + col2 + ", " + fac_var + ")"; + out_col = "lerp3(" + col1 + ", " + col1 + " * " + col2 + ", " + fac_var + ")"; } else if (blend == "BURN") { - out_col = "lerp(" + col1 + ", float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - " + col1 + ") / " + col2 + ", " + fac_var + ")"; + out_col = "lerp3(" + col1 + ", float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - " + col1 + ") / " + col2 + ", " + fac_var + ")"; } else if (blend == "LIGHTEN") { - out_col = "max(" + col1 + ", " + col2 + " * " + fac_var + ")"; + out_col = "max3(" + col1 + ", " + col2 + " * " + fac_var + ")"; } else if (blend == "SCREEN") { let v3: string = parser_material_to_vec3("1.0 - " + fac_var); out_col = "(float3(1.0, 1.0, 1.0) - (" + v3 + " + " + fac_var + " * (float3(1.0, 1.0, 1.0) - " + col2 + ")) * (float3(1.0, 1.0, 1.0) - " + col1 + "))"; } else if (blend == "DODGE") { - out_col = "lerp(" + col1 + ", " + col1 + " / (float3(1.0, 1.0, 1.0) - " + col2 + "), " + fac_var + ")"; + out_col = "lerp3(" + col1 + ", " + col1 + " / (float3(1.0, 1.0, 1.0) - " + col2 + "), " + fac_var + ")"; } else if (blend == "ADD") { - out_col = "lerp(" + col1 + ", " + col1 + " + " + col2 + ", " + fac_var + ")"; + out_col = "lerp3(" + col1 + ", " + col1 + " + " + col2 + ", " + fac_var + ")"; } else if (blend == "OVERLAY") { - out_col = "lerp(" + col1 + ", float3( \ + 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) \ @@ -729,35 +729,35 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) out_col = "(" + col1 + " + " + fac_var + " * (float3(2.0, 2.0, 2.0) * (" + col2 + " - float3(0.5, 0.5, 0.5))))"; } else if (blend == "DIFFERENCE") { - out_col = "lerp(" + col1 + ", abs(" + col1 + " - " + col2 + "), " + fac_var + ")"; + out_col = "lerp3(" + col1 + ", abs3(" + col1 + " - " + col2 + "), " + fac_var + ")"; } else if (blend == "SUBTRACT") { - out_col = "lerp(" + col1 + ", " + col1 + " - " + col2 + ", " + fac_var + ")"; + out_col = "lerp3(" + col1 + ", " + col1 + " - " + col2 + ", " + fac_var + ")"; } else if (blend == "DIVIDE") { let eps: f32 = 0.000001; - col2 = "max(" + col2 + ", float3(" + eps + ", " + eps + ", " + eps + "))"; + col2 = "max3(" + col2 + ", float3(" + eps + ", " + eps + ", " + eps + "))"; let v3: string = parser_material_to_vec3("(1.0 - " + fac_var + ") * " + col1 + " + " + fac_var + " * " + col1 + " / " + col2); out_col = "(" + v3 + ")"; } else if (blend == "HUE") { node_shader_add_function(parser_material_kong, str_hue_sat); - out_col = "lerp(" + col1 + ", hsv_to_rgb(float3(rgb_to_hsv(" + col2 + ").r, rgb_to_hsv(" + col1 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; + out_col = "lerp3(" + col1 + ", hsv_to_rgb(float3(rgb_to_hsv(" + col2 + ").r, rgb_to_hsv(" + col1 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; } else if (blend == "SATURATION") { node_shader_add_function(parser_material_kong, str_hue_sat); - out_col = "lerp(" + col1 + ", hsv_to_rgb(float3(rgb_to_hsv(" + col1 + ").r, rgb_to_hsv(" + col2 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; + out_col = "lerp3(" + col1 + ", hsv_to_rgb(float3(rgb_to_hsv(" + col1 + ").r, rgb_to_hsv(" + col2 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; } else if (blend == "COLOR") { node_shader_add_function(parser_material_kong, str_hue_sat); - out_col = "lerp(" + col1 + ", hsv_to_rgb(float3(rgb_to_hsv(" + col2 + ").r, rgb_to_hsv(" + col2 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; + out_col = "lerp3(" + col1 + ", hsv_to_rgb(float3(rgb_to_hsv(" + col2 + ").r, rgb_to_hsv(" + col2 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; } else if (blend == "VALUE") { node_shader_add_function(parser_material_kong, str_hue_sat); - out_col = "lerp(" + col1 + ", hsv_to_rgb(float3(rgb_to_hsv(" + col1 + ").r, rgb_to_hsv(" + col1 + ").g, rgb_to_hsv(" + col2 + ").b)), " + fac_var + ")"; + out_col = "lerp3(" + col1 + ", hsv_to_rgb(float3(rgb_to_hsv(" + col1 + ").r, rgb_to_hsv(" + col1 + ").g, rgb_to_hsv(" + col2 + ").b)), " + fac_var + ")"; } if (use_clamp) { - return "clamp(" + out_col + ", float3(0.0, 0.0, 0.0), float3(1.0, 1.0, 1.0))"; + return "clamp3(" + out_col + ", float3(0.0, 0.0, 0.0), float3(1.0, 1.0, 1.0))"; } else { return out_col; @@ -766,7 +766,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) else if (node.type == "QUANTIZE") { let strength: string = parser_material_parse_value_input(node.inputs[0]); let col: string = parser_material_parse_vector_input(node.inputs[1]); - return "(floor(100.0 * " + strength + " * " + col + ") / (100.0 * " + strength + "))"; + return "(floor3(100.0 * " + strength + " * " + col + ") / (100.0 * " + strength + "))"; } else if (node.type == "REPLACECOL") { let input_color: string = parser_material_parse_vector_input(node.inputs[0]); @@ -774,7 +774,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) let new_color: string = parser_material_parse_vector_input(node.inputs[2]); let radius: string = parser_material_parse_value_input(node.inputs[3]); let fuzziness: string = parser_material_parse_value_input(node.inputs[4]); - return "lerp(" + new_color + ", " + input_color + ", clamp((distance(" + old_color + ", " + input_color + ") - " + radius + ") / max(" + fuzziness + ", " + parser_material_eps + "), 0.0, 1.0))"; + return "lerp3(" + new_color + ", " + input_color + ", clamp((distance(" + old_color + ", " + input_color + ") - " + radius + ") / max(" + fuzziness + ", " + parser_material_eps + "), 0.0, 1.0))"; } else if (node.type == "VALTORGB") { // ColorRamp let fac: string = parser_material_parse_value_input(node.inputs[0]); @@ -820,7 +820,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) // Mix color // float f = (pos - start) * (1.0 / (finish - start)) // TODO: index_var + 1 out of bounds - return "lerp(" + cols_var + "[" + index_var + "], " + cols_var + "[" + index_var + " + 1], (" + + return "lerp3(" + cols_var + "[" + index_var + "], " + cols_var + "[" + index_var + " + 1], (" + fac_var + " - " + facs_var + "[" + index_var + "]) * (1.0 / (" + facs_var + "[" + index_var + " + 1] - " + facs_var + "[" + index_var + "]) ))"; } @@ -877,11 +877,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 + ", tex_coord).rgb"; + return "sample(texpaint" + l + ", texpaint" + l + "_sampler, 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 + ", tex_coord).rgb"; + return "sample(texpaint_nor" + l + ", texpaint_nor" + l + "_sampler, tex_coord).rgb"; } } else if (node.type == "MATERIAL") { @@ -921,7 +921,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) else if (node.type == "NEW_GEOMETRY") { if (socket == node.outputs[0]) { // Position parser_material_kong.frag_wposition = true; - return "wposition"; + return "input.wposition"; } else if (socket == node.outputs[1]) { // Normal parser_material_kong.frag_n = true; @@ -966,12 +966,12 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) // } else if (node.type == "TANGENT") { parser_material_kong.frag_wtangent = true; - return "wtangent"; + return "input.wtangent"; } else if (node.type == "TEX_COORD") { if (socket == node.outputs[0]) { // Generated - bounds parser_material_kong.frag_bposition = true; - return "bposition"; + return "input.bposition"; } else if (socket == node.outputs[1]) { // Normal parser_material_kong.frag_n = true; @@ -983,15 +983,15 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } else if (socket == node.outputs[3]) { // Object parser_material_kong.frag_mposition = true; - return "mposition"; + return "input.mposition"; } else if (socket == node.outputs[4]) { // Camera parser_material_kong.frag_vposition = true; - return "vposition"; + return "input.vposition"; } else if (socket == node.outputs[5]) { // Window parser_material_kong.frag_wvpposition = true; - return "wvpposition.xyz"; + return "input.wvpposition.xyz"; } else if (socket == node.outputs[6]) { // Reflection return "float3(0.0, 0.0, 0.0)"; @@ -1147,28 +1147,28 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) return "(" + vec2 + ".x * " + vec1 + ")"; } else if (op == "ABSOLUTE") { - return "abs(" + vec1 + ")"; + return "abs3(" + vec1 + ")"; } else if (op == "MINIMUM") { - return "min(" + vec1 + ", " + vec2 + ")"; + return "min3(" + vec1 + ", " + vec2 + ")"; } else if (op == "MAXIMUM") { - return "max(" + vec1 + ", " + vec2 + ")"; + return "max3(" + vec1 + ", " + vec2 + ")"; } else if (op == "FLOOR") { - return "floor(" + vec1 + ")"; + return "floor3(" + vec1 + ")"; } else if (op == "CEIL") { - return "ceil(" + vec1 + ")"; + return "ceil3(" + vec1 + ")"; } else if (op == "FRACTION") { - return "frac(" + vec1 + ")"; + return "frac3(" + vec1 + ")"; } else if (op == "MODULO") { - return "mod(" + vec1 + ", " + vec2 + ")"; + return "(" + vec1 + " % " + vec2 + ")"; } else if(op == "SNAP") { - return "(floor(" + vec1 + " / " + vec2 + ") * " + vec2 + ")"; + return "(floor3(" + vec1 + " / " + vec2 + ") * " + vec2 + ")"; } else if (op == "SINE") { return "sin(" + vec1 + ")"; @@ -1257,7 +1257,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, tex_coord, 0.0).r"; + return "sample_lod(texuvmap, texuvmap_sampler, tex_coord, 0.0).r"; } else if (node.type == "CAMERA") { if (socket == node.outputs[1]) { // View Z Depth @@ -1275,30 +1275,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 + ", tex_coord).a"; + return "sample(texpaint" + l + ", texpaint" + l + "_sampler, 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 + ", tex_coord).r"; + return "sample(texpaint_pack" + l + ", texpaint_pack" + l + "_sampler, 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 + ", tex_coord).g"; + return "sample(texpaint_pack" + l + ", texpaint_pack" + l + "_sampler, 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 + ", tex_coord).b"; + return "sample(texpaint_pack" + l + ", texpaint_pack" + l + "_sampler, 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 + ", tex_coord).a"; + return "sample(texpaint_pack" + l + ", texpaint_pack" + l + "_sampler, 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 + ", tex_coord).r"; + return "sample(texpaint" + l + ", texpaint" + l + "_sampler, tex_coord).r"; } } else if (node.type == "MATERIAL") { @@ -1489,10 +1489,10 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): coloring = string_replace_all(coloring, " ", "_"); let res: string = ""; if (coloring == "INTENSITY") { - res = "tex_voronoi(" + co + " * " + scale + ", texturePass(snoise256)).a"; + res = "tex_voronoi(" + co + " * " + scale + ").a"; } else { // Cells - res = "tex_voronoi(" + co + " * " + scale + ", texturePass(snoise256)).r"; + res = "tex_voronoi(" + co + " * " + scale + ").r"; } return res; } @@ -1513,7 +1513,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 + ", tex_coord).r;"); + parser_material_write(parser_material_kong, "var " + store + "_res: float = sample(" + tex_name + ", " + tex_name + "_sampler, tex_coord).r;"); return store + "_res"; } else if (node.type == "NORMAL") { @@ -1892,18 +1892,18 @@ function parser_material_texture_store(node: ui_node_t, tex: bind_tex_t, tex_nam if (parser_material_triplanar) { parser_material_write(parser_material_kong, "var " + tex_store + ": float4 = float4(0.0, 0.0, 0.0, 0.0);"); - parser_material_write(parser_material_kong, "if (tex_coord_blend.x > 0) {" + tex_store + " += sample(" + tex_name + ", " + uv_name + ".xy) * tex_coord_blend.x; }"); - parser_material_write(parser_material_kong, "if (tex_coord_blend.y > 0) {" + tex_store + " += sample(" + tex_name + ", " + uv_name + "1.xy) * tex_coord_blend.y; }"); - parser_material_write(parser_material_kong, "if (tex_coord_blend.z > 0) {" + tex_store + " += sample(" + tex_name + ", " + uv_name + "2.xy) * tex_coord_blend.z; }"); + parser_material_write(parser_material_kong, "if (tex_coord_blend.x > 0) {" + tex_store + " += sample(" + tex_name + ", " + tex_name + "_sampler, " + uv_name + ".xy) * tex_coord_blend.x; }"); + parser_material_write(parser_material_kong, "if (tex_coord_blend.y > 0) {" + tex_store + " += sample(" + tex_name + ", " + tex_name + "_sampler, " + uv_name + "1.xy) * tex_coord_blend.y; }"); + parser_material_write(parser_material_kong, "if (tex_coord_blend.z > 0) {" + tex_store + " += sample(" + tex_name + ", " + tex_name + "_sampler, " + uv_name + "2.xy) * tex_coord_blend.z; }"); } else { if (parser_material_is_frag) { - map_set(parser_material_texture_map, tex_store, "sample(" + tex_name + ", " + uv_name + ".xy)"); - parser_material_write(parser_material_kong, "var " + tex_store + ": float4 = sample(" + tex_name + ", " + uv_name + ".xy);"); + map_set(parser_material_texture_map, tex_store, "sample(" + tex_name + ", " + tex_name + "_sampler, " + uv_name + ".xy)"); + parser_material_write(parser_material_kong, "var " + tex_store + ": float4 = sample(" + tex_name + ", " + tex_name + "_sampler, " + uv_name + ".xy);"); } else { - map_set(parser_material_texture_map, tex_store, "sample_lod(" + tex_name + ", " + uv_name + ".xy, 0.0)"); - parser_material_write(parser_material_kong, "var " + tex_store + ": float4 = sample_lod(" + tex_name + ", " + uv_name + ".xy, 0.0);"); + map_set(parser_material_texture_map, tex_store, "sample_lod(" + tex_name + ", " + tex_name + "_sampler, " + uv_name + ".xy, 0.0)"); + parser_material_write(parser_material_kong, "var " + tex_store + ": float4 = sample_lod(" + tex_name + ", " + tex_name + "_sampler, " + uv_name + ".xy, 0.0);"); } if (!ends_with(tex.file, ".jpg")) { // Pre-mult alpha parser_material_write(parser_material_kong, tex_store + ".rgb *= " + tex_store + ".a;"); @@ -1913,10 +1913,10 @@ function parser_material_texture_store(node: ui_node_t, tex: bind_tex_t, tex_nam if (parser_material_transform_color_space) { // Base color socket auto-converts from sRGB to linear if (color_space == color_space_t.LINEAR && parser_material_parsing_basecolor) { // Linear to sRGB - parser_material_write(parser_material_kong, tex_store + ".rgb = pow(" + tex_store + ".rgb, float3(2.2, 2.2, 2.2));"); + parser_material_write(parser_material_kong, tex_store + ".rgb = pow3(" + tex_store + ".rgb, float3(2.2, 2.2, 2.2));"); } else if (color_space == color_space_t.SRGB && !parser_material_parsing_basecolor) { // sRGB to linear - parser_material_write(parser_material_kong, tex_store + ".rgb = pow(" + tex_store + ".rgb, float3(1.0 / 2.2, 1.0 / 2.2, 1.0 / 2.2));"); + parser_material_write(parser_material_kong, tex_store + ".rgb = pow3(" + tex_store + ".rgb, float3(1.0 / 2.2, 1.0 / 2.2, 1.0 / 2.2));"); } else if (color_space == color_space_t.DIRECTX_NORMAL_MAP) { // DirectX normal map to OpenGL normal map parser_material_write(parser_material_kong, tex_store + ".y = 1.0 - " + tex_store + ".y;"); diff --git a/base/sources/ts/strings.ts b/base/sources/ts/strings.ts index 1ef45ba6..4b2b99fa 100644 --- a/base/sources/ts/strings.ts +++ b/base/sources/ts/strings.ts @@ -55,9 +55,9 @@ fun tex_checker_f(co: float3, scale: float): float { \ // Created by inigo quilez - iq/2013 // License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License let str_tex_voronoi: string = "\ -fun tex_voronoi(x: float3, textureArg(snoise256)): float4 { \ - var p: float3 = floor(x); \ - var f: float3 = frac(x); \ +fun tex_voronoi(x: float3): float4 { \ + var p: float3 = floor3(x); \ + var f: float3 = frac3(x); \ var id: float = 0.0; \ var res: float = 100.0; \ for (var k: int = -1; k <= 1; k += 1) \ @@ -65,7 +65,7 @@ fun tex_voronoi(x: float3, textureArg(snoise256)): float4 { \ for (var i: int = -1; i <= 1; i += 1) { \ var b: float3 = float3(float(i), float(j), float(k)); \ var pb: float3 = p + b; \ - var r: float3 = float3(b) - f + sample(snoise256, (pb.xy + float2(3.0, 1.0) * pb.z + 0.5) / 256.0).xyz; \ + var r: float3 = float3(b) - f + sample(snoise256, snoise256_sampler, (pb.xy + float2(3.0, 1.0) * pb.z + 0.5) / 256.0).xyz; \ var d: float = dot(r, r); \ if (d < res) { \ id = dot(p + b, float3(1.0, 57.0, 113.0)); \ @@ -83,8 +83,8 @@ let str_tex_noise: string = "\ fun hash(n: float): float { return frac(sin(n) * 10000); } \ fun tex_noise_f(float3 x): float { \ var step: float3 = float3(110, 241, 171); \ - var i: float3 = floor(x); \ - var f: float3 = frac(x); \ + var i: float3 = floor3(x); \ + var f: float3 = frac3(x); \ var n: float = dot(i, step); \ var u: float3 = f * f * (3.0 - 2.0 * f); \ return lerp(lerp(lerp(hash(n + dot(step, float3(0, 0, 0))), hash(n + dot(step, float3(1, 0, 0))), u.x), \ @@ -118,9 +118,9 @@ fun random3(c: float3): float3 { \ fun tex_musgrave_f(p: float3): float { \ var F3: float = 0.3333333; \ var G3: float = 0.1666667; \ - var s: float3 = floor(p + dot(p, float3(F3, F3, F3))); \ + var s: float3 = floor3(p + dot(p, float3(F3, F3, F3))); \ var x: float3 = p - s + dot(s, float3(G3, G3, G3)); \ - var e: float3 = step(float3(0.0, 0.0, 0.0), x - x.yzx); \ + var e: float3 = step3(float3(0.0, 0.0, 0.0), x - x.yzx); \ var i1: float3 = e * (1.0 - e.zxy); \ var i2: float3 = 1.0 - e.zxy * (1.0 - e); \ var x1: float3 = x - i1 + G3; \ @@ -132,7 +132,7 @@ fun tex_musgrave_f(p: float3): float { \ w.y = dot(x1, x1); \ w.z = dot(x2, x2); \ w.w = dot(x3, x3); \ - w = max(0.6 - w, 0.0); \ + w = max4(0.6 - w, 0.0); \ d.x = dot(random3(s), x); \ d.y = dot(random3(s + i1), x1); \ d.z = dot(random3(s + i2), x2); \ @@ -147,13 +147,13 @@ fun tex_musgrave_f(p: float3): float { \ let str_hue_sat: string = "\ fun hsv_to_rgb(c: float3): float3 { \ var K: float4 = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); \ - var p: float3 = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); \ - return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); \ + var p: float3 = abs3(frac3(c.xxx + K.xyz) * 6.0 - K.www); \ + return c.z * lerp3(K.xxx, clamp3(p - K.xxx, 0.0, 1.0), c.y); \ } \ fun rgb_to_hsv(c: float3): float3 { \ var K: float4 = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); \ - var p: float4 = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); \ - var q: float4 = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); \ + var p: float4 = lerp4(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); \ + var q: float4 = lerp4(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); \ var d: float = q.x - min(q.w, q.y); \ var e: float = 0.0000000001; \ return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); \ @@ -163,7 +163,7 @@ fun hue_sat(col: float3, shift: float4): float3 { \ hsv.x += shift.x; \ hsv.y *= shift.y; \ hsv.z *= shift.z; \ - return lerp(hsv_to_rgb(hsv), col, shift.w); \ + return lerp3(hsv_to_rgb(hsv), col, shift.w); \ } \ "; @@ -202,16 +202,16 @@ fun tex_brick(p: float3, c1: float3, c2: float3, c3: float3): float3 { \ if (frac(p.y * 0.5) > 0.5) { p.x += 0.5; } \ var col: float = floor(p.x / (brick_size.x + (mortar_size.x * 2.0))); \ var row: float = p.y; \ - p = frac(p); \ - var b: float3 = step(p, 1.0 - mortar_size); \ + p = frac3(p); \ + var b: float3 = step3(p, 1.0 - mortar_size); \ var tint: float = min(max(tex_brick_noise((int(col) << 16) + (int(row) & 0xFFFF)), 0.0), 1.0); \ - return lerp(c3, lerp(c1, c2, tint), b.x * b.y * b.z); \ + return lerp3(c3, lerp3(c1, c2, tint), b.x * b.y * b.z); \ } \ fun tex_brick_f(p: float3): float { \ p /= float3(0.9, 0.49, 0.49) / 2; \ if (frac(p.y * 0.5) > 0.5) { p.x += 0.5; } \ - p = frac(p); \ - var b: float3 = step(p, float3(0.95, 0.9, 0.9)); \ + p = frac3(p); \ + var b: float3 = step3(p, float3(0.95, 0.9, 0.9)); \ return lerp(1.0, 0.0, b.x * b.y * b.z); \ } \ "; @@ -226,24 +226,23 @@ let str_brightcontrast: string = "\ fun brightcontrast(col: float3, bright: float, contr: float): float3 { \ var a: float = 1.0 + contr; \ var b: float = bright - contr * 0.5; \ - return max(a * col + b, 0.0); \ + return max3(a * col + b, 0.0); \ } \ "; let str_cotangent_frame: string = "\ -fun cotangent_frame(n: float3, p: float3, duv1: float2, duv2: float2): float3x3 { \ +fun cotangent_frame(n: float3, p: float3, tex_coord: float2): float3x3 { \ + var duv1: float2 = ddx2(tex_coord); \ + var duv2: float2 = ddy2(tex_coord); \ var dp1: float3 = ddx3(p); \ var dp2: float3 = ddy3(p); \ var dp2perp: float3 = cross(dp2, n); \ var dp1perp: float3 = cross(n, dp1); \ var t: float3 = dp2perp * duv1.x + dp1perp * duv2.x; \ var b: float3 = dp2perp * duv1.y + dp1perp * duv2.y; \ -var invmax: float = rsqrt(max(dot(t, t), dot(b, b))); \ + var invmax: float = rsqrt(max(dot(t, t), dot(b, b))); \ return float3x3(t * invmax, b * invmax, n); \ } \ -fun cotangent_frame(n: float3, p: float3, tex_coord: float2): float3x3 { \ - return cotangent_frame(n, p, ddx2(tex_coord), ddy2(tex_coord)); \ -} \ "; let str_transpose: string = "\ @@ -360,15 +359,15 @@ fun envmap_equirect(normal: float3, angle: float): float2 { \ "; let str_get_pos_nor_from_depth: string = "\ -fun get_pos_from_depth(uv: float2, invVP: flaot4x4, textureArg(gbufferD)): float3 { \ - var depth: float = sample_lod(gbufferD, float2(uv.x, 1.0 - uv.y), 0.0).r; \ +fun get_pos_from_depth(uv: float2, invVP: flaot4x4): float3 { \ + var depth: float = sample_lod(gbufferD, gbufferD_sampler, float2(uv.x, 1.0 - uv.y), 0.0).r; \ var wpos: float4 = float4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); \ wpos = invVP * wpos; \ return wpos.xyz / wpos.w; \ } \ -fun get_nor_from_depth(p0: float3, uv: float2, invVP: flaot4x4, tex_step: float2, textureArg(gbufferD)): float3 { \ - var p1: float3 = get_pos_from_depth(uv + float2(tex_step.x * 4.0, 0.0), invVP, texturePass(gbufferD)); \ - var p2: float3 = get_pos_from_depth(uv + float2(0.0, tex_step.y * 4.0), invVP, texturePass(gbufferD)); \ +fun get_nor_from_depth(p0: float3, uv: float2, invVP: flaot4x4, tex_step: float2): float3 { \ + var p1: float3 = get_pos_from_depth(uv + float2(tex_step.x * 4.0, 0.0), invVP); \ + var p2: float3 = get_pos_from_depth(uv + float2(0.0, tex_step.y * 4.0), invVP); \ return normalize(cross(p2 - p0, p1 - p0)); \ } \ ";