From f657e9ea0284658cae9fc14b2b765c58f6737e39 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Fri, 4 Apr 2025 23:38:01 +0200 Subject: [PATCH] kong test --- armorlab/sources/make_mesh.ts | 49 +++--- armorlab/sources/make_paint.ts | 68 ++++----- .../assets/plugins/viewport_celshade.js | 2 +- armorpaint/sources/make_bake.ts | 46 +++--- armorpaint/sources/make_blur.ts | 12 +- armorpaint/sources/make_brush.ts | 20 +-- armorpaint/sources/make_clone.ts | 4 +- armorpaint/sources/make_colorid_picker.ts | 24 +-- armorpaint/sources/make_discard.ts | 20 +-- armorpaint/sources/make_mesh.ts | 117 ++++++++------- armorpaint/sources/make_mesh_preview.ts | 26 ++-- armorpaint/sources/make_node_preview.ts | 6 +- armorpaint/sources/make_paint.ts | 96 ++++++------ armorpaint/sources/make_particle.ts | 14 +- armorpaint/sources/make_texcoord.ts | 66 ++++----- armorsculpt/sources/make_brush.ts | 10 +- armorsculpt/sources/make_mesh.ts | 81 +++++----- armorsculpt/sources/make_mesh_preview.ts | 26 ++-- armorsculpt/sources/make_sculpt.ts | 28 ++-- base/plugins/plugin_api.c | 8 +- base/sources/ts/node_shader.ts | 77 ++++++---- base/sources/ts/parser_material.ts | 140 +++++++++--------- base/sources/ts/strings.ts | 24 +-- 23 files changed, 503 insertions(+), 461 deletions(-) diff --git a/armorlab/sources/make_mesh.ts b/armorlab/sources/make_mesh.ts index 2ec4cdaa..97ab17a2 100644 --- a/armorlab/sources/make_mesh.ts +++ b/armorlab/sources/make_mesh.ts @@ -38,7 +38,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_add_out(kong, "tex_coord: float2"); kong.frag_wvpposition = true; - node_shader_add_uniform(kong, "VP: float4x4", "_view_proj_matrix"); + node_shader_add_constant(kong, "VP: float4x4", "_view_proj_matrix"); kong.vert_wposition = true; let texture_count: i32 = 0; @@ -51,10 +51,10 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_vert(kong, "wposition += wnormal * float3(height, height, height) * float3(" + displace_3 + ");"); } - node_shader_write_vert(kong, "output.pos = 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_uniform(kong, "tex_scale: float", "_tex_unpack"); - node_shader_write_vert(kong, "tex_coord = tex * " + brush_scale + " * tex_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;"); kong.frag_out = "float4[3]"; kong.frag_n = true; @@ -84,20 +84,20 @@ 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.render_mode == render_mode_t.FORWARD) { - node_shader_add_uniform(kong, "senvmap_brdf: tex2d", "$brdf.k"); - node_shader_add_uniform(kong, "senvmap_radiance: tex2d", "_envmap_radiance"); + node_shader_add_texture(kong, "senvmap_brdf", "$brdf.k"); + node_shader_add_texture(kong, "senvmap_radiance", "_envmap_radiance"); } - node_shader_add_shared_sampler(kong, "texpaint: tex2d"); - node_shader_write_frag(kong, "texpaint_sample = sample_lod_shared(texpaint" + ", tex_coord, 0.0);"); + 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_opac = texpaint_sample.a;"); node_shader_write_frag(kong, "basecol = texpaint_sample.rgb * texpaint_opac;"); - node_shader_add_shared_sampler(kong, "texpaint_nor: tex2d"); - node_shader_write_frag(kong, "texpaint_nor_sample = sample_lod_shared(texpaint_nor" + ", tex_coord, 0.0);"); + 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_add_shared_sampler(kong, "texpaint_pack: tex2d"); - node_shader_write_frag(kong, "texpaint_pack_sample = sample_lod_shared(texpaint_pack" + ", tex_coord, 0.0);"); + 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, "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);"); @@ -115,7 +115,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } kong.frag_vvec = true; - node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); + 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(TBN * n);"); @@ -136,17 +136,24 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte 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;"); - node_shader_add_uniform(kong, "envmap_num_mipmaps: int", "_envmap_num_mipmaps"); - node_shader_add_uniform(kong, "envmap_data: float4", "_envmap_data"); // angle, sin(angle), cos(angle), strength + node_shader_add_constant(kong, "envmap_num_mipmaps: int", "_envmap_num_mipmaps"); + node_shader_add_constant(kong, "envmap_data: float4", "_envmap_data"); // angle, sin(angle), cos(angle), strength node_shader_write_frag(kong, "var wreflect: float3 = reflect(-vvec, n);"); - node_shader_write_frag(kong, "var envlod: float = roughness * float(envmap_num_mipmaps);"); + 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, envmap_data.x), envlod).rgb;"); - node_shader_add_uniform(kong, "shirr: float4[7]", "_envmap_irradiance"); + node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, 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"); + node_shader_add_constant(kong, "shirr2: float4", "_envmap_irradiance2"); + node_shader_add_constant(kong, "shirr3: float4", "_envmap_irradiance3"); + node_shader_add_constant(kong, "shirr4: float4", "_envmap_irradiance4"); + node_shader_add_constant(kong, "shirr5: float4", "_envmap_irradiance5"); + node_shader_add_constant(kong, "shirr6: float4", "_envmap_irradiance6"); node_shader_add_function(kong, str_sh_irradiance); - node_shader_write_frag(kong, "var indirect: float3 = albedo * (sh_irradiance(float3(n.x * envmap_data.z - n.y * envmap_data.y, n.x * envmap_data.y + n.y * envmap_data.z, n.z), shirr) / 3.14159265);"); + node_shader_write_frag(kong, "var indirect: float3 = albedo * (sh_irradiance(float3(n.x * constants.envmap_data.z - n.y * constants.envmap_data.y, n.x * constants.envmap_data.y + n.y * constants.envmap_data.z, n.z)) / 3.14159265);"); node_shader_write_frag(kong, "indirect += prefiltered_color * (f0 * env_brdf.x + env_brdf.y) * 1.5;"); - node_shader_write_frag(kong, "indirect *= envmap_data.w * occlusion;"); + node_shader_write_frag(kong, "indirect *= constants.envmap_data.w * occlusion;"); node_shader_write_frag(kong, "output[1].rgba = float4(indirect, 1.0);"); } else { // Deferred, Pathtraced @@ -186,7 +193,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte // node_shader_write_frag(kong, "n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy);"); node_shader_write_frag(kong, "if (n.z < 0.0) { n.xy = octahedron_wrap(n.xy); }"); node_shader_write_frag(kong, "output[0].rgba = float4(n.xy, roughness, pack_f32_i16(metallic, uint(int(matid * 255.0) % 3)));"); - node_shader_write_frag(kong, "output[2].rgba = float4(0.0, 0.0, tex_coord.xy);"); + node_shader_write_frag(kong, "output[2].rgba = float4(0.0, 0.0, input.tex_coord.xy);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; diff --git a/armorlab/sources/make_paint.ts b/armorlab/sources/make_paint.ts index 4e3a11c9..db422070 100644 --- a/armorlab/sources/make_paint.ts +++ b/armorlab/sources/make_paint.ts @@ -44,16 +44,16 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad // Mangle vertices to form full screen triangle node_shader_write_vert(kong, "output.pos = float4(-1.0 + float((gl_VertexID & 1) << 2), -1.0 + float((gl_VertexID & 2) << 1), 0.0, 1.0);"); - node_shader_add_uniform(kong, "gbuffer2: tex2d"); - node_shader_add_uniform(kong, "gbuffer_size: float2", "_gbuffer_size"); - node_shader_add_uniform(kong, "inp: float4", "_input_brush"); + node_shader_add_texture(kong, "gbuffer2"); + node_shader_add_constant(kong, "gbuffer_size: float2", "_gbuffer_size"); + node_shader_add_constant(kong, "inp: float4", "_input_brush"); - node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[int2(inp.x * gbuffer_size.x, inp.y * gbuffer_size.y)].ba;"); + node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[int2(constants.inp.x * constants.gbuffer_size.x, constants.inp.y * constants.gbuffer_size.y)].ba;"); kong.frag_out = "float4[4]"; - node_shader_add_uniform(kong, "texpaint: tex2d"); - node_shader_add_uniform(kong, "texpaint_nor: tex2d"); - node_shader_add_uniform(kong, "texpaint_pack: tex2d"); + 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);"); @@ -67,29 +67,29 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write_vert(kong, "output.pos = float4(tpos, 0.0, 1.0);"); - node_shader_add_uniform(kong, "WVP: float4x4", "_world_view_proj_matrix"); + node_shader_add_constant(kong, "WVP: float4x4", "_world_view_proj_matrix"); node_shader_add_out(kong, "ndc: float4"); - node_shader_write_attrib_vert(kong, "ndc = WVP * float4(pos.xyz, 1.0);"); + node_shader_write_attrib_vert(kong, "output.ndc = constants.WVP * float4(input.pos.xyz, 1.0);"); - node_shader_write_attrib_vert(kong, "var sp: float3 = float3((ndc.xyz / ndc.w) * 0.5 + 0.5);"); + node_shader_write_attrib_vert(kong, "var sp: float3 = float3((output.ndc.xyz / output.ndc.w) * 0.5 + 0.5);"); node_shader_write_attrib_vert(kong, "sp.y = 1.0 - sp.y;"); node_shader_write_attrib_vert(kong, "sp.z -= 0.0001;"); // small bias - node_shader_add_uniform(kong, "inp: float4", "_input_brush"); - node_shader_add_uniform(kong, "inplast: float4", "_input_brush_last"); - node_shader_add_uniform(kong, "aspect_ratio: float", "_aspect_ratio_window"); + node_shader_add_constant(kong, "inp: float4", "_input_brush"); + node_shader_add_constant(kong, "inplast: float4", "_input_brush_last"); + node_shader_add_constant(kong, "aspect_ratio: float", "_aspect_ratio_window"); node_shader_write_frag(kong, "var bsp: float2 = sp.xy * 2.0 - 1.0;"); - node_shader_write_frag(kong, "bsp.x *= aspect_ratio;"); + node_shader_write_frag(kong, "bsp.x *= constants.aspect_ratio;"); node_shader_write_frag(kong, "bsp = bsp * 0.5 + 0.5;"); - node_shader_add_uniform(kong, "gbufferD: tex2d"); + node_shader_add_texture(kong, "gbufferD"); kong.frag_out = "float4[4]"; - node_shader_add_uniform(kong, "brush_radius: float", "_brush_radius"); - node_shader_add_uniform(kong, "brush_opacity: float", "_brush_opacity"); - node_shader_add_uniform(kong, "brush_hardness: float", "_brush_hardness"); + node_shader_add_constant(kong, "brush_radius: float", "_brush_radius"); + node_shader_add_constant(kong, "brush_opacity: float", "_brush_opacity"); + node_shader_add_constant(kong, "brush_hardness: float", "_brush_hardness"); if (context_raw.tool == workspace_tool_t.ERASER || context_raw.tool == workspace_tool_t.CLONE || @@ -98,18 +98,18 @@ 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, inp.xy, 0.0).r;"); + node_shader_write_frag(kong, "var depth: float = sample_lod(gbufferD, constants.inp.xy, 0.0).r;"); - node_shader_add_uniform(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);"); - node_shader_write_frag(kong, "winp = invVP * winp;"); + 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);"); + node_shader_write_frag(kong, "winp = constants.invVP * winp;"); node_shader_write_frag(kong, "winp.xyz /= winp.w;"); kong.frag_wposition = true; - 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, 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, "winplast = invVP * winplast;"); + 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;"); @@ -119,15 +119,15 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write_frag(kong, "var h: float = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);"); 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 (context_raw.tool == workspace_tool_t.CLONE || context_raw.tool == workspace_tool_t.BLUR || context_raw.tool == workspace_tool_t.SMUDGE) { - node_shader_add_uniform(kong, "gbuffer2: tex2d"); - node_shader_add_uniform(kong, "gbuffer_size: float2", "_gbuffer_size"); - node_shader_add_uniform(kong, "texpaint_undo: tex2d", "_texpaint_undo"); - node_shader_add_uniform(kong, "texpaint_nor_undo: tex2d", "_texpaint_nor_undo"); - node_shader_add_uniform(kong, "texpaint_pack_undo: tex2d", "_texpaint_pack_undo"); + node_shader_add_texture(kong, "gbuffer2"); + node_shader_add_constant(kong, "gbuffer_size: float2", "_gbuffer_size"); + node_shader_add_texture(kong, "texpaint_undo", "_texpaint_undo"); + node_shader_add_texture(kong, "texpaint_nor_undo", "_texpaint_nor_undo"); + node_shader_add_texture(kong, "texpaint_pack_undo", "_texpaint_pack_undo"); if (context_raw.tool == workspace_tool_t.CLONE) { } @@ -138,17 +138,17 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write_frag(kong, "var opacity: float = 1.0;"); node_shader_write_frag(kong, "if (opacity == 0.0) { discard; }"); - node_shader_write_frag(kong, "var str: float = clamp((brush_radius - dist) * brush_hardness * 400.0, 0.0, 1.0) * opacity;"); + node_shader_write_frag(kong, "var str: float = clamp((constants.brush_radius - dist) * constants.brush_hardness * 400.0, 0.0, 1.0) * opacity;"); // 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, "sample_tc.y = 1.0 - sample_tc.y;"); - node_shader_add_uniform(kong, "paintmask: tex2d"); + 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, "str = max(str, sample_mask);"); - node_shader_add_uniform(kong, "texpaint_undo: tex2d", "_texpaint_undo"); + 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);"); if (context_raw.tool == workspace_tool_t.ERASER) { diff --git a/armorpaint/assets/plugins/viewport_celshade.js b/armorpaint/assets/plugins/viewport_celshade.js index a6ec09bd..55543549 100644 --- a/armorpaint/assets/plugins/viewport_celshade.js +++ b/armorpaint/assets/plugins/viewport_celshade.js @@ -3,7 +3,7 @@ let plugin = plugin_create(); // Register custom viewport shader context_set_viewport_shader(function(shader) { - // node_shader_add_uniform(shader, "light_dir: float3", "_light_dir"); + // node_shader_add_constant(shader, "light_dir: float3", "_light_dir"); node_shader_write_frag(shader, " \ var light_dir: float3 = float3(0.5, 0.5, -0.5);\ float dotnl = max(dot(n, light_dir), 0.0); \ diff --git a/armorpaint/sources/make_bake.ts b/armorpaint/sources/make_bake.ts index 5abbe9ee..545a0b87 100644 --- a/armorpaint/sources/make_bake.ts +++ b/armorpaint/sources/make_bake.ts @@ -21,11 +21,11 @@ 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_uniform(kong, "texpaint_undo: tex2d", "_texpaint_undo"); // Baked high-poly normals - node_shader_write_frag(kong, "var n0: float3 = sample_lod(texpaint_undo, tex_coord, 0.0).rgb * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); + 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_add_function(kong, str_cotangent_frame); - node_shader_write_frag(kong, "fun _transpose(m: float3x3): float3x3 { return float3x3(m[0][0], m[1][0], m[2][0], m[0][1], m[1][1], m[2][1], m[0][2], m[1][2], m[2][2]); }"); - node_shader_write_frag(kong, "var invTBN: float3x3 = _transpose(cotangent_frame(n, n, tex_coord));"); + node_shader_add_function(kong, str_transpose); + node_shader_write_frag(kong, "var invTBN: float3x3 = _transpose(cotangent_frame(n, n, input.tex_coord));"); node_shader_write_frag(kong, "var res: float3 = normalize(invTBN * n0) * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5);"); node_shader_write_frag(kong, "output[0].rgba = float4(res, 1.0);"); } @@ -38,18 +38,18 @@ 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_uniform(kong, "texpaint_undo: tex2d", "_texpaint_undo"); // Baked high-poly positions - node_shader_write_frag(kong, "var wpos0: float3 = sample_lod(texpaint_undo, tex_coord, 0.0).rgb * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); + 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, "output[0].rgba = float4(res, res, res, 1.0);"); } else if (context_raw.bake_type == bake_type_t.DERIVATIVE) { - node_shader_add_uniform(kong, "texpaint_undo: tex2d", "_texpaint_undo"); // Baked height - node_shader_write_frag(kong, "var tex_dx: float2 = ddx2(tex_coord);"); - node_shader_write_frag(kong, "var tex_dy: float2 = ddy2(tex_coord);"); - node_shader_write_frag(kong, "var h0: float = sample_lod(texpaint_undo, tex_coord, 0.0).r * 100;"); - node_shader_write_frag(kong, "var h1: float = sample_lod(texpaint_undo, tex_coord + tex_dx, 0.0).r * 100;"); - node_shader_write_frag(kong, "var h2: float = sample_lod(texpaint_undo, tex_coord + tex_dy, 0.0).r * 100;"); + 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, "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) { @@ -60,19 +60,19 @@ function make_bake_run(con: node_shader_context_t, kong: node_shader_t) { } } else if (context_raw.bake_type == bake_type_t.TEXCOORD) { - node_shader_write_frag(kong, "output[0].rgba = float4(tex_coord.xy, 0.0, 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(input.tex_coord.xy, 0.0, 1.0);"); } else if (context_raw.bake_type == bake_type_t.MATERIALID) { - node_shader_add_uniform(kong, "texpaint_nor_undo: tex2d", "_texpaint_nor_undo"); - node_shader_write_frag(kong, "var sample_matid: float = sample_lod(texpaint_nor_undo, tex_coord, 0.0).a + 1.0 / 255.0;"); + 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 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);"); node_shader_write_frag(kong, "output[0].rgba = float4(matid_r, matid_g, matid_b, 1.0);"); } else if (context_raw.bake_type == bake_type_t.OBJECTID) { - node_shader_add_uniform(kong, "object_id: float", "_object_id"); - node_shader_write_frag(kong, "var obid: float = object_id + 1.0 / 255.0;"); + node_shader_add_constant(kong, "object_id: float", "_object_id"); + node_shader_write_frag(kong, "var obid: float = constants.object_id + 1.0 / 255.0;"); node_shader_write_frag(kong, "var id_r: float = frac(sin(dot(float2(obid, obid * 20.0), float2(12.9898, 78.233))) * 43758.5453);"); node_shader_write_frag(kong, "var id_g: float = frac(sin(dot(float2(obid * 20.0, obid), float2(12.9898, 78.233))) * 43758.5453);"); node_shader_write_frag(kong, "var id_b: float = frac(sin(dot(float2(obid, obid * 40.0), float2(12.9898, 78.233))) * 43758.5453);"); @@ -92,14 +92,14 @@ function make_bake_run(con: node_shader_context_t, kong: node_shader_t) { function make_bake_position_normal(kong: node_shader_t) { node_shader_add_out(kong, "position: float3"); node_shader_add_out(kong, "normal: float3"); - node_shader_add_uniform(kong, "W: float4x4", "_world_matrix"); - node_shader_write_vert(kong, "position = float4(W * float4(pos.xyz, 1.0)).xyz;"); - node_shader_write_vert(kong, "normal = float3(nor.xy, pos.w);"); - node_shader_write_vert(kong, "var tpos: float2 = float2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);"); + node_shader_add_constant(kong, "W: float4x4", "_world_matrix"); + node_shader_write_vert(kong, "output.position = float4(constants.W * float4(input.pos.xyz, 1.0)).xyz;"); + node_shader_write_vert(kong, "output.normal = float3(input.nor.xy, input.pos.w);"); + node_shader_write_vert(kong, "var tpos: float2 = float2(input.tex.x * 2.0 - 1.0, (1.0 - input.tex.y) * 2.0 - 1.0);"); node_shader_write_vert(kong, "output.pos = float4(tpos, 0.0, 1.0);"); kong.frag_out = "float4[2]"; - node_shader_write_frag(kong, "output[0].rgba = float4(position, 1.0);"); - node_shader_write_frag(kong, "output[1].rgba = float4(normal, 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(input.position, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(input.normal, 1.0);"); } function make_bake_set_color_writes(con_paint: node_shader_context_t) { diff --git a/armorpaint/sources/make_blur.ts b/armorpaint/sources/make_blur.ts index f30889d3..42f3fbe5 100644 --- a/armorpaint/sources/make_blur.ts +++ b/armorpaint/sources/make_blur.ts @@ -1,6 +1,6 @@ function make_blur_run(kong: node_shader_t) { - node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[int2(sp.x * gbuffer_size.x, sp.y * gbuffer_size.y)].ba;"); + node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[int2(sp.x * constants.gbuffer_size.x, sp.y * constants.gbuffer_size.y)].ba;"); node_shader_write_frag(kong, "var basecol: float3 = float3(0.0, 0.0, 0.0);"); node_shader_write_frag(kong, "var roughness: float = 0.0;"); @@ -23,14 +23,14 @@ function make_blur_run(kong: node_shader_t) { node_shader_write_frag(kong, "var subs: float = 0.0;"); } - node_shader_add_uniform(kong, "texpaint_size: float2", "_texpaint_size"); - node_shader_write_frag(kong, "var blur_step: float = 1.0 / texpaint_size.x;"); + node_shader_add_constant(kong, "texpaint_size: float2", "_texpaint_size"); + node_shader_write_frag(kong, "var blur_step: float = 1.0 / constants.texpaint_size.x;"); if (context_raw.tool == workspace_tool_t.SMUDGE) { node_shader_write_frag(kong, "const blur_weight: float[7] = {1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0};"); - node_shader_add_uniform(kong, "brush_direction: float3", "_brush_direction"); - node_shader_write_frag(kong, "var blur_direction: float2 = brush_direction.yx;"); + node_shader_add_constant(kong, "brush_direction: float3", "_brush_direction"); + 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)) * gbuffer_size.x, (sp.y + blur_direction.y * blur_step * float(i)) * gbuffer_size.y)].ba;"); + 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, "opacity += texpaint_sample.a * blur_weight[i];"); node_shader_write_frag(kong, "basecol += texpaint_sample.rgb * blur_weight[i];"); diff --git a/armorpaint/sources/make_brush.ts b/armorpaint/sources/make_brush.ts index 0346998f..8e39953c 100644 --- a/armorpaint/sources/make_brush.ts +++ b/armorpaint/sources/make_brush.ts @@ -14,18 +14,18 @@ function make_brush_run(kong: node_shader_t) { } 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, constants.inp.xy, 0.0).r;"); - node_shader_add_uniform(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);"); - node_shader_write_frag(kong, "winp = invVP * winp;"); + 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);"); + node_shader_write_frag(kong, "winp = constants.invVP * winp;"); node_shader_write_frag(kong, "winp.xyz /= winp.w;"); kong.frag_wposition = true; if (config_raw.brush_angle_reject || context_raw.xray) { node_shader_add_function(kong, str_octahedron_wrap); - node_shader_add_uniform(kong, "gbuffer0: tex2d"); - node_shader_write_frag(kong, "var g0: float2 = sample_lod(gbuffer0, inp.xy, 0.0).rg;"); + 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 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);"); @@ -44,7 +44,7 @@ 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 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, "winplast = invVP * winplast;"); + 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;"); @@ -64,12 +64,12 @@ function make_brush_run(kong: node_shader_t) { } } else { // !brush3d - node_shader_write_frag(kong, "var binp: float2 = inp.xy * 2.0 - 1.0;"); - node_shader_write_frag(kong, "binp.x *= aspect_ratio;"); + node_shader_write_frag(kong, "var binp: float2 = constants.inp.xy * 2.0 - 1.0;"); + 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, "binplast.x *= aspect_ratio;"); + node_shader_write_frag(kong, "binplast.x *= constants.aspect_ratio;"); node_shader_write_frag(kong, "binplast = binplast * 0.5 + 0.5;"); node_shader_write_frag(kong, "var pa: float2 = bsp.xy - binp.xy;"); diff --git a/armorpaint/sources/make_clone.ts b/armorpaint/sources/make_clone.ts index 24e80a8c..022d57b8 100644 --- a/armorpaint/sources/make_clone.ts +++ b/armorpaint/sources/make_clone.ts @@ -1,7 +1,7 @@ function make_clone_run(kong: node_shader_t) { - node_shader_add_uniform(kong, "clone_delta: float2", "_clone_delta"); - node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[int2((sp.xy + clone_delta) * gbuffer_size)].ba;"); + 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"; diff --git a/armorpaint/sources/make_colorid_picker.ts b/armorpaint/sources/make_colorid_picker.ts index a0307f9e..05799d0e 100644 --- a/armorpaint/sources/make_colorid_picker.ts +++ b/armorpaint/sources/make_colorid_picker.ts @@ -3,32 +3,32 @@ function make_colorid_picker_run(kong: node_shader_t) { // Mangle vertices to form full screen triangle node_shader_write_vert(kong, "output.pos = float4(-1.0 + float((gl_VertexID & 1) << 2), -1.0 + float((gl_VertexID & 2) << 1), 0.0, 1.0);"); - node_shader_add_uniform(kong, "gbuffer2: tex2d"); - node_shader_add_uniform(kong, "gbuffer_size: float2", "_gbuffer_size"); - node_shader_add_uniform(kong, "inp: float4", "_input_brush"); + node_shader_add_texture(kong, "gbuffer2"); + node_shader_add_constant(kong, "gbuffer_size: float2", "_gbuffer_size"); + node_shader_add_constant(kong, "inp: float4", "_input_brush"); - node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[int2(inp.x * gbuffer_size.x, inp.y * gbuffer_size.y)].ba;"); + node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[int2(constants.inp.x * constants.gbuffer_size.x, constants.inp.y * constants.gbuffer_size.y)].ba;"); if (context_raw.tool == workspace_tool_t.COLORID) { kong.frag_out = "float4"; - node_shader_add_uniform(kong, "texcolorid: tex2d", "_texcolorid"); + 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, "output = float4(idcol, 1.0);"); } else if (context_raw.tool == workspace_tool_t.PICKER || context_raw.tool == workspace_tool_t.MATERIAL) { if (context_raw.pick_pos_nor_tex) { kong.frag_out = "float4[2]"; - node_shader_add_uniform(kong, "gbufferD: tex2d"); - node_shader_add_uniform(kong, "invVP: float4x4", "_inv_view_proj_matrix"); + 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(inp.x, 1.0 - inp.y), invVP, texturePass(gbufferD)), tex_coord_inp.x);"); - node_shader_write_frag(kong, "output[1].rgba = float4(get_nor_from_depth(output[0].rgb, float2(inp.x, 1.0 - inp.y), invVP, float2(1.0, 1.0) / 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, 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);"); } else { kong.frag_out = "float4[4]"; - node_shader_add_uniform(kong, "texpaint: tex2d"); - node_shader_add_uniform(kong, "texpaint_nor: tex2d"); - node_shader_add_uniform(kong, "texpaint_pack: tex2d"); + 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);"); diff --git a/armorpaint/sources/make_discard.ts b/armorpaint/sources/make_discard.ts index fe617f7d..d21658eb 100644 --- a/armorpaint/sources/make_discard.ts +++ b/armorpaint/sources/make_discard.ts @@ -1,7 +1,7 @@ function make_discard_color_id(kong: node_shader_t) { - node_shader_add_uniform(kong, "texpaint_colorid: tex2d"); // 1x1 picker - node_shader_add_uniform(kong, "texcolorid: tex2d", "_texcolorid"); // color map + 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, "if (any(colorid_c1 != colorid_c2)) { discard };"); @@ -9,19 +9,19 @@ function make_discard_color_id(kong: node_shader_t) { } function make_discard_face(kong: node_shader_t) { - node_shader_add_uniform(kong, "gbuffer2: tex2d"); - node_shader_add_uniform(kong, "textrianglemap: tex2d", "_textrianglemap"); - node_shader_add_uniform(kong, "textrianglemap_size: float2", "_texpaint_size"); - node_shader_add_uniform(kong, "gbuffer_size: float2", "_gbuffer_size"); - node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[int2(inp.x * gbuffer_size.x, inp.y * gbuffer_size.y)].ba;"); - node_shader_write_frag(kong, "var face_c1: float4 = textrianglemap[int2(tex_coord_inp * textrianglemap_size)];"); + node_shader_add_texture(kong, "gbuffer2"); + node_shader_add_texture(kong, "textrianglemap", "_textrianglemap"); + node_shader_add_constant(kong, "textrianglemap_size: float2", "_texpaint_size"); + 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, "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_uniform(kong, "texuvislandmap: tex2d", "_texuvislandmap"); + 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; }"); } @@ -29,7 +29,7 @@ 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, "picker_sample_tc.y = 1.0 - picker_sample_tc.y;"); - node_shader_add_uniform(kong, "texpaint_nor_undo: tex2d", "_texpaint_nor_undo"); + 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; }"); } diff --git a/armorpaint/sources/make_mesh.ts b/armorpaint/sources/make_mesh.ts index bd8c0743..f3ce175f 100644 --- a/armorpaint/sources/make_mesh.ts +++ b/armorpaint/sources/make_mesh.ts @@ -35,7 +35,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_add_out(kong, "tex_coord: float2"); kong.frag_wvpposition = true; - node_shader_add_uniform(kong, "VP: float4x4", "_view_proj_matrix"); + node_shader_add_constant(kong, "VP: float4x4", "_view_proj_matrix"); kong.vert_wposition = true; let texture_count: i32 = 0; @@ -54,8 +54,8 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } num_layers++; texture_count++; - node_shader_add_uniform(kong, "texpaint_pack_vert" + l.id + ": tex2d", "_texpaint_pack_vert" + l.id); - node_shader_write_vert(kong, "height += sample_lod(texpaint_pack_vert" + l.id + ", tex, 0.0).a;"); + 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;"); let masks: slot_layer_t[] = slot_layer_get_masks(l); if (masks != null) { for (let i: i32 = 0; i < masks.length; ++i) { @@ -64,16 +64,16 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte continue; } texture_count++; - node_shader_add_uniform(kong, "texpaint_vert" + m.id + ": tex2d", "_texpaint_vert" + m.id); - node_shader_write_vert(kong, "height *= sample_lod(texpaint_vert" + m.id + ", tex, 0.0).r;"); + 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, "wposition += wnormal * float3(height, height, height) * float3(" + displace_strength + ", " + displace_strength + ", " + displace_strength + ");"); } - node_shader_write_vert(kong, "output.pos = VP * float4(wposition.xyz, 1.0);"); - node_shader_write_vert(kong, "tex_coord = tex;"); + node_shader_write_vert(kong, "output.pos = constants.VP * float4(wposition.xyz, 1.0);"); + node_shader_write_vert(kong, "output.tex_coord = input.tex;"); kong.frag_out = "float4[3]"; kong.frag_n = true; @@ -81,18 +81,18 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.tool == workspace_tool_t.COLORID) { texture_count++; - node_shader_add_uniform(kong, "texcolorid: tex2d", "_texcolorid"); + 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, tex_coord, 0.0).rgb, float3(2.2, 2.2, 2.2));"); + 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, "output[1].rgba = float4(idcol.rgb, 1.0);"); // occ } else { node_shader_add_function(kong, str_octahedron_wrap); node_shader_add_function(kong, str_cotangent_frame); if (layer_pass > 0) { - node_shader_add_uniform(kong, "gbuffer0: tex2d"); - node_shader_add_uniform(kong, "gbuffer1: tex2d"); - node_shader_add_uniform(kong, "gbuffer2: tex2d"); + 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, "fragcoord.y = 1.0 - fragcoord.y;"); node_shader_write_frag(kong, "var gbuffer0_sample: float4 = sample_lod(gbuffer0, fragcoord, 0.0);"); @@ -131,7 +131,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.draw_wireframe) { texture_count++; - node_shader_add_uniform(kong, "texuvmap: tex2d", "_texuvmap"); + node_shader_add_texture(kong, "texuvmap", "_texuvmap"); } if (context_raw.viewport_mode == viewport_mode_t.MASK && slot_layer_get_masks(context_raw.layer) != null) { @@ -142,14 +142,14 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } texture_count++; let index: i32 = array_index_of(project_layers, m); - node_shader_add_uniform(kong, "texpaint_view_mask: tex2d" + m.id, "_texpaint" + index); + node_shader_add_texture(kong, "texpaint_view_mask" + m.id, "_texpaint" + index); } } if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) { texture_count += 4; - node_shader_add_uniform(kong, "senvmap_brdf: tex2d", "$brdf.k"); - node_shader_add_uniform(kong, "senvmap_radiance: tex2d", "_envmap_radiance"); + node_shader_add_texture(kong, "senvmap_brdf", "$brdf.k"); + node_shader_add_texture(kong, "senvmap_radiance", "_envmap_radiance"); } // Get layers for this pass @@ -186,7 +186,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte for (let i: i32 = 0; i < layers.length; ++i) { let l: slot_layer_t = layers[i]; if (slot_layer_get_object_mask(l) > 0) { - node_shader_add_uniform(kong, "uid: int", "_uid"); + node_shader_add_constant(kong, "uid: int", "_uid"); if (slot_layer_get_object_mask(l) > project_paint_objects.length) { // Atlas let visibles: mesh_object_t[] = project_get_atlas_objects(slot_layer_get_object_mask(l)); node_shader_write_frag(kong, "if ("); @@ -195,18 +195,18 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, " || "); } let uid: i32 = visibles[i].base.uid; - node_shader_write_frag(kong, uid + " == uid"); + node_shader_write_frag(kong, uid + " == constants.uid"); } node_shader_write_frag(kong, ") {"); } else { // Object mask let uid: i32 = project_paint_objects[slot_layer_get_object_mask(l) - 1].base.uid; - node_shader_write_frag(kong, "if (" + uid + " == uid) {"); + node_shader_write_frag(kong, "if (" + uid + " == constants.uid) {"); } } - node_shader_add_shared_sampler(kong, "texpaint" + l.id + ": tex2d"); - node_shader_write_frag(kong, "texpaint_sample = sample_lod_shared(texpaint" + l.id + ", tex_coord, 0.0);"); + 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_opac = texpaint_sample.a;"); // ///if (arm_direct3d12 || arm_vulkan) // if (raw.viewport_mode == viewport_mode_t.LIT) { @@ -232,9 +232,9 @@ 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 + ": tex2d"); + 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 + ", tex_coord, 0.0).r;"); + node_shader_write_frag(kong, "var texpaint_mask_sample" + m.id + ": float = sample_lod_shared(texpaint" + m.id + ", 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 + ";"); @@ -259,8 +259,8 @@ 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 + ": tex2d"); - node_shader_write_frag(kong, "texpaint_nor_sample = sample_lod_shared(texpaint_nor" + l.id + ", tex_coord, 0.0);"); + 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);"); if (make_material_emis_used) { node_shader_write_frag(kong, "if (texpaint_opac > 0.0) { matid = texpaint_nor_sample.a; }"); @@ -282,8 +282,8 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (l.paint_occ || l.paint_rough || l.paint_met || (l.paint_height && make_material_height_used)) { - node_shader_add_shared_sampler(kong, "texpaint_pack" + l.id + ": tex2d"); - node_shader_write_frag(kong, "texpaint_pack_sample = sample_lod_shared(texpaint_pack" + l.id + ", tex_coord, 0.0);"); + 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);"); if (l.paint_occ) { node_shader_write_frag(kong, "occlusion = clamp(occlusion, texpaint_pack_sample.r, texpaint_opac);"); @@ -298,12 +298,12 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte let assign: string = l.paint_height_blend ? "+=" : "="; node_shader_write_frag(kong, "height " + assign + " texpaint_pack_sample.a * texpaint_opac;"); node_shader_write_frag(kong, "{"); - node_shader_add_uniform(kong, "texpaint_size: float2", "_texpaint_size"); - node_shader_write_frag(kong, "var tex_step: float = 1.0 / texpaint_size.x;"); - node_shader_write_frag(kong, "height0 " + assign + " sample_lod_shared(texpaint_pack" + l.id + ", float2(tex_coord.x - tex_step, tex_coord.y), 0.0).a * texpaint_opac;"); - node_shader_write_frag(kong, "height1 " + assign + " sample_lod_shared(texpaint_pack" + l.id + ", float2(tex_coord.x + tex_step, tex_coord.y), 0.0).a * texpaint_opac;"); - node_shader_write_frag(kong, "height2 " + assign + " sample_lod_shared(texpaint_pack" + l.id + ", float2(tex_coord.x, 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(tex_coord.x, tex_coord.y + tex_step), 0.0).a * texpaint_opac;"); + 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, "}"); } } @@ -314,17 +314,17 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (last_pass && context_raw.draw_texels) { - node_shader_add_uniform(kong, "texpaint_size: float2", "_texpaint_size"); - node_shader_write_frag(kong, "var texel0: float2 = tex_coord * texpaint_size * 0.01;"); - node_shader_write_frag(kong, "var texel1: float2 = tex_coord * texpaint_size * 0.1;"); - node_shader_write_frag(kong, "var texel2: float2 = tex_coord * texpaint_size;"); + node_shader_add_constant(kong, "texpaint_size: float2", "_texpaint_size"); + node_shader_write_frag(kong, "var texel0: float2 = input.tex_coord * constants.texpaint_size * 0.01;"); + node_shader_write_frag(kong, "var texel1: float2 = input.tex_coord * constants.texpaint_size * 0.1;"); + node_shader_write_frag(kong, "var texel2: float2 = input.tex_coord * constants.texpaint_size;"); node_shader_write_frag(kong, "basecol *= max(float((int(texel0.x) % 2.0) == (int(texel0.y) % 2.0)), 0.9);"); node_shader_write_frag(kong, "basecol *= max(float((int(texel1.x) % 2.0) == (int(texel1.y) % 2.0)), 0.9);"); node_shader_write_frag(kong, "basecol *= max(float((int(texel2.x) % 2.0) == (int(texel2.y) % 2.0)), 0.9);"); } if (last_pass && context_raw.draw_wireframe) { - node_shader_write_frag(kong, "var wireframe: float = sample_lod(texuvmap, tex_coord, 0.0).a;"); + node_shader_write_frag(kong, "var wireframe: float = sample_lod(texuvmap, 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);"); } @@ -351,7 +351,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } kong.frag_vvec = true; - node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); + 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));"); @@ -371,17 +371,24 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte 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;"); - node_shader_add_uniform(kong, "envmap_num_mipmaps: int", "_envmap_num_mipmaps"); - node_shader_add_uniform(kong, "envmap_data: float4", "_envmap_data"); // angle, sin(angle), cos(angle), strength + node_shader_add_constant(kong, "envmap_num_mipmaps: int", "_envmap_num_mipmaps"); + node_shader_add_constant(kong, "envmap_data: float4", "_envmap_data"); // angle, sin(angle), cos(angle), strength node_shader_write_frag(kong, "var wreflect: float3 = reflect(-vvec, n);"); - node_shader_write_frag(kong, "var envlod: float = roughness * float(envmap_num_mipmaps);"); + 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, envmap_data.x), envlod).rgb;"); - node_shader_add_uniform(kong, "shirr: float4[7]", "_envmap_irradiance"); + node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, 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"); + node_shader_add_constant(kong, "shirr2: float4", "_envmap_irradiance2"); + node_shader_add_constant(kong, "shirr3: float4", "_envmap_irradiance3"); + node_shader_add_constant(kong, "shirr4: float4", "_envmap_irradiance4"); + node_shader_add_constant(kong, "shirr5: float4", "_envmap_irradiance5"); + node_shader_add_constant(kong, "shirr6: float4", "_envmap_irradiance6"); node_shader_add_function(kong, str_sh_irradiance); - node_shader_write_frag(kong, "var indirect: float3 = albedo * (sh_irradiance(float3(n.x * envmap_data.z - n.y * envmap_data.y, n.x * envmap_data.y + n.y * envmap_data.z, n.z), shirr) / 3.14159265);"); + node_shader_write_frag(kong, "var indirect: float3 = albedo * (sh_irradiance(float3(n.x * constants.envmap_data.z - n.y * constants.envmap_data.y, n.x * constants.envmap_data.y + n.y * constants.envmap_data.z, n.z)) / 3.14159265);"); node_shader_write_frag(kong, "indirect += prefiltered_color * (f0 * env_brdf.x + env_brdf.y) * 1.5;"); - node_shader_write_frag(kong, "indirect *= envmap_data.w * occlusion;"); + node_shader_write_frag(kong, "indirect *= constants.envmap_data.w * occlusion;"); node_shader_write_frag(kong, "output[1].rgba = float4(indirect, 1.0);"); } else { // Deferred, Pathtraced @@ -421,7 +428,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "output[1].rgba = float4(float3(subs, subs, subs), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.TEXCOORD) { - node_shader_write_frag(kong, "output[1].rgba = float4(tex_coord, 0.0, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(input.tex_coord, 0.0, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) { kong.frag_nattr = true; @@ -429,17 +436,17 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } else if (context_raw.viewport_mode == viewport_mode_t.MATERIAL_ID) { let id: i32 = context_raw.layer.id; - node_shader_add_shared_sampler(kong, "texpaint_nor" + id + ": tex2d"); - node_shader_add_uniform(kong, "texpaint_size: float2", "_texpaint_size"); - node_shader_write_frag(kong, "var sample_matid: float = texpaint_nor" + id + "[int2(tex_coord * texpaint_size)].a + 1.0 / 255.0;"); + node_shader_add_shared_sampler(kong, "texpaint_nor" + id); + node_shader_add_constant(kong, "texpaint_size: float2", "_texpaint_size"); + node_shader_write_frag(kong, "var sample_matid: float = texpaint_nor" + id + "[int2(input.tex_coord * constants.texpaint_size)].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);"); node_shader_write_frag(kong, "output[1].rgba = float4(matid_r, matid_g, matid_b, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_ID) { - node_shader_add_uniform(kong, "float object_id", "_object_id"); - node_shader_write_frag(kong, "float obid = object_id + 1.0 / 255.0;"); + node_shader_add_constant(kong, "float object_id", "_object_id"); + node_shader_write_frag(kong, "float obid = constants.object_id + 1.0 / 255.0;"); node_shader_write_frag(kong, "float id_r = frac(sin(dot(float2(obid, obid * 20.0), float2(12.9898, 78.233))) * 43758.5453);"); node_shader_write_frag(kong, "float id_g = frac(sin(dot(float2(obid * 20.0, obid), float2(12.9898, 78.233))) * 43758.5453);"); node_shader_write_frag(kong, "float id_b = frac(sin(dot(float2(obid, obid * 40.0), float2(12.9898, 78.233))) * 43758.5453);"); @@ -448,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 + ", tex_coord, 0.0).r;"); + node_shader_write_frag(kong, "var mask_view: float = sample_lod_shared(texpaint" + id + ", input.tex_coord, 0.0).r;"); } else { node_shader_write_frag(kong, "var mask_view: float = 0.0;"); @@ -457,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 + ", tex_coord, 0.0).r;"); + 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;"); 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 + ";"); @@ -479,7 +486,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "output[0].rgba = float4(n.xy, roughness, pack_f32_i16(metallic, uint(int(matid * 255.0) % 3)));"); } - node_shader_write_frag(kong, "output[2].rgba = float4(0.0, 0.0, tex_coord.xy);"); + node_shader_write_frag(kong, "output[2].rgba = float4(0.0, 0.0, input.tex_coord.xy);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; diff --git a/armorpaint/sources/make_mesh_preview.ts b/armorpaint/sources/make_mesh_preview.ts index 15ca38a8..34af2aa3 100644 --- a/armorpaint/sources/make_mesh_preview.ts +++ b/armorpaint/sources/make_mesh_preview.ts @@ -29,7 +29,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no let kong: node_shader_t = node_shader_context_make_kong(con_mesh); - let pos: string = "pos"; + let pos: string = "input.pos"; ///if arm_skin let skin: bool = mesh_data_get_vertex_array(context_raw.paint_object.data, "bone") != null; @@ -38,26 +38,26 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no node_shader_context_add_elem(con_mesh, "bone", "short4norm"); node_shader_context_add_elem(con_mesh, "weight", "short4norm"); node_shader_add_function(kong, str_get_skinning_dual_quat); - node_shader_add_uniform(kong, "skin_bones float4[128 * 2]", "_skin_bones"); - node_shader_add_uniform(kong, "pos_unpack: float", "_pos_unpack"); + node_shader_add_constant(kong, "skin_bones float4[128 * 2]", "_skin_bones"); + node_shader_add_constant(kong, "pos_unpack: float", "_pos_unpack"); node_shader_write_attrib_vert(kong, "var skin_a: float4;"); node_shader_write_attrib_vert(kong, "var skin_b: float4;"); node_shader_write_attrib_vert(kong, "get_skinning_dual_quat(int4(bone * 32767), weight, skin_a, skin_b);"); - node_shader_write_attrib_vert(kong, "var spos: float3 = pos.xyz;"); - node_shader_write_attrib_vert(kong, "spos.xyz *= pos_unpack;"); + node_shader_write_attrib_vert(kong, "var spos: float3 = input.pos.xyz;"); + node_shader_write_attrib_vert(kong, "spos.xyz *= constants.pos_unpack;"); node_shader_write_attrib_vert(kong, "spos.xyz += 2.0 * cross(skin_a.xyz, cross(skin_a.xyz, spos.xyz) + skin_a.w * spos.xyz);"); node_shader_write_attrib_vert(kong, "spos.xyz += 2.0 * (skin_a.w * skin_b.xyz - skin_b.w * skin_a.xyz + cross(skin_a.xyz, skin_b.xyz));"); - node_shader_write_attrib_vert(kong, "spos.xyz /= pos_unpack;"); + node_shader_write_attrib_vert(kong, "spos.xyz /= constants.pos_unpack;"); } ///end - node_shader_add_uniform(kong, "WVP: float4x4", "_world_view_proj_matrix"); - node_shader_write_attrib_vert(kong, "output.pos = WVP * float4(" + pos + ".xyz, 1.0);"); + node_shader_add_constant(kong, "WVP: float4x4", "_world_view_proj_matrix"); + node_shader_write_attrib_vert(kong, "output.pos = constants.WVP * float4(" + pos + ".xyz, 1.0);"); let sc: f32 = context_raw.brush_scale * context_raw.brush_nodes_scale; let brush_scale: string = sc + ""; node_shader_add_out(kong, "tex_coord: float2"); - node_shader_write_attrib_vert(kong, "tex_coord = tex * float(" + brush_scale + ");"); + node_shader_write_attrib_vert(kong, "output.tex_coord = input.tex * float(" + brush_scale + ");"); let decal: bool = context_raw.decal_preview; parser_material_sample_keep_aspect = decal; @@ -85,8 +85,8 @@ 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_uniform(kong, "textexttool: tex2d", "_textexttool"); - node_shader_write_frag(kong, "opacity *= sample_lod(textexttool, tex_coord / float(" + brush_scale + "), 0.0).r;"); + 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;"); } } if (decal) { @@ -118,7 +118,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no } else { kong.frag_vvec = true; - node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); + 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(TBN * n);"); @@ -143,7 +143,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no ///if arm_skin if (skin) { - node_shader_write_vert(kong, "wnormal = normalize(N * float3(nor.xy, pos.w) + 2.0 * cross(skin_a.xyz, cross(skin_a.xyz, float3(nor.xy, pos.w)) + skin_a.w * float3(nor.xy, pos.w)));"); + node_shader_write_vert(kong, "wnormal = normalize(constants.N * float3(input.nor.xy, input.pos.w) + 2.0 * cross(skin_a.xyz, cross(skin_a.xyz, float3(input.nor.xy, input.pos.w)) + skin_a.w * float3(input.nor.xy, input.pos.w)));"); } ///end diff --git a/armorpaint/sources/make_node_preview.ts b/armorpaint/sources/make_node_preview.ts index f299b806..754032ed 100644 --- a/armorpaint/sources/make_node_preview.ts +++ b/armorpaint/sources/make_node_preview.ts @@ -32,11 +32,11 @@ function make_node_preview_run(data: material_t, matcon: material_context_t, nod let kong: node_shader_t = node_shader_context_make_kong(con_mesh); - node_shader_write_attrib_vert(kong, "output.pos = float4(pos.xy * 3.0, 0.0, 1.0);"); // Pos unpack + node_shader_write_attrib_vert(kong, "output.pos = float4(input.pos.xy * 3.0, 0.0, 1.0);"); // Pos unpack node_shader_write_attrib_vert(kong, "const madd: float2 = float2(0.5, 0.5);"); node_shader_add_out(kong, "tex_coord: float2"); - node_shader_write_attrib_vert(kong, "tex_coord = output.pos.xy * madd + madd;"); - node_shader_write_attrib_vert(kong, "tex_coord.y = 1.0 - tex_coord.y;"); + node_shader_write_attrib_vert(kong, "output.tex_coord = output.pos.xy * madd + madd;"); + node_shader_write_attrib_vert(kong, "output.tex_coord.y = 1.0 - output.tex_coord.y;"); parser_material_init(); parser_material_canvases = [context_raw.material.canvas]; diff --git a/armorpaint/sources/make_paint.ts b/armorpaint/sources/make_paint.ts index 6d5be742..11c95abf 100644 --- a/armorpaint/sources/make_paint.ts +++ b/armorpaint/sources/make_paint.ts @@ -83,22 +83,22 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad let uv_island_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.UV_ISLAND; let decal: bool = context_is_decal(); - node_shader_write_vert(kong, "var tpos: float2 = float2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);"); + node_shader_write_vert(kong, "var tpos: float2 = float2(input.tex.x * 2.0 - 1.0, (1.0 - input.tex.y) * 2.0 - 1.0);"); node_shader_write_vert(kong, "output.pos = float4(tpos, 0.0, 1.0);"); let decal_layer: bool = context_raw.layer.fill_layer != null && context_raw.layer.uv_type == uv_type_t.PROJECT; if (decal_layer) { - node_shader_add_uniform(kong, "WVP: float4x4", "_decal_layer_matrix"); + node_shader_add_constant(kong, "WVP: float4x4", "_decal_layer_matrix"); } else { - node_shader_add_uniform(kong, "WVP: float4x4", "_world_view_proj_matrix"); + node_shader_add_constant(kong, "WVP: float4x4", "_world_view_proj_matrix"); } node_shader_add_out(kong, "ndc: float4"); - node_shader_write_attrib_vert(kong, "ndc = WVP * float4(pos.xyz, 1.0);"); + node_shader_write_attrib_vert(kong, "output.ndc = constants.WVP * float4(input.pos.xyz, 1.0);"); - node_shader_write_attrib_frag(kong, "var sp: float3 = float3((ndc.xyz / ndc.w) * 0.5 + 0.5);"); + node_shader_write_attrib_frag(kong, "var sp: float3 = float3((input.ndc.xyz / input.ndc.w) * 0.5 + 0.5);"); node_shader_write_attrib_frag(kong, "sp.y = 1.0 - sp.y;"); node_shader_write_attrib_frag(kong, "sp.z -= 0.0001;"); // small bias @@ -107,20 +107,20 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad kong.frag_ndcpos = true; } - node_shader_add_uniform(kong, "inp: float4", "_input_brush"); - node_shader_add_uniform(kong, "inplast: float4", "_input_brush_last"); - node_shader_add_uniform(kong, "aspect_ratio: float", "_aspect_ratio_window"); + node_shader_add_constant(kong, "inp: float4", "_input_brush"); + node_shader_add_constant(kong, "inplast: float4", "_input_brush_last"); + node_shader_add_constant(kong, "aspect_ratio: float", "_aspect_ratio_window"); node_shader_write_frag(kong, "var bsp: float2 = sp.xy * 2.0 - 1.0;"); - node_shader_write_frag(kong, "bsp.x *= aspect_ratio;"); + node_shader_write_frag(kong, "bsp.x *= constants.aspect_ratio;"); node_shader_write_frag(kong, "bsp = bsp * 0.5 + 0.5;"); - node_shader_add_uniform(kong, "gbufferD: tex2d"); + node_shader_add_texture(kong, "gbufferD"); kong.frag_out = "float4[4]"; - node_shader_add_uniform(kong, "brush_radius: float", "_brush_radius"); - node_shader_add_uniform(kong, "brush_opacity: float", "_brush_opacity"); - node_shader_add_uniform(kong, "brush_hardness: float", "_brush_hardness"); + node_shader_add_constant(kong, "brush_radius: float", "_brush_radius"); + node_shader_add_constant(kong, "brush_opacity: float", "_brush_opacity"); + node_shader_add_constant(kong, "brush_hardness: float", "_brush_hardness"); if (context_raw.tool == workspace_tool_t.BRUSH || context_raw.tool == workspace_tool_t.ERASER || @@ -154,8 +154,8 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad let angle_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.ANGLE; if (angle_fill) { node_shader_add_function(kong, str_octahedron_wrap); - node_shader_add_uniform(kong, "gbuffer0: tex2d"); - node_shader_write_frag(kong, "var g0: float2 = sample_lod(gbuffer0, inp.xy, 0.0).rg;"); + 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 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);"); @@ -173,7 +173,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad if (context_raw.colorid_picked || face_fill || uv_island_fill) { node_shader_add_out(kong, "tex_coord_pick: float2"); - node_shader_write_vert(kong, "tex_coord_pick = tex;"); + node_shader_write_vert(kong, "output.tex_coord_pick = input.tex;"); if (context_raw.colorid_picked) { make_discard_color_id(kong); } @@ -192,11 +192,11 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad make_texcoord_run(kong); if (context_raw.tool == workspace_tool_t.CLONE || context_raw.tool == workspace_tool_t.BLUR || context_raw.tool == workspace_tool_t.SMUDGE) { - node_shader_add_uniform(kong, "gbuffer2: tex2d"); - node_shader_add_uniform(kong, "gbuffer_size: float2", "_gbuffer_size"); - node_shader_add_uniform(kong, "texpaint_undo: tex2d", "_texpaint_undo"); - node_shader_add_uniform(kong, "texpaint_nor_undo: tex2d", "_texpaint_nor_undo"); - node_shader_add_uniform(kong, "texpaint_pack_undo: tex2d", "_texpaint_pack_undo"); + node_shader_add_texture(kong, "gbuffer2"); + node_shader_add_constant(kong, "gbuffer_size: float2", "_gbuffer_size"); + node_shader_add_texture(kong, "texpaint_undo", "_texpaint_undo"); + node_shader_add_texture(kong, "texpaint_nor_undo", "_texpaint_nor_undo"); + node_shader_add_texture(kong, "texpaint_pack_undo", "_texpaint_pack_undo"); if (context_raw.tool == workspace_tool_t.CLONE) { make_clone_run(kong); @@ -240,7 +240,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write_frag(kong, "opacity = 1.0;"); ///else if (context_raw.layer.fill_layer == null) { - node_shader_write_frag(kong, "opacity *= brush_opacity;"); + node_shader_write_frag(kong, "opacity *= constants.brush_opacity;"); } ///end if (context_raw.material.paint_emis) { @@ -259,7 +259,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_uniform(kong, "texbrushmask: tex2d", "_texbrushmask"); + node_shader_add_texture(kong, "texbrushmask", "_texbrushmask"); node_shader_write_frag(kong, "var mask_sample: float4 = sample_lod(texbrushmask, uvsp, 0.0);"); if (context_raw.brush_mask_image_is_alpha) { node_shader_write_frag(kong, "opacity *= mask_sample.a;"); @@ -269,7 +269,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_uniform(kong, "textexttool: tex2d", "_textexttool"); + node_shader_add_texture(kong, "textexttool", "_textexttool"); node_shader_write_frag(kong, "opacity *= sample_lod(textexttool, uvsp, 0.0).r;"); } @@ -282,14 +282,14 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad context_raw.tool == workspace_tool_t.SMUDGE || context_raw.tool == workspace_tool_t.PARTICLE || decal)) { - node_shader_add_uniform(kong, "texbrushstencil: tex2d", "_texbrushstencil"); - node_shader_add_uniform(kong, "stencil_transform: float4", "_stencil_transform"); - node_shader_write_frag(kong, "var stencil_uv: float2 = float2((sp.xy - stencil_transform.xy) / stencil_transform.z * float2(aspect_ratio, 1.0));"); + node_shader_add_texture(kong, "texbrushstencil", "_texbrushstencil"); + node_shader_add_constant(kong, "stencil_transform: float4", "_stencil_transform"); + node_shader_write_frag(kong, "var stencil_uv: float2 = float2((sp.xy - constants.stencil_transform.xy) / constants.stencil_transform.z * float2(constants.aspect_ratio, 1.0));"); node_shader_write_frag(kong, "var stencil_size: float2 = float2(textureSize(texbrushstencil, 0));"); node_shader_write_frag(kong, "var stencil_ratio: float = stencil_size.y / stencil_size.x;"); node_shader_write_frag(kong, "stencil_uv -= float2(0.5 / stencil_ratio, 0.5);"); - node_shader_write_frag(kong, "stencil_uv = float2(stencil_uv.x * cos(stencil_transform.w) - stencil_uv.y * sin(stencil_transform.w),\ - stencil_uv.x * sin(stencil_transform.w) + stencil_uv.y * cos(stencil_transform.w));"); + node_shader_write_frag(kong, "stencil_uv = float2(stencil_uv.x * cos(constants.stencil_transform.w) - stencil_uv.y * sin(constants.stencil_transform.w),\ + stencil_uv.x * sin(constants.stencil_transform.w) + stencil_uv.y * cos(constants.stencil_transform.w));"); node_shader_write_frag(kong, "stencil_uv += float2(0.5 / stencil_ratio, 0.5);"); node_shader_write_frag(kong, "stencil_uv.x *= stencil_ratio;"); node_shader_write_frag(kong, "if (stencil_uv.x < 0 || stencil_uv.x > 1 || stencil_uv.y < 0 || stencil_uv.y > 1) { discard; }"); @@ -303,25 +303,25 @@ 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.BRUSH || context_raw.tool == workspace_tool_t.ERASER)) { - node_shader_add_uniform(kong, "texbrushmask: tex2d", "_texbrushmask"); - node_shader_write_frag(kong, "var binp_mask: float2 = inp.xy * 2.0 - 1.0;"); - node_shader_write_frag(kong, "binp_mask.x *= aspect_ratio;"); + node_shader_add_texture(kong, "texbrushmask", "_texbrushmask"); + node_shader_write_frag(kong, "var binp_mask: float2 = constants.inp.xy * 2.0 - 1.0;"); + node_shader_write_frag(kong, "binp_mask.x *= constants.aspect_ratio;"); node_shader_write_frag(kong, "binp_mask = binp_mask * 0.5 + 0.5;"); node_shader_write_frag(kong, "var pa_mask: float2 = bsp.xy - binp_mask.xy;"); if (context_raw.brush_directional) { - node_shader_add_uniform(kong, "brush_direction: float3", "_brush_direction"); - node_shader_write_frag(kong, "if (brush_direction.z == 0.0) { discard; }"); - node_shader_write_frag(kong, "pa_mask = float2(pa_mask.x * brush_direction.x - pa_mask.y * brush_direction.y, pa_mask.x * brush_direction.y + pa_mask.y * brush_direction.x);"); + node_shader_add_constant(kong, "brush_direction: float3", "_brush_direction"); + node_shader_write_frag(kong, "if (constants.brush_direction.z == 0.0) { discard; }"); + node_shader_write_frag(kong, "pa_mask = float2(pa_mask.x * constants.brush_direction.x - pa_mask.y * constants.brush_direction.y, pa_mask.x * constants.brush_direction.y + pa_mask.y * constants.brush_direction.x);"); } let angle: f32 = context_raw.brush_angle + context_raw.brush_nodes_angle; if (angle != 0.0) { - node_shader_add_uniform(kong, "brush_angle: float2", "_brush_angle"); - node_shader_write_frag(kong, "pa_mask.xy = float2(pa_mask.x * brush_angle.x - pa_mask.y * brush_angle.y, pa_mask.x * brush_angle.y + pa_mask.y * brush_angle.x);"); + node_shader_add_constant(kong, "brush_angle: float2", "_brush_angle"); + node_shader_write_frag(kong, "pa_mask.xy = float2(pa_mask.x * constants.brush_angle.x - pa_mask.y * constants.brush_angle.y, pa_mask.x * constants.brush_angle.y + pa_mask.y * constants.brush_angle.x);"); } - node_shader_write_frag(kong, "pa_mask /= brush_radius;"); + node_shader_write_frag(kong, "pa_mask /= constants.brush_radius;"); if (config_raw.brush_3d) { - node_shader_add_uniform(kong, "eye: float3", "_camera_pos"); - node_shader_write_frag(kong, "pa_mask *= distance(eye, winp.xyz) / 1.5;"); + node_shader_add_constant(kong, "eye: float3", "_camera_pos"); + 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);"); @@ -339,21 +339,21 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad make_particle_mask(kong); } else { // Brush cursor mask - node_shader_write_frag(kong, "var str: float = clamp((brush_radius - dist) * brush_hardness * 400.0, 0.0, 1.0) * opacity;"); - // node_shader_write_frag(kong, "var str: float = pow(clamp(1.0 - (dist / brush_radius), 0.0, 1.0), 1.0 - brush_hardness) * opacity;"); - // node_shader_write_frag(kong, "var t: float = clamp(dist / brush_radius, 0.0, 1.0); var falloff: float = 1.0 - smoothstep(0.0, 1.0, t); var str: float = pow(falloff, 1.0 / max(brush_hardness, 0.01)) * opacity;"); + 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_write_frag(kong, "var str: float = pow(clamp(1.0 - (dist / constants.brush_radius), 0.0, 1.0), 1.0 - constants.brush_hardness) * opacity;"); + // node_shader_write_frag(kong, "var t: float = clamp(dist / constants.brush_radius, 0.0, 1.0); var falloff: float = 1.0 - smoothstep(0.0, 1.0, t); var str: float = pow(falloff, 1.0 / max(constants.brush_hardness, 0.01)) * opacity;"); } // 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, "sample_tc.y = 1.0 - sample_tc.y;"); - node_shader_add_uniform(kong, "paintmask: tex2d"); + 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, "str = max(str, sample_mask);"); // write(frag, "str = clamp(str + sample_mask, 0.0, 1.0);"); - node_shader_add_uniform(kong, "texpaint_undo: tex2d", "_texpaint_undo"); + 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);"); let matid: f32 = context_raw.material.id / 255; @@ -407,7 +407,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } if (decal) { - node_shader_add_uniform(kong, "texpaint_pack_undo: tex2d", "_texpaint_pack_undo"); + 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);"); } @@ -422,8 +422,8 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write_frag(kong, "output[2].rgba = float4(1.0, 0.0, 0.0, 0.0);"); } else { - node_shader_add_uniform(kong, "texpaint_nor_undo: tex2d", "_texpaint_nor_undo"); - node_shader_add_uniform(kong, "texpaint_pack_undo: tex2d", "_texpaint_pack_undo"); + 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);"); ///if is_forge diff --git a/armorpaint/sources/make_particle.ts b/armorpaint/sources/make_particle.ts index 20101a2e..1787e2dc 100644 --- a/armorpaint/sources/make_particle.ts +++ b/armorpaint/sources/make_particle.ts @@ -2,19 +2,19 @@ function make_particle_mask(kong: node_shader_t) { ///if arm_physics node_shader_add_out(kong, "wpos: float4"); - node_shader_add_uniform(kong, "W: float4x4", "_world_matrix"); - node_shader_write_attrib_vert(kong, "wpos = W * float4(pos.xyz, 1.0);"); - node_shader_add_uniform(kong, "particle_hit: float3", "_particle_hit"); - node_shader_add_uniform(kong, "particle_hit_last: float3", "_particle_hit_last"); + node_shader_add_constant(kong, "W: float4x4", "_world_matrix"); + node_shader_write_attrib_vert(kong, "output.wpos = constants.W * float4(input.pos.xyz, 1.0);"); + node_shader_add_constant(kong, "particle_hit: float3", "_particle_hit"); + node_shader_add_constant(kong, "particle_hit_last: float3", "_particle_hit_last"); - node_shader_write_frag(kong, "var pa: float3 = wpos.xyz - particle_hit;"); - node_shader_write_frag(kong, "var ba: float3 = particle_hit_last - particle_hit;"); + node_shader_write_frag(kong, "var pa: float3 = input.wpos.xyz - constants.particle_hit;"); + node_shader_write_frag(kong, "var ba: float3 = constants.particle_hit_last - constants.particle_hit;"); node_shader_write_frag(kong, "var h: float = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);"); node_shader_write_frag(kong, "dist = length(pa - ba * h) * 10.0;"); node_shader_write_frag(kong, "if (dist > 1.0) { discard; }"); node_shader_write_frag(kong, "var str: float = clamp(pow(1.0 / dist * brush_hardness * 0.2, 4.0), 0.0, 1.0) * opacity;"); - node_shader_write_frag(kong, "if (particle_hit.x == 0.0 && particle_hit.y == 0.0 && particle_hit.z == 0.0) { str = 0.0; }"); + node_shader_write_frag(kong, "if (constants.particle_hit.x == 0.0 && constants.particle_hit.y == 0.0 && constants.particle_hit.z == 0.0) { str = 0.0; }"); node_shader_write_frag(kong, "if (str == 0.0) { discard; }"); ///else node_shader_write_frag(kong, "var str: float = 0.0;"); diff --git a/armorpaint/sources/make_texcoord.ts b/armorpaint/sources/make_texcoord.ts index 94c35323..f0e7c8c2 100644 --- a/armorpaint/sources/make_texcoord.ts +++ b/armorpaint/sources/make_texcoord.ts @@ -8,46 +8,46 @@ function make_texcoord_run(kong: node_shader_t) { let uv_angle: f32 = fill_layer ? context_raw.layer.angle : angle; if (uv_type == uv_type_t.PROJECT || decal) { // TexCoords - project - node_shader_add_uniform(kong, "brush_scale: float", "_brush_scale"); + node_shader_add_constant(kong, "brush_scale: float", "_brush_scale"); node_shader_write_attrib_frag(kong, "var uvsp: float2 = sp.xy;"); if (fill_layer) { // Decal layer node_shader_write_attrib_frag(kong, "if (uvsp.x < 0.0 || uvsp.y < 0.0 || uvsp.x > 1.0 || uvsp.y > 1.0) { discard; }"); if (uv_angle != 0.0) { - node_shader_add_uniform(kong, "brush_angle: float2", "_brush_angle"); - node_shader_write_attrib_frag(kong, "uvsp = float2(uvsp.x * brush_angle.x - uvsp.y * brush_angle.y, uvsp.x * brush_angle.y + uvsp.y * brush_angle.x);"); + node_shader_add_constant(kong, "brush_angle: float2", "_brush_angle"); + node_shader_write_attrib_frag(kong, "uvsp = float2(uvsp.x * constants.brush_angle.x - uvsp.y * constants.brush_angle.y, uvsp.x * constants.brush_angle.y + uvsp.y * constants.brush_angle.x);"); } kong.frag_n = true; - node_shader_add_uniform(kong, "decal_layer_nor: float3", "_decal_layer_nor"); + node_shader_add_constant(kong, "decal_layer_nor: float3", "_decal_layer_nor"); let dot_angle: f32 = context_raw.brush_angle_reject_dot; - node_shader_write_frag(kong, "if (abs(dot(n, decal_layer_nor) - 1.0) > " + dot_angle + ") { discard; }"); + node_shader_write_frag(kong, "if (abs(dot(n, constants.decal_layer_nor) - 1.0) > " + dot_angle + ") { discard; }"); kong.frag_wposition = true; - node_shader_add_uniform(kong, "decal_layer_loc: float3", "_decal_layer_loc"); - node_shader_add_uniform(kong, "decal_layer_dim: float", "_decal_layer_dim"); - node_shader_write_attrib_frag(kong, "if (abs(dot(decal_layer_nor, decal_layer_loc - wposition)) > decal_layer_dim) { discard; }"); + 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; }"); } else if (decal) { - node_shader_add_uniform(kong, "decal_mask: float4", "_decal_mask"); - node_shader_write_attrib_frag(kong, "uvsp -= decal_mask.xy;"); + node_shader_add_constant(kong, "decal_mask: float4", "_decal_mask"); + node_shader_write_attrib_frag(kong, "uvsp -= constants.decal_mask.xy;"); node_shader_write_attrib_frag(kong, "uvsp.x *= aspect_ratio;"); - node_shader_write_attrib_frag(kong, "uvsp *= 0.21 / (decal_mask.w * 0.9);"); // Decal radius + node_shader_write_attrib_frag(kong, "uvsp *= 0.21 / (constants.decal_mask.w * 0.9);"); // Decal radius if (context_raw.brush_directional) { - node_shader_add_uniform(kong, "brush_direction: float3", "_brush_direction"); - node_shader_write_attrib_frag(kong, "if (brush_direction.z == 0.0) { discard; }"); - node_shader_write_attrib_frag(kong, "uvsp = float2(uvsp.x * brush_direction.x - uvsp.y * brush_direction.y, uvsp.x * brush_direction.y + uvsp.y * brush_direction.x);"); + node_shader_add_constant(kong, "brush_direction: float3", "_brush_direction"); + node_shader_write_attrib_frag(kong, "if (constants.brush_direction.z == 0.0) { discard; }"); + node_shader_write_attrib_frag(kong, "uvsp = float2(uvsp.x * constants.brush_direction.x - uvsp.y * constants.brush_direction.y, uvsp.x * constants.brush_direction.y + uvsp.y * constants.brush_direction.x);"); } if (uv_angle != 0.0) { - node_shader_add_uniform(kong, "brush_angle: float2", "_brush_angle"); - node_shader_write_attrib_frag(kong, "uvsp = float2(uvsp.x * brush_angle.x - uvsp.y * brush_angle.y, uvsp.x * brush_angle.y + uvsp.y * brush_angle.x);"); + node_shader_add_constant(kong, "brush_angle: float2", "_brush_angle"); + node_shader_write_attrib_frag(kong, "uvsp = float2(uvsp.x * constants.brush_angle.x - uvsp.y * constants.brush_angle.y, uvsp.x * constants.brush_angle.y + uvsp.y * constants.brush_angle.x);"); } - node_shader_add_uniform(kong, "brush_scale_x: float", "_brush_scale_x"); - node_shader_write_attrib_frag(kong, "uvsp.x *= brush_scale_x;"); + node_shader_add_constant(kong, "brush_scale_x: float", "_brush_scale_x"); + node_shader_write_attrib_frag(kong, "uvsp.x *= constants.brush_scale_x;"); node_shader_write_attrib_frag(kong, "uvsp += float2(0.5, 0.5);"); @@ -57,40 +57,40 @@ function make_texcoord_run(kong: node_shader_t) { node_shader_write_attrib_frag(kong, "uvsp.x *= aspect_ratio;"); if (uv_angle != 0.0) { - node_shader_add_uniform(kong, "var brush_angle: float2", "_brush_angle"); - node_shader_write_attrib_frag(kong, "uvsp = float2(uvsp.x * brush_angle.x - uvsp.y * brush_angle.y, uvsp.x * brush_angle.y + uvsp.y * brush_angle.x);"); + node_shader_add_constant(kong, "brush_angle: float2", "_brush_angle"); + node_shader_write_attrib_frag(kong, "uvsp = float2(uvsp.x * constants.brush_angle.x - uvsp.y * constants.brush_angle.y, uvsp.x * constants.brush_angle.y + uvsp.y * constants.brush_angle.x);"); } } - node_shader_write_attrib_frag(kong, "var tex_coord: float2 = uvsp * brush_scale;"); + node_shader_write_attrib_frag(kong, "var tex_coord: float2 = uvsp * constants.brush_scale;"); } else if (uv_type == uv_type_t.UVMAP) { // TexCoords - uvmap - node_shader_add_uniform(kong, "brush_scale: float", "_brush_scale"); + node_shader_add_constant(kong, "brush_scale: float", "_brush_scale"); node_shader_add_out(kong, "tex_coord: float2"); - node_shader_write_vert(kong, "tex_coord = tex * brush_scale;"); + node_shader_write_vert(kong, "output.tex_coord = tex * constants.brush_scale;"); if (uv_angle > 0.0) { - node_shader_add_uniform(kong, "brush_angle: float2", "_brush_angle"); - node_shader_write_vert(kong, "tex_coord = float2(tex_coord.x * brush_angle.x - tex_coord.y * brush_angle.y, tex_coord.x * brush_angle.y + tex_coord.y * brush_angle.x);"); + node_shader_add_constant(kong, "brush_angle: float2", "_brush_angle"); + node_shader_write_vert(kong, "output.tex_coord = float2(output.tex_coord.x * constants.brush_angle.x - output.tex_coord.y * constants.brush_angle.y, output.tex_coord.x * constants.brush_angle.y + output.tex_coord.y * constants.brush_angle.x);"); } } else { // TexCoords - triplanar kong.frag_wposition = true; kong.frag_n = true; - node_shader_add_uniform(kong, "brush_scale: float", "_brush_scale"); + node_shader_add_constant(kong, "brush_scale: float", "_brush_scale"); node_shader_write_attrib_frag(kong, "var tri_weight: float3 = wnormal * wnormal;"); // n * n 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 * brush_scale * 0.5;"); - node_shader_write_attrib_frag(kong, "var tex_coord1: float2 = wposition.xz * brush_scale * 0.5;"); - node_shader_write_attrib_frag(kong, "var tex_coord2: float2 = wposition.xy * brush_scale * 0.5;"); + 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;"); if (uv_angle != 0.0) { - node_shader_add_uniform(kong, "xbrush_angle: float2", "_brush_angle"); - node_shader_write_attrib_frag(kong, "tex_coord = float2(tex_coord.x * brush_angle.x - tex_coord.y * brush_angle.y, tex_coord.x * brush_angle.y + tex_coord.y * brush_angle.x);"); - node_shader_write_attrib_frag(kong, "tex_coord1 = float2(tex_coord1.x * brush_angle.x - tex_coord1.y * brush_angle.y, tex_coord1.x * brush_angle.y + tex_coord1.y * brush_angle.x);"); - node_shader_write_attrib_frag(kong, "tex_coord2 = float2(tex_coord2.x * brush_angle.x - tex_coord2.y * brush_angle.y, tex_coord2.x * brush_angle.y + tex_coord2.y * brush_angle.x);"); + node_shader_add_constant(kong, "brush_angle: float2", "_brush_angle"); + node_shader_write_attrib_frag(kong, "tex_coord = float2(tex_coord.x * constants.brush_angle.x - tex_coord.y * constants.brush_angle.y, tex_coord.x * constants.brush_angle.y + tex_coord.y * constants.brush_angle.x);"); + node_shader_write_attrib_frag(kong, "tex_coord1 = float2(tex_coord1.x * constants.brush_angle.x - tex_coord1.y * constants.brush_angle.y, tex_coord1.x * constants.brush_angle.y + tex_coord1.y * constants.brush_angle.x);"); + node_shader_write_attrib_frag(kong, "tex_coord2 = float2(tex_coord2.x * constants.brush_angle.x - tex_coord2.y * constants.brush_angle.y, tex_coord2.x * constants.brush_angle.y + tex_coord2.y * constants.brush_angle.x);"); } } } diff --git a/armorsculpt/sources/make_brush.ts b/armorsculpt/sources/make_brush.ts index af272106..9a75a7ca 100644 --- a/armorsculpt/sources/make_brush.ts +++ b/armorsculpt/sources/make_brush.ts @@ -6,19 +6,19 @@ function make_brush_run(kong: node_shader_t) { if (config_raw.brush_3d) { node_shader_write_frag(kong, "var depth: float = sample_lod(gbufferD, inp.xy, 0.0).r;"); - node_shader_add_uniform(kong, "invVP: float4x4", "_inv_view_proj_matrix"); + 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);"); - node_shader_write_frag(kong, "winp = invVP * winp;"); + node_shader_write_frag(kong, "winp = constants.invVP * winp;"); node_shader_write_frag(kong, "winp.xyz /= winp.w;"); - node_shader_add_uniform(kong, "W: float4x4", "_world_matrix"); + node_shader_add_constant(kong, "W: float4x4", "_world_matrix"); - node_shader_write_attrib_frag(kong, "var wposition: float3 = (W * texpaint_undo[int2(tex_coord.x * textureSize(texpaint_undo, 0).x, tex_coord.y * textureSize(texpaint_undo, 0).y)]).xyz;"); + 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 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, "winplast = invVP * winplast;"); + 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);"); diff --git a/armorsculpt/sources/make_mesh.ts b/armorsculpt/sources/make_mesh.ts index 8184cc4e..263fec01 100644 --- a/armorsculpt/sources/make_mesh.ts +++ b/armorsculpt/sources/make_mesh.ts @@ -32,23 +32,23 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_add_out(kong, "tex_coord: float2"); kong.frag_wvpposition = true; - node_shader_add_uniform(kong, "VP: float4x4", "_view_proj_matrix"); + node_shader_add_constant(kong, "VP: float4x4", "_view_proj_matrix"); kong.vert_wposition = true; let texture_count: i32 = 0; - node_shader_add_uniform(kong, "WVP: float4x4", "_world_view_proj_matrix"); + node_shader_add_constant(kong, "WVP: float4x4", "_world_view_proj_matrix"); let lid: i32 = project_layers[0].id; - node_shader_add_uniform(kong, "texpaint_vert: tex2d", "_texpaint_vert" + lid); + 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;"); - // + pos.xyz * 0.000001 - node_shader_write_vert(kong, "output.pos = WVP * float4(meshpos.xyz, 1.0);"); + // + input.pos.xyz * 0.000001 + node_shader_write_vert(kong, "output.pos = constants.WVP * float4(meshpos.xyz, 1.0);"); - node_shader_write_vert(kong, "tex_coord = float2(0.0, 0.0);"); + node_shader_write_vert(kong, "output.tex_coord = float2(0.0, 0.0);"); kong.frag_out = "float4[3]"; - node_shader_add_uniform(kong, "N: float3x3", "_normal_matrix"); + node_shader_add_constant(kong, "N: float3x3", "_normal_matrix"); node_shader_add_out(kong, "wnormal: float3"); node_shader_write_attrib_vert(kong, "var base_vertex0: int = gl_VertexID - (gl_VertexID % 3);"); @@ -58,16 +58,16 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte 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 meshnor: float3 = normalize(cross(meshpos2 - meshpos1, meshpos0 - meshpos1));"); - node_shader_write_attrib_vert(kong, "wnormal = mul(meshnor, N);"); - node_shader_write_attrib_frag(kong, "var n: float3 = normalize(wnormal);"); + node_shader_write_attrib_vert(kong, "output.wnormal = mul(meshnor, constants.N);"); + node_shader_write_attrib_frag(kong, "var n: float3 = normalize(input.wnormal);"); node_shader_add_function(kong, str_pack_float_int16); node_shader_add_function(kong, str_octahedron_wrap); node_shader_add_function(kong, str_cotangent_frame); if (layer_pass > 0) { - node_shader_add_uniform(kong, "gbuffer0: tex2d"); - node_shader_add_uniform(kong, "gbuffer1: tex2d"); - node_shader_add_uniform(kong, "gbuffer2: tex2d"); + 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, "fragcoord.y = 1.0 - fragcoord.y;"); node_shader_write_frag(kong, "var gbuffer0_sample: float4 = sample_lod(gbuffer0, fragcoord, 0.0);"); @@ -106,13 +106,13 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.draw_wireframe) { texture_count++; - node_shader_add_uniform(kong, "texuvmap: tex2d", "_texuvmap"); + node_shader_add_texture(kong, "texuvmap", "_texuvmap"); } if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) { texture_count += 4; - node_shader_add_uniform(kong, "senvmap_brdf: tex2d", "$brdf.k"); - node_shader_add_uniform(kong, "senvmap_radiance: tex2d", "_envmap_radiance"); + node_shader_add_texture(kong, "senvmap_brdf", "$brdf.k"); + node_shader_add_texture(kong, "senvmap_radiance", "_envmap_radiance"); } // Get layers for this pass @@ -145,7 +145,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte for (let i: i32 = 0; i < layers.length; ++i) { let l: slot_layer_t = layers[i]; if (slot_layer_get_object_mask(l) > 0) { - node_shader_add_uniform(kong, "uid: int", "_uid"); + node_shader_add_constant(kong, "uid: int", "_uid"); if (slot_layer_get_object_mask(l) > project_paint_objects.length) { // Atlas let visibles: mesh_object_t[] = project_get_atlas_objects(slot_layer_get_object_mask(l)); node_shader_write_frag(kong, "if ("); @@ -154,17 +154,17 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, " || "); } let uid: i32 = visibles[i].base.uid; - node_shader_write_frag(kong, uid + " == uid"); + node_shader_write_frag(kong, uid + " == constants.uid"); } node_shader_write_frag(kong, ") {"); } else { // Object mask let uid: i32 = project_paint_objects[slot_layer_get_object_mask(l) - 1].base.uid; - node_shader_write_frag(kong, "if (" + uid + " == uid) {"); + node_shader_write_frag(kong, "if (" + uid + " == constants.uid) {"); } } - node_shader_add_shared_sampler(kong, "texpaint" + l.id + ": tex2d"); + node_shader_add_shared_sampler(kong, "texpaint" + l.id); node_shader_write_frag(kong, "texpaint_sample = float4(0.8, 0.8, 0.8, 1.0);"); node_shader_write_frag(kong, "texpaint_opac = texpaint_sample.a;"); @@ -184,9 +184,9 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte for (let i: i32 = 0; i < masks.length; ++i) { let m: slot_layer_t = masks[i]; if (!slot_layer_is_visible(m)) continue; - node_shader_add_shared_sampler(kong, "texpaint" + m.id + ": tex2d"); + 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 + ", tex_coord, 0.0).r;"); + 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, "}"); } node_shader_write_frag(kong, "texpaint_opac *= clamp(" + texpaint_mask + ", 0.0, 1.0);"); @@ -207,17 +207,17 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (last_pass && context_raw.draw_texels) { - node_shader_add_uniform(kong, "texpaint_size: float2", "_texpaint_size"); - node_shader_write_frag(kong, "var texel0: float2 = tex_coord * texpaint_size * 0.01;"); - node_shader_write_frag(kong, "var texel1: float2 = tex_coord * texpaint_size * 0.1;"); - node_shader_write_frag(kong, "var texel2: float2 = tex_coord * texpaint_size;"); + node_shader_add_constant(kong, "texpaint_size: float2", "_texpaint_size"); + node_shader_write_frag(kong, "var texel0: float2 = input.tex_coord * constants.texpaint_size * 0.01;"); + node_shader_write_frag(kong, "var texel1: float2 = input.tex_coord * constants.texpaint_size * 0.1;"); + node_shader_write_frag(kong, "var texel2: float2 = input.tex_coord * constants.texpaint_size;"); node_shader_write_frag(kong, "basecol *= max(float((int(texel0.x) % 2.0) == (int(texel0.y) % 2.0)), 0.9);"); node_shader_write_frag(kong, "basecol *= max(float((int(texel1.x) % 2.0) == (int(texel1.y) % 2.0)), 0.9);"); node_shader_write_frag(kong, "basecol *= max(float((int(texel2.x) % 2.0) == (int(texel2.y) % 2.0)), 0.9);"); } if (last_pass && context_raw.draw_wireframe) { - node_shader_write_frag(kong, "basecol *= 1.0 - sample_lod(texuvmap, tex_coord, 0.0).r;"); + node_shader_write_frag(kong, "basecol *= 1.0 - sample_lod(texuvmap, input.tex_coord, 0.0).r;"); } if (make_material_height_used) { @@ -242,7 +242,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } kong.frag_vvec = true; - node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); + 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(TBN * n);"); @@ -263,17 +263,24 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte 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;"); - node_shader_add_uniform(kong, "envmap_num_mipmaps: int", "_envmap_num_mipmaps"); - node_shader_add_uniform(kong, "envmap_data: float4", "_envmap_data"); // angle, sin(angle), cos(angle), strength + node_shader_add_constant(kong, "envmap_num_mipmaps: int", "_envmap_num_mipmaps"); + node_shader_add_constant(kong, "envmap_data: float4", "_envmap_data"); // angle, sin(angle), cos(angle), strength node_shader_write_frag(kong, "var wreflect: float3 = reflect(-vvec, n);"); - node_shader_write_frag(kong, "var envlod: float = roughness * float(envmap_num_mipmaps);"); + 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, envmap_data.x), envlod).rgb;"); - node_shader_add_uniform(kong, "shirr: float4[7]", "_envmap_irradiance"); + node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, 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"); + node_shader_add_constant(kong, "shirr2: float4", "_envmap_irradiance2"); + node_shader_add_constant(kong, "shirr3: float4", "_envmap_irradiance3"); + node_shader_add_constant(kong, "shirr4: float4", "_envmap_irradiance4"); + node_shader_add_constant(kong, "shirr5: float4", "_envmap_irradiance5"); + node_shader_add_constant(kong, "shirr6: float4", "_envmap_irradiance6"); node_shader_add_function(kong, str_sh_irradiance); - node_shader_write_frag(kong, "var indirect: float3 = albedo * (sh_irradiance(float3(n.x * envmap_data.z - n.y * envmap_data.y, n.x * envmap_data.y + n.y * envmap_data.z, n.z), shirr) / 3.14159265);"); + node_shader_write_frag(kong, "var indirect: float3 = albedo * (sh_irradiance(float3(n.x * constants.envmap_data.z - n.y * constants.envmap_data.y, n.x * constants.envmap_data.y + n.y * constants.envmap_data.z, n.z)) / 3.14159265);"); node_shader_write_frag(kong, "indirect += prefiltered_color * (f0 * env_brdf.x + env_brdf.y) * 1.5;"); - node_shader_write_frag(kong, "indirect *= envmap_data.w * occlusion;"); + node_shader_write_frag(kong, "indirect *= constants.envmap_data.w * occlusion;"); node_shader_write_frag(kong, "output[1].rgba = float4(indirect, 1.0);"); } else { // Deferred, Pathtraced @@ -288,8 +295,8 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "output[1].rgba = float4(nAttr, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_ID) { - node_shader_add_uniform(kong, "object_id: float", "_object_id"); - node_shader_write_frag(kong, "var obid: float = object_id + 1.0 / 255.0;"); + node_shader_add_constant(kong, "object_id: float", "_object_id"); + node_shader_write_frag(kong, "var obid: float = constants.object_id + 1.0 / 255.0;"); node_shader_write_frag(kong, "var id_r: float = frac(sin(dot(float2(obid, obid * 20.0), float2(12.9898, 78.233))) * 43758.5453);"); node_shader_write_frag(kong, "var id_g: float = frac(sin(dot(float2(obid * 20.0, obid), float2(12.9898, 78.233))) * 43758.5453);"); node_shader_write_frag(kong, "var id_b: float = frac(sin(dot(float2(obid, obid * 40.0), float2(12.9898, 78.233))) * 43758.5453);"); @@ -309,7 +316,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "output[0].rgba = float4(n.xy, roughness, pack_f32_i16(metallic, uint(int(matid * 255.0) % 3)));"); } - node_shader_write_frag(kong, "output[2].rgba = float4(0.0, 0.0, tex_coord.xy);"); + node_shader_write_frag(kong, "output[2].rgba = float4(0.0, 0.0, input.tex_coord.xy);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; diff --git a/armorsculpt/sources/make_mesh_preview.ts b/armorsculpt/sources/make_mesh_preview.ts index 97afb36e..a207960f 100644 --- a/armorsculpt/sources/make_mesh_preview.ts +++ b/armorsculpt/sources/make_mesh_preview.ts @@ -35,7 +35,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no let kong: node_shader_t = node_shader_context_make_kong(con_mesh); - let pos: string = "pos"; + let pos: string = "input.pos"; ///if arm_skin let skin: bool = mesh_data_get_vertex_array(context_raw.paint_object.data, "bone") != null; @@ -44,26 +44,26 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no node_shader_context_add_elem(con_mesh, "bone", "short4norm"); node_shader_context_add_elem(con_mesh, "weight", "short4norm"); node_shader_add_function(kong, str_get_skinning_dual_quat); - node_shader_add_uniform(kong, "skin_bones: float4[128 * 2]", "_skin_bones"); - node_shader_add_uniform(kong, "pos_unpack: float", "_pos_unpack"); + node_shader_add_constant(kong, "skin_bones: float4[128 * 2]", "_skin_bones"); + node_shader_add_constant(kong, "pos_unpack: float", "_pos_unpack"); node_shader_write_attrib_vert(kong, "var skin_a: float4;"); node_shader_write_attrib_vert(kong, "var skin_b: float4;"); node_shader_write_attrib_vert(kong, "get_skinning_dual_quat(int4(bone * 32767), weight, skin_a, skin_b);"); - node_shader_write_attrib_vert(kong, "var spos: float3 = pos.xyz;"); - node_shader_write_attrib_vert(kong, "spos.xyz *= pos_unpack;"); + node_shader_write_attrib_vert(kong, "var spos: float3 = input.pos.xyz;"); + node_shader_write_attrib_vert(kong, "spos.xyz *= constants.pos_unpack;"); node_shader_write_attrib_vert(kong, "spos.xyz += 2.0 * cross(skin_a.xyz, cross(skin_a.xyz, spos.xyz) + skin_a.w * spos.xyz);"); node_shader_write_attrib_vert(kong, "spos.xyz += 2.0 * (skin_a.w * skin_b.xyz - skin_b.w * skin_a.xyz + cross(skin_a.xyz, skin_b.xyz));"); - node_shader_write_attrib_vert(kong, "spos.xyz /= pos_unpack;"); + node_shader_write_attrib_vert(kong, "spos.xyz /= constants.pos_unpack;"); } ///end - node_shader_add_uniform(kong, "WVP: float4x4", "_world_view_proj_matrix"); - node_shader_write_attrib_vert(kong, "output.pos = WVP * float4(" + pos + ".xyz, 1.0);"); + node_shader_add_constant(kong, "WVP: float4x4", "_world_view_proj_matrix"); + node_shader_write_attrib_vert(kong, "output.pos = constants.WVP * float4(" + pos + ".xyz, 1.0);"); let sc: f32 = context_raw.brush_scale * context_raw.brush_nodes_scale; let brush_scale: string = sc + ""; node_shader_add_out(kong, "tex_coord: float2"); - node_shader_write_attrib_vert(kong, "tex_coord = tex * float(" + brush_scale + ");"); + node_shader_write_attrib_vert(kong, "output.tex_coord = input.tex * float(" + brush_scale + ");"); let decal: bool = context_raw.decal_preview; parser_material_sample_keep_aspect = decal; @@ -90,8 +90,8 @@ 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_uniform(kong, "textexttool: tex2d", "_textexttool"); - node_shader_write_frag(kong, "opacity *= sample_lod(textexttool, tex_coord / float(" + brush_scale + "), 0.0).r;"); + 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;"); } } if (decal) { @@ -123,7 +123,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no } else { kong.frag_vvec = true; - node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); + 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));"); @@ -148,7 +148,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no ///if arm_skin if (skin) { - node_shader_write_vert(kong, "wnormal = normalize(N * float3(nor.xy, pos.w) + 2.0 * cross(skin_a.xyz, cross(skin_a.xyz, float3(nor.xy, pos.w)) + skin_a.w * float3(nor.xy, pos.w)));"); + node_shader_write_vert(kong, "wnormal = normalize(N * float3(input.nor.xy, input.pos.w) + 2.0 * cross(skin_a.xyz, cross(skin_a.xyz, float3(input.nor.xy, input.pos.w)) + skin_a.w * float3(input.nor.xy, input.pos.w)));"); } ///end diff --git a/armorsculpt/sources/make_sculpt.ts b/armorsculpt/sources/make_sculpt.ts index 46c28132..50332b96 100644 --- a/armorsculpt/sources/make_sculpt.ts +++ b/armorsculpt/sources/make_sculpt.ts @@ -34,19 +34,19 @@ function make_sculpt_run(data: material_t, matcon: material_context_t): node_sha node_shader_add_out(kong, "tex_coord: float2"); node_shader_write_vert(kong, "const madd: float2 = float2(0.5, 0.5);"); - node_shader_write_vert(kong, "tex_coord = pos.xy * madd + madd;"); - node_shader_write_vert(kong, "tex_coord.y = 1.0 - tex_coord.y;"); - node_shader_write_vert(kong, "output.pos = float4(pos.xy, 0.0, 1.0);"); + node_shader_write_vert(kong, "output.tex_coord = input.pos.xy * madd + madd;"); + node_shader_write_vert(kong, "output.tex_coord.y = 1.0 - output.tex_coord.y;"); + node_shader_write_vert(kong, "output.pos = float4(input.pos.xy, 0.0, 1.0);"); - node_shader_add_uniform(kong, "inp: float4", "_input_brush"); - node_shader_add_uniform(kong, "inplast: float4", "_input_brush_last"); - node_shader_add_uniform(kong, "gbufferD: tex2d"); + node_shader_add_constant(kong, "inp: float4", "_input_brush"); + node_shader_add_constant(kong, "inplast: float4", "_input_brush_last"); + node_shader_add_texture(kong, "gbufferD"); kong.frag_out = "float4[2]"; - node_shader_add_uniform(kong, "brush_radius: float", "_brush_radius"); - node_shader_add_uniform(kong, "brush_opacity: float", "_brush_opacity"); - node_shader_add_uniform(kong, "brush_hardness: float", "_brush_hardness"); + node_shader_add_constant(kong, "brush_radius: float", "_brush_radius"); + node_shader_add_constant(kong, "brush_opacity: float", "_brush_opacity"); + node_shader_add_constant(kong, "brush_hardness: float", "_brush_hardness"); if (context_raw.tool == workspace_tool_t.BRUSH || context_raw.tool == workspace_tool_t.ERASER || @@ -65,16 +65,16 @@ function make_sculpt_run(data: material_t, matcon: material_context_t): node_sha node_shader_write_frag(kong, "var opacity: float = 1.0;"); node_shader_write_frag(kong, "if (opacity == 0.0) { discard; }"); - node_shader_write_frag(kong, "var str: float = clamp((brush_radius - dist) * brush_hardness * 400.0, 0.0, 1.0) * opacity;"); + 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_uniform(kong, "texpaint_undo: tex2d", "_texpaint_undo"); - node_shader_write_frag(kong, "var sample_undo: float4 = sample_lod(texpaint_undo, tex_coord, 0.0);"); + 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, "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_uniform(kong, "gbuffer0_undo: tex2d"); - node_shader_write_frag(kong, "var g0_undo: float2 = sample_lod(gbuffer0_undo, inp.xy, 0.0).rg;"); + 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 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/plugins/plugin_api.c b/base/plugins/plugin_api.c index 9b1bd045..a6ba9d86 100644 --- a/base/plugins/plugin_api.c +++ b/base/plugins/plugin_api.c @@ -437,13 +437,13 @@ FN(iron_file_save_bytes) { VOID_FN_CB(context_set_viewport_shader) -void node_shader_add_uniform(void *p, char *s0, char *s1, bool b); -FN(node_shader_add_uniform) { +void node_shader_add_constant(void *p, char *s0, char *s1, bool b); +FN(node_shader_add_constant) { int64_t p; JS_ToInt64(ctx, &p, argv[0]); char *s0 = (char *)JS_ToCString(ctx, argv[1]); char *s1 = (char *)JS_ToCString(ctx, argv[2]); - node_shader_add_uniform((void *)p, s0, s1, false); + node_shader_add_constant((void *)p, s0, s1, false); return JS_UNDEFINED; } @@ -808,7 +808,7 @@ void plugin_api_init() { BIND(data_delete_blob, 1); BIND(iron_file_save_bytes, 3); BIND(context_set_viewport_shader, 1); - BIND(node_shader_add_uniform, 3); + BIND(node_shader_add_constant, 3); BIND(node_shader_write_frag, 2); BIND(gpu_create_texture_from_bytes, 3); BIND(project_filepath_get, 0); diff --git a/base/sources/ts/node_shader.ts b/base/sources/ts/node_shader.ts index 199aa82a..0fb1a712 100644 --- a/base/sources/ts/node_shader.ts +++ b/base/sources/ts/node_shader.ts @@ -5,7 +5,8 @@ type node_shader_t = { outs?: string[]; frag_out?: string; shared_samplers?: string[]; - uniforms?: string[]; + constants?: string[]; + textures?: string[]; functions?: map_t; vert?: string; @@ -44,7 +45,8 @@ function node_shader_create(context: node_shader_context_t): node_shader_t { raw.outs = []; raw.frag_out = "float4"; raw.shared_samplers = []; - raw.uniforms = []; + raw.constants = []; + raw.textures = []; raw.functions = map_create(); raw.vert = ""; @@ -70,27 +72,36 @@ function node_shader_add_out(raw: node_shader_t, s: string) { array_push(raw.outs, s); } -function node_shader_add_uniform(raw: node_shader_t, s: string, link: string = null) { +function node_shader_add_constant(raw: node_shader_t, s: string, link: string = null) { + let ar: string[] = string_split(s, " "); + let utype: string = ar[ar.length - 2]; + let uname: string = ar[ar.length - 1]; + + if (ar[0] == "float" && string_index_of(ar[1], "[") >= 0) { + ar[0] = "floats"; + ar[1] = string_split(ar[1], "[")[0]; + } + else if (ar[0] == "vec4" && string_index_of(ar[1], "[") >= 0) { + ar[0] = "floats"; + ar[1] = string_split(ar[1], "[")[0]; + } + node_shader_context_add_constant(raw.context, ar[0], ar[1], link); + + if (array_index_of(raw.constants, s) == -1) { + array_push(raw.constants, s); + } +} + +function node_shader_add_texture(raw: node_shader_t, s: string, link: string = null) { let ar: string[] = string_split(s, " "); // layout(RGBA8) sampler2D tex let utype: string = ar[ar.length - 2]; let uname: string = ar[ar.length - 1]; - if (starts_with(utype, "sampler")) { - node_shader_context_add_texture_unit(raw.context, utype, uname, link); - } - else { - if (ar[0] == "float" && string_index_of(ar[1], "[") >= 0) { - ar[0] = "floats"; - ar[1] = string_split(ar[1], "[")[0]; - } - else if (ar[0] == "vec4" && string_index_of(ar[1], "[") >= 0) { - ar[0] = "floats"; - ar[1] = string_split(ar[1], "[")[0]; - } - node_shader_context_add_constant(raw.context, ar[0], ar[1], link); - } - if (array_index_of(raw.uniforms, s) == -1) { - array_push(raw.uniforms, s); + + node_shader_context_add_texture_unit(raw.context, utype, uname, link); + + if (array_index_of(raw.textures, s) == -1) { + array_push(raw.textures, s); } } @@ -170,11 +181,6 @@ function node_shader_get(raw: node_shader_t): string { node_shader_vstruct_to_vsin(raw); - let shared_sampler: string = "shared_sampler"; - // if (raw.shared_samplers.length > 0) { - // shared_sampler = string_split(raw.shared_samplers[0], " ")[1] + "_sampler"; - // } - let s: string = ""; s += "struct vert_in {\n"; @@ -192,14 +198,27 @@ function node_shader_get(raw: node_shader_t): string { } s += "}\n\n"; - s += "#[set(everything)] \n"; - s += "const constants: { \n"; - for (let i: i32 = 0; i < raw.uniforms.length; ++i) { - let a: string = raw.uniforms[i]; + for (let i: i32 = 0; i < raw.textures.length; ++i) { + s += "#[set(everything)]\n"; + let a: string = raw.textures[i]; + s += "const " + a + ": tex2d;\n"; + s += "#[set(everything)]\n"; + s += "const " + a + "_sampler: sampler;\n"; + } + + s += "#[set(everything)]\n"; + s += "const constants: {\n"; + for (let i: i32 = 0; i < raw.constants.length; ++i) { + let a: string = raw.constants[i]; s += "\t" + a + ";\n"; } 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"; @@ -236,7 +255,5 @@ function node_shader_get(raw: node_shader_t): string { s += "\tfragment = kong_frag;\n"; s += "}\n"; - iron_file_save_bytes("C:/users/lubos/desktop/test.txt", sys_string_to_buffer(s), 0); - return s; } diff --git a/base/sources/ts/parser_material.ts b/base/sources/ts/parser_material.ts index de6b4027..ccbc651d 100644 --- a/base/sources/ts/parser_material.ts +++ b/base/sources/ts/parser_material.ts @@ -193,78 +193,78 @@ function parser_material_finalize(con: node_shader_context_t) { } else if (kong.frag_ndcpos) { node_shader_add_out(kong, "bposition: float3"); - node_shader_write_vert(kong, "bposition = (ndc.xyz / ndc.w);"); + node_shader_write_vert(kong, "output.bposition = (ndc.xyz / ndc.w);"); } else { node_shader_add_out(kong, "bposition: float3"); - node_shader_add_uniform(kong, "dim: float3", "_dim"); - node_shader_add_uniform(kong, "hdim: float3", "_half_dim"); - node_shader_write_attrib_vert(kong, "bposition = (pos.xyz + hdim) / dim;"); + node_shader_add_constant(kong, "dim: float3", "_dim"); + node_shader_add_constant(kong, "hdim: float3", "_half_dim"); + node_shader_write_attrib_vert(kong, "output.bposition = (input.pos.xyz + constants.hdim) / constants.dim;"); } } if (kong.frag_wposition) { - node_shader_add_uniform(kong, "W: float4x4", "_world_matrix"); + node_shader_add_constant(kong, "W: float4x4", "_world_matrix"); node_shader_add_out(kong, "wposition: float3"); - node_shader_write_attrib_vert(kong, "wposition = float4(W * float4(pos.xyz, 1.0)).xyz;"); + node_shader_write_attrib_vert(kong, "output.wposition = float4(constants.W * float4(input.pos.xyz, 1.0)).xyz;"); } else if (kong.vert_wposition) { - node_shader_add_uniform(kong, "W: float4x4", "_world_matrix"); - node_shader_write_attrib_vert(kong, "var wposition: float3 = float4(W * float4(pos.xyz, 1.0)).xyz;"); + node_shader_add_constant(kong, "W: float4x4", "_world_matrix"); + node_shader_write_attrib_vert(kong, "var wposition: float3 = float4(constants.W * float4(input.pos.xyz, 1.0)).xyz;"); } if (kong.frag_vposition) { - node_shader_add_uniform(kong, "WV: float4x4", "_world_view_matrix"); + node_shader_add_constant(kong, "WV: float4x4", "_world_view_matrix"); node_shader_add_out(kong, "vposition: float3"); - node_shader_write_attrib_vert(kong, "vposition = float4(WV * float4(pos.xyz, 1.0)).xyz;"); + node_shader_write_attrib_vert(kong, "output.vposition = float4(constants.WV * float4(input.pos.xyz, 1.0)).xyz;"); } if (kong.frag_mposition) { node_shader_add_out(kong, "mposition: float3"); if (kong.frag_ndcpos) { - node_shader_write_vert(kong, "mposition = (ndc.xyz / ndc.w);"); + node_shader_write_vert(kong, "output.mposition = (ndc.xyz / ndc.w);"); } else { - node_shader_write_attrib_vert(kong, "mposition = pos.xyz;"); + node_shader_write_attrib_vert(kong, "output.mposition = input.pos.xyz;"); } } if (kong.frag_wtangent) { node_shader_add_out(kong, "wtangent: float3"); - node_shader_write_attrib_vert(kong, "wtangent = float3(0.0, 0.0, 0.0);"); + node_shader_write_attrib_vert(kong, "output.wtangent = float3(0.0, 0.0, 0.0);"); } if (kong.frag_vvec_cam) { - node_shader_add_uniform(kong, "WV: float4x4", "_world_view_matrix"); + node_shader_add_constant(kong, "WV: float4x4", "_world_view_matrix"); node_shader_add_out(kong, "eye_dir_cam: float3"); - node_shader_write_attrib_vert(kong, "eye_dir_cam = float4(WV * float4(pos.xyz, 1.0)).xyz; eye_dir_cam.z *= -1.0;"); - node_shader_write_attrib_frag(kong, "var vvec_cam: float3 = normalize(eye_dir_cam);"); + node_shader_write_attrib_vert(kong, "output.eye_dir_cam = float4(constants.WV * float4(input.pos.xyz, 1.0)).xyz; eye_dir_cam.z *= -1.0;"); + node_shader_write_attrib_frag(kong, "var vvec_cam: float3 = normalize(input.eye_dir_cam);"); } if (kong.frag_vvec) { - node_shader_add_uniform(kong, "eye: float3", "_camera_pos"); + node_shader_add_constant(kong, "eye: float3", "_camera_pos"); node_shader_add_out(kong, "eye_dir: float3"); - node_shader_write_attrib_vert(kong, "eye_dir = eye - wposition;"); - node_shader_write_attrib_frag(kong, "var vvec: float3 = normalize(eye_dir);"); + node_shader_write_attrib_vert(kong, "output.eye_dir = constants.eye - wposition;"); + node_shader_write_attrib_frag(kong, "var vvec: float3 = normalize(input.eye_dir);"); } if (kong.frag_n) { - node_shader_add_uniform(kong, "N: float3x3", "_normal_matrix"); + node_shader_add_constant(kong, "N: float3x3", "_normal_matrix"); node_shader_add_out(kong, "wnormal: float3"); - node_shader_write_attrib_vert(kong, "wnormal = N * float3(nor.xy, pos.w);"); - node_shader_write_attrib_frag(kong, "var n: float3 = normalize(wnormal);"); + node_shader_write_attrib_vert(kong, "output.wnormal = constants.N * float3(input.nor.xy, input.pos.w);"); + node_shader_write_attrib_frag(kong, "var n: float3 = normalize(input.wnormal);"); } else if (kong.vert_n) { - node_shader_add_uniform(kong, "N: float3x3", "_normal_matrix"); - node_shader_write_attrib_vert(kong, "var wnormal: float3 = normalize(N * float3(nor.xy, pos.w));"); + node_shader_add_constant(kong, "N: float3x3", "_normal_matrix"); + node_shader_write_attrib_vert(kong, "var wnormal: float3 = normalize(constants.N * float3(input.nor.xy, input.pos.w));"); } if (kong.frag_nattr) { node_shader_add_out(kong, "var nattr: float3"); - node_shader_write_attrib_vert(kong, "nattr = float3(nor.xy, pos.w);"); + node_shader_write_attrib_vert(kong, "output.nattr = float3(input.nor.xy, input.pos.w);"); } if (kong.frag_dotnv) { node_shader_write_attrib_frag(kong, "var dotnv: float = max(dot(n, vvec), 0.0);"); } if (kong.frag_wvpposition) { node_shader_add_out(kong, "wvpposition: float4"); - node_shader_write_end_vert(kong, "wvpposition = output.pos;"); + node_shader_write_end_vert(kong, "output.wvpposition = input.pos;"); } if (node_shader_context_is_elem(con, "col")) { node_shader_add_out(kong, "vcolor: float3"); - node_shader_write_attrib_vert(kong, "vcolor = col.rgb;"); + node_shader_write_attrib_vert(kong, "output.vcolor = col.rgb;"); } } @@ -594,7 +594,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } else if (node.type == "TEX_VORONOI") { node_shader_add_function(parser_material_kong, str_tex_voronoi); - node_shader_add_uniform(parser_material_kong, "snoise256: tex2d", "$noise256.k"); + node_shader_add_texture(parser_material_kong, "snoise256", "$noise256.k"); let co: string = parser_material_get_coord(node); let scale: string = parser_material_parse_value_input(node.inputs[1]); let but: ui_node_button_t = node.buttons[0]; //coloring; @@ -636,7 +636,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) let angle: string = parser_material_parse_value_input(node.inputs[1], true); let mask: string = parser_material_parse_value_input(node.inputs[2], true); let tex_name: string = "texwarp_" + parser_material_node_name(node); - node_shader_add_uniform(parser_material_kong, "" + tex_name + ": tex2d", "_" + tex_name); + node_shader_add_texture(parser_material_kong, "" + tex_name, "_" + tex_name); let store: string = parser_material_store_var_name(node); let pi: f32 = math_pi(); parser_material_write(parser_material_kong, "var " + store + "_rad: float = " + angle + " * (" + pi + " / 180);"); @@ -654,7 +654,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } let steps: string = "int(" + strength + " * 10 + 1)"; let tex_name: string = "texblur_" + parser_material_node_name(node); - node_shader_add_uniform(parser_material_kong, "" + tex_name + ": tex2d", "_" + tex_name); + 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: float3 = float3(0.0, 0.0, 0.0);"); parser_material_write(parser_material_kong, "for (var i: int = -" + steps + "; i <= " + steps + "; i += 1) {"); @@ -706,7 +706,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) out_col = "max(" + col1 + ", " + col2 + " * " + fac_var + ")"; } else if (blend == "SCREEN") { - let v3: string = parser_material_to_vec3("1.0 - " + fac_var + ""); + 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") { @@ -876,11 +876,11 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) else if (node.type == "LAYER") { let l: any = node.buttons[0].default_value; if (socket == node.outputs[0]) { // Base - node_shader_add_uniform(parser_material_kong, "texpaint" + l + ": tex2d", "_texpaint" + l); + node_shader_add_texture(parser_material_kong, "texpaint" + l, "_texpaint" + l); return "sample(texpaint" + l + ", tex_coord).rgb"; } else if (socket == node.outputs[5]) { // Normal - node_shader_add_uniform(parser_material_kong, "texpaint_nor" + l + ": tex2d", "_texpaint_nor" + l); + node_shader_add_texture(parser_material_kong, "texpaint_nor" + l, "_texpaint_nor" + l); return "sample(texpaint_nor" + l + ", tex_coord).rgb"; } } @@ -910,12 +910,12 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } else if (node.type == "PICKER") { if (socket == node.outputs[0]) { // Base - node_shader_add_uniform(parser_material_kong, "picker_base: float3", "_picker_base"); - return "picker_base"; + node_shader_add_constant(parser_material_kong, "picker_base: float3", "_picker_base"); + return "constants.picker_base"; } else if (socket == node.outputs[5]) { // Normal - node_shader_add_uniform(parser_material_kong, "picker_normal: float3", "_picker_normal"); - return "picker_normal"; + node_shader_add_constant(parser_material_kong, "picker_normal: float3", "_picker_normal"); + return "constants.picker_normal"; } } else if (node.type == "NEW_GEOMETRY") { @@ -1247,57 +1247,57 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): return parser_material_parse_group_input(node, socket); } else if (node.type == "ATTRIBUTE") { - node_shader_add_uniform(parser_material_kong, "time: float", "_time"); - return "time"; + node_shader_add_constant(parser_material_kong, "time: float", "_time"); + return "constants.time"; } else if (node.type == "VERTEX_COLOR") { return "1.0"; } else if (node.type == "WIREFRAME") { - node_shader_add_uniform(parser_material_kong, "texuvmap: tex2d", "_texuvmap"); + 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"; } else if (node.type == "CAMERA") { if (socket == node.outputs[1]) { // View Z Depth - node_shader_add_uniform(parser_material_kong, "camera_proj: float2", "_camera_plane_proj"); + node_shader_add_constant(parser_material_kong, "camera_proj: float2", "_camera_plane_proj"); parser_material_kong.frag_wvpposition = true; - return "(camera_proj.y / ((wvpposition.z / wvpposition.w) - camera_proj.x))"; + return "(constants.camera_proj.y / ((wvpposition.z / wvpposition.w) - constants.camera_proj.x))"; } else { // View Distance - node_shader_add_uniform(parser_material_kong, "eye: float3", "_camera_pos"); + node_shader_add_constant(parser_material_kong, "eye: float3", "_camera_pos"); parser_material_kong.frag_wposition = true; - return "distance(eye, wposition)"; + return "distance(constants.eye, wposition)"; } } else if (node.type == "LAYER") { let l: any = node.buttons[0].default_value; if (socket == node.outputs[1]) { // Opac - node_shader_add_uniform(parser_material_kong, "texpaint" + l + ": tex2d", "_texpaint" + l); + node_shader_add_texture(parser_material_kong, "texpaint" + l, "_texpaint" + l); return "sample(texpaint" + l + ", tex_coord).a"; } else if (socket == node.outputs[2]) { // Occ - node_shader_add_uniform(parser_material_kong, "texpaint_pack" + l + ": tex2d", "_texpaint_pack" + l); + node_shader_add_texture(parser_material_kong, "texpaint_pack" + l, "_texpaint_pack" + l); return "sample(texpaint_pack" + l + ", tex_coord).r"; } else if (socket == node.outputs[3]) { // Rough - node_shader_add_uniform(parser_material_kong, "texpaint_pack" + l + ": tex2d", "_texpaint_pack" + l); + node_shader_add_texture(parser_material_kong, "texpaint_pack" + l, "_texpaint_pack" + l); return "sample(texpaint_pack" + l + ", tex_coord).g"; } else if (socket == node.outputs[4]) { // Metal - node_shader_add_uniform(parser_material_kong, "texpaint_pack" + l + ": tex2d", "_texpaint_pack" + l); + node_shader_add_texture(parser_material_kong, "texpaint_pack" + l, "_texpaint_pack" + l); return "sample(texpaint_pack" + l + ", tex_coord).b"; } else if (socket == node.outputs[7]) { // Height - node_shader_add_uniform(parser_material_kong, "texpaint_pack" + l + ": tex2d", "_texpaint_pack" + l); + node_shader_add_texture(parser_material_kong, "texpaint_pack" + l, "_texpaint_pack" + l); return "sample(texpaint_pack" + l + ", 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_uniform(parser_material_kong, "texpaint" + l + ": tex2d", "_texpaint" + l); + node_shader_add_texture(parser_material_kong, "texpaint" + l, "_texpaint" + l); return "sample(texpaint" + l + ", tex_coord).r"; } } @@ -1334,24 +1334,24 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): } else if (node.type == "PICKER") { if (socket == node.outputs[1]) { - node_shader_add_uniform(parser_material_kong, "picker_opacity: float", "_picker_opacity"); - return "picker_opacity"; + node_shader_add_constant(parser_material_kong, "picker_opacity: float", "_picker_opacity"); + return "constants.picker_opacity"; } else if (socket == node.outputs[2]) { - node_shader_add_uniform(parser_material_kong, "picker_occlusion: float", "_picker_occlusion"); - return "picker_occlusion"; + node_shader_add_constant(parser_material_kong, "picker_occlusion: float", "_picker_occlusion"); + return "constants.picker_occlusion"; } else if (socket == node.outputs[3]) { - node_shader_add_uniform(parser_material_kong, "picker_roughness: float", "_picker_roughness"); - return "picker_roughness"; + node_shader_add_constant(parser_material_kong, "picker_roughness: float", "_picker_roughness"); + return "constants.picker_roughness"; } else if (socket == node.outputs[4]) { - node_shader_add_uniform(parser_material_kong, "picker_metallic: float", "_picker_metallic"); - return "picker_metallic"; + node_shader_add_constant(parser_material_kong, "picker_metallic: float", "_picker_metallic"); + return "constants.picker_metallic"; } else if (socket == node.outputs[7]) { - node_shader_add_uniform(parser_material_kong, "picker_height: float", "_picker_height"); - return "picker_height"; + node_shader_add_constant(parser_material_kong, "picker_height: float", "_picker_height"); + return "constants.picker_height"; } } else if (node.type == "FRESNEL") { @@ -1396,16 +1396,16 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): } else if (node.type == "OBJECT_INFO") { if (socket == node.outputs[1]) { // Object Index - node_shader_add_uniform(parser_material_kong, "object_info_index: float", "_object_info_index"); - return "object_info_index"; + node_shader_add_constant(parser_material_kong, "object_info_index: float", "_object_info_index"); + return "constants.object_info_index"; } else if (socket == node.outputs[2]) { // Material Index - node_shader_add_uniform(parser_material_kong, "object_info_material_index: float", "_object_info_material_index"); - return "object_info_material_index"; + node_shader_add_constant(parser_material_kong, "object_info_material_index: float", "_object_info_material_index"); + return "constants.object_info_material_index"; } else if (socket == node.outputs[3]) { // Random - node_shader_add_uniform(parser_material_kong, "object_info_random: float", "_object_info_random"); - return "object_info_random"; + node_shader_add_constant(parser_material_kong, "object_info_random: float", "_object_info_random"); + return "constants.object_info_random"; } } else if (node.type == "VALUE") { @@ -1481,7 +1481,7 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): } else if (node.type == "TEX_VORONOI") { node_shader_add_function(parser_material_kong, str_tex_voronoi); - node_shader_add_uniform(parser_material_kong, "sampler2D snoise256", "$noise256.k"); + node_shader_add_texture(parser_material_kong, "snoise256", "$noise256.k"); let co: string = parser_material_get_coord(node); let scale: string = parser_material_parse_value_input(node.inputs[1]); let but: ui_node_button_t = node.buttons[0]; // coloring @@ -1511,7 +1511,7 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): return "0.0"; } let tex_name: string = "texbake_" + parser_material_node_name(node); - node_shader_add_uniform(parser_material_kong, "" + tex_name + ": tex2d", "_" + tex_name); + 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;"); return store + "_res"; @@ -1657,7 +1657,7 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): let str: string = sys_buffer_to_string(script); let link: string = parser_material_node_name(node); map_set(parser_material_script_links, link, str); - node_shader_add_uniform(parser_material_kong, "float " + link, "_" + link); + node_shader_add_constant(parser_material_kong, "float " + link, "_" + link); return link; } else if (node.type == "SHADER_GPU") { @@ -1870,7 +1870,7 @@ function parser_material_store_var_name(node: ui_node_t): string { function parser_material_texture_store(node: ui_node_t, tex: bind_tex_t, tex_name: string, color_space: i32): string { array_push(parser_material_matcon.bind_textures, tex); node_shader_context_add_elem(parser_material_kong.context, "tex", "short2norm"); - node_shader_add_uniform(parser_material_kong, "" + tex_name + ": tex2d"); + node_shader_add_texture(parser_material_kong, "" + tex_name); let uv_name: string = ""; if (parser_material_get_input_link(node.inputs[0]) != null) { uv_name = parser_material_parse_vector_input(node.inputs[0]); diff --git a/base/sources/ts/strings.ts b/base/sources/ts/strings.ts index fb6bffef..1ef45ba6 100644 --- a/base/sources/ts/strings.ts +++ b/base/sources/ts/strings.ts @@ -246,6 +246,10 @@ fun cotangent_frame(n: float3, p: float3, tex_coord: float2): float3x3 { \ } \ "; +let str_transpose: string = "\ +fun _transpose(m: float3x3): float3x3 { return float3x3(m[0][0], m[1][0], m[2][0], m[0][1], m[1][1], m[2][1], m[0][2], m[1][2], m[2][2]); }\ +"; + let str_octahedron_wrap: string = "\ fun octahedron_wrap(v: float2): float2 { \ var a: float2; \ @@ -315,21 +319,21 @@ fun create_basis(normal: float3, out tangent: float3, out binormal: float3) { \ "; let str_sh_irradiance: string = "\ -fun sh_irradiance(float3 nor, shirr: float4[7]): float3 { \ +fun sh_irradiance(float3 nor): float3 { \ var c1: float = 0.429043; \ var c2: float = 0.511664; \ var c3: float = 0.743125; \ var c4: float = 0.886227; \ var c5: float = 0.247708; \ - var cl00: float3 = float3(shirr[0].x, shirr[0].y, shirr[0].z); \ - var cl1m1: float3 = float3(shirr[0].w, shirr[1].x, shirr[1].y); \ - var cl10: float3 = float3(shirr[1].z, shirr[1].w, shirr[2].x); \ - var cl11: float3 = float3(shirr[2].y, shirr[2].z, shirr[2].w); \ - var cl2m2: float3 = float3(shirr[3].x, shirr[3].y, shirr[3].z); \ - var cl2m1: float3 = float3(shirr[3].w, shirr[4].x, shirr[4].y); \ - var cl20: float3 = float3(shirr[4].z, shirr[4].w, shirr[5].x); \ - var cl21: float3 = float3(shirr[5].y, shirr[5].z, shirr[5].w); \ - var cl22: float3 = float3(shirr[6].x, shirr[6].y, shirr[6].z); \ + var cl00: float3 = float3(constants.shirr0.x, constants.shirr0.y, constants.shirr0.z); \ + var cl1m1: float3 = float3(constants.shirr0.w, constants.shirr1.x, constants.shirr1.y); \ + var cl10: float3 = float3(constants.shirr1.z, constants.shirr1.w, constants.shirr2.x); \ + var cl11: float3 = float3(constants.shirr2.y, constants.shirr2.z, constants.shirr2.w); \ + var cl2m2: float3 = float3(constants.shirr3.x, constants.shirr3.y, constants.shirr3.z); \ + var cl2m1: float3 = float3(constants.shirr3.w, constants.shirr4.x, constants.shirr4.y); \ + var cl20: float3 = float3(constants.shirr4.z, constants.shirr4.w, constants.shirr5.x); \ + var cl21: float3 = float3(constants.shirr5.y, constants.shirr5.z, constants.shirr5.w); \ + var cl22: float3 = float3(constants.shirr6.x, constants.shirr6.y, constants.shirr6.z); \ return ( \ c1 * cl22 * (nor.y * nor.y - (-nor.z) * (-nor.z)) + \ c3 * cl20 * nor.x * nor.x + \