diff --git a/armorlab/sources/make_mesh.ts b/armorlab/sources/make_mesh.ts index fb9055c4..2ec4cdaa 100644 --- a/armorlab/sources/make_mesh.ts +++ b/armorlab/sources/make_mesh.ts @@ -38,9 +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_out(kong, "prevwvpposition: float4"); node_shader_add_uniform(kong, "VP: float4x4", "_view_proj_matrix"); - node_shader_add_uniform(kong, "prevWVP: float4x4", "_prev_world_view_proj_matrix"); kong.vert_wposition = true; let texture_count: i32 = 0; @@ -57,13 +55,6 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte 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;"); - if (make_material_height_used && displace_strength > 0) { - node_shader_add_uniform(kong, "invW: float4x4", "_inv_world_matrix"); - node_shader_write_vert(kong, "prevwvpposition = prevWVP * (invW * float4(wposition, 1.0));"); - } - else { - node_shader_write_vert(kong, "prevwvpposition = prevWVP * float4(pos.xyz, 1.0);"); - } kong.frag_out = "float4[3]"; kong.frag_n = true; @@ -136,7 +127,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.viewport_shader != null) { node_shader_write_frag(kong, "output_color: float3;"); js_call_ptr(context_raw.viewport_shader, kong); - node_shader_write_frag(kong, "output[1] = float4(output_color, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(output_color, 1.0);"); } else if (context_raw.render_mode == render_mode_t.FORWARD && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { kong.frag_wposition = true; @@ -144,7 +135,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "var f0: float3 = lerp(float3(0.04, 0.04, 0.04), basecol, metallic);"); kong.frag_vvec = true; node_shader_write_frag(kong, "var dotnv: float = max(0.0, dot(n, vvec));"); - node_shader_write_frag(kong, "var env_brdf: float2 = senvmap_brdf[int2(vec2(roughness, 1.0 - dotnv) * 256.0)].xy;"); + 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_write_frag(kong, "var wreflect: float3 = reflect(-vvec, n);"); @@ -152,39 +143,39 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte 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_add_function(kong, str_sh_irradiance()); + 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, "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, "output[1] = float4(indirect, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(indirect, 1.0);"); } else { // Deferred, Pathtraced - node_shader_write_frag(kong, "output[1] = float4(basecol, occlusion);"); + node_shader_write_frag(kong, "output[1].rgba = float4(basecol, occlusion);"); } } else if (context_raw.viewport_mode == viewport_mode_t.BASE_COLOR) { - node_shader_write_frag(kong, "output[1] = float4(basecol, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(basecol, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.NORMAL_MAP) { - node_shader_write_frag(kong, "output[1] = float4(ntex.rgb, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(ntex.rgb, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OCCLUSION) { - node_shader_write_frag(kong, "output[1] = float4(float3(occlusion, occlusion, occlusion), 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(float3(occlusion, occlusion, occlusion), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.ROUGHNESS) { - node_shader_write_frag(kong, "output[1] = float4(float3(roughness, roughness, roughness), 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(float3(roughness, roughness, roughness), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.METALLIC) { - node_shader_write_frag(kong, "output[1] = float4(float3(metallic, metallic, metallic), 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(float3(metallic, metallic, metallic), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OPACITY) { - node_shader_write_frag(kong, "output[1] = float4(float3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(float3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.HEIGHT) { - node_shader_write_frag(kong, "output[1] = float4(float3(height, height, height), 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(float3(height, height, height), 1.0);"); } else { - node_shader_write_frag(kong, "output[1] = float4(1.0, 0.0, 1.0, 1.0);"); // Pink + node_shader_write_frag(kong, "output[1].rgba = float4(1.0, 0.0, 1.0, 1.0);"); // Pink } if (context_raw.viewport_mode != viewport_mode_t.LIT && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { @@ -192,9 +183,10 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } node_shader_write_frag(kong, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); - node_shader_write_frag(kong, "n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy);"); - node_shader_write_frag(kong, "output[0] = float4(n.xy, roughness, pack_f32_i16(metallic, uint(int(matid * 255.0) % 3)));"); - node_shader_write_frag(kong, "output[2] = float4(0.0, 0.0, tex_coord.xy);"); + // 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);"); 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 57d69a70..4e3a11c9 100644 --- a/armorlab/sources/make_paint.ts +++ b/armorlab/sources/make_paint.ts @@ -54,9 +54,9 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_add_uniform(kong, "texpaint: tex2d"); node_shader_add_uniform(kong, "texpaint_nor: tex2d"); node_shader_add_uniform(kong, "texpaint_pack: tex2d"); - node_shader_write_frag(kong, "output[0] = sample_lod(texpaint, tex_coord_inp, 0.0);"); - node_shader_write_frag(kong, "output[1] = sample_lod(texpaint_nor, tex_coord_inp, 0.0);"); - node_shader_write_frag(kong, "output[2] = sample_lod(texpaint_pack, tex_coord_inp, 0.0);"); + node_shader_write_frag(kong, "output[0].rgba = sample_lod(texpaint, tex_coord_inp, 0.0);"); + node_shader_write_frag(kong, "output[1].rgba = sample_lod(texpaint_nor, tex_coord_inp, 0.0);"); + node_shader_write_frag(kong, "output[2].rgba = sample_lod(texpaint_pack, tex_coord_inp, 0.0);"); node_shader_write_frag(kong, "output[3].rg = tex_coord_inp.xy;"); con_paint.data.shader_from_source = true; gpu_create_shaders_from_kong(node_shader_get(kong), ADDRESS(con_paint.data.vertex_shader), ADDRESS(con_paint.data.fragment_shader)); @@ -108,7 +108,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad 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(vec2(inplast.x, 1.0 - inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);"); + node_shader_write_frag(kong, "var winplast: float4 = float4(float2(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.xyz /= winplast.w;"); @@ -152,12 +152,12 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad 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) { - node_shader_write_frag(kong, "output[0] = float4(0.0, 0.0, 0.0, 0.0);"); - node_shader_write_frag(kong, "output[1] = float4(0.5, 0.5, 1.0, 0.0);"); - node_shader_write_frag(kong, "output[2] = float4(1.0, 0.0, 0.0, 0.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(0.0, 0.0, 0.0, 0.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(0.5, 0.5, 1.0, 0.0);"); + node_shader_write_frag(kong, "output[2].rgba = float4(1.0, 0.0, 0.0, 0.0);"); } - node_shader_write_frag(kong, "output[3] = float4(str, 0.0, 0.0, 1.0);"); + node_shader_write_frag(kong, "output[3].rgba = float4(str, 0.0, 0.0, 1.0);"); parser_material_finalize(con_paint); parser_material_sample_keep_aspect = false; diff --git a/armorpaint/assets/plugins/hello_node.js b/armorpaint/assets/plugins/hello_node.js index 1cb2ee76..16c662f0 100644 --- a/armorpaint/assets/plugins/hello_node.js +++ b/armorpaint/assets/plugins/hello_node.js @@ -72,7 +72,7 @@ parser_material_custom_nodes_set(node_type, function(node, socket_name) { ); if (socket_name == "Color") { - return "vec3(" + my_out + ", " + my_out + ", " + my_out + ")"; + return "float3(" + my_out + ", " + my_out + ", " + my_out + ")"; } else if (socket_name == "Fac") { return my_out; diff --git a/armorpaint/assets/plugins/viewport_celshade.js b/armorpaint/assets/plugins/viewport_celshade.js index d489bcb6..a6ec09bd 100644 --- a/armorpaint/assets/plugins/viewport_celshade.js +++ b/armorpaint/assets/plugins/viewport_celshade.js @@ -3,9 +3,9 @@ let plugin = plugin_create(); // Register custom viewport shader context_set_viewport_shader(function(shader) { - // node_shader_add_uniform(shader, "vec3 light_dir", "_light_dir"); + // node_shader_add_uniform(shader, "light_dir: float3", "_light_dir"); node_shader_write_frag(shader, " \ - vec3 light_dir = vec3(0.5, 0.5, -0.5);\ + var light_dir: float3 = float3(0.5, 0.5, -0.5);\ float dotnl = max(dot(n, light_dir), 0.0); \ output_color = basecol * step(0.5, dotnl) + basecol; \ "); diff --git a/armorpaint/sources/make_bake.ts b/armorpaint/sources/make_bake.ts index 5dd73828..5abbe9ee 100644 --- a/armorpaint/sources/make_bake.ts +++ b/armorpaint/sources/make_bake.ts @@ -9,28 +9,29 @@ function make_bake_run(con: node_shader_context_t, kong: node_shader_t) { radius = "float(" + radius + ")"; offset = "float(" + offset + ")"; kong.frag_n = true; - node_shader_write_frag(kong, "var dx: float3 = dFdx(n);"); - node_shader_write_frag(kong, "var dy: float3 = dFdy(n);"); + node_shader_write_frag(kong, "var dx: float3 = ddx3(n);"); + node_shader_write_frag(kong, "var dy: float3 = ddy3(n);"); node_shader_write_frag(kong, "var curvature: float = max(dot(dx, dx), dot(dy, dy));"); node_shader_write_frag(kong, "curvature = clamp(pow(curvature, (1.0 / " + radius + ") * 0.25) * " + strength + " * 2.0 + " + offset + " / 10.0, 0.0, 1.0);"); if (context_raw.bake_axis != bake_axis_t.XYZ) { let axis: string = make_bake_axis_string(context_raw.bake_axis); node_shader_write_frag(kong, "curvature *= dot(n, " + axis + ");"); } - node_shader_write_frag(kong, "output[0] = float4(curvature, curvature, curvature, 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(curvature, curvature, curvature, 1.0);"); } 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_function(kong, str_cotangent_frame); - node_shader_write_frag(kong, "var invTBN: float3x3 = transpose(cotangent_frame(n, n, tex_coord));"); + 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_write_frag(kong, "var res: float3 = normalize(invTBN * n0) * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5);"); - node_shader_write_frag(kong, "output[0] = float4(res, 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(res, 1.0);"); } else if (context_raw.bake_type == bake_type_t.NORMAL_OBJECT) { kong.frag_n = true; - node_shader_write_frag(kong, "output[0] = float4(n * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5), 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(n * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5), 1.0);"); if (context_raw.bake_up_axis == bake_up_axis_t.Y) { node_shader_write_frag(kong, "output[0].rgb = float3(output[0].r, output[0].b, 1.0 - output[0].g);"); } @@ -40,26 +41,26 @@ function make_bake_run(con: node_shader_context_t, kong: node_shader_t) { 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_write_frag(kong, "var res: float = distance(wpos0, wposition) * 10.0;"); - node_shader_write_frag(kong, "output[0] = float4(res, res, res, 1.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 = dFdx(tex_coord);"); - node_shader_write_frag(kong, "var tex_dy: float2 = dFdy(tex_coord);"); + 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_write_frag(kong, "output[0] = float4((h1 - h0) * 0.5 + 0.5, (h2 - h0) * 0.5 + 0.5, 0.0, 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4((h1 - h0) * 0.5 + 0.5, (h2 - h0) * 0.5 + 0.5, 0.0, 1.0);"); } else if (context_raw.bake_type == bake_type_t.POSITION) { kong.frag_wposition = true; - node_shader_write_frag(kong, "output[0] = float4(wposition * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5), 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(wposition * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5), 1.0);"); if (context_raw.bake_up_axis == bake_up_axis_t.Y) { node_shader_write_frag(kong, "output[0].rgb = float3(output[0].r, output[0].b, 1.0 - output[0].g);"); } } else if (context_raw.bake_type == bake_type_t.TEXCOORD) { - node_shader_write_frag(kong, "output[0] = float4(tex_coord.xy, 0.0, 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(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"); @@ -67,7 +68,7 @@ function make_bake_run(con: node_shader_context_t, kong: node_shader_t) { 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] = float4(matid_r, matid_g, matid_b, 1.0);"); + 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"); @@ -75,15 +76,15 @@ function make_bake_run(con: node_shader_context_t, kong: node_shader_t) { 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);"); - node_shader_write_frag(kong, "output[0] = float4(id_r, id_g, id_b, 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(id_r, id_g, id_b, 1.0);"); } else if (context_raw.bake_type == bake_type_t.VERTEX_COLOR) { if (con.allow_vcols) { node_shader_context_add_elem(con, "col", "short4norm"); - node_shader_write_frag(kong, "output[0] = float4(vcolor.r, vcolor.g, vcolor.b, 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(vcolor.r, vcolor.g, vcolor.b, 1.0);"); } else { - node_shader_write_frag(kong, "output[0] = float4(1.0, 1.0, 1.0, 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(1.0, 1.0, 1.0, 1.0);"); } } } @@ -97,8 +98,8 @@ function make_bake_position_normal(kong: node_shader_t) { 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, "output.pos = float4(tpos, 0.0, 1.0);"); kong.frag_out = "float4[2]"; - node_shader_write_frag(kong, "output[0] = float4(position, 1.0);"); - node_shader_write_frag(kong, "output[1] = float4(normal, 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(position, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(normal, 1.0);"); } function make_bake_set_color_writes(con_paint: node_shader_context_t) { diff --git a/armorpaint/sources/make_brush.ts b/armorpaint/sources/make_brush.ts index 23004252..0346998f 100644 --- a/armorpaint/sources/make_brush.ts +++ b/armorpaint/sources/make_brush.ts @@ -28,7 +28,8 @@ function make_brush_run(kong: node_shader_t) { node_shader_write_frag(kong, "var g0: float2 = sample_lod(gbuffer0, inp.xy, 0.0).rg;"); node_shader_write_frag(kong, "var wn: float3;"); node_shader_write_frag(kong, "wn.z = 1.0 - abs(g0.x) - abs(g0.y);"); - node_shader_write_frag(kong, "wn.xy = wn.z >= 0.0 ? g0.xy : octahedron_wrap(g0.xy);"); + // node_shader_write_frag(kong, "wn.xy = wn.z >= 0.0 ? g0.xy : octahedron_wrap(g0.xy);"); + node_shader_write_frag(kong, "if (wn.z >= 0.0) { wn.xy = g0.xy; } else { wn.xy = octahedron_wrap(g0.xy); }"); node_shader_write_frag(kong, "wn = normalize(wn);"); node_shader_write_frag(kong, "var plane_dist: float = dot(wn, winp.xyz - wposition);"); diff --git a/armorpaint/sources/make_colorid_picker.ts b/armorpaint/sources/make_colorid_picker.ts index 8fc6d4ea..a0307f9e 100644 --- a/armorpaint/sources/make_colorid_picker.ts +++ b/armorpaint/sources/make_colorid_picker.ts @@ -21,17 +21,17 @@ function make_colorid_picker_run(kong: node_shader_t) { node_shader_add_uniform(kong, "gbufferD: tex2d"); node_shader_add_uniform(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] = 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] = 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(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);"); } 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_write_frag(kong, "output[0] = sample_lod(texpaint, tex_coord_inp, 0.0);"); - node_shader_write_frag(kong, "output[1] = sample_lod(texpaint_nor, tex_coord_inp, 0.0);"); - node_shader_write_frag(kong, "output[2] = sample_lod(texpaint_pack, tex_coord_inp, 0.0);"); + node_shader_write_frag(kong, "output[0].rgba = sample_lod(texpaint, tex_coord_inp, 0.0);"); + node_shader_write_frag(kong, "output[1].rgba = sample_lod(texpaint_nor, tex_coord_inp, 0.0);"); + node_shader_write_frag(kong, "output[2].rgba = sample_lod(texpaint_pack, tex_coord_inp, 0.0);"); node_shader_write_frag(kong, "output[3].rg = tex_coord_inp.xy;"); } } diff --git a/armorpaint/sources/make_mesh.ts b/armorpaint/sources/make_mesh.ts index e71f3dbe..bd8c0743 100644 --- a/armorpaint/sources/make_mesh.ts +++ b/armorpaint/sources/make_mesh.ts @@ -36,7 +36,6 @@ 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_uniform(kong, "prevWVP: float4x4", "_prev_world_view_proj_matrix"); kong.vert_wposition = true; let texture_count: i32 = 0; @@ -83,9 +82,9 @@ 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_write_frag(kong, "output[0] = float4(n.xy, 1.0, pack_f32_i16(0.0, uint(0)));"); - node_shader_write_frag(kong, "float3 idcol = pow(sample_lod(texcolorid, tex_coord, 0.0).rgb, float3(2.2, 2.2, 2.2));"); - node_shader_write_frag(kong, "output[1] = float4(idcol.rgb, 1.0);"); // occ + 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, "output[1].rgba = float4(idcol.rgb, 1.0);"); // occ } else { node_shader_add_function(kong, str_octahedron_wrap); @@ -299,7 +298,7 @@ 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, "vec2 texpaint_size", "_texpaint_size"); + 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;"); @@ -342,9 +341,9 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (!last_pass) { - node_shader_write_frag(kong, "output[0] = float4(basecol, opacity);"); - node_shader_write_frag(kong, "output[1] = float4(ntex, matid);"); - node_shader_write_frag(kong, "output[2] = float4(occlusion, roughness, metallic, height);"); + node_shader_write_frag(kong, "output[0].rgba = float4(basecol, opacity);"); + node_shader_write_frag(kong, "output[1].rgba = float4(ntex, matid);"); + node_shader_write_frag(kong, "output[2].rgba = float4(occlusion, roughness, metallic, height);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; gpu_create_shaders_from_kong(node_shader_get(kong), ADDRESS(con_mesh.data.vertex_shader), ADDRESS(con_mesh.data.fragment_shader)); @@ -363,7 +362,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.viewport_shader != null) { node_shader_write_frag(kong, "var output_color: float3;"); js_call_ptr(context_raw.viewport_shader, kong); - node_shader_write_frag(kong, "output[1] = float4(output_color, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(output_color, 1.0);"); } else if (context_raw.render_mode == render_mode_t.FORWARD && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { kong.frag_wposition = true; @@ -379,54 +378,54 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte 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_add_function(kong, str_sh_irradiance()); + 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, "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, "output[1] = float4(indirect, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(indirect, 1.0);"); } else { // Deferred, Pathtraced if (make_material_emis_used) { node_shader_write_frag(kong, "if (int(matid * 255.0) % 3 == 1) { basecol *= 10.0 };"); // Boost for bloom } - node_shader_write_frag(kong, "output[1] = float4(basecol, occlusion);"); + node_shader_write_frag(kong, "output[1].rgba = float4(basecol, occlusion);"); } } else if (context_raw.viewport_mode == viewport_mode_t.BASE_COLOR && context_raw.layer.paint_base) { - node_shader_write_frag(kong, "output[1] = float4(basecol, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(basecol, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.NORMAL_MAP && context_raw.layer.paint_nor) { - node_shader_write_frag(kong, "output[1] = float4(ntex.rgb, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(ntex.rgb, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OCCLUSION && context_raw.layer.paint_occ) { - node_shader_write_frag(kong, "output[1] = float4(float3(occlusion, occlusion, occlusion), 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(float3(occlusion, occlusion, occlusion), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.ROUGHNESS && context_raw.layer.paint_rough) { - node_shader_write_frag(kong, "output[1] = float4(float3(roughness, roughness, roughness), 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(float3(roughness, roughness, roughness), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.METALLIC && context_raw.layer.paint_met) { - node_shader_write_frag(kong, "output[1] = float4(float3(metallic, metallic, metallic), 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(float3(metallic, metallic, metallic), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OPACITY && context_raw.layer.paint_opac) { - node_shader_write_frag(kong, "output[1] = float4(float3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(float3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.HEIGHT && context_raw.layer.paint_height) { - node_shader_write_frag(kong, "output[1] = float4(float3(height, height, height), 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(float3(height, height, height), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.EMISSION) { node_shader_write_frag(kong, "float emis = int(matid * 255.0) % 3 == 1 ? 1.0 : 0.0;"); - node_shader_write_frag(kong, "output[1] = float4(float3(emis, emis, emis), 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(float3(emis, emis, emis), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.SUBSURFACE) { node_shader_write_frag(kong, "float subs = int(matid * 255.0) % 3 == 2 ? 1.0 : 0.0;"); - node_shader_write_frag(kong, "output[1] = float4(float3(subs, subs, subs), 1.0);"); + 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] = float4(tex_coord, 0.0, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(tex_coord, 0.0, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) { kong.frag_nattr = true; - node_shader_write_frag(kong, "output[1] = float4(nattr, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(nattr, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.MATERIAL_ID) { let id: i32 = context_raw.layer.id; @@ -436,7 +435,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte 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] = float4(matid_r, matid_g, matid_b, 1.0);"); + 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"); @@ -444,7 +443,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte 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);"); - node_shader_write_frag(kong, "output[1] = float4(id_r, id_g, id_b, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(id_r, id_g, id_b, 1.0);"); } 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)) { @@ -464,22 +463,23 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "mask_view = " + mask + ";"); } } - node_shader_write_frag(kong, "output[1] = float4(mask_view, mask_view, mask_view, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(mask_view, mask_view, mask_view, 1.0);"); } else { - node_shader_write_frag(kong, "output[1] = float4(1.0, 0.0, 1.0, 1.0);"); // Pink + node_shader_write_frag(kong, "output[1].rgba = float4(1.0, 0.0, 1.0, 1.0);"); // Pink } if (context_raw.viewport_mode != viewport_mode_t.LIT && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { - node_shader_write_frag(kong, "output[1].rgb = pow(output[1].rgb, vec3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "output[1].rgb = pow(output[1].rgb, float3(2.2, 2.2, 2.2));"); } node_shader_write_frag(kong, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); - node_shader_write_frag(kong, "n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy);"); - node_shader_write_frag(kong, "output[0] = float4(n.xy, roughness, pack_f32_i16(metallic, uint(int(matid * 255.0) % 3)));"); + // 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] = float4(0.0, 0.0, tex_coord.xy);"); + node_shader_write_frag(kong, "output[2].rgba = float4(0.0, 0.0, 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 5aa87f8b..15ca38a8 100644 --- a/armorpaint/sources/make_mesh_preview.ts +++ b/armorpaint/sources/make_mesh_preview.ts @@ -56,7 +56,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no let sc: f32 = context_raw.brush_scale * context_raw.brush_nodes_scale; let brush_scale: string = sc + ""; - node_shader_add_out(kong, "tex_coord: float 2"); + node_shader_add_out(kong, "tex_coord: float2"); node_shader_write_attrib_vert(kong, "tex_coord = tex * float(" + brush_scale + ");"); let decal: bool = context_raw.decal_preview; @@ -103,8 +103,8 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no if (make_material_height_used) { node_shader_write_frag(kong, "if (height > 0.0) {"); - node_shader_write_frag(kong, "var height_dx: float = dFdx(height * 2.0);"); - node_shader_write_frag(kong, "var height_dy: float = dFdy(height * 2.0);"); + node_shader_write_frag(kong, "var height_dx: float = ddx(height * 2.0);"); + node_shader_write_frag(kong, "var height_dy: float = ddy(height * 2.0);"); // Whiteout blend node_shader_write_frag(kong, "var n1: float3 = nortan * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); node_shader_write_frag(kong, "var n2: float3 = normalize(float3(height_dx * 16.0, height_dy * 16.0, 1.0));"); @@ -125,18 +125,19 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no } node_shader_write_frag(kong, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); - node_shader_write_frag(kong, "n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy);"); + // 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); }"); // uint matid = uint(0); if (decal) { - node_shader_write_frag(kong, "output[0] = float4(n.x, n.y, roughness, pack_f32_i16(metallic, uint(0)));"); // metallic/matid - node_shader_write_frag(kong, "output[1] = float4(basecol, occlusion);"); + node_shader_write_frag(kong, "output[0].rgba = float4(n.x, n.y, roughness, pack_f32_i16(metallic, uint(0)));"); // metallic/matid + node_shader_write_frag(kong, "output[1].rgba = float4(basecol, occlusion);"); } else { - node_shader_write_frag(kong, "output[0] = float4(n.x, n.y, mix(1.0, roughness, opacity), pack_f32_i16(mix(1.0, metallic, opacity), uint(0)));"); // metallic/matid - node_shader_write_frag(kong, "output[1] = float4(mix(float3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); + node_shader_write_frag(kong, "output[0].rgba = float4(n.x, n.y, lerp(1.0, roughness, opacity), pack_f32_i16(lerp(1.0, metallic, opacity), uint(0)));"); // metallic/matid + node_shader_write_frag(kong, "output[1].rgba = float4(lerp(float3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); } - node_shader_write_frag(kong, "output[2] = float4(0.0, 0.0, 0.0, 0.0);"); + node_shader_write_frag(kong, "output[2].rgba = float4(0.0, 0.0, 0.0, 0.0);"); parser_material_finalize(con_mesh); diff --git a/armorpaint/sources/make_paint.ts b/armorpaint/sources/make_paint.ts index d254dc0f..6d5be742 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, "vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);"); + 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, "gl_Position = vec4(tpos, 0.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, "mat4 WVP", "_decal_layer_matrix"); + node_shader_add_uniform(kong, "WVP: float4x4", "_decal_layer_matrix"); } else { - node_shader_add_uniform(kong, "mat4 WVP", "_world_view_proj_matrix"); + node_shader_add_uniform(kong, "WVP: float4x4", "_world_view_proj_matrix"); } - node_shader_add_out(kong, "vec4 ndc"); - node_shader_write_attrib_vert(kong, "ndc = mul(vec4(pos.xyz, 1.0), WVP);"); + node_shader_add_out(kong, "ndc: float4"); + node_shader_write_attrib_vert(kong, "ndc = WVP * float4(pos.xyz, 1.0);"); - node_shader_write_attrib_frag(kong, "vec3 sp = vec3((ndc.xyz / ndc.w) * 0.5 + 0.5);"); + node_shader_write_attrib_frag(kong, "var sp: float3 = float3((ndc.xyz / 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, "vec4 inp", "_input_brush"); - node_shader_add_uniform(kong, "vec4 inplast", "_input_brush_last"); - node_shader_add_uniform(kong, "float aspect_ratio", "_aspect_ratio_window"); - node_shader_write_frag(kong, "vec2 bsp = sp.xy * 2.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, "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 = bsp * 0.5 + 0.5;"); - node_shader_add_uniform(kong, "sampler2D gbufferD"); + node_shader_add_uniform(kong, "gbufferD: tex2d"); - kong.frag_out = "vec4 frag_color[4]"; + kong.frag_out = "float4[4]"; - node_shader_add_uniform(kong, "float brush_radius", "_brush_radius"); - node_shader_add_uniform(kong, "float brush_opacity", "_brush_opacity"); - node_shader_add_uniform(kong, "float brush_hardness", "_brush_hardness"); + 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"); if (context_raw.tool == workspace_tool_t.BRUSH || context_raw.tool == workspace_tool_t.ERASER || @@ -144,34 +144,35 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } if (depth_reject) { - node_shader_write_frag(kong, "if (sp.z > textureLod(gbufferD, sp.xy, 0.0).r + 0.0005) discard;"); + node_shader_write_frag(kong, "if (sp.z > sample_lod(gbufferD, sp.xy, 0.0).r + 0.0005) { discard; }"); } make_brush_run(kong); } else { // Fill, Bake - node_shader_write_frag(kong, "float dist = 0.0;"); + node_shader_write_frag(kong, "var dist: float = 0.0;"); 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, "sampler2D gbuffer0"); - node_shader_write_frag(kong, "vec2 g0 = textureLod(gbuffer0, inp.xy, 0.0).rg;"); - node_shader_write_frag(kong, "vec3 wn;"); + 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_write_frag(kong, "var wn: float3;"); node_shader_write_frag(kong, "wn.z = 1.0 - abs(g0.x) - abs(g0.y);"); - node_shader_write_frag(kong, "wn.xy = wn.z >= 0.0 ? g0.xy : octahedron_wrap(g0.xy);"); + // node_shader_write_frag(kong, "wn.xy = wn.z >= 0.0 ? g0.xy : octahedron_wrap(g0.xy);"); + node_shader_write_frag(kong, "if (wn.z >= 0.0) { wn.xy = g0.xy; } else { wn.xy = octahedron_wrap(g0.xy); }"); node_shader_write_frag(kong, "wn = normalize(wn);"); kong.frag_n = true; let angle: f32 = context_raw.brush_angle_reject_dot; - node_shader_write_frag(kong, "if (dot(wn, n) < " + angle + ") discard;"); + node_shader_write_frag(kong, "if (dot(wn, n) < " + angle + ") { discard; }"); } let stencil_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.brush_stencil_image != null; if (stencil_fill) { - node_shader_write_frag(kong, "if (sp.z > textureLod(gbufferD, sp.xy, 0.0).r + 0.0005) discard;"); + node_shader_write_frag(kong, "if (sp.z > sample_lod(gbufferD, sp.xy, 0.0).r + 0.0005) { discard; }"); } } if (context_raw.colorid_picked || face_fill || uv_island_fill) { - node_shader_add_out(kong, "vec2 tex_coord_pick"); + node_shader_add_out(kong, "tex_coord_pick: float2"); node_shader_write_vert(kong, "tex_coord_pick = tex;"); if (context_raw.colorid_picked) { make_discard_color_id(kong); @@ -191,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, "sampler2D gbuffer2"); - node_shader_add_uniform(kong, "vec2 gbuffer_size", "_gbuffer_size"); - node_shader_add_uniform(kong, "sampler2D texpaint_undo", "_texpaint_undo"); - node_shader_add_uniform(kong, "sampler2D texpaint_nor_undo", "_texpaint_nor_undo"); - node_shader_add_uniform(kong, "sampler2D texpaint_pack_undo", "_texpaint_pack_undo"); + 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"); if (context_raw.tool == workspace_tool_t.CLONE) { make_clone_run(kong); @@ -227,14 +228,14 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad let opac: string = sout.out_opacity; let emis: string = sout.out_emission; let subs: string = sout.out_subsurface; - node_shader_write_frag(kong, "vec3 basecol = " + base + ";"); - node_shader_write_frag(kong, "float roughness = " + rough + ";"); - node_shader_write_frag(kong, "float metallic = " + met + ";"); - node_shader_write_frag(kong, "float occlusion = " + occ + ";"); - node_shader_write_frag(kong, "vec3 nortan = " + nortan + ";"); - node_shader_write_frag(kong, "float height = " + height + ";"); - node_shader_write_frag(kong, "float mat_opacity = " + opac + ";"); - node_shader_write_frag(kong, "float opacity = mat_opacity;"); + node_shader_write_frag(kong, "var basecol: float3 = " + base + ";"); + node_shader_write_frag(kong, "var roughness: float = " + rough + ";"); + node_shader_write_frag(kong, "var metallic: float = " + met + ";"); + node_shader_write_frag(kong, "var occlusion: float = " + occ + ";"); + node_shader_write_frag(kong, "var nortan: float3 = " + nortan + ";"); + node_shader_write_frag(kong, "var height: float = " + height + ";"); + node_shader_write_frag(kong, "var mat_opacity: float = " + opac + ";"); + node_shader_write_frag(kong, "var opacity: float = mat_opacity;"); ///if is_forge node_shader_write_frag(kong, "opacity = 1.0;"); ///else @@ -243,10 +244,10 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } ///end if (context_raw.material.paint_emis) { - node_shader_write_frag(kong, "float emis = " + emis + ";"); + node_shader_write_frag(kong, "var emis: float = " + emis + ";"); } if (context_raw.material.paint_subs) { - node_shader_write_frag(kong, "float subs = " + subs + ";"); + node_shader_write_frag(kong, "var subs: float = " + subs + ";"); } if (height != "0.0" && height != "0" && !make_material_height_used) { make_material_height_used = true; @@ -258,8 +259,8 @@ 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, "sampler2D texbrushmask", "_texbrushmask"); - node_shader_write_frag(kong, "vec4 mask_sample = textureLod(texbrushmask, uvsp, 0.0);"); + node_shader_add_uniform(kong, "texbrushmask: tex2d", "_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;"); } @@ -268,8 +269,8 @@ 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, "sampler2D textexttool", "_textexttool"); - node_shader_write_frag(kong, "opacity *= textureLod(textexttool, uvsp, 0.0).r;"); + node_shader_add_uniform(kong, "textexttool: tex2d", "_textexttool"); + node_shader_write_frag(kong, "opacity *= sample_lod(textexttool, uvsp, 0.0).r;"); } if (context_raw.brush_stencil_image != null && ( @@ -281,18 +282,18 @@ 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, "sampler2D texbrushstencil", "_texbrushstencil"); - node_shader_add_uniform(kong, "vec4 stencil_transform", "_stencil_transform"); - node_shader_write_frag(kong, "vec2 stencil_uv = vec2((sp.xy - stencil_transform.xy) / stencil_transform.z * vec2(aspect_ratio, 1.0));"); - node_shader_write_frag(kong, "vec2 stencil_size = vec2(textureSize(texbrushstencil, 0));"); - node_shader_write_frag(kong, "float stencil_ratio = stencil_size.y / stencil_size.x;"); - node_shader_write_frag(kong, "stencil_uv -= vec2(0.5 / stencil_ratio, 0.5);"); - node_shader_write_frag(kong, "stencil_uv = vec2(stencil_uv.x * cos(stencil_transform.w) - stencil_uv.y * sin(stencil_transform.w),\ + 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_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 += vec2(0.5 / stencil_ratio, 0.5);"); + node_shader_write_frag(kong, "stencil_uv += float2(0.5 / stencil_ratio, 0.5);"); node_shader_write_frag(kong, "stencil_uv.x *= stencil_ratio;"); - node_shader_write_frag(kong, "if (stencil_uv.x < 0 || stencil_uv.x > 1 || stencil_uv.y < 0 || stencil_uv.y > 1) discard;"); - node_shader_write_frag(kong, "vec4 texbrushstencil_sample = textureLod(texbrushstencil, stencil_uv, 0.0);"); + node_shader_write_frag(kong, "if (stencil_uv.x < 0 || stencil_uv.x > 1 || stencil_uv.y < 0 || stencil_uv.y > 1) { discard; }"); + node_shader_write_frag(kong, "var texbrushstencil_sample: float4 = sample_lod(texbrushstencil, stencil_uv, 0.0);"); if (context_raw.brush_stencil_image_is_alpha) { node_shader_write_frag(kong, "opacity *= texbrushstencil_sample.a;"); } @@ -302,28 +303,28 @@ 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, "sampler2D texbrushmask", "_texbrushmask"); - node_shader_write_frag(kong, "vec2 binp_mask = inp.xy * 2.0 - 1.0;"); + 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_write_frag(kong, "binp_mask = binp_mask * 0.5 + 0.5;"); - node_shader_write_frag(kong, "vec2 pa_mask = bsp.xy - binp_mask.xy;"); + node_shader_write_frag(kong, "var pa_mask: float2 = bsp.xy - binp_mask.xy;"); if (context_raw.brush_directional) { - node_shader_add_uniform(kong, "vec3 brush_direction", "_brush_direction"); - node_shader_write_frag(kong, "if (brush_direction.z == 0.0) discard;"); - node_shader_write_frag(kong, "pa_mask = vec2(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_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);"); } let angle: f32 = context_raw.brush_angle + context_raw.brush_nodes_angle; if (angle != 0.0) { - node_shader_add_uniform(kong, "vec2 brush_angle", "_brush_angle"); - node_shader_write_frag(kong, "pa_mask.xy = vec2(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_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_write_frag(kong, "pa_mask /= brush_radius;"); if (config_raw.brush_3d) { - node_shader_add_uniform(kong, "vec3 eye", "_camera_pos"); + node_shader_add_uniform(kong, "eye: float3", "_camera_pos"); node_shader_write_frag(kong, "pa_mask *= distance(eye, winp.xyz) / 1.5;"); } node_shader_write_frag(kong, "pa_mask = pa_mask.xy * 0.5 + 0.5;"); - node_shader_write_frag(kong, "vec4 mask_sample = textureLod(texbrushmask, pa_mask, 0.0);"); + node_shader_write_frag(kong, "var mask_sample: float4 = sample_lod(texbrushmask, pa_mask, 0.0);"); if (context_raw.brush_mask_image_is_alpha) { node_shader_write_frag(kong, "opacity *= mask_sample.a;"); } @@ -332,47 +333,47 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } } - node_shader_write_frag(kong, "if (opacity == 0.0) discard;"); + node_shader_write_frag(kong, "if (opacity == 0.0) { discard; }"); if (context_raw.tool == workspace_tool_t.PARTICLE) { // Particle mask make_particle_mask(kong); } else { // Brush cursor mask - node_shader_write_frag(kong, "float str = clamp((brush_radius - dist) * brush_hardness * 400.0, 0.0, 1.0) * opacity;"); - // node_shader_write_frag(kong, "float str = pow(clamp(1.0 - (dist / brush_radius), 0.0, 1.0), 1.0 - brush_hardness) * opacity;"); - // node_shader_write_frag(kong, "float t = clamp(dist / brush_radius, 0.0, 1.0); float falloff = 1.0 - smoothstep(0.0, 1.0, t); float str = pow(falloff, 1.0 / max(brush_hardness, 0.01)) * opacity;"); + 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;"); } // Manual blending to preserve memory kong.frag_wvpposition = true; - node_shader_write_frag(kong, "vec2 sample_tc = vec2(wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); + 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, "sampler2D paintmask"); - node_shader_write_frag(kong, "float sample_mask = textureLod(paintmask, sample_tc, 0.0).r;"); + node_shader_add_uniform(kong, "paintmask: tex2d"); + 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, "sampler2D texpaint_undo", "_texpaint_undo"); - node_shader_write_frag(kong, "vec4 sample_undo = textureLod(texpaint_undo, sample_tc, 0.0);"); + node_shader_add_uniform(kong, "texpaint_undo: tex2d", "_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; if (context_raw.picker_mask_handle.position == picker_mask_t.MATERIAL) { matid = context_raw.materialid_picked / 255; // Keep existing material id in place when mask is set } let matid_string: string = parser_material_vec1(matid * 3.0); - node_shader_write_frag(kong, "float matid = " + matid_string + ";"); + node_shader_write_frag(kong, "var matid: float = " + matid_string + ";"); // matid % 3 == 0 - normal, 1 - emission, 2 - subsurface if (context_raw.material.paint_emis && make_material_emis_used) { node_shader_write_frag(kong, "if (emis > 0.0) {"); node_shader_write_frag(kong, " matid += 1.0 / 255.0;"); - node_shader_write_frag(kong, " if (str == 0.0) discard;"); + node_shader_write_frag(kong, " if (str == 0.0) { discard; }"); node_shader_write_frag(kong, "}"); } else if (context_raw.material.paint_subs && make_material_subs_used) { node_shader_write_frag(kong, "if (subs > 0.0) {"); node_shader_write_frag(kong, " matid += 2.0 / 255.0;"); - node_shader_write_frag(kong, " if (str == 0.0) discard;"); + node_shader_write_frag(kong, " if (str == 0.0) { discard; }"); node_shader_write_frag(kong, "}"); } @@ -380,25 +381,25 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad let layered: bool = context_raw.layer != project_layers[0]; if (layered && !is_mask) { if (context_raw.tool == workspace_tool_t.ERASER) { - node_shader_write_frag(kong, "frag_color[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); - node_shader_write_frag(kong, "nortan = vec3(0.5, 0.5, 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(lerp(sample_undo.rgb, float3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); + node_shader_write_frag(kong, "nortan = float3(0.5, 0.5, 1.0);"); node_shader_write_frag(kong, "occlusion = 1.0;"); node_shader_write_frag(kong, "roughness = 0.0;"); node_shader_write_frag(kong, "metallic = 0.0;"); node_shader_write_frag(kong, "matid = 0.0;"); } else if (context_raw.tool == workspace_tool_t.PARTICLE || decal || context_raw.brush_mask_image != null) { - node_shader_write_frag(kong, "frag_color[0] = vec4(" + make_material_blend_mode(kong, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", max(str, sample_undo.a));"); + node_shader_write_frag(kong, "output[0].rgba = float4(" + make_material_blend_mode(kong, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", max(str, sample_undo.a));"); } else { if (context_raw.layer.fill_layer != null) { - node_shader_write_frag(kong, "frag_color[0] = vec4(" + make_material_blend_mode(kong, context_raw.brush_blending, "sample_undo.rgb", "basecol", "opacity") + ", mat_opacity);"); + node_shader_write_frag(kong, "output[0].rgba = float4(" + make_material_blend_mode(kong, context_raw.brush_blending, "sample_undo.rgb", "basecol", "opacity") + ", mat_opacity);"); } else { - node_shader_write_frag(kong, "frag_color[0] = vec4(" + make_material_blend_mode(kong, context_raw.brush_blending, "sample_undo.rgb", "basecol", "opacity") + ", max(str, sample_undo.a));"); + node_shader_write_frag(kong, "output[0].rgba = float4(" + make_material_blend_mode(kong, context_raw.brush_blending, "sample_undo.rgb", "basecol", "opacity") + ", max(str, sample_undo.a));"); } } - node_shader_write_frag(kong, "frag_color[1] = vec4(nortan, matid);"); + node_shader_write_frag(kong, "output[1].rgba = float4(nortan, matid);"); let height: string = "0.0"; if (context_raw.material.paint_height && make_material_height_used) { @@ -406,40 +407,40 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } if (decal) { - node_shader_add_uniform(kong, "sampler2D texpaint_pack_undo", "_texpaint_pack_undo"); - node_shader_write_frag(kong, "vec4 sample_pack_undo = textureLod(texpaint_pack_undo, sample_tc, 0.0);"); - node_shader_write_frag(kong, "frag_color[2] = mix(sample_pack_undo, vec4(occlusion, roughness, metallic, " + height + "), str);"); + node_shader_add_uniform(kong, "texpaint_pack_undo: tex2d", "_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);"); } else { - node_shader_write_frag(kong, "frag_color[2] = vec4(occlusion, roughness, metallic, " + height + ");"); + node_shader_write_frag(kong, "output[2].rgba = float4(occlusion, roughness, metallic, " + height + ");"); } } else { if (context_raw.tool == workspace_tool_t.ERASER) { - node_shader_write_frag(kong, "frag_color[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); - node_shader_write_frag(kong, "frag_color[1] = vec4(0.5, 0.5, 1.0, 0.0);"); - node_shader_write_frag(kong, "frag_color[2] = vec4(1.0, 0.0, 0.0, 0.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(lerp(sample_undo.rgb, float3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); + node_shader_write_frag(kong, "output[1].rgba = float4(0.5, 0.5, 1.0, 0.0);"); + node_shader_write_frag(kong, "output[2].rgba = float4(1.0, 0.0, 0.0, 0.0);"); } else { - node_shader_add_uniform(kong, "sampler2D texpaint_nor_undo", "_texpaint_nor_undo"); - node_shader_add_uniform(kong, "sampler2D texpaint_pack_undo", "_texpaint_pack_undo"); - node_shader_write_frag(kong, "vec4 sample_nor_undo = textureLod(texpaint_nor_undo, sample_tc, 0.0);"); - node_shader_write_frag(kong, "vec4 sample_pack_undo = textureLod(texpaint_pack_undo, sample_tc, 0.0);"); + 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_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 - node_shader_write_frag(kong, "frag_color[0] = vec4(" + make_material_blend_mode(kong, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", mat_opacity);"); + node_shader_write_frag(kong, "output[0].rgba = float4(" + make_material_blend_mode(kong, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", mat_opacity);"); ///else - node_shader_write_frag(kong, "frag_color[0] = vec4(" + make_material_blend_mode(kong, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", max(str, sample_undo.a));"); + node_shader_write_frag(kong, "output[0].rgba = float4(" + make_material_blend_mode(kong, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", max(str, sample_undo.a));"); ///end - node_shader_write_frag(kong, "frag_color[1] = vec4(mix(sample_nor_undo.rgb, nortan, str), matid);"); + node_shader_write_frag(kong, "output[1].rgba = float4(lerp(sample_nor_undo.rgb, nortan, str), matid);"); if (context_raw.material.paint_height && make_material_height_used) { - node_shader_write_frag(kong, "frag_color[2] = mix(sample_pack_undo, vec4(occlusion, roughness, metallic, height), str);"); + node_shader_write_frag(kong, "output[2].rgba = lerp(sample_pack_undo, float4(occlusion, roughness, metallic, height), str);"); } else { - node_shader_write_frag(kong, "frag_color[2] = vec4(mix(sample_pack_undo.rgb, vec3(occlusion, roughness, metallic), str), 0.0);"); + node_shader_write_frag(kong, "output[2].rgba = float4(lerp(sample_pack_undo.rgb, float3(occlusion, roughness, metallic), str), 0.0);"); } } } - node_shader_write_frag(kong, "frag_color[3] = vec4(str, 0.0, 0.0, 1.0);"); + node_shader_write_frag(kong, "output[3].rgba = float4(str, 0.0, 0.0, 1.0);"); if (!context_raw.material.paint_base) { con_paint.data.color_writes_red[0] = false; diff --git a/armorsculpt/sources/make_brush.ts b/armorsculpt/sources/make_brush.ts index 38f08141..af272106 100644 --- a/armorsculpt/sources/make_brush.ts +++ b/armorsculpt/sources/make_brush.ts @@ -1,28 +1,28 @@ function make_brush_run(kong: node_shader_t) { - node_shader_write_frag(kong, "float dist = 0.0;"); + node_shader_write_frag(kong, "var dist: float = 0.0;"); if (config_raw.brush_3d) { - node_shader_write_frag(kong, "float depth = textureLod(gbufferD, inp.xy, 0.0).r;"); + node_shader_write_frag(kong, "var depth: float = sample_lod(gbufferD, inp.xy, 0.0).r;"); - node_shader_add_uniform(kong, "mat4 invVP", "_inv_view_proj_matrix"); - node_shader_write_frag(kong, "vec4 winp = vec4(vec2(inp.x, 1.0 - inp.y) * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);"); - node_shader_write_frag(kong, "winp = mul(winp, invVP);"); + 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_write_frag(kong, "winp.xyz /= winp.w;"); - node_shader_add_uniform(kong, "mat4 W", "_world_matrix"); + node_shader_add_uniform(kong, "W: float4x4", "_world_matrix"); - node_shader_write_attrib_frag(kong, "vec3 wposition = (mul(texelFetch(texpaint_undo, ivec2(tex_coord.x * textureSize(texpaint_undo, 0).x, tex_coord.y * textureSize(texpaint_undo, 0).y), 0), W)).xyz;"); + 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_frag(kong, "float depthlast = textureLod(gbufferD, inplast.xy, 0.0).r;"); + node_shader_write_frag(kong, "var depthlast: float = sample_lod(gbufferD, inplast.xy, 0.0).r;"); - node_shader_write_frag(kong, "vec4 winplast = vec4(vec2(inplast.x, 1.0 - inplast.y) * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);"); - node_shader_write_frag(kong, "winplast = mul(winplast, invVP);"); + 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.xyz /= winplast.w;"); node_shader_write_frag(kong, "dist = distance(wposition, winp.xyz);"); } - node_shader_write_frag(kong, "if (dist > brush_radius) discard;"); + node_shader_write_frag(kong, "if (dist > brush_radius) { discard; }"); } diff --git a/armorsculpt/sources/make_mesh.ts b/armorsculpt/sources/make_mesh.ts index 86d3cc53..8184cc4e 100644 --- a/armorsculpt/sources/make_mesh.ts +++ b/armorsculpt/sources/make_mesh.ts @@ -30,93 +30,89 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte let kong: node_shader_t = node_shader_context_make_kong(con_mesh); - node_shader_add_out(kong, "vec2 tex_coord"); + node_shader_add_out(kong, "tex_coord: float2"); kong.frag_wvpposition = true; - node_shader_add_out(kong, "vec4 prevwvpposition"); - node_shader_add_uniform(kong, "mat4 VP", "_view_proj_matrix"); - node_shader_add_uniform(kong, "mat4 prevWVP", "_prev_world_view_proj_matrix"); + node_shader_add_uniform(kong, "VP: float4x4", "_view_proj_matrix"); kong.vert_wposition = true; let texture_count: i32 = 0; - node_shader_add_uniform(kong, "mat4 WVP", "_world_view_proj_matrix"); + node_shader_add_uniform(kong, "WVP: float4x4", "_world_view_proj_matrix"); let lid: i32 = project_layers[0].id; - node_shader_add_uniform(kong, "sampler2D texpaint_vert", "_texpaint_vert" + lid); - node_shader_write_vert(kong, "vec3 meshpos = texelFetch(texpaint_vert, ivec2(gl_VertexID % textureSize(texpaint_vert, 0).x, gl_VertexID / textureSize(texpaint_vert, 0).y), 0).xyz;"); + node_shader_add_uniform(kong, "texpaint_vert: tex2d", "_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, "gl_Position = mul(vec4(meshpos.xyz, 1.0), WVP);"); + node_shader_write_vert(kong, "output.pos = WVP * float4(meshpos.xyz, 1.0);"); - node_shader_write_vert(kong, "tex_coord = vec2(0.0, 0.0);"); + node_shader_write_vert(kong, "tex_coord = float2(0.0, 0.0);"); - node_shader_write_vert(kong, "prevwvpposition = mul(vec4(pos.xyz, 1.0), prevWVP);"); + kong.frag_out = "float4[3]"; - kong.frag_out = "vec4 frag_color[3]"; + node_shader_add_uniform(kong, "N: float3x3", "_normal_matrix"); + node_shader_add_out(kong, "wnormal: float3"); - node_shader_add_uniform(kong, "mat3 N", "_normal_matrix"); - node_shader_add_out(kong, "vec3 wnormal"); - - node_shader_write_attrib_vert(kong, "int base_vertex0 = gl_VertexID - (gl_VertexID % 3);"); - node_shader_write_attrib_vert(kong, "int base_vertex1 = base_vertex0 + 1;"); - node_shader_write_attrib_vert(kong, "int base_vertex2 = base_vertex0 + 2;"); - node_shader_write_attrib_vert(kong, "vec3 meshpos0 = texelFetch(texpaint_vert, ivec2(base_vertex0 % textureSize(texpaint_vert, 0).x, base_vertex0 / textureSize(texpaint_vert, 0).y), 0).xyz;"); - node_shader_write_attrib_vert(kong, "vec3 meshpos1 = texelFetch(texpaint_vert, ivec2(base_vertex1 % textureSize(texpaint_vert, 0).x, base_vertex1 / textureSize(texpaint_vert, 0).y), 0).xyz;"); - node_shader_write_attrib_vert(kong, "vec3 meshpos2 = texelFetch(texpaint_vert, ivec2(base_vertex2 % textureSize(texpaint_vert, 0).x, base_vertex2 / textureSize(texpaint_vert, 0).y), 0).xyz;"); - node_shader_write_attrib_vert(kong, "vec3 meshnor = normalize(cross(meshpos2 - meshpos1, meshpos0 - meshpos1));"); + node_shader_write_attrib_vert(kong, "var base_vertex0: int = gl_VertexID - (gl_VertexID % 3);"); + node_shader_write_attrib_vert(kong, "var base_vertex1: int = base_vertex0 + 1;"); + node_shader_write_attrib_vert(kong, "var base_vertex2: int = base_vertex0 + 2;"); + node_shader_write_attrib_vert(kong, "var meshpos0: float3 = sample_lod(texpaint_vert, int2(base_vertex0 % textureSize(texpaint_vert, 0).x, base_vertex0 / textureSize(texpaint_vert, 0).y), 0).xyz;"); + node_shader_write_attrib_vert(kong, "var meshpos1: float3 = sample_lod(texpaint_vert, int2(base_vertex1 % textureSize(texpaint_vert, 0).x, base_vertex1 / textureSize(texpaint_vert, 0).y), 0).xyz;"); + node_shader_write_attrib_vert(kong, "var meshpos2: float3 = sample_lod(texpaint_vert, int2(base_vertex2 % textureSize(texpaint_vert, 0).x, base_vertex2 / textureSize(texpaint_vert, 0).y), 0).xyz;"); + node_shader_write_attrib_vert(kong, "var meshnor: float3 = normalize(cross(meshpos2 - meshpos1, meshpos0 - meshpos1));"); node_shader_write_attrib_vert(kong, "wnormal = mul(meshnor, N);"); - node_shader_write_attrib_frag(kong, "vec3 n = normalize(wnormal);"); + node_shader_write_attrib_frag(kong, "var n: float3 = normalize(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, "sampler2D gbuffer0"); - node_shader_add_uniform(kong, "sampler2D gbuffer1"); - node_shader_add_uniform(kong, "sampler2D gbuffer2"); - node_shader_write_frag(kong, "vec2 fragcoord = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); + node_shader_add_uniform(kong, "gbuffer0: tex2d"); + node_shader_add_uniform(kong, "gbuffer1: tex2d"); + node_shader_add_uniform(kong, "gbuffer2: tex2d"); + 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, "vec4 gbuffer0_sample = textureLod(gbuffer0, fragcoord, 0.0);"); - node_shader_write_frag(kong, "vec4 gbuffer1_sample = textureLod(gbuffer1, fragcoord, 0.0);"); - node_shader_write_frag(kong, "vec4 gbuffer2_sample = textureLod(gbuffer2, fragcoord, 0.0);"); - node_shader_write_frag(kong, "vec3 basecol = gbuffer0_sample.rgb;"); - node_shader_write_frag(kong, "float roughness = gbuffer2_sample.g;"); - node_shader_write_frag(kong, "float metallic = gbuffer2_sample.b;"); - node_shader_write_frag(kong, "float occlusion = gbuffer2_sample.r;"); - node_shader_write_frag(kong, "float opacity = 1.0;//gbuffer0_sample.a;"); - node_shader_write_frag(kong, "float matid = gbuffer1_sample.a;"); - node_shader_write_frag(kong, "vec3 ntex = gbuffer1_sample.rgb;"); - node_shader_write_frag(kong, "float height = gbuffer2_sample.a;"); + node_shader_write_frag(kong, "var gbuffer0_sample: float4 = sample_lod(gbuffer0, fragcoord, 0.0);"); + node_shader_write_frag(kong, "var gbuffer1_sample: float4 = sample_lod(gbuffer1, fragcoord, 0.0);"); + node_shader_write_frag(kong, "var gbuffer2_sample: float4 = sample_lod(gbuffer2, fragcoord, 0.0);"); + node_shader_write_frag(kong, "var basecol: float3 = gbuffer0_sample.rgb;"); + node_shader_write_frag(kong, "var roughness: float = gbuffer2_sample.g;"); + node_shader_write_frag(kong, "var metallic: float = gbuffer2_sample.b;"); + node_shader_write_frag(kong, "var occlusion: float = gbuffer2_sample.r;"); + node_shader_write_frag(kong, "var opacity: float = 1.0;//gbuffer0_sample.a;"); + node_shader_write_frag(kong, "var matid: float = gbuffer1_sample.a;"); + node_shader_write_frag(kong, "var ntex: float3 = gbuffer1_sample.rgb;"); + node_shader_write_frag(kong, "var height: float = gbuffer2_sample.a;"); } else { - node_shader_write_frag(kong, "vec3 basecol = vec3(0.0, 0.0, 0.0);"); - node_shader_write_frag(kong, "float roughness = 0.3;"); - node_shader_write_frag(kong, "float metallic = 0.0;"); - node_shader_write_frag(kong, "float occlusion = 1.0;"); - node_shader_write_frag(kong, "float opacity = 1.0;"); - node_shader_write_frag(kong, "float matid = 0.0;"); - node_shader_write_frag(kong, "vec3 ntex = vec3(0.5, 0.5, 1.0);"); - node_shader_write_frag(kong, "float height = 0.0;"); + node_shader_write_frag(kong, "var basecol: float3 = float3(0.0, 0.0, 0.0);"); + node_shader_write_frag(kong, "var roughness: float = 0.3;"); + node_shader_write_frag(kong, "var metallic: float = 0.0;"); + node_shader_write_frag(kong, "var occlusion: float = 1.0;"); + node_shader_write_frag(kong, "var opacity: float = 1.0;"); + node_shader_write_frag(kong, "var matid: float = 0.0;"); + node_shader_write_frag(kong, "var ntex: float3 = float3(0.5, 0.5, 1.0);"); + node_shader_write_frag(kong, "var height: float = 0.0;"); } - node_shader_write_frag(kong, "vec4 texpaint_sample = vec4(0.0, 0.0, 0.0, 1.0);"); - node_shader_write_frag(kong, "vec4 texpaint_nor_sample;"); - node_shader_write_frag(kong, "vec4 texpaint_pack_sample;"); - node_shader_write_frag(kong, "float texpaint_opac;"); + node_shader_write_frag(kong, "var texpaint_sample: float4 = float4(0.0, 0.0, 0.0, 1.0);"); + node_shader_write_frag(kong, "var texpaint_nor_sample: float4;"); + node_shader_write_frag(kong, "var texpaint_pack_sample: float4;"); + node_shader_write_frag(kong, "var texpaint_opac: float;"); if (make_material_height_used) { - node_shader_write_frag(kong, "float height0 = 0.0;"); - node_shader_write_frag(kong, "float height1 = 0.0;"); - node_shader_write_frag(kong, "float height2 = 0.0;"); - node_shader_write_frag(kong, "float height3 = 0.0;"); + node_shader_write_frag(kong, "var height0: float = 0.0;"); + node_shader_write_frag(kong, "var height1: float = 0.0;"); + node_shader_write_frag(kong, "var height2: float = 0.0;"); + node_shader_write_frag(kong, "var height3: float = 0.0;"); } if (context_raw.draw_wireframe) { texture_count++; - node_shader_add_uniform(kong, "sampler2D texuvmap", "_texuvmap"); + node_shader_add_uniform(kong, "texuvmap: tex2d", "_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, "sampler2D senvmap_brdf", "$brdf.k"); - node_shader_add_uniform(kong, "sampler2D senvmap_radiance", "_envmap_radiance"); + node_shader_add_uniform(kong, "senvmap_brdf: tex2d", "$brdf.k"); + node_shader_add_uniform(kong, "senvmap_radiance: tex2d", "_envmap_radiance"); } // Get layers for this pass @@ -149,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, "int uid", "_uid"); + node_shader_add_uniform(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 ("); @@ -168,8 +164,8 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } } - node_shader_add_shared_sampler(kong, "sampler2D texpaint" + l.id); - node_shader_write_frag(kong, "texpaint_sample = vec4(0.8, 0.8, 0.8, 1.0);"); + node_shader_add_shared_sampler(kong, "texpaint" + l.id + ": tex2d"); + 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;"); let masks: slot_layer_t[] = slot_layer_get_masks(l); @@ -184,13 +180,13 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (has_visible) { let texpaint_mask: string = "texpaint_mask" + l.id; - node_shader_write_frag(kong, "float " + texpaint_mask + " = 0.0;"); + node_shader_write_frag(kong, "var " + texpaint_mask + ": float = 0.0;"); 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, "sampler2D texpaint" + m.id); + node_shader_add_shared_sampler(kong, "texpaint" + m.id + ": tex2d"); node_shader_write_frag(kong, "{"); // Group mask is sampled across multiple layers - node_shader_write_frag(kong, "float texpaint_mask_sample" + m.id + " = textureLodShared(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 + ", tex_coord, 0.0).r;"); node_shader_write_frag(kong, "}"); } node_shader_write_frag(kong, "texpaint_opac *= clamp(" + texpaint_mask + ", 0.0, 1.0);"); @@ -203,7 +199,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (l == project_layers[0]) { - node_shader_write_frag(kong, "basecol = vec3(0.8, 0.8, 0.8);// texpaint_sample.rgb * texpaint_opac;"); + node_shader_write_frag(kong, "basecol = float3(0.8, 0.8, 0.8);// texpaint_sample.rgb * texpaint_opac;"); } if (slot_layer_get_object_mask(l) > 0) { @@ -211,34 +207,34 @@ 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, "vec2 texpaint_size", "_texpaint_size"); - node_shader_write_frag(kong, "vec2 texel0 = tex_coord * texpaint_size * 0.01;"); - node_shader_write_frag(kong, "vec2 texel1 = tex_coord * texpaint_size * 0.1;"); - node_shader_write_frag(kong, "vec2 texel2 = tex_coord * texpaint_size;"); - node_shader_write_frag(kong, "basecol *= max(float(mod(int(texel0.x), 2.0) == mod(int(texel0.y), 2.0)), 0.9);"); - node_shader_write_frag(kong, "basecol *= max(float(mod(int(texel1.x), 2.0) == mod(int(texel1.y), 2.0)), 0.9);"); - node_shader_write_frag(kong, "basecol *= max(float(mod(int(texel2.x), 2.0) == mod(int(texel2.y), 2.0)), 0.9);"); + 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_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 - textureLod(texuvmap, tex_coord, 0.0).r;"); + node_shader_write_frag(kong, "basecol *= 1.0 - sample_lod(texuvmap, tex_coord, 0.0).r;"); } if (make_material_height_used) { node_shader_write_frag(kong, "if (height > 0.0) {"); - node_shader_write_frag(kong, "float height_dx = height0 - height1;"); - node_shader_write_frag(kong, "float height_dy = height2 - height3;"); + node_shader_write_frag(kong, "var height_dx: float = height0 - height1;"); + node_shader_write_frag(kong, "var height_dy: float = height2 - height3;"); // Whiteout blend - node_shader_write_frag(kong, "vec3 n1 = ntex * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); - node_shader_write_frag(kong, "vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));"); - node_shader_write_frag(kong, "ntex = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);"); + node_shader_write_frag(kong, "var n1: float3 = ntex * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); + node_shader_write_frag(kong, "var n2: float3 = normalize(float3(height_dx * 16.0, height_dy * 16.0, 1.0));"); + node_shader_write_frag(kong, "ntex = normalize(float3(n1.xy + n2.xy, n1.z * n2.z)) * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5);"); node_shader_write_frag(kong, "}"); } if (!last_pass) { - node_shader_write_frag(kong, "frag_color[0] = vec4(basecol, opacity);"); - node_shader_write_frag(kong, "frag_color[1] = vec4(ntex, matid);"); - node_shader_write_frag(kong, "frag_color[2] = vec4(occlusion, roughness, metallic, height);"); + node_shader_write_frag(kong, "output[0].rgba = float4(basecol, opacity);"); + node_shader_write_frag(kong, "output[1].rgba = float4(ntex, matid);"); + node_shader_write_frag(kong, "output[2].rgba = float4(occlusion, roughness, metallic, height);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; gpu_create_shaders_from_kong(node_shader_get(kong), ADDRESS(con_mesh.data.vertex_shader), ADDRESS(con_mesh.data.fragment_shader)); @@ -246,75 +242,74 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } kong.frag_vvec = true; - node_shader_write_frag(kong, "mat3 TBN = cotangent_frame(n, vvec, tex_coord);"); + node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); node_shader_write_frag(kong, "n = ntex * 2.0 - 1.0;"); node_shader_write_frag(kong, "n.y = -n.y;"); - node_shader_write_frag(kong, "n = normalize(mul(n, TBN));"); + node_shader_write_frag(kong, "n = normalize(TBN * n);"); if (context_raw.viewport_mode == viewport_mode_t.LIT) { - node_shader_write_frag(kong, "basecol = pow(basecol, vec3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "basecol = pow(basecol, float3(2.2, 2.2, 2.2));"); if (context_raw.viewport_shader != null) { - node_shader_write_frag(kong, "vec3 output_color;"); + node_shader_write_frag(kong, "var output_color: float3;"); js_call_ptr(context_raw.viewport_shader, kong); - node_shader_write_frag(kong, "frag_color[1] = vec4(output_color, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(output_color, 1.0);"); } else if (context_raw.render_mode == render_mode_t.FORWARD) { kong.frag_wposition = true; - node_shader_write_frag(kong, "vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);"); - node_shader_write_frag(kong, "vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);"); + node_shader_write_frag(kong, "var albedo: float3 = lerp(basecol, float3(0.0, 0.0, 0.0), metallic);"); + node_shader_write_frag(kong, "var f0: float3 = lerp(float3(0.04, 0.04, 0.04), basecol, metallic);"); kong.frag_vvec = true; - node_shader_write_frag(kong, "float dotnv = max(0.0, dot(n, vvec));"); - node_shader_write_frag(kong, "vec2 env_brdf = texelFetch(senvmap_brdf, ivec2(vec2(roughness, 1.0 - dotnv) * 256.0), 0).xy;"); - node_shader_add_uniform(kong, "int envmap_num_mipmaps", "_envmap_num_mipmaps"); - node_shader_add_uniform(kong, "vec4 envmap_data", "_envmap_data"); // angle, sin(angle), cos(angle), strength - node_shader_write_frag(kong, "vec3 wreflect = reflect(-vvec, n);"); - node_shader_write_frag(kong, "float envlod = roughness * float(envmap_num_mipmaps);"); + 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_write_frag(kong, "var wreflect: float3 = reflect(-vvec, n);"); + node_shader_write_frag(kong, "var envlod: float = roughness * float(envmap_num_mipmaps);"); node_shader_add_function(kong, str_envmap_equirect); - node_shader_write_frag(kong, "vec3 prefiltered_color = textureLod(senvmap_radiance, envmap_equirect(wreflect, envmap_data.x), envlod).rgb;"); - node_shader_add_uniform(kong, "vec4 shirr[7]", "_envmap_irradiance"); - node_shader_add_function(kong, str_sh_irradiance()); - node_shader_write_frag(kong, "vec3 indirect = albedo * (sh_irradiance(vec3(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 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_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, "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, "frag_color[1] = vec4(indirect, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(indirect, 1.0);"); } else { // Deferred, Pathtraced if (make_material_emis_used) { - node_shader_write_frag(kong, "if (int(matid * 255.0) % 3 == 1) basecol *= 10.0;"); // Boost for bloom + node_shader_write_frag(kong, "if (int(matid * 255.0) % 3 == 1) { basecol *= 10.0; }"); // Boost for bloom } - node_shader_write_frag(kong, "frag_color[1] = vec4(basecol, occlusion);"); + node_shader_write_frag(kong, "output[1].rgba = float4(basecol, occlusion);"); } } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) { kong.frag_nattr = true; - node_shader_write_frag(kong, "frag_color[1] = vec4(nAttr, 1.0);"); + 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, "float object_id", "_object_id"); - node_shader_write_frag(kong, "float obid = object_id + 1.0 / 255.0;"); - node_shader_write_frag(kong, "float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);"); - node_shader_write_frag(kong, "float id_g = fract(sin(dot(vec2(obid * 20.0, obid), vec2(12.9898, 78.233))) * 43758.5453);"); - node_shader_write_frag(kong, "float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);"); - node_shader_write_frag(kong, "frag_color[1] = vec4(id_r, id_g, id_b, 1.0);"); + 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_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);"); + node_shader_write_frag(kong, "output[1].rgba = float4(id_r, id_g, id_b, 1.0);"); } else { - node_shader_write_frag(kong, "frag_color[1] = vec4(1.0, 0.0, 1.0, 1.0);"); // Pink + node_shader_write_frag(kong, "output[1].rgba = float4(1.0, 0.0, 1.0, 1.0);"); // Pink } if (context_raw.viewport_mode != viewport_mode_t.LIT && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { - node_shader_write_frag(kong, "frag_color[1].rgb = pow(frag_color[1].rgb, vec3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "output[1].rgb = pow(output[1].rgb, float3(2.2, 2.2, 2.2));"); } node_shader_write_frag(kong, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); - node_shader_write_frag(kong, "n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy);"); - node_shader_write_frag(kong, "frag_color[0] = vec4(n.xy, roughness, pack_f32_i16(metallic, uint(int(matid * 255.0) % 3)));"); + // 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, "vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); - node_shader_write_frag(kong, "vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;"); - node_shader_write_frag(kong, "frag_color[2] = vec4(posa - posb, tex_coord.xy);"); + node_shader_write_frag(kong, "output[2].rgba = float4(0.0, 0.0, tex_coord.xy);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; diff --git a/armorsculpt/sources/make_mesh_preview.ts b/armorsculpt/sources/make_mesh_preview.ts index 4466a679..97afb36e 100644 --- a/armorsculpt/sources/make_mesh_preview.ts +++ b/armorsculpt/sources/make_mesh_preview.ts @@ -44,12 +44,12 @@ 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, "vec4 skin_bones[128 * 2]", "_skin_bones"); - node_shader_add_uniform(kong, "float pos_unpack", "_pos_unpack"); - node_shader_write_attrib_vert(kong, "vec4 skin_a;"); - node_shader_write_attrib_vert(kong, "vec4 skin_b;"); - node_shader_write_attrib_vert(kong, "get_skinning_dual_quat(ivec4(bone * 32767), weight, skin_a, skin_b);"); - node_shader_write_attrib_vert(kong, "vec3 spos = pos.xyz;"); + node_shader_add_uniform(kong, "skin_bones: float4[128 * 2]", "_skin_bones"); + node_shader_add_uniform(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, "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));"); @@ -57,12 +57,12 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no } ///end - node_shader_add_uniform(kong, "mat4 WVP", "_world_view_proj_matrix"); - node_shader_write_attrib_vert(kong, "gl_Position = mul(vec4(" + pos + ".xyz, 1.0), WVP);"); + 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);"); let sc: f32 = context_raw.brush_scale * context_raw.brush_nodes_scale; let brush_scale: string = sc + ""; - node_shader_add_out(kong, "vec2 tex_coord"); + node_shader_add_out(kong, "tex_coord: float2"); node_shader_write_attrib_vert(kong, "tex_coord = tex * float(" + brush_scale + ");"); let decal: bool = context_raw.decal_preview; @@ -73,33 +73,33 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no parser_material_parse_height = false; parser_material_parse_height_as_channel = false; parser_material_sample_keep_aspect = false; - let base: string = "vec3(1.0, 1.0, 1.0)"; + let base: string = "float3(1.0, 1.0, 1.0)"; let rough: string = "0.0"; let met: string = "0.0"; let occ: string = "0.0"; let opac: string = "0.0"; let height: string = "0.0"; - let nortan: string = "vec3(1.0, 1.0, 1.0)"; - node_shader_write_frag(kong, "vec3 basecol = pow(" + base + ", vec3(2.2, 2.2, 2.2));"); - node_shader_write_frag(kong, "float roughness = " + rough + ";"); - node_shader_write_frag(kong, "float metallic = " + met + ";"); - node_shader_write_frag(kong, "float occlusion = " + occ + ";"); - node_shader_write_frag(kong, "float opacity = " + opac + ";"); - node_shader_write_frag(kong, "vec3 nortan = " + nortan + ";"); - node_shader_write_frag(kong, "float height = " + height + ";"); + let nortan: string = "float3(1.0, 1.0, 1.0)"; + node_shader_write_frag(kong, "var basecol: float3 = pow(" + base + ", float3(2.2, 2.2, 2.2));"); + node_shader_write_frag(kong, "var roughness: float = " + rough + ";"); + node_shader_write_frag(kong, "var metallic: float = " + met + ";"); + node_shader_write_frag(kong, "var occlusion: float = " + occ + ";"); + node_shader_write_frag(kong, "var opacity: float = " + opac + ";"); + node_shader_write_frag(kong, "var nortan: float3 = " + nortan + ";"); + node_shader_write_frag(kong, "var height: float = " + height + ";"); if (decal) { if (context_raw.tool == workspace_tool_t.TEXT) { - node_shader_add_uniform(kong, "sampler2D textexttool", "_textexttool"); - node_shader_write_frag(kong, "opacity *= textureLod(textexttool, tex_coord / float(" + brush_scale + "), 0.0).r;"); + 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;"); } } if (decal) { let opac: f32 = make_mesh_preview_opacity_discard_decal; - node_shader_write_frag(kong, "if (opacity < " + opac + ") discard;"); + node_shader_write_frag(kong, "if (opacity < " + opac + ") { discard; }"); } - node_shader_add_out(kong, "vec4 frag_color[3]"); + kong.frag_out = "float4[3]"; kong.frag_n = true; node_shader_add_function(kong, str_pack_float_int16); @@ -108,14 +108,12 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no if (make_material_height_used) { node_shader_write_frag(kong, "if (height > 0.0) {"); - node_shader_write_frag(kong, "float height_dx = dFdx(height * 2.0);"); - node_shader_write_frag(kong, "float height_dy = dFdy(height * 2.0);"); - // node_shader_write_frag(kong, "float height_dx = height0 - height1;"); - // node_shader_write_frag(kong, "float height_dy = height2 - height3;"); + node_shader_write_frag(kong, "var height_dx: float = ddx(height * 2.0);"); + node_shader_write_frag(kong, "var height_dy: float = ddy(height * 2.0);"); // Whiteout blend - node_shader_write_frag(kong, "vec3 n1 = nortan * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); - node_shader_write_frag(kong, "vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0));"); - node_shader_write_frag(kong, "nortan = normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);"); + node_shader_write_frag(kong, "var n1: float3 = nortan * float3(2.0, 2.0, 2.0) - float3(1.0, 1.0, 1.0);"); + node_shader_write_frag(kong, "var n2: float3 = normalize(float3(height_dx * 16.0, height_dy * 16.0, 1.0));"); + node_shader_write_frag(kong, "nortan = normalize(float3(n1.xy + n2.xy, n1.z * n2.z)) * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5);"); node_shader_write_frag(kong, "}"); } @@ -125,31 +123,32 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no } else { kong.frag_vvec = true; - node_shader_write_frag(kong, "mat3 TBN = cotangent_frame(n, vvec, tex_coord);"); + node_shader_write_frag(kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); node_shader_write_frag(kong, "n = nortan * 2.0 - 1.0;"); node_shader_write_frag(kong, "n.y = -n.y;"); node_shader_write_frag(kong, "n = normalize(mul(n, TBN));"); } node_shader_write_frag(kong, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); - node_shader_write_frag(kong, "n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy);"); - // uint matid = uint(0); + // 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); }"); + // var matid: uint = uint(0); if (decal) { - node_shader_write_frag(kong, "frag_color[0] = vec4(n.x, n.y, roughness, pack_f32_i16(metallic, uint(0)));"); // metallic/matid - node_shader_write_frag(kong, "frag_color[1] = vec4(basecol, occlusion);"); + node_shader_write_frag(kong, "output[0].rgba = float4(n.x, n.y, roughness, pack_f32_i16(metallic, uint(0)));"); // metallic/matid + node_shader_write_frag(kong, "output[1].rgba = float4(basecol, occlusion);"); } else { - node_shader_write_frag(kong, "frag_color[0] = vec4(n.x, n.y, mix(1.0, roughness, opacity), pack_f32_i16(mix(1.0, metallic, opacity), uint(0)));"); // metallic/matid - node_shader_write_frag(kong, "frag_color[1] = vec4(mix(vec3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); + node_shader_write_frag(kong, "output[0].rgba = float4(n.x, n.y, lerp(1.0, roughness, opacity), pack_f32_i16(lerp(1.0, metallic, opacity), uint(0)));"); // metallic/matid + node_shader_write_frag(kong, "output[1].rgba = float4(lerp(float3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); } - node_shader_write_frag(kong, "frag_color[2] = vec4(0.0, 0.0, 0.0, 0.0);"); // veloc + node_shader_write_frag(kong, "output[2].rgba = float4(0.0, 0.0, 0.0, 0.0);"); // veloc parser_material_finalize(con_mesh); ///if arm_skin if (skin) { - node_shader_write_vert(kong, "wnormal = normalize(mul(vec3(nor.xy, pos.w) + 2.0 * cross(skin_a.xyz, cross(skin_a.xyz, vec3(nor.xy, pos.w)) + skin_a.w * vec3(nor.xy, pos.w)), N));"); + 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)));"); } ///end diff --git a/armorsculpt/sources/make_sculpt.ts b/armorsculpt/sources/make_sculpt.ts index 66cc4dde..46c28132 100644 --- a/armorsculpt/sources/make_sculpt.ts +++ b/armorsculpt/sources/make_sculpt.ts @@ -32,21 +32,21 @@ function make_sculpt_run(data: material_t, matcon: material_context_t): node_sha let decal: bool = context_is_decal(); - node_shader_add_out(kong, "vec2 tex_coord"); - node_shader_write_vert(kong, "const vec2 madd = vec2(0.5, 0.5);"); + 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, "gl_Position = vec4(pos.xy, 0.0, 1.0);"); + node_shader_write_vert(kong, "output.pos = float4(pos.xy, 0.0, 1.0);"); - node_shader_add_uniform(kong, "vec4 inp", "_input_brush"); - node_shader_add_uniform(kong, "vec4 inplast", "_input_brush_last"); - node_shader_add_uniform(kong, "sampler2D gbufferD"); + 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"); - kong.frag_out = "vec4 frag_color[2]"; + kong.frag_out = "float4[2]"; - node_shader_add_uniform(kong, "float brush_radius", "_brush_radius"); - node_shader_add_uniform(kong, "float brush_opacity", "_brush_opacity"); - node_shader_add_uniform(kong, "float brush_hardness", "_brush_hardness"); + 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"); if (context_raw.tool == workspace_tool_t.BRUSH || context_raw.tool == workspace_tool_t.ERASER || @@ -61,28 +61,29 @@ function make_sculpt_run(data: material_t, matcon: material_context_t): node_sha make_brush_run(kong); } - node_shader_write_frag(kong, "vec3 basecol = vec3(1.0, 1.0, 1.0);"); - node_shader_write_frag(kong, "float opacity = 1.0;"); - node_shader_write_frag(kong, "if (opacity == 0.0) discard;"); + node_shader_write_frag(kong, "var basecol: float3 = float3(1.0, 1.0, 1.0);"); + 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, "float str = clamp((brush_radius - dist) * brush_hardness * 400.0, 0.0, 1.0) * opacity;"); + node_shader_write_frag(kong, "var str: float = clamp((brush_radius - dist) * brush_hardness * 400.0, 0.0, 1.0) * opacity;"); - node_shader_add_uniform(kong, "sampler2D texpaint_undo", "_texpaint_undo"); - node_shader_write_frag(kong, "vec4 sample_undo = textureLod(texpaint_undo, tex_coord, 0.0);"); + 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_write_frag(kong, "if (sample_undo.r == 0 && sample_undo.g == 0 && sample_undo.b == 0) discard;"); + 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, "sampler2D gbuffer0_undo"); - node_shader_write_frag(kong, "vec2 g0_undo = textureLod(gbuffer0_undo, inp.xy, 0.0).rg;"); - node_shader_write_frag(kong, "vec3 wn;"); + 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_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);"); - node_shader_write_frag(kong, "vec3 n = normalize(wn);"); + // node_shader_write_frag(kong, "wn.xy = wn.z >= 0.0 ? g0_undo.xy : octahedron_wrap(g0_undo.xy);"); + node_shader_write_frag(kong, "if (wn.z >= 0.0) { wn.xy = g0_undo.xy; } else { wn.xy = octahedron_wrap(g0_undo.xy); }"); + node_shader_write_frag(kong, "var n: float3 = normalize(wn);"); - node_shader_write_frag(kong, "frag_color[0] = vec4(sample_undo.rgb + n * 0.1 * str, 1.0);"); + node_shader_write_frag(kong, "output[0].rgba = float4(sample_undo.rgb + n * 0.1 * str, 1.0);"); - node_shader_write_frag(kong, "frag_color[1] = vec4(str, 0.0, 0.0, 1.0);"); + node_shader_write_frag(kong, "output[1].rgba = float4(str, 0.0, 0.0, 1.0);"); parser_material_finalize(con_paint); con_paint.data.shader_from_source = true; diff --git a/base/sources/ts/iron/camera_object.ts b/base/sources/ts/iron/camera_object.ts index ef058480..a44d33b4 100644 --- a/base/sources/ts/iron/camera_object.ts +++ b/base/sources/ts/iron/camera_object.ts @@ -6,7 +6,6 @@ type camera_object_t = { no_jitter_p?: mat4_t; frame?: i32; v?: mat4_t; - prev_v?: mat4_t; vp?: mat4_t; frustum_planes?: frustum_plane_t[]; }; @@ -23,7 +22,6 @@ function camera_object_create(data: camera_data_t): camera_object_t { raw.base.ext = raw; raw.base.ext_type = "camera_object_t"; raw.data = data; - raw.prev_v = mat4_nan(); camera_object_build_proj(raw); @@ -64,7 +62,6 @@ function camera_object_render_frame(raw: camera_object_t) { camera_object_proj_jitter(raw); camera_object_build_mat(raw); render_path_render_frame(); - raw.prev_v = mat4_clone(raw.v); } function camera_object_proj_jitter(raw: camera_object_t) { @@ -107,11 +104,6 @@ function camera_object_build_mat(raw: camera_object_t) { if (raw.data.frustum_culling) { camera_object_build_view_frustum(raw.vp, raw.frustum_planes); } - - // First time setting up previous V, prevents first frame flicker - if (mat4_isnan(raw.prev_v)) { - raw.prev_v = mat4_clone(raw.v); - } } function camera_object_right(raw: camera_object_t): vec4_t { diff --git a/base/sources/ts/iron/mesh_object.ts b/base/sources/ts/iron/mesh_object.ts index ab1bcc21..bc23a749 100644 --- a/base/sources/ts/iron/mesh_object.ts +++ b/base/sources/ts/iron/mesh_object.ts @@ -9,7 +9,6 @@ type mesh_object_t = { frustum_culling?: bool; skip_context?: string; // Do not draw this context force_context?: string; // Draw only this context - prev_matrix?: mat4_t; }; let _mesh_object_last_pipeline: iron_gpu_pipeline_t = null; @@ -21,7 +20,6 @@ function mesh_object_create(data: mesh_data_t, materials: material_data_t[]): me raw.material_index = 0; raw.screen_size = 0.0; raw.frustum_culling = true; - raw.prev_matrix = mat4_identity(); raw.base = object_create(false); raw.base.ext = raw; raw.base.ext_type = "mesh_object_t"; @@ -185,8 +183,6 @@ function mesh_object_render(raw: mesh_object_t, context: string, bind_params: st gpu_set_index_buffer(raw.data._.index_buffers[i]); gpu_draw_indexed_vertices(); } - - raw.prev_matrix = mat4_clone(raw.base.transform.world_unpack); } function mesh_object_valid_context(raw: mesh_object_t, mats: material_data_t[], context: string): bool { diff --git a/base/sources/ts/iron/uniforms.ts b/base/sources/ts/iron/uniforms.ts index 0a93a537..51a97299 100644 --- a/base/sources/ts/iron/uniforms.ts +++ b/base/sources/ts/iron/uniforms.ts @@ -427,12 +427,6 @@ function uniforms_set_obj_const(obj: object_t, loc: iron_gpu_constant_location_t else if (c.link == "_world_wiew_matrix") { m = mat4_mult_mat(obj.transform.world_unpack, camera.v); } - else if (c.link == "_prev_world_view_proj_matrix") { - let mo: mesh_object_t = obj.ext; - m = mat4_mult_mat(mo.prev_matrix, camera.prev_v); - // m = mat4_mult_mat(m, camera.prev_p); - m = mat4_mult_mat(m, camera.p); - } else if (uniforms_mat4_links != null) { m = uniforms_mat4_links(obj, current_material(obj), c.link); } diff --git a/base/sources/ts/node_shader.ts b/base/sources/ts/node_shader.ts index c5f0bd07..199aa82a 100644 --- a/base/sources/ts/node_shader.ts +++ b/base/sources/ts/node_shader.ts @@ -21,19 +21,8 @@ type node_shader_t = { frag_write_normal?: i32; // References - vert_bposition?: bool; vert_wposition?: bool; - vert_mposition?: bool; - vert_vposition?: bool; - vert_wvpposition?: bool; - vert_ndcpos?: bool; - vert_wtangent?: bool; - vert_vvec?: bool; - vert_vvec_cam?: bool; vert_n?: bool; - vert_nattr?: bool; - vert_dotnv?: bool; - frag_bposition?: bool; frag_wposition?: bool; frag_mposition?: bool; @@ -150,10 +139,6 @@ function node_shader_write_frag(raw: node_shader_t, s: string) { } } -function node_shader_write_end_frag(raw: node_shader_t, s: string) { - raw.frag_end += s + "\n"; -} - function node_shader_write_attrib_frag(raw: node_shader_t, s: string) { raw.frag_attribs += s + "\n"; } @@ -168,7 +153,7 @@ function node_shader_data_size(raw: node_shader_t, data: string): string { else if (data == "float3") { return "3"; } - else { // float 4 || short4norm + else { // float4 || short4norm return "4"; } } @@ -177,94 +162,81 @@ function node_shader_vstruct_to_vsin(raw: node_shader_t) { let vs: vertex_element_t[] = raw.context.data.vertex_elements; for (let i: i32 = 0; i < vs.length; ++i) { let e: vertex_element_t = vs[i]; - node_shader_add_in(raw, "vec" + node_shader_data_size(raw, e.data) + " " + e.name); + node_shader_add_in(raw, "" + e.name + ": " + "float" + node_shader_data_size(raw, e.data)); } } function node_shader_get(raw: node_shader_t): string { - let test: string = "\n\ - struct vert_in { pos: float3; } \n\ - struct vert_out { pos: float4; } \n\ - fun test_vert(input: vert_in): vert_out { \n\ - var output: vert_out; \n\ - output.pos = float4(input.pos, 1.0); \n\ - return output; \n\ - } \n\ - fun test_frag(input: vert_out): float4 { \n\ - return float4(1.0, 0.0, 0.0, 1.0); \n\ - } \n\ - #[pipe] \n\ - struct pipe { \n\ - vertex = test_vert; \n\ - fragment = test_frag; \n\ - }"; - return test; + node_shader_vstruct_to_vsin(raw); - // node_shader_vstruct_to_vsin(raw); - - // let shared_sampler: string = "shared_sampler"; + 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 = ""; + let s: string = ""; - // s += "struct vert_in {\n"; - // for (let i: i32 = 0; i < raw.ins.length; ++i) { - // let a: string = raw.ins[i]; - // s += a + ";\n"; - // } - // s += "}\n"; + s += "struct vert_in {\n"; + for (let i: i32 = 0; i < raw.ins.length; ++i) { + let a: string = raw.ins[i]; + s += "\t" + a + ";\n"; + } + s += "}\n\n"; - // s += "struct vert_out {\n"; - // for (let i: i32 = 0; i < raw.outs.length; ++i) { - // let a: string = raw.outs[i]; - // s += a + ";\n"; - // } - // s += "}\n"; + s += "struct vert_out {\n"; + s += "\tpos: float4;\n"; + for (let i: i32 = 0; i < raw.outs.length; ++i) { + let a: string = raw.outs[i]; + s += "\t" + a + ";\n"; + } + 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]; + s += "\t" + a + ";\n"; + } + s += "};\n\n"; - // s += "\ - // #[set(everything)] \n\ - // const constants: { \n"; - // for (let i: i32 = 0; i < raw.uniforms.length; ++i) { - // let a: string = raw.uniforms[i]; - // s += a + ";\n"; - // } - // s += "};\n"; - - // // for (let i: i32 = 0; i < raw.shared_samplers.length; ++i) { - // // let a: string = raw.shared_samplers[i]; - // // s += "uniform " + a + ";\n"; - // // } - - // let keys: string[] = map_keys(raw.functions); - // for (let i: i32 = 0; i < keys.length; ++i) { - // let f: string = map_get(raw.functions, keys[i]); - // s += f + "\n"; + // for (let i: i32 = 0; i < raw.shared_samplers.length; ++i) { + // let a: string = raw.shared_samplers[i]; + // s += "uniform " + a + ";\n"; // } - // s += "fun kong_vert(input: vert_in): vert_out {\n"; - // s += "var output: vert_out;"; - // s += raw.main_attribs; - // s += raw.main_normal; - // s += raw.main; - // s += raw.main_end; - // s += "return output;"; - // s += "}\n"; + let keys: string[] = map_keys(raw.functions); + for (let i: i32 = 0; i < keys.length; ++i) { + let f: string = map_get(raw.functions, keys[i]); + s += f + "\n"; + } + s += "\n"; - // s += "fun kong_frag(input: vert_out): float4 {\n"; - // s += "var output: float4;"; - // s += "return output;"; - // s += "}\n"; + s += "fun kong_vert(input: vert_in): vert_out {\n"; + s += "\tvar output: vert_out;\n\n"; + s += raw.vert_attribs; + s += raw.vert_normal; + s += raw.vert; + s += raw.vert_end; + s += "\n\treturn output;\n"; + s += "}\n\n"; - // s += " \ - // #[pipe] \n\ - // struct pipe { \n\ - // vertex = kong_vert; \n\ - // fragment = kong_frag; \n\ - // }\n"; + s += "fun kong_frag(input: vert_out): " + raw.frag_out + " {\n"; + s += "\tvar output: " + raw.frag_out + ";\n\n"; + s += raw.frag_attribs; + s += raw.frag_normal; + s += raw.frag; + s += raw.frag_end; + s += "\n\treturn output;\n"; + s += "}\n\n"; - // return s; + s += "#[pipe]\n"; + s += "struct pipe {\n"; + s += "\tvertex = kong_vert;\n"; + 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 b9784350..de6b4027 100644 --- a/base/sources/ts/parser_material.ts +++ b/base/sources/ts/parser_material.ts @@ -121,7 +121,7 @@ function parser_material_init() { parser_material_parsed = []; parser_material_parents = []; parser_material_cotangent_frame_written = false; - parser_material_out_normaltan = "vec3(0.5, 0.5, 1.0)"; + parser_material_out_normaltan = "float3(0.5, 0.5, 1.0)"; parser_material_script_links = null; parser_material_parsing_basecolor = false; } @@ -150,7 +150,7 @@ function parser_material_parse(canvas: ui_node_canvas_t, _con: node_shader_conte }; parser_material_write_result(link); let sout: shader_out_t = { - out_basecol: "vec3(0.0, 0.0, 0.0)", + out_basecol: "float3(0.0, 0.0, 0.0)", out_roughness: "0.0", out_metallic: "0.0", out_occlusion: "1.0", @@ -186,38 +186,38 @@ function parser_material_finalize(con: node_shader_context_t) { if (kong.frag_bposition) { if (parser_material_triplanar) { - node_shader_write_attrib_frag(kong, "vec3 bposition = vec3(\ + node_shader_write_attrib_frag(kong, "var bposition: float3 = float3(\ tex_coord1.x * tex_coord_blend.y + tex_coord2.x * tex_coord_blend.z,\ tex_coord.x * tex_coord_blend.x + tex_coord2.y * tex_coord_blend.z,\ tex_coord.y * tex_coord_blend.x + tex_coord1.y * tex_coord_blend.y);"); } else if (kong.frag_ndcpos) { - node_shader_add_out(kong, "vec3 bposition"); + node_shader_add_out(kong, "bposition: float3"); node_shader_write_vert(kong, "bposition = (ndc.xyz / ndc.w);"); } else { - node_shader_add_out(kong, "vec3 bposition"); - node_shader_add_uniform(kong, "vec3 dim", "_dim"); - node_shader_add_uniform(kong, "vec3 hdim", "_half_dim"); + 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;"); } } if (kong.frag_wposition) { - node_shader_add_uniform(kong, "mat4 W", "_world_matrix"); - node_shader_add_out(kong, "vec3 wposition"); - node_shader_write_attrib_vert(kong, "wposition = vec4(mul(vec4(pos.xyz, 1.0), W)).xyz;"); + node_shader_add_uniform(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;"); } else if (kong.vert_wposition) { - node_shader_add_uniform(kong, "mat4 W", "_world_matrix"); - node_shader_write_attrib_vert(kong, "vec3 wposition = vec4(mul(vec4(pos.xyz, 1.0), W)).xyz;"); + 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;"); } if (kong.frag_vposition) { - node_shader_add_uniform(kong, "mat4 WV", "_world_view_matrix"); - node_shader_add_out(kong, "vec3 vposition"); - node_shader_write_attrib_vert(kong, "vposition = vec4(mul(vec4(pos.xyz, 1.0), WV)).xyz;"); + node_shader_add_uniform(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;"); } if (kong.frag_mposition) { - node_shader_add_out(kong, "vec3 mposition"); + node_shader_add_out(kong, "mposition: float3"); if (kong.frag_ndcpos) { node_shader_write_vert(kong, "mposition = (ndc.xyz / ndc.w);"); } @@ -226,44 +226,44 @@ function parser_material_finalize(con: node_shader_context_t) { } } if (kong.frag_wtangent) { - node_shader_add_out(kong, "vec3 wtangent"); - node_shader_write_attrib_vert(kong, "wtangent = vec3(0.0, 0.0, 0.0);"); + node_shader_add_out(kong, "wtangent: float3"); + node_shader_write_attrib_vert(kong, "wtangent = float3(0.0, 0.0, 0.0);"); } if (kong.frag_vvec_cam) { - node_shader_add_uniform(kong, "mat4 WV", "_world_view_matrix"); - node_shader_add_out(kong, "vec3 eye_dir_cam"); - node_shader_write_attrib_vert(kong, "eye_dir_cam = vec4(mul(vec4(pos.xyz, 1.0), WV)).xyz; eye_dir_cam.z *= -1.0;"); - node_shader_write_attrib_frag(kong, "vec3 vvec_cam = normalize(eye_dir_cam);"); + node_shader_add_uniform(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);"); } if (kong.frag_vvec) { - node_shader_add_uniform(kong, "vec3 eye", "_camera_pos"); - node_shader_add_out(kong, "vec3 eye_dir"); + node_shader_add_uniform(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, "vec3 vvec = normalize(eye_dir);"); + node_shader_write_attrib_frag(kong, "var vvec: float3 = normalize(eye_dir);"); } if (kong.frag_n) { - node_shader_add_uniform(kong, "mat3 N", "_normal_matrix"); - node_shader_add_out(kong, "vec3 wnormal"); - node_shader_write_attrib_vert(kong, "wnormal = mul(vec3(nor.xy, pos.w), N);"); - node_shader_write_attrib_frag(kong, "vec3 n = normalize(wnormal);"); + node_shader_add_uniform(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);"); } else if (kong.vert_n) { - node_shader_add_uniform(kong, "mat3 N", "_normal_matrix"); - node_shader_write_attrib_vert(kong, "vec3 wnormal = normalize(mul(vec3(nor.xy, pos.w), 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));"); } if (kong.frag_nattr) { - node_shader_add_out(kong, "vec3 nattr"); - node_shader_write_attrib_vert(kong, "nattr = vec3(nor.xy, pos.w);"); + node_shader_add_out(kong, "var nattr: float3"); + node_shader_write_attrib_vert(kong, "nattr = float3(nor.xy, pos.w);"); } if (kong.frag_dotnv) { - node_shader_write_attrib_frag(kong, "float dotnv = max(dot(n, vvec), 0.0);"); + node_shader_write_attrib_frag(kong, "var dotnv: float = max(dot(n, vvec), 0.0);"); } if (kong.frag_wvpposition) { - node_shader_add_out(kong, "vec4 wvpposition"); - node_shader_write_end_vert(kong, "wvpposition = gl_Position;"); + node_shader_add_out(kong, "wvpposition: float4"); + node_shader_write_end_vert(kong, "wvpposition = output.pos;"); } if (node_shader_context_is_elem(con, "col")) { - node_shader_add_out(kong, "vec3 vcolor"); + node_shader_add_out(kong, "vcolor: float3"); node_shader_write_attrib_vert(kong, "vcolor = col.rgb;"); } } @@ -360,7 +360,7 @@ function parser_material_parse_shader_input(inp: ui_node_socket_t): shader_out_t } else { let sout: shader_out_t = { - out_basecol: "vec3(0.8, 0.8, 0.8)", + out_basecol: "float3(0.8, 0.8, 0.8)", out_roughness: "0.0", out_metallic: "0.0", out_occlusion: "1.0", @@ -375,7 +375,7 @@ function parser_material_parse_shader_input(inp: ui_node_socket_t): shader_out_t function parser_material_parse_shader(node: ui_node_t, socket: ui_node_socket_t): shader_out_t { let sout: shader_out_t = { - out_basecol: "vec3(0.8, 0.8, 0.8)", + out_basecol: "float3(0.8, 0.8, 0.8)", out_roughness: "0.0", out_metallic: "0.0", out_occlusion: "1.0", @@ -500,12 +500,12 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) return "vcolor"; } else { - return("vec3(0.0, 0.0, 0.0)"); + return("float3(0.0, 0.0, 0.0)"); } } else { // Vector node_shader_context_add_elem(parser_material_kong.context, "tex", "short2norm"); // UVMaps only for now - return "vec3(tex_coord.x, tex_coord.y, 0.0)"; + return "float3(tex_coord.x, tex_coord.y, 0.0)"; } } else if (node.type == "VERTEX_COLOR") { @@ -514,7 +514,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) return "vcolor"; } else { - return("vec3(0.0, 0.0, 0.0)"); + return("float3(0.0, 0.0, 0.0)"); } } @@ -564,7 +564,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } else { let tex_store: string = parser_material_store_var_name(node); // Pink color for missing texture - parser_material_write(parser_material_kong, "vec4 " + tex_store + " = vec4(1.0, 0.0, 1.0, 1.0);"); + parser_material_write(parser_material_kong, "var " + tex_store + ": float4 = float4(1.0, 0.0, 1.0, 1.0);"); return tex_store + ".rgb"; } } @@ -589,12 +589,12 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) node_shader_add_function(parser_material_kong, str_tex_noise); let co: string = parser_material_get_coord(node); let scale: string = parser_material_parse_value_input(node.inputs[1]); - let res: string = "vec3(tex_noise(" + co + " * " + scale + "), tex_noise(" + co + " * " + scale + " + 0.33), tex_noise(" + co + " * " + scale + " + 0.66))"; + let res: string = "float3(tex_noise(" + co + " * " + scale + "), tex_noise(" + co + " * " + scale + " + 0.33), tex_noise(" + co + " * " + scale + " + 0.66))"; return res; } 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_uniform(parser_material_kong, "snoise256: tex2d", "$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,13 +636,13 @@ 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, "sampler2D " + tex_name, "_" + tex_name); + node_shader_add_uniform(parser_material_kong, "" + tex_name + ": tex2d", "_" + tex_name); let store: string = parser_material_store_var_name(node); let pi: f32 = math_pi(); - parser_material_write(parser_material_kong, "float " + store + "_rad = " + angle + " * (" + pi + " / 180);"); - parser_material_write(parser_material_kong, "float " + store + "_x = cos(" + store + "_rad);"); - parser_material_write(parser_material_kong, "float " + store + "_y = sin(" + store + "_rad);"); - return "texture(" + tex_name + ", tex_coord + vec2(" + store + "_x, " + store + "_y) * " + mask + ").rgb;"; + parser_material_write(parser_material_kong, "var " + store + "_rad: float = " + angle + " * (" + pi + " / 180);"); + parser_material_write(parser_material_kong, "var " + store + "_x: float = cos(" + store + "_rad);"); + parser_material_write(parser_material_kong, "var " + store + "_y: float = sin(" + store + "_rad);"); + return "sample(" + tex_name + ", tex_coord + float2(" + store + "_x, " + store + "_y) * " + mask + ").rgb;"; } else if (node.type == "BLUR") { if (parser_material_blur_passthrough) { @@ -650,16 +650,16 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } let strength: string = parser_material_parse_value_input(node.inputs[1]); if (strength == "0.0") { - return "vec3(0.0, 0.0, 0.0)"; + return "float3(0.0, 0.0, 0.0)"; } let steps: string = "int(" + strength + " * 10 + 1)"; let tex_name: string = "texblur_" + parser_material_node_name(node); - node_shader_add_uniform(parser_material_kong, "sampler2D " + tex_name, "_" + tex_name); + node_shader_add_uniform(parser_material_kong, "" + tex_name + ": tex2d", "_" + tex_name); let store: string = parser_material_store_var_name(node); - parser_material_write(parser_material_kong, "vec3 " + store + "_res = vec3(0.0, 0.0, 0.0);"); - parser_material_write(parser_material_kong, "for (int i = -" + steps + "; i <= " + steps + "; ++i) {"); - parser_material_write(parser_material_kong, "for (int j = -" + steps + "; j <= " + steps + "; ++j) {"); - parser_material_write(parser_material_kong, store + "_res += texture(" + tex_name + ", tex_coord + vec2(i, j) / vec2(textureSize(" + tex_name + ", 0))).rgb;"); + parser_material_write(parser_material_kong, "var " + store + "_res: float3 = float3(0.0, 0.0, 0.0);"); + parser_material_write(parser_material_kong, "for (var i: int = -" + steps + "; i <= " + steps + "; i += 1) {"); + parser_material_write(parser_material_kong, "for (var j: int = -" + steps + "; j <= " + steps + "; j += 1) {"); + parser_material_write(parser_material_kong, store + "_res += sample(" + tex_name + ", tex_coord + float2(i, j) / float2(textureSize(" + tex_name + ", 0))).rgb;"); parser_material_write(parser_material_kong, "}"); parser_material_write(parser_material_kong, "}"); parser_material_write(parser_material_kong, store + "_res /= (" + steps + " * 2 + 1) * (" + steps + " * 2 + 1);"); @@ -672,12 +672,12 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) let val: string = parser_material_parse_value_input(node.inputs[2]); let fac: string = parser_material_parse_value_input(node.inputs[3]); let col: string = parser_material_parse_vector_input(node.inputs[4]); - return "hue_sat(" + col + ", vec4(" + hue + "-0.5, " + sat + ", " + val + ", 1.0-" + fac + "))"; + return "hue_sat(" + col + ", float4(" + hue + "-0.5, " + sat + ", " + val + ", 1.0-" + fac + "))"; } else if (node.type == "INVERT") { let fac: string = parser_material_parse_value_input(node.inputs[0]); let out_col: string = parser_material_parse_vector_input(node.inputs[1]); - return "mix(" + out_col + ", vec3(1.0, 1.0, 1.0) - (" + out_col + "), " + fac + ")"; + return "lerp(" + out_col + ", float3(1.0, 1.0, 1.0) - (" + out_col + "), " + fac + ")"; } else if (node.type == "MIX_RGB") { let fac: string = parser_material_parse_value_input(node.inputs[0]); @@ -691,73 +691,73 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) let use_clamp: bool = node.buttons[1].default_value[0] > 0; let out_col: string = ""; if (blend == "MIX") { - out_col = "mix(" + col1 + ", " + col2 + ", " + fac_var + ")"; + out_col = "lerp(" + col1 + ", " + col2 + ", " + fac_var + ")"; } else if (blend == "DARKEN") { out_col = "min(" + col1 + ", " + col2 + " * " + fac_var + ")"; } else if (blend == "MULTIPLY") { - out_col = "mix(" + col1 + ", " + col1 + " * " + col2 + ", " + fac_var + ")"; + out_col = "lerp(" + col1 + ", " + col1 + " * " + col2 + ", " + fac_var + ")"; } else if (blend == "BURN") { - out_col = "mix(" + col1 + ", vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - " + col1 + ") / " + col2 + ", " + fac_var + ")"; + out_col = "lerp(" + col1 + ", float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - " + col1 + ") / " + col2 + ", " + fac_var + ")"; } else if (blend == "LIGHTEN") { out_col = "max(" + col1 + ", " + col2 + " * " + fac_var + ")"; } else if (blend == "SCREEN") { let v3: string = parser_material_to_vec3("1.0 - " + fac_var + ""); - out_col = "(vec3(1.0, 1.0, 1.0) - (" + v3 + " + " + fac_var + " * (vec3(1.0, 1.0, 1.0) - " + col2 + ")) * (vec3(1.0, 1.0, 1.0) - " + col1 + "))"; + out_col = "(float3(1.0, 1.0, 1.0) - (" + v3 + " + " + fac_var + " * (float3(1.0, 1.0, 1.0) - " + col2 + ")) * (float3(1.0, 1.0, 1.0) - " + col1 + "))"; } else if (blend == "DODGE") { - out_col = "mix(" + col1 + ", " + col1 + " / (vec3(1.0, 1.0, 1.0) - " + col2 + "), " + fac_var + ")"; + out_col = "lerp(" + col1 + ", " + col1 + " / (float3(1.0, 1.0, 1.0) - " + col2 + "), " + fac_var + ")"; } else if (blend == "ADD") { - out_col = "mix(" + col1 + ", " + col1 + " + " + col2 + ", " + fac_var + ")"; + out_col = "lerp(" + col1 + ", " + col1 + " + " + col2 + ", " + fac_var + ")"; } else if (blend == "OVERLAY") { - out_col = "mix(" + col1 + ", vec3( \ + out_col = "lerp(" + col1 + ", float3( \ " + col1 + ".r < 0.5 ? 2.0 * " + col1 + ".r * " + col2 + ".r : 1.0 - 2.0 * (1.0 - " + col1 + ".r) * (1.0 - " + col2 + ".r), \ " + col1 + ".g < 0.5 ? 2.0 * " + col1 + ".g * " + col2 + ".g : 1.0 - 2.0 * (1.0 - " + col1 + ".g) * (1.0 - " + col2 + ".g), \ " + col1 + ".b < 0.5 ? 2.0 * " + col1 + ".b * " + col2 + ".b : 1.0 - 2.0 * (1.0 - " + col1 + ".b) * (1.0 - " + col2 + ".b) \ ), " + fac_var + ")"; } else if (blend == "SOFT_LIGHT") { - out_col = "((1.0 - " + fac_var + ") * " + col1 + " + " + fac_var + " * ((vec3(1.0, 1.0, 1.0) - " + col1 + ") * " + col2 + " * " + col1 + " + " + col1 + " * (vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - " + col2 + ") * (vec3(1.0, 1.0, 1.0) - " + col1 + "))))"; + out_col = "((1.0 - " + fac_var + ") * " + col1 + " + " + fac_var + " * ((float3(1.0, 1.0, 1.0) - " + col1 + ") * " + col2 + " * " + col1 + " + " + col1 + " * (float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - " + col2 + ") * (float3(1.0, 1.0, 1.0) - " + col1 + "))))"; } else if (blend == "LINEAR_LIGHT") { - out_col = "(" + col1 + " + " + fac_var + " * (vec3(2.0, 2.0, 2.0) * (" + col2 + " - vec3(0.5, 0.5, 0.5))))"; + out_col = "(" + col1 + " + " + fac_var + " * (float3(2.0, 2.0, 2.0) * (" + col2 + " - float3(0.5, 0.5, 0.5))))"; } else if (blend == "DIFFERENCE") { - out_col = "mix(" + col1 + ", abs(" + col1 + " - " + col2 + "), " + fac_var + ")"; + out_col = "lerp(" + col1 + ", abs(" + col1 + " - " + col2 + "), " + fac_var + ")"; } else if (blend == "SUBTRACT") { - out_col = "mix(" + col1 + ", " + col1 + " - " + col2 + ", " + fac_var + ")"; + out_col = "lerp(" + col1 + ", " + col1 + " - " + col2 + ", " + fac_var + ")"; } else if (blend == "DIVIDE") { let eps: f32 = 0.000001; - col2 = "max(" + col2 + ", vec3(" + eps + ", " + eps + ", " + eps + "))"; + col2 = "max(" + col2 + ", float3(" + eps + ", " + eps + ", " + eps + "))"; let v3: string = parser_material_to_vec3("(1.0 - " + fac_var + ") * " + col1 + " + " + fac_var + " * " + col1 + " / " + col2); out_col = "(" + v3 + ")"; } else if (blend == "HUE") { node_shader_add_function(parser_material_kong, str_hue_sat); - out_col = "mix(" + col1 + ", hsv_to_rgb(vec3(rgb_to_hsv(" + col2 + ").r, rgb_to_hsv(" + col1 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; + out_col = "lerp(" + col1 + ", hsv_to_rgb(float3(rgb_to_hsv(" + col2 + ").r, rgb_to_hsv(" + col1 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; } else if (blend == "SATURATION") { node_shader_add_function(parser_material_kong, str_hue_sat); - out_col = "mix(" + col1 + ", hsv_to_rgb(vec3(rgb_to_hsv(" + col1 + ").r, rgb_to_hsv(" + col2 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; + out_col = "lerp(" + col1 + ", hsv_to_rgb(float3(rgb_to_hsv(" + col1 + ").r, rgb_to_hsv(" + col2 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; } else if (blend == "COLOR") { node_shader_add_function(parser_material_kong, str_hue_sat); - out_col = "mix(" + col1 + ", hsv_to_rgb(vec3(rgb_to_hsv(" + col2 + ").r, rgb_to_hsv(" + col2 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; + out_col = "lerp(" + col1 + ", hsv_to_rgb(float3(rgb_to_hsv(" + col2 + ").r, rgb_to_hsv(" + col2 + ").g, rgb_to_hsv(" + col1 + ").b)), " + fac_var + ")"; } else if (blend == "VALUE") { node_shader_add_function(parser_material_kong, str_hue_sat); - out_col = "mix(" + col1 + ", hsv_to_rgb(vec3(rgb_to_hsv(" + col1 + ").r, rgb_to_hsv(" + col1 + ").g, rgb_to_hsv(" + col2 + ").b)), " + fac_var + ")"; + out_col = "lerp(" + col1 + ", hsv_to_rgb(float3(rgb_to_hsv(" + col1 + ").r, rgb_to_hsv(" + col1 + ").g, rgb_to_hsv(" + col2 + ").b)), " + fac_var + ")"; } if (use_clamp) { - return "clamp(" + out_col + ", vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0))"; + return "clamp(" + out_col + ", float3(0.0, 0.0, 0.0), float3(1.0, 1.0, 1.0))"; } else { return out_col; @@ -774,7 +774,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) let new_color: string = parser_material_parse_vector_input(node.inputs[2]); let radius: string = parser_material_parse_value_input(node.inputs[3]); let fuzziness: string = parser_material_parse_value_input(node.inputs[4]); - return "mix(" + new_color + ", " + input_color + ", clamp((distance(" + old_color + ", " + input_color + ") - " + radius + ") / max(" + fuzziness + ", " + parser_material_eps + "), 0.0, 1.0))"; + return "lerp(" + new_color + ", " + input_color + ", clamp((distance(" + old_color + ", " + input_color + ") - " + radius + ") / max(" + fuzziness + ", " + parser_material_eps + "), 0.0, 1.0))"; } else if (node.type == "VALTORGB") { // ColorRamp let fac: string = parser_material_parse_value_input(node.inputs[0]); @@ -787,7 +787,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } // Write cols array let cols_var: string = parser_material_node_name(node) + "_cols"; - parser_material_write(parser_material_kong, "vec3 " + cols_var + "[" + len + "];"); // TODO: Make const + parser_material_write(parser_material_kong, "var " + cols_var + ": float3[" + len + "];"); // TODO: Make const for (let i: i32 = 0; i < len; ++i) { let tmp: f32[] = []; array_push(tmp, elems[i * 5]); @@ -797,7 +797,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } // Get index let fac_var: string = parser_material_node_name(node) + "_fac"; - parser_material_write(parser_material_kong, "float " + fac_var + " = " + fac + ";"); + parser_material_write(parser_material_kong, "var " + fac_var + ": float = " + fac + ";"); let index: string = "0"; for (let i: i32 = 1; i < len; ++i) { let e: f32 = elems[i * 5 + 4]; @@ -805,14 +805,14 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } // Write index let index_var: string = parser_material_node_name(node) + "_i"; - parser_material_write(parser_material_kong, "int " + index_var + " = " + index + ";"); + parser_material_write(parser_material_kong, "var " + index_var + ": int = " + index + ";"); if (interp == "CONSTANT") { return cols_var + "[" + index_var + "]"; } else { // Linear // Write facs array let facs_var: string = parser_material_node_name(node) + "_facs"; - parser_material_write(parser_material_kong, "float " + facs_var + "[" + len + "];"); // TODO: Make const + parser_material_write(parser_material_kong, "var " + facs_var + ": float[" + len + "];"); // TODO: Make const for (let i: i32 = 0; i < len; ++i) { let e: f32 = elems[i * 5 + 4]; parser_material_write(parser_material_kong, facs_var + "[" + i + "] = " + e + ";"); @@ -820,7 +820,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) // Mix color // float f = (pos - start) * (1.0 / (finish - start)) // TODO: index_var + 1 out of bounds - return "mix(" + cols_var + "[" + index_var + "], " + cols_var + "[" + index_var + " + 1], (" + + return "lerp(" + cols_var + "[" + index_var + "], " + cols_var + "[" + index_var + " + 1], (" + fac_var + " - " + facs_var + "[" + index_var + "]) * (1.0 / (" + facs_var + "[" + index_var + " + 1] - " + facs_var + "[" + index_var + "]) ))"; } @@ -834,7 +834,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) let vc1: string = parser_material_vector_curve(name + "1", vec + ".y", curves.buffer + 32 * 1, curves[97]); let vc2: string = parser_material_vector_curve(name + "2", vec + ".z", curves.buffer + 32 * 2, curves[98]); // mapping.curves[0].points[0].handle_type // bezier curve - return "(vec3(" + vc0 + ", " + vc1 + ", " + vc2 + ") * " + fac + ")"; + return "(float3(" + vc0 + ", " + vc1 + ", " + vc2 + ") * " + fac + ")"; } // else if (node.type == "CURVE_RGB") { // RGB Curves // let fac: string = parser_material_parse_value_input(node.inputs[0]); @@ -848,20 +848,20 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) // let vc3a: string = parser_material_vector_curve(name + "3a", vec + ".x", curves[3]); // let vc3b: string = parser_material_vector_curve(name + "3b", vec + ".y", curves[3]); // let vc3c: string = parser_material_vector_curve(name + "3c", vec + ".z", curves[3]); - // return "(sqrt(vec3(" + vc0 + ", " + vc1 + ", " + vc2 + ") * vec3(" + vc3a + ", " + vc3b + ", " + vc3c + ")) * " + fac + ")"; + // return "(sqrt(float3(" + vc0 + ", " + vc1 + ", " + vc2 + ") * float3(" + vc3a + ", " + vc3b + ", " + vc3c + ")) * " + fac + ")"; // } else if (node.type == "COMBHSV") { node_shader_add_function(parser_material_kong, str_hue_sat); let h: string = parser_material_parse_value_input(node.inputs[0]); let s: string = parser_material_parse_value_input(node.inputs[1]); let v: string = parser_material_parse_value_input(node.inputs[2]); - return "hsv_to_rgb(vec3(" + h + ", " + s + ", " + v + "))"; + return "hsv_to_rgb(float3(" + h + ", " + s + ", " + v + "))"; } else if (node.type == "COMBRGB") { let r: string = parser_material_parse_value_input(node.inputs[0]); let g: string = parser_material_parse_value_input(node.inputs[1]); let b: string = parser_material_parse_value_input(node.inputs[2]); - return "vec3(" + r + ", " + g + ", " + b + ")"; + return "float3(" + r + ", " + g + ", " + b + ")"; } else if (node.type == "WAVELENGTH") { node_shader_add_function(parser_material_kong, str_wavelength_to_rgb); @@ -876,16 +876,16 @@ 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, "sampler2D texpaint" + l, "_texpaint" + l); - return "texture(texpaint" + l + ", tex_coord).rgb"; + node_shader_add_uniform(parser_material_kong, "texpaint" + l + ": tex2d", "_texpaint" + l); + return "sample(texpaint" + l + ", tex_coord).rgb"; } else if (socket == node.outputs[5]) { // Normal - node_shader_add_uniform(parser_material_kong, "sampler2D texpaint_nor" + l, "_texpaint_nor" + l); - return "texture(texpaint_nor" + l + ", tex_coord).rgb"; + node_shader_add_uniform(parser_material_kong, "texpaint_nor" + l + ": tex2d", "_texpaint_nor" + l); + return "sample(texpaint_nor" + l + ", tex_coord).rgb"; } } else if (node.type == "MATERIAL") { - let result: string = "vec3(0.0, 0.0, 0.0)"; + let result: string = "float3(0.0, 0.0, 0.0)"; let mi: i32 = node.buttons[0].default_value[0]; if (mi >= project_materials.length) { return result; @@ -910,11 +910,11 @@ 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, "vec3 picker_base", "_picker_base"); + node_shader_add_uniform(parser_material_kong, "picker_base: float3", "_picker_base"); return "picker_base"; } else if (socket == node.outputs[5]) { // Normal - node_shader_add_uniform(parser_material_kong, "vec3 picker_normal", "_picker_normal"); + node_shader_add_uniform(parser_material_kong, "picker_normal: float3", "_picker_normal"); return "picker_normal"; } } @@ -950,18 +950,18 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) return "wposition"; } else if (socket == node.outputs[1]) { // Color - return "vec3(0.0, 0.0, 0.0)"; + return "float3(0.0, 0.0, 0.0)"; } } // else if (node.type == "PARTICLE_INFO") { // if (socket == node.outputs[3]) { // Location - // return "vec3(0.0, 0.0, 0.0)"; + // return "float3(0.0, 0.0, 0.0)"; // } // else if (socket == node.outputs[5]) { // Velocity - // return "vec3(0.0, 0.0, 0.0)"; + // return "float3(0.0, 0.0, 0.0)"; // } // else if (socket == node.outputs[6]) { // Angular Velocity - // return "vec3(0.0, 0.0, 0.0)"; + // return "float3(0.0, 0.0, 0.0)"; // } // } else if (node.type == "TANGENT") { @@ -979,7 +979,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) } else if (socket == node.outputs[2]) {// UV node_shader_context_add_elem(parser_material_kong.context, "tex", "short2norm"); - return "vec3(tex_coord.x, tex_coord.y, 0.0)"; + return "float3(tex_coord.x, tex_coord.y, 0.0)"; } else if (socket == node.outputs[3]) { // Object parser_material_kong.frag_mposition = true; @@ -994,12 +994,12 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) return "wvpposition.xyz"; } else if (socket == node.outputs[6]) { // Reflection - return "vec3(0.0, 0.0, 0.0)"; + return "float3(0.0, 0.0, 0.0)"; } } else if (node.type == "UVMAP") { node_shader_context_add_elem(parser_material_kong.context, "tex", "short2norm"); - return "vec3(tex_coord.x, tex_coord.y, 0.0)"; + return "float3(tex_coord.x, tex_coord.y, 0.0)"; } else if (node.type == "BUMP") { let strength: string = parser_material_parse_value_input(node.inputs[0]); @@ -1007,38 +1007,38 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) let height: string = parser_material_parse_value_input(node.inputs[2]); let nor: string = parser_material_parse_vector_input(node.inputs[3]); let sample_bump_res: string = parser_material_store_var_name(node) + "_bump"; - parser_material_write(parser_material_kong, "float " + sample_bump_res + "_x = dFdx(float(" + height + ")) * (" + strength + ") * 16.0;"); - parser_material_write(parser_material_kong, "float " + sample_bump_res + "_y = dFdy(float(" + height + ")) * (" + strength + ") * 16.0;"); - return "(normalize(vec3(" + sample_bump_res + "_x, " + sample_bump_res + "_y, 1.0) + " + nor + ") * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5))"; + parser_material_write(parser_material_kong, "float " + sample_bump_res + "_x = ddx(float(" + height + ")) * (" + strength + ") * 16.0;"); + parser_material_write(parser_material_kong, "float " + sample_bump_res + "_y = ddy(float(" + height + ")) * (" + strength + ") * 16.0;"); + return "(normalize(float3(" + sample_bump_res + "_x, " + sample_bump_res + "_y, 1.0) + " + nor + ") * float3(0.5, 0.5, 0.5) + float3(0.5, 0.5, 0.5))"; } else if (node.type == "MAPPING") { let out: string = parser_material_parse_vector_input(node.inputs[0]); let node_translation: string = parser_material_parse_vector_input(node.inputs[1]); let node_rotation: string = parser_material_parse_vector_input(node.inputs[2]); let node_scale: string = parser_material_parse_vector_input(node.inputs[3]); - if (node_scale != "vec3(1, 1, 1)") { + if (node_scale != "float3(1, 1, 1)") { out = "(" + out + " * " + node_scale + ")"; } - if (node_rotation != "vec3(0, 0, 0)") { + if (node_rotation != "float3(0, 0, 0)") { // ZYX rotation, Z axis for now.. let a: string = node_rotation + ".z * (3.1415926535 / 180)"; // x * cos(theta) - y * sin(theta) // x * sin(theta) + y * cos(theta) - out = "vec3(" + out + ".x * cos(" + a + ") - " + out + ".y * sin(" + a + "), " + out + ".x * sin(" + a + ") + " + out + ".y * cos(" + a + "), 0.0)"; + out = "float3(" + out + ".x * cos(" + a + ") - " + out + ".y * sin(" + a + "), " + out + ".x * sin(" + a + ") + " + out + ".y * cos(" + a + "), 0.0)"; } // if node.rotation[1] != 0.0: // a = node.rotation[1] - // out = "vec3({0}.x * {1} - {0}.z * {2}, {0}.x * {2} + {0}.z * {1}, 0.0)".format(out, math_cos(a), math_sin(a)) + // out = "float3({0}.x * {1} - {0}.z * {2}, {0}.x * {2} + {0}.z * {1}, 0.0)".format(out, math_cos(a), math_sin(a)) // if node.rotation[0] != 0.0: // a = node.rotation[0] - // out = "vec3({0}.y * {1} - {0}.z * {2}, {0}.y * {2} + {0}.z * {1}, 0.0)".format(out, math_cos(a), math_sin(a)) - if (node_translation != "vec3(0, 0, 0)") { + // out = "float3({0}.y * {1} - {0}.z * {2}, {0}.y * {2} + {0}.z * {1}, 0.0)".format(out, math_cos(a), math_sin(a)) + if (node_translation != "float3(0, 0, 0)") { out = "(" + out + " + " + node_translation + ")"; } // if node.use_min: - // out = "max({0}, vec3({1}, {2}, {3}))".format(out, node.min[0], node.min[1]) + // out = "max({0}, float3({1}, {2}, {3}))".format(out, node.min[0], node.min[1]) // if node.use_max: - // out = "min({0}, vec3({1}, {2}, {3}))".format(out, node.max[0], node.max[1]) + // out = "min({0}, float3({1}, {2}, {3}))".format(out, node.max[0], node.max[1]) return out; } else if (node.type == "NORMAL") { @@ -1056,7 +1056,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) let norm: string = parser_material_parse_vector_input(node.inputs[1]); let store: string = parser_material_store_var_name(node); - parser_material_write(parser_material_kong, "vec3 " + store + "_texn = " + norm + " * 2.0 - 1.0;"); + parser_material_write(parser_material_kong, "var " + store + "_texn: float3 = " + norm + " * 2.0 - 1.0;"); parser_material_write(parser_material_kong, "" + store + "_texn.xy = " + strength + " * " + store + "_texn.xy;"); parser_material_write(parser_material_kong, "" + store + "_texn = normalize(" + store + "_texn);"); @@ -1073,18 +1073,18 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) // The blending algorithms are based on the paper "Blending in Detail" by Colin Barré-Brisebois and Stephen Hill 2012 // https://blog.selfshadow.com/publications/blending-in-detail/ if (blend == "PARTIAL_DERIVATIVE") { //partial derivate blending - parser_material_write(parser_material_kong, "vec3 " + store + "_n1 = " + nm1 + " * 2.0 - 1.0;"); - parser_material_write(parser_material_kong, "vec3 " + store + "_n2 = " + nm2 + " * 2.0 - 1.0;"); - return "0.5 * normalize(vec3(" + store + "_n1.xy * " + store + "_n2.z + " + store + "_n2.xy * " + store + "_n1.z, " + store + "_n1.z * " + store + "_n2.z)) + 0.5;"; + parser_material_write(parser_material_kong, "var " + store + "_n1: float3 = " + nm1 + " * 2.0 - 1.0;"); + parser_material_write(parser_material_kong, "var " + store + "_n2: float3 = " + nm2 + " * 2.0 - 1.0;"); + return "0.5 * normalize(float3(" + store + "_n1.xy * " + store + "_n2.z + " + store + "_n2.xy * " + store + "_n1.z, " + store + "_n1.z * " + store + "_n2.z)) + 0.5;"; } else if (blend == "WHITEOUT") { //whiteout blending - parser_material_write(parser_material_kong, "vec3 " + store + "_n1 = " + nm1 + " * 2.0 - 1.0;"); - parser_material_write(parser_material_kong, "vec3 " + store + "_n2 = " + nm2 + " * 2.0 - 1.0;"); - return "0.5 * normalize(vec3(" + store + "_n1.xy + " + store + "_n2.xy, " + store + "_n1.z * " + store + "_n2.z)) + 0.5;"; + parser_material_write(parser_material_kong, "var " + store + "_n1: float3 = " + nm1 + " * 2.0 - 1.0;"); + parser_material_write(parser_material_kong, "var " + store + "_n2: float3 = " + nm2 + " * 2.0 - 1.0;"); + return "0.5 * normalize(float3(" + store + "_n1.xy + " + store + "_n2.xy, " + store + "_n1.z * " + store + "_n2.z)) + 0.5;"; } else if (blend == "REORIENTED") { //reoriented normal mapping - parser_material_write(parser_material_kong, "vec3 " + store + "_n1 = " + nm1 + " * 2.0 - vec3(1.0, 1.0, 0.0);"); - parser_material_write(parser_material_kong, "vec3 " + store + "_n2 = " + nm2 + " * vec3(-2.0, -2.0, 2.0) - vec3(-1.0, -1.0, 1.0);"); + parser_material_write(parser_material_kong, "var " + store + "_n1: float3 = " + nm1 + " * 2.0 - float3(1.0, 1.0, 0.0);"); + parser_material_write(parser_material_kong, "var " + store + "_n2: float3 = " + nm2 + " * float3(-2.0, -2.0, 2.0) - float3(-1.0, -1.0, 1.0);"); return "0.5 * normalize(" + store + "_n1 * dot(" + store + "_n1, " + store + "_n2) - " + store + "_n2 * " + store + "_n1.z) + 0.5"; } } @@ -1099,7 +1099,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) let x: string = parser_material_parse_value_input(node.inputs[0]); let y: string = parser_material_parse_value_input(node.inputs[1]); let z: string = parser_material_parse_value_input(node.inputs[2]); - return "vec3(" + x + ", " + y + ", " + z + ")"; + return "float3(" + x + ", " + y + ", " + z + ")"; } else if (node.type == "VECT_MATH") { let vec1: string = parser_material_parse_vector_input(node.inputs[0]); @@ -1135,7 +1135,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) return "(" + vec1 + " * " + vec2 + ")"; } else if (op == "DIVIDE") { - return "vec3(" + vec1 + ".x / (" + vec2 + ".x == 0 ? 0.000001 : " + vec2 + ".x), " + vec1 + ".y / (" + vec2 + ".y == 0 ? 0.000001 : " + vec2 + ".y), " + vec1 + ".z / (" + vec2 + ".z == 0 ? 0.000001 : " + vec2 + ".z))"; + return "float3(" + vec1 + ".x / (" + vec2 + ".x == 0 ? 0.000001 : " + vec2 + ".x), " + vec1 + ".y / (" + vec2 + ".y == 0 ? 0.000001 : " + vec2 + ".y), " + vec1 + ".z / (" + vec2 + ".z == 0 ? 0.000001 : " + vec2 + ".z))"; } else if (op == "PROJECT") { return "(dot(" + vec1 + ", " + vec2 + ") / dot(" + vec2 + ", " + vec2 + ") * " + vec2 + ")"; @@ -1162,7 +1162,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) return "ceil(" + vec1 + ")"; } else if (op == "FRACTION") { - return "fract(" + vec1 + ")"; + return "frac(" + vec1 + ")"; } else if (op == "MODULO") { return "mod(" + vec1 + ", " + vec2 + ")"; @@ -1188,7 +1188,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t) let cb: any = map_get(parser_material_custom_nodes, node.type); // JSValue -> (n: ui_node_t, s: string)=>string return js_call_ptr_str(cb, node, socket.name); } - return "vec3(0.0, 0.0, 0.0)"; + return "float3(0.0, 0.0, 0.0)"; } function parse_normal_map_color_input(inp: ui_node_socket_t) { @@ -1197,16 +1197,16 @@ function parse_normal_map_color_input(inp: ui_node_socket_t) { let _parser_material_is_frag: bool = parser_material_is_frag; parser_material_is_frag = true; if (!parser_material_arm_export_tangents) { - parser_material_write(parser_material_kong, "vec3 texn = (" + parser_material_out_normaltan + ") * 2.0 - 1.0;"); + parser_material_write(parser_material_kong, "var texn: float3 = (" + parser_material_out_normaltan + ") * 2.0 - 1.0;"); parser_material_write(parser_material_kong, "texn.y = -texn.y;"); if (!parser_material_cotangent_frame_written) { parser_material_cotangent_frame_written = true; node_shader_add_function(parser_material_kong, str_cotangent_frame); } parser_material_kong.frag_n = true; - parser_material_write(parser_material_kong, "mat3 TBN = cotangent_frame(n, vvec, tex_coord);"); + parser_material_write(parser_material_kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); - parser_material_write(parser_material_kong, "n = mul(normalize(texn), TBN);"); + parser_material_write(parser_material_kong, "n = TBN * normalize(texn);"); } parser_material_is_frag = _parser_material_is_frag; parser_material_kong.frag_write_normal--; @@ -1224,7 +1224,7 @@ function parser_material_parse_value_input(inp: ui_node_socket_t, vector_as_gray let st: string = from_node.outputs[l.from_socket].type; if (st == "RGB" || st == "RGBA" || st == "VECTOR") { if (vector_as_grayscale) { - return "dot(" + res_var + ".rbg, vec3(0.299, 0.587, 0.114))"; + return "dot(" + res_var + ".rbg, float3(0.299, 0.587, 0.114))"; } else { return res_var + ".x"; @@ -1247,26 +1247,26 @@ 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, "float time", "_time"); + node_shader_add_uniform(parser_material_kong, "time: float", "_time"); return "time"; } else if (node.type == "VERTEX_COLOR") { return "1.0"; } else if (node.type == "WIREFRAME") { - node_shader_add_uniform(parser_material_kong, "sampler2D texuvmap", "_texuvmap"); + node_shader_add_uniform(parser_material_kong, "texuvmap: tex2d", "_texuvmap"); // let use_pixel_size: bool = node.buttons[0].default_value == "true"; // let pixel_size: f32 = parse_value_input(node.inputs[0]); - return "textureLod(texuvmap, tex_coord, 0.0).r"; + 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, "vec2 camera_proj", "_camera_plane_proj"); + node_shader_add_uniform(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))"; } else { // View Distance - node_shader_add_uniform(parser_material_kong, "vec3 eye", "_camera_pos"); + node_shader_add_uniform(parser_material_kong, "eye: float3", "_camera_pos"); parser_material_kong.frag_wposition = true; return "distance(eye, wposition)"; } @@ -1274,31 +1274,31 @@ function parser_material_parse_value(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[1]) { // Opac - node_shader_add_uniform(parser_material_kong, "sampler2D texpaint" + l, "_texpaint" + l); - return "texture(texpaint" + l + ", tex_coord).a"; + node_shader_add_uniform(parser_material_kong, "texpaint" + l + ": tex2d", "_texpaint" + l); + return "sample(texpaint" + l + ", tex_coord).a"; } else if (socket == node.outputs[2]) { // Occ - node_shader_add_uniform(parser_material_kong, "sampler2D texpaint_pack" + l, "_texpaint_pack" + l); - return "texture(texpaint_pack" + l + ", tex_coord).r"; + node_shader_add_uniform(parser_material_kong, "texpaint_pack" + l + ": tex2d", "_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, "sampler2D texpaint_pack" + l, "_texpaint_pack" + l); - return "texture(texpaint_pack" + l + ", tex_coord).g"; + node_shader_add_uniform(parser_material_kong, "texpaint_pack" + l + ": tex2d", "_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, "sampler2D texpaint_pack" + l, "_texpaint_pack" + l); - return "texture(texpaint_pack" + l + ", tex_coord).b"; + node_shader_add_uniform(parser_material_kong, "texpaint_pack" + l + ": tex2d", "_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, "sampler2D texpaint_pack" + l, "_texpaint_pack" + l); - return "texture(texpaint_pack" + l + ", tex_coord).a"; + node_shader_add_uniform(parser_material_kong, "texpaint_pack" + l + ": tex2d", "_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, "sampler2D texpaint" + l, "_texpaint" + l); - return "texture(texpaint" + l + ", tex_coord).r"; + node_shader_add_uniform(parser_material_kong, "texpaint" + l + ": tex2d", "_texpaint" + l); + return "sample(texpaint" + l + ", tex_coord).r"; } } else if (node.type == "MATERIAL") { @@ -1334,23 +1334,23 @@ 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, "float picker_opacity", "_picker_opacity"); + node_shader_add_uniform(parser_material_kong, "picker_opacity: float", "_picker_opacity"); return "picker_opacity"; } else if (socket == node.outputs[2]) { - node_shader_add_uniform(parser_material_kong, "float picker_occlusion", "_picker_occlusion"); + node_shader_add_uniform(parser_material_kong, "picker_occlusion: float", "_picker_occlusion"); return "picker_occlusion"; } else if (socket == node.outputs[3]) { - node_shader_add_uniform(parser_material_kong, "float picker_roughness", "_picker_roughness"); + node_shader_add_uniform(parser_material_kong, "picker_roughness: float", "_picker_roughness"); return "picker_roughness"; } else if (socket == node.outputs[4]) { - node_shader_add_uniform(parser_material_kong, "float picker_metallic", "_picker_metallic"); + node_shader_add_uniform(parser_material_kong, "picker_metallic: float", "_picker_metallic"); return "picker_metallic"; } else if (socket == node.outputs[7]) { - node_shader_add_uniform(parser_material_kong, "float picker_height", "_picker_height"); + node_shader_add_uniform(parser_material_kong, "picker_height: float", "_picker_height"); return "picker_height"; } } @@ -1370,9 +1370,9 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): let offset: f32 = 0.0; let store: string = parser_material_store_var_name(node); parser_material_kong.frag_n = true; - parser_material_write(parser_material_kong, "vec3 " + store + "_dx = dFdx(n);"); - parser_material_write(parser_material_kong, "vec3 " + store + "_dy = dFdy(n);"); - parser_material_write(parser_material_kong, "float " + store + "_curvature = max(dot(" + store + "_dx, " + store + "_dx), dot(" + store + "_dy, " + store + "_dy));"); + parser_material_write(parser_material_kong, "var " + store + "_dx: float3 = ddx3(n);"); + parser_material_write(parser_material_kong, "var " + store + "_dy: float3 = ddy3(n);"); + parser_material_write(parser_material_kong, "var " + store + "_curvature: float = max(dot(" + store + "_dx, " + store + "_dx), dot(" + store + "_dy, " + store + "_dy));"); parser_material_write(parser_material_kong, store + "_curvature = clamp(pow(" + store + "_curvature, (1.0 / " + radius + ") * 0.25) * " + strength + " * 2.0 + " + offset + " / 10.0, 0.0, 1.0);"); return store + "_curvature"; } @@ -1396,15 +1396,15 @@ 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, "float object_info_index", "_object_info_index"); + node_shader_add_uniform(parser_material_kong, "object_info_index: float", "_object_info_index"); return "object_info_index"; } else if (socket == node.outputs[2]) { // Material Index - node_shader_add_uniform(parser_material_kong, "float object_info_material_index", "_object_info_material_index"); + node_shader_add_uniform(parser_material_kong, "object_info_material_index: float", "_object_info_material_index"); return "object_info_material_index"; } else if (socket == node.outputs[3]) { // Random - node_shader_add_uniform(parser_material_kong, "float object_info_random", "_object_info_random"); + node_shader_add_uniform(parser_material_kong, "object_info_random: float", "_object_info_random"); return "object_info_random"; } } @@ -1511,9 +1511,9 @@ 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, "sampler2D " + tex_name, "_" + tex_name); + node_shader_add_uniform(parser_material_kong, "" + tex_name + ": tex2d", "_" + tex_name); let store: string = parser_material_store_var_name(node); - parser_material_write(parser_material_kong, "float " + store + "_res = texture(" + tex_name + ", tex_coord).r;"); + parser_material_write(parser_material_kong, "var " + store + "_res: float = sample(" + tex_name + ", tex_coord).r;"); return store + "_res"; } else if (node.type == "NORMAL") { @@ -1559,7 +1559,7 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): out_val = "sqrt(" + val1 + ")"; } else if(op == "INVERSE_SQUARE_ROOT") { - out_val = "inversesqrt(" + val1 + ")"; + out_val = "rsqrt(" + val1 + ")"; } else if (op == "EXPONENT") { out_val = "exp(" + val1 + ")"; @@ -1598,13 +1598,13 @@ function parser_material_parse_value(node: ui_node_t, socket: ui_node_socket_t): out_val = "trunc(" + val1 + ")"; } else if (op == "FRACTION") { - out_val = "fract(" + val1 + ")"; + out_val = "frac(" + val1 + ")"; } else if (op == "MODULO") { - out_val = "mod(" + val1 + ", " + val2 + ")"; + out_val = "(" + val1 + " % " + val2 + ")"; } else if (op == "PING-PONG") { - out_val = "((" + val2 + " != 0.0) ? abs(fract((" + val1 + " - " + val2 + ") / (" + val2 + " * 2.0)) * " + val2 + " * 2.0 - " + val2 + ") : 0.0)"; + out_val = "((" + val2 + " != 0.0) ? abs(frac((" + val1 + " - " + val2 + ") / (" + val2 + " * 2.0)) * " + val2 + " * 2.0 - " + val2 + ") : 0.0)"; } else if (op == "SINE") { out_val = "sin(" + val1 + ")"; @@ -1802,14 +1802,14 @@ function parser_material_get_gradient(grad: string, co: string): string { function parser_material_vector_curve(name: string, fac: string, points: f32_ptr, num: i32): string { // Write Ys array let ys_var: string = name + "_ys"; - parser_material_write(parser_material_kong, "float " + ys_var + "[" + num + "];"); // TODO: Make const + parser_material_write(parser_material_kong, "var " + ys_var + ": float[" + num + "];"); // TODO: Make const for (let i: i32 = 0; i < num; ++i) { let p: f32 = ARRAY_ACCESS(points, i * 2 + 1); parser_material_write(parser_material_kong, ys_var + "[" + i + "] = " + p + ";"); } // Get index let fac_var: string = name + "_fac"; - parser_material_write(parser_material_kong, "float " + fac_var + " = " + fac + ";"); + parser_material_write(parser_material_kong, "var " + fac_var + ": float = " + fac + ";"); let index: string = "0"; for (let i: i32 = 1; i < num; ++i) { let p: f32 = ARRAY_ACCESS(points, i * 2 + 0); @@ -1817,17 +1817,17 @@ function parser_material_vector_curve(name: string, fac: string, points: f32_ptr } // Write index let index_var: string = name + "_i"; - parser_material_write(parser_material_kong, "int " + index_var + " = " + index + ";"); + parser_material_write(parser_material_kong, "var " + index_var + ": int = " + index + ";"); // Linear // Write Xs array let facs_var: string = name + "_xs"; - parser_material_write(parser_material_kong, "float " + facs_var + "[" + num + "];"); // TODO: Make const + parser_material_write(parser_material_kong, "var " + facs_var + ": float[" + num + "];"); // TODO: Make const for (let i: i32 = 0; i < num; ++i) { let p: f32 = ARRAY_ACCESS(points, i * 2 + 0); parser_material_write(parser_material_kong, "" + facs_var + "[" + i + "] = " + p + ";"); } // Map vector - return "mix(" + + return "lerp(" + ys_var + "[" + index_var + "], " + ys_var + "[" + index_var + " + 1], (" + fac_var + " - " + facs_var + "[" + index_var + "]) * (1.0 / (" + facs_var + "[" + index_var + " + 1] - " + facs_var + "[" + index_var + "])))"; } @@ -1849,7 +1849,7 @@ function parser_material_write_result(l: ui_node_link_t): string { return null; } map_set(parser_material_parsed_map, res_var, res); - parser_material_write(parser_material_kong, "vec3 " + res_var + " = " + res + ";"); + parser_material_write(parser_material_kong, "var " + res_var + ": float3 = " + res + ";"); } else if (st == "VALUE") { let res: string = parser_material_parse_value(from_node, from_socket); @@ -1857,7 +1857,7 @@ function parser_material_write_result(l: ui_node_link_t): string { return null; } map_set(parser_material_parsed_map, res_var, res); - parser_material_write(parser_material_kong, "float " + res_var + " = " + res + ";"); + parser_material_write(parser_material_kong, "var " + res_var + ": float = " + res + ";"); } } return res_var; @@ -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, "sampler2D " + tex_name); + node_shader_add_uniform(parser_material_kong, "" + tex_name + ": tex2d"); let uv_name: string = ""; if (parser_material_get_input_link(node.inputs[0]) != null) { uv_name = parser_material_parse_vector_input(node.inputs[0]); @@ -1881,29 +1881,29 @@ function parser_material_texture_store(node: ui_node_t, tex: bind_tex_t, tex_nam let tex_store: string = parser_material_store_var_name(node); if (parser_material_sample_keep_aspect) { - parser_material_write(parser_material_kong, "vec2 " + tex_store + "_size = vec2(textureSize(" + tex_name + ", 0));"); - parser_material_write(parser_material_kong, "float " + tex_store + "_ax = " + tex_store + "_size.x / " + tex_store + "_size.y;"); - parser_material_write(parser_material_kong, "float " + tex_store + "_ay = " + tex_store + "_size.y / " + tex_store + "_size.x;"); - parser_material_write(parser_material_kong, "vec2 " + tex_store + "_uv = ((" + uv_name + ".xy / " + parser_material_sample_uv_scale + " - vec2(0.5, 0.5)) * vec2(max(" + tex_store + "_ay, 1.0), max(" + tex_store + "_ax, 1.0))) + vec2(0.5, 0.5);"); - parser_material_write(parser_material_kong, "if (" + tex_store + "_uv.x < 0.0 || " + tex_store + "_uv.y < 0.0 || " + tex_store + "_uv.x > 1.0 || " + tex_store + "_uv.y > 1.0) discard;"); + parser_material_write(parser_material_kong, "var " + tex_store + "_size: float2 = float2(textureSize(" + tex_name + ", 0));"); + parser_material_write(parser_material_kong, "var " + tex_store + "_ax: float = " + tex_store + "_size.x / " + tex_store + "_size.y;"); + parser_material_write(parser_material_kong, "var " + tex_store + "_ay: float = " + tex_store + "_size.y / " + tex_store + "_size.x;"); + parser_material_write(parser_material_kong, "var " + tex_store + "_uv: float2 = ((" + uv_name + ".xy / " + parser_material_sample_uv_scale + " - float2(0.5, 0.5)) * float2(max(" + tex_store + "_ay, 1.0), max(" + tex_store + "_ax, 1.0))) + float2(0.5, 0.5);"); + parser_material_write(parser_material_kong, "if (" + tex_store + "_uv.x < 0.0 || " + tex_store + "_uv.y < 0.0 || " + tex_store + "_uv.x > 1.0 || " + tex_store + "_uv.y > 1.0) { discard; }"); parser_material_write(parser_material_kong, "" + tex_store + "_uv *= " + parser_material_sample_uv_scale + ";"); uv_name = tex_store + "_uv"; } if (parser_material_triplanar) { - parser_material_write(parser_material_kong, "vec4 " + tex_store + " = vec4(0.0, 0.0, 0.0, 0.0);"); - parser_material_write(parser_material_kong, "if (tex_coord_blend.x > 0) " + tex_store + " += texture(" + tex_name + ", " + uv_name + ".xy) * tex_coord_blend.x;"); - parser_material_write(parser_material_kong, "if (tex_coord_blend.y > 0) " + tex_store + " += texture(" + tex_name + ", " + uv_name + "1.xy) * tex_coord_blend.y;"); - parser_material_write(parser_material_kong, "if (tex_coord_blend.z > 0) " + tex_store + " += texture(" + tex_name + ", " + uv_name + "2.xy) * tex_coord_blend.z;"); + parser_material_write(parser_material_kong, "var " + tex_store + ": float4 = float4(0.0, 0.0, 0.0, 0.0);"); + parser_material_write(parser_material_kong, "if (tex_coord_blend.x > 0) {" + tex_store + " += sample(" + tex_name + ", " + uv_name + ".xy) * tex_coord_blend.x; }"); + parser_material_write(parser_material_kong, "if (tex_coord_blend.y > 0) {" + tex_store + " += sample(" + tex_name + ", " + uv_name + "1.xy) * tex_coord_blend.y; }"); + parser_material_write(parser_material_kong, "if (tex_coord_blend.z > 0) {" + tex_store + " += sample(" + tex_name + ", " + uv_name + "2.xy) * tex_coord_blend.z; }"); } else { if (parser_material_is_frag) { - map_set(parser_material_texture_map, tex_store, "texture(" + tex_name + ", " + uv_name + ".xy)"); - parser_material_write(parser_material_kong, "vec4 " + tex_store + " = texture(" + tex_name + ", " + uv_name + ".xy);"); + map_set(parser_material_texture_map, tex_store, "sample(" + tex_name + ", " + uv_name + ".xy)"); + parser_material_write(parser_material_kong, "var " + tex_store + ": float4 = sample(" + tex_name + ", " + uv_name + ".xy);"); } else { - map_set(parser_material_texture_map, tex_store, "textureLod(" + tex_name + ", " + uv_name + ".xy, 0.0)"); - parser_material_write(parser_material_kong, "vec4 " + tex_store + " = textureLod(" + tex_name + ", " + uv_name + ".xy, 0.0);"); + map_set(parser_material_texture_map, tex_store, "sample_lod(" + tex_name + ", " + uv_name + ".xy, 0.0)"); + parser_material_write(parser_material_kong, "var " + tex_store + ": float4 = sample_lod(" + tex_name + ", " + uv_name + ".xy, 0.0);"); } if (!ends_with(tex.file, ".jpg")) { // Pre-mult alpha parser_material_write(parser_material_kong, tex_store + ".rgb *= " + tex_store + ".a;"); @@ -1913,10 +1913,10 @@ function parser_material_texture_store(node: ui_node_t, tex: bind_tex_t, tex_nam if (parser_material_transform_color_space) { // Base color socket auto-converts from sRGB to linear if (color_space == color_space_t.LINEAR && parser_material_parsing_basecolor) { // Linear to sRGB - parser_material_write(parser_material_kong, tex_store + ".rgb = pow(" + tex_store + ".rgb, vec3(2.2, 2.2, 2.2));"); + parser_material_write(parser_material_kong, tex_store + ".rgb = pow(" + tex_store + ".rgb, float3(2.2, 2.2, 2.2));"); } else if (color_space == color_space_t.SRGB && !parser_material_parsing_basecolor) { // sRGB to linear - parser_material_write(parser_material_kong, tex_store + ".rgb = pow(" + tex_store + ".rgb, vec3(1.0 / 2.2, 1.0 / 2.2, 1.0 / 2.2));"); + parser_material_write(parser_material_kong, tex_store + ".rgb = pow(" + tex_store + ".rgb, float3(1.0 / 2.2, 1.0 / 2.2, 1.0 / 2.2));"); } else if (color_space == color_space_t.DIRECTX_NORMAL_MAP) { // DirectX normal map to OpenGL normal map parser_material_write(parser_material_kong, tex_store + ".y = 1.0 - " + tex_store + ".y;"); @@ -1926,30 +1926,19 @@ function parser_material_texture_store(node: ui_node_t, tex: bind_tex_t, tex_nam } function parser_material_vec1(v: f32): string { - ///if arm_android - return "float(" + v + ")"; - ///else + // return "float(" + v + ")"; return v + ""; - ///end } function parser_material_vec3(v: f32_array_t): string { let v0: f32 = v[0]; let v1: f32 = v[1]; let v2: f32 = v[2]; - ///if arm_android - return "vec3(float(" + v0 + "), float(" + v1 + "), float(" + v2 + "))"; - ///else - return "vec3(" + v0 + ", " + v1 + ", " + v2 + ")"; - ///end + return "float3(" + v0 + ", " + v1 + ", " + v2 + ")"; } function parser_material_to_vec3(s: string): string { - ///if arm_direct3d12 - return "(" + s + ").xxx"; - ///else - return "vec3(" + s + ")"; - ///end + return "float3(" + s + ")"; } function parser_material_node_by_type(nodes: ui_node_t[], ntype: string): ui_node_t { diff --git a/base/sources/ts/strings.ts b/base/sources/ts/strings.ts index d052f073..fb6bffef 100644 --- a/base/sources/ts/strings.ts +++ b/base/sources/ts/strings.ts @@ -33,68 +33,68 @@ function strings_graphics_api(): string { ///end } -let str_tex_checker: string = " \ -vec3 tex_checker(const vec3 co, const vec3 col1, const vec3 col2, const float scale) { \ +let str_tex_checker: string = "\ +fun tex_checker(co: float3, col1: float3, col2: float3, scale: float): float3 { \ /* Prevent precision issues on unit coordinates */ \ - vec3 p = (co + 0.000001 * 0.999999) * scale; \ - float xi = abs(floor(p.x)); \ - float yi = abs(floor(p.y)); \ - float zi = abs(floor(p.z)); \ - bool check = ((mod(xi, 2.0) == mod(yi, 2.0)) == bool(mod(zi, 2.0))); \ - return check ? col1 : col2; \ + var p: float3 = (co + 0.000001 * 0.999999) * scale; \ + var xi: float = abs(floor(p.x)); \ + var yi: float = abs(floor(p.y)); \ + var zi: float = abs(floor(p.z)); \ + var check: bool = (((xi % 2.0) == (yi % 2.0)) == bool((zi % 2.0))); \ + if (check) { return col1; } else { return col2; } \ } \ -float tex_checker_f(const vec3 co, const float scale) { \ - vec3 p = (co + 0.000001 * 0.999999) * scale; \ - float xi = abs(floor(p.x)); \ - float yi = abs(floor(p.y)); \ - float zi = abs(floor(p.z)); \ - return float((mod(xi, 2.0) == mod(yi, 2.0)) == bool(mod(zi, 2.0))); \ +fun tex_checker_f(co: float3, scale: float): float { \ + var p: float3 = (co + 0.000001 * 0.999999) * scale; \ + var xi: float = abs(floor(p.x)); \ + var yi: float = abs(floor(p.y)); \ + var zi: float = abs(floor(p.z)); \ + return float(((xi % 2.0) == (yi % 2.0)) == bool((zi % 2.0))); \ } \ "; // Created by inigo quilez - iq/2013 // License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License -let str_tex_voronoi: string = " \ -vec4 tex_voronoi(const vec3 x, textureArg(snoise256)) { \ - vec3 p = floor(x); \ - vec3 f = fract(x); \ - float id = 0.0; \ - float res = 100.0; \ - for (int k = -1; k <= 1; k++) \ - for (int j = -1; j <= 1; j++) \ - for (int i = -1; i <= 1; i++) { \ - vec3 b = vec3(float(i), float(j), float(k)); \ - vec3 pb = p + b; \ - vec3 r = vec3(b) - f + texture(snoise256, (pb.xy + vec2(3.0, 1.0) * pb.z + 0.5) / 256.0).xyz; \ - float d = dot(r, r); \ +let str_tex_voronoi: string = "\ +fun tex_voronoi(x: float3, textureArg(snoise256)): float4 { \ + var p: float3 = floor(x); \ + var f: float3 = frac(x); \ + var id: float = 0.0; \ + var res: float = 100.0; \ + for (var k: int = -1; k <= 1; k += 1) \ + for (var j: int = -1; j <= 1; j += 1) \ + for (var i: int = -1; i <= 1; i += 1) { \ + var b: float3 = float3(float(i), float(j), float(k)); \ + var pb: float3 = p + b; \ + var r: float3 = float3(b) - f + sample(snoise256, (pb.xy + float2(3.0, 1.0) * pb.z + 0.5) / 256.0).xyz; \ + var d: float = dot(r, r); \ if (d < res) { \ - id = dot(p + b, vec3(1.0, 57.0, 113.0)); \ + id = dot(p + b, float3(1.0, 57.0, 113.0)); \ res = d; \ } \ } \ - vec3 col = 0.5 + 0.5 * cos(id * 0.35 + vec3(0.0, 1.0, 2.0)); \ - return vec4(col, sqrt(res)); \ + var col: float3 = 0.5 + 0.5 * cos(id * 0.35 + float3(0.0, 1.0, 2.0)); \ + return float4(col, sqrt(res)); \ } \ "; // By Morgan McGuire @morgan3d, http://graphicscodex.com Reuse permitted under the BSD license. // https://www.shadertoy.com/view/4dS3Wd -let str_tex_noise: string = " \ -float hash(float n) { return fract(sin(n) * 1e4); } \ -float tex_noise_f(vec3 x) { \ - const vec3 step = vec3(110, 241, 171); \ - vec3 i = floor(x); \ - vec3 f = fract(x); \ - float n = dot(i, step); \ - vec3 u = f * f * (3.0 - 2.0 * f); \ - return mix(mix(mix(hash(n + dot(step, vec3(0, 0, 0))), hash(n + dot(step, vec3(1, 0, 0))), u.x), \ - mix(hash(n + dot(step, vec3(0, 1, 0))), hash(n + dot(step, vec3(1, 1, 0))), u.x), u.y), \ - mix(mix(hash(n + dot(step, vec3(0, 0, 1))), hash(n + dot(step, vec3(1, 0, 1))), u.x), \ - mix(hash(n + dot(step, vec3(0, 1, 1))), hash(n + dot(step, vec3(1, 1, 1))), u.x), u.y), u.z); \ +let str_tex_noise: string = "\ +fun hash(n: float): float { return frac(sin(n) * 10000); } \ +fun tex_noise_f(float3 x): float { \ + var step: float3 = float3(110, 241, 171); \ + var i: float3 = floor(x); \ + var f: float3 = frac(x); \ + var n: float = dot(i, step); \ + var u: float3 = f * f * (3.0 - 2.0 * f); \ + return lerp(lerp(lerp(hash(n + dot(step, float3(0, 0, 0))), hash(n + dot(step, float3(1, 0, 0))), u.x), \ + lerp(hash(n + dot(step, float3(0, 1, 0))), hash(n + dot(step, float3(1, 1, 0))), u.x), u.y), \ + lerp(lerp(hash(n + dot(step, float3(0, 0, 1))), hash(n + dot(step, float3(1, 0, 1))), u.x), \ + lerp(hash(n + dot(step, float3(0, 1, 1))), hash(n + dot(step, float3(1, 1, 1))), u.x), u.y), u.z); \ } \ -float tex_noise(vec3 p) { \ +fun tex_noise(p: float3): float { \ p *= 1.25; \ - float f = 0.5 * tex_noise_f(p); p *= 2.01; \ + var f: float = 0.5 * tex_noise_f(p); p *= 2.01; \ f += 0.25 * tex_noise_f(p); p *= 2.02; \ f += 0.125 * tex_noise_f(p); p *= 2.03; \ f += 0.0625 * tex_noise_f(p); \ @@ -104,29 +104,30 @@ float tex_noise(vec3 p) { \ // Based on noise created by Nikita Miropolskiy, nikat/2013 // Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License -let str_tex_musgrave: string = " \ -vec3 random3(const vec3 c) { \ - float j = 4096.0 * sin(dot(c, vec3(17.0, 59.4, 15.0))); \ - vec3 r; \ - r.z = fract(512.0 * j); \ +let str_tex_musgrave: string = "\ +fun random3(c: float3): float3 { \ + var j: float = 4096.0 * sin(dot(c, float3(17.0, 59.4, 15.0))); \ + var r: float3; \ + r.z = frac(512.0 * j); \ j *= 0.125; \ - r.x = fract(512.0 * j); \ + r.x = frac(512.0 * j); \ j *= 0.125; \ - r.y = fract(512.0 * j); \ + r.y = frac(512.0 * j); \ return r - 0.5; \ } \ -float tex_musgrave_f(const vec3 p) { \ - const float F3 = 0.3333333; \ - const float G3 = 0.1666667; \ - vec3 s = floor(p + dot(p, vec3(F3, F3, F3))); \ - vec3 x = p - s + dot(s, vec3(G3, G3, G3)); \ - vec3 e = step(vec3(0.0, 0.0, 0.0), x - x.yzx); \ - vec3 i1 = e * (1.0 - e.zxy); \ - vec3 i2 = 1.0 - e.zxy * (1.0 - e); \ - vec3 x1 = x - i1 + G3; \ - vec3 x2 = x - i2 + 2.0 * G3; \ - vec3 x3 = x - 1.0 + 3.0 * G3; \ - vec4 w, d; \ +fun tex_musgrave_f(p: float3): float { \ + var F3: float = 0.3333333; \ + var G3: float = 0.1666667; \ + var s: float3 = floor(p + dot(p, float3(F3, F3, F3))); \ + var x: float3 = p - s + dot(s, float3(G3, G3, G3)); \ + var e: float3 = step(float3(0.0, 0.0, 0.0), x - x.yzx); \ + var i1: float3 = e * (1.0 - e.zxy); \ + var i2: float3 = 1.0 - e.zxy * (1.0 - e); \ + var x1: float3 = x - i1 + G3; \ + var x2: float3 = x - i2 + 2.0 * G3; \ + var x3: float3 = x - 1.0 + 3.0 * G3; \ + var w: float4; \ + var d: float4; \ w.x = dot(x, x); \ w.y = dot(x1, x1); \ w.z = dot(x2, x2); \ @@ -139,177 +140,196 @@ float tex_musgrave_f(const vec3 p) { \ w *= w; \ w *= w; \ d *= w; \ - return clamp(dot(d, vec4(52.0, 52.0, 52.0, 52.0)), 0.0, 1.0); \ + return clamp(dot(d, float4(52.0, 52.0, 52.0, 52.0)), 0.0, 1.0); \ } \ "; -let str_hue_sat: string = " \ -vec3 hsv_to_rgb(const vec3 c) { \ - const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); \ - vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); \ - return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); \ +let str_hue_sat: string = "\ +fun hsv_to_rgb(c: float3): float3 { \ + var K: float4 = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); \ + var p: float3 = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); \ + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); \ } \ -vec3 rgb_to_hsv(const vec3 c) { \ - const vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); \ - vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); \ - vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); \ - float d = q.x - min(q.w, q.y); \ - float e = 1.0e-10; \ - return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); \ +fun rgb_to_hsv(c: float3): float3 { \ + var K: float4 = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); \ + var p: float4 = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); \ + var q: float4 = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); \ + var d: float = q.x - min(q.w, q.y); \ + var e: float = 0.0000000001; \ + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); \ } \ -vec3 hue_sat(const vec3 col, const vec4 shift) { \ - vec3 hsv = rgb_to_hsv(col); \ +fun hue_sat(col: float3, shift: float4): float3 { \ + var hsv: float3 = rgb_to_hsv(col); \ hsv.x += shift.x; \ hsv.y *= shift.y; \ hsv.z *= shift.z; \ - return mix(hsv_to_rgb(hsv), col, shift.w); \ + return lerp(hsv_to_rgb(hsv), col, shift.w); \ } \ "; -// https://twitter.com/Donzanoid/status/903424376707657730 -let str_wavelength_to_rgb: string = " \ -vec3 wavelength_to_rgb(const float t) { \ - vec3 r = t * 2.1 - vec3(1.8, 1.14, 0.3); \ +// https://x.com/Donzanoid/status/903424376707657730 +let str_wavelength_to_rgb: string = "\ +fun wavelength_to_rgb(t: float): float3 { \ + var r: float3 = t * 2.1 - float3(1.8, 1.14, 0.3); \ return 1.0 - r * r; \ } \ "; -let str_tex_magic: string = " \ -vec3 tex_magic(const vec3 p) { \ - float a = 1.0 - (sin(p.x) + sin(p.y)); \ - float b = 1.0 - sin(p.x - p.y); \ - float c = 1.0 - sin(p.x + p.y); \ - return vec3(a, b, c); \ +let str_tex_magic: string = "\ +fun tex_magic(p: float3): float3 { \ + var a: float = 1.0 - (sin(p.x) + sin(p.y)); \ + var b: float = 1.0 - sin(p.x - p.y); \ + var c: float = 1.0 - sin(p.x + p.y); \ + return float3(a, b, c); \ } \ -float tex_magic_f(const vec3 p) { \ - vec3 c = tex_magic(p); \ +fun tex_magic_f(p: float3): float { \ + var c: float3 = tex_magic(p); \ return (c.x + c.y + c.z) / 3.0; \ } \ "; -let str_tex_brick: string = " \ -float tex_brick_noise(int n) { \ - int nn; \ +let str_tex_brick: string = "\ +fun tex_brick_noise(n: int): float { \ + var nn: int; \ n = (n >> 13) ^ n; \ nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff; \ return 0.5f * float(nn) / 1073741824.0; \ } \ -vec3 tex_brick(vec3 p, const vec3 c1, const vec3 c2, const vec3 c3) { \ - vec3 brick_size = vec3(0.9, 0.49, 0.49); \ - vec3 mortar_size = vec3(0.05, 0.1, 0.1); \ +fun tex_brick(p: float3, c1: float3, c2: float3, c3: float3): float3 { \ + var brick_size: float3 = float3(0.9, 0.49, 0.49); \ + var mortar_size: float3 = float3(0.05, 0.1, 0.1); \ p /= brick_size / 2; \ - if (fract(p.y * 0.5) > 0.5) p.x += 0.5; \ - float col = floor(p.x / (brick_size.x + (mortar_size.x * 2.0))); \ - float row = p.y; \ - p = fract(p); \ - vec3 b = step(p, 1.0 - mortar_size); \ - float tint = min(max(tex_brick_noise((int(col) << 16) + (int(row) & 0xFFFF)), 0.0), 1.0); \ - return mix(c3, mix(c1, c2, tint), b.x * b.y * b.z); \ + if (frac(p.y * 0.5) > 0.5) { p.x += 0.5; } \ + var col: float = floor(p.x / (brick_size.x + (mortar_size.x * 2.0))); \ + var row: float = p.y; \ + p = frac(p); \ + var b: float3 = step(p, 1.0 - mortar_size); \ + var tint: float = min(max(tex_brick_noise((int(col) << 16) + (int(row) & 0xFFFF)), 0.0), 1.0); \ + return lerp(c3, lerp(c1, c2, tint), b.x * b.y * b.z); \ } \ -float tex_brick_f(vec3 p) { \ - p /= vec3(0.9, 0.49, 0.49) / 2; \ - if (fract(p.y * 0.5) > 0.5) p.x += 0.5; \ - p = fract(p); \ - vec3 b = step(p, vec3(0.95, 0.9, 0.9)); \ - return mix(1.0, 0.0, b.x * b.y * b.z); \ +fun tex_brick_f(p: float3): float { \ + p /= float3(0.9, 0.49, 0.49) / 2; \ + if (frac(p.y * 0.5) > 0.5) { p.x += 0.5; } \ + p = frac(p); \ + var b: float3 = step(p, float3(0.95, 0.9, 0.9)); \ + return lerp(1.0, 0.0, b.x * b.y * b.z); \ } \ "; -let str_tex_wave: string = " \ -float tex_wave_f(const vec3 p) { \ +let str_tex_wave: string = "\ +fun tex_wave_f(p: float3): float { \ return 1.0 - sin((p.x + p.y) * 10.0); \ } \ "; -let str_brightcontrast: string = " \ -vec3 brightcontrast(const vec3 col, const float bright, const float contr) { \ - float a = 1.0 + contr; \ - float b = bright - contr * 0.5; \ +let str_brightcontrast: string = "\ +fun brightcontrast(col: float3, bright: float, contr: float): float3 { \ + var a: float = 1.0 + contr; \ + var b: float = bright - contr * 0.5; \ return max(a * col + b, 0.0); \ } \ "; -let str_cotangent_frame: string = " \ -mat3 cotangent_frame(const vec3 n, const vec3 p, const vec2 duv1, const vec2 duv2) { \ - vec3 dp1 = dFdx(p); \ - vec3 dp2 = dFdy(p); \ - vec3 dp2perp = cross(dp2, n); \ - vec3 dp1perp = cross(n, dp1); \ - vec3 t = dp2perp * duv1.x + dp1perp * duv2.x; \ - vec3 b = dp2perp * duv1.y + dp1perp * duv2.y; \ - float invmax = inversesqrt(max(dot(t, t), dot(b, b))); \ - return mat3(t * invmax, b * invmax, n); \ +let str_cotangent_frame: string = "\ +fun cotangent_frame(n: float3, p: float3, duv1: float2, duv2: float2): float3x3 { \ + var dp1: float3 = ddx3(p); \ + var dp2: float3 = ddy3(p); \ + var dp2perp: float3 = cross(dp2, n); \ + var dp1perp: float3 = cross(n, dp1); \ + var t: float3 = dp2perp * duv1.x + dp1perp * duv2.x; \ + var b: float3 = dp2perp * duv1.y + dp1perp * duv2.y; \ +var invmax: float = rsqrt(max(dot(t, t), dot(b, b))); \ + return float3x3(t * invmax, b * invmax, n); \ } \ -mat3 cotangent_frame(const vec3 n, const vec3 p, const vec2 tex_coord) { \ - return cotangent_frame(n, p, dFdx(tex_coord), dFdy(tex_coord)); \ +fun cotangent_frame(n: float3, p: float3, tex_coord: float2): float3x3 { \ + return cotangent_frame(n, p, ddx2(tex_coord), ddy2(tex_coord)); \ } \ "; -let str_octahedron_wrap: string = " \ -vec2 octahedron_wrap(const vec2 v) { \ - return (1.0 - abs(v.yx)) * (vec2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0)); \ +let str_octahedron_wrap: string = "\ +fun octahedron_wrap(v: float2): float2 { \ + var a: float2; \ + if (v.x >= 0.0) { a.x = 1.0; } else { a.x = -1.0; } \ + if (v.y >= 0.0) { a.y = 1.0; } else { a.y = -1.0; } \ + var r: float2; \ + r.x = abs(v.y); \ + r.y = abs(v.x); \ + r.x = 1.0 - r.x; \ + r.y = 1.0 - r.y; \ + return r * a; \ } \ "; -let str_pack_float_int16: string = " \ -float pack_f32_i16(const float f, const uint i) { \ - const float prec = float(1 << 16); \ - const float maxi = float(1 << 4); \ - const float prec_minus_one = prec - 1.0; \ - const float t1 = ((prec / maxi) - 1.0) / prec_minus_one; \ - const float t2 = (prec / maxi) / prec_minus_one; \ - return t1 * f + t2 * float(i); \ +// let str_octahedron_wrap: string = "\ +// fun octahedron_wrap(v: float2): float2 { \ +// return (1.0 - abs(v.yx)) * (float2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0)); \ +// } \ +// "; + +let str_pack_float_int16: string = "\ +fun pack_f32_i16(f: float, i: uint): float { \ + return 0.062504762 * f + 0.062519999 * float(i); \ } \ "; +// let str_pack_float_int16: string = "\ +// fun pack_f32_i16(f: float, i: uint): float { \ +// var prec: float = float(1 << 16); \ +// var maxi: float = float(1 << 4); \ +// var prec_minus_one: float = prec - 1.0; \ +// var t1: float = ((prec / maxi) - 1.0) / prec_minus_one; \ +// var t2: float = (prec / maxi) / prec_minus_one; \ +// return t1 * f + t2 * float(i); \ +// } \ +// "; + ///if arm_skin -let str_get_skinning_dual_quat: string = " \ -void get_skinning_dual_quat(const ivec4 bone, vec4 weight, out vec4 A, inout vec4 B) { \ - ivec4 bonei = bone * 2; \ - mat4 mat_a = mat4( \ +let str_get_skinning_dual_quat: string = "\ +fun get_skinning_dual_quat(bone: int4, weight: float4, out A: float4, inout B: float4) { \ + var bonei: int4 = bone * 2; \ + var mat_a: float4x4 = float4x4( \ skin_bones[bonei.x], \ skin_bones[bonei.y], \ skin_bones[bonei.z], \ skin_bones[bonei.w]); \ - mat4 mat_b = mat4( \ + var mat_b: float4x4 = float4x4( \ skin_bones[bonei.x + 1], \ skin_bones[bonei.y + 1], \ skin_bones[bonei.z + 1], \ skin_bones[bonei.w + 1]); \ - weight.xyz *= sign(mul(mat_a, mat_a[3])).xyz; \ - A = mul(weight, mat_a); \ - B = mul(weight, mat_b); \ - float inv_norm_a = 1.0 / length(A); \ + weight.xyz *= sign(mat_a[3] * mat_a).xyz; \ + A = mat_a * weight; \ + B = mat_b * weight; \ + var inv_norm_a: float = 1.0 / length(A); \ A *= inv_norm_a; \ B *= inv_norm_a; \ } \ "; ///end -let str_create_basis: string = " \ -void create_basis(vec3 normal, out vec3 tangent, out vec3 binormal) { \ +let str_create_basis: string = "\ +fun create_basis(normal: float3, out tangent: float3, out binormal: float3) { \ tangent = normalize(camera_right - normal * dot(camera_right, normal)); \ binormal = cross(tangent, normal); \ } \ "; -function str_sh_irradiance(): string { -///if arm_metal - return "vec3 sh_irradiance(const vec3 nor, constant vec4 shirr[7]) { \ - const float c1 = 0.429043; \ - const float c2 = 0.511664; \ - const float c3 = 0.743125; \ - const float c4 = 0.886227; \ - const float c5 = 0.247708; \ - vec3 cl00 = vec3(shirr[0].x, shirr[0].y, shirr[0].z); \ - vec3 cl1m1 = vec3(shirr[0].w, shirr[1].x, shirr[1].y); \ - vec3 cl10 = vec3(shirr[1].z, shirr[1].w, shirr[2].x); \ - vec3 cl11 = vec3(shirr[2].y, shirr[2].z, shirr[2].w); \ - vec3 cl2m2 = vec3(shirr[3].x, shirr[3].y, shirr[3].z); \ - vec3 cl2m1 = vec3(shirr[3].w, shirr[4].x, shirr[4].y); \ - vec3 cl20 = vec3(shirr[4].z, shirr[4].w, shirr[5].x); \ - vec3 cl21 = vec3(shirr[5].y, shirr[5].z, shirr[5].w); \ - vec3 cl22 = vec3(shirr[6].x, shirr[6].y, shirr[6].z); \ +let str_sh_irradiance: string = "\ +fun sh_irradiance(float3 nor, shirr: float4[7]): 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); \ return ( \ c1 * cl22 * (nor.y * nor.y - (-nor.z) * (-nor.z)) + \ c3 * cl20 * nor.x * nor.x + \ @@ -324,63 +344,27 @@ function str_sh_irradiance(): string { ); \ } \ "; -///else - return "vec3 sh_irradiance(const vec3 nor, const vec4 shirr[7]) { \ - const float c1 = 0.429043; \ - const float c2 = 0.511664; \ - const float c3 = 0.743125; \ - const float c4 = 0.886227; \ - const float c5 = 0.247708; \ - vec3 cl00 = vec3(shirr[0].x, shirr[0].y, shirr[0].z); \ - vec3 cl1m1 = vec3(shirr[0].w, shirr[1].x, shirr[1].y); \ - vec3 cl10 = vec3(shirr[1].z, shirr[1].w, shirr[2].x); \ - vec3 cl11 = vec3(shirr[2].y, shirr[2].z, shirr[2].w); \ - vec3 cl2m2 = vec3(shirr[3].x, shirr[3].y, shirr[3].z); \ - vec3 cl2m1 = vec3(shirr[3].w, shirr[4].x, shirr[4].y); \ - vec3 cl20 = vec3(shirr[4].z, shirr[4].w, shirr[5].x); \ - vec3 cl21 = vec3(shirr[5].y, shirr[5].z, shirr[5].w); \ - vec3 cl22 = vec3(shirr[6].x, shirr[6].y, shirr[6].z); \ - return ( \ - c1 * cl22 * (nor.y * nor.y - (-nor.z) * (-nor.z)) + \ - c3 * cl20 * nor.x * nor.x + \ - c4 * cl00 - \ - c5 * cl20 + \ - 2.0 * c1 * cl2m2 * nor.y * (-nor.z) + \ - 2.0 * c1 * cl21 * nor.y * nor.x + \ - 2.0 * c1 * cl2m1 * (-nor.z) * nor.x + \ - 2.0 * c2 * cl11 * nor.y + \ - 2.0 * c2 * cl1m1 * (-nor.z) + \ - 2.0 * c2 * cl10 * nor.x \ - ); \ -} \ -"; -///end -} -let str_envmap_equirect: string = " \ -vec2 envmap_equirect(const vec3 normal, const float angle) { \ - const float PI = 3.1415926535; \ - const float PI2 = PI * 2.0; \ - float phi = acos(normal.z); \ - float theta = atan2(-normal.y, normal.x) + PI + angle; \ - return vec2(theta / PI2, phi / PI); \ +let str_envmap_equirect: string = "\ +fun envmap_equirect(normal: float3, angle: float): float2 { \ + var PI: float = 3.1415926535; \ + var PI2: float = PI * 2.0; \ + var phi: float = acos(normal.z); \ + var theta: float = atan2(-normal.y, normal.x) + PI + angle; \ + return float2(theta / PI2, phi / PI); \ } \ "; -let str_get_pos_nor_from_depth: string = " \ -vec3 get_pos_from_depth(vec2 uv, mat4 invVP, textureArg(gbufferD)) { \n\ -#ifdef GLSL \n\ - float depth = textureLod(gbufferD, uv, 0.0).r; \n\ -#else \n\ - float depth = textureLod(gbufferD, vec2(uv.x, 1.0 - uv.y), 0.0).r; \n\ -#endif \n\ - vec4 wpos = vec4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); \ - wpos = mul(wpos, invVP); \ +let str_get_pos_nor_from_depth: string = "\ +fun get_pos_from_depth(uv: float2, invVP: flaot4x4, textureArg(gbufferD)): float3 { \ + var depth: float = sample_lod(gbufferD, float2(uv.x, 1.0 - uv.y), 0.0).r; \ + var wpos: float4 = float4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); \ + wpos = invVP * wpos; \ return wpos.xyz / wpos.w; \ } \ -vec3 get_nor_from_depth(vec3 p0, vec2 uv, mat4 invVP, vec2 tex_step, textureArg(gbufferD)) { \ - vec3 p1 = get_pos_from_depth(uv + vec2(tex_step.x * 4.0, 0.0), invVP, texturePass(gbufferD)); \ - vec3 p2 = get_pos_from_depth(uv + vec2(0.0, tex_step.y * 4.0), invVP, texturePass(gbufferD)); \ +fun get_nor_from_depth(p0: float3, uv: float2, invVP: flaot4x4, tex_step: float2, textureArg(gbufferD)): float3 { \ + var p1: float3 = get_pos_from_depth(uv + float2(tex_step.x * 4.0, 0.0), invVP, texturePass(gbufferD)); \ + var p2: float3 = get_pos_from_depth(uv + float2(0.0, tex_step.y * 4.0), invVP, texturePass(gbufferD)); \ return normalize(cross(p2 - p0, p1 - p0)); \ } \ ";