From 70a6da69a8781f3989b4e9a2337e62b9f5a5f6b7 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Thu, 15 Aug 2024 20:29:14 +0200 Subject: [PATCH] Format --- armorforge/assets/Scene.arm | Bin 181915 -> 181916 bytes armorlab/assets/Scene.arm | Bin 148682 -> 148683 bytes armorlab/shaders/inpaint_preview.frag.glsl | 10 +- armorlab/shaders/layer_copy_rrrr.frag.glsl | 6 +- armorlab/sources/make_material.ts | 2 +- armorlab/sources/make_mesh.ts | 118 +++++----- armorlab/sources/make_paint.ts | 116 +++++----- armorpaint/assets/plugins/hello_node.js | 2 +- .../assets/plugins/viewport_celshade.js | 8 +- armorpaint/shaders/dilate_map.frag.glsl | 4 +- armorpaint/shaders/dilate_map.vert.glsl | 6 +- armorpaint/shaders/dilate_pass.frag.glsl | 42 ++-- armorpaint/shaders/layer_invert.frag.glsl | 6 +- armorpaint/shaders/layer_merge.frag.glsl | 68 +++--- armorpaint/shaders/layer_view.frag.glsl | 18 +- armorpaint/shaders/mask_colorid.frag.glsl | 8 +- armorpaint/shaders/mask_merge.frag.glsl | 42 ++-- armorpaint/shaders/mesh_posnor.frag.glsl | 10 +- armorpaint/sources/make_bake.ts | 64 +++--- armorpaint/sources/make_blur.ts | 36 +-- armorpaint/sources/make_brush.ts | 16 +- armorpaint/sources/make_clone.ts | 14 +- armorpaint/sources/make_colorid_picker.ts | 30 +-- armorpaint/sources/make_discard.ts | 16 +- armorpaint/sources/make_material.ts | 2 +- armorpaint/sources/make_mesh.ts | 166 +++++++------- armorpaint/sources/make_mesh_preview.ts | 50 ++--- armorpaint/sources/make_node_preview.ts | 10 +- armorpaint/sources/make_paint.ts | 86 ++++---- armorpaint/sources/make_particle.ts | 32 +-- armorpaint/sources/make_texcoord.ts | 80 +++---- armorsculpt/assets/Scene.arm | Bin 181783 -> 181784 bytes armorsculpt/shaders/layer_invert.frag.glsl | 6 +- armorsculpt/shaders/layer_merge.frag.glsl | 68 +++--- armorsculpt/shaders/layer_view.frag.glsl | 18 +- armorsculpt/shaders/mask_merge.frag.glsl | 42 ++-- armorsculpt/shaders/mesh_posnor.frag.glsl | 10 +- armorsculpt/sources/make_brush.ts | 4 +- armorsculpt/sources/make_material.ts | 2 +- armorsculpt/sources/make_mesh.ts | 118 +++++----- armorsculpt/sources/make_mesh_preview.ts | 44 ++-- armorsculpt/sources/make_sculpt.ts | 28 +-- base/assets/shader_datas.arm | Bin 27851 -> 27942 bytes base/shaders/bloom_downsample_pass.frag.glsl | 46 ++-- base/shaders/bloom_upsample_pass.frag.glsl | 40 ++-- base/shaders/compositor_pass.frag.glsl | 24 +- base/shaders/copy_mrt3_pass.frag.glsl | 10 +- base/shaders/cursor.frag.glsl | 8 +- base/shaders/cursor.vert.glsl | 39 ++-- base/shaders/histogram_pass.frag.glsl | 12 +- base/shaders/layer_copy.frag.glsl | 6 +- base/shaders/layer_copy_bgra.frag.glsl | 6 +- base/shaders/layer_view.vert.glsl | 8 +- base/shaders/line.frag.glsl | 6 +- base/shaders/mask_apply.frag.glsl | 10 +- base/shaders/mesh_poscol.frag.glsl | 6 +- base/shaders/mesh_posnortex.frag.glsl | 14 +- base/shaders/mesh_posnortex.vert.glsl | 6 +- base/shaders/pass.vert.glsl | 6 +- base/shaders/pass_copy.frag.glsl | 6 +- base/shaders/pass_viewray.vert.glsl | 10 +- base/shaders/pass_viewray2.vert.glsl | 10 +- base/shaders/prefilter_envmap.frag.glsl | 19 +- base/shaders/raytrace/raytrace_bake_ao.metal | 14 +- .../shaders/raytrace/raytrace_bake_bent.metal | 14 +- .../raytrace/raytrace_bake_light.metal | 30 +-- .../raytrace/raytrace_bake_thick.metal | 14 +- .../raytrace/raytrace_brute_core.metal | 92 ++++---- .../raytrace/raytrace_brute_full.metal | 92 ++++---- .../raytrace/src/raytrace_bake_light.hlsl | 16 +- base/shaders/raytrace/src/raytrace_brute.hlsl | 66 +++--- base/shaders/raytrace/src/std/attrib.hlsl | 18 +- base/shaders/raytrace/src/std/math.hlsl | 12 +- base/shaders/raytrace/src/std/rand.hlsl | 14 +- base/shaders/smaa_blend_weight.frag.glsl | 207 +++++++++--------- base/shaders/smaa_blend_weight.vert.glsl | 16 +- base/shaders/smaa_edge_detect.frag.glsl | 60 ++--- base/shaders/smaa_edge_detect.vert.glsl | 14 +- .../shaders/smaa_neighborhood_blend.frag.glsl | 52 ++--- .../shaders/smaa_neighborhood_blend.vert.glsl | 10 +- base/shaders/ssao_blur_pass.frag.glsl | 38 ++-- base/shaders/ssao_pass.frag.glsl | 72 +++--- base/shaders/ssr_blur_pass.frag.glsl | 22 +- base/shaders/ssr_pass.frag.glsl | 112 +++++----- base/shaders/std/brdf.glsl | 12 +- base/shaders/std/conetrace.glsl | 60 ++--- base/shaders/std/deferred_light.glsl | 73 +++--- base/shaders/std/gbuffer.glsl | 60 ++--- base/shaders/std/light.glsl | 34 +-- base/shaders/std/ltc.glsl | 20 +- base/shaders/std/math.glsl | 2 +- base/shaders/std/shirr.glsl | 2 +- base/shaders/supersample_resolve.frag.glsl | 26 +-- base/shaders/taa_pass.frag.glsl | 12 +- base/shaders/voxel_glsl/voxel_pos.frag.glsl | 2 +- base/shaders/voxel_glsl/voxel_pos.geom.glsl | 8 +- base/shaders/voxel_glsl/voxel_pos.vert.glsl | 4 +- base/shaders/voxel_hlsl/src/build.bat | 6 +- base/shaders/voxel_hlsl/src/hlslbin.exe | Bin 272896 -> 0 bytes .../voxel_hlsl/src/voxel_pos.frag.hlsl | 2 +- base/shaders/world_pass.frag.glsl | 9 +- base/sources/base.ts | 4 +- base/sources/make_voxel.ts | 8 +- base/sources/node_shader.ts | 24 +- base/sources/parser_material.ts | 124 +++++------ base/sources/render_path_base.ts | 8 +- base/sources/strings.ts | 148 ++++++------- base/sources/uniforms_ext.ts | 78 +++---- base/sources/util_uv.ts | 2 +- 109 files changed, 1701 insertions(+), 1712 deletions(-) delete mode 100644 base/shaders/voxel_hlsl/src/hlslbin.exe diff --git a/armorforge/assets/Scene.arm b/armorforge/assets/Scene.arm index 532109836c36968fc23833e1c72b7dabaf6f2f73..9d07552dfebf2b113758fdfd7809ce6e28bcc992 100644 GIT binary patch delta 487 zcmbQ;%RQ%;d&3+d)=P{G3=EqW3Qb9aFefh*%H6!YGHr?kSmrh-P`WrdF();?B((x8 zG`&!sv1t2rKE?8}&4fdNC3Qb9aFefh*%H6!YGHr?kSmrh-0|P^Ga$-(ud`W5r zSZI2oJY&)J>3ob4Oa#QfOWTfXfQru#2I>^IM}{Xi!s+35-07-d5qhY^O$6;Kzs*>=`Jgn x>KIRLKfHqJh#&_jhJbMsx_!bfrq5hFpg3~4%>@+9ESkRYD3kE?MMs%_0RW@ApSA!1 diff --git a/armorlab/assets/Scene.arm b/armorlab/assets/Scene.arm index ca9e8d3ba6b7ec65d0beb0bbf9a3e19f600e0760..5869e6b5fd3319779aaa62202cc685993369f364 100644 GIT binary patch delta 185 zcmX@r$$7eybAt{C>m^1828PXs9F1ubVCHR3Aip>{F();?B((x8G}(|tck}nWCye-1 z6ad$K)~9}DXx7NEfPZO%+0i~xhOH;MoN delta 184 zcmX@z$$6@ibAt{C>nR3?2K&v19F1ubVCHR31_p-W$BLu+U^f4&BY)^PVu` zQ<1wlp|I8jVqEj1rQ07ZWqfamLj!{Y(8!|g(GM7(hk$fAI81jpWvXL5wf&eW(^O6l ZkQ0EGhi*@?XYykKo9VE9yEBsrBLLM>JzM|) diff --git a/armorlab/shaders/inpaint_preview.frag.glsl b/armorlab/shaders/inpaint_preview.frag.glsl index afb6a2e7..e94761cd 100644 --- a/armorlab/shaders/inpaint_preview.frag.glsl +++ b/armorlab/shaders/inpaint_preview.frag.glsl @@ -3,11 +3,11 @@ uniform sampler2D tex0; uniform sampler2D texa; -in vec2 texCoord; -out vec4 FragColor; +in vec2 tex_coord; +out vec4 frag_color; void main() { - vec4 col = textureLod(tex0, texCoord, 0); - float mask = clamp(textureLod(texa, texCoord, 0).r + 0.5, 0.0, 1.0); - FragColor = col * mask; + vec4 col = textureLod(tex0, tex_coord, 0); + float mask = clamp(textureLod(texa, tex_coord, 0).r + 0.5, 0.0, 1.0); + frag_color = col * mask; } diff --git a/armorlab/shaders/layer_copy_rrrr.frag.glsl b/armorlab/shaders/layer_copy_rrrr.frag.glsl index 6a10afdb..67d5325f 100644 --- a/armorlab/shaders/layer_copy_rrrr.frag.glsl +++ b/armorlab/shaders/layer_copy_rrrr.frag.glsl @@ -2,9 +2,9 @@ uniform sampler2D tex; -in vec2 texCoord; -out vec4 FragColor; +in vec2 tex_coord; +out vec4 frag_color; void main() { - FragColor = textureLod(tex, texCoord, 0).rrrr; + frag_color = textureLod(tex, tex_coord, 0).rrrr; } diff --git a/armorlab/sources/make_material.ts b/armorlab/sources/make_material.ts index f2f699f9..54b945ee 100644 --- a/armorlab/sources/make_material.ts +++ b/armorlab/sources/make_material.ts @@ -122,7 +122,7 @@ function make_material_get_displace_strength(): f32 { function make_material_voxelgi_half_extents(): string { let ext = context_raw.vxao_ext; - return "const vec3 voxelgiHalfExtents = vec3(" + ext + ", " + ext + ", " + ext + ");"; + return "const vec3 voxelgi_half_extents = vec3(" + ext + ", " + ext + ", " + ext + ");"; } function make_material_delete_context(c: shader_context_t) { diff --git a/armorlab/sources/make_mesh.ts b/armorlab/sources/make_mesh.ts index cb7232d0..d924d0e3 100644 --- a/armorlab/sources/make_mesh.ts +++ b/armorlab/sources/make_mesh.ts @@ -30,7 +30,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte let frag = node_shader_context_make_frag(con_mesh); frag.ins = vert.outs; - node_shader_add_out(vert, "vec2 texCoord"); + node_shader_add_out(vert, "vec2 tex_coord"); frag.wvpposition = true; node_shader_add_out(vert, "vec4 prevwvpposition"); node_shader_add_uniform(vert, "mat4 VP", "_view_proj_matrix"); @@ -48,8 +48,8 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write(vert, "gl_Position = mul(vec4(wposition.xyz, 1.0), VP);"); let brush_scale = context_raw.brush_scale; - node_shader_add_uniform(vert, "float texScale", "_tex_unpack"); - node_shader_write(vert, "texCoord = tex * " + brush_scale + " * texScale;"); + node_shader_add_uniform(vert, "float tex_scale", "_tex_unpack"); + node_shader_write(vert, "tex_coord = tex * " + brush_scale + " * tex_scale;"); if (make_material_height_used && displace_strength > 0) { node_shader_add_uniform(vert, "mat4 invW", "_inv_world_matrix"); node_shader_write(vert, "prevwvpposition = mul(mul(vec4(wposition, 1.0), invW), prevWVP);"); @@ -58,7 +58,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write(vert, "prevwvpposition = mul(vec4(pos.xyz, 1.0), prevWVP);"); } - node_shader_add_out(frag, "vec4 fragColor[3]"); + node_shader_add_out(frag, "vec4 frag_color[3]"); frag.n = true; node_shader_add_function(frag, str_pack_float_int16); node_shader_add_function(frag, str_octahedron_wrap); @@ -86,25 +86,25 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) { - node_shader_add_uniform(frag, "sampler2D senvmapBrdf", "$brdf.k"); - node_shader_add_uniform(frag, "sampler2D senvmapRadiance", "_envmap_radiance"); - node_shader_add_uniform(frag, "sampler2D sltcMat", "_ltcMat"); - node_shader_add_uniform(frag, "sampler2D sltcMag", "_ltcMag"); + node_shader_add_uniform(frag, "sampler2D senvmap_brdf", "$brdf.k"); + node_shader_add_uniform(frag, "sampler2D senvmap_radiance", "_envmap_radiance"); + node_shader_add_uniform(frag, "sampler2D sltc_mat", "_ltc_mat"); + node_shader_add_uniform(frag, "sampler2D sltc_mag", "_ltc_mag"); } node_shader_add_shared_sampler(frag, "sampler2D texpaint"); - node_shader_write(frag, "texpaint_sample = textureLodShared(texpaint" + ", texCoord, 0.0);"); + node_shader_write(frag, "texpaint_sample = textureLodShared(texpaint" + ", tex_coord, 0.0);"); node_shader_write(frag, "texpaint_opac = texpaint_sample.a;"); node_shader_write(frag, "basecol = texpaint_sample.rgb * texpaint_opac;"); node_shader_add_shared_sampler(frag, "sampler2D texpaint_nor"); - node_shader_write(frag, "texpaint_nor_sample = textureLodShared(texpaint_nor" + ", texCoord, 0.0);"); + node_shader_write(frag, "texpaint_nor_sample = textureLodShared(texpaint_nor" + ", tex_coord, 0.0);"); node_shader_write(frag, "ntex = mix(ntex, texpaint_nor_sample.rgb, texpaint_opac);"); node_shader_add_shared_sampler(frag, "sampler2D texpaint_pack"); - node_shader_write(frag, "texpaint_pack_sample = textureLodShared(texpaint_pack" + ", texCoord, 0.0);"); + node_shader_write(frag, "texpaint_pack_sample = textureLodShared(texpaint_pack" + ", tex_coord, 0.0);"); node_shader_write(frag, "occlusion = mix(occlusion, texpaint_pack_sample.r, texpaint_opac);"); @@ -114,16 +114,16 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write(frag, "height = texpaint_pack_sample.a * texpaint_opac;"); - // if (l.paintHeight && heightUsed) { - // let assign = l.paintHeightBlend ? "+=" : "="; + // if (l.paint_height && height_used) { + // let assign = l.paint_height_blend ? "+=" : "="; // node_shader_write(frag, "height " + assign + " texpaint_pack_sample.a * texpaint_opac;"); // node_shader_write(frag, "{"); - // node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); - // node_shader_write(frag, "float tex_step = 1.0 / texpaintSize.x;"); - // node_shader_write(frag, "height0 " + assign + " textureLodShared(texpaint_pack" + ", vec2(texCoord.x - tex_step, texCoord.y), 0.0).a * texpaint_opac;"); - // node_shader_write(frag, "height1 " + assign + " textureLodShared(texpaint_pack" + ", vec2(texCoord.x + tex_step, texCoord.y), 0.0).a * texpaint_opac;"); - // node_shader_write(frag, "height2 " + assign + " textureLodShared(texpaint_pack" + ", vec2(texCoord.x, texCoord.y - tex_step), 0.0).a * texpaint_opac;"); - // node_shader_write(frag, "height3 " + assign + " textureLodShared(texpaint_pack" + ", vec2(texCoord.x, texCoord.y + tex_step), 0.0).a * texpaint_opac;"); + // node_shader_add_uniform(frag, "vec2 texpaint_size", "_texpaint_size"); + // node_shader_write(frag, "float tex_step = 1.0 / texpaint_size.x;"); + // node_shader_write(frag, "height0 " + assign + " textureLodShared(texpaint_pack" + ", vec2(tex_coord.x - tex_step, tex_coord.y), 0.0).a * texpaint_opac;"); + // node_shader_write(frag, "height1 " + assign + " textureLodShared(texpaint_pack" + ", vec2(tex_coord.x + tex_step, tex_coord.y), 0.0).a * texpaint_opac;"); + // node_shader_write(frag, "height2 " + assign + " textureLodShared(texpaint_pack" + ", vec2(tex_coord.x, tex_coord.y - tex_step), 0.0).a * texpaint_opac;"); + // node_shader_write(frag, "height3 " + assign + " textureLodShared(texpaint_pack" + ", vec2(tex_coord.x, tex_coord.y + tex_step), 0.0).a * texpaint_opac;"); // node_shader_write(frag, "}"); // } @@ -140,9 +140,9 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte frag.vvec = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); + node_shader_write(frag, "mat3 TBN = cotangent_frame(n, vvec, tex_coord);"); ///else - node_shader_write(frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); + node_shader_write(frag, "mat3 TBN = cotangent_frame(n, -vvec, tex_coord);"); ///end node_shader_write(frag, "n = ntex * 2.0 - 1.0;"); node_shader_write(frag, "n.y = -n.y;"); @@ -154,91 +154,91 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.viewport_shader != null) { let color = context_raw.viewport_shader(frag); - node_shader_write(frag, "fragColor[1] = vec4(" + color + ", 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(" + color + ", 1.0);"); } else if (context_raw.render_mode == render_mode_t.FORWARD && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { frag.wposition = true; node_shader_write(frag, "vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);"); node_shader_write(frag, "vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);"); frag.vvec = true; - node_shader_write(frag, "float dotNV = max(0.0, dot(n, vVec));"); - node_shader_write(frag, "vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(roughness, 1.0 - dotNV) * 256.0), 0).xy;"); - node_shader_add_uniform(frag, "int envmapNumMipmaps", "_envmap_num_mipmaps"); - node_shader_add_uniform(frag, "vec4 envmapData", "_envmapData"); // angle, sin(angle), cos(angle), strength - node_shader_write(frag, "vec3 wreflect = reflect(-vVec, n);"); - node_shader_write(frag, "float envlod = roughness * float(envmapNumMipmaps);"); + node_shader_write(frag, "float dotnv = max(0.0, dot(n, vvec));"); + node_shader_write(frag, "vec2 env_brdf = texelFetch(senvmap_brdf, ivec2(vec2(roughness, 1.0 - dotnv) * 256.0), 0).xy;"); + node_shader_add_uniform(frag, "int envmap_num_mipmaps", "_envmap_num_mipmaps"); + node_shader_add_uniform(frag, "vec4 envmap_data", "_envmap_data"); // angle, sin(angle), cos(angle), strength + node_shader_write(frag, "vec3 wreflect = reflect(-vvec, n);"); + node_shader_write(frag, "float envlod = roughness * float(envmap_num_mipmaps);"); node_shader_add_function(frag, str_envmap_equirect); - node_shader_write(frag, "vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect, envmapData.x), envlod).rgb;"); - node_shader_add_uniform(frag, "vec3 lightArea0", "_light_area0"); - node_shader_add_uniform(frag, "vec3 lightArea1", "_light_area1"); - node_shader_add_uniform(frag, "vec3 lightArea2", "_light_area2"); - node_shader_add_uniform(frag, "vec3 lightArea3", "_light_area3"); + node_shader_write(frag, "vec3 prefiltered_color = textureLod(senvmap_radiance, envmap_equirect(wreflect, envmap_data.x), envlod).rgb;"); + node_shader_add_uniform(frag, "vec3 light_area0", "_light_area0"); + node_shader_add_uniform(frag, "vec3 light_area1", "_light_area1"); + node_shader_add_uniform(frag, "vec3 light_area2", "_light_area2"); + node_shader_add_uniform(frag, "vec3 light_area3", "_light_area3"); node_shader_add_function(frag, str_ltc_evaluate); - node_shader_add_uniform(frag, "vec3 lightPos", "_point_pos"); - node_shader_add_uniform(frag, "vec3 lightColor", "_point_color"); - node_shader_write(frag, "float ldist = distance(wposition, lightPos);"); + node_shader_add_uniform(frag, "vec3 light_pos", "_point_pos"); + node_shader_add_uniform(frag, "vec3 light_color", "_point_color"); + node_shader_write(frag, "float ldist = distance(wposition, light_pos);"); node_shader_write(frag, "const float LUT_SIZE = 64.0;"); node_shader_write(frag, "const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;"); node_shader_write(frag, "const float LUT_BIAS = 0.5 / LUT_SIZE;"); - node_shader_write(frag, "float theta = acos(dotNV);"); + node_shader_write(frag, "float theta = acos(dotnv);"); node_shader_write(frag, "vec2 tuv = vec2(roughness, theta / (0.5 * 3.14159265));"); node_shader_write(frag, "tuv = tuv * LUT_SCALE + LUT_BIAS;"); - node_shader_write(frag, "vec4 t = textureLod(sltcMat, tuv, 0.0);"); + node_shader_write(frag, "vec4 t = textureLod(sltc_mat, tuv, 0.0);"); node_shader_write(frag, "mat3 minv = mat3(vec3(1.0, 0.0, t.y), vec3(0.0, t.z, 0.0), vec3(t.w, 0.0, t.x));"); - node_shader_write(frag, "float ltcspec = ltcEvaluate(n, vVec, dotNV, wposition, minv, lightArea0, lightArea1, lightArea2, lightArea3);"); - node_shader_write(frag, "ltcspec *= textureLod(sltcMag, tuv, 0.0).a;"); + node_shader_write(frag, "float ltcspec = ltc_evaluate(n, vvec, dotnv, wposition, minv, light_area0, light_area1, light_area2, light_area3);"); + node_shader_write(frag, "ltcspec *= textureLod(sltc_mag, tuv, 0.0).a;"); node_shader_write(frag, "mat3 mident = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);"); - node_shader_write(frag, "float ltcdiff = ltcEvaluate(n, vVec, dotNV, wposition, mident, lightArea0, lightArea1, lightArea2, lightArea3);"); + node_shader_write(frag, "float ltcdiff = ltc_evaluate(n, vvec, dotnv, wposition, mident, light_area0, light_area1, light_area2, light_area3);"); node_shader_write(frag, "vec3 direct = albedo * ltcdiff + ltcspec * 0.05;"); - node_shader_write(frag, "direct *= lightColor * (1.0 / (ldist * ldist));"); + node_shader_write(frag, "direct *= light_color * (1.0 / (ldist * ldist));"); node_shader_add_uniform(frag, "vec4 shirr[7]", "_envmap_irradiance"); node_shader_add_function(frag, str_sh_irradiance()); - node_shader_write(frag, "vec3 indirect = albedo * (shIrradiance(vec3(n.x * envmapData.z - n.y * envmapData.y, n.x * envmapData.y + n.y * envmapData.z, n.z), shirr) / 3.14159265);"); - node_shader_write(frag, "indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y) * 1.5;"); - node_shader_write(frag, "indirect *= envmapData.w * occlusion;"); - node_shader_write(frag, "fragColor[1] = vec4(direct + indirect, 1.0);"); + node_shader_write(frag, "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, "indirect += prefiltered_color * (f0 * env_brdf.x + env_brdf.y) * 1.5;"); + node_shader_write(frag, "indirect *= envmap_data.w * occlusion;"); + node_shader_write(frag, "frag_color[1] = vec4(direct + indirect, 1.0);"); } else { // Deferred, Pathtraced - node_shader_write(frag, "fragColor[1] = vec4(basecol, occlusion);"); + node_shader_write(frag, "frag_color[1] = vec4(basecol, occlusion);"); } } else if (context_raw.viewport_mode == viewport_mode_t.BASE_COLOR) { - node_shader_write(frag, "fragColor[1] = vec4(basecol, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(basecol, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.NORMAL_MAP) { - node_shader_write(frag, "fragColor[1] = vec4(ntex.rgb, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(ntex.rgb, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OCCLUSION) { - node_shader_write(frag, "fragColor[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.ROUGHNESS) { - node_shader_write(frag, "fragColor[1] = vec4(vec3(roughness, roughness, roughness), 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(vec3(roughness, roughness, roughness), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.METALLIC) { - node_shader_write(frag, "fragColor[1] = vec4(vec3(metallic, metallic, metallic), 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(vec3(metallic, metallic, metallic), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OPACITY) { - node_shader_write(frag, "fragColor[1] = vec4(vec3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(vec3(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, "fragColor[1] = vec4(vec3(height, height, height), 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(vec3(height, height, height), 1.0);"); } else { - node_shader_write(frag, "fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);"); // Pink + node_shader_write(frag, "frag_color[1] = vec4(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, "fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));"); + node_shader_write(frag, "frag_color[1].rgb = pow(frag_color[1].rgb, vec3(2.2, 2.2, 2.2));"); } node_shader_write(frag, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); - node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);"); - node_shader_write(frag, "fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, uint(int(matid * 255.0) % 3)));"); + node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy);"); + node_shader_write(frag, "frag_color[0] = vec4(n.xy, roughness, pack_f32_i16(metallic, uint(int(matid * 255.0) % 3)));"); node_shader_write(frag, "vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); node_shader_write(frag, "vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;"); - node_shader_write(frag, "fragColor[2] = vec4(posa - posb, texCoord.xy);"); + node_shader_write(frag, "frag_color[2] = vec4(posa - posb, 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 dcbdf06f..7cd5340f 100644 --- a/armorlab/sources/make_paint.ts +++ b/armorlab/sources/make_paint.ts @@ -46,23 +46,23 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write(vert, "gl_Position = vec4(-1.0 + float((gl_VertexID & 1) << 2), -1.0 + float((gl_VertexID & 2) << 1), 0.0, 1.0);"); node_shader_add_uniform(frag, "sampler2D gbuffer2"); - node_shader_add_uniform(frag, "vec2 gbufferSize", "_gbufferSize"); - node_shader_add_uniform(frag, "vec4 inp", "_inputBrush"); + node_shader_add_uniform(frag, "vec2 gbuffer_size", "_gbuffer_size"); + node_shader_add_uniform(frag, "vec4 inp", "_input_brush"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;"); + node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2(inp.x * gbuffer_size.x, inp.y * gbuffer_size.y), 0).ba;"); ///else - node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;"); + node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2(inp.x * gbuffer_size.x, (1.0 - inp.y) * gbuffer_size.y), 0).ba;"); ///end - node_shader_add_out(frag, "vec4 fragColor[4]"); + node_shader_add_out(frag, "vec4 frag_color[4]"); node_shader_add_uniform(frag, "sampler2D texpaint"); node_shader_add_uniform(frag, "sampler2D texpaint_nor"); node_shader_add_uniform(frag, "sampler2D texpaint_pack"); - node_shader_write(frag, "fragColor[0] = textureLod(texpaint, texCoordInp, 0.0);"); - node_shader_write(frag, "fragColor[1] = textureLod(texpaint_nor, texCoordInp, 0.0);"); - node_shader_write(frag, "fragColor[2] = textureLod(texpaint_pack, texCoordInp, 0.0);"); - node_shader_write(frag, "fragColor[3].rg = texCoordInp.xy;"); + node_shader_write(frag, "frag_color[0] = textureLod(texpaint, tex_coord_inp, 0.0);"); + node_shader_write(frag, "frag_color[1] = textureLod(texpaint_nor, tex_coord_inp, 0.0);"); + node_shader_write(frag, "frag_color[2] = textureLod(texpaint_pack, tex_coord_inp, 0.0);"); + node_shader_write(frag, "frag_color[3].rg = tex_coord_inp.xy;"); con_paint.data.shader_from_source = true; con_paint.data.vertex_shader = node_shader_get(vert); con_paint.data.fragment_shader = node_shader_get(frag); @@ -71,7 +71,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) node_shader_write(vert, "vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);"); - // node_shader_write(vert, "vec2 tpos = vec2(frac(tex.x * texScale) * 2.0 - 1.0, (1.0 - frac(tex.y * texScale)) * 2.0 - 1.0);"); // 3D View + // node_shader_write(vert, "vec2 tpos = vec2(frac(tex.x * tex_scale) * 2.0 - 1.0, (1.0 - frac(tex.y * tex_scale)) * 2.0 - 1.0);"); // 3D View ///else node_shader_write(vert, "vec2 tpos = vec2(tex.xy * 2.0 - 1.0);"); ///end @@ -87,20 +87,20 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write_attrib(frag, "sp.y = 1.0 - sp.y;"); node_shader_write_attrib(frag, "sp.z -= 0.0001;"); // small bias - node_shader_add_uniform(frag, "vec4 inp", "_inputBrush"); - node_shader_add_uniform(frag, "vec4 inplast", "_inputBrushLast"); - node_shader_add_uniform(frag, "float aspectRatio", "_aspect_ratio_window"); + node_shader_add_uniform(frag, "vec4 inp", "_input_brush"); + node_shader_add_uniform(frag, "vec4 inplast", "_input_brush_last"); + node_shader_add_uniform(frag, "float aspect_ratio", "_aspect_ratio_window"); node_shader_write(frag, "vec2 bsp = sp.xy * 2.0 - 1.0;"); - node_shader_write(frag, "bsp.x *= aspectRatio;"); + node_shader_write(frag, "bsp.x *= aspect_ratio;"); node_shader_write(frag, "bsp = bsp * 0.5 + 0.5;"); node_shader_add_uniform(frag, "sampler2D gbufferD"); - node_shader_add_out(frag, "vec4 fragColor[4]"); + node_shader_add_out(frag, "vec4 frag_color[4]"); - node_shader_add_uniform(frag, "float brushRadius", "_brushRadius"); - node_shader_add_uniform(frag, "float brushOpacity", "_brushOpacity"); - node_shader_add_uniform(frag, "float brushHardness", "_brushHardness"); + node_shader_add_uniform(frag, "float brush_radius", "_brush_radius"); + node_shader_add_uniform(frag, "float brush_opacity", "_brush_opacity"); + node_shader_add_uniform(frag, "float brush_hardness", "_brush_hardness"); if (context_raw.tool == workspace_tool_t.ERASER || context_raw.tool == workspace_tool_t.CLONE || @@ -138,35 +138,35 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write(frag, "float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);"); node_shader_write(frag, "dist = length(pa - ba * h);"); - node_shader_write(frag, "if (dist > brushRadius) discard;"); + node_shader_write(frag, "if (dist > brush_radius) discard;"); } - // node_shader_add_uniform(vert, "float brushScale", "_brushScale"); - // node_shader_add_uniform(vert, "float texScale", "_tex_unpack"); - // node_shader_add_out(vert, "vec2 texCoord"); - // node_shader_write(vert, "texCoord = tex * brushScale * texScale;"); + // node_shader_add_uniform(vert, "float brush_scale", "_brush_scale"); + // node_shader_add_uniform(vert, "float tex_scale", "_tex_unpack"); + // node_shader_add_out(vert, "vec2 tex_coord"); + // node_shader_write(vert, "tex_coord = tex * brush_scale * tex_scale;"); 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(frag, "sampler2D BLUR"); - node_shader_add_uniform(frag, "vec2 SMUDGE", "_gbufferSize"); + node_shader_add_uniform(frag, "sampler2D gbuffer2"); + node_shader_add_uniform(frag, "vec2 gbuffer_size", "_gbuffer_size"); node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); node_shader_add_uniform(frag, "sampler2D texpaint_nor_undo", "_texpaint_nor_undo"); node_shader_add_uniform(frag, "sampler2D texpaint_pack_undo", "_texpaint_pack_undo"); if (context_raw.tool == workspace_tool_t.CLONE) { - // node_shader_add_uniform(frag, "vec2 BLUR", "_cloneDelta"); - // ///if (krom_direct3d11 || SMUDGE || krom_metal || krom_vulkan) - // node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.xy + cloneDelta) * gbufferSize), 0).ba;"); + // node_shader_add_uniform(frag, "vec2 clone_delta", "_clone_delta"); + // ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) + // node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2((sp.xy + clone_delta) * gbuffer_size), 0).ba;"); // ///else - // node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.x + cloneDelta.x) * gbufferSize.x, (1.0 - (sp.y + cloneDelta.y)) * gbufferSize.y), 0).ba;"); + // node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2((sp.x + clone_delta.x) * gbuffer_size.x, (1.0 - (sp.y + clone_delta.y)) * gbuffer_size.y), 0).ba;"); // ///end - // node_shader_write(frag, "vec3 texpaint_pack_sample = textureLod(texpaint_pack_undo, texCoordInp, 0.0).rgb;"); - // let base = "textureLod(texpaint_undo, texCoordInp, 0.0).rgb"; + // node_shader_write(frag, "vec3 texpaint_pack_sample = textureLod(texpaint_pack_undo, tex_coord_inp, 0.0).rgb;"); + // let base = "textureLod(texpaint_undo, tex_coord_inp, 0.0).rgb"; // let rough = "texpaint_pack_sample.g"; // let met = "texpaint_pack_sample.b"; // let occ = "texpaint_pack_sample.r"; - // let nortan = "textureLod(texpaint_nor_undo, texCoordInp, 0.0).rgb"; + // let nortan = "textureLod(texpaint_nor_undo, tex_coord_inp, 0.0).rgb"; // let height = "0.0"; // let opac = "1.0"; // node_shader_write(frag, "vec3 basecol = " + base + ";"); @@ -176,13 +176,13 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad // node_shader_write(frag, "vec3 nortan = " + nortan + ";"); // node_shader_write(frag, "float height = " + height + ";"); // node_shader_write(frag, "float mat_opacity = " + opac + ";"); - // node_shader_write(frag, "float opacity = mat_opacity * brushOpacity;"); + // node_shader_write(frag, "float opacity = mat_opacity * brush_opacity;"); } else { // Blur // ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - // node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, sp.y * gbufferSize.y), 0).ba;"); + // node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2(sp.x * gbuffer_size.x, sp.y * gbuffer_size.y), 0).ba;"); // ///else - // node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, (1.0 - sp.y) * gbufferSize.y), 0).ba;"); + // node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2(sp.x * gbuffer_size.x, (1.0 - sp.y) * gbuffer_size.y), 0).ba;"); // ///end // node_shader_write(frag, "vec3 basecol = vec3(0.0, 0.0, 0.0);"); @@ -194,31 +194,31 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad // node_shader_write(frag, "float mat_opacity = 1.0;"); // node_shader_write(frag, "float opacity = 0.0;"); - // node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); - // node_shader_write(frag, "float blur_step = 1.0 / texpaintSize.x;"); - // if (context_raw.blurDirectional) { + // node_shader_add_uniform(frag, "vec2 texpaint_size", "_texpaint_size"); + // node_shader_write(frag, "float blur_step = 1.0 / texpaint_size.x;"); + // if (context_raw.blur_directional) { // ///if (krom_direct3d11 || krom_direct3d12 || krom_metal) // node_shader_write(frag, "const float blur_weight[7] = {1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0};"); // ///else // node_shader_write(frag, "const float blur_weight[7] = float[](1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0);"); // ///end - // node_shader_add_uniform(frag, "vec3 brushDirection", "_brushDirection"); - // node_shader_write(frag, "vec2 blur_direction = brushDirection.yx;"); + // node_shader_add_uniform(frag, "vec3 brush_direction", "_brush_direction"); + // node_shader_write(frag, "vec2 blur_direction = brush_direction.yx;"); // node_shader_write(frag, "for (int i = 0; i < 7; ++i) {"); // ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - // node_shader_write(frag, "vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (sp.y + blur_direction.y * blur_step * float(i)) * gbufferSize.y), 0).ba;"); + // node_shader_write(frag, "vec2 tex_coord_inp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbuffer_size.x, (sp.y + blur_direction.y * blur_step * float(i)) * gbuffer_size.y), 0).ba;"); // ///else - // node_shader_write(frag, "vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (1.0 - (sp.y + blur_direction.y * blur_step * float(i))) * gbufferSize.y), 0).ba;"); + // node_shader_write(frag, "vec2 tex_coord_inp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbuffer_size.x, (1.0 - (sp.y + blur_direction.y * blur_step * float(i))) * gbuffer_size.y), 0).ba;"); // ///end - // node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp2);"); + // node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, tex_coord_inp2);"); // node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[i];"); // node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[i];"); - // node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp2) * blur_weight[i];"); + // node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, tex_coord_inp2) * blur_weight[i];"); // node_shader_write(frag, "roughness += texpaint_pack_sample.g;"); // node_shader_write(frag, "metallic += texpaint_pack_sample.b;"); // node_shader_write(frag, "occlusion += texpaint_pack_sample.r;"); // node_shader_write(frag, "height += texpaint_pack_sample.a;"); - // node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp2).rgb * blur_weight[i];"); + // node_shader_write(frag, "nortan += texture(texpaint_nor_undo, tex_coord_inp2).rgb * blur_weight[i];"); // node_shader_write(frag, "}"); // } // else { @@ -229,37 +229,37 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad // ///end // // X // node_shader_write(frag, "for (int i = -7; i <= 7; ++i) {"); - // node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(blur_step * float(i), 0.0));"); + // node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, tex_coord_inp + vec2(blur_step * float(i), 0.0));"); // node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[i + 7];"); // node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[i + 7];"); - // node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(blur_step * float(i), 0.0)) * blur_weight[i + 7];"); + // node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, tex_coord_inp + vec2(blur_step * float(i), 0.0)) * blur_weight[i + 7];"); // node_shader_write(frag, "roughness += texpaint_pack_sample.g;"); // node_shader_write(frag, "metallic += texpaint_pack_sample.b;"); // node_shader_write(frag, "occlusion += texpaint_pack_sample.r;"); // node_shader_write(frag, "height += texpaint_pack_sample.a;"); - // node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp + vec2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];"); + // node_shader_write(frag, "nortan += texture(texpaint_nor_undo, tex_coord_inp + vec2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];"); // node_shader_write(frag, "}"); // // Y // node_shader_write(frag, "for (int j = -7; j <= 7; ++j) {"); - // node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(0.0, blur_step * float(j)));"); + // node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, tex_coord_inp + vec2(0.0, blur_step * float(j)));"); // node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[j + 7];"); // node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[j + 7];"); - // node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(0.0, blur_step * float(j))) * blur_weight[j + 7];"); + // node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, tex_coord_inp + vec2(0.0, blur_step * float(j))) * blur_weight[j + 7];"); // node_shader_write(frag, "roughness += texpaint_pack_sample.g;"); // node_shader_write(frag, "metallic += texpaint_pack_sample.b;"); // node_shader_write(frag, "occlusion += texpaint_pack_sample.r;"); // node_shader_write(frag, "height += texpaint_pack_sample.a;"); - // node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp + vec2(0.0, blur_step * float(j))).rgb * blur_weight[j + 7];"); + // node_shader_write(frag, "nortan += texture(texpaint_nor_undo, tex_coord_inp + vec2(0.0, blur_step * float(j))).rgb * blur_weight[j + 7];"); // node_shader_write(frag, "}"); // } - // node_shader_write(frag, "opacity *= brushOpacity;"); + // node_shader_write(frag, "opacity *= brush_opacity;"); } } node_shader_write(frag, "float opacity = 1.0;"); node_shader_write(frag, "if (opacity == 0.0) discard;"); - node_shader_write(frag, "float str = clamp((brushRadius - dist) * brushHardness * 400.0, 0.0, 1.0) * opacity;"); + node_shader_write(frag, "float str = clamp((brush_radius - dist) * brush_hardness * 400.0, 0.0, 1.0) * opacity;"); // Manual blending to preserve memory frag.wvpposition = true; @@ -275,13 +275,13 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write(frag, "vec4 sample_undo = textureLod(texpaint_undo, sample_tc, 0.0);"); if (context_raw.tool == workspace_tool_t.ERASER) { - // node_shader_write(frag, "fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); - node_shader_write(frag, "fragColor[0] = vec4(0.0, 0.0, 0.0, 0.0);"); - node_shader_write(frag, "fragColor[1] = vec4(0.5, 0.5, 1.0, 0.0);"); - node_shader_write(frag, "fragColor[2] = vec4(1.0, 0.0, 0.0, 0.0);"); + // node_shader_write(frag, "frag_color[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); + node_shader_write(frag, "frag_color[0] = vec4(0.0, 0.0, 0.0, 0.0);"); + node_shader_write(frag, "frag_color[1] = vec4(0.5, 0.5, 1.0, 0.0);"); + node_shader_write(frag, "frag_color[2] = vec4(1.0, 0.0, 0.0, 0.0);"); } - node_shader_write(frag, "fragColor[3] = vec4(str, 0.0, 0.0, 1.0);"); + node_shader_write(frag, "frag_color[3] = vec4(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 458c211a..0f2be46e 100644 --- a/armorpaint/assets/plugins/hello_node.js +++ b/armorpaint/assets/plugins/hello_node.js @@ -60,7 +60,7 @@ parser_material_custom_nodes.set(node_type, function(node, socket) { let my_out = parser_material_node_name(node) + "_out"; node_shader_write(frag, - "float " + my_out + " = cos(sin(texCoord.x * 200.0 * " + scale + ") + cos(texCoord.y * 200.0 * " + scale + "));" + "float " + my_out + " = cos(sin(tex_coord.x * 200.0 * " + scale + ") + cos(tex_coord.y * 200.0 * " + scale + "));" ); if (socket.name == "Color") { diff --git a/armorpaint/assets/plugins/viewport_celshade.js b/armorpaint/assets/plugins/viewport_celshade.js index ae5e0bdd..7edfc38f 100644 --- a/armorpaint/assets/plugins/viewport_celshade.js +++ b/armorpaint/assets/plugins/viewport_celshade.js @@ -3,12 +3,12 @@ let plugin = plugin_create(); // Register custom viewport shader context_set_viewport_shader(function(shader) { - node_shader_add_uniform(shader, "vec3 lightDir", "_light_dir"); + node_shader_add_uniform(shader, "vec3 light_dir", "_light_dir"); node_shader_write(shader, ` - float dotNL = max(dot(n, lightDir), 0.0); - vec3 outputColor = basecol * step(0.5, dotNL) + basecol; + float dotnl = max(dot(n, light_dir), 0.0); + vec3 output_color = basecol * step(0.5, dotnl) + basecol; `); - return "outputColor"; + return "output_color"; }); plugin.delete = function() { diff --git a/armorpaint/shaders/dilate_map.frag.glsl b/armorpaint/shaders/dilate_map.frag.glsl index 01d2d344..83abcf12 100644 --- a/armorpaint/shaders/dilate_map.frag.glsl +++ b/armorpaint/shaders/dilate_map.frag.glsl @@ -1,7 +1,7 @@ #version 450 -out float fragColor; +out float frag_color; void main() { - fragColor = 1.0; + frag_color = 1.0; } diff --git a/armorpaint/shaders/dilate_map.vert.glsl b/armorpaint/shaders/dilate_map.vert.glsl index 4af388b0..760c11c9 100644 --- a/armorpaint/shaders/dilate_map.vert.glsl +++ b/armorpaint/shaders/dilate_map.vert.glsl @@ -6,11 +6,11 @@ in vec2 tex; void main() { #if defined(HLSL) || defined(METAL) || defined(SPIRV) - vec2 texCoord = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0); + vec2 tex_coord = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0); #else - vec2 texCoord = tex * 2.0 - 1.0; + vec2 tex_coord = tex * 2.0 - 1.0; #endif - gl_Position = vec4(texCoord, 0.0, 1.0); + gl_Position = vec4(tex_coord, 0.0, 1.0); #ifdef HLSL float keep = pos.x + nor.x; #endif diff --git a/armorpaint/shaders/dilate_pass.frag.glsl b/armorpaint/shaders/dilate_pass.frag.glsl index 0afca096..58ec11eb 100644 --- a/armorpaint/shaders/dilate_pass.frag.glsl +++ b/armorpaint/shaders/dilate_pass.frag.glsl @@ -2,10 +2,10 @@ uniform sampler2D tex; uniform sampler2D texdilate; -uniform float dilateRadius; +uniform float dilate_radius; -in vec2 texCoord; -out vec4 fragColor; +in vec2 tex_coord; +out vec4 frag_color; const vec2 offsets[8] = vec2[] ( vec2(-1, 0), @@ -21,35 +21,35 @@ const vec2 offsets[8] = vec2[] ( void main() { // Based on https://shaderbits.com/blog/uv-dilation by Ryan Brucks vec2 size = textureSize(tex, 0).xy; - vec2 texelSize = 1.0 / size; - float minDist = 10000000; - ivec2 coord = ivec2(texCoord * size); + vec2 texel_size = 1.0 / size; + float min_dist = 10000000; + ivec2 coord = ivec2(tex_coord * size); float mask = texelFetch(texdilate, coord, 0).r; if (mask > 0) discard; - fragColor = texelFetch(tex, coord, 0); + frag_color = texelFetch(tex, coord, 0); int i = 0; - while (i < dilateRadius) { + while (i < dilate_radius) { i++; int j = 0; while (j < 8) { - vec2 curUV = texCoord + offsets[j] * texelSize * i; - coord = ivec2(curUV * size); - float offsetMask = texelFetch(texdilate, coord, 0).r; - vec4 offsetCol = texelFetch(tex, coord, 0); + vec2 cur_uv = tex_coord + offsets[j] * texel_size * i; + coord = ivec2(cur_uv * size); + float offset_mask = texelFetch(texdilate, coord, 0).r; + vec4 offset_col = texelFetch(tex, coord, 0); - if (offsetMask != 0) { - float curDist = length(texCoord - curUV); - if (curDist < minDist) { - vec2 projectUV = curUV + offsets[j] * texelSize * i * 0.25; - vec4 direction = textureLod(tex, projectUV, 0.0); - minDist = curDist; + if (offset_mask != 0) { + float cur_dist = length(tex_coord - cur_uv); + if (cur_dist < min_dist) { + vec2 project_uv = cur_uv + offsets[j] * texel_size * i * 0.25; + vec4 direction = textureLod(tex, project_uv, 0.0); + min_dist = cur_dist; if (direction.x != 0 || direction.y != 0 || direction.z != 0) { - vec4 delta = offsetCol - direction; - fragColor = offsetCol + delta * 4; + vec4 delta = offset_col - direction; + frag_color = offset_col + delta * 4; } else { - fragColor = offsetCol; + frag_color = offset_col; } } } diff --git a/armorpaint/shaders/layer_invert.frag.glsl b/armorpaint/shaders/layer_invert.frag.glsl index 1212d313..27d7089f 100644 --- a/armorpaint/shaders/layer_invert.frag.glsl +++ b/armorpaint/shaders/layer_invert.frag.glsl @@ -2,10 +2,10 @@ uniform sampler2D tex; -in vec2 texCoord; +in vec2 tex_coord; in vec4 color; -out vec4 FragColor; +out vec4 frag_color; void main() { - FragColor = vec4(1.0) - textureLod(tex, texCoord, 0).rgba * color; + frag_color = vec4(1.0) - textureLod(tex, tex_coord, 0).rgba * color; } diff --git a/armorpaint/shaders/layer_merge.frag.glsl b/armorpaint/shaders/layer_merge.frag.glsl index 82aa629b..71e9e1ab 100644 --- a/armorpaint/shaders/layer_merge.frag.glsl +++ b/armorpaint/shaders/layer_merge.frag.glsl @@ -7,8 +7,8 @@ uniform sampler2D texa; uniform float opac; uniform int blending; -in vec2 texCoord; -out vec4 FragColor; +in vec2 tex_coord; +out vec4 frag_color; vec3 hsv_to_rgb(const vec3 c) { const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); @@ -26,94 +26,94 @@ vec3 rgb_to_hsv(const vec3 c) { } void main() { - vec4 col0 = textureLod(tex0, texCoord, 0); - vec4 cola = textureLod(texa, texCoord, 0); + vec4 col0 = textureLod(tex0, tex_coord, 0); + vec4 cola = textureLod(texa, tex_coord, 0); float str = col0.a * opac; - str *= textureLod(texmask, texCoord, 0).r; + str *= textureLod(texmask, tex_coord, 0).r; if (blending == -1) { // Merging _nor and _pack - vec4 col1 = textureLod(tex1, texCoord, 0); - FragColor = vec4(mix(cola, col1, str)); + vec4 col1 = textureLod(tex1, tex_coord, 0); + frag_color = vec4(mix(cola, col1, str)); } else if (blending == -2) { // Merging _nor with normal blending - vec4 col1 = textureLod(tex1, texCoord, 0); + vec4 col1 = textureLod(tex1, tex_coord, 0); // Whiteout blend vec3 n1 = cola.rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0); vec3 n2 = mix(vec3(0.5, 0.5, 1.0), col1.rgb, str) * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0); - FragColor = vec4(normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), max(col1.a, cola.a)); + frag_color = vec4(normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), max(col1.a, cola.a)); } else if (blending == -3) { // Merging _pack with height blending - vec4 col1 = textureLod(tex1, texCoord, 0); - FragColor = vec4(mix(cola.rgb, col1.rgb, str), cola.a + col1.a); + vec4 col1 = textureLod(tex1, tex_coord, 0); + frag_color = vec4(mix(cola.rgb, col1.rgb, str), cola.a + col1.a); } else if (blending == -4) { // Merge _pack.height into _nor float tex_step = 1.0 / textureSize(tex1, 0).x; - float height0 = textureLod(tex1, vec2(texCoord.x - tex_step, texCoord.y), 0.0).a; - float height1 = textureLod(tex1, vec2(texCoord.x + tex_step, texCoord.y), 0.0).a; - float height2 = textureLod(tex1, vec2(texCoord.x, texCoord.y - tex_step), 0.0).a; - float height3 = textureLod(tex1, vec2(texCoord.x, texCoord.y + tex_step), 0.0).a; + float height0 = textureLod(tex1, vec2(tex_coord.x - tex_step, tex_coord.y), 0.0).a; + float height1 = textureLod(tex1, vec2(tex_coord.x + tex_step, tex_coord.y), 0.0).a; + float height2 = textureLod(tex1, vec2(tex_coord.x, tex_coord.y - tex_step), 0.0).a; + float height3 = textureLod(tex1, vec2(tex_coord.x, tex_coord.y + tex_step), 0.0).a; float height_dx = height0 - height1; float height_dy = height2 - height3; // Whiteout blend vec3 n1 = col0.rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0); vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0)); - FragColor = vec4(normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), col0.a); + frag_color = vec4(normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), col0.a); } else if (blending == 0) { // Mix - FragColor = vec4(mix(cola.rgb, col0.rgb, str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, col0.rgb, str), max(col0.a, cola.a)); } else if (blending == 1) { // Darken - FragColor = vec4(mix(cola.rgb, min(cola.rgb, col0.rgb), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, min(cola.rgb, col0.rgb), str), max(col0.a, cola.a)); } else if (blending == 2) { // Multiply - FragColor = vec4(mix(cola.rgb, cola.rgb * col0.rgb, str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, cola.rgb * col0.rgb, str), max(col0.a, cola.a)); } else if (blending == 3) { // Burn - FragColor = vec4(mix(cola.rgb, vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - cola.rgb) / col0.rgb, str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - cola.rgb) / col0.rgb, str), max(col0.a, cola.a)); } else if (blending == 4) { // Lighten - FragColor = vec4(max(cola.rgb, col0.rgb * str), max(col0.a, cola.a)); + frag_color = vec4(max(cola.rgb, col0.rgb * str), max(col0.a, cola.a)); } else if (blending == 5) { // Screen - FragColor = vec4((vec3(1.0, 1.0, 1.0) - (vec3(1.0 - str, 1.0 - str, 1.0 - str) + str * (vec3(1.0, 1.0, 1.0) - col0.rgb)) * (vec3(1.0, 1.0, 1.0) - cola.rgb)), max(col0.a, cola.a)); + frag_color = vec4((vec3(1.0, 1.0, 1.0) - (vec3(1.0 - str, 1.0 - str, 1.0 - str) + str * (vec3(1.0, 1.0, 1.0) - col0.rgb)) * (vec3(1.0, 1.0, 1.0) - cola.rgb)), max(col0.a, cola.a)); } else if (blending == 6) { // Dodge - FragColor = vec4(mix(cola.rgb, cola.rgb / (vec3(1.0, 1.0, 1.0) - col0.rgb), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, cola.rgb / (vec3(1.0, 1.0, 1.0) - col0.rgb), str), max(col0.a, cola.a)); } else if (blending == 7) { // Add - FragColor = vec4(mix(cola.rgb, cola.rgb + col0.rgb, str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, cola.rgb + col0.rgb, str), max(col0.a, cola.a)); } else if (blending == 8) { // Overlay - FragColor = vec4(mix(cola.rgb, vec3( + frag_color = vec4(mix(cola.rgb, vec3( cola.r < 0.5 ? 2.0 * cola.r * col0.r : 1.0 - 2.0 * (1.0 - cola.r) * (1.0 - col0.r), cola.g < 0.5 ? 2.0 * cola.g * col0.g : 1.0 - 2.0 * (1.0 - cola.g) * (1.0 - col0.g), cola.b < 0.5 ? 2.0 * cola.b * col0.b : 1.0 - 2.0 * (1.0 - cola.b) * (1.0 - col0.b) ), str), max(col0.a, cola.a)); } else if (blending == 9) { // Soft Light - FragColor = vec4(((1.0 - str) * cola.rgb + str * ((vec3(1.0, 1.0, 1.0) - cola.rgb) * col0.rgb * cola.rgb + cola.rgb * (vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - col0.rgb) * (vec3(1.0, 1.0, 1.0) - cola.rgb)))), max(col0.a, cola.a)); + frag_color = vec4(((1.0 - str) * cola.rgb + str * ((vec3(1.0, 1.0, 1.0) - cola.rgb) * col0.rgb * cola.rgb + cola.rgb * (vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - col0.rgb) * (vec3(1.0, 1.0, 1.0) - cola.rgb)))), max(col0.a, cola.a)); } else if (blending == 10) { // Linear Light - FragColor = vec4((cola.rgb + str * (vec3(2.0, 2.0, 2.0) * (col0.rgb - vec3(0.5, 0.5, 0.5)))), max(col0.a, cola.a)); + frag_color = vec4((cola.rgb + str * (vec3(2.0, 2.0, 2.0) * (col0.rgb - vec3(0.5, 0.5, 0.5)))), max(col0.a, cola.a)); } else if (blending == 11) { // Difference - FragColor = vec4(mix(cola.rgb, abs(cola.rgb - col0.rgb), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, abs(cola.rgb - col0.rgb), str), max(col0.a, cola.a)); } else if (blending == 12) { // Subtract - FragColor = vec4(mix(cola.rgb, cola.rgb - col0.rgb, str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, cola.rgb - col0.rgb, str), max(col0.a, cola.a)); } else if (blending == 13) { // Divide - FragColor = vec4(vec3(1.0 - str, 1.0 - str, 1.0 - str) * cola.rgb + vec3(str, str, str) * cola.rgb / col0.rgb, max(col0.a, cola.a)); + frag_color = vec4(vec3(1.0 - str, 1.0 - str, 1.0 - str) * cola.rgb + vec3(str, str, str) * cola.rgb / col0.rgb, max(col0.a, cola.a)); } else if (blending == 14) { // Hue - FragColor = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(col0.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(col0.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a)); } else if (blending == 15) { // Saturation - FragColor = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(col0.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(col0.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a)); } else if (blending == 16) { // Color - FragColor = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(col0.rgb).r, rgb_to_hsv(col0.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(col0.rgb).r, rgb_to_hsv(col0.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a)); } else { // Value - FragColor = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(col0.rgb).b)), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(col0.rgb).b)), str), max(col0.a, cola.a)); } } diff --git a/armorpaint/shaders/layer_view.frag.glsl b/armorpaint/shaders/layer_view.frag.glsl index 40781583..146a81dc 100644 --- a/armorpaint/shaders/layer_view.frag.glsl +++ b/armorpaint/shaders/layer_view.frag.glsl @@ -3,29 +3,29 @@ uniform sampler2D tex; uniform int channel; -in vec2 texCoord; +in vec2 tex_coord; in vec4 color; -out vec4 FragColor; +out vec4 frag_color; void main() { if (channel == 1) { - FragColor = textureLod(tex, texCoord, 0).rrra * color; + frag_color = textureLod(tex, tex_coord, 0).rrra * color; } else if (channel == 2) { - FragColor = textureLod(tex, texCoord, 0).ggga * color; + frag_color = textureLod(tex, tex_coord, 0).ggga * color; } else if (channel == 3) { - FragColor = textureLod(tex, texCoord, 0).bbba * color; + frag_color = textureLod(tex, tex_coord, 0).bbba * color; } else if (channel == 4) { - FragColor = textureLod(tex, texCoord, 0).aaaa * color; + frag_color = textureLod(tex, tex_coord, 0).aaaa * color; } else if (channel == 5) { - FragColor = textureLod(tex, texCoord, 0).rgba * color; + frag_color = textureLod(tex, tex_coord, 0).rgba * color; } else { - vec4 tex_sample = textureLod(tex, texCoord, 0).rgba; + vec4 tex_sample = textureLod(tex, tex_coord, 0).rgba; tex_sample.rgb *= tex_sample.a; - FragColor = tex_sample * color; + frag_color = tex_sample * color; } } diff --git a/armorpaint/shaders/mask_colorid.frag.glsl b/armorpaint/shaders/mask_colorid.frag.glsl index 88b885c3..f632c218 100644 --- a/armorpaint/shaders/mask_colorid.frag.glsl +++ b/armorpaint/shaders/mask_colorid.frag.glsl @@ -4,12 +4,12 @@ uniform sampler2D texpaint_colorid; // 1x1 picked color uniform sampler2D texcolorid; -in vec2 texCoord; -out vec4 FragColor; +in vec2 tex_coord; +out vec4 frag_color; void main() { vec3 colorid_c1 = texelFetch(texpaint_colorid, ivec2(0, 0), 0).rgb; - vec3 colorid_c2 = textureLod(texcolorid, texCoord, 0).rgb; + vec3 colorid_c2 = textureLod(texcolorid, tex_coord, 0).rgb; if (colorid_c1 != colorid_c2) discard; - FragColor = vec4(1.0, 1.0, 1.0, 1.0); + frag_color = vec4(1.0, 1.0, 1.0, 1.0); } diff --git a/armorpaint/shaders/mask_merge.frag.glsl b/armorpaint/shaders/mask_merge.frag.glsl index 1b593590..ac5fa94c 100644 --- a/armorpaint/shaders/mask_merge.frag.glsl +++ b/armorpaint/shaders/mask_merge.frag.glsl @@ -5,58 +5,58 @@ uniform sampler2D texa; uniform float opac; uniform int blending; -in vec2 texCoord; -out vec4 FragColor; +in vec2 tex_coord; +out vec4 frag_color; void main() { - float col0 = textureLod(tex0, texCoord, 0).r; - float cola = textureLod(texa, texCoord, 0).r; + float col0 = textureLod(tex0, tex_coord, 0).r; + float cola = textureLod(texa, tex_coord, 0).r; float str = opac; - float outColor = 0.0; + float out_color = 0.0; if (blending == 0) { // Mix - outColor = mix(cola, col0, str); + out_color = mix(cola, col0, str); } else if (blending == 1) { // Darken - outColor = mix(cola, min(cola, col0), str); + out_color = mix(cola, min(cola, col0), str); } else if (blending == 2) { // Multiply - outColor = mix(cola, cola * col0, str); + out_color = mix(cola, cola * col0, str); } else if (blending == 3) { // Burn - outColor = mix(cola, 1.0 - (1.0 - cola) / col0, str); + out_color = mix(cola, 1.0 - (1.0 - cola) / col0, str); } else if (blending == 4) { // Lighten - outColor = max(cola, col0 * str); + out_color = max(cola, col0 * str); } else if (blending == 5) { // Screen - outColor = (1.0 - ((1.0 - str) + str * (1.0 - col0)) * (1.0 - cola)); + out_color = (1.0 - ((1.0 - str) + str * (1.0 - col0)) * (1.0 - cola)); } else if (blending == 6) { // Dodge - outColor = mix(cola, cola / (1.0 - col0), str); + out_color = mix(cola, cola / (1.0 - col0), str); } else if (blending == 7) { // Add - outColor = mix(cola, cola + col0, str); + out_color = mix(cola, cola + col0, str); } else if (blending == 8) { // Overlay - outColor = mix(cola, cola < 0.5 ? 2.0 * cola * col0 : 1.0 - 2.0 * (1.0 - cola) * (1.0 - col0), str); + out_color = mix(cola, cola < 0.5 ? 2.0 * cola * col0 : 1.0 - 2.0 * (1.0 - cola) * (1.0 - col0), str); } else if (blending == 9) { // Soft Light - outColor = ((1.0 - str) * cola + str * ((1.0 - cola) * col0 * cola + cola * (1.0 - (1.0 - col0) * (1.0 - cola)))); + out_color = ((1.0 - str) * cola + str * ((1.0 - cola) * col0 * cola + cola * (1.0 - (1.0 - col0) * (1.0 - cola)))); } else if (blending == 10) { // Linear Light - outColor = (cola + str * (2.0 * (col0 - 0.5))); + out_color = (cola + str * (2.0 * (col0 - 0.5))); } else if (blending == 11) { // Difference - outColor = mix(cola, abs(cola - col0), str); + out_color = mix(cola, abs(cola - col0), str); } else if (blending == 12) { // Subtract - outColor = mix(cola, cola - col0, str); + out_color = mix(cola, cola - col0, str); } else if (blending == 13) { // Divide - outColor = (1.0 - str) * cola + str * cola / col0; + out_color = (1.0 - str) * cola + str * cola / col0; } else { // Hue, Saturation, Color, Value - outColor = mix(cola, col0, str); + out_color = mix(cola, col0, str); } - FragColor = vec4(outColor, outColor, outColor, 1.0); + frag_color = vec4(out_color, out_color, out_color, 1.0); } diff --git a/armorpaint/shaders/mesh_posnor.frag.glsl b/armorpaint/shaders/mesh_posnor.frag.glsl index 0a24e7e1..d42dc8b9 100644 --- a/armorpaint/shaders/mesh_posnor.frag.glsl +++ b/armorpaint/shaders/mesh_posnor.frag.glsl @@ -5,7 +5,7 @@ in vec3 wnormal; in vec4 wvpposition; in vec4 prevwvpposition; -out vec4 fragColor[3]; +out vec4 frag_color[3]; void main() { vec3 n = normalize(wnormal); @@ -14,11 +14,11 @@ void main() { float metallic = 0.0; float occlusion = 1.0; n /= (abs(n.x) + abs(n.y) + abs(n.z)); - n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy); + n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy); uint matid = 0; - fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, matid)); - fragColor[1] = vec4(basecol, occlusion); + frag_color[0] = vec4(n.xy, roughness, pack_f32_i16(metallic, matid)); + frag_color[1] = vec4(basecol, occlusion); vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5; vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5; - fragColor[2].rg = vec2(posa - posb); + frag_color[2].rg = vec2(posa - posb); } diff --git a/armorpaint/sources/make_bake.ts b/armorpaint/sources/make_bake.ts index 96e1436a..4a10d453 100644 --- a/armorpaint/sources/make_bake.ts +++ b/armorpaint/sources/make_bake.ts @@ -8,29 +8,29 @@ function make_bake_run(con: node_shader_context_t, vert: node_shader_t, frag: no frag.vvec = true; node_shader_add_function(frag, str_cotangent_frame); ///if krom_direct3d11 - node_shader_write(frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); + node_shader_write(frag, "mat3 TBN = cotangent_frame(n, vvec, tex_coord);"); ///else - node_shader_write(frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); + node_shader_write(frag, "mat3 TBN = cotangent_frame(n, -vvec, tex_coord);"); ///end node_shader_write(frag, "n = nortan * 2.0 - 1.0;"); node_shader_write(frag, "n.y = -n.y;"); node_shader_write(frag, "n = normalize(mul(n, TBN));"); node_shader_write(frag, make_material_voxelgi_half_extents()); - node_shader_write(frag, "vec3 voxpos = wposition / voxelgiHalfExtents;"); + node_shader_write(frag, "vec3 voxpos = wposition / voxelgi_half_extents;"); node_shader_add_uniform(frag, "sampler3D voxels"); node_shader_add_function(frag, str_trace_ao); frag.n = true; let strength: f32 = context_raw.bake_ao_strength; let radius: f32 = context_raw.bake_ao_radius; let offset: f32 = context_raw.bake_ao_offset; - node_shader_write(frag, "float ao = traceAO(voxpos, n, " + radius + ", " + offset + ") * " + strength + ";"); + node_shader_write(frag, "float ao = trace_ao(voxpos, n, " + radius + ", " + offset + ") * " + strength + ";"); if (context_raw.bake_axis != bake_axis_t.XYZ) { let axis: string = make_bake_axis_string(context_raw.bake_axis); node_shader_write(frag, "ao *= dot(n, " + axis + ");"); } node_shader_write(frag, "ao = 1.0 - ao;"); - node_shader_write(frag, "fragColor[0] = vec4(ao, ao, ao, 1.0);"); + node_shader_write(frag, "frag_color[0] = vec4(ao, ao, ao, 1.0);"); ///end } else if (context_raw.bake_type == bake_type_t.CURVATURE) { @@ -50,73 +50,73 @@ function make_bake_run(con: node_shader_context_t, vert: node_shader_t, frag: no let axis: string = make_bake_axis_string(context_raw.bake_axis); node_shader_write(frag, "curvature *= dot(n, " + axis + ");"); } - node_shader_write(frag, "fragColor[0] = vec4(curvature, curvature, curvature, 1.0);"); + node_shader_write(frag, "frag_color[0] = vec4(curvature, curvature, curvature, 1.0);"); } else if (context_raw.bake_type == bake_type_t.NORMAL) { // Tangent frag.n = true; node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); // Baked high-poly normals - node_shader_write(frag, "vec3 n0 = textureLod(texpaint_undo, texCoord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); + node_shader_write(frag, "vec3 n0 = textureLod(texpaint_undo, tex_coord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); node_shader_add_function(frag, str_cotangent_frame); - node_shader_write(frag, "mat3 invTBN = transpose(cotangentFrame(n, n, texCoord));"); + node_shader_write(frag, "mat3 invTBN = transpose(cotangent_frame(n, n, tex_coord));"); node_shader_write(frag, "vec3 res = normalize(mul(n0, invTBN)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);"); - node_shader_write(frag, "fragColor[0] = vec4(res, 1.0);"); + node_shader_write(frag, "frag_color[0] = vec4(res, 1.0);"); } else if (context_raw.bake_type == bake_type_t.NORMAL_OBJECT) { frag.n = true; - node_shader_write(frag, "fragColor[0] = vec4(n * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);"); + node_shader_write(frag, "frag_color[0] = vec4(n * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);"); if (context_raw.bake_up_axis == bake_up_axis_t.Y) { - node_shader_write(frag, "fragColor[0].rgb = vec3(fragColor[0].r, fragColor[0].b, 1.0 - fragColor[0].g);"); + node_shader_write(frag, "frag_color[0].rgb = vec3(frag_color[0].r, frag_color[0].b, 1.0 - frag_color[0].g);"); } } else if (context_raw.bake_type == bake_type_t.HEIGHT) { frag.wposition = true; node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); // Baked high-poly positions - node_shader_write(frag, "vec3 wpos0 = textureLod(texpaint_undo, texCoord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); + node_shader_write(frag, "vec3 wpos0 = textureLod(texpaint_undo, tex_coord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);"); node_shader_write(frag, "float res = distance(wpos0, wposition) * 10.0;"); - node_shader_write(frag, "fragColor[0] = vec4(res, res, res, 1.0);"); + node_shader_write(frag, "frag_color[0] = vec4(res, res, res, 1.0);"); } else if (context_raw.bake_type == bake_type_t.DERIVATIVE) { node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); // Baked height - node_shader_write(frag, "vec2 texDx = dFdx(texCoord);"); - node_shader_write(frag, "vec2 texDy = dFdy(texCoord);"); - node_shader_write(frag, "float h0 = textureLod(texpaint_undo, texCoord, 0.0).r * 100;"); - node_shader_write(frag, "float h1 = textureLod(texpaint_undo, texCoord + texDx, 0.0).r * 100;"); - node_shader_write(frag, "float h2 = textureLod(texpaint_undo, texCoord + texDy, 0.0).r * 100;"); - node_shader_write(frag, "fragColor[0] = vec4((h1 - h0) * 0.5 + 0.5, (h2 - h0) * 0.5 + 0.5, 0.0, 1.0);"); + node_shader_write(frag, "vec2 tex_dx = dFdx(tex_coord);"); + node_shader_write(frag, "vec2 tex_dy = dFdy(tex_coord);"); + node_shader_write(frag, "float h0 = textureLod(texpaint_undo, tex_coord, 0.0).r * 100;"); + node_shader_write(frag, "float h1 = textureLod(texpaint_undo, tex_coord + tex_dx, 0.0).r * 100;"); + node_shader_write(frag, "float h2 = textureLod(texpaint_undo, tex_coord + tex_dy, 0.0).r * 100;"); + node_shader_write(frag, "frag_color[0] = vec4((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) { frag.wposition = true; - node_shader_write(frag, "fragColor[0] = vec4(wposition * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);"); + node_shader_write(frag, "frag_color[0] = vec4(wposition * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);"); if (context_raw.bake_up_axis == bake_up_axis_t.Y) { - node_shader_write(frag, "fragColor[0].rgb = vec3(fragColor[0].r, fragColor[0].b, 1.0 - fragColor[0].g);"); + node_shader_write(frag, "frag_color[0].rgb = vec3(frag_color[0].r, frag_color[0].b, 1.0 - frag_color[0].g);"); } } else if (context_raw.bake_type == bake_type_t.TEXCOORD) { - node_shader_write(frag, "fragColor[0] = vec4(texCoord.xy, 0.0, 1.0);"); + node_shader_write(frag, "frag_color[0] = vec4(tex_coord.xy, 0.0, 1.0);"); } else if (context_raw.bake_type == bake_type_t.MATERIALID) { node_shader_add_uniform(frag, "sampler2D texpaint_nor_undo", "_texpaint_nor_undo"); - node_shader_write(frag, "float sample_matid = textureLod(texpaint_nor_undo, texCoord, 0.0).a + 1.0 / 255.0;"); + node_shader_write(frag, "float sample_matid = textureLod(texpaint_nor_undo, tex_coord, 0.0).a + 1.0 / 255.0;"); node_shader_write(frag, "float matid_r = fract(sin(dot(vec2(sample_matid, sample_matid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);"); node_shader_write(frag, "float matid_g = fract(sin(dot(vec2(sample_matid * 20.0, sample_matid), vec2(12.9898, 78.233))) * 43758.5453);"); node_shader_write(frag, "float matid_b = fract(sin(dot(vec2(sample_matid, sample_matid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);"); - node_shader_write(frag, "fragColor[0] = vec4(matid_r, matid_g, matid_b, 1.0);"); + node_shader_write(frag, "frag_color[0] = vec4(matid_r, matid_g, matid_b, 1.0);"); } else if (context_raw.bake_type == bake_type_t.OBJECTID) { - node_shader_add_uniform(frag, "float objectId", "_objectId"); - node_shader_write(frag, "float obid = objectId + 1.0 / 255.0;"); + node_shader_add_uniform(frag, "float object_id", "_object_id"); + node_shader_write(frag, "float obid = object_id + 1.0 / 255.0;"); node_shader_write(frag, "float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);"); node_shader_write(frag, "float id_g = fract(sin(dot(vec2(obid * 20.0, obid), vec2(12.9898, 78.233))) * 43758.5453);"); node_shader_write(frag, "float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);"); - node_shader_write(frag, "fragColor[0] = vec4(id_r, id_g, id_b, 1.0);"); + node_shader_write(frag, "frag_color[0] = vec4(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, "fragColor[0] = vec4(vcolor.r, vcolor.g, vcolor.b, 1.0);"); + node_shader_write(frag, "frag_color[0] = vec4(vcolor.r, vcolor.g, vcolor.b, 1.0);"); } else { - node_shader_write(frag, "fragColor[0] = vec4(1.0, 1.0, 1.0, 1.0);"); + node_shader_write(frag, "frag_color[0] = vec4(1.0, 1.0, 1.0, 1.0);"); } } } @@ -129,9 +129,9 @@ function make_bake_position_normal(vert: node_shader_t, frag: node_shader_t) { node_shader_write(vert, "normal = vec3(nor.xy, pos.w);"); node_shader_write(vert, "vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);"); node_shader_write(vert, "gl_Position = vec4(tpos, 0.0, 1.0);"); - node_shader_add_out(frag, "vec4 fragColor[2]"); - node_shader_write(frag, "fragColor[0] = vec4(position, 1.0);"); - node_shader_write(frag, "fragColor[1] = vec4(normal, 1.0);"); + node_shader_add_out(frag, "vec4 frag_color[2]"); + node_shader_write(frag, "frag_color[0] = vec4(position, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(normal, 1.0);"); } function make_bake_set_color_writes(con_paint: node_shader_context_t) { diff --git a/armorpaint/sources/make_blur.ts b/armorpaint/sources/make_blur.ts index f790ae6d..c7eb6bb1 100644 --- a/armorpaint/sources/make_blur.ts +++ b/armorpaint/sources/make_blur.ts @@ -1,9 +1,9 @@ function make_blur_run(vert: node_shader_t, frag: node_shader_t) { ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, sp.y * gbufferSize.y), 0).ba;"); + node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2(sp.x * gbuffer_size.x, sp.y * gbuffer_size.y), 0).ba;"); ///else - node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, (1.0 - sp.y) * gbufferSize.y), 0).ba;"); + node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2(sp.x * gbuffer_size.x, (1.0 - sp.y) * gbuffer_size.y), 0).ba;"); ///end node_shader_write(frag, "vec3 basecol = vec3(0.0, 0.0, 0.0);"); @@ -27,31 +27,31 @@ function make_blur_run(vert: node_shader_t, frag: node_shader_t) { node_shader_write(frag, "float subs = 0.0;"); } - node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); - node_shader_write(frag, "float blur_step = 1.0 / texpaintSize.x;"); + node_shader_add_uniform(frag, "vec2 texpaint_size", "_texpaint_size"); + node_shader_write(frag, "float blur_step = 1.0 / texpaint_size.x;"); if (context_raw.tool == workspace_tool_t.SMUDGE) { ///if (krom_direct3d11 || krom_direct3d12 || krom_metal) node_shader_write(frag, "const float blur_weight[7] = {1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0};"); ///else node_shader_write(frag, "const float blur_weight[7] = float[](1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0);"); ///end - node_shader_add_uniform(frag, "vec3 brushDirection", "_brushDirection"); - node_shader_write(frag, "vec2 blur_direction = brushDirection.yx;"); + node_shader_add_uniform(frag, "vec3 brush_direction", "_brush_direction"); + node_shader_write(frag, "vec2 blur_direction = brush_direction.yx;"); node_shader_write(frag, "for (int i = 0; i < 7; ++i) {"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, "vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (sp.y + blur_direction.y * blur_step * float(i)) * gbufferSize.y), 0).ba;"); + node_shader_write(frag, "vec2 tex_coord_inp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbuffer_size.x, (sp.y + blur_direction.y * blur_step * float(i)) * gbuffer_size.y), 0).ba;"); ///else - node_shader_write(frag, "vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (1.0 - (sp.y + blur_direction.y * blur_step * float(i))) * gbufferSize.y), 0).ba;"); + node_shader_write(frag, "vec2 tex_coord_inp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbuffer_size.x, (1.0 - (sp.y + blur_direction.y * blur_step * float(i))) * gbuffer_size.y), 0).ba;"); ///end - node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp2);"); + node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, tex_coord_inp2);"); node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[i];"); node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[i];"); - node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp2) * blur_weight[i];"); + node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, tex_coord_inp2) * blur_weight[i];"); node_shader_write(frag, "roughness += texpaint_pack_sample.g;"); node_shader_write(frag, "metallic += texpaint_pack_sample.b;"); node_shader_write(frag, "occlusion += texpaint_pack_sample.r;"); node_shader_write(frag, "height += texpaint_pack_sample.a;"); - node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp2).rgb * blur_weight[i];"); + node_shader_write(frag, "nortan += texture(texpaint_nor_undo, tex_coord_inp2).rgb * blur_weight[i];"); node_shader_write(frag, "}"); } else { @@ -62,28 +62,28 @@ function make_blur_run(vert: node_shader_t, frag: node_shader_t) { ///end // X node_shader_write(frag, "for (int i = -7; i <= 7; ++i) {"); - node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(blur_step * float(i), 0.0));"); + node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, tex_coord_inp + vec2(blur_step * float(i), 0.0));"); node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[i + 7];"); node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[i + 7];"); - node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(blur_step * float(i), 0.0)) * blur_weight[i + 7];"); + node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, tex_coord_inp + vec2(blur_step * float(i), 0.0)) * blur_weight[i + 7];"); node_shader_write(frag, "roughness += texpaint_pack_sample.g;"); node_shader_write(frag, "metallic += texpaint_pack_sample.b;"); node_shader_write(frag, "occlusion += texpaint_pack_sample.r;"); node_shader_write(frag, "height += texpaint_pack_sample.a;"); - node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp + vec2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];"); + node_shader_write(frag, "nortan += texture(texpaint_nor_undo, tex_coord_inp + vec2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];"); node_shader_write(frag, "}"); // Y node_shader_write(frag, "for (int j = -7; j <= 7; ++j) {"); - node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(0.0, blur_step * float(j)));"); + node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, tex_coord_inp + vec2(0.0, blur_step * float(j)));"); node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[j + 7];"); node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[j + 7];"); - node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(0.0, blur_step * float(j))) * blur_weight[j + 7];"); + node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, tex_coord_inp + vec2(0.0, blur_step * float(j))) * blur_weight[j + 7];"); node_shader_write(frag, "roughness += texpaint_pack_sample.g;"); node_shader_write(frag, "metallic += texpaint_pack_sample.b;"); node_shader_write(frag, "occlusion += texpaint_pack_sample.r;"); node_shader_write(frag, "height += texpaint_pack_sample.a;"); - node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp + vec2(0.0, blur_step * float(j))).rgb * blur_weight[j + 7];"); + node_shader_write(frag, "nortan += texture(texpaint_nor_undo, tex_coord_inp + vec2(0.0, blur_step * float(j))).rgb * blur_weight[j + 7];"); node_shader_write(frag, "}"); } - node_shader_write(frag, "opacity *= brushOpacity;"); + node_shader_write(frag, "opacity *= brush_opacity;"); } diff --git a/armorpaint/sources/make_brush.ts b/armorpaint/sources/make_brush.ts index b2b8a955..558672b1 100644 --- a/armorpaint/sources/make_brush.ts +++ b/armorpaint/sources/make_brush.ts @@ -10,7 +10,7 @@ function make_brush_run(vert: node_shader_t, frag: node_shader_t) { let fill_layer: bool = context_raw.layer.fill_layer != null; let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT; if (decal && !fill_layer) { - node_shader_write(frag, "if (decalMask.z > 0.0) {"); + node_shader_write(frag, "if (decal_mask.z > 0.0) {"); } if (config_raw.brush_3d) { @@ -36,12 +36,12 @@ function make_brush_run(vert: node_shader_t, frag: node_shader_t) { ///end node_shader_write(frag, "vec3 wn;"); node_shader_write(frag, "wn.z = 1.0 - abs(g0.x) - abs(g0.y);"); - node_shader_write(frag, "wn.xy = wn.z >= 0.0 ? g0.xy : octahedronWrap(g0.xy);"); + node_shader_write(frag, "wn.xy = wn.z >= 0.0 ? g0.xy : octahedron_wrap(g0.xy);"); node_shader_write(frag, "wn = normalize(wn);"); - node_shader_write(frag, "float planeDist = dot(wn, winp.xyz - wposition);"); + node_shader_write(frag, "float plane_dist = dot(wn, winp.xyz - wposition);"); if (config_raw.brush_angle_reject && !context_raw.xray) { - node_shader_write(frag, "if (planeDist < -0.01) discard;"); + node_shader_write(frag, "if (plane_dist < -0.01) discard;"); frag.n = true; let angle: f32 = context_raw.brush_angle_reject_dot; node_shader_write(frag, "if (dot(wn, n) < " + angle + ") discard;"); @@ -60,7 +60,7 @@ function make_brush_run(vert: node_shader_t, frag: node_shader_t) { node_shader_write(frag, "vec3 pa = wposition - winp.xyz;"); if (context_raw.xray) { - node_shader_write(frag, "pa += wn * vec3(planeDist, planeDist, planeDist);"); + node_shader_write(frag, "pa += wn * vec3(plane_dist, plane_dist, plane_dist);"); } node_shader_write(frag, "vec3 ba = winplast.xyz - winp.xyz;"); @@ -76,11 +76,11 @@ function make_brush_run(vert: node_shader_t, frag: node_shader_t) { } else { // !brush3d node_shader_write(frag, "vec2 binp = inp.xy * 2.0 - 1.0;"); - node_shader_write(frag, "binp.x *= aspectRatio;"); + node_shader_write(frag, "binp.x *= aspect_ratio;"); node_shader_write(frag, "binp = binp * 0.5 + 0.5;"); node_shader_write(frag, "vec2 binplast = inplast.xy * 2.0 - 1.0;"); - node_shader_write(frag, "binplast.x *= aspectRatio;"); + node_shader_write(frag, "binplast.x *= aspect_ratio;"); node_shader_write(frag, "binplast = binplast * 0.5 + 0.5;"); node_shader_write(frag, "vec2 pa = bsp.xy - binp.xy;"); @@ -89,7 +89,7 @@ function make_brush_run(vert: node_shader_t, frag: node_shader_t) { node_shader_write(frag, "dist = length(pa - ba * h);"); } - node_shader_write(frag, "if (dist > brushRadius) discard;"); + node_shader_write(frag, "if (dist > brush_radius) discard;"); if (decal && !fill_layer) { node_shader_write(frag, "}"); diff --git a/armorpaint/sources/make_clone.ts b/armorpaint/sources/make_clone.ts index 1e17ab6c..db688ae5 100644 --- a/armorpaint/sources/make_clone.ts +++ b/armorpaint/sources/make_clone.ts @@ -1,18 +1,18 @@ function make_clone_run(vert: node_shader_t, frag: node_shader_t) { - node_shader_add_uniform(frag, "vec2 cloneDelta", "_cloneDelta"); + node_shader_add_uniform(frag, "vec2 clone_delta", "_clone_delta"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.xy + cloneDelta) * gbufferSize), 0).ba;"); + node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2((sp.xy + clone_delta) * gbuffer_size), 0).ba;"); ///else - node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.x + cloneDelta.x) * gbufferSize.x, (1.0 - (sp.y + cloneDelta.y)) * gbufferSize.y), 0).ba;"); + node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2((sp.x + clone_delta.x) * gbuffer_size.x, (1.0 - (sp.y + clone_delta.y)) * gbuffer_size.y), 0).ba;"); ///end - node_shader_write(frag, "vec3 texpaint_pack_sample = textureLod(texpaint_pack_undo, texCoordInp, 0.0).rgb;"); - let base: string = "textureLod(texpaint_undo, texCoordInp, 0.0).rgb"; + node_shader_write(frag, "vec3 texpaint_pack_sample = textureLod(texpaint_pack_undo, tex_coord_inp, 0.0).rgb;"); + let base: string = "textureLod(texpaint_undo, tex_coord_inp, 0.0).rgb"; let rough: string = "texpaint_pack_sample.g"; let met: string = "texpaint_pack_sample.b"; let occ: string = "texpaint_pack_sample.r"; - let nortan: string = "textureLod(texpaint_nor_undo, texCoordInp, 0.0).rgb"; + let nortan: string = "textureLod(texpaint_nor_undo, tex_coord_inp, 0.0).rgb"; let height: string = "0.0"; let opac: string = "1.0"; node_shader_write(frag, "vec3 basecol = " + base + ";"); @@ -22,7 +22,7 @@ function make_clone_run(vert: node_shader_t, frag: node_shader_t) { node_shader_write(frag, "vec3 nortan = " + nortan + ";"); node_shader_write(frag, "float height = " + height + ";"); node_shader_write(frag, "float mat_opacity = " + opac + ";"); - node_shader_write(frag, "float opacity = mat_opacity * brushOpacity;"); + node_shader_write(frag, "float opacity = mat_opacity * brush_opacity;"); if (context_raw.material.paint_emis) { node_shader_write(frag, "float emis = 0.0;"); } diff --git a/armorpaint/sources/make_colorid_picker.ts b/armorpaint/sources/make_colorid_picker.ts index 97fc4709..faa7a0a6 100644 --- a/armorpaint/sources/make_colorid_picker.ts +++ b/armorpaint/sources/make_colorid_picker.ts @@ -4,40 +4,40 @@ function make_colorid_picker_run(vert: node_shader_t, frag: node_shader_t) { node_shader_write(vert, "gl_Position = vec4(-1.0 + float((gl_VertexID & 1) << 2), -1.0 + float((gl_VertexID & 2) << 1), 0.0, 1.0);"); node_shader_add_uniform(frag, "sampler2D gbuffer2"); - node_shader_add_uniform(frag, "vec2 gbufferSize", "_gbufferSize"); - node_shader_add_uniform(frag, "vec4 inp", "_inputBrush"); + node_shader_add_uniform(frag, "vec2 gbuffer_size", "_gbuffer_size"); + node_shader_add_uniform(frag, "vec4 inp", "_input_brush"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;"); + node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2(inp.x * gbuffer_size.x, inp.y * gbuffer_size.y), 0).ba;"); ///else - node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;"); + node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2(inp.x * gbuffer_size.x, (1.0 - inp.y) * gbuffer_size.y), 0).ba;"); ///end if (context_raw.tool == workspace_tool_t.COLORID) { - node_shader_add_out(frag, "vec4 fragColor"); + node_shader_add_out(frag, "vec4 frag_color"); node_shader_add_uniform(frag, "sampler2D texcolorid", "_texcolorid"); - node_shader_write(frag, "vec3 idcol = textureLod(texcolorid, texCoordInp, 0.0).rgb;"); - node_shader_write(frag, "fragColor = vec4(idcol, 1.0);"); + node_shader_write(frag, "vec3 idcol = textureLod(texcolorid, tex_coord_inp, 0.0).rgb;"); + node_shader_write(frag, "frag_color = vec4(idcol, 1.0);"); } else if (context_raw.tool == workspace_tool_t.PICKER || context_raw.tool == workspace_tool_t.MATERIAL) { if (context_raw.pick_pos_nor_tex) { - node_shader_add_out(frag, "vec4 fragColor[2]"); + node_shader_add_out(frag, "vec4 frag_color[2]"); node_shader_add_uniform(frag, "sampler2D gbufferD"); node_shader_add_uniform(frag, "mat4 invVP", "_inv_view_proj_matrix"); node_shader_add_function(frag, str_get_pos_from_depth); node_shader_add_function(frag, str_get_nor_from_depth); - node_shader_write(frag, "fragColor[0] = vec4(get_pos_from_depth(vec2(inp.x, 1.0 - inp.y), invVP, texturePass(gbufferD)), texCoordInp.x);"); - node_shader_write(frag, "fragColor[1] = vec4(get_nor_from_depth(fragColor[0].rgb, vec2(inp.x, 1.0 - inp.y), invVP, vec2(1.0, 1.0) / gbufferSize, texturePass(gbufferD)), texCoordInp.y);"); + node_shader_write(frag, "frag_color[0] = vec4(get_pos_from_depth(vec2(inp.x, 1.0 - inp.y), invVP, texturePass(gbufferD)), tex_coord_inp.x);"); + node_shader_write(frag, "frag_color[1] = vec4(get_nor_from_depth(frag_color[0].rgb, vec2(inp.x, 1.0 - inp.y), invVP, vec2(1.0, 1.0) / gbuffer_size, texturePass(gbufferD)), tex_coord_inp.y);"); } else { - node_shader_add_out(frag, "vec4 fragColor[4]"); + node_shader_add_out(frag, "vec4 frag_color[4]"); node_shader_add_uniform(frag, "sampler2D texpaint"); node_shader_add_uniform(frag, "sampler2D texpaint_nor"); node_shader_add_uniform(frag, "sampler2D texpaint_pack"); - node_shader_write(frag, "fragColor[0] = textureLod(texpaint, texCoordInp, 0.0);"); - node_shader_write(frag, "fragColor[1] = textureLod(texpaint_nor, texCoordInp, 0.0);"); - node_shader_write(frag, "fragColor[2] = textureLod(texpaint_pack, texCoordInp, 0.0);"); - node_shader_write(frag, "fragColor[3].rg = texCoordInp.xy;"); + node_shader_write(frag, "frag_color[0] = textureLod(texpaint, tex_coord_inp, 0.0);"); + node_shader_write(frag, "frag_color[1] = textureLod(texpaint_nor, tex_coord_inp, 0.0);"); + node_shader_write(frag, "frag_color[2] = textureLod(texpaint_pack, tex_coord_inp, 0.0);"); + node_shader_write(frag, "frag_color[3].rg = tex_coord_inp.xy;"); } } } diff --git a/armorpaint/sources/make_discard.ts b/armorpaint/sources/make_discard.ts index dcef2400..4932e751 100644 --- a/armorpaint/sources/make_discard.ts +++ b/armorpaint/sources/make_discard.ts @@ -3,7 +3,7 @@ function make_discard_color_id(vert: node_shader_t, frag: node_shader_t) { node_shader_add_uniform(frag, "sampler2D texpaint_colorid"); // 1x1 picker node_shader_add_uniform(frag, "sampler2D texcolorid", "_texcolorid"); // color map node_shader_write(frag, "vec3 colorid_c1 = texelFetch(texpaint_colorid, ivec2(0, 0), 0).rgb;"); - node_shader_write(frag, "vec3 colorid_c2 = textureLod(texcolorid, texCoordPick, 0).rgb;"); + node_shader_write(frag, "vec3 colorid_c2 = textureLod(texcolorid, tex_coord_pick, 0).rgb;"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal) node_shader_write(frag, "if (any(colorid_c1 != colorid_c2)) discard;"); ///else @@ -14,15 +14,15 @@ function make_discard_color_id(vert: node_shader_t, frag: node_shader_t) { function make_discard_face(vert: node_shader_t, frag: node_shader_t) { node_shader_add_uniform(frag, "sampler2D gbuffer2"); node_shader_add_uniform(frag, "sampler2D textrianglemap", "_textrianglemap"); - node_shader_add_uniform(frag, "vec2 textrianglemapSize", "_texpaintSize"); - node_shader_add_uniform(frag, "vec2 gbufferSize", "_gbufferSize"); + node_shader_add_uniform(frag, "vec2 textrianglemap_size", "_texpaint_size"); + node_shader_add_uniform(frag, "vec2 gbuffer_size", "_gbuffer_size"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, inp.y * gbufferSize.y), 0).ba;"); + node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2(inp.x * gbuffer_size.x, inp.y * gbuffer_size.y), 0).ba;"); ///else - node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;"); + node_shader_write(frag, "vec2 tex_coord_inp = texelFetch(gbuffer2, ivec2(inp.x * gbuffer_size.x, (1.0 - inp.y) * gbuffer_size.y), 0).ba;"); ///end - node_shader_write(frag, "vec4 face_c1 = texelFetch(textrianglemap, ivec2(texCoordInp * textrianglemapSize), 0);"); - node_shader_write(frag, "vec4 face_c2 = textureLod(textrianglemap, texCoordPick, 0);"); + node_shader_write(frag, "vec4 face_c1 = texelFetch(textrianglemap, ivec2(tex_coord_inp * textrianglemap_size), 0);"); + node_shader_write(frag, "vec4 face_c2 = textureLod(textrianglemap, tex_coord_pick, 0);"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal) node_shader_write(frag, "if (any(face_c1 != face_c2)) discard;"); ///else @@ -32,7 +32,7 @@ function make_discard_face(vert: node_shader_t, frag: node_shader_t) { function make_discard_uv_island(vert: node_shader_t, frag: node_shader_t) { node_shader_add_uniform(frag, "sampler2D texuvislandmap", "_texuvislandmap"); - node_shader_write(frag, "if (textureLod(texuvislandmap, texCoordPick, 0).r == 0.0) discard;"); + node_shader_write(frag, "if (textureLod(texuvislandmap, tex_coord_pick, 0).r == 0.0) discard;"); } function make_discard_material_id(vert: node_shader_t, frag: node_shader_t) { diff --git a/armorpaint/sources/make_material.ts b/armorpaint/sources/make_material.ts index 9e1c22db..588440bb 100644 --- a/armorpaint/sources/make_material.ts +++ b/armorpaint/sources/make_material.ts @@ -547,7 +547,7 @@ function make_material_get_displace_strength(): f32 { function make_material_voxelgi_half_extents(): string { let ext: f32 = context_raw.vxao_ext; - return "const vec3 voxelgiHalfExtents = vec3(" + ext + ", " + ext + ", " + ext + ");"; + return "const vec3 voxelgi_half_extents = vec3(" + ext + ", " + ext + ", " + ext + ");"; } function make_material_delete_context(c: shader_context_t) { diff --git a/armorpaint/sources/make_mesh.ts b/armorpaint/sources/make_mesh.ts index 90add853..3e06b4da 100644 --- a/armorpaint/sources/make_mesh.ts +++ b/armorpaint/sources/make_mesh.ts @@ -31,7 +31,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte let frag: node_shader_t = node_shader_context_make_frag(con_mesh); frag.ins = vert.outs; - node_shader_add_out(vert, "vec2 texCoord"); + node_shader_add_out(vert, "vec2 tex_coord"); frag.wvpposition = true; node_shader_add_out(vert, "vec4 prevwvpposition"); node_shader_add_uniform(vert, "mat4 VP", "_view_proj_matrix"); @@ -73,7 +73,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } node_shader_write(vert, "gl_Position = mul(vec4(wposition.xyz, 1.0), VP);"); - node_shader_write(vert, "texCoord = tex;"); + node_shader_write(vert, "tex_coord = tex;"); if (make_material_height_used && displace_strength > 0) { node_shader_add_uniform(vert, "mat4 invW", "_inv_world_matrix"); node_shader_write(vert, "prevwvpposition = mul(mul(vec4(wposition, 1.0), invW), prevWVP);"); @@ -82,16 +82,16 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write(vert, "prevwvpposition = mul(vec4(pos.xyz, 1.0), prevWVP);"); } - node_shader_add_out(frag, "vec4 fragColor[3]"); + node_shader_add_out(frag, "vec4 frag_color[3]"); frag.n = true; node_shader_add_function(frag, str_pack_float_int16); if (context_raw.tool == workspace_tool_t.COLORID) { texture_count++; node_shader_add_uniform(frag, "sampler2D texcolorid", "_texcolorid"); - node_shader_write(frag, "fragColor[0] = vec4(n.xy, 1.0, packFloatInt16(0.0, uint(0)));"); - node_shader_write(frag, "vec3 idcol = pow(textureLod(texcolorid, texCoord, 0.0).rgb, vec3(2.2, 2.2, 2.2));"); - node_shader_write(frag, "fragColor[1] = vec4(idcol.rgb, 1.0);"); // occ + node_shader_write(frag, "frag_color[0] = vec4(n.xy, 1.0, pack_f32_i16(0.0, uint(0)));"); + node_shader_write(frag, "vec3 idcol = pow(textureLod(texcolorid, tex_coord, 0.0).rgb, vec3(2.2, 2.2, 2.2));"); + node_shader_write(frag, "frag_color[1] = vec4(idcol.rgb, 1.0);"); // occ } else { node_shader_add_function(frag, str_octahedron_wrap); @@ -157,10 +157,10 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) { texture_count += 4; - node_shader_add_uniform(frag, "sampler2D senvmapBrdf", "$brdf.k"); - node_shader_add_uniform(frag, "sampler2D senvmapRadiance", "_envmap_radiance"); - node_shader_add_uniform(frag, "sampler2D sltcMat", "_ltcMat"); - node_shader_add_uniform(frag, "sampler2D sltcMag", "_ltcMag"); + node_shader_add_uniform(frag, "sampler2D senvmap_brdf", "$brdf.k"); + node_shader_add_uniform(frag, "sampler2D senvmap_radiance", "_envmap_radiance"); + node_shader_add_uniform(frag, "sampler2D sltc_mat", "_ltc_mat"); + node_shader_add_uniform(frag, "sampler2D sltc_mag", "_ltc_mag"); } // Get layers for this pass @@ -217,7 +217,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } node_shader_add_shared_sampler(frag, "sampler2D texpaint" + l.id); - node_shader_write(frag, "texpaint_sample = textureLodShared(texpaint" + l.id + ", texCoord, 0.0);"); + node_shader_write(frag, "texpaint_sample = textureLodShared(texpaint" + l.id + ", tex_coord, 0.0);"); node_shader_write(frag, "texpaint_opac = texpaint_sample.a;"); // ///if (krom_direct3d12 || krom_vulkan) // if (raw.viewportMode == ViewLit) { @@ -245,7 +245,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } node_shader_add_shared_sampler(frag, "sampler2D texpaint" + m.id); node_shader_write(frag, "{"); // Group mask is sampled across multiple layers - node_shader_write(frag, "float texpaint_mask_sample" + m.id + " = textureLodShared(texpaint" + m.id + ", texCoord, 0.0).r;"); + node_shader_write(frag, "float texpaint_mask_sample" + m.id + " = textureLodShared(texpaint" + m.id + ", tex_coord, 0.0).r;"); let opac: f32 = slot_layer_get_opacity(m); let mask: string = make_material_blend_mode_mask(frag, m.blending, texpaint_mask, "texpaint_mask_sample" + m.id, "float(" + opac + ")"); node_shader_write(frag, texpaint_mask + " = " + mask + ";"); @@ -271,7 +271,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (l.paint_nor || make_material_emis_used) { node_shader_add_shared_sampler(frag, "sampler2D texpaint_nor" + l.id); - node_shader_write(frag, "texpaint_nor_sample = textureLodShared(texpaint_nor" + l.id + ", texCoord, 0.0);"); + node_shader_write(frag, "texpaint_nor_sample = textureLodShared(texpaint_nor" + l.id + ", tex_coord, 0.0);"); if (make_material_emis_used) { node_shader_write(frag, "if (texpaint_opac > 0.0) matid = texpaint_nor_sample.a;"); @@ -294,7 +294,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (l.paint_occ || l.paint_rough || l.paint_met || (l.paint_height && make_material_height_used)) { node_shader_add_shared_sampler(frag, "sampler2D texpaint_pack" + l.id); - node_shader_write(frag, "texpaint_pack_sample = textureLodShared(texpaint_pack" + l.id + ", texCoord, 0.0);"); + node_shader_write(frag, "texpaint_pack_sample = textureLodShared(texpaint_pack" + l.id + ", tex_coord, 0.0);"); if (l.paint_occ) { node_shader_write(frag, "occlusion = mix(occlusion, texpaint_pack_sample.r, texpaint_opac);"); @@ -309,12 +309,12 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte let assign: string = l.paint_height_blend ? "+=" : "="; node_shader_write(frag, "height " + assign + " texpaint_pack_sample.a * texpaint_opac;"); node_shader_write(frag, "{"); - node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); - node_shader_write(frag, "float tex_step = 1.0 / texpaintSize.x;"); - node_shader_write(frag, "height0 " + assign + " textureLodShared(texpaint_pack" + l.id + ", vec2(texCoord.x - tex_step, texCoord.y), 0.0).a * texpaint_opac;"); - node_shader_write(frag, "height1 " + assign + " textureLodShared(texpaint_pack" + l.id + ", vec2(texCoord.x + tex_step, texCoord.y), 0.0).a * texpaint_opac;"); - node_shader_write(frag, "height2 " + assign + " textureLodShared(texpaint_pack" + l.id + ", vec2(texCoord.x, texCoord.y - tex_step), 0.0).a * texpaint_opac;"); - node_shader_write(frag, "height3 " + assign + " textureLodShared(texpaint_pack" + l.id + ", vec2(texCoord.x, texCoord.y + tex_step), 0.0).a * texpaint_opac;"); + node_shader_add_uniform(frag, "vec2 texpaint_size", "_texpaint_size"); + node_shader_write(frag, "float tex_step = 1.0 / texpaint_size.x;"); + node_shader_write(frag, "height0 " + assign + " textureLodShared(texpaint_pack" + l.id + ", vec2(tex_coord.x - tex_step, tex_coord.y), 0.0).a * texpaint_opac;"); + node_shader_write(frag, "height1 " + assign + " textureLodShared(texpaint_pack" + l.id + ", vec2(tex_coord.x + tex_step, tex_coord.y), 0.0).a * texpaint_opac;"); + node_shader_write(frag, "height2 " + assign + " textureLodShared(texpaint_pack" + l.id + ", vec2(tex_coord.x, tex_coord.y - tex_step), 0.0).a * texpaint_opac;"); + node_shader_write(frag, "height3 " + assign + " textureLodShared(texpaint_pack" + l.id + ", vec2(tex_coord.x, tex_coord.y + tex_step), 0.0).a * texpaint_opac;"); node_shader_write(frag, "}"); } } @@ -325,17 +325,17 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (last_pass && context_raw.draw_texels) { - node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); - node_shader_write(frag, "vec2 texel0 = texCoord * texpaintSize * 0.01;"); - node_shader_write(frag, "vec2 texel1 = texCoord * texpaintSize * 0.1;"); - node_shader_write(frag, "vec2 texel2 = texCoord * texpaintSize;"); + node_shader_add_uniform(frag, "vec2 texpaint_size", "_texpaint_size"); + node_shader_write(frag, "vec2 texel0 = tex_coord * texpaint_size * 0.01;"); + node_shader_write(frag, "vec2 texel1 = tex_coord * texpaint_size * 0.1;"); + node_shader_write(frag, "vec2 texel2 = tex_coord * texpaint_size;"); node_shader_write(frag, "basecol *= max(float(mod(int(texel0.x), 2.0) == mod(int(texel0.y), 2.0)), 0.9);"); node_shader_write(frag, "basecol *= max(float(mod(int(texel1.x), 2.0) == mod(int(texel1.y), 2.0)), 0.9);"); node_shader_write(frag, "basecol *= max(float(mod(int(texel2.x), 2.0) == mod(int(texel2.y), 2.0)), 0.9);"); } if (last_pass && context_raw.draw_wireframe) { - node_shader_write(frag, "basecol *= 1.0 - textureLod(texuvmap, texCoord, 0.0).r;"); + node_shader_write(frag, "basecol *= 1.0 - textureLod(texuvmap, tex_coord, 0.0).r;"); } if (make_material_height_used) { @@ -352,9 +352,9 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (!last_pass) { - node_shader_write(frag, "fragColor[0] = vec4(basecol, opacity);"); - node_shader_write(frag, "fragColor[1] = vec4(ntex, matid);"); - node_shader_write(frag, "fragColor[2] = vec4(occlusion, roughness, metallic, height);"); + node_shader_write(frag, "frag_color[0] = vec4(basecol, opacity);"); + node_shader_write(frag, "frag_color[1] = vec4(ntex, matid);"); + node_shader_write(frag, "frag_color[2] = vec4(occlusion, roughness, metallic, height);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; con_mesh.data.vertex_shader = node_shader_get(vert); @@ -364,9 +364,9 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte frag.vvec = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); + node_shader_write(frag, "mat3 TBN = cotangent_frame(n, vvec, tex_coord);"); ///else - node_shader_write(frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); + node_shader_write(frag, "mat3 TBN = cotangent_frame(n, -vvec, tex_coord);"); ///end node_shader_write(frag, "n = ntex * 2.0 - 1.0;"); node_shader_write(frag, "n.y = -n.y;"); @@ -377,118 +377,118 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.viewport_shader != null) { let color: string = context_raw.viewport_shader(frag); - node_shader_write(frag, "fragColor[1] = vec4(" + color + ", 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(" + color + ", 1.0);"); } else if (context_raw.render_mode == render_mode_t.FORWARD && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) { frag.wposition = true; node_shader_write(frag, "vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);"); node_shader_write(frag, "vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);"); frag.vvec = true; - node_shader_write(frag, "float dotNV = max(0.0, dot(n, vVec));"); - node_shader_write(frag, "vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(roughness, 1.0 - dotNV) * 256.0), 0).xy;"); - node_shader_add_uniform(frag, "int envmapNumMipmaps", "_envmap_num_mipmaps"); - node_shader_add_uniform(frag, "vec4 envmapData", "_envmapData"); // angle, sin(angle), cos(angle), strength - node_shader_write(frag, "vec3 wreflect = reflect(-vVec, n);"); - node_shader_write(frag, "float envlod = roughness * float(envmapNumMipmaps);"); + node_shader_write(frag, "float dotnv = max(0.0, dot(n, vvec));"); + node_shader_write(frag, "vec2 env_brdf = texelFetch(senvmap_brdf, ivec2(vec2(roughness, 1.0 - dotnv) * 256.0), 0).xy;"); + node_shader_add_uniform(frag, "int envmap_num_mipmaps", "_envmap_num_mipmaps"); + node_shader_add_uniform(frag, "vec4 envmap_data", "_envmap_data"); // angle, sin(angle), cos(angle), strength + node_shader_write(frag, "vec3 wreflect = reflect(-vvec, n);"); + node_shader_write(frag, "float envlod = roughness * float(envmap_num_mipmaps);"); node_shader_add_function(frag, str_envmap_equirect); - node_shader_write(frag, "vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect, envmapData.x), envlod).rgb;"); - node_shader_add_uniform(frag, "vec3 lightArea0", "_light_area0"); - node_shader_add_uniform(frag, "vec3 lightArea1", "_light_area1"); - node_shader_add_uniform(frag, "vec3 lightArea2", "_light_area2"); - node_shader_add_uniform(frag, "vec3 lightArea3", "_light_area3"); + node_shader_write(frag, "vec3 prefiltered_color = textureLod(senvmap_radiance, envmap_equirect(wreflect, envmap_data.x), envlod).rgb;"); + node_shader_add_uniform(frag, "vec3 light_area0", "_light_area0"); + node_shader_add_uniform(frag, "vec3 light_area1", "_light_area1"); + node_shader_add_uniform(frag, "vec3 light_area2", "_light_area2"); + node_shader_add_uniform(frag, "vec3 light_area3", "_light_area3"); node_shader_add_function(frag, str_ltc_evaluate); - node_shader_add_uniform(frag, "vec3 lightPos", "_point_pos"); - node_shader_add_uniform(frag, "vec3 lightColor", "_point_color"); - // write(frag, "float dotNL = max(dot(n, normalize(lightPos - wposition)), 0.0);"); - // write(frag, "vec3 direct = albedo * dotNL;"); - node_shader_write(frag, "float ldist = distance(wposition, lightPos);"); + node_shader_add_uniform(frag, "vec3 light_pos", "_point_pos"); + node_shader_add_uniform(frag, "vec3 light_color", "_point_color"); + // write(frag, "float dotnl = max(dot(n, normalize(light_pos - wposition)), 0.0);"); + // write(frag, "vec3 direct = albedo * dotnl;"); + node_shader_write(frag, "float ldist = distance(wposition, light_pos);"); node_shader_write(frag, "const float LUT_SIZE = 64.0;"); node_shader_write(frag, "const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;"); node_shader_write(frag, "const float LUT_BIAS = 0.5 / LUT_SIZE;"); - node_shader_write(frag, "float theta = acos(dotNV);"); + node_shader_write(frag, "float theta = acos(dotnv);"); node_shader_write(frag, "vec2 tuv = vec2(roughness, theta / (0.5 * 3.14159265));"); node_shader_write(frag, "tuv = tuv * LUT_SCALE + LUT_BIAS;"); - node_shader_write(frag, "vec4 t = textureLod(sltcMat, tuv, 0.0);"); + node_shader_write(frag, "vec4 t = textureLod(sltc_mat, tuv, 0.0);"); node_shader_write(frag, "mat3 minv = mat3(vec3(1.0, 0.0, t.y), vec3(0.0, t.z, 0.0), vec3(t.w, 0.0, t.x));"); - node_shader_write(frag, "float ltcspec = ltcEvaluate(n, vVec, dotNV, wposition, minv, lightArea0, lightArea1, lightArea2, lightArea3);"); - node_shader_write(frag, "ltcspec *= textureLod(sltcMag, tuv, 0.0).a;"); + node_shader_write(frag, "float ltcspec = ltc_evaluate(n, vvec, dotnv, wposition, minv, light_area0, light_area1, light_area2, light_area3);"); + node_shader_write(frag, "ltcspec *= textureLod(sltc_mag, tuv, 0.0).a;"); node_shader_write(frag, "mat3 mident = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);"); - node_shader_write(frag, "float ltcdiff = ltcEvaluate(n, vVec, dotNV, wposition, mident, lightArea0, lightArea1, lightArea2, lightArea3);"); + node_shader_write(frag, "float ltcdiff = ltc_evaluate(n, vvec, dotnv, wposition, mident, light_area0, light_area1, light_area2, light_area3);"); node_shader_write(frag, "vec3 direct = albedo * ltcdiff + ltcspec * 0.05;"); - node_shader_write(frag, "direct *= lightColor * (1.0 / (ldist * ldist));"); + node_shader_write(frag, "direct *= light_color * (1.0 / (ldist * ldist));"); node_shader_add_uniform(frag, "vec4 shirr[7]", "_envmap_irradiance"); node_shader_add_function(frag, str_sh_irradiance()); - node_shader_write(frag, "vec3 indirect = albedo * (shIrradiance(vec3(n.x * envmapData.z - n.y * envmapData.y, n.x * envmapData.y + n.y * envmapData.z, n.z), shirr) / 3.14159265);"); - node_shader_write(frag, "indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y) * 1.5;"); - node_shader_write(frag, "indirect *= envmapData.w * occlusion;"); - node_shader_write(frag, "fragColor[1] = vec4(direct + indirect, 1.0);"); + node_shader_write(frag, "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, "indirect += prefiltered_color * (f0 * env_brdf.x + env_brdf.y) * 1.5;"); + node_shader_write(frag, "indirect *= envmap_data.w * occlusion;"); + node_shader_write(frag, "frag_color[1] = vec4(direct + indirect, 1.0);"); } else { // Deferred, Pathtraced if (make_material_emis_used) { node_shader_write(frag, "if (int(matid * 255.0) % 3 == 1) basecol *= 10.0;"); // Boost for bloom } - node_shader_write(frag, "fragColor[1] = vec4(basecol, occlusion);"); + node_shader_write(frag, "frag_color[1] = vec4(basecol, occlusion);"); } } else if (context_raw.viewport_mode == viewport_mode_t.BASE_COLOR && context_raw.layer.paint_base) { - node_shader_write(frag, "fragColor[1] = vec4(basecol, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(basecol, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.NORMAL_MAP && context_raw.layer.paint_nor) { - node_shader_write(frag, "fragColor[1] = vec4(ntex.rgb, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(ntex.rgb, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OCCLUSION && context_raw.layer.paint_occ) { - node_shader_write(frag, "fragColor[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.ROUGHNESS && context_raw.layer.paint_rough) { - node_shader_write(frag, "fragColor[1] = vec4(vec3(roughness, roughness, roughness), 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(vec3(roughness, roughness, roughness), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.METALLIC && context_raw.layer.paint_met) { - node_shader_write(frag, "fragColor[1] = vec4(vec3(metallic, metallic, metallic), 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(vec3(metallic, metallic, metallic), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OPACITY && context_raw.layer.paint_opac) { - node_shader_write(frag, "fragColor[1] = vec4(vec3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(vec3(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, "fragColor[1] = vec4(vec3(height, height, height), 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(vec3(height, height, height), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.EMISSION) { node_shader_write(frag, "float emis = int(matid * 255.0) % 3 == 1 ? 1.0 : 0.0;"); - node_shader_write(frag, "fragColor[1] = vec4(vec3(emis, emis, emis), 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(vec3(emis, emis, emis), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.SUBSURFACE) { node_shader_write(frag, "float subs = int(matid * 255.0) % 3 == 2 ? 1.0 : 0.0;"); - node_shader_write(frag, "fragColor[1] = vec4(vec3(subs, subs, subs), 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(vec3(subs, subs, subs), 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.TEXCOORD) { - node_shader_write(frag, "fragColor[1] = vec4(texCoord, 0.0, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(tex_coord, 0.0, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) { frag.nattr = true; - node_shader_write(frag, "fragColor[1] = vec4(nAttr, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(nattr, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.MATERIAL_ID) { let id: i32 = context_raw.layer.id; node_shader_add_shared_sampler(frag, "sampler2D texpaint_nor" + id); - node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); - node_shader_write(frag, "float sample_matid = texelFetch(texpaint_nor" + id + ", ivec2(texCoord * texpaintSize), 0).a + 1.0 / 255.0;"); + node_shader_add_uniform(frag, "vec2 texpaint_size", "_texpaint_size"); + node_shader_write(frag, "float sample_matid = texelFetch(texpaint_nor" + id + ", ivec2(tex_coord * texpaint_size), 0).a + 1.0 / 255.0;"); node_shader_write(frag, "float matid_r = fract(sin(dot(vec2(sample_matid, sample_matid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);"); node_shader_write(frag, "float matid_g = fract(sin(dot(vec2(sample_matid * 20.0, sample_matid), vec2(12.9898, 78.233))) * 43758.5453);"); node_shader_write(frag, "float matid_b = fract(sin(dot(vec2(sample_matid, sample_matid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);"); - node_shader_write(frag, "fragColor[1] = vec4(matid_r, matid_g, matid_b, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(matid_r, matid_g, matid_b, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_ID) { - node_shader_add_uniform(frag, "float objectId", "_objectId"); - node_shader_write(frag, "float obid = objectId + 1.0 / 255.0;"); + node_shader_add_uniform(frag, "float object_id", "_object_id"); + node_shader_write(frag, "float obid = object_id + 1.0 / 255.0;"); node_shader_write(frag, "float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);"); node_shader_write(frag, "float id_g = fract(sin(dot(vec2(obid * 20.0, obid), vec2(12.9898, 78.233))) * 43758.5453);"); node_shader_write(frag, "float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);"); - node_shader_write(frag, "fragColor[1] = vec4(id_r, id_g, id_b, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(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)) { let id: i32 = context_raw.layer.id; - node_shader_write(frag, "float mask_view = textureLodShared(texpaint" + id + ", texCoord, 0.0).r;"); + node_shader_write(frag, "float mask_view = textureLodShared(texpaint" + id + ", tex_coord, 0.0).r;"); } else { node_shader_write(frag, "float mask_view = 0.0;"); @@ -497,30 +497,30 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (!slot_layer_is_visible(m)) { continue; } - node_shader_write(frag, "float mask_sample" + m.id + " = textureLodShared(texpaint_view_mask" + m.id + ", texCoord, 0.0).r;"); + node_shader_write(frag, "float mask_sample" + m.id + " = textureLodShared(texpaint_view_mask" + m.id + ", tex_coord, 0.0).r;"); let opac: f32 = slot_layer_get_opacity(m); let mask: string = make_material_blend_mode_mask(frag, m.blending, "mask_view", "mask_sample" + m.id, "float(" + opac + ")"); node_shader_write(frag, "mask_view = " + mask + ";"); } } - node_shader_write(frag, "fragColor[1] = vec4(mask_view, mask_view, mask_view, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(mask_view, mask_view, mask_view, 1.0);"); } else { - node_shader_write(frag, "fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);"); // Pink + node_shader_write(frag, "frag_color[1] = vec4(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, "fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));"); + node_shader_write(frag, "frag_color[1].rgb = pow(frag_color[1].rgb, vec3(2.2, 2.2, 2.2));"); } node_shader_write(frag, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); - node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);"); - node_shader_write(frag, "fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, uint(int(matid * 255.0) % 3)));"); + node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy);"); + node_shader_write(frag, "frag_color[0] = vec4(n.xy, roughness, pack_f32_i16(metallic, uint(int(matid * 255.0) % 3)));"); } node_shader_write(frag, "vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); node_shader_write(frag, "vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;"); - node_shader_write(frag, "fragColor[2] = vec4(posa - posb, texCoord.xy);"); + node_shader_write(frag, "frag_color[2] = vec4(posa - posb, 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 21c2cbd4..b1ef5020 100644 --- a/armorpaint/sources/make_mesh_preview.ts +++ b/armorpaint/sources/make_mesh_preview.ts @@ -39,16 +39,16 @@ 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(vert, str_get_skinning_dual_quat); - node_shader_add_uniform(vert, "vec4 skinBones[128 * 2]", "_skin_bones"); - node_shader_add_uniform(vert, "float posUnpack", "_pos_unpack"); - node_shader_write_attrib(vert, "vec4 skinA;"); - node_shader_write_attrib(vert, "vec4 skinB;"); - node_shader_write_attrib(vert, "getSkinningDualQuat(ivec4(bone * 32767), weight, skinA, skinB);"); + node_shader_add_uniform(vert, "vec4 skin_bones[128 * 2]", "_skin_bones"); + node_shader_add_uniform(vert, "float pos_unpack", "_pos_unpack"); + node_shader_write_attrib(vert, "vec4 skin_a;"); + node_shader_write_attrib(vert, "vec4 skin_b;"); + node_shader_write_attrib(vert, "get_skinning_dual_quat(ivec4(bone * 32767), weight, skin_a, skin_b);"); node_shader_write_attrib(vert, "vec3 spos = pos.xyz;"); - node_shader_write_attrib(vert, "spos.xyz *= posUnpack;"); - node_shader_write_attrib(vert, "spos.xyz += 2.0 * cross(skinA.xyz, cross(skinA.xyz, spos.xyz) + skinA.w * spos.xyz);"); - node_shader_write_attrib(vert, "spos.xyz += 2.0 * (skinA.w * skinB.xyz - skinB.w * skinA.xyz + cross(skinA.xyz, skinB.xyz));"); - node_shader_write_attrib(vert, "spos.xyz /= posUnpack;"); + node_shader_write_attrib(vert, "spos.xyz *= pos_unpack;"); + node_shader_write_attrib(vert, "spos.xyz += 2.0 * cross(skin_a.xyz, cross(skin_a.xyz, spos.xyz) + skin_a.w * spos.xyz);"); + node_shader_write_attrib(vert, "spos.xyz += 2.0 * (skin_a.w * skin_b.xyz - skin_b.w * skin_a.xyz + cross(skin_a.xyz, skin_b.xyz));"); + node_shader_write_attrib(vert, "spos.xyz /= pos_unpack;"); } ///end @@ -57,8 +57,8 @@ 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(vert, "vec2 texCoord"); - node_shader_write_attrib(vert, "texCoord = tex * float(" + brush_scale + ");"); + node_shader_add_out(vert, "vec2 tex_coord"); + node_shader_write_attrib(vert, "tex_coord = tex * float(" + brush_scale + ");"); let decal: bool = context_raw.decal_preview; parser_material_sample_keep_aspect = decal; @@ -88,16 +88,16 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no // write(vert, "float vheight = " + height + ";"); // add_out(vert, "float height"); // write(vert, "height = vheight;"); - // let displaceStrength: f32 = 0.1; - // if (heightUsed && displaceStrength > 0.0) { - // write(vert, "vec3 pos2 = " + pos + ".xyz + vec3(nor.xy, pos.w) * vec3(" + height + ", " + height + ", " + height + ") * vec3(" + displaceStrength + ", " + displaceStrength + ", " + displaceStrength + ");"); + // let displace_strength: f32 = 0.1; + // if (height_used && displace_strength > 0.0) { + // write(vert, "vec3 pos2 = " + pos + ".xyz + vec3(nor.xy, pos.w) * vec3(" + height + ", " + height + ", " + height + ") * vec3(" + displace_strength + ", " + displace_strength + ", " + displace_strength + ");"); // write(vert, "gl_Position = mul(vec4(pos2.xyz, 1.0), WVP);"); // } if (decal) { if (context_raw.tool == workspace_tool_t.TEXT) { node_shader_add_uniform(frag, "sampler2D textexttool", "_textexttool"); - node_shader_write(frag, "opacity *= textureLod(textexttool, texCoord / float(" + brush_scale + "), 0.0).r;"); + node_shader_write(frag, "opacity *= textureLod(textexttool, tex_coord / float(" + brush_scale + "), 0.0).r;"); } } if (decal) { @@ -105,7 +105,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no node_shader_write(frag, "if (opacity < " + opac + ") discard;"); } - node_shader_add_out(frag, "vec4 fragColor[3]"); + node_shader_add_out(frag, "vec4 frag_color[3]"); frag.n = true; node_shader_add_function(frag, str_pack_float_int16); @@ -132,9 +132,9 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no else { frag.vvec = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); + node_shader_write(frag, "mat3 TBN = cotangent_frame(n, vvec, tex_coord);"); ///else - node_shader_write(frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); + node_shader_write(frag, "mat3 TBN = cotangent_frame(n, -vvec, tex_coord);"); ///end node_shader_write(frag, "n = nortan * 2.0 - 1.0;"); node_shader_write(frag, "n.y = -n.y;"); @@ -142,24 +142,24 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no } node_shader_write(frag, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); - node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);"); + node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy);"); // uint matid = 0; if (decal) { - node_shader_write(frag, "fragColor[0] = vec4(n.x, n.y, roughness, packFloatInt16(metallic, uint(0)));"); // metallic/matid - node_shader_write(frag, "fragColor[1] = vec4(basecol, occlusion);"); + node_shader_write(frag, "frag_color[0] = vec4(n.x, n.y, roughness, pack_f32_i16(metallic, uint(0)));"); // metallic/matid + node_shader_write(frag, "frag_color[1] = vec4(basecol, occlusion);"); } else { - node_shader_write(frag, "fragColor[0] = vec4(n.x, n.y, mix(1.0, roughness, opacity), packFloatInt16(mix(1.0, metallic, opacity), uint(0)));"); // metallic/matid - node_shader_write(frag, "fragColor[1] = vec4(mix(vec3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); + node_shader_write(frag, "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, "frag_color[1] = vec4(mix(vec3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); } - node_shader_write(frag, "fragColor[2] = vec4(0.0, 0.0, 0.0, 0.0);"); // veloc + node_shader_write(frag, "frag_color[2] = vec4(0.0, 0.0, 0.0, 0.0);"); // veloc parser_material_finalize(con_mesh); ///if arm_skin if (skin) { - node_shader_write(vert, "wnormal = normalize(mul(vec3(nor.xy, pos.w) + 2.0 * cross(skinA.xyz, cross(skinA.xyz, vec3(nor.xy, pos.w)) + skinA.w * vec3(nor.xy, pos.w)), N));"); + node_shader_write(vert, "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));"); } ///end diff --git a/armorpaint/sources/make_node_preview.ts b/armorpaint/sources/make_node_preview.ts index 346f950d..b054b2bf 100644 --- a/armorpaint/sources/make_node_preview.ts +++ b/armorpaint/sources/make_node_preview.ts @@ -35,10 +35,10 @@ function make_node_preview_run(data: material_t, matcon: material_context_t, nod node_shader_write_attrib(vert, "gl_Position = vec4(pos.xy * 3.0, 0.0, 1.0);"); // Pos unpack node_shader_write_attrib(vert, "const vec2 madd = vec2(0.5, 0.5);"); - node_shader_add_out(vert, "vec2 texCoord"); - node_shader_write_attrib(vert, "texCoord = gl_Position.xy * madd + madd;"); + node_shader_add_out(vert, "vec2 tex_coord"); + node_shader_write_attrib(vert, "tex_coord = gl_Position.xy * madd + madd;"); ///if (!krom_opengl) - node_shader_write_attrib(vert, "texCoord.y = 1.0 - texCoord.y;"); + node_shader_write_attrib(vert, "tex_coord.y = 1.0 - tex_coord.y;"); ///end parser_material_init(); @@ -74,9 +74,9 @@ function make_node_preview_run(data: material_t, matcon: material_context_t, nod } array_remove(links, link); - node_shader_add_out(frag, "vec4 fragColor"); + node_shader_add_out(frag, "vec4 frag_color"); node_shader_write(frag, "vec3 basecol = " + res + ";"); - node_shader_write(frag, "fragColor = vec4(basecol.rgb, 1.0);"); + node_shader_write(frag, "frag_color = vec4(basecol.rgb, 1.0);"); // frag.ndcpos = true; // add_out(vert, "vec4 ndc"); diff --git a/armorpaint/sources/make_paint.ts b/armorpaint/sources/make_paint.ts index d4921e0c..4010c7e5 100644 --- a/armorpaint/sources/make_paint.ts +++ b/armorpaint/sources/make_paint.ts @@ -103,7 +103,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad 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(vert, "mat4 WVP", "_decalLayerMatrix"); + node_shader_add_uniform(vert, "mat4 WVP", "_decal_layer_matrix"); } else { node_shader_add_uniform(vert, "mat4 WVP", "_world_view_proj_matrix"); @@ -121,20 +121,20 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad frag.ndcpos = true; } - node_shader_add_uniform(frag, "vec4 inp", "_inputBrush"); - node_shader_add_uniform(frag, "vec4 inplast", "_inputBrushLast"); - node_shader_add_uniform(frag, "float aspectRatio", "_aspect_ratio_window"); + node_shader_add_uniform(frag, "vec4 inp", "_input_brush"); + node_shader_add_uniform(frag, "vec4 inplast", "_input_brush_last"); + node_shader_add_uniform(frag, "float aspect_ratio", "_aspect_ratio_window"); node_shader_write(frag, "vec2 bsp = sp.xy * 2.0 - 1.0;"); - node_shader_write(frag, "bsp.x *= aspectRatio;"); + node_shader_write(frag, "bsp.x *= aspect_ratio;"); node_shader_write(frag, "bsp = bsp * 0.5 + 0.5;"); node_shader_add_uniform(frag, "sampler2D gbufferD"); - node_shader_add_out(frag, "vec4 fragColor[4]"); + node_shader_add_out(frag, "vec4 frag_color[4]"); - node_shader_add_uniform(frag, "float brushRadius", "_brushRadius"); - node_shader_add_uniform(frag, "float brushOpacity", "_brushOpacity"); - node_shader_add_uniform(frag, "float brushHardness", "_brushHardness"); + node_shader_add_uniform(frag, "float brush_radius", "_brush_radius"); + node_shader_add_uniform(frag, "float brush_opacity", "_brush_opacity"); + node_shader_add_uniform(frag, "float brush_hardness", "_brush_hardness"); if (context_raw.tool == workspace_tool_t.BRUSH || context_raw.tool == workspace_tool_t.ERASER || @@ -176,7 +176,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write(frag, "vec2 g0 = textureLod(gbuffer0, inp.xy, 0.0).rg;"); node_shader_write(frag, "vec3 wn;"); node_shader_write(frag, "wn.z = 1.0 - abs(g0.x) - abs(g0.y);"); - node_shader_write(frag, "wn.xy = wn.z >= 0.0 ? g0.xy : octahedronWrap(g0.xy);"); + node_shader_write(frag, "wn.xy = wn.z >= 0.0 ? g0.xy : octahedron_wrap(g0.xy);"); node_shader_write(frag, "wn = normalize(wn);"); frag.n = true; let angle: f32 = context_raw.brush_angle_reject_dot; @@ -193,8 +193,8 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad } if (context_raw.colorid_picked || face_fill || uv_island_fill) { - node_shader_add_out(vert, "vec2 texCoordPick"); - node_shader_write(vert, "texCoordPick = tex;"); + node_shader_add_out(vert, "vec2 tex_coord_pick"); + node_shader_write(vert, "tex_coord_pick = tex;"); if (context_raw.colorid_picked) { make_discard_color_id(vert, frag); } @@ -214,7 +214,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad 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(frag, "sampler2D gbuffer2"); - node_shader_add_uniform(frag, "vec2 gbufferSize", "_gbufferSize"); + node_shader_add_uniform(frag, "vec2 gbuffer_size", "_gbuffer_size"); node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); node_shader_add_uniform(frag, "sampler2D texpaint_nor_undo", "_texpaint_nor_undo"); node_shader_add_uniform(frag, "sampler2D texpaint_pack_undo", "_texpaint_pack_undo"); @@ -234,7 +234,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad let uv_type: uv_type_t = context_raw.layer.fill_layer != null ? context_raw.layer.uv_type : context_raw.brush_paint; parser_material_triplanar = uv_type == uv_type_t.TRIPLANAR && !decal; parser_material_sample_keep_aspect = decal; - parser_material_sample_uv_scale = "brushScale"; + parser_material_sample_uv_scale = "brush_scale"; let sout: shader_out_t = parser_material_parse(ui_nodes_get_canvas_material(), con_paint, vert, frag, matcon); parser_material_parse_emission = false; parser_material_parse_subsurface = false; @@ -258,7 +258,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write(frag, "float mat_opacity = " + opac + ";"); node_shader_write(frag, "float opacity = mat_opacity;"); if (context_raw.layer.fill_layer == null) { - node_shader_write(frag, "opacity *= brushOpacity;"); + node_shader_write(frag, "opacity *= brush_opacity;"); } if (context_raw.material.paint_emis) { node_shader_write(frag, "float emis = " + emis + ";"); @@ -304,13 +304,13 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad context_raw.tool == workspace_tool_t.PARTICLE || decal)) { node_shader_add_uniform(frag, "sampler2D texbrushstencil", "_texbrushstencil"); - node_shader_add_uniform(frag, "vec4 stencilTransform", "_stencilTransform"); - node_shader_write(frag, "vec2 stencil_uv = vec2((sp.xy - stencilTransform.xy) / stencilTransform.z * vec2(aspectRatio, 1.0));"); + node_shader_add_uniform(frag, "vec4 stencil_transform", "_stencil_transform"); + node_shader_write(frag, "vec2 stencil_uv = vec2((sp.xy - stencil_transform.xy) / stencil_transform.z * vec2(aspect_ratio, 1.0));"); node_shader_write(frag, "vec2 stencil_size = vec2(textureSize(texbrushstencil, 0));"); node_shader_write(frag, "float stencil_ratio = stencil_size.y / stencil_size.x;"); node_shader_write(frag, "stencil_uv -= vec2(0.5 / stencil_ratio, 0.5);"); - node_shader_write(frag, "stencil_uv = vec2(stencil_uv.x * cos(stencilTransform.w) - stencil_uv.y * sin(stencilTransform.w),\ - stencil_uv.x * sin(stencilTransform.w) + stencil_uv.y * cos(stencilTransform.w));"); + node_shader_write(frag, "stencil_uv = vec2(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, "stencil_uv += vec2(0.5 / stencil_ratio, 0.5);"); node_shader_write(frag, "stencil_uv.x *= stencil_ratio;"); node_shader_write(frag, "if (stencil_uv.x < 0 || stencil_uv.x > 1 || stencil_uv.y < 0 || stencil_uv.y > 1) discard;"); @@ -326,20 +326,20 @@ 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(frag, "sampler2D texbrushmask", "_texbrushmask"); node_shader_write(frag, "vec2 binp_mask = inp.xy * 2.0 - 1.0;"); - node_shader_write(frag, "binp_mask.x *= aspectRatio;"); + node_shader_write(frag, "binp_mask.x *= aspect_ratio;"); node_shader_write(frag, "binp_mask = binp_mask * 0.5 + 0.5;"); node_shader_write(frag, "vec2 pa_mask = bsp.xy - binp_mask.xy;"); if (context_raw.brush_directional) { - node_shader_add_uniform(frag, "vec3 brushDirection", "_brushDirection"); - node_shader_write(frag, "if (brushDirection.z == 0.0) discard;"); - node_shader_write(frag, "pa_mask = vec2(pa_mask.x * brushDirection.x - pa_mask.y * brushDirection.y, pa_mask.x * brushDirection.y + pa_mask.y * brushDirection.x);"); + node_shader_add_uniform(frag, "vec3 brush_direction", "_brush_direction"); + node_shader_write(frag, "if (brush_direction.z == 0.0) discard;"); + node_shader_write(frag, "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);"); } let angle: f32 = context_raw.brush_angle + context_raw.brush_nodes_angle; if (angle != 0.0) { - node_shader_add_uniform(frag, "vec2 brushAngle", "_brushAngle"); - node_shader_write(frag, "pa_mask.xy = vec2(pa_mask.x * brushAngle.x - pa_mask.y * brushAngle.y, pa_mask.x * brushAngle.y + pa_mask.y * brushAngle.x);"); + node_shader_add_uniform(frag, "vec2 brush_angle", "_brush_angle"); + node_shader_write(frag, "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_write(frag, "pa_mask /= brushRadius;"); + node_shader_write(frag, "pa_mask /= brush_radius;"); if (config_raw.brush_3d) { node_shader_add_uniform(frag, "vec3 eye", "_camera_pos"); node_shader_write(frag, "pa_mask *= distance(eye, winp.xyz) / 1.5;"); @@ -360,7 +360,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad make_particle_mask(vert, frag); } else { // Brush cursor mask - node_shader_write(frag, "float str = clamp((brushRadius - dist) * brushHardness * 400.0, 0.0, 1.0) * opacity;"); + node_shader_write(frag, "float str = clamp((brush_radius - dist) * brush_hardness * 400.0, 0.0, 1.0) * opacity;"); } // Manual blending to preserve memory @@ -402,7 +402,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad let layered: bool = context_raw.layer != project_layers[0]; if (layered && !is_mask) { if (context_raw.tool == workspace_tool_t.ERASER) { - node_shader_write(frag, "fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); + node_shader_write(frag, "frag_color[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); node_shader_write(frag, "nortan = vec3(0.5, 0.5, 1.0);"); node_shader_write(frag, "occlusion = 1.0;"); node_shader_write(frag, "roughness = 0.0;"); @@ -410,17 +410,17 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad node_shader_write(frag, "matid = 0.0;"); } else if (context_raw.tool == workspace_tool_t.PARTICLE || decal || context_raw.brush_mask_image != null) { - node_shader_write(frag, "fragColor[0] = vec4(" + make_material_blend_mode(frag, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", max(str, sample_undo.a));"); + node_shader_write(frag, "frag_color[0] = vec4(" + make_material_blend_mode(frag, 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, "fragColor[0] = vec4(" + make_material_blend_mode(frag, context_raw.brush_blending, "sample_undo.rgb", "basecol", "opacity") + ", mat_opacity);"); + node_shader_write(frag, "frag_color[0] = vec4(" + make_material_blend_mode(frag, context_raw.brush_blending, "sample_undo.rgb", "basecol", "opacity") + ", mat_opacity);"); } else { - node_shader_write(frag, "fragColor[0] = vec4(" + make_material_blend_mode(frag, context_raw.brush_blending, "sample_undo.rgb", "basecol", "opacity") + ", max(str, sample_undo.a));"); + node_shader_write(frag, "frag_color[0] = vec4(" + make_material_blend_mode(frag, context_raw.brush_blending, "sample_undo.rgb", "basecol", "opacity") + ", max(str, sample_undo.a));"); } } - node_shader_write(frag, "fragColor[1] = vec4(nortan, matid);"); + node_shader_write(frag, "frag_color[1] = vec4(nortan, matid);"); let height: string = "0.0"; if (context_raw.material.paint_height && make_material_height_used) { @@ -430,34 +430,34 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad if (decal) { node_shader_add_uniform(frag, "sampler2D texpaint_pack_undo", "_texpaint_pack_undo"); node_shader_write(frag, "vec4 sample_pack_undo = textureLod(texpaint_pack_undo, sample_tc, 0.0);"); - node_shader_write(frag, "fragColor[2] = mix(sample_pack_undo, vec4(occlusion, roughness, metallic, " + height + "), str);"); + node_shader_write(frag, "frag_color[2] = mix(sample_pack_undo, vec4(occlusion, roughness, metallic, " + height + "), str);"); } else { - node_shader_write(frag, "fragColor[2] = vec4(occlusion, roughness, metallic, " + height + ");"); + node_shader_write(frag, "frag_color[2] = vec4(occlusion, roughness, metallic, " + height + ");"); } } else { if (context_raw.tool == workspace_tool_t.ERASER) { - node_shader_write(frag, "fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); - node_shader_write(frag, "fragColor[1] = vec4(0.5, 0.5, 1.0, 0.0);"); - node_shader_write(frag, "fragColor[2] = vec4(1.0, 0.0, 0.0, 0.0);"); + node_shader_write(frag, "frag_color[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);"); + node_shader_write(frag, "frag_color[1] = vec4(0.5, 0.5, 1.0, 0.0);"); + node_shader_write(frag, "frag_color[2] = vec4(1.0, 0.0, 0.0, 0.0);"); } else { node_shader_add_uniform(frag, "sampler2D texpaint_nor_undo", "_texpaint_nor_undo"); node_shader_add_uniform(frag, "sampler2D texpaint_pack_undo", "_texpaint_pack_undo"); node_shader_write(frag, "vec4 sample_nor_undo = textureLod(texpaint_nor_undo, sample_tc, 0.0);"); node_shader_write(frag, "vec4 sample_pack_undo = textureLod(texpaint_pack_undo, sample_tc, 0.0);"); - node_shader_write(frag, "fragColor[0] = vec4(" + make_material_blend_mode(frag, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", max(str, sample_undo.a));"); - node_shader_write(frag, "fragColor[1] = vec4(mix(sample_nor_undo.rgb, nortan, str), matid);"); + node_shader_write(frag, "frag_color[0] = vec4(" + make_material_blend_mode(frag, context_raw.brush_blending, "sample_undo.rgb", "basecol", "str") + ", max(str, sample_undo.a));"); + node_shader_write(frag, "frag_color[1] = vec4(mix(sample_nor_undo.rgb, nortan, str), matid);"); if (context_raw.material.paint_height && make_material_height_used) { - node_shader_write(frag, "fragColor[2] = mix(sample_pack_undo, vec4(occlusion, roughness, metallic, height), str);"); + node_shader_write(frag, "frag_color[2] = mix(sample_pack_undo, vec4(occlusion, roughness, metallic, height), str);"); } else { - node_shader_write(frag, "fragColor[2] = vec4(mix(sample_pack_undo.rgb, vec3(occlusion, roughness, metallic), str), 0.0);"); + node_shader_write(frag, "frag_color[2] = vec4(mix(sample_pack_undo.rgb, vec3(occlusion, roughness, metallic), str), 0.0);"); } } } - node_shader_write(frag, "fragColor[3] = vec4(str, 0.0, 0.0, 1.0);"); + node_shader_write(frag, "frag_color[3] = vec4(str, 0.0, 0.0, 1.0);"); if (!context_raw.material.paint_base) { con_paint.data.color_writes_red[0] = false; @@ -488,7 +488,7 @@ function make_paint_run(data: material_t, matcon: material_context_t): node_shad // Base color only as mask if (is_mask) { // TODO: Apply opacity into base - // write(frag, "fragColor[0].rgb *= fragColor[0].a;"); + // write(frag, "frag_color[0].rgb *= frag_color[0].a;"); con_paint.data.color_writes_green[0] = false; con_paint.data.color_writes_blue[0] = false; con_paint.data.color_writes_alpha[0] = false; diff --git a/armorpaint/sources/make_particle.ts b/armorpaint/sources/make_particle.ts index 6d0b5903..780081e6 100644 --- a/armorpaint/sources/make_particle.ts +++ b/armorpaint/sources/make_particle.ts @@ -22,10 +22,10 @@ function make_particle_run(data: material_t): node_shader_context_t { node_shader_write_attrib(vert, "vec4 spos = vec4(pos.xyz, 1.0);"); - node_shader_add_uniform(vert, "float brushRadius", "_brushRadius"); - node_shader_write_attrib(vert, "vec3 emitFrom = vec3(fhash(gl_InstanceID), fhash(gl_InstanceID * 2), fhash(gl_InstanceID * 3));"); - node_shader_write_attrib(vert, "emitFrom = emitFrom * brushRadius - brushRadius / 2.0;"); - node_shader_write_attrib(vert, "spos.xyz += emitFrom * vec3(256.0, 256.0, 256.0);"); + node_shader_add_uniform(vert, "float brush_radius", "_brush_radius"); + node_shader_write_attrib(vert, "vec3 emit_from = vec3(fhash(gl_InstanceID), fhash(gl_InstanceID * 2), fhash(gl_InstanceID * 3));"); + node_shader_write_attrib(vert, "emit_from = emit_from * brush_radius - brush_radius / 2.0;"); + node_shader_write_attrib(vert, "spos.xyz += emit_from * vec3(256.0, 256.0, 256.0);"); node_shader_add_uniform(vert, "mat4 pd", "_particle_data"); @@ -63,7 +63,7 @@ function make_particle_run(data: material_t): node_shader_context_t { node_shader_add_uniform(vert, "mat4 WVP", "_world_view_proj_matrix"); node_shader_write(vert, "gl_Position = mul(spos, WVP);"); - node_shader_add_uniform(vert, "vec4 inp", "_inputBrush"); + node_shader_add_uniform(vert, "vec4 inp", "_input_brush"); node_shader_write(vert, "vec2 binp = vec2(inp.x, 1.0 - inp.y);"); node_shader_write(vert, "binp = binp * 2.0 - 1.0;"); node_shader_write(vert, "binp *= gl_Position.w;"); @@ -72,14 +72,14 @@ function make_particle_run(data: material_t): node_shader_context_t { node_shader_add_out(vert, "float p_fade"); node_shader_write(vert, "p_fade = sin(min((p_age / 8.0) * 3.141592, 3.141592));"); - node_shader_add_out(frag, "float fragColor"); - node_shader_write(frag, "fragColor = p_fade;"); + node_shader_add_out(frag, "float frag_color"); + node_shader_write(frag, "frag_color = p_fade;"); // add_out(vert, "vec4 wvpposition"); // write(vert, "wvpposition = gl_Position;"); - // write(frag, "vec2 texCoord = wvpposition.xy / wvpposition.w;"); + // write(frag, "vec2 tex_coord = wvpposition.xy / wvpposition.w;"); // add_uniform(frag, "sampler2D gbufferD"); - // write(frag, "fragColor *= 1.0 - clamp(distance(textureLod(gbufferD, texCoord, 0.0).r, wvpposition.z), 0.0, 1.0);"); + // write(frag, "frag_color *= 1.0 - clamp(distance(textureLod(gbufferD, tex_coord, 0.0).r, wvpposition.z), 0.0, 1.0);"); // Material.finalize(con_part); con_part.data.shader_from_source = true; @@ -95,18 +95,18 @@ function make_particle_mask(vert: node_shader_t, frag: node_shader_t) { node_shader_add_out(vert, "vec4 wpos"); node_shader_add_uniform(vert, "mat4 W", "_world_matrix"); node_shader_write_attrib(vert, "wpos = mul(vec4(pos.xyz, 1.0), W);"); - node_shader_add_uniform(frag, "vec3 particleHit", "_particleHit"); - node_shader_add_uniform(frag, "vec3 particleHitLast", "_particleHitLast"); + node_shader_add_uniform(frag, "vec3 particle_hit", "_particle_hit"); + node_shader_add_uniform(frag, "vec3 particle_hit_last", "_particle_hit_last"); - node_shader_write(frag, "vec3 pa = wpos.xyz - particleHit;"); - node_shader_write(frag, "vec3 ba = particleHitLast - particleHit;"); + node_shader_write(frag, "vec3 pa = wpos.xyz - particle_hit;"); + node_shader_write(frag, "vec3 ba = particle_hit_last - particle_hit;"); node_shader_write(frag, "float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);"); node_shader_write(frag, "dist = length(pa - ba * h) * 10.0;"); - // write(frag, "dist = distance(particleHit, wpos.xyz) * 10.0;"); + // write(frag, "dist = distance(particle_hit, wpos.xyz) * 10.0;"); node_shader_write(frag, "if (dist > 1.0) discard;"); - node_shader_write(frag, "float str = clamp(pow(1.0 / dist * brushHardness * 0.2, 4.0), 0.0, 1.0) * opacity;"); - node_shader_write(frag, "if (particleHit.x == 0.0 && particleHit.y == 0.0 && particleHit.z == 0.0) str = 0.0;"); + node_shader_write(frag, "float str = clamp(pow(1.0 / dist * brush_hardness * 0.2, 4.0), 0.0, 1.0) * opacity;"); + node_shader_write(frag, "if (particle_hit.x == 0.0 && particle_hit.y == 0.0 && particle_hit.z == 0.0) str = 0.0;"); node_shader_write(frag, "if (str == 0.0) discard;"); return; } diff --git a/armorpaint/sources/make_texcoord.ts b/armorpaint/sources/make_texcoord.ts index a76d9592..afc4975a 100644 --- a/armorpaint/sources/make_texcoord.ts +++ b/armorpaint/sources/make_texcoord.ts @@ -8,89 +8,89 @@ function make_texcoord_run(vert: node_shader_t, frag: node_shader_t) { let uv_angle: f32 = fill_layer ? context_raw.layer.angle : angle; if (uv_type == uv_type_t.PROJECT || decal) { // TexCoords - project - node_shader_add_uniform(frag, "float brushScale", "_brushScale"); + node_shader_add_uniform(frag, "float brush_scale", "_brush_scale"); node_shader_write_attrib(frag, "vec2 uvsp = sp.xy;"); if (fill_layer) { // Decal layer node_shader_write_attrib(frag, "if (uvsp.x < 0.0 || uvsp.y < 0.0 || uvsp.x > 1.0 || uvsp.y > 1.0) discard;"); if (uv_angle != 0.0) { - node_shader_add_uniform(frag, "vec2 brushAngle", "_brushAngle"); - node_shader_write_attrib(frag, "uvsp = vec2(uvsp.x * brushAngle.x - uvsp.y * brushAngle.y, uvsp.x * brushAngle.y + uvsp.y * brushAngle.x);"); + node_shader_add_uniform(frag, "vec2 brush_angle", "_brush_angle"); + node_shader_write_attrib(frag, "uvsp = vec2(uvsp.x * brush_angle.x - uvsp.y * brush_angle.y, uvsp.x * brush_angle.y + uvsp.y * brush_angle.x);"); } frag.n = true; - node_shader_add_uniform(frag, "vec3 decalLayerNor", "_decalLayerNor"); + node_shader_add_uniform(frag, "vec3 decal_layer_nor", "_decal_layer_nor"); let dot_angle: f32 = context_raw.brush_angle_reject_dot; - node_shader_write(frag, "if (abs(dot(n, decalLayerNor) - 1.0) > " + dot_angle + ") discard;"); + node_shader_write(frag, "if (abs(dot(n, decal_layer_nor) - 1.0) > " + dot_angle + ") discard;"); frag.wposition = true; - node_shader_add_uniform(frag, "vec3 decalLayerLoc", "_decalLayerLoc"); - node_shader_add_uniform(frag, "float decalLayerDim", "_decalLayerDim"); - node_shader_write_attrib(frag, "if (abs(dot(decalLayerNor, decalLayerLoc - wposition)) > decalLayerDim) discard;"); + node_shader_add_uniform(frag, "vec3 decal_layer_loc", "_decal_layer_loc"); + node_shader_add_uniform(frag, "float decal_layer_dim", "_decal_layer_dim"); + node_shader_write_attrib(frag, "if (abs(dot(decal_layer_nor, decal_layer_loc - wposition)) > decal_layer_dim) discard;"); } else if (decal) { - node_shader_add_uniform(frag, "vec4 decalMask", "_decalMask"); - node_shader_write_attrib(frag, "uvsp -= decalMask.xy;"); - node_shader_write_attrib(frag, "uvsp.x *= aspectRatio;"); - node_shader_write_attrib(frag, "uvsp *= 0.21 / (decalMask.w * 0.9);"); // Decal radius + node_shader_add_uniform(frag, "vec4 decal_mask", "_decal_mask"); + node_shader_write_attrib(frag, "uvsp -= decal_mask.xy;"); + node_shader_write_attrib(frag, "uvsp.x *= aspect_ratio;"); + node_shader_write_attrib(frag, "uvsp *= 0.21 / (decal_mask.w * 0.9);"); // Decal radius if (context_raw.brush_directional) { - node_shader_add_uniform(frag, "vec3 brushDirection", "_brushDirection"); - node_shader_write_attrib(frag, "if (brushDirection.z == 0.0) discard;"); - node_shader_write_attrib(frag, "uvsp = vec2(uvsp.x * brushDirection.x - uvsp.y * brushDirection.y, uvsp.x * brushDirection.y + uvsp.y * brushDirection.x);"); + node_shader_add_uniform(frag, "vec3 brush_direction", "_brush_direction"); + node_shader_write_attrib(frag, "if (brush_direction.z == 0.0) discard;"); + node_shader_write_attrib(frag, "uvsp = vec2(uvsp.x * brush_direction.x - uvsp.y * brush_direction.y, uvsp.x * brush_direction.y + uvsp.y * brush_direction.x);"); } if (uv_angle != 0.0) { - node_shader_add_uniform(frag, "vec2 brushAngle", "_brushAngle"); - node_shader_write_attrib(frag, "uvsp = vec2(uvsp.x * brushAngle.x - uvsp.y * brushAngle.y, uvsp.x * brushAngle.y + uvsp.y * brushAngle.x);"); + node_shader_add_uniform(frag, "vec2 brush_angle", "_brush_angle"); + node_shader_write_attrib(frag, "uvsp = vec2(uvsp.x * brush_angle.x - uvsp.y * brush_angle.y, uvsp.x * brush_angle.y + uvsp.y * brush_angle.x);"); } - node_shader_add_uniform(frag, "float brushScaleX", "_brushScaleX"); - node_shader_write_attrib(frag, "uvsp.x *= brushScaleX;"); + node_shader_add_uniform(frag, "float brush_scale_x", "_brush_scale_x"); + node_shader_write_attrib(frag, "uvsp.x *= brush_scale_x;"); node_shader_write_attrib(frag, "uvsp += vec2(0.5, 0.5);"); node_shader_write_attrib(frag, "if (uvsp.x < 0.0 || uvsp.y < 0.0 || uvsp.x > 1.0 || uvsp.y > 1.0) discard;"); } else { - node_shader_write_attrib(frag, "uvsp.x *= aspectRatio;"); + node_shader_write_attrib(frag, "uvsp.x *= aspect_ratio;"); if (uv_angle != 0.0) { - node_shader_add_uniform(frag, "vec2 brushAngle", "_brushAngle"); - node_shader_write_attrib(frag, "uvsp = vec2(uvsp.x * brushAngle.x - uvsp.y * brushAngle.y, uvsp.x * brushAngle.y + uvsp.y * brushAngle.x);"); + node_shader_add_uniform(frag, "vec2 brush_angle", "_brush_angle"); + node_shader_write_attrib(frag, "uvsp = vec2(uvsp.x * brush_angle.x - uvsp.y * brush_angle.y, uvsp.x * brush_angle.y + uvsp.y * brush_angle.x);"); } } - node_shader_write_attrib(frag, "vec2 texCoord = uvsp * brushScale;"); + node_shader_write_attrib(frag, "vec2 tex_coord = uvsp * brush_scale;"); } else if (uv_type == uv_type_t.UVMAP) { // TexCoords - uvmap - node_shader_add_uniform(vert, "float brushScale", "_brushScale"); - node_shader_add_out(vert, "vec2 texCoord"); - node_shader_write(vert, "texCoord = tex * brushScale;"); + node_shader_add_uniform(vert, "float brush_scale", "_brush_scale"); + node_shader_add_out(vert, "vec2 tex_coord"); + node_shader_write(vert, "tex_coord = tex * brush_scale;"); if (uv_angle > 0.0) { - node_shader_add_uniform(vert, "vec2 brushAngle", "_brushAngle"); - node_shader_write(vert, "texCoord = vec2(texCoord.x * brushAngle.x - texCoord.y * brushAngle.y, texCoord.x * brushAngle.y + texCoord.y * brushAngle.x);"); + node_shader_add_uniform(vert, "vec2 brush_angle", "_brush_angle"); + node_shader_write(vert, "tex_coord = vec2(tex_coord.x * brush_angle.x - tex_coord.y * brush_angle.y, tex_coord.x * brush_angle.y + tex_coord.y * brush_angle.x);"); } } else { // TexCoords - triplanar frag.wposition = true; frag.n = true; - node_shader_add_uniform(frag, "float brushScale", "_brushScale"); - node_shader_write_attrib(frag, "vec3 triWeight = wnormal * wnormal;"); // n * n - node_shader_write_attrib(frag, "float triMax = max(triWeight.x, max(triWeight.y, triWeight.z));"); - node_shader_write_attrib(frag, "triWeight = max(triWeight - triMax * 0.75, 0.0);"); - node_shader_write_attrib(frag, "vec3 texCoordBlend = triWeight * (1.0 / (triWeight.x + triWeight.y + triWeight.z));"); - node_shader_write_attrib(frag, "vec2 texCoord = wposition.yz * brushScale * 0.5;"); - node_shader_write_attrib(frag, "vec2 texCoord1 = wposition.xz * brushScale * 0.5;"); - node_shader_write_attrib(frag, "vec2 texCoord2 = wposition.xy * brushScale * 0.5;"); + node_shader_add_uniform(frag, "float brush_scale", "_brush_scale"); + node_shader_write_attrib(frag, "vec3 tri_weight = wnormal * wnormal;"); // n * n + node_shader_write_attrib(frag, "float tri_max = max(tri_weight.x, max(tri_weight.y, tri_weight.z));"); + node_shader_write_attrib(frag, "tri_weight = max(tri_weight - tri_max * 0.75, 0.0);"); + node_shader_write_attrib(frag, "vec3 tex_coord_blend = tri_weight * (1.0 / (tri_weight.x + tri_weight.y + tri_weight.z));"); + node_shader_write_attrib(frag, "vec2 tex_coord = wposition.yz * brush_scale * 0.5;"); + node_shader_write_attrib(frag, "vec2 tex_coord1 = wposition.xz * brush_scale * 0.5;"); + node_shader_write_attrib(frag, "vec2 tex_coord2 = wposition.xy * brush_scale * 0.5;"); if (uv_angle != 0.0) { - node_shader_add_uniform(frag, "vec2 brushAngle", "_brushAngle"); - node_shader_write_attrib(frag, "texCoord = vec2(texCoord.x * brushAngle.x - texCoord.y * brushAngle.y, texCoord.x * brushAngle.y + texCoord.y * brushAngle.x);"); - node_shader_write_attrib(frag, "texCoord1 = vec2(texCoord1.x * brushAngle.x - texCoord1.y * brushAngle.y, texCoord1.x * brushAngle.y + texCoord1.y * brushAngle.x);"); - node_shader_write_attrib(frag, "texCoord2 = vec2(texCoord2.x * brushAngle.x - texCoord2.y * brushAngle.y, texCoord2.x * brushAngle.y + texCoord2.y * brushAngle.x);"); + node_shader_add_uniform(frag, "vec2 brush_angle", "_brush_angle"); + node_shader_write_attrib(frag, "tex_coord = vec2(tex_coord.x * brush_angle.x - tex_coord.y * brush_angle.y, tex_coord.x * brush_angle.y + tex_coord.y * brush_angle.x);"); + node_shader_write_attrib(frag, "tex_coord1 = vec2(tex_coord1.x * brush_angle.x - tex_coord1.y * brush_angle.y, tex_coord1.x * brush_angle.y + tex_coord1.y * brush_angle.x);"); + node_shader_write_attrib(frag, "tex_coord2 = vec2(tex_coord2.x * brush_angle.x - tex_coord2.y * brush_angle.y, tex_coord2.x * brush_angle.y + tex_coord2.y * brush_angle.x);"); } } } diff --git a/armorsculpt/assets/Scene.arm b/armorsculpt/assets/Scene.arm index c5b2d87728f387b862d16287513974c4ac240e2f..439231f6c392db5e605b8b9d36d4775bfe6d0009 100644 GIT binary patch delta 487 zcmbQDOmF4jvdK!NSdN0~$z0i$JyH2?qr delta 486 zcmbQy!#%x+d&3+d)>8}&4fdNC3Qb9aFefh*%H6!YGHr?kSmrh-0|P^Ga$-(ud`W5r zSZI2oJY&)J>3ob4Oa#QfOWTfXfQru#2I>^IM}{Xi!s+35-07-d5qhY^O$6;Kzs*>=`Jgn k>KIRLKfHpeRgeP|L%_HR-5$7$X&o0>hr@Q3qf8=<0K&1Eod5s; diff --git a/armorsculpt/shaders/layer_invert.frag.glsl b/armorsculpt/shaders/layer_invert.frag.glsl index 1212d313..27d7089f 100644 --- a/armorsculpt/shaders/layer_invert.frag.glsl +++ b/armorsculpt/shaders/layer_invert.frag.glsl @@ -2,10 +2,10 @@ uniform sampler2D tex; -in vec2 texCoord; +in vec2 tex_coord; in vec4 color; -out vec4 FragColor; +out vec4 frag_color; void main() { - FragColor = vec4(1.0) - textureLod(tex, texCoord, 0).rgba * color; + frag_color = vec4(1.0) - textureLod(tex, tex_coord, 0).rgba * color; } diff --git a/armorsculpt/shaders/layer_merge.frag.glsl b/armorsculpt/shaders/layer_merge.frag.glsl index 82aa629b..71e9e1ab 100644 --- a/armorsculpt/shaders/layer_merge.frag.glsl +++ b/armorsculpt/shaders/layer_merge.frag.glsl @@ -7,8 +7,8 @@ uniform sampler2D texa; uniform float opac; uniform int blending; -in vec2 texCoord; -out vec4 FragColor; +in vec2 tex_coord; +out vec4 frag_color; vec3 hsv_to_rgb(const vec3 c) { const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); @@ -26,94 +26,94 @@ vec3 rgb_to_hsv(const vec3 c) { } void main() { - vec4 col0 = textureLod(tex0, texCoord, 0); - vec4 cola = textureLod(texa, texCoord, 0); + vec4 col0 = textureLod(tex0, tex_coord, 0); + vec4 cola = textureLod(texa, tex_coord, 0); float str = col0.a * opac; - str *= textureLod(texmask, texCoord, 0).r; + str *= textureLod(texmask, tex_coord, 0).r; if (blending == -1) { // Merging _nor and _pack - vec4 col1 = textureLod(tex1, texCoord, 0); - FragColor = vec4(mix(cola, col1, str)); + vec4 col1 = textureLod(tex1, tex_coord, 0); + frag_color = vec4(mix(cola, col1, str)); } else if (blending == -2) { // Merging _nor with normal blending - vec4 col1 = textureLod(tex1, texCoord, 0); + vec4 col1 = textureLod(tex1, tex_coord, 0); // Whiteout blend vec3 n1 = cola.rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0); vec3 n2 = mix(vec3(0.5, 0.5, 1.0), col1.rgb, str) * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0); - FragColor = vec4(normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), max(col1.a, cola.a)); + frag_color = vec4(normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), max(col1.a, cola.a)); } else if (blending == -3) { // Merging _pack with height blending - vec4 col1 = textureLod(tex1, texCoord, 0); - FragColor = vec4(mix(cola.rgb, col1.rgb, str), cola.a + col1.a); + vec4 col1 = textureLod(tex1, tex_coord, 0); + frag_color = vec4(mix(cola.rgb, col1.rgb, str), cola.a + col1.a); } else if (blending == -4) { // Merge _pack.height into _nor float tex_step = 1.0 / textureSize(tex1, 0).x; - float height0 = textureLod(tex1, vec2(texCoord.x - tex_step, texCoord.y), 0.0).a; - float height1 = textureLod(tex1, vec2(texCoord.x + tex_step, texCoord.y), 0.0).a; - float height2 = textureLod(tex1, vec2(texCoord.x, texCoord.y - tex_step), 0.0).a; - float height3 = textureLod(tex1, vec2(texCoord.x, texCoord.y + tex_step), 0.0).a; + float height0 = textureLod(tex1, vec2(tex_coord.x - tex_step, tex_coord.y), 0.0).a; + float height1 = textureLod(tex1, vec2(tex_coord.x + tex_step, tex_coord.y), 0.0).a; + float height2 = textureLod(tex1, vec2(tex_coord.x, tex_coord.y - tex_step), 0.0).a; + float height3 = textureLod(tex1, vec2(tex_coord.x, tex_coord.y + tex_step), 0.0).a; float height_dx = height0 - height1; float height_dy = height2 - height3; // Whiteout blend vec3 n1 = col0.rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0); vec3 n2 = normalize(vec3(height_dx * 16.0, height_dy * 16.0, 1.0)); - FragColor = vec4(normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), col0.a); + frag_color = vec4(normalize(vec3(n1.xy + n2.xy, n1.z * n2.z)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), col0.a); } else if (blending == 0) { // Mix - FragColor = vec4(mix(cola.rgb, col0.rgb, str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, col0.rgb, str), max(col0.a, cola.a)); } else if (blending == 1) { // Darken - FragColor = vec4(mix(cola.rgb, min(cola.rgb, col0.rgb), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, min(cola.rgb, col0.rgb), str), max(col0.a, cola.a)); } else if (blending == 2) { // Multiply - FragColor = vec4(mix(cola.rgb, cola.rgb * col0.rgb, str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, cola.rgb * col0.rgb, str), max(col0.a, cola.a)); } else if (blending == 3) { // Burn - FragColor = vec4(mix(cola.rgb, vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - cola.rgb) / col0.rgb, str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - cola.rgb) / col0.rgb, str), max(col0.a, cola.a)); } else if (blending == 4) { // Lighten - FragColor = vec4(max(cola.rgb, col0.rgb * str), max(col0.a, cola.a)); + frag_color = vec4(max(cola.rgb, col0.rgb * str), max(col0.a, cola.a)); } else if (blending == 5) { // Screen - FragColor = vec4((vec3(1.0, 1.0, 1.0) - (vec3(1.0 - str, 1.0 - str, 1.0 - str) + str * (vec3(1.0, 1.0, 1.0) - col0.rgb)) * (vec3(1.0, 1.0, 1.0) - cola.rgb)), max(col0.a, cola.a)); + frag_color = vec4((vec3(1.0, 1.0, 1.0) - (vec3(1.0 - str, 1.0 - str, 1.0 - str) + str * (vec3(1.0, 1.0, 1.0) - col0.rgb)) * (vec3(1.0, 1.0, 1.0) - cola.rgb)), max(col0.a, cola.a)); } else if (blending == 6) { // Dodge - FragColor = vec4(mix(cola.rgb, cola.rgb / (vec3(1.0, 1.0, 1.0) - col0.rgb), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, cola.rgb / (vec3(1.0, 1.0, 1.0) - col0.rgb), str), max(col0.a, cola.a)); } else if (blending == 7) { // Add - FragColor = vec4(mix(cola.rgb, cola.rgb + col0.rgb, str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, cola.rgb + col0.rgb, str), max(col0.a, cola.a)); } else if (blending == 8) { // Overlay - FragColor = vec4(mix(cola.rgb, vec3( + frag_color = vec4(mix(cola.rgb, vec3( cola.r < 0.5 ? 2.0 * cola.r * col0.r : 1.0 - 2.0 * (1.0 - cola.r) * (1.0 - col0.r), cola.g < 0.5 ? 2.0 * cola.g * col0.g : 1.0 - 2.0 * (1.0 - cola.g) * (1.0 - col0.g), cola.b < 0.5 ? 2.0 * cola.b * col0.b : 1.0 - 2.0 * (1.0 - cola.b) * (1.0 - col0.b) ), str), max(col0.a, cola.a)); } else if (blending == 9) { // Soft Light - FragColor = vec4(((1.0 - str) * cola.rgb + str * ((vec3(1.0, 1.0, 1.0) - cola.rgb) * col0.rgb * cola.rgb + cola.rgb * (vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - col0.rgb) * (vec3(1.0, 1.0, 1.0) - cola.rgb)))), max(col0.a, cola.a)); + frag_color = vec4(((1.0 - str) * cola.rgb + str * ((vec3(1.0, 1.0, 1.0) - cola.rgb) * col0.rgb * cola.rgb + cola.rgb * (vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - col0.rgb) * (vec3(1.0, 1.0, 1.0) - cola.rgb)))), max(col0.a, cola.a)); } else if (blending == 10) { // Linear Light - FragColor = vec4((cola.rgb + str * (vec3(2.0, 2.0, 2.0) * (col0.rgb - vec3(0.5, 0.5, 0.5)))), max(col0.a, cola.a)); + frag_color = vec4((cola.rgb + str * (vec3(2.0, 2.0, 2.0) * (col0.rgb - vec3(0.5, 0.5, 0.5)))), max(col0.a, cola.a)); } else if (blending == 11) { // Difference - FragColor = vec4(mix(cola.rgb, abs(cola.rgb - col0.rgb), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, abs(cola.rgb - col0.rgb), str), max(col0.a, cola.a)); } else if (blending == 12) { // Subtract - FragColor = vec4(mix(cola.rgb, cola.rgb - col0.rgb, str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, cola.rgb - col0.rgb, str), max(col0.a, cola.a)); } else if (blending == 13) { // Divide - FragColor = vec4(vec3(1.0 - str, 1.0 - str, 1.0 - str) * cola.rgb + vec3(str, str, str) * cola.rgb / col0.rgb, max(col0.a, cola.a)); + frag_color = vec4(vec3(1.0 - str, 1.0 - str, 1.0 - str) * cola.rgb + vec3(str, str, str) * cola.rgb / col0.rgb, max(col0.a, cola.a)); } else if (blending == 14) { // Hue - FragColor = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(col0.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(col0.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a)); } else if (blending == 15) { // Saturation - FragColor = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(col0.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(col0.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a)); } else if (blending == 16) { // Color - FragColor = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(col0.rgb).r, rgb_to_hsv(col0.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(col0.rgb).r, rgb_to_hsv(col0.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a)); } else { // Value - FragColor = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(col0.rgb).b)), str), max(col0.a, cola.a)); + frag_color = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(col0.rgb).b)), str), max(col0.a, cola.a)); } } diff --git a/armorsculpt/shaders/layer_view.frag.glsl b/armorsculpt/shaders/layer_view.frag.glsl index 40781583..146a81dc 100644 --- a/armorsculpt/shaders/layer_view.frag.glsl +++ b/armorsculpt/shaders/layer_view.frag.glsl @@ -3,29 +3,29 @@ uniform sampler2D tex; uniform int channel; -in vec2 texCoord; +in vec2 tex_coord; in vec4 color; -out vec4 FragColor; +out vec4 frag_color; void main() { if (channel == 1) { - FragColor = textureLod(tex, texCoord, 0).rrra * color; + frag_color = textureLod(tex, tex_coord, 0).rrra * color; } else if (channel == 2) { - FragColor = textureLod(tex, texCoord, 0).ggga * color; + frag_color = textureLod(tex, tex_coord, 0).ggga * color; } else if (channel == 3) { - FragColor = textureLod(tex, texCoord, 0).bbba * color; + frag_color = textureLod(tex, tex_coord, 0).bbba * color; } else if (channel == 4) { - FragColor = textureLod(tex, texCoord, 0).aaaa * color; + frag_color = textureLod(tex, tex_coord, 0).aaaa * color; } else if (channel == 5) { - FragColor = textureLod(tex, texCoord, 0).rgba * color; + frag_color = textureLod(tex, tex_coord, 0).rgba * color; } else { - vec4 tex_sample = textureLod(tex, texCoord, 0).rgba; + vec4 tex_sample = textureLod(tex, tex_coord, 0).rgba; tex_sample.rgb *= tex_sample.a; - FragColor = tex_sample * color; + frag_color = tex_sample * color; } } diff --git a/armorsculpt/shaders/mask_merge.frag.glsl b/armorsculpt/shaders/mask_merge.frag.glsl index 1b593590..ac5fa94c 100644 --- a/armorsculpt/shaders/mask_merge.frag.glsl +++ b/armorsculpt/shaders/mask_merge.frag.glsl @@ -5,58 +5,58 @@ uniform sampler2D texa; uniform float opac; uniform int blending; -in vec2 texCoord; -out vec4 FragColor; +in vec2 tex_coord; +out vec4 frag_color; void main() { - float col0 = textureLod(tex0, texCoord, 0).r; - float cola = textureLod(texa, texCoord, 0).r; + float col0 = textureLod(tex0, tex_coord, 0).r; + float cola = textureLod(texa, tex_coord, 0).r; float str = opac; - float outColor = 0.0; + float out_color = 0.0; if (blending == 0) { // Mix - outColor = mix(cola, col0, str); + out_color = mix(cola, col0, str); } else if (blending == 1) { // Darken - outColor = mix(cola, min(cola, col0), str); + out_color = mix(cola, min(cola, col0), str); } else if (blending == 2) { // Multiply - outColor = mix(cola, cola * col0, str); + out_color = mix(cola, cola * col0, str); } else if (blending == 3) { // Burn - outColor = mix(cola, 1.0 - (1.0 - cola) / col0, str); + out_color = mix(cola, 1.0 - (1.0 - cola) / col0, str); } else if (blending == 4) { // Lighten - outColor = max(cola, col0 * str); + out_color = max(cola, col0 * str); } else if (blending == 5) { // Screen - outColor = (1.0 - ((1.0 - str) + str * (1.0 - col0)) * (1.0 - cola)); + out_color = (1.0 - ((1.0 - str) + str * (1.0 - col0)) * (1.0 - cola)); } else if (blending == 6) { // Dodge - outColor = mix(cola, cola / (1.0 - col0), str); + out_color = mix(cola, cola / (1.0 - col0), str); } else if (blending == 7) { // Add - outColor = mix(cola, cola + col0, str); + out_color = mix(cola, cola + col0, str); } else if (blending == 8) { // Overlay - outColor = mix(cola, cola < 0.5 ? 2.0 * cola * col0 : 1.0 - 2.0 * (1.0 - cola) * (1.0 - col0), str); + out_color = mix(cola, cola < 0.5 ? 2.0 * cola * col0 : 1.0 - 2.0 * (1.0 - cola) * (1.0 - col0), str); } else if (blending == 9) { // Soft Light - outColor = ((1.0 - str) * cola + str * ((1.0 - cola) * col0 * cola + cola * (1.0 - (1.0 - col0) * (1.0 - cola)))); + out_color = ((1.0 - str) * cola + str * ((1.0 - cola) * col0 * cola + cola * (1.0 - (1.0 - col0) * (1.0 - cola)))); } else if (blending == 10) { // Linear Light - outColor = (cola + str * (2.0 * (col0 - 0.5))); + out_color = (cola + str * (2.0 * (col0 - 0.5))); } else if (blending == 11) { // Difference - outColor = mix(cola, abs(cola - col0), str); + out_color = mix(cola, abs(cola - col0), str); } else if (blending == 12) { // Subtract - outColor = mix(cola, cola - col0, str); + out_color = mix(cola, cola - col0, str); } else if (blending == 13) { // Divide - outColor = (1.0 - str) * cola + str * cola / col0; + out_color = (1.0 - str) * cola + str * cola / col0; } else { // Hue, Saturation, Color, Value - outColor = mix(cola, col0, str); + out_color = mix(cola, col0, str); } - FragColor = vec4(outColor, outColor, outColor, 1.0); + frag_color = vec4(out_color, out_color, out_color, 1.0); } diff --git a/armorsculpt/shaders/mesh_posnor.frag.glsl b/armorsculpt/shaders/mesh_posnor.frag.glsl index 0a24e7e1..d42dc8b9 100644 --- a/armorsculpt/shaders/mesh_posnor.frag.glsl +++ b/armorsculpt/shaders/mesh_posnor.frag.glsl @@ -5,7 +5,7 @@ in vec3 wnormal; in vec4 wvpposition; in vec4 prevwvpposition; -out vec4 fragColor[3]; +out vec4 frag_color[3]; void main() { vec3 n = normalize(wnormal); @@ -14,11 +14,11 @@ void main() { float metallic = 0.0; float occlusion = 1.0; n /= (abs(n.x) + abs(n.y) + abs(n.z)); - n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy); + n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy); uint matid = 0; - fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, matid)); - fragColor[1] = vec4(basecol, occlusion); + frag_color[0] = vec4(n.xy, roughness, pack_f32_i16(metallic, matid)); + frag_color[1] = vec4(basecol, occlusion); vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5; vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5; - fragColor[2].rg = vec2(posa - posb); + frag_color[2].rg = vec2(posa - posb); } diff --git a/armorsculpt/sources/make_brush.ts b/armorsculpt/sources/make_brush.ts index 741e6968..6c11f095 100644 --- a/armorsculpt/sources/make_brush.ts +++ b/armorsculpt/sources/make_brush.ts @@ -17,7 +17,7 @@ function make_brush_run(vert: node_shader_t, frag: node_shader_t) { node_shader_add_uniform(frag, "mat4 W", "_world_matrix"); - node_shader_write_attrib(frag, "vec3 wposition = mul(texelFetch(texpaint_undo, ivec2(texCoord.x * textureSize(texpaint_undo, 0).x, texCoord.y * textureSize(texpaint_undo, 0).y), 0), W).xyz;"); + node_shader_write_attrib(frag, "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;"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) node_shader_write(frag, "float depthlast = textureLod(gbufferD, inplast.xy, 0.0).r;"); @@ -32,5 +32,5 @@ function make_brush_run(vert: node_shader_t, frag: node_shader_t) { node_shader_write(frag, "dist = distance(wposition, winp.xyz);"); } - node_shader_write(frag, "if (dist > brushRadius) discard;"); + node_shader_write(frag, "if (dist > brush_radius) discard;"); } diff --git a/armorsculpt/sources/make_material.ts b/armorsculpt/sources/make_material.ts index 5e5be9fb..9580a974 100644 --- a/armorsculpt/sources/make_material.ts +++ b/armorsculpt/sources/make_material.ts @@ -368,7 +368,7 @@ function make_material_get_displace_strength(): f32 { function make_material_voxelgi_half_extents(): string { let ext = context_raw.vxao_ext; - return "const vec3 voxelgiHalfExtents = vec3(" + ext + ", " + ext + ", " + ext + ");"; + return "const vec3 voxelgi_half_extents = vec3(" + ext + ", " + ext + ", " + ext + ");"; } function make_material_delete_context(c: shader_context_t) { diff --git a/armorsculpt/sources/make_mesh.ts b/armorsculpt/sources/make_mesh.ts index a21aff56..1b4af64c 100644 --- a/armorsculpt/sources/make_mesh.ts +++ b/armorsculpt/sources/make_mesh.ts @@ -23,7 +23,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte let frag = node_shader_context_make_frag(con_mesh); frag.ins = vert.outs; - node_shader_add_out(vert, "vec2 texCoord"); + node_shader_add_out(vert, "vec2 tex_coord"); frag.wvpposition = true; node_shader_add_out(vert, "vec4 prevwvpposition"); node_shader_add_uniform(vert, "mat4 VP", "_view_proj_matrix"); @@ -38,21 +38,21 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte // + pos.xyz * 0.000001 node_shader_write(vert, "gl_Position = mul(vec4(meshpos.xyz, 1.0), WVP);"); - node_shader_write(vert, "texCoord = vec2(0.0, 0.0);"); + node_shader_write(vert, "tex_coord = vec2(0.0, 0.0);"); node_shader_write(vert, "prevwvpposition = mul(vec4(pos.xyz, 1.0), prevWVP);"); - node_shader_add_out(frag, "vec4 fragColor[3]"); + node_shader_add_out(frag, "vec4 frag_color[3]"); node_shader_add_uniform(vert, "mat3 N", "_normal_matrix"); node_shader_add_out(vert, "vec3 wnormal"); - node_shader_write_attrib(vert, "int baseVertex0 = gl_VertexID - (gl_VertexID % 3);"); - node_shader_write_attrib(vert, "int baseVertex1 = baseVertex0 + 1;"); - node_shader_write_attrib(vert, "int baseVertex2 = baseVertex0 + 2;"); - node_shader_write_attrib(vert, "vec3 meshpos0 = texelFetch(texpaint_vert, ivec2(baseVertex0 % textureSize(texpaint_vert, 0).x, baseVertex0 / textureSize(texpaint_vert, 0).y), 0).xyz;"); - node_shader_write_attrib(vert, "vec3 meshpos1 = texelFetch(texpaint_vert, ivec2(baseVertex1 % textureSize(texpaint_vert, 0).x, baseVertex1 / textureSize(texpaint_vert, 0).y), 0).xyz;"); - node_shader_write_attrib(vert, "vec3 meshpos2 = texelFetch(texpaint_vert, ivec2(baseVertex2 % textureSize(texpaint_vert, 0).x, baseVertex2 / textureSize(texpaint_vert, 0).y), 0).xyz;"); + node_shader_write_attrib(vert, "int base_vertex0 = gl_VertexID - (gl_VertexID % 3);"); + node_shader_write_attrib(vert, "int base_vertex1 = base_vertex0 + 1;"); + node_shader_write_attrib(vert, "int base_vertex2 = base_vertex0 + 2;"); + node_shader_write_attrib(vert, "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, "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, "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, "vec3 meshnor = normalize(cross(meshpos2 - meshpos1, meshpos0 - meshpos1));"); node_shader_write_attrib(vert, "wnormal = mul(meshnor, N);"); node_shader_write_attrib(frag, "vec3 n = normalize(wnormal);"); @@ -109,10 +109,10 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) { texture_count += 4; - node_shader_add_uniform(frag, "sampler2D senvmapBrdf", "$brdf.k"); - node_shader_add_uniform(frag, "sampler2D senvmapRadiance", "_envmap_radiance"); - node_shader_add_uniform(frag, "sampler2D sltcMat", "_ltcMat"); - node_shader_add_uniform(frag, "sampler2D sltcMag", "_ltcMag"); + node_shader_add_uniform(frag, "sampler2D senvmap_brdf", "$brdf.k"); + node_shader_add_uniform(frag, "sampler2D senvmap_radiance", "_envmap_radiance"); + node_shader_add_uniform(frag, "sampler2D sltc_mat", "_ltc_mat"); + node_shader_add_uniform(frag, "sampler2D sltc_mag", "_ltc_mag"); } // Get layers for this pass @@ -185,7 +185,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (!slot_layer_is_visible(m)) continue; node_shader_add_shared_sampler(frag, "sampler2D texpaint" + m.id); node_shader_write(frag, "{"); // Group mask is sampled across multiple layers - node_shader_write(frag, "float texpaint_mask_sample" + m.id + " = textureLodShared(texpaint" + m.id + ", texCoord, 0.0).r;"); + node_shader_write(frag, "float texpaint_mask_sample" + m.id + " = textureLodShared(texpaint" + m.id + ", tex_coord, 0.0).r;"); node_shader_write(frag, "}"); } node_shader_write(frag, "texpaint_opac *= clamp(" + texpaint_mask + ", 0.0, 1.0);"); @@ -205,17 +205,17 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (last_pass && context_raw.draw_texels) { - node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize"); - node_shader_write(frag, "vec2 texel0 = texCoord * texpaintSize * 0.01;"); - node_shader_write(frag, "vec2 texel1 = texCoord * texpaintSize * 0.1;"); - node_shader_write(frag, "vec2 texel2 = texCoord * texpaintSize;"); + node_shader_add_uniform(frag, "vec2 texpaint_size", "_texpaint_size"); + node_shader_write(frag, "vec2 texel0 = tex_coord * texpaint_size * 0.01;"); + node_shader_write(frag, "vec2 texel1 = tex_coord * texpaint_size * 0.1;"); + node_shader_write(frag, "vec2 texel2 = tex_coord * texpaint_size;"); node_shader_write(frag, "basecol *= max(float(mod(int(texel0.x), 2.0) == mod(int(texel0.y), 2.0)), 0.9);"); node_shader_write(frag, "basecol *= max(float(mod(int(texel1.x), 2.0) == mod(int(texel1.y), 2.0)), 0.9);"); node_shader_write(frag, "basecol *= max(float(mod(int(texel2.x), 2.0) == mod(int(texel2.y), 2.0)), 0.9);"); } if (last_pass && context_raw.draw_wireframe) { - node_shader_write(frag, "basecol *= 1.0 - textureLod(texuvmap, texCoord, 0.0).r;"); + node_shader_write(frag, "basecol *= 1.0 - textureLod(texuvmap, tex_coord, 0.0).r;"); } if (make_material_height_used) { @@ -230,9 +230,9 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (!last_pass) { - node_shader_write(frag, "fragColor[0] = vec4(basecol, opacity);"); - node_shader_write(frag, "fragColor[1] = vec4(ntex, matid);"); - node_shader_write(frag, "fragColor[2] = vec4(occlusion, roughness, metallic, height);"); + node_shader_write(frag, "frag_color[0] = vec4(basecol, opacity);"); + node_shader_write(frag, "frag_color[1] = vec4(ntex, matid);"); + node_shader_write(frag, "frag_color[2] = vec4(occlusion, roughness, metallic, height);"); parser_material_finalize(con_mesh); con_mesh.data.shader_from_source = true; con_mesh.data.vertex_shader = node_shader_get(vert); @@ -242,9 +242,9 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte frag.vvec = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); + node_shader_write(frag, "mat3 TBN = cotangent_frame(n, vvec, tex_coord);"); ///else - node_shader_write(frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); + node_shader_write(frag, "mat3 TBN = cotangent_frame(n, -vvec, tex_coord);"); ///end node_shader_write(frag, "n = ntex * 2.0 - 1.0;"); node_shader_write(frag, "n.y = -n.y;"); @@ -256,86 +256,86 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.viewport_shader != null) { let color = context_raw.viewport_shader(frag); - node_shader_write(frag, "fragColor[1] = vec4(" + color + ", 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(" + color + ", 1.0);"); } else if (context_raw.render_mode == render_mode_t.FORWARD) { frag.wposition = true; node_shader_write(frag, "vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);"); node_shader_write(frag, "vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);"); frag.vvec = true; - node_shader_write(frag, "float dotNV = max(0.0, dot(n, vVec));"); - node_shader_write(frag, "vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(roughness, 1.0 - dotNV) * 256.0), 0).xy;"); - node_shader_add_uniform(frag, "int envmapNumMipmaps", "_envmap_num_mipmaps"); - node_shader_add_uniform(frag, "vec4 envmapData", "_envmapData"); // angle, sin(angle), cos(angle), strength - node_shader_write(frag, "vec3 wreflect = reflect(-vVec, n);"); - node_shader_write(frag, "float envlod = roughness * float(envmapNumMipmaps);"); + node_shader_write(frag, "float dotnv = max(0.0, dot(n, vvec));"); + node_shader_write(frag, "vec2 env_brdf = texelFetch(senvmap_brdf, ivec2(vec2(roughness, 1.0 - dotnv) * 256.0), 0).xy;"); + node_shader_add_uniform(frag, "int envmap_num_mipmaps", "_envmap_num_mipmaps"); + node_shader_add_uniform(frag, "vec4 envmap_data", "_envmap_data"); // angle, sin(angle), cos(angle), strength + node_shader_write(frag, "vec3 wreflect = reflect(-vvec, n);"); + node_shader_write(frag, "float envlod = roughness * float(envmap_num_mipmaps);"); node_shader_add_function(frag, str_envmap_equirect); - node_shader_write(frag, "vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect, envmapData.x), envlod).rgb;"); - node_shader_add_uniform(frag, "vec3 lightArea0", "_light_area0"); - node_shader_add_uniform(frag, "vec3 lightArea1", "_light_area1"); - node_shader_add_uniform(frag, "vec3 lightArea2", "_light_area2"); - node_shader_add_uniform(frag, "vec3 lightArea3", "_light_area3"); + node_shader_write(frag, "vec3 prefiltered_color = textureLod(senvmap_radiance, envmap_equirect(wreflect, envmap_data.x), envlod).rgb;"); + node_shader_add_uniform(frag, "vec3 light_area0", "_light_area0"); + node_shader_add_uniform(frag, "vec3 light_area1", "_light_area1"); + node_shader_add_uniform(frag, "vec3 light_area2", "_light_area2"); + node_shader_add_uniform(frag, "vec3 light_area3", "_light_area3"); node_shader_add_function(frag, str_ltc_evaluate); - node_shader_add_uniform(frag, "vec3 lightPos", "_point_pos"); - node_shader_add_uniform(frag, "vec3 lightColor", "_point_color"); - node_shader_write(frag, "float ldist = distance(wposition, lightPos);"); + node_shader_add_uniform(frag, "vec3 light_pos", "_point_pos"); + node_shader_add_uniform(frag, "vec3 light_color", "_point_color"); + node_shader_write(frag, "float ldist = distance(wposition, light_pos);"); node_shader_write(frag, "const float LUT_SIZE = 64.0;"); node_shader_write(frag, "const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;"); node_shader_write(frag, "const float LUT_BIAS = 0.5 / LUT_SIZE;"); - node_shader_write(frag, "float theta = acos(dotNV);"); + node_shader_write(frag, "float theta = acos(dotnv);"); node_shader_write(frag, "vec2 tuv = vec2(roughness, theta / (0.5 * 3.14159265));"); node_shader_write(frag, "tuv = tuv * LUT_SCALE + LUT_BIAS;"); - node_shader_write(frag, "vec4 t = textureLod(sltcMat, tuv, 0.0);"); + node_shader_write(frag, "vec4 t = textureLod(sltc_mat, tuv, 0.0);"); node_shader_write(frag, "mat3 minv = mat3(vec3(1.0, 0.0, t.y), vec3(0.0, t.z, 0.0), vec3(t.w, 0.0, t.x));"); - node_shader_write(frag, "float ltcspec = ltcEvaluate(n, vVec, dotNV, wposition, minv, lightArea0, lightArea1, lightArea2, lightArea3);"); - node_shader_write(frag, "ltcspec *= textureLod(sltcMag, tuv, 0.0).a;"); + node_shader_write(frag, "float ltcspec = ltc_evaluate(n, vvec, dotnv, wposition, minv, light_area0, light_area1, light_area2, light_area3);"); + node_shader_write(frag, "ltcspec *= textureLod(sltc_mag, tuv, 0.0).a;"); node_shader_write(frag, "mat3 mident = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);"); - node_shader_write(frag, "float ltcdiff = ltcEvaluate(n, vVec, dotNV, wposition, mident, lightArea0, lightArea1, lightArea2, lightArea3);"); + node_shader_write(frag, "float ltcdiff = ltc_evaluate(n, vvec, dotnv, wposition, mident, light_area0, light_area1, light_area2, light_area3);"); node_shader_write(frag, "vec3 direct = albedo * ltcdiff + ltcspec * 0.05;"); - node_shader_write(frag, "direct *= lightColor * (1.0 / (ldist * ldist));"); + node_shader_write(frag, "direct *= light_color * (1.0 / (ldist * ldist));"); node_shader_add_uniform(frag, "vec4 shirr[7]", "_envmap_irradiance"); node_shader_add_function(frag, str_sh_irradiance()); - node_shader_write(frag, "vec3 indirect = albedo * (shIrradiance(vec3(n.x * envmapData.z - n.y * envmapData.y, n.x * envmapData.y + n.y * envmapData.z, n.z), shirr) / 3.14159265);"); - node_shader_write(frag, "indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y) * 1.5;"); - node_shader_write(frag, "indirect *= envmapData.w * occlusion;"); - node_shader_write(frag, "fragColor[1] = vec4(direct + indirect, 1.0);"); + node_shader_write(frag, "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, "indirect += prefiltered_color * (f0 * env_brdf.x + env_brdf.y) * 1.5;"); + node_shader_write(frag, "indirect *= envmap_data.w * occlusion;"); + node_shader_write(frag, "frag_color[1] = vec4(direct + indirect, 1.0);"); } else { // Deferred, Pathtraced if (make_material_emis_used) { node_shader_write(frag, "if (int(matid * 255.0) % 3 == 1) basecol *= 10.0;"); // Boost for bloom } - node_shader_write(frag, "fragColor[1] = vec4(basecol, occlusion);"); + node_shader_write(frag, "frag_color[1] = vec4(basecol, occlusion);"); } } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) { frag.nattr = true; - node_shader_write(frag, "fragColor[1] = vec4(nAttr, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(nAttr, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_ID) { - node_shader_add_uniform(frag, "float objectId", "_objectId"); - node_shader_write(frag, "float obid = objectId + 1.0 / 255.0;"); + node_shader_add_uniform(frag, "float object_id", "_object_id"); + node_shader_write(frag, "float obid = object_id + 1.0 / 255.0;"); node_shader_write(frag, "float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);"); node_shader_write(frag, "float id_g = fract(sin(dot(vec2(obid * 20.0, obid), vec2(12.9898, 78.233))) * 43758.5453);"); node_shader_write(frag, "float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);"); - node_shader_write(frag, "fragColor[1] = vec4(id_r, id_g, id_b, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(id_r, id_g, id_b, 1.0);"); } else { - node_shader_write(frag, "fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);"); // Pink + node_shader_write(frag, "frag_color[1] = vec4(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, "fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));"); + node_shader_write(frag, "frag_color[1].rgb = pow(frag_color[1].rgb, vec3(2.2, 2.2, 2.2));"); } node_shader_write(frag, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); - node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);"); - node_shader_write(frag, "fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, uint(int(matid * 255.0) % 3)));"); + node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy);"); + node_shader_write(frag, "frag_color[0] = vec4(n.xy, roughness, pack_f32_i16(metallic, uint(int(matid * 255.0) % 3)));"); } node_shader_write(frag, "vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;"); node_shader_write(frag, "vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;"); - node_shader_write(frag, "fragColor[2] = vec4(posa - posb, texCoord.xy);"); + node_shader_write(frag, "frag_color[2] = vec4(posa - posb, 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 f0877214..c1e320de 100644 --- a/armorsculpt/sources/make_mesh_preview.ts +++ b/armorsculpt/sources/make_mesh_preview.ts @@ -39,16 +39,16 @@ 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(vert, str_get_skinning_dual_quat); - node_shader_add_uniform(vert, "vec4 skinBones[128 * 2]", "_skin_bones"); - node_shader_add_uniform(vert, "float posUnpack", "_pos_unpack"); - node_shader_write_attrib(vert, "vec4 skinA;"); - node_shader_write_attrib(vert, "vec4 skinB;"); - node_shader_write_attrib(vert, "getSkinningDualQuat(ivec4(bone * 32767), weight, skinA, skinB);"); + node_shader_add_uniform(vert, "vec4 skin_bones[128 * 2]", "_skin_bones"); + node_shader_add_uniform(vert, "float pos_unpack", "_pos_unpack"); + node_shader_write_attrib(vert, "vec4 skin_a;"); + node_shader_write_attrib(vert, "vec4 skin_b;"); + node_shader_write_attrib(vert, "get_skinning_dual_quat(ivec4(bone * 32767), weight, skin_a, skin_b);"); node_shader_write_attrib(vert, "vec3 spos = pos.xyz;"); - node_shader_write_attrib(vert, "spos.xyz *= posUnpack;"); - node_shader_write_attrib(vert, "spos.xyz += 2.0 * cross(skinA.xyz, cross(skinA.xyz, spos.xyz) + skinA.w * spos.xyz);"); - node_shader_write_attrib(vert, "spos.xyz += 2.0 * (skinA.w * skinB.xyz - skinB.w * skinA.xyz + cross(skinA.xyz, skinB.xyz));"); - node_shader_write_attrib(vert, "spos.xyz /= posUnpack;"); + node_shader_write_attrib(vert, "spos.xyz *= pos_unpack;"); + node_shader_write_attrib(vert, "spos.xyz += 2.0 * cross(skin_a.xyz, cross(skin_a.xyz, spos.xyz) + skin_a.w * spos.xyz);"); + node_shader_write_attrib(vert, "spos.xyz += 2.0 * (skin_a.w * skin_b.xyz - skin_b.w * skin_a.xyz + cross(skin_a.xyz, skin_b.xyz));"); + node_shader_write_attrib(vert, "spos.xyz /= pos_unpack;"); } ///end @@ -56,8 +56,8 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no node_shader_write_attrib(vert, "gl_Position = mul(vec4(" + pos + ".xyz, 1.0), WVP);"); let brush_scale = (context_raw.brush_scale * context_raw.brush_nodes_scale) + ""; - node_shader_add_out(vert, "vec2 texCoord"); - node_shader_write_attrib(vert, "texCoord = tex * float(" + brush_scale + ");"); + node_shader_add_out(vert, "vec2 tex_coord"); + node_shader_write_attrib(vert, "tex_coord = tex * float(" + brush_scale + ");"); let decal = context_raw.decal_preview; parser_material_sample_keep_aspect = decal; @@ -96,7 +96,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no if (decal) { if (context_raw.tool == workspace_tool_t.TEXT) { node_shader_add_uniform(frag, "sampler2D textexttool", "_textexttool"); - node_shader_write(frag, "opacity *= textureLod(textexttool, texCoord / float(" + brush_scale + "), 0.0).r;"); + node_shader_write(frag, "opacity *= textureLod(textexttool, tex_coord / float(" + brush_scale + "), 0.0).r;"); } } if (decal) { @@ -104,7 +104,7 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no node_shader_write(frag, "if (opacity < " + opac + ") discard;"); } - node_shader_add_out(frag, "vec4 fragColor[3]"); + node_shader_add_out(frag, "vec4 frag_color[3]"); frag.n = true; node_shader_add_function(frag, str_pack_float_int16); @@ -131,9 +131,9 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no else { frag.vvec = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); + node_shader_write(frag, "mat3 TBN = cotangent_frame(n, vvec, tex_coord);"); ///else - node_shader_write(frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); + node_shader_write(frag, "mat3 TBN = cotangent_frame(n, -vvec, tex_coord);"); ///end node_shader_write(frag, "n = nortan * 2.0 - 1.0;"); node_shader_write(frag, "n.y = -n.y;"); @@ -141,24 +141,24 @@ function make_mesh_preview_run(data: material_t, matcon: material_context_t): no } node_shader_write(frag, "n /= (abs(n.x) + abs(n.y) + abs(n.z));"); - node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);"); + node_shader_write(frag, "n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy);"); // uint matid = 0; if (decal) { - node_shader_write(frag, "fragColor[0] = vec4(n.x, n.y, roughness, packFloatInt16(metallic, uint(0)));"); // metallic/matid - node_shader_write(frag, "fragColor[1] = vec4(basecol, occlusion);"); + node_shader_write(frag, "frag_color[0] = vec4(n.x, n.y, roughness, pack_f32_i16(metallic, uint(0)));"); // metallic/matid + node_shader_write(frag, "frag_color[1] = vec4(basecol, occlusion);"); } else { - node_shader_write(frag, "fragColor[0] = vec4(n.x, n.y, mix(1.0, roughness, opacity), packFloatInt16(mix(1.0, metallic, opacity), uint(0)));"); // metallic/matid - node_shader_write(frag, "fragColor[1] = vec4(mix(vec3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); + node_shader_write(frag, "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, "frag_color[1] = vec4(mix(vec3(0.0, 0.0, 0.0), basecol, opacity), occlusion);"); } - node_shader_write(frag, "fragColor[2] = vec4(0.0, 0.0, 0.0, 0.0);"); // veloc + node_shader_write(frag, "frag_color[2] = vec4(0.0, 0.0, 0.0, 0.0);"); // veloc parser_material_finalize(con_mesh); ///if arm_skin if (skin) { - node_shader_write(vert, "wnormal = normalize(mul(vec3(nor.xy, pos.w) + 2.0 * cross(skinA.xyz, cross(skinA.xyz, vec3(nor.xy, pos.w)) + skinA.w * vec3(nor.xy, pos.w)), N));"); + node_shader_write(vert, "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));"); } ///end diff --git a/armorsculpt/sources/make_sculpt.ts b/armorsculpt/sources/make_sculpt.ts index b98b2180..c92bdf77 100644 --- a/armorsculpt/sources/make_sculpt.ts +++ b/armorsculpt/sources/make_sculpt.ts @@ -30,24 +30,24 @@ function make_sculpt_run(data: material_t, matcon: material_context_t): node_sha let face_fill = context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.FACE; let decal = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT; - node_shader_add_out(vert, "vec2 texCoord"); + node_shader_add_out(vert, "vec2 tex_coord"); node_shader_write(vert, "const vec2 madd = vec2(0.5, 0.5);"); - node_shader_write(vert, "texCoord = pos.xy * madd + madd;"); + node_shader_write(vert, "tex_coord = pos.xy * madd + madd;"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(vert, "texCoord.y = 1.0 - texCoord.y;"); + node_shader_write(vert, "tex_coord.y = 1.0 - tex_coord.y;"); ///end node_shader_write(vert, "gl_Position = vec4(pos.xy, 0.0, 1.0);"); - node_shader_add_uniform(frag, "vec4 inp", "_inputBrush"); - node_shader_add_uniform(frag, "vec4 inplast", "_inputBrushLast"); + node_shader_add_uniform(frag, "vec4 inp", "_input_brush"); + node_shader_add_uniform(frag, "vec4 inplast", "_input_brush_last"); node_shader_add_uniform(frag, "sampler2D gbufferD"); - node_shader_add_out(frag, "vec4 fragColor[2]"); + node_shader_add_out(frag, "vec4 frag_color[2]"); - node_shader_add_uniform(frag, "float brushRadius", "_brushRadius"); - node_shader_add_uniform(frag, "float brushOpacity", "_brushOpacity"); - node_shader_add_uniform(frag, "float brushHardness", "_brushHardness"); + node_shader_add_uniform(frag, "float brush_radius", "_brush_radius"); + node_shader_add_uniform(frag, "float brush_opacity", "_brush_opacity"); + node_shader_add_uniform(frag, "float brush_hardness", "_brush_hardness"); if (context_raw.tool == workspace_tool_t.BRUSH || context_raw.tool == workspace_tool_t.ERASER || @@ -66,10 +66,10 @@ function make_sculpt_run(data: material_t, matcon: material_context_t): node_sha node_shader_write(frag, "float opacity = 1.0;"); node_shader_write(frag, "if (opacity == 0.0) discard;"); - node_shader_write(frag, "float str = clamp((brushRadius - dist) * brushHardness * 400.0, 0.0, 1.0) * opacity;"); + node_shader_write(frag, "float str = clamp((brush_radius - dist) * brush_hardness * 400.0, 0.0, 1.0) * opacity;"); node_shader_add_uniform(frag, "sampler2D texpaint_undo", "_texpaint_undo"); - node_shader_write(frag, "vec4 sample_undo = textureLod(texpaint_undo, texCoord, 0.0);"); + node_shader_write(frag, "vec4 sample_undo = textureLod(texpaint_undo, tex_coord, 0.0);"); node_shader_write(frag, "if (sample_undo.r == 0 && sample_undo.g == 0 && sample_undo.b == 0) discard;"); @@ -78,12 +78,12 @@ function make_sculpt_run(data: material_t, matcon: material_context_t): node_sha node_shader_write(frag, "vec2 g0_undo = textureLod(gbuffer0_undo, inp.xy, 0.0).rg;"); node_shader_write(frag, "vec3 wn;"); node_shader_write(frag, "wn.z = 1.0 - abs(g0_undo.x) - abs(g0_undo.y);"); - node_shader_write(frag, "wn.xy = wn.z >= 0.0 ? g0_undo.xy : octahedronWrap(g0_undo.xy);"); + node_shader_write(frag, "wn.xy = wn.z >= 0.0 ? g0_undo.xy : octahedron_wrap(g0_undo.xy);"); node_shader_write(frag, "vec3 n = normalize(wn);"); - node_shader_write(frag, "fragColor[0] = vec4(sample_undo.rgb + n * 0.1 * str, 1.0);"); + node_shader_write(frag, "frag_color[0] = vec4(sample_undo.rgb + n * 0.1 * str, 1.0);"); - node_shader_write(frag, "fragColor[1] = vec4(str, 0.0, 0.0, 1.0);"); + node_shader_write(frag, "frag_color[1] = vec4(str, 0.0, 0.0, 1.0);"); parser_material_finalize(con_paint); con_paint.data.shader_from_source = true; diff --git a/base/assets/shader_datas.arm b/base/assets/shader_datas.arm index 2d2ff099d7246ebd623249b82c247c7cfe109ba2..d8792eb0232ee1fcc8e227c519368eb92c1be029 100644 GIT binary patch delta 1736 zcmd^9O-vI(6o$4?N`IgfAu$C~K!_nxs@8}}5rdIn4M8y&C@>7W!*=6#ciG)yY7Clq z!3!FmF`m?T;H;U%n*(Fl+22PObmk{9n$vJ&Kd@xZOqV!EEtJ(JA>C8>_^5)vgTt4LBpb)O$t<* zNjV^w0Uw4(AnG_k8yq)nup*RsIE@gNAl@KIgi!bxWP)v#E|$qDlAFf$eb zxhnu${eeZN1D;M#z~qG*IuV+;xtxs1i<+fSBlWcYEP%k%>VjC$L;AM;?tY>Aj>pAA z^RSYrp>szb6utUczi9_9rLmD4C@HE)f|+nro#lurNl}t$N07}oMmNJR|3)c16sXW~ zQk6^-UW$b31FR90{mVSgVTqWYq8pKcy?Ro)Yr(!-Jf_qW`Z^jfA_a~0d@F=k`(0G( z{k|7ogw3#z9_qVO5TdL7&s=`5H7^OX{n0QlrgXS%Z}#%yPNXwBLY-GGm!C3SK;+pZ zRuPX4Z0(bgR*7|(CEN+?Ac^v|HIJ!4o(uOzC#uac%RR$b`RbIhM*Bu$tTUX68o&1F>;k-0-vbe0o@ zmhpxiC|ehXwu3%iTWL97kqJ`Z{&;hzbsx_9o}Si;QShLcGFnlr63s|y#FVi-i%{o; zyA;$RhfB}he+nAWX>T>l$s-!P7v@;AL0vL9l*Goik`;`GEOc?Ql~EdV6rmUe3-GzO z84h0!(DY=+_P`wYQrOPTu5fA<%V2lXz<`yVe4hN9!uhjmZ+& KGtdT6Y2i21vM;m% delta 1592 zcmds1O=uHA6mGILX_7WSZB;03`a>WPA=rY&R&5$1RZCM#6D&2&&vY|MmTq>_&8DD8 z(PIzx-~$m6^yEdcg}F$f5baI9c+^7cSrExx#huw;l4`CVye#{^_cQN(@0)q{$?)!@ zVY`RxaJICxtO;2Ot16DbZO-F&X-M)nq$*g-s<}f>L-$*?kA(7gzeD@UDoBu6ip@?_ zbep{3Dn%Ffh~Y!L?>JKsJ3dn9sq`)q^XO~?bp(y= zH4NNwK$`4xX%HP`;6{ zQ?hh>wv-QpKX%zl(?lVgQ-g3P7N|E5(g9Xf_i8d8fndBBp2i%ofSvV`iKW01v7Lc~ zC5MgbAK%0?vb<7FJqG?v54$D>S&-B@2*l4(vyGV{S**s{;AOnqLVM$7315Tv@gYB( zhMAd65vxa*OzEP|U;!&?Nnu;o>1sfcwF^>-3Ztf|Q*jXz$?= 0.0 ? n.xy : octahedronWrap(n.xy); + n.xy = n.z >= 0.0 ? n.xy : octahedron_wrap(n.xy); uint matid = 0; - fragColor[0] = vec4(n.xy, roughness, packFloatInt16(metallic, matid)); - fragColor[1] = vec4(basecol, occlusion); + frag_color[0] = vec4(n.xy, roughness, pack_f32_i16(metallic, matid)); + frag_color[1] = vec4(basecol, occlusion); vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5; vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5; - fragColor[2].rg = vec2(posa - posb); + frag_color[2].rg = vec2(posa - posb); } diff --git a/base/shaders/mesh_posnortex.vert.glsl b/base/shaders/mesh_posnortex.vert.glsl index 080a81c3..5bc89519 100644 --- a/base/shaders/mesh_posnortex.vert.glsl +++ b/base/shaders/mesh_posnortex.vert.glsl @@ -2,20 +2,20 @@ uniform mat3 N; uniform mat4 WVP; -uniform float texUnpack; +uniform float tex_unpack; uniform mat4 prevWVP; in vec4 pos; in vec2 nor; in vec2 tex; -out vec2 texCoord; +out vec2 tex_coord; out vec3 wnormal; out vec4 wvpposition; out vec4 prevwvpposition; void main() { vec4 spos = vec4(pos.xyz, 1.0); - texCoord = tex * texUnpack; + tex_coord = tex * tex_unpack; wnormal = normalize(N * vec3(nor.xy, pos.w)); gl_Position = WVP * spos; wvpposition = gl_Position; diff --git a/base/shaders/pass.vert.glsl b/base/shaders/pass.vert.glsl index 7cd0fa30..6f71dfbe 100644 --- a/base/shaders/pass.vert.glsl +++ b/base/shaders/pass.vert.glsl @@ -1,14 +1,14 @@ #version 450 in vec2 pos; -out vec2 texCoord; +out vec2 tex_coord; void main() { // Scale vertex attribute to [0-1] range const vec2 madd = vec2(0.5, 0.5); - texCoord = pos.xy * madd + madd; + tex_coord = pos.xy * madd + madd; #if defined(HLSL) || defined(METAL) || defined(SPIRV) - texCoord.y = 1.0 - texCoord.y; + tex_coord.y = 1.0 - tex_coord.y; #endif gl_Position = vec4(pos.xy, 0.0, 1.0); diff --git a/base/shaders/pass_copy.frag.glsl b/base/shaders/pass_copy.frag.glsl index 51302dac..26cd3b80 100644 --- a/base/shaders/pass_copy.frag.glsl +++ b/base/shaders/pass_copy.frag.glsl @@ -2,9 +2,9 @@ uniform sampler2D tex; -in vec2 texCoord; -out vec4 fragColor; +in vec2 tex_coord; +out vec4 frag_color; void main() { - fragColor = textureLod(tex, texCoord, 0.0); + frag_color = textureLod(tex, tex_coord, 0.0); } diff --git a/base/shaders/pass_viewray.vert.glsl b/base/shaders/pass_viewray.vert.glsl index a25cba66..78cca7b9 100644 --- a/base/shaders/pass_viewray.vert.glsl +++ b/base/shaders/pass_viewray.vert.glsl @@ -5,15 +5,15 @@ uniform vec3 eye; in vec2 pos; -out vec2 texCoord; -out vec3 viewRay; +out vec2 tex_coord; +out vec3 view_ray; void main() { // Scale vertex attribute to [0-1] range const vec2 madd = vec2(0.5, 0.5); - texCoord = pos.xy * madd + madd; + tex_coord = pos.xy * madd + madd; #if defined(HLSL) || defined(METAL) || defined(SPIRV) - texCoord.y = 1.0 - texCoord.y; + tex_coord.y = 1.0 - tex_coord.y; #endif gl_Position = vec4(pos.xy, 0.0, 1.0); @@ -22,5 +22,5 @@ void main() { vec4 v = vec4(pos.x, pos.y, 1.0, 1.0); v = vec4(invVP * v); v.xyz /= v.w; - viewRay = v.xyz - eye; + view_ray = v.xyz - eye; } diff --git a/base/shaders/pass_viewray2.vert.glsl b/base/shaders/pass_viewray2.vert.glsl index f44ba022..ceb73075 100644 --- a/base/shaders/pass_viewray2.vert.glsl +++ b/base/shaders/pass_viewray2.vert.glsl @@ -4,15 +4,15 @@ uniform mat4 invP; in vec2 pos; -out vec2 texCoord; -out vec3 viewRay; +out vec2 tex_coord; +out vec3 view_ray; void main() { // Scale vertex attribute to [0-1] range const vec2 madd = vec2(0.5, 0.5); - texCoord = pos.xy * madd + madd; + tex_coord = pos.xy * madd + madd; #if defined(HLSL) || defined(METAL) || defined(SPIRV) - texCoord.y = 1.0 - texCoord.y; + tex_coord.y = 1.0 - tex_coord.y; #endif gl_Position = vec4(pos.xy, 0.0, 1.0); @@ -20,5 +20,5 @@ void main() { // NDC (at the back of cube) vec4 v = vec4(pos.x, pos.y, 1.0, 1.0); v = vec4(invP * v); - viewRay = vec3(v.xy / v.z, 1.0); + view_ray = vec3(v.xy / v.z, 1.0); } diff --git a/base/shaders/prefilter_envmap.frag.glsl b/base/shaders/prefilter_envmap.frag.glsl index e3fd2c8a..4af4a354 100644 --- a/base/shaders/prefilter_envmap.frag.glsl +++ b/base/shaders/prefilter_envmap.frag.glsl @@ -3,8 +3,8 @@ uniform sampler2D radiance; uniform vec4 params; -in vec2 texCoord; -out vec4 fragColor; +in vec2 tex_coord; +out vec4 frag_color; const float PI = 3.14159265358979; const float PI2 = PI * 2.0; @@ -24,7 +24,7 @@ vec2 equirect(vec3 normal) { return vec2(theta / PI2, phi / PI); } -vec3 reverseEquirect(vec2 co) { +vec3 reverse_equirect(vec2 co) { float theta = co.x * PI2 - PI; float phi = co.y * PI; return vec3(sin(phi) * cos(theta), -(sin(phi) * sin(theta)), cos(phi)); @@ -43,13 +43,12 @@ vec3 cos_weighted_hemisphere_direction(vec3 n, vec2 co, uint seed) { } void main() { - vec4 paramsLocal = params; // TODO: spirv workaround - fragColor = vec4(0.0, 0.0, 0.0, 1.0); - vec3 n = reverseEquirect(texCoord); + frag_color = vec4(0.0, 0.0, 0.0, 1.0); + vec3 n = reverse_equirect(tex_coord); for (int i = 0; i < samples; i++) { - vec3 dir = normalize(mix(n, cos_weighted_hemisphere_direction(n, texCoord, i), paramsLocal.x)); - fragColor.rgb += texture(radiance, equirect(dir)).rgb; + vec3 dir = normalize(mix(n, cos_weighted_hemisphere_direction(n, tex_coord, i), params.x)); + frag_color.rgb += texture(radiance, equirect(dir)).rgb; } - fragColor.rgb /= float(samples); - fragColor.rgb = pow(fragColor.rgb, vec3(1.0 / 2.2)); + frag_color.rgb /= float(samples); + frag_color.rgb = pow(frag_color.rgb, vec3(1.0 / 2.2)); } diff --git a/base/shaders/raytrace/raytrace_bake_ao.metal b/base/shaders/raytrace/raytrace_bake_ao.metal index ac967484..4e9ccf2c 100644 --- a/base/shaders/raytrace/raytrace_bake_ao.metal +++ b/base/shaders/raytrace/raytrace_bake_ao.metal @@ -25,21 +25,21 @@ struct RayPayload { constant int SAMPLES = 4;//64; -float rand(int pixel_i, int pixel_j, int sampleIndex, int sampleDimension, int frame, texture2d sobol, texture2d scramble, texture2d rank) { +float rand(int pixel_i, int pixel_j, int sample_index, int sample_dimension, int frame, texture2d sobol, texture2d scramble, texture2d rank) { pixel_i += frame * 9; pixel_j += frame * 11; pixel_i = pixel_i & 127; pixel_j = pixel_j & 127; - sampleIndex = sampleIndex & 255; - sampleDimension = sampleDimension & 255; + sample_index = sample_index & 255; + sample_dimension = sample_dimension & 255; - int i = sampleDimension + (pixel_i + pixel_j * 128) * 8; - int rankedSampleIndex = sampleIndex ^ int(rank.read(uint2(i % 128, uint(i / 128)), 0).r * 255); + int i = sample_dimension + (pixel_i + pixel_j * 128) * 8; + int ranked_sample_index = sample_index ^ int(rank.read(uint2(i % 128, uint(i / 128)), 0).r * 255); - i = sampleDimension + rankedSampleIndex * 256; + i = sample_dimension + ranked_sample_index * 256; int value = int(sobol.read(uint2(i % 256, uint(i / 256)), 0).r * 255); - i = (sampleDimension % 8) + (pixel_i + pixel_j * 128) * 8; + i = (sample_dimension % 8) + (pixel_i + pixel_j * 128) * 8; value = value ^ int(scramble.read(uint2(i % 128, uint(i / 128)), 0).r * 255); float v = (0.5f + value) / 256.0f; diff --git a/base/shaders/raytrace/raytrace_bake_bent.metal b/base/shaders/raytrace/raytrace_bake_bent.metal index ce7bce5f..53e1de03 100644 --- a/base/shaders/raytrace/raytrace_bake_bent.metal +++ b/base/shaders/raytrace/raytrace_bake_bent.metal @@ -25,21 +25,21 @@ struct RayPayload { constant int SAMPLES = 4;//64; -float rand(int pixel_i, int pixel_j, int sampleIndex, int sampleDimension, int frame, texture2d sobol, texture2d scramble, texture2d rank) { +float rand(int pixel_i, int pixel_j, int sample_index, int sample_dimension, int frame, texture2d sobol, texture2d scramble, texture2d rank) { pixel_i += frame * 9; pixel_j += frame * 11; pixel_i = pixel_i & 127; pixel_j = pixel_j & 127; - sampleIndex = sampleIndex & 255; - sampleDimension = sampleDimension & 255; + sample_index = sample_index & 255; + sample_dimension = sample_dimension & 255; - int i = sampleDimension + (pixel_i + pixel_j * 128) * 8; - int rankedSampleIndex = sampleIndex ^ int(rank.read(uint2(i % 128, uint(i / 128)), 0).r * 255); + int i = sample_dimension + (pixel_i + pixel_j * 128) * 8; + int ranked_sample_index = sample_index ^ int(rank.read(uint2(i % 128, uint(i / 128)), 0).r * 255); - i = sampleDimension + rankedSampleIndex * 256; + i = sample_dimension + ranked_sample_index * 256; int value = int(sobol.read(uint2(i % 256, uint(i / 256)), 0).r * 255); - i = (sampleDimension % 8) + (pixel_i + pixel_j * 128) * 8; + i = (sample_dimension % 8) + (pixel_i + pixel_j * 128) * 8; value = value ^ int(scramble.read(uint2(i % 128, uint(i / 128)), 0).r * 255); float v = (0.5f + value) / 256.0f; diff --git a/base/shaders/raytrace/raytrace_bake_light.metal b/base/shaders/raytrace/raytrace_bake_light.metal index c030a873..fe50e185 100644 --- a/base/shaders/raytrace/raytrace_bake_light.metal +++ b/base/shaders/raytrace/raytrace_bake_light.metal @@ -33,21 +33,21 @@ float2 equirect(float3 normal, float angle) { return float2(theta / PI2, phi / PI); } -float rand(int pixel_i, int pixel_j, int sampleIndex, int sampleDimension, int frame, texture2d sobol, texture2d scramble, texture2d rank) { +float rand(int pixel_i, int pixel_j, int sample_ndex, int sample_dimension, int frame, texture2d sobol, texture2d scramble, texture2d rank) { pixel_i += frame * 9; pixel_j += frame * 11; pixel_i = pixel_i & 127; pixel_j = pixel_j & 127; - sampleIndex = sampleIndex & 255; - sampleDimension = sampleDimension & 255; + sample_ndex = sample_ndex & 255; + sample_dimension = sample_dimension & 255; - int i = sampleDimension + (pixel_i + pixel_j * 128) * 8; - int rankedSampleIndex = sampleIndex ^ int(rank.read(uint2(i % 128, uint(i / 128)), 0).r * 255); + int i = sample_dimension + (pixel_i + pixel_j * 128) * 8; + int ranked_sample_index = sample_ndex ^ int(rank.read(uint2(i % 128, uint(i / 128)), 0).r * 255); - i = sampleDimension + rankedSampleIndex * 256; + i = sample_dimension + ranked_sample_index * 256; int value = int(sobol.read(uint2(i % 256, uint(i / 256)), 0).r * 255); - i = (sampleDimension % 8) + (pixel_i + pixel_j * 128) * 8; + i = (sample_dimension % 8) + (pixel_i + pixel_j * 128) * 8; value = value ^ int(scramble.read(uint2(i % 128, uint(i / 128)), 0).r * 255); float v = (0.5f + value) / 256.0f; @@ -67,16 +67,16 @@ float3 cos_weighted_hemisphere_direction(uint2 tid, float3 n, uint sample, uint return normalize(n + float3(x, y, z)); } -float3 hit_attribute(float3 vertexAttribute[3], float2 barycentrics) { - return vertexAttribute[0] + - barycentrics.x * (vertexAttribute[1] - vertexAttribute[0]) + - barycentrics.y * (vertexAttribute[2] - vertexAttribute[0]); +float3 hit_attribute(float3 vertex_attribute[3], float2 barycentrics) { + return vertex_attribute[0] + + barycentrics.x * (vertex_attribute[1] - vertex_attribute[0]) + + barycentrics.y * (vertex_attribute[2] - vertex_attribute[0]); } -float2 hit_attribute2d(float2 vertexAttribute[3], float2 barycentrics) { - return vertexAttribute[0] + - barycentrics.x * (vertexAttribute[1] - vertexAttribute[0]) + - barycentrics.y * (vertexAttribute[2] - vertexAttribute[0]); +float2 hit_attribute2d(float2 vertex_attribute[3], float2 barycentrics) { + return vertex_attribute[0] + + barycentrics.x * (vertex_attribute[1] - vertex_attribute[0]) + + barycentrics.y * (vertex_attribute[2] - vertex_attribute[0]); } float2 s16_to_f32(uint val) { diff --git a/base/shaders/raytrace/raytrace_bake_thick.metal b/base/shaders/raytrace/raytrace_bake_thick.metal index ae948aa3..e7a7649c 100644 --- a/base/shaders/raytrace/raytrace_bake_thick.metal +++ b/base/shaders/raytrace/raytrace_bake_thick.metal @@ -25,21 +25,21 @@ struct RayPayload { constant int SAMPLES = 4;//64; -float rand(int pixel_i, int pixel_j, int sampleIndex, int sampleDimension, int frame, texture2d sobol, texture2d scramble, texture2d rank) { +float rand(int pixel_i, int pixel_j, int sample_index, int sample_dimension, int frame, texture2d sobol, texture2d scramble, texture2d rank) { pixel_i += frame * 9; pixel_j += frame * 11; pixel_i = pixel_i & 127; pixel_j = pixel_j & 127; - sampleIndex = sampleIndex & 255; - sampleDimension = sampleDimension & 255; + sample_index = sample_index & 255; + sample_dimension = sample_dimension & 255; - int i = sampleDimension + (pixel_i + pixel_j * 128) * 8; - int rankedSampleIndex = sampleIndex ^ int(rank.read(uint2(i % 128, uint(i / 128)), 0).r * 255); + int i = sample_dimension + (pixel_i + pixel_j * 128) * 8; + int ranked_sample_index = sample_index ^ int(rank.read(uint2(i % 128, uint(i / 128)), 0).r * 255); - i = sampleDimension + rankedSampleIndex * 256; + i = sample_dimension + ranked_sample_index * 256; int value = int(sobol.read(uint2(i % 256, uint(i / 256)), 0).r * 255); - i = (sampleDimension % 8) + (pixel_i + pixel_j * 128) * 8; + i = (sample_dimension % 8) + (pixel_i + pixel_j * 128) * 8; value = value ^ int(scramble.read(uint2(i % 128, uint(i / 128)), 0).r * 255); float v = (0.5f + value) / 256.0f; diff --git a/base/shaders/raytrace/raytrace_brute_core.metal b/base/shaders/raytrace/raytrace_brute_core.metal index 8fed4add..cebebd0d 100644 --- a/base/shaders/raytrace/raytrace_brute_core.metal +++ b/base/shaders/raytrace/raytrace_brute_core.metal @@ -41,8 +41,8 @@ constant int DEPTH = 3; // Opaque hits constant int DEPTH_TRANSPARENT = 16; // Transparent hits #endif #ifdef _ROULETTE -constant int rrStart = 2; -constant float rrProbability = 0.5; // Map to albedo +constant int rr_start = 2; +constant float rr_probability = 0.5; // Map to albedo #endif void generate_camera_ray(float2 screen_pos, thread float3 & ray_origin, thread float3 & ray_dir, float3 eye, float4x4 inv_vp) { @@ -61,21 +61,21 @@ float2 equirect(float3 normal, float angle) { return float2(theta / PI2, phi / PI); } -float rand(int pixel_i, int pixel_j, int sampleIndex, int sampleDimension, int frame, texture2d sobol, texture2d scramble, texture2d rank) { +float rand(int pixel_i, int pixel_j, int sample_index, int sample_dimension, int frame, texture2d sobol, texture2d scramble, texture2d rank) { pixel_i += frame * 9; pixel_j += frame * 11; pixel_i = pixel_i & 127; pixel_j = pixel_j & 127; - sampleIndex = sampleIndex & 255; - sampleDimension = sampleDimension & 255; + sample_index = sample_index & 255; + sample_dimension = sample_dimension & 255; - int i = sampleDimension + (pixel_i + pixel_j * 128) * 8; - int rankedSampleIndex = sampleIndex ^ int(rank.read(uint2(i % 128, uint(i / 128)), 0).r * 255); + int i = sample_dimension + (pixel_i + pixel_j * 128) * 8; + int ranked_sample_index = sample_index ^ int(rank.read(uint2(i % 128, uint(i / 128)), 0).r * 255); - i = sampleDimension + rankedSampleIndex * 256; + i = sample_dimension + ranked_sample_index * 256; int value = int(sobol.read(uint2(i % 256, uint(i / 256)), 0).r * 255); - i = (sampleDimension % 8) + (pixel_i + pixel_j * 128) * 8; + i = (sample_dimension % 8) + (pixel_i + pixel_j * 128) * 8; value = value ^ int(scramble.read(uint2(i % 128, uint(i / 128)), 0).r * 255); float v = (0.5f + value) / 256.0f; @@ -105,16 +105,16 @@ float3 hit_world_position(ray ray, typename intersector= rrStart) { + float rr_factor = 1.0; + if (i >= rr_start) { float f = rand(tid.x, tid.y, j, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank); - if (f <= rrProbability) { + if (f <= rr_probability) { break; } - rrFactor = 1.0 / (1.0 - rrProbability); + rr_factor = 1.0 / (1.0 - rr_probability); } #endif @@ -274,40 +274,40 @@ kernel void raytracingKernel( seed += 1; #ifdef _TRANSLUCENCY - float3 diffuseDir = texpaint0.a < f ? + float3 diffuse_dir = texpaint0.a < f ? cos_weighted_hemisphere_direction(tid, ray.direction, payload.color.a, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank) : cos_weighted_hemisphere_direction(tid, n, payload.color.a, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank); #else - float3 diffuseDir = cos_weighted_hemisphere_direction(tid, n, payload.color.a, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank); + float3 diffuse_dir = cos_weighted_hemisphere_direction(tid, n, payload.color.a, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank); #endif #ifdef _FRESNEL - float specularChance = fresnel(n, ray.direction); + float specular_chance = fresnel(n, ray.direction); #else - const float specularChance = 0.5; + const float specular_chance = 0.5; #endif - if (f < specularChance) { + if (f < specular_chance) { #ifdef _TRANSLUCENCY - float3 specularDir = texpaint0.a < f * 2 ? ray.direction : reflect(ray.direction, n); + float3 specular_dir = texpaint0.a < f * 2 ? ray.direction : reflect(ray.direction, n); #else - float3 specularDir = reflect(ray.direction, n); + float3 specular_dir = reflect(ray.direction, n); #endif - payload.ray_dir = mix(specularDir, diffuseDir, texpaint2.g * texpaint2.g); + payload.ray_dir = mix(specular_dir, diffuse_dir, texpaint2.g * texpaint2.g); float3 v = normalize(constant_buffer.eye.xyz - hit_world_position(ray, intersection)); - float dotNV = max(dot(n, v), 0.0); - float3 specular = surfaceSpecular(texcolor, texpaint2.b); - payload.color.xyz *= envBRDFApprox(specular, texpaint2.g, dotNV); + float dotnv = max(dot(n, v), 0.0); + float3 specular = surface_specular(texcolor, texpaint2.b); + payload.color.xyz *= env_brdf_approx(specular, texpaint2.g, dotnv); #ifdef _FRESNEL - payload.color.xyz /= specularChance; + payload.color.xyz /= specular_chance; #endif } else { - payload.ray_dir = diffuseDir; - payload.color.xyz *= surfaceAlbedo(texcolor, texpaint2.b); + payload.ray_dir = diffuse_dir; + payload.color.xyz *= surface_albedo(texcolor, texpaint2.b); #ifdef _FRESNEL - payload.color.xyz /= 1.0 - specularChance; + payload.color.xyz /= 1.0 - specular_chance; #endif } #ifdef _FRESNEL @@ -341,9 +341,9 @@ kernel void raytracingKernel( // Miss if (payload.color.a < 0) { #ifdef _TRANSPARENCY - if (payload.color.a == -2 && transparentHits < DEPTH_TRANSPARENT) { + if (payload.color.a == -2 && transparent_hits < DEPTH_TRANSPARENT) { payload.color.a = j; - transparentHits++; + transparent_hits++; i--; } #endif @@ -357,7 +357,7 @@ kernel void raytracingKernel( } #ifdef _ROULETTE - payload.color.rgb *= rrFactor; + payload.color.rgb *= rr_factor; #endif ray.origin = payload.ray_origin; diff --git a/base/shaders/raytrace/raytrace_brute_full.metal b/base/shaders/raytrace/raytrace_brute_full.metal index 758aa457..910faca5 100644 --- a/base/shaders/raytrace/raytrace_brute_full.metal +++ b/base/shaders/raytrace/raytrace_brute_full.metal @@ -42,8 +42,8 @@ constant int DEPTH = 3; // Opaque hits constant int DEPTH_TRANSPARENT = 16; // Transparent hits #endif #ifdef _ROULETTE -constant int rrStart = 2; -constant float rrProbability = 0.5; // Map to albedo +constant int rr_start = 2; +constant float rr_probability = 0.5; // Map to albedo #endif void generate_camera_ray(float2 screen_pos, thread float3 & ray_origin, thread float3 & ray_dir, float3 eye, float4x4 inv_vp) { @@ -62,21 +62,21 @@ float2 equirect(float3 normal, float angle) { return float2(theta / PI2, phi / PI); } -float rand(int pixel_i, int pixel_j, int sampleIndex, int sampleDimension, int frame, texture2d sobol, texture2d scramble, texture2d rank) { +float rand(int pixel_i, int pixel_j, int sample_index, int sample_dimension, int frame, texture2d sobol, texture2d scramble, texture2d rank) { pixel_i += frame * 9; pixel_j += frame * 11; pixel_i = pixel_i & 127; pixel_j = pixel_j & 127; - sampleIndex = sampleIndex & 255; - sampleDimension = sampleDimension & 255; + sample_index = sample_index & 255; + sample_dimension = sample_dimension & 255; - int i = sampleDimension + (pixel_i + pixel_j * 128) * 8; - int rankedSampleIndex = sampleIndex ^ int(rank.read(uint2(i % 128, uint(i / 128)), 0).r * 255); + int i = sample_dimension + (pixel_i + pixel_j * 128) * 8; + int ranked_sample_index = sample_index ^ int(rank.read(uint2(i % 128, uint(i / 128)), 0).r * 255); - i = sampleDimension + rankedSampleIndex * 256; + i = sample_dimension + ranked_sample_index * 256; int value = int(sobol.read(uint2(i % 256, uint(i / 256)), 0).r * 255); - i = (sampleDimension % 8) + (pixel_i + pixel_j * 128) * 8; + i = (sample_dimension % 8) + (pixel_i + pixel_j * 128) * 8; value = value ^ int(scramble.read(uint2(i % 128, uint(i / 128)), 0).r * 255); float v = (0.5f + value) / 256.0f; @@ -106,16 +106,16 @@ float3 hit_world_position(ray ray, typename intersector= rrStart) { + float rr_factor = 1.0; + if (i >= rr_start) { float f = rand(tid.x, tid.y, j, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank); - if (f <= rrProbability) { + if (f <= rr_probability) { break; } - rrFactor = 1.0 / (1.0 - rrProbability); + rr_factor = 1.0 / (1.0 - rr_probability); } #endif @@ -275,40 +275,40 @@ kernel void raytracingKernel( seed += 1; #ifdef _TRANSLUCENCY - float3 diffuseDir = texpaint0.a < f ? + float3 diffuse_dir = texpaint0.a < f ? cos_weighted_hemisphere_direction(tid, ray.direction, payload.color.a, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank) : cos_weighted_hemisphere_direction(tid, n, payload.color.a, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank); #else - float3 diffuseDir = cos_weighted_hemisphere_direction(tid, n, payload.color.a, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank); + float3 diffuse_dir = cos_weighted_hemisphere_direction(tid, n, payload.color.a, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank); #endif #ifdef _FRESNEL - float specularChance = fresnel(n, ray.direction); + float specular_chance = fresnel(n, ray.direction); #else - const float specularChance = 0.5; + const float specular_chance = 0.5; #endif - if (f < specularChance) { + if (f < specular_chance) { #ifdef _TRANSLUCENCY - float3 specularDir = texpaint0.a < f * 2 ? ray.direction : reflect(ray.direction, n); + float3 specular_dir = texpaint0.a < f * 2 ? ray.direction : reflect(ray.direction, n); #else - float3 specularDir = reflect(ray.direction, n); + float3 specular_dir = reflect(ray.direction, n); #endif - payload.ray_dir = mix(specularDir, diffuseDir, texpaint2.g * texpaint2.g); + payload.ray_dir = mix(specular_dir, diffuse_dir, texpaint2.g * texpaint2.g); float3 v = normalize(constant_buffer.eye.xyz - hit_world_position(ray, intersection)); - float dotNV = max(dot(n, v), 0.0); - float3 specular = surfaceSpecular(texcolor, texpaint2.b); - payload.color.xyz *= envBRDFApprox(specular, texpaint2.g, dotNV); + float dotnv = max(dot(n, v), 0.0); + float3 specular = surface_specular(texcolor, texpaint2.b); + payload.color.xyz *= env_brdf_approx(specular, texpaint2.g, dotnv); #ifdef _FRESNEL - payload.color.xyz /= specularChance; + payload.color.xyz /= specular_chance; #endif } else { - payload.ray_dir = diffuseDir; - payload.color.xyz *= surfaceAlbedo(texcolor, texpaint2.b); + payload.ray_dir = diffuse_dir; + payload.color.xyz *= surface_albedo(texcolor, texpaint2.b); #ifdef _FRESNEL - payload.color.xyz /= 1.0 - specularChance; + payload.color.xyz /= 1.0 - specular_chance; #endif } #ifdef _FRESNEL @@ -342,9 +342,9 @@ kernel void raytracingKernel( // Miss if (payload.color.a < 0) { #ifdef _TRANSPARENCY - if (payload.color.a == -2 && transparentHits < DEPTH_TRANSPARENT) { + if (payload.color.a == -2 && transparent_hits < DEPTH_TRANSPARENT) { payload.color.a = j; - transparentHits++; + transparent_hits++; i--; } #endif @@ -358,7 +358,7 @@ kernel void raytracingKernel( } #ifdef _ROULETTE - payload.color.rgb *= rrFactor; + payload.color.rgb *= rr_factor; #endif ray.origin = payload.ray_origin; diff --git a/base/shaders/raytrace/src/raytrace_bake_light.hlsl b/base/shaders/raytrace/src/raytrace_bake_light.hlsl index 8ce19fed..687f0e1a 100644 --- a/base/shaders/raytrace/src/raytrace_bake_light.hlsl +++ b/base/shaders/raytrace/src/raytrace_bake_light.hlsl @@ -87,21 +87,21 @@ void raygeneration() { [shader("closesthit")] void closesthit(inout RayPayload payload, in BuiltInTriangleIntersectionAttributes attr) { - const uint triangleIndexStride = 12; // 3 * 4 - uint base_index = PrimitiveIndex() * triangleIndexStride; + const uint triangle_index_stride = 12; // 3 * 4 + uint base_index = PrimitiveIndex() * triangle_index_stride; uint3 indices_sample = indices.Load3(base_index); float3 vertex_normals[3] = { - float3(S16toF32(vertices[indices_sample[0]].nor), S16toF32(vertices[indices_sample[0]].poszw).y), - float3(S16toF32(vertices[indices_sample[1]].nor), S16toF32(vertices[indices_sample[1]].poszw).y), - float3(S16toF32(vertices[indices_sample[2]].nor), S16toF32(vertices[indices_sample[2]].poszw).y) + float3(s16_to_f32(vertices[indices_sample[0]].nor), s16_to_f32(vertices[indices_sample[0]].poszw).y), + float3(s16_to_f32(vertices[indices_sample[1]].nor), s16_to_f32(vertices[indices_sample[1]].poszw).y), + float3(s16_to_f32(vertices[indices_sample[2]].nor), s16_to_f32(vertices[indices_sample[2]].poszw).y) }; float3 n = normalize(hit_attribute(vertex_normals, attr)); float2 vertex_uvs[3] = { - S16toF32(vertices[indices_sample[0]].tex), - S16toF32(vertices[indices_sample[1]].tex), - S16toF32(vertices[indices_sample[2]].tex) + s16_to_f32(vertices[indices_sample[0]].tex), + s16_to_f32(vertices[indices_sample[1]].tex), + s16_to_f32(vertices[indices_sample[2]].tex) }; float2 tex_coord = hit_attribute2d(vertex_uvs, attr); diff --git a/base/shaders/raytrace/src/raytrace_brute.hlsl b/base/shaders/raytrace/src/raytrace_brute.hlsl index e2feaa9b..d86d16f5 100644 --- a/base/shaders/raytrace/src/raytrace_brute.hlsl +++ b/base/shaders/raytrace/src/raytrace_brute.hlsl @@ -57,8 +57,8 @@ static uint seed = 0; static const int DEPTH_TRANSPARENT = 16; // Transparent hits #endif #ifdef _ROULETTE -static const int rrStart = 2; -static const float rrProbability = 0.5; // Map to albedo +static const int rr_start = 2; +static const float rr_probability = 0.5; // Map to albedo #endif [shader("raygeneration")] @@ -81,19 +81,19 @@ void raygeneration() { payload.color = float4(1, 1, 1, j); #ifdef _TRANSPARENCY - int transparentHits = 0; + int transparent_hits = 0; #endif for (int i = 0; i < DEPTH; ++i) { #ifdef _ROULETTE - float rrFactor = 1.0; - if (i >= rrStart) { + float rr_factor = 1.0; + if (i >= rr_start) { float f = rand(DispatchRaysIndex().x, DispatchRaysIndex().y, j, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank); - if (f <= rrProbability) { + if (f <= rr_probability) { break; } - rrFactor = 1.0 / (1.0 - rrProbability); + rr_factor = 1.0 / (1.0 - rr_probability); } #endif @@ -113,9 +113,9 @@ void raygeneration() { // Miss if (payload.color.a < 0) { #ifdef _TRANSPARENCY - if (payload.color.a == -2 && transparentHits < DEPTH_TRANSPARENT) { + if (payload.color.a == -2 && transparent_hits < DEPTH_TRANSPARENT) { payload.color.a = j; - transparentHits++; + transparent_hits++; i--; } #endif @@ -129,7 +129,7 @@ void raygeneration() { } #ifdef _ROULETTE - payload.color.rgb *= rrFactor; + payload.color.rgb *= rr_factor; #endif ray.Origin = payload.ray_origin; @@ -155,14 +155,14 @@ void raygeneration() { [shader("closesthit")] void closesthit(inout RayPayload payload, in BuiltInTriangleIntersectionAttributes attr) { - const uint triangleIndexStride = 12; // 3 * 4 - uint base_index = PrimitiveIndex() * triangleIndexStride; + const uint triangle_index_stride = 12; // 3 * 4 + uint base_index = PrimitiveIndex() * triangle_index_stride; uint3 indices_sample = indices.Load3(base_index); float2 vertex_uvs[3] = { - S16toF32(vertices[indices_sample[0]].tex), - S16toF32(vertices[indices_sample[1]].tex), - S16toF32(vertices[indices_sample[2]].tex) + s16_to_f32(vertices[indices_sample[0]].tex), + s16_to_f32(vertices[indices_sample[1]].tex), + s16_to_f32(vertices[indices_sample[2]].tex) }; float2 tex_coord = hit_attribute2d(vertex_uvs, attr) * constant_buffer.params.z; @@ -181,9 +181,9 @@ void closesthit(inout RayPayload payload, in BuiltInTriangleIntersectionAttribut #endif float3 vertex_normals[3] = { - float3(S16toF32(vertices[indices_sample[0]].nor), S16toF32(vertices[indices_sample[0]].poszw).y), - float3(S16toF32(vertices[indices_sample[1]].nor), S16toF32(vertices[indices_sample[1]].poszw).y), - float3(S16toF32(vertices[indices_sample[2]].nor), S16toF32(vertices[indices_sample[2]].poszw).y) + float3(s16_to_f32(vertices[indices_sample[0]].nor), s16_to_f32(vertices[indices_sample[0]].poszw).y), + float3(s16_to_f32(vertices[indices_sample[1]].nor), s16_to_f32(vertices[indices_sample[1]].poszw).y), + float3(s16_to_f32(vertices[indices_sample[2]].nor), s16_to_f32(vertices[indices_sample[2]].poszw).y) }; float3 n = normalize(hit_attribute(vertex_normals, attr)); @@ -209,40 +209,40 @@ void closesthit(inout RayPayload payload, in BuiltInTriangleIntersectionAttribut seed += 1; #ifdef _TRANSLUCENCY - float3 diffuseDir = texpaint0.a < f ? + float3 diffuse_dir = texpaint0.a < f ? cos_weighted_hemisphere_direction(WorldRayDirection(), payload.color.a, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank) : cos_weighted_hemisphere_direction(n, payload.color.a, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank); #else - float3 diffuseDir = cos_weighted_hemisphere_direction(n, payload.color.a, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank); + float3 diffuse_dir = cos_weighted_hemisphere_direction(n, payload.color.a, seed, constant_buffer.eye.w, mytexture_sobol, mytexture_scramble, mytexture_rank); #endif #ifdef _FRESNEL - float specularChance = fresnel(n, WorldRayDirection()); + float specular_chance = fresnel(n, WorldRayDirection()); #else - const float specularChance = 0.5; + const float specular_chance = 0.5; #endif - if (f < specularChance) { + if (f < specular_chance) { #ifdef _TRANSLUCENCY - float3 specularDir = texpaint0.a < f * 2 ? WorldRayDirection() : reflect(WorldRayDirection(), n); + float3 specular_dir = texpaint0.a < f * 2 ? WorldRayDirection() : reflect(WorldRayDirection(), n); #else - float3 specularDir = reflect(WorldRayDirection(), n); + float3 specular_dir = reflect(WorldRayDirection(), n); #endif - payload.ray_dir = lerp(specularDir, diffuseDir, texpaint2.g * texpaint2.g); + payload.ray_dir = lerp(specular_dir, diffuse_dir, texpaint2.g * texpaint2.g); float3 v = normalize(constant_buffer.eye.xyz - hit_world_position()); - float dotNV = max(dot(n, v), 0.0); - float3 specular = surfaceSpecular(texcolor, texpaint2.b); - payload.color.xyz *= envBRDFApprox(specular, texpaint2.g, dotNV); + float dotnv = max(dot(n, v), 0.0); + float3 specular = surface_specular(texcolor, texpaint2.b); + payload.color.xyz *= env_brdf_approx(specular, texpaint2.g, dotnv); #ifdef _FRESNEL - payload.color.xyz /= specularChance; + payload.color.xyz /= specular_chance; #endif } else { - payload.ray_dir = diffuseDir; - payload.color.xyz *= surfaceAlbedo(texcolor, texpaint2.b); + payload.ray_dir = diffuse_dir; + payload.color.xyz *= surface_albedo(texcolor, texpaint2.b); #ifdef _FRESNEL - payload.color.xyz /= 1.0 - specularChance; + payload.color.xyz /= 1.0 - specular_chance; #endif } #ifdef _FRESNEL diff --git a/base/shaders/raytrace/src/std/attrib.hlsl b/base/shaders/raytrace/src/std/attrib.hlsl index 3fa5f682..f065dd95 100644 --- a/base/shaders/raytrace/src/std/attrib.hlsl +++ b/base/shaders/raytrace/src/std/attrib.hlsl @@ -2,7 +2,7 @@ #ifndef _ATTRIB_HLSL_ #define _ATTRIB_HLSL_ -float2 S16toF32(uint val) { +float2 s16_to_f32(uint val) { int a = (int)(val << 16) >> 16; int b = (int)(val & 0xffff0000) >> 16; return float2(a, b) / 32767.0f; @@ -12,16 +12,16 @@ float3 hit_world_position() { return WorldRayOrigin() + RayTCurrent() * WorldRayDirection(); } -float3 hit_attribute(float3 vertexAttribute[3], BuiltInTriangleIntersectionAttributes attr) { - return vertexAttribute[0] + - attr.barycentrics.x * (vertexAttribute[1] - vertexAttribute[0]) + - attr.barycentrics.y * (vertexAttribute[2] - vertexAttribute[0]); +float3 hit_attribute(float3 vertex_attribute[3], BuiltInTriangleIntersectionAttributes attr) { + return vertex_attribute[0] + + attr.barycentrics.x * (vertex_attribute[1] - vertex_attribute[0]) + + attr.barycentrics.y * (vertex_attribute[2] - vertex_attribute[0]); } -float2 hit_attribute2d(float2 vertexAttribute[3], BuiltInTriangleIntersectionAttributes attr) { - return vertexAttribute[0] + - attr.barycentrics.x * (vertexAttribute[1] - vertexAttribute[0]) + - attr.barycentrics.y * (vertexAttribute[2] - vertexAttribute[0]); +float2 hit_attribute2d(float2 vertex_attribute[3], BuiltInTriangleIntersectionAttributes attr) { + return vertex_attribute[0] + + attr.barycentrics.x * (vertex_attribute[1] - vertex_attribute[0]) + + attr.barycentrics.y * (vertex_attribute[2] - vertex_attribute[0]); } #endif diff --git a/base/shaders/raytrace/src/std/math.hlsl b/base/shaders/raytrace/src/std/math.hlsl index 475187d9..39d07d58 100644 --- a/base/shaders/raytrace/src/std/math.hlsl +++ b/base/shaders/raytrace/src/std/math.hlsl @@ -44,20 +44,20 @@ float3 cos_weighted_hemisphere_direction(float3 n, uint sample, uint seed, int f return normalize(n + float3(x, y, z)); } -float3 surfaceAlbedo(const float3 baseColor, const float metalness) { - return lerp(baseColor, float3(0.0, 0.0, 0.0), metalness); +float3 surface_albedo(const float3 base_color, const float metalness) { + return lerp(base_color, float3(0.0, 0.0, 0.0), metalness); } -float3 surfaceSpecular(const float3 baseColor, const float metalness) { - return lerp(float3(0.04, 0.04, 0.04), baseColor, metalness); +float3 surface_specular(const float3 base_color, const float metalness) { + return lerp(float3(0.04, 0.04, 0.04), base_color, metalness); } // https://www.unrealengine.com/en-US/blog/physically-based-shading-on-mobile -float3 envBRDFApprox(float3 specular, float roughness, float dotNV) { +float3 env_brdf_approx(float3 specular, float roughness, float dotnv) { const float4 c0 = float4(-1, -0.0275, -0.572, 0.022); const float4 c1 = float4(1, 0.0425, 1.04, -0.04); float4 r = roughness * c0 + c1; - float a004 = min(r.x * r.x, exp2(-9.28 * dotNV)) * r.x + r.y; + float a004 = min(r.x * r.x, exp2(-9.28 * dotnv)) * r.x + r.y; float2 ab = float2(-1.04, 1.04) * a004 + r.zw; return specular * ab.x + ab.y; } diff --git a/base/shaders/raytrace/src/std/rand.hlsl b/base/shaders/raytrace/src/std/rand.hlsl index c627aa16..67a69e23 100644 --- a/base/shaders/raytrace/src/std/rand.hlsl +++ b/base/shaders/raytrace/src/std/rand.hlsl @@ -5,25 +5,25 @@ // A Low-Discrepancy Sampler that Distributes Monte Carlo Errors as a Blue Noise in Screen Space // Eric Heitz, Laurent Belcour, Victor Ostromoukhov, David Coeurjolly and Jean-Claude Iehl // https://eheitzresearch.wordpress.com/762-2/ -float rand(int pixel_i, int pixel_j, int sampleIndex, int sampleDimension, int frame, Texture2D sobol, Texture2D scramble, Texture2D rank) { +float rand(int pixel_i, int pixel_j, int sample_index, int sample_dimension, int frame, Texture2D sobol, Texture2D scramble, Texture2D rank) { // wrap arguments pixel_i += frame * 9; pixel_j += frame * 11; pixel_i = pixel_i & 127; pixel_j = pixel_j & 127; - sampleIndex = sampleIndex & 255; - sampleDimension = sampleDimension & 255; + sample_index = sample_index & 255; + sample_dimension = sample_dimension & 255; // xor index based on optimized ranking - int i = sampleDimension + (pixel_i + pixel_j * 128) * 8; - int rankedSampleIndex = sampleIndex ^ int(rank.Load(uint3(i % 128, uint(i / 128), 0)).r * 255); + int i = sample_dimension + (pixel_i + pixel_j * 128) * 8; + int ranked_sample_index = sample_index ^ int(rank.Load(uint3(i % 128, uint(i / 128), 0)).r * 255); // fetch value in sequence - i = sampleDimension + rankedSampleIndex * 256; + i = sample_dimension + ranked_sample_index * 256; int value = int(sobol.Load(uint3(i % 256, uint(i / 256), 0)).r * 255); // If the dimension is optimized, xor sequence value based on optimized scrambling - i = (sampleDimension % 8) + (pixel_i + pixel_j * 128) * 8; + i = (sample_dimension % 8) + (pixel_i + pixel_j * 128) * 8; value = value ^ int(scramble.Load(uint3(i % 128, uint(i / 128), 0)).r * 255); // convert to float and return diff --git a/base/shaders/smaa_blend_weight.frag.glsl b/base/shaders/smaa_blend_weight.frag.glsl index e2c5b172..313cac02 100644 --- a/base/shaders/smaa_blend_weight.frag.glsl +++ b/base/shaders/smaa_blend_weight.frag.glsl @@ -15,33 +15,30 @@ #define saturate(a) clamp(a, 0.0, 1.0) #define round(a) floor(a + 0.5) -uniform sampler2D edgesTex; -uniform sampler2D areaTex; -uniform sampler2D searchTex; -uniform vec2 screenSize; -uniform vec2 screenSizeInv; +uniform sampler2D edges_tex; +uniform sampler2D area_tex; +uniform sampler2D search_tex; +uniform vec2 screen_size; +uniform vec2 screen_size_inv; -in vec2 texCoord; +in vec2 tex_coord; in vec2 pixcoord; in vec4 offset0; in vec4 offset1; in vec4 offset2; -out vec4 fragColor; - -vec2 screenSizeLocal; -vec2 screenSizeInvLocal; +out vec4 frag_color; // Blending Weight Calculation Pixel Shader (Second Pass) vec2 cdw_end; -vec4 textureLodA(sampler2D tex, vec2 coord, float lod) { +vec4 textureLod_a(sampler2D tex, vec2 coord, float lod) { #if defined(HLSL) || defined(METAL) || defined(SPIRV) coord.y = 1.0 - coord.y; #endif return textureLod(tex, coord, lod); } -#define SMAASampleLevelZeroOffset(tex, coord, offset) textureLodA(tex, coord + offset * screenSizeInv.xy, 0.0) +#define smaa_sample_level_zero_offset(tex, coord, offset) textureLod_a(tex, coord + offset * screen_size_inv.xy, 0.0) //----------------------------------------------------------------------------- // Diagonal Search Functions @@ -50,7 +47,7 @@ vec4 textureLodA(sampler2D tex, vec2 coord, float lod) { /** * Allows to decode two binary values from a bilinear-filtered access. */ -vec2 SMAADecodeDiagBilinearAccess(vec2 e) { +vec2 smaa_decode_diag_bilinear_access(vec2 e) { // Bilinear access for fetching 'e' have a 0.25 offset, and we are // interested in the R and G edges: // @@ -68,7 +65,7 @@ vec2 SMAADecodeDiagBilinearAccess(vec2 e) { return round(e); } -vec4 SMAADecodeDiagBilinearAccess(vec4 e) { +vec4 smaa_decode_diag_bilinear_access(vec4 e) { e.rb = e.rb * abs(5.0 * e.rb - 5.0 * 0.75); return round(e); } @@ -76,28 +73,27 @@ vec4 SMAADecodeDiagBilinearAccess(vec4 e) { /** * These functions allows to perform diagonal pattern searches. */ -vec2 SMAASearchDiag1(vec2 texcoord, vec2 dir/*, out vec2 e*/) { +vec2 smaa_search_diag1(vec2 texcoord, vec2 dir/*, out vec2 e*/) { vec4 coord = vec4(texcoord, -1.0, 1.0); - vec3 t = vec3(screenSizeInv.xy, 1.0); + vec3 t = vec3(screen_size_inv.xy, 1.0); while (coord.z < float(SMAA_MAX_SEARCH_STEPS_DIAG - 1) && coord.w > 0.9) { coord.xyz = mad(t, vec3(dir, 1.0), coord.xyz); - cdw_end /*e*/ = textureLodA(edgesTex, coord.xy, 0.0).rg; + cdw_end /*e*/ = textureLod_a(edges_tex, coord.xy, 0.0).rg; coord.w = dot(cdw_end /*e*/, vec2(0.5, 0.5)); } return coord.zw; } -vec2 SMAASearchDiag2(vec2 texcoord, vec2 dir) { +vec2 smaa_search_diag2(vec2 texcoord, vec2 dir) { vec4 coord = vec4(texcoord, -1.0, 1.0); - coord.x += 0.25 * screenSizeInvLocal.x; // See @SearchDiag2Optimization - vec3 t = vec3(screenSizeInv.xy, 1.0); + coord.x += 0.25 * screen_size_inv.x; + vec3 t = vec3(screen_size_inv.xy, 1.0); float cw = coord.w; // TODO: krafix hlsl bug while (coord.z < float(SMAA_MAX_SEARCH_STEPS_DIAG - 1) && cw > 0.9) { coord.xyz = mad(t, vec3(dir, 1.0), coord.xyz); - // @SearchDiag2Optimization // Fetch both edges at once using bilinear filtering: - cdw_end /*e*/ = textureLodA(edgesTex, coord.xy, 0.0).rg; - cdw_end /*e*/ = SMAADecodeDiagBilinearAccess(cdw_end /*e*/); + cdw_end /*e*/ = textureLod_a(edges_tex, coord.xy, 0.0).rg; + cdw_end /*e*/ = smaa_decode_diag_bilinear_access(cdw_end /*e*/); cw = dot(cdw_end /*e*/, vec2(0.5, 0.5)); } coord.w = cw; @@ -105,10 +101,10 @@ vec2 SMAASearchDiag2(vec2 texcoord, vec2 dir) { } /** - * Similar to SMAAArea, this calculates the area corresponding to a certain + * Similar to smaa_area, this calculates the area corresponding to a certain * diagonal distance and crossing edges 'e'. */ -vec2 SMAAAreaDiag(vec2 dist, vec2 e, float offset) { +vec2 smaa_area_diag(vec2 dist, vec2 e, float offset) { vec2 texcoord = mad(vec2(SMAA_AREATEX_MAX_DISTANCE_DIAG, SMAA_AREATEX_MAX_DISTANCE_DIAG), e, dist); // We do a scale and bias for mapping to texel space: @@ -121,36 +117,36 @@ vec2 SMAAAreaDiag(vec2 dist, vec2 e, float offset) { texcoord.y += SMAA_AREATEX_SUBTEX_SIZE * offset; // Do it! - return SMAA_AREATEX_SELECT(textureLod(areaTex, texcoord, 0.0)); + return SMAA_AREATEX_SELECT(textureLod(area_tex, texcoord, 0.0)); } /** * This searches for diagonal patterns and returns the corresponding weights. */ -vec2 SMAACalculateDiagWeights(vec2 texcoord, vec2 e, vec4 subsampleIndices) { +vec2 smaa_calculate_diag_weights(vec2 texcoord, vec2 e, vec4 subsample_indices) { vec2 weights = vec2(0.0, 0.0); // Search for the line ends: vec4 d; if (e.r > 0.0) { - d.xz = SMAASearchDiag1(texcoord, vec2(-1.0, 1.0)/*, cdw_end*/); + d.xz = smaa_search_diag1(texcoord, vec2(-1.0, 1.0)/*, cdw_end*/); float dadd = cdw_end.y > 0.9 ? 1.0 : 0.0; d.x += dadd; } else { d.xz = vec2(0.0, 0.0); } - d.yw = SMAASearchDiag1(texcoord, vec2(1.0, -1.0)/*, cdw_end*/); + d.yw = smaa_search_diag1(texcoord, vec2(1.0, -1.0)/*, cdw_end*/); //SMAA_BRANCH if (d.x + d.y > 2.0) { // d.x + d.y + 1 > 3 // Fetch the crossing edges: - vec4 coords = mad(vec4(-d.x + 0.25, d.x, d.y, -d.y - 0.25), screenSizeInvLocal.xyxy, texcoord.xyxy); + vec4 coords = mad(vec4(-d.x + 0.25, d.x, d.y, -d.y - 0.25), screen_size_inv.xyxy, texcoord.xyxy); vec4 c; - c.xy = SMAASampleLevelZeroOffset(edgesTex, coords.xy, ivec2(-1, 0)).rg; - c.zw = SMAASampleLevelZeroOffset(edgesTex, coords.zw, ivec2( 1, 0)).rg; - c.yxwz = SMAADecodeDiagBilinearAccess(c.xyzw); + c.xy = smaa_sample_level_zero_offset(edges_tex, coords.xy, ivec2(-1, 0)).rg; + c.zw = smaa_sample_level_zero_offset(edges_tex, coords.zw, ivec2( 1, 0)).rg; + c.yxwz = smaa_decode_diag_bilinear_access(c.xyzw); // Merge crossing edges at each side into a single value: vec2 cc = mad(vec2(2.0, 2.0), c.xz, c.yw); @@ -163,13 +159,13 @@ vec2 SMAACalculateDiagWeights(vec2 texcoord, vec2 e, vec4 subsampleIndices) { if (a1condy == 1.0) cc.y = 0.0; // Fetch the areas for this line: - weights += SMAAAreaDiag(d.xy, cc, subsampleIndices.z); + weights += smaa_area_diag(d.xy, cc, subsample_indices.z); } // Search for the line ends: - d.xz = SMAASearchDiag2(texcoord, vec2(-1.0, -1.0)/*, cdw_end*/); - if (SMAASampleLevelZeroOffset(edgesTex, texcoord, ivec2(1, 0)).r > 0.0) { - d.yw = SMAASearchDiag2(texcoord, vec2(1.0, 1.0)/*, cdw_end*/); + d.xz = smaa_search_diag2(texcoord, vec2(-1.0, -1.0)/*, cdw_end*/); + if (smaa_sample_level_zero_offset(edges_tex, texcoord, ivec2(1, 0)).r > 0.0) { + d.yw = smaa_search_diag2(texcoord, vec2(1.0, 1.0)/*, cdw_end*/); float dadd = cdw_end.y > 0.9 ? 1.0 : 0.0; d.y += dadd; } @@ -180,11 +176,11 @@ vec2 SMAACalculateDiagWeights(vec2 texcoord, vec2 e, vec4 subsampleIndices) { // SMAA_BRANCH if (d.x + d.y > 2.0) { // d.x + d.y + 1 > 3 // Fetch the crossing edges: - vec4 coords = mad(vec4(-d.x, -d.x, d.y, d.y), screenSizeInvLocal.xyxy, texcoord.xyxy); + vec4 coords = mad(vec4(-d.x, -d.x, d.y, d.y), screen_size_inv.xyxy, texcoord.xyxy); vec4 c; - c.x = SMAASampleLevelZeroOffset(edgesTex, coords.xy, ivec2(-1, 0)).g; - c.y = SMAASampleLevelZeroOffset(edgesTex, coords.xy, ivec2( 0, -1)).r; - c.zw = SMAASampleLevelZeroOffset(edgesTex, coords.zw, ivec2( 1, 0)).gr; + c.x = smaa_sample_level_zero_offset(edges_tex, coords.xy, ivec2(-1, 0)).g; + c.y = smaa_sample_level_zero_offset(edges_tex, coords.xy, ivec2( 0, -1)).r; + c.zw = smaa_sample_level_zero_offset(edges_tex, coords.zw, ivec2( 1, 0)).gr; vec2 cc = mad(vec2(2.0, 2.0), c.xz, c.yw); // Remove the crossing edge if we didn't found the end of the line: @@ -195,7 +191,7 @@ vec2 SMAACalculateDiagWeights(vec2 texcoord, vec2 e, vec4 subsampleIndices) { if (a1condy == 1.0) cc.y = 0.0; // Fetch the areas for this line: - weights += SMAAAreaDiag(d.xy, cc, subsampleIndices.w).gr; + weights += smaa_area_diag(d.xy, cc, subsample_indices.w).gr; } return weights; @@ -211,7 +207,7 @@ vec2 SMAACalculateDiagWeights(vec2 texcoord, vec2 e, vec4 subsampleIndices) { * @PSEUDO_GATHER4), and adds 0, 1 or 2, depending on which edges and * crossing edges are active. */ -float SMAASearchLength(vec2 e, float offset) { +float smaa_search_length(vec2 e, float offset) { // The texture is flipped vertically, with left and right cases taking half // of the space horizontally: vec2 scale = SMAA_SEARCHTEX_SIZE * vec2(0.5, -1.0); @@ -229,13 +225,13 @@ float SMAASearchLength(vec2 e, float offset) { vec2 coord = mad(scale, e, bias); // Lookup the search texture: - return SMAA_SEARCHTEX_SELECT(textureLod(searchTex, coord, 0.0)); + return SMAA_SEARCHTEX_SELECT(textureLod(search_tex, coord, 0.0)); } /** * Horizontal/vertical search functions for the 2nd pass. */ -float SMAASearchXLeft(vec2 texcoord, float end) { +float smaa_search_x_left(vec2 texcoord, float end) { /** * @PSEUDO_GATHER4 * This texcoord has been offset by (-0.25, -0.125) in the vertex shader to @@ -247,56 +243,56 @@ float SMAASearchXLeft(vec2 texcoord, float end) { while (texcoord.x > end && e.g > 0.8281 && // Is there some edge not activated? e.r == 0.0) { // Or is there a crossing edge that breaks the line? - e = textureLodA(edgesTex, texcoord, 0.0).rg; - texcoord = mad(-vec2(2.0, 0.0), screenSizeInvLocal.xy, texcoord); + e = textureLod_a(edges_tex, texcoord, 0.0).rg; + texcoord = mad(-vec2(2.0, 0.0), screen_size_inv.xy, texcoord); } - float offset = mad(-(255.0 / 127.0), SMAASearchLength(e, 0.0), 3.25); - return mad(screenSizeInvLocal.x, offset, texcoord.x); + float offset = mad(-(255.0 / 127.0), smaa_search_length(e, 0.0), 3.25); + return mad(screen_size_inv.x, offset, texcoord.x); } -float SMAASearchXRight(vec2 texcoord, float end) { +float smaa_search_x_right(vec2 texcoord, float end) { vec2 e = vec2(0.0, 1.0); while (texcoord.x < end && e.g > 0.8281 && // Is there some edge not activated? e.r == 0.0) { // Or is there a crossing edge that breaks the line? - e = textureLodA(edgesTex, texcoord, 0.0).rg; - texcoord = mad(vec2(2.0, 0.0), screenSizeInvLocal.xy, texcoord); + e = textureLod_a(edges_tex, texcoord, 0.0).rg; + texcoord = mad(vec2(2.0, 0.0), screen_size_inv.xy, texcoord); } - float offset = mad(-(255.0 / 127.0), SMAASearchLength(e, 0.5), 3.25); - return mad(-screenSizeInvLocal.x, offset, texcoord.x); + float offset = mad(-(255.0 / 127.0), smaa_search_length(e, 0.5), 3.25); + return mad(-screen_size_inv.x, offset, texcoord.x); } -float SMAASearchYUp(vec2 texcoord, float end) { +float smaa_search_y_up(vec2 texcoord, float end) { vec2 e = vec2(1.0, 0.0); while (texcoord.y > end && e.r > 0.8281 && // Is there some edge not activated? e.g == 0.0) { // Or is there a crossing edge that breaks the line? - e = textureLodA(edgesTex, texcoord, 0.0).rg; - texcoord = mad(-vec2(0.0, 2.0), screenSizeInvLocal.xy, texcoord); + e = textureLod_a(edges_tex, texcoord, 0.0).rg; + texcoord = mad(-vec2(0.0, 2.0), screen_size_inv.xy, texcoord); } - float offset = mad(-(255.0 / 127.0), SMAASearchLength(e.gr, 0.0), 3.25); - return mad(screenSizeInvLocal.y, offset, texcoord.y); + float offset = mad(-(255.0 / 127.0), smaa_search_length(e.gr, 0.0), 3.25); + return mad(screen_size_inv.y, offset, texcoord.y); } -float SMAASearchYDown(vec2 texcoord, float end) { +float smaa_search_y_down(vec2 texcoord, float end) { vec2 e = vec2(1.0, 0.0); while (texcoord.y < end && e.r > 0.8281 && // Is there some edge not activated? e.g == 0.0) { // Or is there a crossing edge that breaks the line? - e = textureLodA(edgesTex, texcoord, 0.0).rg; - texcoord = mad(vec2(0.0, 2.0), screenSizeInvLocal.xy, texcoord); + e = textureLod_a(edges_tex, texcoord, 0.0).rg; + texcoord = mad(vec2(0.0, 2.0), screen_size_inv.xy, texcoord); } - float offset = mad(-(255.0 / 127.0), SMAASearchLength(/*searchTex,*/ e.gr, 0.5), 3.25); - return mad(-screenSizeInvLocal.y, offset, texcoord.y); + float offset = mad(-(255.0 / 127.0), smaa_search_length(/*search_tex,*/ e.gr, 0.5), 3.25); + return mad(-screen_size_inv.y, offset, texcoord.y); } /** * Ok, we have the distance and both crossing edges. So, what are the areas * at each side of current edge? */ -vec2 SMAAArea(vec2 dist, float e1, float e2, float offset) { +vec2 smaa_area(vec2 dist, float e1, float e2, float offset) { // Rounding prevents precision errors of bilinear filtering: vec2 texcoord = mad(vec2(SMAA_AREATEX_MAX_DISTANCE, SMAA_AREATEX_MAX_DISTANCE), round(4.0 * vec2(e1, e2)), dist); @@ -307,42 +303,42 @@ vec2 SMAAArea(vec2 dist, float e1, float e2, float offset) { texcoord.y = mad(SMAA_AREATEX_SUBTEX_SIZE, offset, texcoord.y); // Do it! - return SMAA_AREATEX_SELECT(textureLod(areaTex, texcoord, 0.0)); + return SMAA_AREATEX_SELECT(textureLod(area_tex, texcoord, 0.0)); } //----------------------------------------------------------------------------- // Corner Detection Functions -vec2 SMAADetectHorizontalCornerPattern(vec2 weights, vec4 texcoord, vec2 d) { +vec2 smaa_detect_horizontal_corner_pattern(vec2 weights, vec4 texcoord, vec2 d) { // #if !defined(SMAA_DISABLE_CORNER_DETECTION) - vec2 leftRight = step(d.xy, d.yx); - vec2 rounding = (1.0 - SMAA_CORNER_ROUNDING_NORM) * leftRight; + vec2 left_right = step(d.xy, d.yx); + vec2 rounding = (1.0 - SMAA_CORNER_ROUNDING_NORM) * left_right; - rounding /= leftRight.x + leftRight.y; // Reduce blending for pixels in the center of a line. + rounding /= left_right.x + left_right.y; // Reduce blending for pixels in the center of a line. vec2 factor = vec2(1.0, 1.0); - factor.x -= rounding.x * SMAASampleLevelZeroOffset(edgesTex, texcoord.xy, ivec2(0, 1)).r; - factor.x -= rounding.y * SMAASampleLevelZeroOffset(edgesTex, texcoord.zw, ivec2(1, 1)).r; - factor.y -= rounding.x * SMAASampleLevelZeroOffset(edgesTex, texcoord.xy, ivec2(0, -2)).r; - factor.y -= rounding.y * SMAASampleLevelZeroOffset(edgesTex, texcoord.zw, ivec2(1, -2)).r; + factor.x -= rounding.x * smaa_sample_level_zero_offset(edges_tex, texcoord.xy, ivec2(0, 1)).r; + factor.x -= rounding.y * smaa_sample_level_zero_offset(edges_tex, texcoord.zw, ivec2(1, 1)).r; + factor.y -= rounding.x * smaa_sample_level_zero_offset(edges_tex, texcoord.xy, ivec2(0, -2)).r; + factor.y -= rounding.y * smaa_sample_level_zero_offset(edges_tex, texcoord.zw, ivec2(1, -2)).r; weights *= saturate(factor); return weights; // // #endif } -vec2 SMAADetectVerticalCornerPattern(vec2 weights, vec4 texcoord, vec2 d) { +vec2 smaa_detect_vertical_corner_pattern(vec2 weights, vec4 texcoord, vec2 d) { //#if !defined(SMAA_DISABLE_CORNER_DETECTION) - vec2 leftRight = step(d.xy, d.yx); - vec2 rounding = (1.0 - SMAA_CORNER_ROUNDING_NORM) * leftRight; + vec2 left_right = step(d.xy, d.yx); + vec2 rounding = (1.0 - SMAA_CORNER_ROUNDING_NORM) * left_right; - rounding /= leftRight.x + leftRight.y; + rounding /= left_right.x + left_right.y; vec2 factor = vec2(1.0, 1.0); - factor.x -= rounding.x * SMAASampleLevelZeroOffset(edgesTex, texcoord.xy, ivec2( 1, 0)).g; - factor.x -= rounding.y * SMAASampleLevelZeroOffset(edgesTex, texcoord.zw, ivec2( 1, 1)).g; - factor.y -= rounding.x * SMAASampleLevelZeroOffset(edgesTex, texcoord.xy, ivec2(-2, 0)).g; - factor.y -= rounding.y * SMAASampleLevelZeroOffset(edgesTex, texcoord.zw, ivec2(-2, 1)).g; + factor.x -= rounding.x * smaa_sample_level_zero_offset(edges_tex, texcoord.xy, ivec2( 1, 0)).g; + factor.x -= rounding.y * smaa_sample_level_zero_offset(edges_tex, texcoord.zw, ivec2( 1, 1)).g; + factor.y -= rounding.x * smaa_sample_level_zero_offset(edges_tex, texcoord.xy, ivec2(-2, 0)).g; + factor.y -= rounding.y * smaa_sample_level_zero_offset(edges_tex, texcoord.zw, ivec2(-2, 1)).g; weights *= saturate(factor); return weights; // @@ -350,18 +346,17 @@ vec2 SMAADetectVerticalCornerPattern(vec2 weights, vec4 texcoord, vec2 d) { } -vec4 SMAABlendingWeightCalculationPS(vec2 texcoord, vec2 pixcoord, - vec4 subsampleIndices) { // Just pass zero for SMAA 1x, see @SUBSAMPLE_INDICES. +vec4 smaa_blending_weight_calculation_ps(vec2 texcoord, vec2 pixcoord, vec4 subsample_indices) { // Just pass zero for SMAA 1x, see @SUBSAMPLE_INDICES. vec4 weights = vec4(0.0, 0.0, 0.0, 0.0); - vec2 e = textureLodA(edgesTex, texcoord, 0.0).rg; + vec2 e = textureLod_a(edges_tex, texcoord, 0.0).rg; //SMAA_BRANCH if (e.g > 0.0) { // Edge at north //#if !defined(SMAA_DISABLE_DIAG_DETECTION) // Diagonals have both north and west edges, so searching for them in // one of the boundaries is enough. - weights.rg = SMAACalculateDiagWeights(texcoord, e, subsampleIndices); + weights.rg = smaa_calculate_diag_weights(texcoord, e, subsample_indices); // We give priority to diagonals, so if we find a diagonal we skip // horizontal/vertical processing. @@ -373,37 +368,37 @@ vec4 SMAABlendingWeightCalculationPS(vec2 texcoord, vec2 pixcoord, // Find the distance to the left: vec3 coords; - coords.x = SMAASearchXLeft(offset0.xy, offset2.x); - coords.y = offset1.y; // offset[1].y = texcoord.y - 0.25 * screenSizeInv.y (@CROSSING_OFFSET) + coords.x = smaa_search_x_left(offset0.xy, offset2.x); + coords.y = offset1.y; // offset[1].y = texcoord.y - 0.25 * screen_size_inv.y (@CROSSING_OFFSET) d.x = coords.x; // Now fetch the left crossing edges, two at a time using bilinear // filtering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to // discern what value each edge has: - float e1 = textureLodA(edgesTex, coords.xy, 0.0).r; + float e1 = textureLod_a(edges_tex, coords.xy, 0.0).r; // Find the distance to the right: - coords.z = SMAASearchXRight(offset0.zw, offset2.y); + coords.z = smaa_search_x_right(offset0.zw, offset2.y); d.y = coords.z; // We want the distances to be in pixel units (doing this here allow to // better interleave arithmetic and memory accesses): - d = abs(round(mad(screenSizeLocal.xx, d, -pixcoord.xx))); + d = abs(round(mad(screen_size.xx, d, -pixcoord.xx))); - // SMAAArea below needs a sqrt, as the areas texture is compressed + // smaa_area below needs a sqrt, as the areas texture is compressed // quadratically: vec2 sqrt_d = sqrt(d); // Fetch the right crossing edges: - float e2 = SMAASampleLevelZeroOffset(edgesTex, coords.zy, ivec2(1, 0)).r; + float e2 = smaa_sample_level_zero_offset(edges_tex, coords.zy, ivec2(1, 0)).r; // Ok, we know how this pattern looks like, now it is time for getting // the actual area: - weights.rg = SMAAArea(sqrt_d, e1, e2, subsampleIndices.y); + weights.rg = smaa_area(sqrt_d, e1, e2, subsample_indices.y); // Fix corners: coords.y = texcoord.y; - weights.rg = SMAADetectHorizontalCornerPattern(weights.rg, coords.xyzy, d); + weights.rg = smaa_detect_horizontal_corner_pattern(weights.rg, coords.xyzy, d); //#if !defined(SMAA_DISABLE_DIAG_DETECTION) } @@ -419,40 +414,38 @@ vec4 SMAABlendingWeightCalculationPS(vec2 texcoord, vec2 pixcoord, // Find the distance to the top: vec3 coords; - coords.y = SMAASearchYUp(/*edgesTex, searchTex,*/ offset1.xy, offset2.z); - coords.x = offset0.x; // offset[1].x = texcoord.x - 0.25 * screenSizeInv.x; + coords.y = smaa_search_y_up(/*edges_tex, search_tex,*/ offset1.xy, offset2.z); + coords.x = offset0.x; // offset[1].x = texcoord.x - 0.25 * screen_size_inv.x; d.x = coords.y; // Fetch the top crossing edges: - float e1 = textureLodA(edgesTex, coords.xy, 0.0).g; + float e1 = textureLod_a(edges_tex, coords.xy, 0.0).g; // Find the distance to the bottom: - coords.z = SMAASearchYDown(offset1.zw, offset2.w); + coords.z = smaa_search_y_down(offset1.zw, offset2.w); d.y = coords.z; // We want the distances to be in pixel units: - d = abs(round(mad(screenSizeLocal.yy, d, -pixcoord.yy))); + d = abs(round(mad(screen_size.yy, d, -pixcoord.yy))); - // SMAAArea below needs a sqrt, as the areas texture is compressed + // smaa_area below needs a sqrt, as the areas texture is compressed // quadratically: vec2 sqrt_d = sqrt(d); // Fetch the bottom crossing edges: - float e2 = SMAASampleLevelZeroOffset(edgesTex, coords.xz, ivec2(0, 1)).g; + float e2 = smaa_sample_level_zero_offset(edges_tex, coords.xz, ivec2(0, 1)).g; // Get the area for this direction: - weights.ba = SMAAArea(sqrt_d, e1, e2, subsampleIndices.x); + weights.ba = smaa_area(sqrt_d, e1, e2, subsample_indices.x); // Fix corners: coords.x = texcoord.x; - weights.ba = SMAADetectVerticalCornerPattern(weights.ba, coords.xyxz, d); + weights.ba = smaa_detect_vertical_corner_pattern(weights.ba, coords.xyxz, d); } return weights; } void main() { - screenSizeLocal = screenSize; // TODO: SPIRV workaround - screenSizeInvLocal = screenSizeInv; // TODO: SPIRV workaround - fragColor = SMAABlendingWeightCalculationPS(texCoord, pixcoord, vec4(0.0)); + frag_color = smaa_blending_weight_calculation_ps(tex_coord, pixcoord, vec4(0.0)); } diff --git a/base/shaders/smaa_blend_weight.vert.glsl b/base/shaders/smaa_blend_weight.vert.glsl index 7c1f59e6..b38a9fff 100644 --- a/base/shaders/smaa_blend_weight.vert.glsl +++ b/base/shaders/smaa_blend_weight.vert.glsl @@ -1,10 +1,10 @@ #version 450 -uniform vec2 screenSize; -uniform vec2 screenSizeInv; +uniform vec2 screen_size; +uniform vec2 screen_size_inv; in vec2 pos; -out vec2 texCoord; +out vec2 tex_coord; out vec2 pixcoord; out vec4 offset0; out vec4 offset1; @@ -15,17 +15,17 @@ const int SMAA_MAX_SEARCH_STEPS = 16; void main() { // Scale vertex attribute to [0-1] range const vec2 madd = vec2(0.5, 0.5); - texCoord = pos.xy * madd + madd; + tex_coord = pos.xy * madd + madd; // Blend Weight Calculation Vertex Shader - pixcoord = texCoord * screenSize; + pixcoord = tex_coord * screen_size; // We will use these offsets for the searches later on (see @PSEUDO_GATHER4): - offset0 = screenSizeInv.xyxy * vec4(-0.25, -0.125, 1.25, -0.125) + texCoord.xyxy; - offset1 = screenSizeInv.xyxy * vec4(-0.125, -0.25, -0.125, 1.25) + texCoord.xyxy; + offset0 = screen_size_inv.xyxy * vec4(-0.25, -0.125, 1.25, -0.125) + tex_coord.xyxy; + offset1 = screen_size_inv.xyxy * vec4(-0.125, -0.25, -0.125, 1.25) + tex_coord.xyxy; // And these for the searches, they indicate the ends of the loops: - offset2 = screenSizeInv.xxyy * + offset2 = screen_size_inv.xxyy * (vec4(-2.0, 2.0, -2.0, 2.0) * float(SMAA_MAX_SEARCH_STEPS)) + vec4(offset0.xz, offset1.yw); diff --git a/base/shaders/smaa_edge_detect.frag.glsl b/base/shaders/smaa_edge_detect.frag.glsl index 23650178..8ee979ed 100644 --- a/base/shaders/smaa_edge_detect.frag.glsl +++ b/base/shaders/smaa_edge_detect.frag.glsl @@ -45,13 +45,13 @@ #define SMAA_DEPTH_THRESHOLD (0.1 * SMAA_THRESHOLD) // For depth edge detection, depends on the depth range of the scene #define SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR 2.0 -uniform sampler2D colorTex; +uniform sampler2D color_tex; -in vec2 texCoord; +in vec2 tex_coord; in vec4 offset0; in vec4 offset1; in vec4 offset2; -out vec4 fragColor; +out vec4 frag_color; // Misc functions // Gathers current pixel, and the top-left neighbors. @@ -73,8 +73,8 @@ out vec4 fragColor; // Luma Edge Detection // IMPORTANT NOTICE: luma edge detection requires gamma-corrected colors, and -// thus 'colorTex' should be a non-sRGB texture. -vec2 SMAALumaEdgeDetectionPS(vec2 texcoord +// thus 'color_tex' should be a non-sRGB texture. +vec2 smaa_luma_edge_detection_ps(vec2 texcoord //#if SMAA_PREDICATION //, sampler2D predicationTex //#endif @@ -88,10 +88,10 @@ vec2 SMAALumaEdgeDetectionPS(vec2 texcoord // Calculate lumas: vec3 weights = vec3(0.2126, 0.7152, 0.0722); - float L = dot(textureLod(colorTex, texcoord, 0.0).rgb, weights); + float L = dot(textureLod(color_tex, texcoord, 0.0).rgb, weights); - float Lleft = dot(textureLod(colorTex, offset0.xy, 0.0).rgb, weights); - float Ltop = dot(textureLod(colorTex, offset0.zw, 0.0).rgb, weights); + float Lleft = dot(textureLod(color_tex, offset0.xy, 0.0).rgb, weights); + float Ltop = dot(textureLod(color_tex, offset0.zw, 0.0).rgb, weights); // We do the usual threshold: vec4 delta; @@ -103,32 +103,32 @@ vec2 SMAALumaEdgeDetectionPS(vec2 texcoord discard; // Calculate right and bottom deltas: - float Lright = dot(textureLod(colorTex, offset1.xy, 0.0).rgb, weights); - float Lbottom = dot(textureLod(colorTex, offset1.zw, 0.0).rgb, weights); + float Lright = dot(textureLod(color_tex, offset1.xy, 0.0).rgb, weights); + float Lbottom = dot(textureLod(color_tex, offset1.zw, 0.0).rgb, weights); delta.zw = abs(L - vec2(Lright, Lbottom)); // Calculate the maximum delta in the direct neighborhood: - vec2 maxDelta = max(delta.xy, delta.zw); + vec2 max_delta = max(delta.xy, delta.zw); // Calculate left-left and top-top deltas: - float Lleftleft = dot(textureLod(colorTex, offset2.xy, 0.0).rgb, weights); - float Ltoptop = dot(textureLod(colorTex, offset2.zw, 0.0).rgb, weights); + float Lleftleft = dot(textureLod(color_tex, offset2.xy, 0.0).rgb, weights); + float Ltoptop = dot(textureLod(color_tex, offset2.zw, 0.0).rgb, weights); delta.zw = abs(vec2(Lleft, Ltop) - vec2(Lleftleft, Ltoptop)); // Calculate the final maximum delta: - maxDelta = max(maxDelta.xy, delta.zw); - float finalDelta = max(maxDelta.x, maxDelta.y); + max_delta = max(max_delta.xy, delta.zw); + float final_delta = max(max_delta.x, max_delta.y); // Local contrast adaptation: - edges.xy *= step(finalDelta, SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR * delta.xy); + edges.xy *= step(final_delta, SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR * delta.xy); return edges; } // Color Edge Detection // IMPORTANT NOTICE: color edge detection requires gamma-corrected colors, and -// thus 'colorTex' should be a non-sRGB texture. -vec2 SMAAColorEdgeDetectionPS(vec2 texcoord +// thus 'color_tex' should be a non-sRGB texture. +vec2 smaa_color_edge_detection_ps(vec2 texcoord //#if SMAA_PREDICATION //, sampler2D predicationTex //#endif @@ -142,13 +142,13 @@ vec2 SMAAColorEdgeDetectionPS(vec2 texcoord // Calculate color deltas: vec4 delta; - vec3 C = textureLod(colorTex, texcoord, 0.0).rgb; + vec3 C = textureLod(color_tex, texcoord, 0.0).rgb; - vec3 Cleft = textureLod(colorTex, offset0.xy, 0.0).rgb; + vec3 Cleft = textureLod(color_tex, offset0.xy, 0.0).rgb; vec3 t = abs(C - Cleft); delta.x = max(max(t.r, t.g), t.b); - vec3 Ctop = textureLod(colorTex, offset0.zw, 0.0).rgb; + vec3 Ctop = textureLod(color_tex, offset0.zw, 0.0).rgb; t = abs(C - Ctop); delta.y = max(max(t.r, t.g), t.b); @@ -160,32 +160,32 @@ vec2 SMAAColorEdgeDetectionPS(vec2 texcoord discard; // Calculate right and bottom deltas: - vec3 Cright = textureLod(colorTex, offset1.xy, 0.0).rgb; + vec3 Cright = textureLod(color_tex, offset1.xy, 0.0).rgb; t = abs(C - Cright); delta.z = max(max(t.r, t.g), t.b); - vec3 Cbottom = textureLod(colorTex, offset1.zw, 0.0).rgb; + vec3 Cbottom = textureLod(color_tex, offset1.zw, 0.0).rgb; t = abs(C - Cbottom); delta.w = max(max(t.r, t.g), t.b); // Calculate the maximum delta in the direct neighborhood: - vec2 maxDelta = max(delta.xy, delta.zw); + vec2 max_delta = max(delta.xy, delta.zw); // Calculate left-left and top-top deltas: - vec3 Cleftleft = textureLod(colorTex, offset2.xy, 0.0).rgb; + vec3 Cleftleft = textureLod(color_tex, offset2.xy, 0.0).rgb; t = abs(C - Cleftleft); delta.z = max(max(t.r, t.g), t.b); - vec3 Ctoptop = textureLod(colorTex, offset2.zw, 0.0).rgb; + vec3 Ctoptop = textureLod(color_tex, offset2.zw, 0.0).rgb; t = abs(C - Ctoptop); delta.w = max(max(t.r, t.g), t.b); // Calculate the final maximum delta: - maxDelta = max(maxDelta.xy, delta.zw); - float finalDelta = max(maxDelta.x, maxDelta.y); + max_delta = max(max_delta.xy, delta.zw); + float final_delta = max(max_delta.x, max_delta.y); // Local contrast adaptation: - edges.xy *= step(finalDelta, SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR * delta.xy); + edges.xy *= step(final_delta, SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR * delta.xy); return edges; } @@ -203,5 +203,5 @@ vec2 SMAAColorEdgeDetectionPS(vec2 texcoord // } void main() { - fragColor.rg = SMAAColorEdgeDetectionPS(texCoord); + frag_color.rg = smaa_color_edge_detection_ps(tex_coord); } diff --git a/base/shaders/smaa_edge_detect.vert.glsl b/base/shaders/smaa_edge_detect.vert.glsl index 89414dd3..afebd082 100644 --- a/base/shaders/smaa_edge_detect.vert.glsl +++ b/base/shaders/smaa_edge_detect.vert.glsl @@ -1,9 +1,9 @@ #version 450 -uniform vec2 screenSizeInv; +uniform vec2 screen_size_inv; in vec2 pos; -out vec2 texCoord; +out vec2 tex_coord; out vec4 offset0; out vec4 offset1; out vec4 offset2; @@ -17,14 +17,14 @@ out vec4 offset2; void main() { // Scale vertex attribute to [0-1] range const vec2 madd = vec2(0.5, 0.5); - texCoord = pos.xy * madd + madd; + tex_coord = pos.xy * madd + madd; #if defined(HLSL) || defined(METAL) || defined(SPIRV) - texCoord.y = 1.0 - texCoord.y; + tex_coord.y = 1.0 - tex_coord.y; #endif - offset0 = screenSizeInv.xyxy * vec4(-1.0, 0.0, 0.0, V_DIR(-1.0)) + texCoord.xyxy; - offset1 = screenSizeInv.xyxy * vec4( 1.0, 0.0, 0.0, V_DIR(1.0)) + texCoord.xyxy; - offset2 = screenSizeInv.xyxy * vec4(-2.0, 0.0, 0.0, V_DIR(-2.0)) + texCoord.xyxy; + offset0 = screen_size_inv.xyxy * vec4(-1.0, 0.0, 0.0, V_DIR(-1.0)) + tex_coord.xyxy; + offset1 = screen_size_inv.xyxy * vec4( 1.0, 0.0, 0.0, V_DIR(1.0)) + tex_coord.xyxy; + offset2 = screen_size_inv.xyxy * vec4(-2.0, 0.0, 0.0, V_DIR(-2.0)) + tex_coord.xyxy; gl_Position = vec4(pos.xy, 0.0, 1.0); } diff --git a/base/shaders/smaa_neighborhood_blend.frag.glsl b/base/shaders/smaa_neighborhood_blend.frag.glsl index 434e0dfa..ab0d97ff 100644 --- a/base/shaders/smaa_neighborhood_blend.frag.glsl +++ b/base/shaders/smaa_neighborhood_blend.frag.glsl @@ -2,16 +2,16 @@ #define _Veloc -uniform sampler2D colorTex; -uniform sampler2D blendTex; +uniform sampler2D color_tex; +uniform sampler2D blend_tex; #ifdef _Veloc uniform sampler2D sveloc; #endif -uniform vec2 screenSizeInv; +uniform vec2 screen_size_inv; -in vec2 texCoord; +in vec2 tex_coord; in vec4 offset; -out vec4 fragColor; +out vec4 frag_color; //----------------------------------------------------------------------------- // Neighborhood Blending Pixel Shader (Third Pass) @@ -23,20 +23,20 @@ vec4 textureLodA(sampler2D tex, vec2 coords, float lod) { return textureLod(tex, coords, lod); } -vec4 SMAANeighborhoodBlendingPS(vec2 texcoord, vec4 offset) { +vec4 smaa_neighborhood_blending_ps(vec2 texcoord, vec4 offset) { // Fetch the blending weights for current pixel: vec4 a; - a.x = textureLod(blendTex, offset.xy, 0.0).a; // Right - a.y = textureLod(blendTex, offset.zw, 0.0).g; // Top - a.wz = textureLod(blendTex, texcoord, 0.0).xz; // Bottom / Left + a.x = textureLod(blend_tex, offset.xy, 0.0).a; // Right + a.y = textureLod(blend_tex, offset.zw, 0.0).g; // Top + a.wz = textureLod(blend_tex, texcoord, 0.0).xz; // Bottom / Left // Is there any blending weight with a value greater than 0.0? //SMAA_BRANCH if (dot(a, vec4(1.0, 1.0, 1.0, 1.0)) < 1e-5) { - vec4 color = textureLod(colorTex, texcoord, 0.0); + vec4 color = textureLod(color_tex, texcoord, 0.0); #ifdef _Veloc - vec2 velocity = textureLod(sveloc, texCoord, 0.0).rg; + vec2 velocity = textureLod(sveloc, tex_coord, 0.0).rg; // Pack velocity into the alpha channel: color.a = sqrt(5.0 * length(velocity)); #endif @@ -46,19 +46,19 @@ vec4 SMAANeighborhoodBlendingPS(vec2 texcoord, vec4 offset) { bool h = max(a.x, a.z) > max(a.y, a.w); // max(horizontal) > max(vertical) // Calculate the blending offsets: - vec4 blendingOffset = vec4(0.0, a.y, 0.0, a.w); - vec2 blendingWeight = a.yw; + vec4 blending_offset = vec4(0.0, a.y, 0.0, a.w); + vec2 blending_weight = a.yw; if (h) { - blendingOffset.x = a.x; - blendingOffset.y = 0.0; - blendingOffset.z = a.z; - blendingOffset.w = 0.0; - blendingWeight.x = a.x; - blendingWeight.y = a.z; + blending_offset.x = a.x; + blending_offset.y = 0.0; + blending_offset.z = a.z; + blending_offset.w = 0.0; + blending_weight.x = a.x; + blending_weight.y = a.z; } - blendingWeight /= dot(blendingWeight, vec2(1.0, 1.0)); + blending_weight /= dot(blending_weight, vec2(1.0, 1.0)); // Calculate the texture coordinates: #if defined(HLSL) || defined(METAL) || defined(SPIRV) @@ -66,17 +66,17 @@ vec4 SMAANeighborhoodBlendingPS(vec2 texcoord, vec4 offset) { #else vec2 tc = texcoord; #endif - vec4 blendingCoord = blendingOffset * vec4(screenSizeInv.xy, -screenSizeInv.xy) + tc.xyxy; + vec4 blending_coord = blending_offset * vec4(screen_size_inv.xy, -screen_size_inv.xy) + tc.xyxy; // We exploit bilinear filtering to mix current pixel with the chosen // neighbor: - vec4 color = blendingWeight.x * textureLodA(colorTex, blendingCoord.xy, 0.0); - color += blendingWeight.y * textureLodA(colorTex, blendingCoord.zw, 0.0); + vec4 color = blending_weight.x * textureLodA(color_tex, blending_coord.xy, 0.0); + color += blending_weight.y * textureLodA(color_tex, blending_coord.zw, 0.0); #ifdef _Veloc // Antialias velocity for proper reprojection in a later stage: - vec2 velocity = blendingWeight.x * textureLodA(sveloc, blendingCoord.xy, 0.0).rg; - velocity += blendingWeight.y * textureLodA(sveloc, blendingCoord.zw, 0.0).rg; + vec2 velocity = blending_weight.x * textureLodA(sveloc, blending_coord.xy, 0.0).rg; + velocity += blending_weight.y * textureLodA(sveloc, blending_coord.zw, 0.0).rg; // Pack velocity into the alpha channel: color.a = sqrt(5.0 * length(velocity)); @@ -87,5 +87,5 @@ vec4 SMAANeighborhoodBlendingPS(vec2 texcoord, vec4 offset) { } void main() { - fragColor = SMAANeighborhoodBlendingPS(texCoord, offset); + frag_color = smaa_neighborhood_blending_ps(tex_coord, offset); } diff --git a/base/shaders/smaa_neighborhood_blend.vert.glsl b/base/shaders/smaa_neighborhood_blend.vert.glsl index eb268cb2..0e20136b 100644 --- a/base/shaders/smaa_neighborhood_blend.vert.glsl +++ b/base/shaders/smaa_neighborhood_blend.vert.glsl @@ -1,10 +1,10 @@ #version 450 -uniform vec2 screenSizeInv; +uniform vec2 screen_size_inv; in vec2 pos; -out vec2 texCoord; +out vec2 tex_coord; out vec4 offset; #if defined(HLSL) || defined(METAL) || defined(SPIRV) @@ -16,12 +16,12 @@ out vec4 offset; void main() { // Scale vertex attribute to [0-1] range const vec2 madd = vec2(0.5, 0.5); - texCoord = pos.xy * madd + madd; + tex_coord = pos.xy * madd + madd; #if defined(HLSL) || defined(METAL) || defined(SPIRV) - texCoord.y = 1.0 - texCoord.y; + tex_coord.y = 1.0 - tex_coord.y; #endif // Neighborhood Blending Vertex Shader - offset = screenSizeInv.xyxy * vec4(1.0, 0.0, 0.0, V_DIR(1.0)) + texCoord.xyxy; + offset = screen_size_inv.xyxy * vec4(1.0, 0.0, 0.0, V_DIR(1.0)) + tex_coord.xyxy; gl_Position = vec4(pos.xy, 0.0, 1.0); } diff --git a/base/shaders/ssao_blur_pass.frag.glsl b/base/shaders/ssao_blur_pass.frag.glsl index 771fdb43..d0e670ed 100644 --- a/base/shaders/ssao_blur_pass.frag.glsl +++ b/base/shaders/ssao_blur_pass.frag.glsl @@ -4,37 +4,37 @@ uniform sampler2D tex; uniform sampler2D gbuffer0; -uniform vec2 dirInv; +uniform vec2 dir_inv; -in vec2 texCoord; -out float fragColor; +in vec2 tex_coord; +out float frag_color; -const float blurWeights[10] = float[] (0.132572, 0.125472, 0.106373, 0.08078, 0.05495, 0.033482, 0.018275, 0.008934, 0.003912, 0.001535); -const float discardThreshold = 0.95; +const float blur_weights[10] = float[] (0.132572, 0.125472, 0.106373, 0.08078, 0.05495, 0.033482, 0.018275, 0.008934, 0.003912, 0.001535); +const float discard_threshold = 0.95; void main() { - vec3 nor = getNor(textureLod(gbuffer0, texCoord, 0.0).rg); + vec3 nor = get_nor(textureLod(gbuffer0, tex_coord, 0.0).rg); - fragColor = textureLod(tex, texCoord, 0.0).r * blurWeights[0]; - float weight = blurWeights[0]; + frag_color = textureLod(tex, tex_coord, 0.0).r * blur_weights[0]; + float weight = blur_weights[0]; for (int i = 1; i < 8; ++i) { float posadd = i; - vec3 nor2 = getNor(textureLod(gbuffer0, texCoord + i * dirInv, 0.0).rg); - float influenceFactor = step(discardThreshold, dot(nor2, nor)); - float col = textureLod(tex, texCoord + posadd * dirInv, 0.0).r; - float w = blurWeights[i] * influenceFactor; - fragColor += col * w; + vec3 nor2 = get_nor(textureLod(gbuffer0, tex_coord + i * dir_inv, 0.0).rg); + float influence_factor = step(discard_threshold, dot(nor2, nor)); + float col = textureLod(tex, tex_coord + posadd * dir_inv, 0.0).r; + float w = blur_weights[i] * influence_factor; + frag_color += col * w; weight += w; - nor2 = getNor(textureLod(gbuffer0, texCoord - i * dirInv, 0.0).rg); - influenceFactor = step(discardThreshold, dot(nor2, nor)); - col = textureLod(tex, texCoord - posadd * dirInv, 0.0).r; - w = blurWeights[i] * influenceFactor; - fragColor += col * w; + nor2 = get_nor(textureLod(gbuffer0, tex_coord - i * dir_inv, 0.0).rg); + influence_factor = step(discard_threshold, dot(nor2, nor)); + col = textureLod(tex, tex_coord - posadd * dir_inv, 0.0).r; + w = blur_weights[i] * influence_factor; + frag_color += col * w; weight += w; } - fragColor = fragColor / weight; + frag_color = frag_color / weight; } \ No newline at end of file diff --git a/base/shaders/ssao_pass.frag.glsl b/base/shaders/ssao_pass.frag.glsl index 741787b4..2ecb791e 100644 --- a/base/shaders/ssao_pass.frag.glsl +++ b/base/shaders/ssao_pass.frag.glsl @@ -7,52 +7,52 @@ uniform sampler2D gbufferD; uniform sampler2D gbuffer0; // Normal uniform mat4 P; uniform mat3 V3; -uniform vec2 cameraProj; +uniform vec2 camera_proj; -in vec3 viewRay; -in vec2 texCoord; -out float fragColor; +in vec3 view_ray; +in vec2 tex_coord; +out float frag_color; -const int maxSteps = 8; -const float rayStep = 0.01; -const float angleMix = 0.5; +const int max_steps = 8; +const float ray_step = 0.01; +const float angle_mix = 0.5; const float strength = 3.6; -vec3 hitCoord; +vec3 hit_coord; vec2 coord; float depth; vec3 vpos; -vec2 getProjectedCoord(vec3 hitCoord) { - vec4 projectedCoord = P * vec4(hitCoord, 1.0); - projectedCoord.xy /= projectedCoord.w; - projectedCoord.xy = projectedCoord.xy * 0.5 + 0.5; +vec2 get_projected_coord(vec3 hit_coord) { + vec4 projected_coord = P * vec4(hit_coord, 1.0); + projected_coord.xy /= projected_coord.w; + projected_coord.xy = projected_coord.xy * 0.5 + 0.5; #if defined(HLSL) || defined(METAL) || defined(SPIRV) - projectedCoord.y = 1.0 - projectedCoord.y; + projected_coord.y = 1.0 - projected_coord.y; #endif - return projectedCoord.xy; + return projected_coord.xy; } -float getDeltaDepth(vec3 hitCoord) { - coord = getProjectedCoord(hitCoord); +float get_delta_depth(vec3 hit_coord) { + coord = get_projected_coord(hit_coord); depth = textureLod(gbufferD, coord, 0.0).r * 2.0 - 1.0; - vec3 p = getPosView(viewRay, depth, cameraProj); - return p.z - hitCoord.z; + vec3 p = get_pos_view(view_ray, depth, camera_proj); + return p.z - hit_coord.z; } -void rayCast(vec3 dir) { - hitCoord = vpos; - dir *= rayStep * 2; +void ray_cast(vec3 dir) { + hit_coord = vpos; + dir *= ray_step * 2; float dist = 0.15; - for (int i = 0; i < maxSteps; i++) { - hitCoord += dir; - float delta = getDeltaDepth(hitCoord); + for (int i = 0; i < max_steps; i++) { + hit_coord += dir; + float delta = get_delta_depth(hit_coord); if (delta > 0.0 && delta < 0.2) { - dist = distance(vpos, hitCoord); + dist = distance(vpos, hit_coord); break; } } - fragColor += dist; + frag_color += dist; } vec3 tangent(const vec3 n) { @@ -63,25 +63,25 @@ vec3 tangent(const vec3 n) { } void main() { - fragColor = 0; - vec4 g0 = textureLod(gbuffer0, texCoord, 0.0); - float d = textureLod(gbufferD, texCoord, 0.0).r * 2.0 - 1.0; + frag_color = 0; + vec4 g0 = textureLod(gbuffer0, tex_coord, 0.0); + float d = textureLod(gbufferD, tex_coord, 0.0).r * 2.0 - 1.0; vec2 enc = g0.rg; vec3 n; n.z = 1.0 - abs(enc.x) - abs(enc.y); - n.xy = n.z >= 0.0 ? enc.xy : octahedronWrap(enc.xy); + n.xy = n.z >= 0.0 ? enc.xy : octahedron_wrap(enc.xy); n = normalize(V3 * n); - vpos = getPosView(viewRay, d, cameraProj); + vpos = get_pos_view(view_ray, d, camera_proj); - rayCast(n); + ray_cast(n); vec3 o1 = normalize(tangent(n)); vec3 o2 = (cross(o1, n)); vec3 c1 = 0.5f * (o1 + o2); vec3 c2 = 0.5f * (o1 - o2); - rayCast(mix(n, o1, angleMix)); - rayCast(mix(n, o2, angleMix)); - rayCast(mix(n, -c1, angleMix)); - rayCast(mix(n, -c2, angleMix)); + ray_cast(mix(n, o1, angle_mix)); + ray_cast(mix(n, o2, angle_mix)); + ray_cast(mix(n, -c1, angle_mix)); + ray_cast(mix(n, -c2, angle_mix)); } diff --git a/base/shaders/ssr_blur_pass.frag.glsl b/base/shaders/ssr_blur_pass.frag.glsl index 562e1c16..2377d8a6 100644 --- a/base/shaders/ssr_blur_pass.frag.glsl +++ b/base/shaders/ssr_blur_pass.frag.glsl @@ -4,22 +4,22 @@ uniform sampler2D tex; uniform sampler2D gbuffer0; // Roughness -uniform vec2 dirInv; +uniform vec2 dir_inv; -in vec2 texCoord; -out vec4 fragColor; +in vec2 tex_coord; +out vec4 frag_color; void main() { - float roughness = textureLod(gbuffer0, texCoord, 0.0).b; + float roughness = textureLod(gbuffer0, tex_coord, 0.0).b; if (roughness >= 0.8) { // No reflections - fragColor.rgb = textureLod(tex, texCoord, 0.0).rgb; + frag_color.rgb = textureLod(tex, tex_coord, 0.0).rgb; return; } - fragColor.rgb = textureLod(tex, texCoord + dirInv * 2.5, 0.0).rgb; - fragColor.rgb += textureLod(tex, texCoord + dirInv * 1.5, 0.0).rgb; - fragColor.rgb += textureLod(tex, texCoord, 0.0).rgb; - fragColor.rgb += textureLod(tex, texCoord - dirInv * 1.5, 0.0).rgb; - fragColor.rgb += textureLod(tex, texCoord - dirInv * 2.5, 0.0).rgb; - fragColor.rgb /= vec3(5.0); + frag_color.rgb = textureLod(tex, tex_coord + dir_inv * 2.5, 0.0).rgb; + frag_color.rgb += textureLod(tex, tex_coord + dir_inv * 1.5, 0.0).rgb; + frag_color.rgb += textureLod(tex, tex_coord, 0.0).rgb; + frag_color.rgb += textureLod(tex, tex_coord - dir_inv * 1.5, 0.0).rgb; + frag_color.rgb += textureLod(tex, tex_coord - dir_inv * 2.5, 0.0).rgb; + frag_color.rgb /= vec3(5.0); } diff --git a/base/shaders/ssr_pass.frag.glsl b/base/shaders/ssr_pass.frag.glsl index 435bd1c9..7d5f2270 100644 --- a/base/shaders/ssr_pass.frag.glsl +++ b/base/shaders/ssr_pass.frag.glsl @@ -9,98 +9,98 @@ uniform sampler2D gbuffer0; // Normal, roughness uniform sampler2D gbuffer1; // basecol, occ uniform mat4 P; uniform mat3 V3; -uniform vec2 cameraProj; +uniform vec2 camera_proj; -in vec3 viewRay; -in vec2 texCoord; -out vec4 fragColor; +in vec3 view_ray; +in vec2 tex_coord; +out vec4 frag_color; -const float ssrRayStep = 0.04; -const float ssrMinRayStep = 0.05; -const float ssrSearchDist = 5.0; -const float ssrFalloffExp = 5.0; -const float ssrJitter = 0.6; -const int numBinarySearchSteps = 7; -const int maxSteps = 18; +const float ssr_ray_step = 0.04; +const float ssr_min_ray_step = 0.05; +const float ssr_search_dist = 5.0; +const float ssr_falloff_exp = 5.0; +const float ssr_jitter = 0.6; +const int num_binary_search_steps = 7; +const int max_steps = 18; -vec3 hitCoord; +vec3 hit_coord; float depth; -vec2 getProjectedCoord(const vec3 hit) { - vec4 projectedCoord = P * vec4(hit, 1.0); - projectedCoord.xy /= projectedCoord.w; - projectedCoord.xy = projectedCoord.xy * 0.5 + 0.5; +vec2 get_projected_coord(const vec3 hit) { + vec4 projected_coord = P * vec4(hit, 1.0); + projected_coord.xy /= projected_coord.w; + projected_coord.xy = projected_coord.xy * 0.5 + 0.5; #if defined(HLSL) || defined(METAL) || defined(SPIRV) - projectedCoord.y = 1.0 - projectedCoord.y; + projected_coord.y = 1.0 - projected_coord.y; #endif - return projectedCoord.xy; + return projected_coord.xy; } -float getDeltaDepth(const vec3 hit) { - depth = textureLod(gbufferD, getProjectedCoord(hit), 0.0).r * 2.0 - 1.0; - vec3 viewPos = getPosView(viewRay, depth, cameraProj); - return viewPos.z - hit.z; +float get_delta_depth(const vec3 hit) { + depth = textureLod(gbufferD, get_projected_coord(hit), 0.0).r * 2.0 - 1.0; + vec3 view_pos = get_pos_view(view_ray, depth, camera_proj); + return view_pos.z - hit.z; } -vec4 binarySearch(vec3 dir) { +vec4 binary_search(vec3 dir) { float ddepth; - vec3 start = hitCoord; - for (int i = 0; i < numBinarySearchSteps; i++) { + vec3 start = hit_coord; + for (int i = 0; i < num_binary_search_steps; i++) { dir *= 0.5; - hitCoord -= dir; - ddepth = getDeltaDepth(hitCoord); - if (ddepth < 0.0) hitCoord += dir; + hit_coord -= dir; + ddepth = get_delta_depth(hit_coord); + if (ddepth < 0.0) hit_coord += dir; } // Ugly discard of hits too far away - if (abs(ddepth) > ssrSearchDist / 500) return vec4(0.0); - return vec4(getProjectedCoord(hitCoord), 0.0, 1.0); + if (abs(ddepth) > ssr_search_dist / 500) return vec4(0.0); + return vec4(get_projected_coord(hit_coord), 0.0, 1.0); } -vec4 rayCast(vec3 dir) { - dir *= ssrRayStep; - for (int i = 0; i < maxSteps; i++) { - hitCoord += dir; - if (getDeltaDepth(hitCoord) > 0.0) return binarySearch(dir); +vec4 ray_cast(vec3 dir) { + dir *= ssr_ray_step; + for (int i = 0; i < max_steps; i++) { + hit_coord += dir; + if (get_delta_depth(hit_coord) > 0.0) return binary_search(dir); } return vec4(0.0); } void main() { - vec4 g0 = textureLod(gbuffer0, texCoord, 0.0); + vec4 g0 = textureLod(gbuffer0, tex_coord, 0.0); float roughness = g0.b; - if (roughness == 1.0) { fragColor.rgb = vec3(0.0); return; } + if (roughness == 1.0) { frag_color.rgb = vec3(0.0); return; } - float d = textureLod(gbufferD, texCoord, 0.0).r * 2.0 - 1.0; - if (d == 1.0) { fragColor.rgb = vec3(0.0); return; } + float d = textureLod(gbufferD, tex_coord, 0.0).r * 2.0 - 1.0; + if (d == 1.0) { frag_color.rgb = vec3(0.0); return; } vec2 enc = g0.rg; vec3 n; n.z = 1.0 - abs(enc.x) - abs(enc.y); - n.xy = n.z >= 0.0 ? enc.xy : octahedronWrap(enc.xy); + n.xy = n.z >= 0.0 ? enc.xy : octahedron_wrap(enc.xy); n = normalize(n); - vec3 viewNormal = V3 * n; - vec3 viewPos = getPosView(viewRay, d, cameraProj); - vec3 reflected = normalize(reflect(viewPos, viewNormal)); - hitCoord = viewPos; + vec3 view_normal = V3 * n; + vec3 view_pos = get_pos_view(view_ray, d, camera_proj); + vec3 reflected = normalize(reflect(view_pos, view_normal)); + hit_coord = view_pos; - vec3 dir = reflected * (1.0 - rand(texCoord) * ssrJitter * roughness) * 2.0; - // * max(ssrMinRayStep, -viewPos.z) - vec4 coords = rayCast(dir); + vec3 dir = reflected * (1.0 - rand(tex_coord) * ssr_jitter * roughness) * 2.0; + // * max(ssr_min_ray_step, -view_pos.z) + vec4 coords = ray_cast(dir); - vec2 deltaCoords = abs(vec2(0.5, 0.5) - coords.xy); - float screenEdgeFactor = clamp(1.0 - (deltaCoords.x + deltaCoords.y), 0.0, 1.0); + vec2 delta_coords = abs(vec2(0.5, 0.5) - coords.xy); + float screen_edge_factor = clamp(1.0 - (delta_coords.x + delta_coords.y), 0.0, 1.0); float reflectivity = 1.0 - roughness; - float intensity = pow(reflectivity, ssrFalloffExp) * - screenEdgeFactor * + float intensity = pow(reflectivity, ssr_falloff_exp) * + screen_edge_factor * clamp(-reflected.z, 0.0, 1.0) * - clamp((ssrSearchDist - length(viewPos - hitCoord)) * - (1.0 / ssrSearchDist), 0.0, 1.0) * + clamp((ssr_search_dist - length(view_pos - hit_coord)) * + (1.0 / ssr_search_dist), 0.0, 1.0) * coords.w; intensity = clamp(intensity, 0.0, 1.0); - vec3 reflCol = textureLod(tex, coords.xy, 0.0).rgb; - reflCol = clamp(reflCol, 0.0, 1.0); - fragColor.rgb = reflCol * intensity * 0.5; + vec3 reflcol = textureLod(tex, coords.xy, 0.0).rgb; + reflcol = clamp(reflcol, 0.0, 1.0); + frag_color.rgb = reflcol * intensity * 0.5; } diff --git a/base/shaders/std/brdf.glsl b/base/shaders/std/brdf.glsl index cad48818..4140ad33 100644 --- a/base/shaders/std/brdf.glsl +++ b/base/shaders/std/brdf.glsl @@ -2,17 +2,17 @@ #ifndef _BRDF_GLSL_ #define _BRDF_GLSL_ -vec3 surfaceAlbedo(const vec3 baseColor, const float metalness) { - return mix(baseColor, vec3(0.0), metalness); +vec3 surface_albedo(const vec3 base_color, const float metalness) { + return mix(base_color, vec3(0.0), metalness); } -vec3 surfaceF0(const vec3 baseColor, const float metalness) { - return mix(vec3(0.04), baseColor, metalness); +vec3 surface_f0(const vec3 base_color, const float metalness) { + return mix(vec3(0.04), base_color, metalness); } -float getMipFromRoughness(const float roughness, const float numMipmaps) { +float mip_from_roughness(const float roughness, const float num_mipmaps) { // First mipmap level = roughness 0, last = roughness = 1 - return roughness * numMipmaps; + return roughness * num_mipmaps; } #endif diff --git a/base/shaders/std/conetrace.glsl b/base/shaders/std/conetrace.glsl index d1332056..2e0e8f9e 100644 --- a/base/shaders/std/conetrace.glsl +++ b/base/shaders/std/conetrace.glsl @@ -11,16 +11,16 @@ // http://www.seas.upenn.edu/%7Epcozzi/OpenGLInsights/OpenGLInsights-SparseVoxelization.pdf // https://research.nvidia.com/sites/default/files/publications/GIVoxels-pg2011-authors.pdf -uniform float coneOffset; -uniform float coneAperture; +uniform float cone_offset; +uniform float cone_aperture; -const int voxelgiResolution = 256; -const vec3 voxelgiHalfExtents = vec3(1, 1, 1); -const float voxelgiOcc = 1.0; -const float voxelgiStep = 1.0; -const float voxelgiRange = 2.0; -const float MAX_DISTANCE = 1.73205080757 * voxelgiRange; -const float VOXEL_SIZE = (2.0 / voxelgiResolution.x) * voxelgiStep; +const int voxelgi_resolution = 256; +const vec3 voxelgi_half_extents = vec3(1, 1, 1); +const float voxelgi_occ = 1.0; +const float voxelgi_step = 1.0; +const float voxelgi_range = 2.0; +const float MAX_DISTANCE = 1.73205080757 * voxelgi_range; +const float VOXEL_SIZE = (2.0 / voxelgi_resolution.x) * voxelgi_step; vec3 tangent(const vec3 n) { vec3 t1 = cross(n, vec3(0, 0, 1)); @@ -29,29 +29,29 @@ vec3 tangent(const vec3 n) { else return normalize(t2); } -float traceConeAO(sampler3D voxels, const vec3 origin, vec3 dir, const float aperture, const float maxDist) { +float trace_cone_ao(sampler3D voxels, const vec3 origin, vec3 dir, const float aperture, const float max_dist) { dir = normalize(dir); - float sampleCol = 0.0; - float dist = 1.5 * VOXEL_SIZE * coneOffset; + float sample_col = 0.0; + float dist = 1.5 * VOXEL_SIZE * cone_offset; float diam = dist * aperture; - vec3 samplePos; - while (sampleCol < 1.0 && dist < maxDist) { - samplePos = dir * dist + origin; - float mip = max(log2(diam * voxelgiResolution.x), 0); - float mipSample = textureLod(voxels, samplePos * 0.5 + vec3(0.5), mip).r; - sampleCol += (1 - sampleCol) * mipSample; + vec3 sample_pos; + while (sample_col < 1.0 && dist < max_dist) { + sample_pos = dir * dist + origin; + float mip = max(log2(diam * voxelgi_resolution.x), 0); + float mip_sample = textureLod(voxels, sample_pos * 0.5 + vec3(0.5), mip).r; + sample_col += (1 - sample_col) * mip_sample; dist += max(diam / 2, VOXEL_SIZE); diam = dist * aperture; } - return sampleCol; + return sample_col; } -float traceShadow(sampler3D voxels, const vec3 origin, const vec3 dir) { - return traceConeAO(voxels, origin, dir, 0.14 * coneAperture, 2.5 * voxelgiRange); +float trace_shadow(sampler3D voxels, const vec3 origin, const vec3 dir) { + return trace_cone_ao(voxels, origin, dir, 0.14 * cone_aperture, 2.5 * voxelgi_range); } -float traceAO(const vec3 origin, const vec3 normal, sampler3D voxels) { - const float angleMix = 0.5f; +float trace_ao(const vec3 origin, const vec3 normal, sampler3D voxels) { + const float angle_mix = 0.5f; const float aperture = 0.55785173935; vec3 o1 = normalize(tangent(normal)); vec3 o2 = normalize(cross(o1, normal)); @@ -59,16 +59,16 @@ float traceAO(const vec3 origin, const vec3 normal, sampler3D voxels) { vec3 c2 = 0.5f * (o1 - o2); #ifdef HLSL - const float factor = voxelgiOcc * 0.93; + const float factor = voxelgi_occ * 0.93; #else - const float factor = voxelgiOcc * 0.90; + const float factor = voxelgi_occ * 0.90; #endif - float col = traceConeAO(voxels, origin, normal, aperture, MAX_DISTANCE); - col += traceConeAO(voxels, origin, mix(normal, o1, angleMix), aperture, MAX_DISTANCE); - col += traceConeAO(voxels, origin, mix(normal, o2, angleMix), aperture, MAX_DISTANCE); - col += traceConeAO(voxels, origin, mix(normal, -c1, angleMix), aperture, MAX_DISTANCE); - col += traceConeAO(voxels, origin, mix(normal, -c2, angleMix), aperture, MAX_DISTANCE); + float col = trace_cone_ao(voxels, origin, normal, aperture, MAX_DISTANCE); + col += trace_cone_ao(voxels, origin, mix(normal, o1, angle_mix), aperture, MAX_DISTANCE); + col += trace_cone_ao(voxels, origin, mix(normal, o2, angle_mix), aperture, MAX_DISTANCE); + col += trace_cone_ao(voxels, origin, mix(normal, -c1, angle_mix), aperture, MAX_DISTANCE); + col += trace_cone_ao(voxels, origin, mix(normal, -c2, angle_mix), aperture, MAX_DISTANCE); return (col / 5.0) * factor; return 0.0; diff --git a/base/shaders/std/deferred_light.glsl b/base/shaders/std/deferred_light.glsl index 25b1b71a..8db51dd4 100644 --- a/base/shaders/std/deferred_light.glsl +++ b/base/shaders/std/deferred_light.glsl @@ -15,87 +15,86 @@ uniform sampler2D gbuffer1; #ifdef _Voxel uniform sampler3D voxels; #endif -uniform vec4 envmapData; // angle, sin(angle), cos(angle), strength +uniform vec4 envmap_data; // angle, sin(angle), cos(angle), strength uniform vec4 shirr[7]; -uniform sampler2D senvmapBrdf; -uniform sampler2D senvmapRadiance; +uniform sampler2D senvmap_brdf; +uniform sampler2D senvmap_radiance; #ifdef SPIRV -uniform float envmapNumMipmaps; +uniform float envmap_num_mipmaps; #else -uniform int envmapNumMipmaps; +uniform int envmap_num_mipmaps; #endif uniform sampler2D ssaotex; -uniform vec2 cameraProj; +uniform vec2 camera_proj; uniform vec3 eye; -uniform vec3 eyeLook; -uniform vec3 pointPos; -uniform vec3 pointCol; +uniform vec3 eye_look; +uniform vec3 point_pos; +uniform vec3 point_col; -in vec2 texCoord; -in vec3 viewRay; -out vec4 fragColor; +in vec2 tex_coord; +in vec3 view_ray; +out vec4 frag_color; void main() { - vec4 g0 = textureLod(gbuffer0, texCoord, 0.0); // Normal.xy, roughness, metallic/matid + vec4 g0 = textureLod(gbuffer0, tex_coord, 0.0); // Normal.xy, roughness, metallic/matid vec3 n; n.z = 1.0 - abs(g0.x) - abs(g0.y); - n.xy = n.z >= 0.0 ? g0.xy : octahedronWrap(g0.xy); + n.xy = n.z >= 0.0 ? g0.xy : octahedron_wrap(g0.xy); n = normalize(n); float roughness = g0.b; float metallic; uint matid; - unpackFloatInt16(g0.a, metallic, matid); - vec4 g1 = textureLod(gbuffer1, texCoord, 0.0); // Basecolor.rgb, occ + unpack_f32_i16(g0.a, metallic, matid); + vec4 g1 = textureLod(gbuffer1, tex_coord, 0.0); // Basecolor.rgb, occ float occ = g1.a; - vec3 albedo = surfaceAlbedo(g1.rgb, metallic); // g1.rgb - basecolor - vec3 f0 = surfaceF0(g1.rgb, metallic); + vec3 albedo = surface_albedo(g1.rgb, metallic); // g1.rgb - basecolor + vec3 f0 = surface_f0(g1.rgb, metallic); - float depth = textureLod(gbufferD, texCoord, 0.0).r * 2.0 - 1.0; - vec3 p = getPos(eye, eyeLook, normalize(viewRay), depth, cameraProj); + float depth = textureLod(gbufferD, tex_coord, 0.0).r * 2.0 - 1.0; + vec3 p = get_pos(eye, eye_look, normalize(view_ray), depth, camera_proj); vec3 v = normalize(eye - p); - float dotNV = max(0.0, dot(n, v)); + float dotnv = max(0.0, dot(n, v)); - occ = mix(1.0, occ, dotNV); // AO Fresnel + occ = mix(1.0, occ, dotnv); // AO Fresnel - vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(roughness, 1.0 - dotNV) * 256.0), 0).xy; + vec2 env_brdf = texelFetch(senvmap_brdf, ivec2(vec2(roughness, 1.0 - dotnv) * 256.0), 0).xy; // Envmap - vec4 envmapDataLocal = envmapData; // TODO: SPIRV workaround - vec3 envl = shIrradiance(vec3(n.x * envmapDataLocal.z - n.y * envmapDataLocal.y, n.x * envmapDataLocal.y + n.y * envmapDataLocal.z, n.z), shirr); + vec3 envl = 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); envl /= PI; - vec3 reflectionWorld = reflect(-v, n); - float lod = getMipFromRoughness(roughness, envmapNumMipmaps); - vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld, envmapDataLocal.x), lod).rgb; + vec3 reflection_world = reflect(-v, n); + float lod = mip_from_roughness(roughness, envmap_num_mipmaps); + vec3 prefiltered_color = textureLod(senvmap_radiance, envmap_equirect(reflection_world, envmap_data.x), lod).rgb; envl.rgb *= albedo; // Indirect specular - envl.rgb += prefilteredColor * (f0 * envBRDF.x + envBRDF.y) * 1.5; + envl.rgb += prefiltered_color * (f0 * env_brdf.x + env_brdf.y) * 1.5; - envl.rgb *= envmapDataLocal.w * occ; + envl.rgb *= envmap_data.w * occ; #ifdef _Voxel - vec3 voxpos = p / voxelgiHalfExtents; - envl.rgb *= 1.0 - traceAO(voxpos, n, voxels); + vec3 voxpos = p / voxelgi_half_extents; + envl.rgb *= 1.0 - trace_ao(voxpos, n, voxels); #endif - fragColor.rgb = envl; - fragColor.rgb *= textureLod(ssaotex, texCoord, 0.0).r; + frag_color.rgb = envl; + frag_color.rgb *= textureLod(ssaotex, tex_coord, 0.0).r; if (matid == 1) { // Emission - fragColor.rgb += g1.rgb; // materialid + frag_color.rgb += g1.rgb; // materialid albedo = vec3(0.0); } - fragColor.rgb += sampleLight(p, n, v, dotNV, pointPos, pointCol, albedo, roughness, f0, occ + frag_color.rgb += sample_light(p, n, v, dotnv, point_pos, point_col, albedo, roughness, f0, occ #ifdef _Voxel , voxels, voxpos #endif ); - fragColor.a = 1.0; // Mark as opaque + frag_color.a = 1.0; // Mark as opaque } #endif diff --git a/base/shaders/std/gbuffer.glsl b/base/shaders/std/gbuffer.glsl index 2562acc6..efddc359 100644 --- a/base/shaders/std/gbuffer.glsl +++ b/base/shaders/std/gbuffer.glsl @@ -2,60 +2,60 @@ #ifndef _GBUFFER_GLSL_ #define _GBUFFER_GLSL_ -vec2 octahedronWrap(const vec2 v) { +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)); } -vec3 getNor(const vec2 enc) { +vec3 get_nor(const vec2 enc) { vec3 n; n.z = 1.0 - abs(enc.x) - abs(enc.y); - n.xy = n.z >= 0.0 ? enc.xy : octahedronWrap(enc.xy); + n.xy = n.z >= 0.0 ? enc.xy : octahedron_wrap(enc.xy); n = normalize(n); return n; } -vec3 getPosView(const vec3 viewRay, const float depth, const vec2 cameraProj) { - float linearDepth = cameraProj.y / (cameraProj.x - depth); - // float linearDepth = cameraProj.y / ((depth * 0.5 + 0.5) - cameraProj.x); - return viewRay * linearDepth; +vec3 get_pos_view(const vec3 view_ray, const float depth, const vec2 camera_proj) { + float linear_depth = camera_proj.y / (camera_proj.x - depth); + // float linear_depth = camera_proj.y / ((depth * 0.5 + 0.5) - camera_proj.x); + return view_ray * linear_depth; } -vec3 getPos(const vec3 eye, const vec3 eyeLook, const vec3 viewRay, const float depth, const vec2 cameraProj) { - // eyeLook, viewRay should be normalized - float linearDepth = cameraProj.y / ((depth * 0.5 + 0.5) - cameraProj.x); - float viewZDist = dot(eyeLook, viewRay); - vec3 wposition = eye + viewRay * (linearDepth / viewZDist); +vec3 get_pos(const vec3 eye, const vec3 eye_look, const vec3 view_ray, const float depth, const vec2 camera_proj) { + // eye_look, view_ray should be normalized + float linear_depth = camera_proj.y / ((depth * 0.5 + 0.5) - camera_proj.x); + float view_z_dist = dot(eye_look, view_ray); + vec3 wposition = eye + view_ray * (linear_depth / view_z_dist); return wposition; } // GBuffer helper - Sebastien Lagarde // https://seblagarde.wordpress.com/2018/09/02/gbuffer-helper-packing-integer-and-float-together/ -float packFloatInt16(const float f, const uint i) { +float pack_f32_i16(const float f, const uint i) { // Constant optimize by compiler - const int numBitTarget = 16; - const int numBitI = 4; - const float prec = float(1 << numBitTarget); - const float maxi = float(1 << numBitI); - const float precMinusOne = prec - 1.0; - const float t1 = ((prec / maxi) - 1.0) / precMinusOne; - const float t2 = (prec / maxi) / precMinusOne; + const int num_bit_target = 16; + const int num_bit_i = 4; + const float prec = float(1 << num_bit_target); + const float maxi = float(1 << num_bit_i); + 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; // Code return t1 * f + t2 * float(i); } -void unpackFloatInt16(const float val, out float f, out uint i) { +void unpack_f32_i16(const float val, out float f, out uint i) { // Constant optimize by compiler - const int numBitTarget = 16; - const int numBitI = 4; - const float prec = float(1 << numBitTarget); - const float maxi = float(1 << numBitI); - const float precMinusOne = prec - 1.0; - const float t1 = ((prec / maxi) - 1.0) / precMinusOne; - const float t2 = (prec / maxi) / precMinusOne; + const int num_bit_target = 16; + const int num_bit_i = 4; + const float prec = float(1 << num_bit_target); + const float maxi = float(1 << num_bit_i); + 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; // Code // extract integer part - // + rcp(precMinusOne) to deal with precision issue - i = int((val / t2) + (1.0 / precMinusOne)); + // + rcp(prec_minus_one) to deal with precision issue + i = int((val / t2) + (1.0 / prec_minus_one)); // Now that we have i, solve formula in packFloatInt for f //f = (val - t2 * float(i)) / t1 => convert in mads form f = clamp((-t2 * float(i) + val) / t1, 0.0, 1.0); // Saturate in case of precision issue diff --git a/base/shaders/std/light.glsl b/base/shaders/std/light.glsl index 13211f93..2ffdec83 100644 --- a/base/shaders/std/light.glsl +++ b/base/shaders/std/light.glsl @@ -9,14 +9,14 @@ #include "std/conetrace.glsl" #endif -uniform vec3 lightArea0; -uniform vec3 lightArea1; -uniform vec3 lightArea2; -uniform vec3 lightArea3; -uniform sampler2D sltcMat; -uniform sampler2D sltcMag; +uniform vec3 light_area0; +uniform vec3 light_area1; +uniform vec3 light_area2; +uniform vec3 light_area3; +uniform sampler2D sltc_mat; +uniform sampler2D sltc_mag; -vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, const vec3 lp, const vec3 lightCol, +vec3 sample_light(const vec3 p, const vec3 n, const vec3 v, const float dotnv, const vec3 lp, const vec3 light_col, const vec3 albedo, const float rough, const vec3 f0, const float occ #ifdef _Voxel , sampler3D voxels, vec3 voxpos @@ -24,27 +24,27 @@ vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, co ) { vec3 ld = lp - p; vec3 l = normalize(ld); - float dotNL = max(0.0, dot(n, l)); + float dotnl = max(0.0, dot(n, l)); - float theta = acos(dotNV); + float theta = acos(dotnv); vec2 tuv = vec2(rough, theta / (0.5 * PI)); tuv = tuv * LUT_SCALE + LUT_BIAS; - vec4 t = textureLod(sltcMat, tuv, 0.0); - mat3 invM = mat3( + vec4 t = textureLod(sltc_mat, tuv, 0.0); + mat3 inv = mat3( vec3(1.0, 0.0, t.y), vec3(0.0, t.z, 0.0), vec3(t.w, 0.0, t.x)); - float ltcspec = ltcEvaluate(n, v, dotNV, p, invM, lightArea0, lightArea1, lightArea2, lightArea3); - ltcspec *= textureLod(sltcMag, tuv, 0.0).a; - float ltcdiff = ltcEvaluate(n, v, dotNV, p, mat3(1.0), lightArea0, lightArea1, lightArea2, lightArea3); + float ltcspec = ltc_evaluate(n, v, dotnv, p, inv, light_area0, light_area1, light_area2, light_area3); + ltcspec *= textureLod(sltc_mag, tuv, 0.0).a; + float ltcdiff = ltc_evaluate(n, v, dotnv, p, mat3(1.0), light_area0, light_area1, light_area2, light_area3); vec3 direct = albedo * ltcdiff + ltcspec * 0.05; direct *= attenuate(distance(p, lp)); - direct *= lightCol; - direct *= clamp(dotNL + 2.0 * occ * occ - 1.0, 0.0, 1.0); // Micro shadowing + direct *= light_col; + direct *= clamp(dotnl + 2.0 * occ * occ - 1.0, 0.0, 1.0); // Micro shadowing #ifdef _Voxel - direct *= 1.0 - traceShadow(voxels, voxpos, l); + direct *= 1.0 - trace_shadow(voxels, voxpos, l); #endif return direct; diff --git a/base/shaders/std/ltc.glsl b/base/shaders/std/ltc.glsl index 4a1b6de9..bc66428e 100644 --- a/base/shaders/std/ltc.glsl +++ b/base/shaders/std/ltc.glsl @@ -8,17 +8,17 @@ const float LUT_SIZE = 64.0; const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE; const float LUT_BIAS = 0.5 / LUT_SIZE; -float integrateEdge(vec3 v1, vec3 v2) { - float cosTheta = dot(v1, v2); - float theta = acos(cosTheta); +float integrate_edge(vec3 v1, vec3 v2) { + float cos_theta = dot(v1, v2); + float theta = acos(cos_theta); float res = cross(v1, v2).z * ((theta > 0.001) ? theta / sin(theta) : 1.0); return res; } -float ltcEvaluate(vec3 N, vec3 V, float dotNV, vec3 P, mat3 Minv, vec3 points0, vec3 points1, vec3 points2, vec3 points3) { +float ltc_evaluate(vec3 N, vec3 V, float dotnv, vec3 P, mat3 Minv, vec3 points0, vec3 points1, vec3 points2, vec3 points3) { // Construct orthonormal basis around N vec3 T1, T2; - T1 = normalize(V - N * dotNV); + T1 = normalize(V - N * dotnv); T2 = cross(N, T1); // Rotate area light in (T1, T2, R) basis @@ -131,12 +131,12 @@ float ltcEvaluate(vec3 N, vec3 V, float dotNV, vec3 P, mat3 Minv, vec3 points0, // Integrate float sum = 0.0; - sum += integrateEdge(L0, L1); - sum += integrateEdge(L1, L2); - sum += integrateEdge(L2, L3); + sum += integrate_edge(L0, L1); + sum += integrate_edge(L1, L2); + sum += integrate_edge(L2, L3); - if (n >= 4) sum += integrateEdge(L3, L4); - if (n == 5) sum += integrateEdge(L4, L0); + if (n >= 4) sum += integrate_edge(L3, L4); + if (n == 5) sum += integrate_edge(L4, L0); return max(0.0, -sum); } diff --git a/base/shaders/std/math.glsl b/base/shaders/std/math.glsl index 0536e7ba..8afbe906 100644 --- a/base/shaders/std/math.glsl +++ b/base/shaders/std/math.glsl @@ -5,7 +5,7 @@ const float PI = 3.1415926535; const float PI2 = PI * 2.0; -vec2 envMapEquirect(const vec3 normal, const float angle) { +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); diff --git a/base/shaders/std/shirr.glsl b/base/shaders/std/shirr.glsl index 76cef378..cd5b312e 100644 --- a/base/shaders/std/shirr.glsl +++ b/base/shaders/std/shirr.glsl @@ -2,7 +2,7 @@ #ifndef _SHIRR_GLSL_ #define _SHIRR_GLSL_ -vec3 shIrradiance(const vec3 nor, const vec4 shirr[7]) { +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; diff --git a/base/shaders/supersample_resolve.frag.glsl b/base/shaders/supersample_resolve.frag.glsl index f2f2a6a0..50e994ad 100644 --- a/base/shaders/supersample_resolve.frag.glsl +++ b/base/shaders/supersample_resolve.frag.glsl @@ -1,25 +1,25 @@ #version 450 uniform sampler2D tex; -uniform vec2 screenSizeInv; +uniform vec2 screen_size_inv; -in vec2 texCoord; -out vec4 fragColor; +in vec2 tex_coord; +out vec4 frag_color; -vec4 textureSS(sampler2D tex, vec2 tc, vec2 texStep) { +vec4 texture_ss(sampler2D tex, vec2 tc, vec2 tex_step) { vec4 col = texture(tex, tc); - col += texture(tex, tc + vec2(1.5, 0.0) * texStep); - col += texture(tex, tc + vec2(-1.5, 0.0) * texStep); - col += texture(tex, tc + vec2(0.0, 1.5) * texStep); - col += texture(tex, tc + vec2(0.0, -1.5) * texStep); - col += texture(tex, tc + vec2(1.5, 1.5) * texStep); - col += texture(tex, tc + vec2(-1.5, -1.5) * texStep); - col += texture(tex, tc + vec2(1.5, -1.5) * texStep); - col += texture(tex, tc + vec2(-1.5, 1.5) * texStep); + col += texture(tex, tc + vec2(1.5, 0.0) * tex_step); + col += texture(tex, tc + vec2(-1.5, 0.0) * tex_step); + col += texture(tex, tc + vec2(0.0, 1.5) * tex_step); + col += texture(tex, tc + vec2(0.0, -1.5) * tex_step); + col += texture(tex, tc + vec2(1.5, 1.5) * tex_step); + col += texture(tex, tc + vec2(-1.5, -1.5) * tex_step); + col += texture(tex, tc + vec2(1.5, -1.5) * tex_step); + col += texture(tex, tc + vec2(-1.5, 1.5) * tex_step); return col / 9.0; } void main() { // 4X resolve - fragColor = textureSS(tex, texCoord, screenSizeInv / 4.0); + frag_color = texture_ss(tex, tex_coord, screen_size_inv / 4.0); } diff --git a/base/shaders/taa_pass.frag.glsl b/base/shaders/taa_pass.frag.glsl index 6cb63fab..3e51a231 100644 --- a/base/shaders/taa_pass.frag.glsl +++ b/base/shaders/taa_pass.frag.glsl @@ -4,28 +4,28 @@ uniform sampler2D tex; uniform sampler2D tex2; uniform sampler2D sveloc; -in vec2 texCoord; -out vec4 fragColor; +in vec2 tex_coord; +out vec4 frag_color; const float SMAA_REPROJECTION_WEIGHT_SCALE = 30.0; void main() { - vec4 current = textureLod(tex, texCoord, 0.0); + vec4 current = textureLod(tex, tex_coord, 0.0); // Velocity is assumed to be calculated for motion blur, so we need to inverse it for reprojection - vec2 velocity = -textureLod(sveloc, texCoord, 0.0).rg; + vec2 velocity = -textureLod(sveloc, tex_coord, 0.0).rg; #if defined(HLSL) || defined(METAL) || defined(SPIRV) velocity.y = -velocity.y; #endif // Reproject current coordinates and fetch previous pixel - vec4 previous = textureLod(tex2, texCoord + velocity, 0.0); + vec4 previous = textureLod(tex2, tex_coord + velocity, 0.0); // Attenuate the previous pixel if the velocity is different float delta = abs(current.a * current.a - previous.a * previous.a) / 5.0; float weight = 0.5 * clamp(1.0 - sqrt(delta) * SMAA_REPROJECTION_WEIGHT_SCALE, 0.0, 1.0); // Blend the pixels according to the calculated weight: - fragColor = vec4(mix(current.rgb, previous.rgb, weight), 1.0); + frag_color = vec4(mix(current.rgb, previous.rgb, weight), 1.0); } diff --git a/base/shaders/voxel_glsl/voxel_pos.frag.glsl b/base/shaders/voxel_glsl/voxel_pos.frag.glsl index 1c9b48a5..16405b6e 100644 --- a/base/shaders/voxel_glsl/voxel_pos.frag.glsl +++ b/base/shaders/voxel_glsl/voxel_pos.frag.glsl @@ -9,5 +9,5 @@ in vec3 voxposition; void main() { if (abs(voxposition.z) > 1.0 || abs(voxposition.x) > 1.0 || abs(voxposition.y) > 1.0) return; - imageStore(voxels, ivec3(voxelgiResolution * (voxposition * 0.5 + 0.5)), vec4(1.0)); + imageStore(voxels, ivec3(voxelgi_resolution * (voxposition * 0.5 + 0.5)), vec4(1.0)); } diff --git a/base/shaders/voxel_glsl/voxel_pos.geom.glsl b/base/shaders/voxel_glsl/voxel_pos.geom.glsl index 2edc9e85..0f4d54c4 100644 --- a/base/shaders/voxel_glsl/voxel_pos.geom.glsl +++ b/base/shaders/voxel_glsl/voxel_pos.geom.glsl @@ -3,15 +3,15 @@ layout(triangles) in; layout(triangle_strip) out; layout(max_vertices=3) out; -in vec3 voxpositionGeom[]; +in vec3 voxposition_geom[]; out vec3 voxposition; void main() { - vec3 p1 = voxpositionGeom[1] - voxpositionGeom[0]; - vec3 p2 = voxpositionGeom[2] - voxpositionGeom[0]; + vec3 p1 = voxposition_geom[1] - voxposition_geom[0]; + vec3 p2 = voxposition_geom[2] - voxposition_geom[0]; vec3 p = abs(cross(p1, p2)); for (uint i = 0; i < 3; ++i) { - voxposition = voxpositionGeom[i]; + voxposition = voxposition_geom[i]; if (p.z > p.x && p.z > p.y) { gl_Position = vec4(voxposition.x, voxposition.y, 0.0, 1.0); } diff --git a/base/shaders/voxel_glsl/voxel_pos.vert.glsl b/base/shaders/voxel_glsl/voxel_pos.vert.glsl index 19f6a5f5..889a6d0a 100644 --- a/base/shaders/voxel_glsl/voxel_pos.vert.glsl +++ b/base/shaders/voxel_glsl/voxel_pos.vert.glsl @@ -5,8 +5,8 @@ uniform mat4 W; in vec4 pos; -out vec3 voxpositionGeom; +out vec3 voxposition_geom; void main() { - voxpositionGeom = vec3(W * vec4(pos.xyz, 1.0)) / voxelgiHalfExtents; + voxposition_geom = vec3(W * vec4(pos.xyz, 1.0)) / voxelgi_half_extents; } diff --git a/base/shaders/voxel_hlsl/src/build.bat b/base/shaders/voxel_hlsl/src/build.bat index 2fa2d998..d5feee82 100644 --- a/base/shaders/voxel_hlsl/src/build.bat +++ b/base/shaders/voxel_hlsl/src/build.bat @@ -1,3 +1,3 @@ -.\hlslbin.exe voxel_pos.vert.hlsl ..\voxel_pos.vert.glsl vs_5_0 -i pos -.\hlslbin.exe voxel_pos.frag.hlsl ..\voxel_pos.frag.glsl ps_5_0 -.\hlslbin.exe voxel_pos.geom.hlsl ..\voxel_pos.geom.glsl gs_5_0 +..\..\..\..\armorcore\tools\bin\windows_x64\amake.exe --hlslbin voxel_pos.vert.hlsl ..\voxel_pos.vert.glsl +..\..\..\..\armorcore\tools\bin\windows_x64\amake.exe --hlslbin voxel_pos.frag.hlsl ..\voxel_pos.frag.glsl +..\..\..\..\armorcore\tools\bin\windows_x64\amake.exe --hlslbin voxel_pos.geom.hlsl ..\voxel_pos.geom.glsl diff --git a/base/shaders/voxel_hlsl/src/hlslbin.exe b/base/shaders/voxel_hlsl/src/hlslbin.exe deleted file mode 100644 index dc70f9c24b24125a9a6cef94c1aa90b8f4ac4bc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272896 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

W_6{gtmGi8*$3~$!ED%rxjU?Qdng?q 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%0Ak6I$=ewRZuDM`&QCkqf4&<#Ag<54j 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

    E>v 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'Qyg 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 voxels; struct SPIRV_Cross_Input { float3 wpos : TEXCOORD0; }; -struct SPIRV_Cross_Output { float4 FragColor : SV_TARGET0; }; +struct SPIRV_Cross_Output { float4 frag_color : SV_TARGET0; }; void main(SPIRV_Cross_Input stage_input) { if (abs(stage_input.wpos.z) > 1.0 || abs(stage_input.wpos.x) > 1 || abs(stage_input.wpos.y) > 1) return; diff --git a/base/shaders/world_pass.frag.glsl b/base/shaders/world_pass.frag.glsl index f606ee7f..4b57199a 100644 --- a/base/shaders/world_pass.frag.glsl +++ b/base/shaders/world_pass.frag.glsl @@ -3,14 +3,13 @@ #include "std/math.glsl" uniform sampler2D envmap; -uniform vec4 envmapDataWorld; // angle, sin(angle), cos(angle), strength +uniform vec4 envmap_data_world; // angle, sin(angle), cos(angle), strength in vec3 normal; -out vec4 fragColor; +out vec4 frag_color; void main() { - vec4 envmapDataLocal = envmapDataWorld; // TODO: SPIRV workaround vec3 n = normalize(normal); - fragColor.rgb = texture(envmap, envMapEquirect(-n, envmapDataLocal.x)).rgb * envmapDataLocal.w; - fragColor.a = 0.0; // Mark as non-opaque + frag_color.rgb = texture(envmap, envmap_equirect(-n, envmap_data_world.x)).rgb * envmap_data_world.w; + frag_color.a = 0.0; // Mark as non-opaque } diff --git a/base/sources/base.ts b/base/sources/base.ts index c9589a47..0e93b4b8 100644 --- a/base/sources/base.ts +++ b/base/sources/base.ts @@ -1480,9 +1480,9 @@ function base_make_cursor_pipe() { base_cursor_vp = g4_pipeline_get_const_loc(base_pipe_cursor, "VP"); base_cursor_inv_vp = g4_pipeline_get_const_loc(base_pipe_cursor, "invVP"); base_cursor_mouse = g4_pipeline_get_const_loc(base_pipe_cursor, "mouse"); - base_cursor_tex_step = g4_pipeline_get_const_loc(base_pipe_cursor, "texStep"); + base_cursor_tex_step = g4_pipeline_get_const_loc(base_pipe_cursor, "tex_step"); base_cursor_radius = g4_pipeline_get_const_loc(base_pipe_cursor, "radius"); - base_cursor_camera_right = g4_pipeline_get_const_loc(base_pipe_cursor, "cameraRight"); + base_cursor_camera_right = g4_pipeline_get_const_loc(base_pipe_cursor, "camera_right"); base_cursor_tint = g4_pipeline_get_const_loc(base_pipe_cursor, "tint"); base_cursor_gbufferd = g4_pipeline_get_tex_unit(base_pipe_cursor, "gbufferD"); base_cursor_tex = g4_pipeline_get_tex_unit(base_pipe_cursor, "tex"); diff --git a/base/sources/make_voxel.ts b/base/sources/make_voxel.ts index 370861c9..8f9fd71a 100644 --- a/base/sources/make_voxel.ts +++ b/base/sources/make_voxel.ts @@ -83,7 +83,7 @@ function make_voxel_source(): string { SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) { \ SPIRV_Cross_Output stage_output; \ " + make_material_voxelgi_half_extents() + ")} \ - stage_output.svpos.xyz = mul(float4(stage_input.pos.xyz, 1.0), W).xyz / voxelgiHalfExtents.xxx; \ + stage_output.svpos.xyz = mul(float4(stage_input.pos.xyz, 1.0), W).xyz / voxelgi_half_extents.xxx; \ float3 wnormal = normalize(mul(float3(stage_input.nor.xy, stage_input.pos.w), N)); \ float height = texpaint_pack.SampleLevel(_texpaint_pack_sampler, stage_input.tex, 0.0).a; \ stage_output.svpos.xyz += wnormal * height.xxx * float3(" + ds + ", " + ds + ", " + ds + "); \ @@ -95,16 +95,16 @@ function make_voxel_source(): string { in vec4 pos; \ in vec2 nor; \ in vec2 tex; \ - out vec3 voxpositionGeom; \ + out vec3 voxposition_geom; \ uniform mat4 W; \ uniform mat3 N; \ uniform sampler2D texpaint_pack; \ void main() { \ " + make_material_voxelgi_half_extents() + ")} \ - voxpositionGeom = vec3(W * vec4(pos.xyz, 1.0)) / voxelgiHalfExtents; \ + voxposition_geom = vec3(W * vec4(pos.xyz, 1.0)) / voxelgi_half_extents; \ vec3 wnormal = normalize(N * vec3(nor.xy, pos.w)); \ float height = textureLod(texpaint_pack, tex, 0.0).a; \ - voxpositionGeom += wnormal * vec3(height) * vec3(" + ds + "); \ + voxposition_geom += wnormal * vec3(height) * vec3(" + ds + "); \ }"; ///end } diff --git a/base/sources/node_shader.ts b/base/sources/node_shader.ts index 1d6d3359..0e5ec481 100644 --- a/base/sources/node_shader.ts +++ b/base/sources/node_shader.ts @@ -288,10 +288,10 @@ function node_shader_get_hlsl(raw: node_shader_t, shared_sampler: string): strin // Multiple render targets if (char_at(out, out.length - 1) == "]") { num = parse_int(char_at(out, out.length - 2)); - s += "vec4 fragColor[" + num + "] : SV_TARGET0;\n"; + s += "vec4 frag_color[" + num + "] : SV_TARGET0;\n"; } else { - s += "vec4 fragColor : SV_TARGET0;\n"; + s += "vec4 frag_color : SV_TARGET0;\n"; } } s += "};\n"; @@ -354,10 +354,10 @@ function node_shader_get_hlsl(raw: node_shader_t, shared_sampler: string): strin else { if (raw.outs.length > 0) { if (num > 0) { - s += "vec4 fragColor[" + num + "];\n"; + s += "vec4 frag_color[" + num + "];\n"; } else { - s += "vec4 fragColor;\n"; + s += "vec4 frag_color;\n"; } } } @@ -384,11 +384,11 @@ function node_shader_get_hlsl(raw: node_shader_t, shared_sampler: string): strin else { if (num > 0) { for (let i: i32 = 0; i < num; ++i) { - s += "stage_output.fragColor[" + i + "] = fragColor[" + i + "];\n"; + s += "stage_output.frag_color[" + i + "] = frag_color[" + i + "];\n"; } } else { - s += "stage_output.fragColor = fragColor;\n"; + s += "stage_output.frag_color = frag_color;\n"; } } s += "return stage_output;\n"; @@ -492,11 +492,11 @@ function node_shader_get_msl(raw: node_shader_t, shared_sampler: string): string if (char_at(out, out.length - 1) == "]") { num = parse_int(char_at(out, out.length - 2)); for (let i: i32 = 0; i < num; ++i) { - s += "float4 fragColor_" + i + " [[color(" + i + ")]];\n"; + s += "float4 frag_color_" + i + " [[color(" + i + ")]];\n"; } } else { - s += "float4 fragColor [[color(0)]];\n"; + s += "float4 frag_color [[color(0)]];\n"; } } s += "};\n"; @@ -612,10 +612,10 @@ function node_shader_get_msl(raw: node_shader_t, shared_sampler: string): string else { if (raw.outs.length > 0) { if (num > 0) { - s += "vec4 fragColor[" + num + "];\n"; + s += "vec4 frag_color[" + num + "];\n"; } else { - s += "vec4 fragColor;\n"; + s += "vec4 frag_color;\n"; } } } @@ -642,11 +642,11 @@ function node_shader_get_msl(raw: node_shader_t, shared_sampler: string): string else { if (num > 0) { for (let i: i32 = 0; i < num; ++i) { - s += "out.fragColor_" + i + " = fragColor[" + i + "];\n"; + s += "out.frag_color_" + i + " = frag_color[" + i + "];\n"; } } else { - s += "out.fragColor = fragColor;\n"; + s += "out.frag_color = frag_color;\n"; } } s += "return out;\n"; diff --git a/base/sources/parser_material.ts b/base/sources/parser_material.ts index ca73d4d2..350cc1f4 100644 --- a/base/sources/parser_material.ts +++ b/base/sources/parser_material.ts @@ -28,7 +28,7 @@ let parser_material_nodes: zui_node_t[]; let parser_material_links: zui_node_link_t[]; let parser_material_cotangent_frame_written: bool; -let parser_material_tex_coord: string = "texCoord"; +let parser_material_tex_coord: string = "tex_coord"; let parser_material_eps: f32 = 0.000001; let parser_material_custom_nodes: map_tstring> = map_create(); @@ -39,7 +39,7 @@ let parser_material_parse_height_as_channel: bool = false; let parser_material_parse_emission: bool = false; let parser_material_parse_subsurface: bool = false; let parser_material_parsing_basecolor: bool = false; -let parser_material_triplanar: bool = false; // Sample using texCoord/1/2 & texCoordBlend +let parser_material_triplanar: bool = false; // Sample using tex_coord/1/2 & tex_coord_blend let parser_material_sample_keep_aspect: bool = false; // Adjust uvs to preserve texture aspect ratio let parser_material_sample_uv_scale: string = "1.0"; let parser_material_transform_color_space: bool = true; @@ -191,9 +191,9 @@ function parser_material_finalize(con: node_shader_context_t) { if (frag.bposition) { if (parser_material_triplanar) { node_shader_write_attrib(frag, "vec3 bposition = vec3(\ - texCoord1.x * texCoordBlend.y + texCoord2.x * texCoordBlend.z,\ - texCoord.x * texCoordBlend.x + texCoord2.y * texCoordBlend.z,\ - texCoord.y * texCoordBlend.x + texCoord1.y * texCoordBlend.y);"); + 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 (frag.ndcpos) { node_shader_add_out(vert, "vec3 bposition"); @@ -238,15 +238,15 @@ function parser_material_finalize(con: node_shader_context_t) { } if (frag.vvec_cam) { node_shader_add_uniform(vert, "mat4 WV", "_world_view_matrix"); - node_shader_add_out(vert, "vec3 eyeDirCam"); - node_shader_write_attrib(vert, "eyeDirCam = vec4(mul(vec4(pos.xyz, 1.0), WV)).xyz; eyeDirCam.z *= -1.0;"); - node_shader_write_attrib(frag, "vec3 vVecCam = normalize(eyeDirCam);"); + node_shader_add_out(vert, "vec3 eye_dir_cam"); + node_shader_write_attrib(vert, "eye_dir_cam = vec4(mul(vec4(pos.xyz, 1.0), WV)).xyz; eye_dir_cam.z *= -1.0;"); + node_shader_write_attrib(frag, "vec3 vvec_cam = normalize(eye_dir_cam);"); } if (frag.vvec) { node_shader_add_uniform(vert, "vec3 eye", "_camera_pos"); - node_shader_add_out(vert, "vec3 eyeDir"); - node_shader_write_attrib(vert, "eyeDir = eye - wposition;"); - node_shader_write_attrib(frag, "vec3 vVec = normalize(eyeDir);"); + node_shader_add_out(vert, "vec3 eye_dir"); + node_shader_write_attrib(vert, "eye_dir = eye - wposition;"); + node_shader_write_attrib(frag, "vec3 vvec = normalize(eye_dir);"); } if (frag.n) { node_shader_add_uniform(vert, "mat3 N", "_normal_matrix"); @@ -259,11 +259,11 @@ function parser_material_finalize(con: node_shader_context_t) { node_shader_write_attrib(vert, "vec3 wnormal = normalize(mul(vec3(nor.xy, pos.w), N));"); } if (frag.nattr) { - node_shader_add_out(vert, "vec3 nAttr"); - node_shader_write_attrib(vert, "nAttr = vec3(nor.xy, pos.w);"); + node_shader_add_out(vert, "vec3 nattr"); + node_shader_write_attrib(vert, "nattr = vec3(nor.xy, pos.w);"); } if (frag.dotnv) { - node_shader_write_attrib(frag, "float dotNV = max(dot(n, vVec), 0.0);"); + node_shader_write_attrib(frag, "float dotnv = max(dot(n, vvec), 0.0);"); } if (frag.wvpposition) { node_shader_add_out(vert, "vec4 wvpposition"); @@ -481,7 +481,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ } else { // Vector node_shader_context_add_elem(parser_material_curshader.context, "tex", "short2norm"); // UVMaps only for now - return "vec3(texCoord.x, texCoord.y, 0.0)"; + return "vec3(tex_coord.x, tex_coord.y, 0.0)"; } } else if (node.type == "VERTEX_COLOR") { @@ -608,7 +608,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ node_shader_write(parser_material_curshader, "float " + store + "_rad = " + angle + " * (" + pi + " / 180);"); node_shader_write(parser_material_curshader, "float " + store + "_x = cos(" + store + "_rad);"); node_shader_write(parser_material_curshader, "float " + store + "_y = sin(" + store + "_rad);"); - return "texture(" + tex_name + ", texCoord + vec2(" + store + "_x, " + store + "_y) * " + mask + ").rgb;"; + return "texture(" + tex_name + ", tex_coord + vec2(" + store + "_x, " + store + "_y) * " + mask + ").rgb;"; } else if (node.type == "BLUR") { if (parser_material_blur_passthrough) { @@ -625,7 +625,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ node_shader_write(parser_material_curshader, "vec3 " + store + "_res = vec3(0.0, 0.0, 0.0);"); node_shader_write(parser_material_curshader, "for (int i = -" + steps + "; i <= " + steps + "; ++i) {"); node_shader_write(parser_material_curshader, "for (int j = -" + steps + "; j <= " + steps + "; ++j) {"); - node_shader_write(parser_material_curshader, store + "_res += texture(" + tex_name + ", texCoord + vec2(i, j) / vec2(textureSize(" + tex_name + ", 0))).rgb;"); + node_shader_write(parser_material_curshader, store + "_res += texture(" + tex_name + ", tex_coord + vec2(i, j) / vec2(textureSize(" + tex_name + ", 0))).rgb;"); node_shader_write(parser_material_curshader, "}"); node_shader_write(parser_material_curshader, "}"); node_shader_write(parser_material_curshader, store + "_res /= (" + steps + " * 2 + 1) * (" + steps + " * 2 + 1);"); @@ -821,17 +821,17 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ } else if (node.type == "CAMERA") { parser_material_curshader.vvec_cam = true; - return "vVecCam"; + return "vvec_cam"; } 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_curshader, "sampler2D texpaint" + l, "_texpaint" + l); - return "texture(texpaint" + l + ", texCoord).rgb"; + return "texture(texpaint" + l + ", tex_coord).rgb"; } else if (socket == node.outputs[5]) { // Normal node_shader_add_uniform(parser_material_curshader, "sampler2D texpaint_nor" + l, "_texpaint_nor" + l); - return "texture(texpaint_nor" + l + ", texCoord).rgb"; + return "texture(texpaint_nor" + l + ", tex_coord).rgb"; } } else if (node.type == "MATERIAL") { @@ -860,12 +860,12 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ } else if (node.type == "PICKER") { if (socket == node.outputs[0]) { // Base - node_shader_add_uniform(parser_material_curshader, "vec3 pickerBase", "_pickerBase"); - return "pickerBase"; + node_shader_add_uniform(parser_material_curshader, "vec3 picker_base", "_picker_base"); + return "picker_base"; } else if (socket == node.outputs[5]) { // Normal - node_shader_add_uniform(parser_material_curshader, "vec3 pickerNormal", "_pickerNormal"); - return "pickerNormal"; + node_shader_add_uniform(parser_material_curshader, "vec3 picker_normal", "_picker_normal"); + return "picker_normal"; } } else if (node.type == "NEW_GEOMETRY") { @@ -887,7 +887,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ } else if (socket == node.outputs[4]) { // Incoming parser_material_curshader.vvec = true; - return "vVec"; + return "vvec"; } else if (socket == node.outputs[5]) { // Parametric parser_material_curshader.mposition = true; @@ -929,7 +929,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ } else if (socket == node.outputs[2]) {// UV node_shader_context_add_elem(parser_material_curshader.context, "tex", "short2norm"); - return "vec3(texCoord.x, texCoord.y, 0.0)"; + return "vec3(tex_coord.x, tex_coord.y, 0.0)"; } else if (socket == node.outputs[3]) { // Object parser_material_curshader.mposition = true; @@ -949,7 +949,7 @@ function parser_material_parse_vector(node: zui_node_t, socket: zui_node_socket_ } else if (node.type == "UVMAP") { node_shader_context_add_elem(parser_material_curshader.context, "tex", "short2norm"); - return "vec3(texCoord.x, texCoord.y, 0.0)"; + return "vec3(tex_coord.x, tex_coord.y, 0.0)"; } else if (node.type == "BUMP") { let strength: string = parser_material_parse_value_input(node.inputs[0]); @@ -1153,9 +1153,9 @@ function parse_normal_map_color_input(inp: zui_node_socket_t) { } parser_material_frag.n = true; ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) - node_shader_write(parser_material_frag, "mat3 TBN = cotangentFrame(n, vVec, texCoord);"); + node_shader_write(parser_material_frag, "mat3 TBN = cotangent_frame(n, vvec, tex_coord);"); ///else - node_shader_write(parser_material_frag, "mat3 TBN = cotangentFrame(n, -vVec, texCoord);"); + node_shader_write(parser_material_frag, "mat3 TBN = cotangent_frame(n, -vvec, tex_coord);"); ///end node_shader_write(parser_material_frag, "n = mul(normalize(texn), TBN);"); @@ -1208,16 +1208,16 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t node_shader_add_uniform(parser_material_curshader, "sampler2D texuvmap", "_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, texCoord, 0.0).r"; + return "textureLod(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_curshader, "vec2 cameraProj", "_camera_plane_proj"); + node_shader_add_uniform(parser_material_curshader, "vec2 camera_proj", "_camera_plane_proj"); ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan) parser_material_curshader.wvpposition = true; - return "(cameraProj.y / ((wvpposition.z / wvpposition.w) - cameraProj.x))"; + return "(camera_proj.y / ((wvpposition.z / wvpposition.w) - camera_proj.x))"; ///else - return "(cameraProj.y / (gl_FragCoord.z - cameraProj.x))"; + return "(camera_proj.y / (gl_FragCoord.z - camera_proj.x))"; ///end } else { // View Distance @@ -1230,30 +1230,30 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t let l: any = node.buttons[0].default_value; if (socket == node.outputs[1]) { // Opac node_shader_add_uniform(parser_material_curshader, "sampler2D texpaint" + l, "_texpaint" + l); - return "texture(texpaint" + l + ", texCoord).a"; + return "texture(texpaint" + l + ", tex_coord).a"; } else if (socket == node.outputs[2]) { // Occ node_shader_add_uniform(parser_material_curshader, "sampler2D texpaint_pack" + l, "_texpaint_pack" + l); - return "texture(texpaint_pack" + l + ", texCoord).r"; + return "texture(texpaint_pack" + l + ", tex_coord).r"; } else if (socket == node.outputs[3]) { // Rough node_shader_add_uniform(parser_material_curshader, "sampler2D texpaint_pack" + l, "_texpaint_pack" + l); - return "texture(texpaint_pack" + l + ", texCoord).g"; + return "texture(texpaint_pack" + l + ", tex_coord).g"; } else if (socket == node.outputs[4]) { // Metal node_shader_add_uniform(parser_material_curshader, "sampler2D texpaint_pack" + l, "_texpaint_pack" + l); - return "texture(texpaint_pack" + l + ", texCoord).b"; + return "texture(texpaint_pack" + l + ", tex_coord).b"; } else if (socket == node.outputs[7]) { // Height node_shader_add_uniform(parser_material_curshader, "sampler2D texpaint_pack" + l, "_texpaint_pack" + l); - return "texture(texpaint_pack" + l + ", texCoord).a"; + return "texture(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_curshader, "sampler2D texpaint" + l, "_texpaint" + l); - return "texture(texpaint" + l + ", texCoord).r"; + return "texture(texpaint" + l + ", tex_coord).r"; } } else if (node.type == "MATERIAL") { @@ -1289,30 +1289,30 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t } else if (node.type == "PICKER") { if (socket == node.outputs[1]) { - node_shader_add_uniform(parser_material_curshader, "float pickerOpacity", "_pickerOpacity"); - return "pickerOpacity"; + node_shader_add_uniform(parser_material_curshader, "float picker_opacity", "_picker_opacity"); + return "picker_opacity"; } else if (socket == node.outputs[2]) { - node_shader_add_uniform(parser_material_curshader, "float pickerOcclusion", "_pickerOcclusion"); - return "pickerOcclusion"; + node_shader_add_uniform(parser_material_curshader, "float picker_occlusion", "_picker_occlusion"); + return "picker_occlusion"; } else if (socket == node.outputs[3]) { - node_shader_add_uniform(parser_material_curshader, "float pickerRoughness", "_pickerRoughness"); - return "pickerRoughness"; + node_shader_add_uniform(parser_material_curshader, "float picker_roughness", "_picker_roughness"); + return "picker_roughness"; } else if (socket == node.outputs[4]) { - node_shader_add_uniform(parser_material_curshader, "float pickerMetallic", "_pickerMetallic"); - return "pickerMetallic"; + node_shader_add_uniform(parser_material_curshader, "float picker_metallic", "_picker_metallic"); + return "picker_metallic"; } else if (socket == node.outputs[7]) { - node_shader_add_uniform(parser_material_curshader, "float pickerHeight", "_pickerHeight"); - return "pickerHeight"; + node_shader_add_uniform(parser_material_curshader, "float picker_height", "_picker_height"); + return "picker_height"; } } else if (node.type == "FRESNEL") { let ior: string = parser_material_parse_value_input(node.inputs[0]); parser_material_curshader.dotnv = true; - return "pow(1.0 - dotNV, 7.25 / " + ior + ")"; + return "pow(1.0 - dotnv, 7.25 / " + ior + ")"; } else if (node.type == "NEW_GEOMETRY") { if (socket == node.outputs[6]) { // Backfacing @@ -1345,25 +1345,25 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t let blend: string = parser_material_parse_value_input(node.inputs[0]); if (socket == node.outputs[0]) { // Fresnel parser_material_curshader.dotnv = true; - return "clamp(pow(1.0 - dotNV, (1.0 - " + blend + ") * 10.0), 0.0, 1.0)"; + return "clamp(pow(1.0 - dotnv, (1.0 - " + blend + ") * 10.0), 0.0, 1.0)"; } else if (socket == node.outputs[1]) { // Facing parser_material_curshader.dotnv = true; - return "((1.0 - dotNV) * " + blend + ")"; + return "((1.0 - dotnv) * " + blend + ")"; } } else if (node.type == "OBJECT_INFO") { if (socket == node.outputs[1]) { // Object Index - node_shader_add_uniform(parser_material_curshader, "float objectInfoIndex", "_object_info_index"); - return "objectInfoIndex"; + node_shader_add_uniform(parser_material_curshader, "float object_info_index", "_object_info_index"); + return "object_info_index"; } else if (socket == node.outputs[2]) { // Material Index - node_shader_add_uniform(parser_material_curshader, "float objectInfoMaterialIndex", "_object_info_material_index"); - return "objectInfoMaterialIndex"; + node_shader_add_uniform(parser_material_curshader, "float object_info_material_index", "_object_info_material_index"); + return "object_info_material_index"; } else if (socket == node.outputs[3]) { // Random - node_shader_add_uniform(parser_material_curshader, "float objectInfoRandom", "_object_info_random"); - return "objectInfoRandom"; + node_shader_add_uniform(parser_material_curshader, "float object_info_random", "_object_info_random"); + return "object_info_random"; } } else if (node.type == "VALUE") { @@ -1461,7 +1461,7 @@ function parser_material_parse_value(node: zui_node_t, socket: zui_node_socket_t let tex_name: string = "texbake_" + parser_material_node_name(node); node_shader_add_uniform(parser_material_curshader, "sampler2D " + tex_name, "_" + tex_name); let store: string = parser_material_store_var_name(node); - node_shader_write(parser_material_curshader, "float " + store + "_res = texture(" + tex_name + ", texCoord).r;"); + node_shader_write(parser_material_curshader, "float " + store + "_res = texture(" + tex_name + ", tex_coord).r;"); return store + "_res"; } else if (node.type == "NORMAL") { @@ -1837,9 +1837,9 @@ function parser_material_texture_store(node: zui_node_t, tex: bind_tex_t, tex_na if (parser_material_triplanar) { node_shader_write(parser_material_curshader, "vec4 " + tex_store + " = vec4(0.0, 0.0, 0.0, 0.0);"); - node_shader_write(parser_material_curshader, "if (texCoordBlend.x > 0) " + tex_store + " += texture(" + tex_name + ", " + uv_name + ".xy) * texCoordBlend.x;"); - node_shader_write(parser_material_curshader, "if (texCoordBlend.y > 0) " + tex_store + " += texture(" + tex_name + ", " + uv_name + "1.xy) * texCoordBlend.y;"); - node_shader_write(parser_material_curshader, "if (texCoordBlend.z > 0) " + tex_store + " += texture(" + tex_name + ", " + uv_name + "2.xy) * texCoordBlend.z;"); + node_shader_write(parser_material_curshader, "if (tex_coord_blend.x > 0) " + tex_store + " += texture(" + tex_name + ", " + uv_name + ".xy) * tex_coord_blend.x;"); + node_shader_write(parser_material_curshader, "if (tex_coord_blend.y > 0) " + tex_store + " += texture(" + tex_name + ", " + uv_name + "1.xy) * tex_coord_blend.y;"); + node_shader_write(parser_material_curshader, "if (tex_coord_blend.z > 0) " + tex_store + " += texture(" + tex_name + ", " + uv_name + "2.xy) * tex_coord_blend.z;"); } else { if (parser_material_curshader == parser_material_frag) { diff --git a/base/sources/render_path_base.ts b/base/sources/render_path_base.ts index 317ed024..9b358923 100644 --- a/base/sources/render_path_base.ts +++ b/base/sources/render_path_base.ts @@ -469,17 +469,17 @@ function render_path_base_draw_taa() { render_path_set_target(current); render_path_clear_target(0x00000000); - render_path_bind_target("buf", "colorTex"); + render_path_bind_target("buf", "color_tex"); render_path_draw_shader("shader_datas/smaa_edge_detect/smaa_edge_detect"); render_path_set_target("taa"); render_path_clear_target(0x00000000); - render_path_bind_target(current, "edgesTex"); + render_path_bind_target(current, "edges_tex"); render_path_draw_shader("shader_datas/smaa_blend_weight/smaa_blend_weight"); render_path_set_target(current); - render_path_bind_target("buf", "colorTex"); - render_path_bind_target("taa", "blendTex"); + render_path_bind_target("buf", "color_tex"); + render_path_bind_target("taa", "blend_tex"); render_path_bind_target("gbuffer2", "sveloc"); render_path_draw_shader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend"); diff --git a/base/sources/strings.ts b/base/sources/strings.ts index b333eb0d..df757ac4 100644 --- a/base/sources/strings.ts +++ b/base/sources/strings.ts @@ -199,14 +199,14 @@ float tex_brick_noise(int n) { \ return 0.5f * float(nn) / 1073741824.0; \ } \ vec3 tex_brick(vec3 p, const vec3 c1, const vec3 c2, const vec3 c3) { \ - vec3 brickSize = vec3(0.9, 0.49, 0.49); \ - vec3 mortarSize = vec3(0.05, 0.1, 0.1); \ - p /= brickSize / 2; \ + vec3 brick_size = vec3(0.9, 0.49, 0.49); \ + vec3 mortar_size = vec3(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 / (brickSize.x + (mortarSize.x * 2.0))); \ + 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 - mortarSize); \ + 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); \ } \ @@ -235,24 +235,24 @@ vec3 brightcontrast(const vec3 col, const float bright, const float contr) { \ ///if arm_voxels let str_trace_ao: string = " \ -float traceConeAO(sampler3D voxels, const vec3 origin, vec3 dir, const float aperture, const float maxDist, const float offset) { \ - const ivec3 voxelgiResolution = ivec3(256, 256, 256); \ - const float voxelgiStep = 1.0; \ - const float VOXEL_SIZE = (2.0 / voxelgiResolution.x) * voxelgiStep; \ +float trace_cone_ao(sampler3D voxels, const vec3 origin, vec3 dir, const float aperture, const float max_dist, const float offset) { \ + const ivec3 voxelgi_resolution = ivec3(256, 256, 256); \ + const float voxelgi_step = 1.0; \ + const float VOXEL_SIZE = (2.0 / voxelgi_resolution.x) * voxelgi_step; \ dir = normalize(dir); \ - float sampleCol = 0.0; \ + float sample_col = 0.0; \ float dist = offset; \ float diam = dist * aperture; \ - vec3 samplePos; \ - while (sampleCol < 1.0 && dist < maxDist) { \ - samplePos = dir * dist + origin; \ - float mip = max(log2(diam * voxelgiResolution.x), 0); \ - float mipSample = textureLod(voxels, samplePos * 0.5 + vec3(0.5, 0.5, 0.5), mip).r; \ - sampleCol += (1 - sampleCol) * mipSample; \ + vec3 sample_pos; \ + while (sample_col < 1.0 && dist < max_dist) { \ + sample_pos = dir * dist + origin; \ + float mip = max(log2(diam * voxelgi_resolution.x), 0); \ + float mip_sample = textureLod(voxels, sample_pos * 0.5 + vec3(0.5, 0.5, 0.5), mip).r; \ + sample_col += (1 - sample_col) * mip_sample; \ dist += max(diam / 2, VOXEL_SIZE); \ diam = dist * aperture; \ } \ - return sampleCol; \ + return sample_col; \ } \ vec3 tangent(const vec3 n) { \ vec3 t1 = cross(n, vec3(0, 0, 1)); \ @@ -260,34 +260,34 @@ vec3 tangent(const vec3 n) { \ if (length(t1) > length(t2)) return normalize(t1); \ else return normalize(t2); \ } \ -float traceAO(const vec3 origin, const vec3 normal, const float vrange, const float voffset) { \ - const float angleMix = 0.5f; \ +float trace_ao(const vec3 origin, const vec3 normal, const float vrange, const float voffset) { \ + const float angle_mix = 0.5f; \ const float aperture = 0.55785173935; \ vec3 o1 = normalize(tangent(normal)); \ vec3 o2 = normalize(cross(o1, normal)); \ vec3 c1 = 0.5f * (o1 + o2); \ vec3 c2 = 0.5f * (o1 - o2); \ float MAX_DISTANCE = 1.73205080757 * 2.0 * vrange; \ - const ivec3 voxelgiResolution = ivec3(256, 256, 256); \ - const float voxelgiStep = 1.0; \ - const float VOXEL_SIZE = (2.0 / voxelgiResolution.x) * voxelgiStep; \ + const ivec3 voxelgi_resolution = ivec3(256, 256, 256); \ + const float voxelgi_step = 1.0; \ + const float VOXEL_SIZE = (2.0 / voxelgi_resolution.x) * voxelgi_step; \ float offset = 1.5 * VOXEL_SIZE * 2.5 * voffset; \ - float col = traceConeAO(voxels, origin, normal, aperture, MAX_DISTANCE, offset); \ - col += traceConeAO(voxels, origin, mix(normal, o1, angleMix), aperture, MAX_DISTANCE, offset); \ - col += traceConeAO(voxels, origin, mix(normal, o2, angleMix), aperture, MAX_DISTANCE, offset); \ - col += traceConeAO(voxels, origin, mix(normal, -c1, angleMix), aperture, MAX_DISTANCE, offset); \ - col += traceConeAO(voxels, origin, mix(normal, -c2, angleMix), aperture, MAX_DISTANCE, offset); \ - col += traceConeAO(voxels, origin, mix(normal, -o1, angleMix), aperture, MAX_DISTANCE, offset); \ - col += traceConeAO(voxels, origin, mix(normal, -o2, angleMix), aperture, MAX_DISTANCE, offset); \ - col += traceConeAO(voxels, origin, mix(normal, c1, angleMix), aperture, MAX_DISTANCE, offset); \ - col += traceConeAO(voxels, origin, mix(normal, c2, angleMix), aperture, MAX_DISTANCE, offset); \ + float col = trace_cone_ao(voxels, origin, normal, aperture, MAX_DISTANCE, offset); \ + col += trace_cone_ao(voxels, origin, mix(normal, o1, angle_mix), aperture, MAX_DISTANCE, offset); \ + col += trace_cone_ao(voxels, origin, mix(normal, o2, angle_mix), aperture, MAX_DISTANCE, offset); \ + col += trace_cone_ao(voxels, origin, mix(normal, -c1, angle_mix), aperture, MAX_DISTANCE, offset); \ + col += trace_cone_ao(voxels, origin, mix(normal, -c2, angle_mix), aperture, MAX_DISTANCE, offset); \ + col += trace_cone_ao(voxels, origin, mix(normal, -o1, angle_mix), aperture, MAX_DISTANCE, offset); \ + col += trace_cone_ao(voxels, origin, mix(normal, -o2, angle_mix), aperture, MAX_DISTANCE, offset); \ + col += trace_cone_ao(voxels, origin, mix(normal, c1, angle_mix), aperture, MAX_DISTANCE, offset); \ + col += trace_cone_ao(voxels, origin, mix(normal, c2, angle_mix), aperture, MAX_DISTANCE, offset); \ return col / 9.0; \ } \ "; ///end let str_cotangent_frame: string = " \ -mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 duv1, const vec2 duv2) { \ +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); \ @@ -297,62 +297,62 @@ mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 duv1, const vec2 duv2 float invmax = inversesqrt(max(dot(t, t), dot(b, b))); \ return mat3(t * invmax, b * invmax, n); \ } \ -mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 texCoord) { \ - return cotangentFrame(n, p, dFdx(texCoord), dFdy(texCoord)); \ +mat3 cotangent_frame(const vec3 n, const vec3 p, const vec2 tex_coord) { \ + return cotangent_frame(n, p, dFdx(tex_coord), dFdy(tex_coord)); \ } \ "; let str_octahedron_wrap: string = " \ -vec2 octahedronWrap(const vec2 v) { \ +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_pack_float_int16: string = " \ -float packFloatInt16(const float f, const uint i) { \ +float pack_f32_i16(const float f, const uint i) { \ const float prec = float(1 << 16); \ const float maxi = float(1 << 4); \ - const float precMinusOne = prec - 1.0; \ - const float t1 = ((prec / maxi) - 1.0) / precMinusOne; \ - const float t2 = (prec / maxi) / precMinusOne; \ + 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); \ } \ "; ///if arm_skin let str_get_skinning_dual_quat: string = " \ -void getSkinningDualQuat(const ivec4 bone, vec4 weight, out vec4 A, inout vec4 B) { \ +void get_skinning_dual_quat(const ivec4 bone, vec4 weight, out vec4 A, inout vec4 B) { \ ivec4 bonei = bone * 2; \ - mat4 matA = mat4( \ - skinBones[bonei.x], \ - skinBones[bonei.y], \ - skinBones[bonei.z], \ - skinBones[bonei.w]); \ - mat4 matB = mat4( \ - skinBones[bonei.x + 1], \ - skinBones[bonei.y + 1], \ - skinBones[bonei.z + 1], \ - skinBones[bonei.w + 1]); \ - weight.xyz *= sign(mul(matA, matA[3])).xyz; \ - A = mul(weight, matA); \ - B = mul(weight, matB); \ - float invNormA = 1.0 / length(A); \ - A *= invNormA; \ - B *= invNormA; \ + mat4 mat_a = mat4( \ + skin_bones[bonei.x], \ + skin_bones[bonei.y], \ + skin_bones[bonei.z], \ + skin_bones[bonei.w]); \ + mat4 mat_b = mat4( \ + 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); \ + A *= inv_norm_a; \ + B *= inv_norm_a; \ } \ "; ///end let str_create_basis: string = " \ -void createBasis(vec3 normal, out vec3 tangent, out vec3 binormal) { \ - tangent = normalize(cameraRight - normal * dot(cameraRight, normal)); \ +void create_basis(vec3 normal, out vec3 tangent, out vec3 binormal) { \ + tangent = normalize(camera_right - normal * dot(camera_right, normal)); \ binormal = cross(tangent, normal); \ } \ "; function str_sh_irradiance(): string { ///if krom_metal - return "vec3 shIrradiance(const vec3 nor, constant vec4 shirr[7]) { \ + 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; \ @@ -382,7 +382,7 @@ function str_sh_irradiance(): string { } \ "; ///else - return "vec3 shIrradiance(const vec3 nor, const vec4 shirr[7]) { \ + 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; \ @@ -415,7 +415,7 @@ function str_sh_irradiance(): string { } let str_envmap_equirect: string = " \ -vec2 envMapEquirect(const vec3 normal, const float angle) { \ +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); \ @@ -427,14 +427,14 @@ vec2 envMapEquirect(const vec3 normal, const float angle) { \ // Linearly Transformed Cosines // https://eheitzresearch.wordpress.com/415-2/ let str_ltc_evaluate: string = " \ -float integrateEdge(vec3 v1, vec3 v2) { \ - float cosTheta = dot(v1, v2); \ - float theta = acos(cosTheta); \ +float integrate_edge(vec3 v1, vec3 v2) { \ + float cos_theta = dot(v1, v2); \ + float theta = acos(cos_theta); \ float res = cross(v1, v2).z * ((theta > 0.001) ? theta / sin(theta) : 1.0); \ return res; \ } \ -float ltcEvaluate(vec3 N, vec3 V, float dotNV, vec3 P, mat3 Minv, vec3 points0, vec3 points1, vec3 points2, vec3 points3) { \ - vec3 T1 = normalize(V - N * dotNV); \ +float ltc_evaluate(vec3 N, vec3 V, float dotnv, vec3 P, mat3 Minv, vec3 points0, vec3 points1, vec3 points2, vec3 points3) { \ + vec3 T1 = normalize(V - N * dotnv); \ vec3 T2 = cross(N, T1); \ Minv = mul(transpose(mat3(T1, T2, N)), Minv); \ vec3 L0 = mul((points0 - P), Minv); \ @@ -525,11 +525,11 @@ float ltcEvaluate(vec3 N, vec3 V, float dotNV, vec3 P, mat3 Minv, vec3 points0, L3 = normalize(L3); \ L4 = normalize(L4); \ float sum = 0.0; \ - sum += integrateEdge(L0, L1); \ - sum += integrateEdge(L1, L2); \ - sum += integrateEdge(L2, L3); \ - if (n >= 4) sum += integrateEdge(L3, L4); \ - if (n == 5) sum += integrateEdge(L4, L0); \ + sum += integrate_edge(L0, L1); \ + sum += integrate_edge(L1, L2); \ + sum += integrate_edge(L2, L3); \ + if (n >= 4) sum += integrate_edge(L3, L4); \ + if (n == 5) sum += integrate_edge(L4, L0); \ return max(0.0, -sum); \ } \ "; @@ -548,9 +548,9 @@ vec3 get_pos_from_depth(vec2 uv, mat4 invVP, textureArg(gbufferD)) { \ "; let str_get_nor_from_depth: string = " \ -vec3 get_nor_from_depth(vec3 p0, vec2 uv, mat4 invVP, vec2 texStep, textureArg(gbufferD)) { \ - vec3 p1 = get_pos_from_depth(uv + vec2(texStep.x * 4.0, 0.0), invVP, texturePass(gbufferD)); \ - vec3 p2 = get_pos_from_depth(uv + vec2(0.0, texStep.y * 4.0), invVP, texturePass(gbufferD)); \ +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)); \ return normalize(cross(p2 - p0, p1 - p0)); \ } \ "; diff --git a/base/sources/uniforms_ext.ts b/base/sources/uniforms_ext.ts index a7aad87d..09a5e59d 100644 --- a/base/sources/uniforms_ext.ts +++ b/base/sources/uniforms_ext.ts @@ -13,14 +13,14 @@ function uniforms_ext_init() { } function uniforms_ext_i32_link(object: object_t, mat: material_data_t, link: string): i32 { - if (link == "_bloomCurrentMip") { + if (link == "_bloom_current_mip") { return render_path_base_bloom_current_mip; } return 0; } function uniforms_ext_f32_link(object: object_t, mat: material_data_t, link: string): f32 { - if (link == "_brushRadius") { + if (link == "_brush_radius") { ///if (is_paint || is_sculpt) let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT; let decal_mask: bool = decal && operator_shortcut(map_get(config_keymap, "decal_mask") + "+" + map_get(config_keymap, "action_paint"), shortcut_type_t.DOWN); @@ -54,34 +54,34 @@ function uniforms_ext_f32_link(object: object_t, mat: material_data_t, link: str return val; } - else if (link == "_vignetteStrength") { + else if (link == "_vignette_strength") { return config_raw.rp_vignette; } - else if (link == "_grainStrength") { + else if (link == "_grain_strength") { return config_raw.rp_grain; } - else if (link == "_coneOffset") { + else if (link == "_cone_offset") { return context_raw.vxao_offset; } - else if (link == "_coneAperture") { + else if (link == "_cone_aperture") { return context_raw.vxao_aperture; } - else if (link == "_bloomSampleScale") { + else if (link == "_bloom_sample_scale") { return render_path_base_bloom_sample_scale; } ///if (is_paint || is_sculpt) - else if (link == "_brushScaleX") { + else if (link == "_brush_scale_x") { return 1 / context_raw.brush_scale_x; } - else if (link == "_brushOpacity") { + else if (link == "_brush_opacity") { let val: f32 = context_raw.brush_opacity * context_raw.brush_nodes_opacity; if (config_raw.pressure_opacity && pen_down()) { val *= pen_pressure * config_raw.pressure_sensitivity; } return val; } - else if (link == "_brushHardness") { + else if (link == "_brush_hardness") { let decal_mask: bool = operator_shortcut(map_get(config_keymap, "decal_mask") + "+" + map_get(config_keymap, "action_paint"), shortcut_type_t.DOWN); if (context_raw.tool != workspace_tool_t.BRUSH && context_raw.tool != workspace_tool_t.ERASER && context_raw.tool != workspace_tool_t.CLONE && !decal_mask) { return 1.0; @@ -100,35 +100,35 @@ function uniforms_ext_f32_link(object: object_t, mat: material_data_t, link: str } return val; } - else if (link == "_brushScale") { + else if (link == "_brush_scale") { let fill: bool = context_raw.layer.fill_layer != null; let val: f32 = (fill ? context_raw.layer.scale : context_raw.brush_scale) * context_raw.brush_nodes_scale; return val; } - else if (link == "_objectId") { + else if (link == "_object_id") { return array_index_of(project_paint_objects, object.ext); } ///if is_paint - else if (link == "_dilateRadius") { + else if (link == "_dilate_radius") { return util_uv_dilatemap != null ? config_raw.dilate_radius : 0.0; } ///end - else if (link == "_decalLayerDim") { + else if (link == "_decal_layer_dim") { return mat4_get_scale(context_raw.layer.decal_mat).z * 0.5; } - else if (link == "_pickerOpacity") { + else if (link == "_picker_opacity") { return context_raw.picked_color.opacity; } - else if (link == "_pickerOcclusion") { + else if (link == "_picker_occlusion") { return context_raw.picked_color.occlusion; } - else if (link == "_pickerRoughness") { + else if (link == "_picker_roughness") { return context_raw.picked_color.roughness; } - else if (link == "_pickerMetallic") { + else if (link == "_picker_metallic") { return context_raw.picked_color.metallic; } - else if (link == "_pickerHeight") { + else if (link == "_picker_height") { return context_raw.picked_color.height; } ///end @@ -149,22 +149,22 @@ function uniforms_ext_f32_link(object: object_t, mat: material_data_t, link: str } function uniforms_ext_vec2_link(object: object_t, mat: material_data_t, link: string): vec4_t { - if (link == "_gbufferSize") { + if (link == "_gbuffer_size") { vec4_set(uniforms_ext_vec, 0, 0, 0); let gbuffer2: render_target_t = map_get(render_path_render_targets, "gbuffer2"); vec4_set(uniforms_ext_vec, gbuffer2._image.width, gbuffer2._image.height, 0); return uniforms_ext_vec; } - else if (link == "_cloneDelta") { + else if (link == "_clone_delta") { vec4_set(uniforms_ext_vec, context_raw.clone_delta_x, context_raw.clone_delta_y, 0); return uniforms_ext_vec; } - else if (link == "_texpaintSize") { + else if (link == "_texpaint_size") { vec4_set(uniforms_ext_vec, config_get_texture_res_x(), config_get_texture_res_y(), 0); return uniforms_ext_vec; } ///if (is_paint || is_sculpt) - else if (link == "_brushAngle") { + else if (link == "_brush_angle") { let brush_angle: f32 = context_raw.brush_angle + context_raw.brush_nodes_angle; let angle: f32 = context_raw.layer.fill_layer != null ? context_raw.layer.angle : brush_angle; angle *= (math_pi() / 180); @@ -183,7 +183,7 @@ function uniforms_ext_vec3_link(object: object_t, mat: material_data_t, link: st let v: vec4_t = null; ///if (is_paint || is_sculpt) - if (link == "_brushDirection") { + if (link == "_brush_direction") { v = _uniforms_vec; // Discard first paint for directional brush let allow_paint: bool = context_raw.prev_paint_vec_x != context_raw.last_paint_vec_x && @@ -204,17 +204,17 @@ function uniforms_ext_vec3_link(object: object_t, mat: material_data_t, link: st context_raw.prev_paint_vec_y = context_raw.last_paint_vec_y; return v; } - else if (link == "_decalLayerLoc") { + else if (link == "_decal_layer_loc") { v = _uniforms_vec; vec4_set(v, context_raw.layer.decal_mat.m[12], context_raw.layer.decal_mat.m[13], context_raw.layer.decal_mat.m[14]); return v; } - else if (link == "_decalLayerNor") { + else if (link == "_decal_layer_nor") { v = _uniforms_vec; vec4_normalize(vec4_set(v, context_raw.layer.decal_mat.m[8], context_raw.layer.decal_mat.m[9], context_raw.layer.decal_mat.m[10])); return v; } - else if (link == "_pickerBase") { + else if (link == "_picker_base") { v = _uniforms_vec; vec4_set(v, color_get_rb(context_raw.picked_color.base) / 255, @@ -223,7 +223,7 @@ function uniforms_ext_vec3_link(object: object_t, mat: material_data_t, link: st ); return v; } - else if (link == "_pickerNormal") { + else if (link == "_picker_normal") { v = _uniforms_vec; vec4_set(v, color_get_rb(context_raw.picked_color.normal) / 255, @@ -233,12 +233,12 @@ function uniforms_ext_vec3_link(object: object_t, mat: material_data_t, link: st return v; } ///if arm_physics - else if (link == "_particleHit") { + else if (link == "_particle_hit") { v = _uniforms_vec; vec4_set(v, context_raw.particle_hit_x, context_raw.particle_hit_y, context_raw.particle_hit_z); return v; } - else if (link == "_particleHitLast") { + else if (link == "_particle_hit_last") { v = _uniforms_vec; vec4_set(v, context_raw.last_particle_hit_x, context_raw.last_particle_hit_y, context_raw.last_particle_hit_z); return v; @@ -260,7 +260,7 @@ function vec2d(x: f32): f32 { ///end function uniforms_ext_vec4_link(object: object_t, mat: material_data_t, link: string): vec4_t { - if (link == "_inputBrush") { + if (link == "_input_brush") { let down: bool = mouse_down() || pen_down(); vec4_set(uniforms_ext_vec, context_raw.paint_vec.x, context_raw.paint_vec.y, down ? 1.0 : 0.0, 0.0); @@ -272,7 +272,7 @@ function uniforms_ext_vec4_link(object: object_t, mat: material_data_t, link: st return uniforms_ext_vec; } - else if (link == "_inputBrushLast") { + else if (link == "_input_brush_last") { let down: bool = mouse_down() || pen_down(); vec4_set(uniforms_ext_vec, context_raw.last_paint_vec_x, context_raw.last_paint_vec_y, down ? 1.0 : 0.0, 0.0); @@ -284,21 +284,21 @@ function uniforms_ext_vec4_link(object: object_t, mat: material_data_t, link: st return uniforms_ext_vec; } - else if (link == "_envmapData") { + else if (link == "_envmap_data") { vec4_set(uniforms_ext_vec, context_raw.envmap_angle, math_sin(-context_raw.envmap_angle), math_cos(-context_raw.envmap_angle), scene_world.strength); return uniforms_ext_vec; } - else if (link == "_envmapDataWorld") { + else if (link == "_envmap_data_world") { vec4_set(uniforms_ext_vec, context_raw.envmap_angle, math_sin(-context_raw.envmap_angle), math_cos(-context_raw.envmap_angle), context_raw.show_envmap ? scene_world.strength : 1.0); return uniforms_ext_vec; } ///if (is_paint || is_sculpt) - else if (link == "_stencilTransform") { + else if (link == "_stencil_transform") { vec4_set(uniforms_ext_vec, context_raw.brush_stencil_x, context_raw.brush_stencil_y, context_raw.brush_stencil_scale, context_raw.brush_stencil_angle); if (context_raw.paint2d) uniforms_ext_vec.x = vec2d(uniforms_ext_vec.x); return uniforms_ext_vec; } - else if (link == "_decalMask") { + else if (link == "_decal_mask") { let decal_mask: bool = operator_shortcut(map_get(config_keymap, "decal_mask") + "+" + map_get(config_keymap, "action_paint"), shortcut_type_t.DOWN); let val: f32 = (context_raw.brush_radius * context_raw.brush_nodes_radius) / 15.0; let scale2d: f32 = (900 / base_h()) * config_raw.window_scale; @@ -316,7 +316,7 @@ function uniforms_ext_vec4_link(object: object_t, mat: material_data_t, link: st function uniforms_ext_mat4_link(object: object_t, mat: material_data_t, link: string): mat4_t { ///if (is_paint || is_sculpt) - if (link == "_decalLayerMatrix") { // Decal layer + if (link == "_decal_layer_matrix") { // Decal layer let m: mat4_t = _uniforms_mat; mat4_set_from(m, context_raw.layer.decal_mat); mat4_get_inv(m, m); @@ -362,13 +362,13 @@ function uniforms_ext_tex_link(object: object_t, mat: material_data_t, link: str return null; ///end } - else if (link == "_ltcMat") { + else if (link == "_ltc_mat") { if (const_data_ltc_mat_tex == null) { const_data_init_ltc(); } return const_data_ltc_mat_tex; } - else if (link == "_ltcMag") { + else if (link == "_ltc_mag") { if (const_data_ltc_mag_tex == null) { const_data_init_ltc(); } diff --git a/base/sources/util_uv.ts b/base/sources/util_uv.ts index 7e52ba2f..5237db09 100644 --- a/base/sources/util_uv.ts +++ b/base/sources/util_uv.ts @@ -124,7 +124,7 @@ function util_uv_cache_dilate_map() { util_uv_pipe_dilate.depth_mode = compare_mode_t.ALWAYS; util_uv_pipe_dilate.color_attachments[0] = tex_format_t.R8; g4_pipeline_compile(util_uv_pipe_dilate); - // dilateTexUnpack = getConstantLocation(pipeDilate, "texUnpack"); + // dilate_tex_unpack = getConstantLocation(pipeDilate, "tex_unpack"); } let mask: i32 = context_object_mask_used() ? slot_layer_get_object_mask(context_raw.layer) : 0;