diff --git a/packages/ludic.render3d/actor.ludic b/packages/ludic.render3d/actor.ludic index 3393abb1..48886f9d 100644 --- a/packages/ludic.render3d/actor.ludic +++ b/packages/ludic.render3d/actor.ludic @@ -220,6 +220,7 @@ function actor_draw_one(render3d_st: mut Render3dState, a: Actor, ap: AcProg, sh else { u_v3(render3d_st, ap.l_tint, a.tint) } } gpu_tex_unit(render3d_st, 0); gpu_tex_bind(render3d_st, GPU_TEX2D, pr.diff) + prim_factors(render3d_st, ap.prog, pr) if not shadow { gpu_tex_unit(render3d_st, 1); gpu_tex_bind(render3d_st, GPU_TEX2D, pr.nrm) gpu_tex_unit(render3d_st, 2); gpu_tex_bind(render3d_st, GPU_TEX2D, pr.arm) diff --git a/packages/ludic.render3d/env.ludic b/packages/ludic.render3d/env.ludic index 6ca513cf..a6188f2f 100644 --- a/packages/ludic.render3d/env.ludic +++ b/packages/ludic.render3d/env.ludic @@ -836,6 +836,7 @@ export state Render3dState { tb_key: string = "" tb_version: int = 0 tb_shadow_ok: bool = false # the shadow came from its bake this map + gltf_pure: int = 0 # a 1x1 white a factor multiplies exactly (gltf_factors) tt_dir: string = "" # terrain_tiles_to: where a map's tiles are written ("" keeps the whole copies) tt_key: string = "" tt_file: pointer = null # the tiles' file, open for reading (terrain_tiles.ludic) diff --git a/packages/ludic.render3d/gltf.ludic b/packages/ludic.render3d/gltf.ludic index 8710c4f5..7900981c 100644 --- a/packages/ludic.render3d/gltf.ludic +++ b/packages/ludic.render3d/gltf.ludic @@ -11,7 +11,8 @@ property Prim { nrm: int = 0, arm: int = 0, verts: int = 0, # vertices in the mesh (each attribute buffer holds this many) - name: string # the material's name (a part to tint: "hk_jacket") + name: string, # the material's name (a part to tint: "hk_jacket") + fac: floats # the material's factors, or null (all 1, no emission): base r g b a, roughness, metallic, emissive r g b } property Model { prims: []Prim, @@ -155,6 +156,7 @@ function gltf_prim(render3d_st: mut Render3dState, p: Val) -> Prim { if ud != null { pr.diff = gltf_texture(render3d_st, ud, true) } if un != null { pr.nrm = gltf_texture(render3d_st, un, false) } if ua != null { pr.arm = gltf_texture(render3d_st, ua, false) } + gltf_factors(render3d_st, pr, mat, ud != null, ua != null) var mname: string = null # a copy: the document goes, strings and all, at the next load if value_has(mat, "name") != 0 { let s = value_as_str(value_get(mat, "name")); mname = s[0 .. len(s)] } @@ -174,6 +176,45 @@ function gltf_prim(render3d_st: mut Render3dState, p: Val) -> Prim { return pr } +# The material's factors (glTF's pbrMetallicRoughness and emissiveFactor), which the shaders multiply in; +# a material that gives none keeps pr.fac null and draws as it always has. An untextured material with +# a colour, or a metal/roughness, samples white for it, so the factor is exactly what it draws. +@alloc_ok("a model being loaded: a primitive's factors, once") +function gltf_factors(render3d_st: mut Render3dState, pr: Prim, mat: Val, has_diff: bool, has_arm: bool) -> void { + let pbr = value_get(mat, "pbrMetallicRoughness") + let has_pbr = value_has(mat, "pbrMetallicRoughness") != 0 + let has_base = has_pbr and value_has(pbr, "baseColorFactor") != 0 + let has_m = has_pbr and value_has(pbr, "metallicFactor") != 0 + let has_r = has_pbr and value_has(pbr, "roughnessFactor") != 0 + let has_e = value_has(mat, "emissiveFactor") != 0 + if not has_base and not has_m and not has_r and not has_e { return } + let f = floats(9) + for k in 0 .. 6 { f[k] = 1.0 } + for k in 6 .. 9 { f[k] = 0.0 } + if has_base { let b = value_get(pbr, "baseColorFactor"); for k in 0 .. min(value_count(b), 4) { f[k] = jnum(value_at(b, k)) } } + if has_r { f[4] = jnum(value_get(pbr, "roughnessFactor")) } + if has_m { f[5] = jnum(value_get(pbr, "metallicFactor")) } + if has_e { let e = value_get(mat, "emissiveFactor"); for k in 0 .. min(value_count(e), 3) { f[6 + k] = jnum(value_at(e, k)) } } + pr.fac = f + if render3d_st.gltf_pure == 0 { render3d_st.gltf_pure = tex_solid(render3d_st, 255, 255, 255, 255) } + if has_base and not has_diff { pr.diff = render3d_st.gltf_pure } + if (has_m or has_r) and not has_arm { pr.arm = render3d_st.gltf_pure } +} + +# a primitive's factors handed to program p (as 1 - factor, so a program never given them reads 1) +function prim_factors(render3d_st: mut Render3dState, p: int, pr: Prim) -> void { + let f = pr.fac + if f == null { + u_f4(render3d_st, gpu_uniform(render3d_st, p, "u_fac_base_inv"), 0.0, 0.0, 0.0, 0.0) + u_f2(render3d_st, gpu_uniform(render3d_st, p, "u_fac_mr_inv"), 0.0, 0.0) + u_f3(render3d_st, gpu_uniform(render3d_st, p, "u_fac_emis"), 0.0, 0.0, 0.0) + return + } + u_f4(render3d_st, gpu_uniform(render3d_st, p, "u_fac_base_inv"), 1.0 - f[0], 1.0 - f[1], 1.0 - f[2], 1.0 - f[3]) + u_f2(render3d_st, gpu_uniform(render3d_st, p, "u_fac_mr_inv"), 1.0 - f[4], 1.0 - f[5]) + u_f3(render3d_st, gpu_uniform(render3d_st, p, "u_fac_emis"), f[6], f[7], f[8]) +} + # Load the mesh of the node called `node_name` from dir/file. # the GPU memory it makes is counted as VKM_MODEL (R3D_VKMEM) function gltf_load(render3d_st: mut Render3dState, dir: string, file: string, node_name: string) -> Model { diff --git a/packages/ludic.render3d/scatter.ludic b/packages/ludic.render3d/scatter.ludic index c94577e3..616ab527 100644 --- a/packages/ludic.render3d/scatter.ludic +++ b/packages/ludic.render3d/scatter.ludic @@ -387,6 +387,7 @@ function impostor_paint(render3d_st: mut Render3dState, im: Impostor) -> void { let pr = model.prims[i] r3d_bind_2d(render3d_st, bake, "u_diff", 0, pr.diff) r3d_bind_2d(render3d_st, bake, "u_arm", 2, pr.arm) + prim_factors(render3d_st, bake, pr) mesh_draw_instanced(render3d_st, pr.mesh, 1) } } @@ -962,6 +963,7 @@ function layer_draw_model(render3d_st: mut Render3dState, l: Layer, model: Model scatter_attach(render3d_st, pr.mesh, vb) if not card { r3d_bind_2d(render3d_st, p, "u_diff", 0, pr.diff) + prim_factors(render3d_st, p, pr) if not shadow { r3d_bind_2d(render3d_st, p, "u_nrm", 1, pr.nrm); r3d_bind_2d(render3d_st, p, "u_arm", 2, pr.arm) } } if render3d_st.sc_ind_base >= 0 { gpu_draw_mesh_indirect(render3d_st, pr.mesh, l.g_cmds, (render3d_st.sc_ind_base + i * render3d_st.sc_ind_stride) * SC_REC_W, render3d_st.sc_ind_n, 0, 0) } @@ -1057,6 +1059,7 @@ function layer_draw_depth(render3d_st: mut Render3dState, l: Layer, model: Model let pr = model.prims[i] scatter_attach(render3d_st, pr.mesh, vb) r3d_bind_2d(render3d_st, p, "u_diff", 0, pr.diff) + prim_factors(render3d_st, p, pr) if render3d_st.sc_ind_base >= 0 { gpu_draw_mesh_indirect(render3d_st, pr.mesh, l.g_cmds, (render3d_st.sc_ind_base + i * render3d_st.sc_ind_stride) * SC_REC_W, render3d_st.sc_ind_n, 0, 0) } else { mesh_draw_instanced(render3d_st, pr.mesh, cnt) } } diff --git a/packages/ludic.render3d/shaders/bake.frag b/packages/ludic.render3d/shaders/bake.frag index 7688f19d..8472eb91 100644 --- a/packages/ludic.render3d/shaders/bake.frag +++ b/packages/ludic.render3d/shaders/bake.frag @@ -6,9 +6,10 @@ in float v_seed; layout(location = 0) out vec4 o_albedo; layout(location = 1) out vec4 o_normal; uniform sampler2D u_diff; +uniform vec4 u_fac_base_inv; // a glTF material's base colour factor, as 1 - factor uniform sampler2D u_arm; void main() { - vec4 d = texture(u_diff, v_uv); + vec4 d = texture(u_diff, v_uv) * (vec4(1.0) - u_fac_base_inv); if (d.a < 0.5) discard; // cut-out cards (needles, blades, leaves) bake with their shape vec3 N = normalize(v_nrm); if (!gl_FrontFacing) N = -N; diff --git a/packages/ludic.render3d/shaders/model.frag b/packages/ludic.render3d/shaders/model.frag index c860acb9..2518d569 100644 --- a/packages/ludic.render3d/shaders/model.frag +++ b/packages/ludic.render3d/shaders/model.frag @@ -12,6 +12,10 @@ in float v_lh; // height above the model's base (model.vert) uniform float u_model_h; out vec4 o_color; uniform sampler2D u_diff; +// a glTF material's factors, as 1 - factor (a program never given them reads 1) and its emission +uniform vec4 u_fac_base_inv; +uniform vec2 u_fac_mr_inv; +uniform vec3 u_fac_emis; uniform sampler2D u_nrm; uniform sampler2D u_arm; uniform mat4 u_view; @@ -189,7 +193,7 @@ void main() { n = normalize(N + side * (fract(v_uv.x) * 2.0 - 1.0) * 0.7); arm = vec3(0.9, 0.7, 0.0); #else - vec4 d = texture(u_diff, v_uv); + vec4 d = texture(u_diff, v_uv) * (vec4(1.0) - u_fac_base_inv); #ifdef ALPHA_TEST // A needle sprig's alpha averages away in the mips, so a plain 0.5 test strips the // crown bare past 50 m. Scale the alpha back up by the mip level (Castano's alpha @@ -205,6 +209,7 @@ void main() { mat3 tbn = cotangentFrame(N, v_wpos, v_uv); n = normalize(tbn * tn); arm = texture(u_arm, v_uv).rgb; + arm.gb *= vec2(1.0) - u_fac_mr_inv; n = normalize(mix(n, N, smoothstep(30.0, 120.0, dist))); alb = d.rgb; // a crown's interior is occluded by its own cards @@ -312,6 +317,7 @@ void main() { #endif col += alb * u_emissive; if (any(isnan(col))) col = vec3(0.0); + col += u_fac_emis; col = applyFog(col, v_wpos, dist); #ifdef CARD o_color = vec4(sane(col), cardAlpha); diff --git a/packages/ludic.render3d/shaders/spv/01089da8.frag.spv b/packages/ludic.render3d/shaders/spv/01089da8.frag.spv index 2f46226c..f8254590 100644 Binary files a/packages/ludic.render3d/shaders/spv/01089da8.frag.spv and b/packages/ludic.render3d/shaders/spv/01089da8.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/1ce5c5d1.frag.spv b/packages/ludic.render3d/shaders/spv/1ce5c5d1.frag.spv index 10ba90b0..583a47af 100644 Binary files a/packages/ludic.render3d/shaders/spv/1ce5c5d1.frag.spv and b/packages/ludic.render3d/shaders/spv/1ce5c5d1.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/1fde9cd2.frag.spv b/packages/ludic.render3d/shaders/spv/1fde9cd2.frag.spv index 92803a1e..0365e5d2 100644 Binary files a/packages/ludic.render3d/shaders/spv/1fde9cd2.frag.spv and b/packages/ludic.render3d/shaders/spv/1fde9cd2.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/254e7887.frag.spv b/packages/ludic.render3d/shaders/spv/254e7887.frag.spv index 0d5765a3..06bb4601 100644 Binary files a/packages/ludic.render3d/shaders/spv/254e7887.frag.spv and b/packages/ludic.render3d/shaders/spv/254e7887.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/3b183d8f.frag.spv b/packages/ludic.render3d/shaders/spv/3b183d8f.frag.spv index 832410d2..09fd0a16 100644 Binary files a/packages/ludic.render3d/shaders/spv/3b183d8f.frag.spv and b/packages/ludic.render3d/shaders/spv/3b183d8f.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/439a2253.frag.spv b/packages/ludic.render3d/shaders/spv/439a2253.frag.spv index 617a4d1b..b4491f79 100644 Binary files a/packages/ludic.render3d/shaders/spv/439a2253.frag.spv and b/packages/ludic.render3d/shaders/spv/439a2253.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/4dda406a.frag.spv b/packages/ludic.render3d/shaders/spv/4dda406a.frag.spv index 483029ff..0fc7cdea 100644 Binary files a/packages/ludic.render3d/shaders/spv/4dda406a.frag.spv and b/packages/ludic.render3d/shaders/spv/4dda406a.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/5e70d731.frag.spv b/packages/ludic.render3d/shaders/spv/5e70d731.frag.spv index ef659e9e..84acccf2 100644 Binary files a/packages/ludic.render3d/shaders/spv/5e70d731.frag.spv and b/packages/ludic.render3d/shaders/spv/5e70d731.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/79b77ed9.frag.spv b/packages/ludic.render3d/shaders/spv/79b77ed9.frag.spv index 6ff5390b..f6b8632b 100644 Binary files a/packages/ludic.render3d/shaders/spv/79b77ed9.frag.spv and b/packages/ludic.render3d/shaders/spv/79b77ed9.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/86f427b0.frag.spv b/packages/ludic.render3d/shaders/spv/86f427b0.frag.spv index e39fddf3..dea56c8a 100644 Binary files a/packages/ludic.render3d/shaders/spv/86f427b0.frag.spv and b/packages/ludic.render3d/shaders/spv/86f427b0.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/9dce3246.frag.spv b/packages/ludic.render3d/shaders/spv/9dce3246.frag.spv index 617a4d1b..b4491f79 100644 Binary files a/packages/ludic.render3d/shaders/spv/9dce3246.frag.spv and b/packages/ludic.render3d/shaders/spv/9dce3246.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/a5ad521e.frag.spv b/packages/ludic.render3d/shaders/spv/a5ad521e.frag.spv index 53f986a2..16b6a951 100644 Binary files a/packages/ludic.render3d/shaders/spv/a5ad521e.frag.spv and b/packages/ludic.render3d/shaders/spv/a5ad521e.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b20fdcb5.frag.spv b/packages/ludic.render3d/shaders/spv/b20fdcb5.frag.spv index a5c26ce0..8f5ad99d 100644 Binary files a/packages/ludic.render3d/shaders/spv/b20fdcb5.frag.spv and b/packages/ludic.render3d/shaders/spv/b20fdcb5.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b4587cd4.frag.spv b/packages/ludic.render3d/shaders/spv/b4587cd4.frag.spv index e14c9356..f41145f7 100644 Binary files a/packages/ludic.render3d/shaders/spv/b4587cd4.frag.spv and b/packages/ludic.render3d/shaders/spv/b4587cd4.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b603a056.frag.spv b/packages/ludic.render3d/shaders/spv/b603a056.frag.spv index 483029ff..0fc7cdea 100644 Binary files a/packages/ludic.render3d/shaders/spv/b603a056.frag.spv and b/packages/ludic.render3d/shaders/spv/b603a056.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b8cff226.frag.spv b/packages/ludic.render3d/shaders/spv/b8cff226.frag.spv index 2d8343b9..4424e546 100644 Binary files a/packages/ludic.render3d/shaders/spv/b8cff226.frag.spv and b/packages/ludic.render3d/shaders/spv/b8cff226.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b9fc2041.frag.spv b/packages/ludic.render3d/shaders/spv/b9fc2041.frag.spv index 2f46226c..f8254590 100644 Binary files a/packages/ludic.render3d/shaders/spv/b9fc2041.frag.spv and b/packages/ludic.render3d/shaders/spv/b9fc2041.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/cb13f3c6.frag.spv b/packages/ludic.render3d/shaders/spv/cb13f3c6.frag.spv index 2d8343b9..4424e546 100644 Binary files a/packages/ludic.render3d/shaders/spv/cb13f3c6.frag.spv and b/packages/ludic.render3d/shaders/spv/cb13f3c6.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/d48d6a48.frag.spv b/packages/ludic.render3d/shaders/spv/d48d6a48.frag.spv index f680ae9c..9c842354 100644 Binary files a/packages/ludic.render3d/shaders/spv/d48d6a48.frag.spv and b/packages/ludic.render3d/shaders/spv/d48d6a48.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/f4a2b586.frag.spv b/packages/ludic.render3d/shaders/spv/f4a2b586.frag.spv index 1fd9940e..8b479bb2 100644 Binary files a/packages/ludic.render3d/shaders/spv/f4a2b586.frag.spv and b/packages/ludic.render3d/shaders/spv/f4a2b586.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/manifest.txt b/packages/ludic.render3d/shaders/spv/manifest.txt index beb7c065..4481d6c9 100644 --- a/packages/ludic.render3d/shaders/spv/manifest.txt +++ b/packages/ludic.render3d/shaders/spv/manifest.txt @@ -949,7 +949,7 @@ U d48d6a48 vert u_d0 4404 float 1 0 U d48d6a48 vert u_radius 4408 float 1 0 U d48d6a48 vert u_px 4412 float 1 0 U d48d6a48 vert u_dbg 4416 int 1 0 -B d48d6a48 frag 1 980 +B d48d6a48 frag 1 1028 U d48d6a48 frag u_cascade_vp 0 mat4 5 64 U d48d6a48 frag u_cascade_split 320 float 5 16 U d48d6a48 frag u_cascade_range 400 float 5 16 @@ -987,14 +987,17 @@ U d48d6a48 frag u_fog_inscatter 820 float 1 0 U d48d6a48 frag u_fog_desat 824 float 1 0 U d48d6a48 frag u_fog_wall 828 float 1 0 U d48d6a48 frag u_model_h 832 float 1 0 -U d48d6a48 frag u_view 848 mat4 1 0 -U d48d6a48 frag u_tint 912 vec3 1 0 -U d48d6a48 frag u_rough_scale 924 float 1 0 -U d48d6a48 frag u_emissive 928 float 1 0 -U d48d6a48 frag u_blade_base 944 vec3 1 0 -U d48d6a48 frag u_blade_tip 960 vec3 1 0 -U d48d6a48 frag u_blade_cols 972 float 1 0 -U d48d6a48 frag u_blade_tex_on 976 float 1 0 +U d48d6a48 frag u_fac_base_inv 848 vec4 1 0 +U d48d6a48 frag u_fac_mr_inv 864 vec2 1 0 +U d48d6a48 frag u_fac_emis 880 vec3 1 0 +U d48d6a48 frag u_view 896 mat4 1 0 +U d48d6a48 frag u_tint 960 vec3 1 0 +U d48d6a48 frag u_rough_scale 972 float 1 0 +U d48d6a48 frag u_emissive 976 float 1 0 +U d48d6a48 frag u_blade_base 992 vec3 1 0 +U d48d6a48 frag u_blade_tip 1008 vec3 1 0 +U d48d6a48 frag u_blade_cols 1020 float 1 0 +U d48d6a48 frag u_blade_tex_on 1024 float 1 0 T d48d6a48 u_arm 2 T d48d6a48 u_blade_tex 3 T d48d6a48 u_brdf 4 @@ -1039,7 +1042,7 @@ U cb13f3c6 vert u_px 348 float 1 0 U cb13f3c6 vert u_dbg 352 int 1 0 I cb13f3c6 a_pos 0 vec3 I cb13f3c6 a_uv 2 vec2 -B cb13f3c6 frag 1 980 +B cb13f3c6 frag 1 1028 U cb13f3c6 frag u_cascade_vp 0 mat4 5 64 U cb13f3c6 frag u_cascade_split 320 float 5 16 U cb13f3c6 frag u_cascade_range 400 float 5 16 @@ -1077,14 +1080,17 @@ U cb13f3c6 frag u_fog_inscatter 820 float 1 0 U cb13f3c6 frag u_fog_desat 824 float 1 0 U cb13f3c6 frag u_fog_wall 828 float 1 0 U cb13f3c6 frag u_model_h 832 float 1 0 -U cb13f3c6 frag u_view 848 mat4 1 0 -U cb13f3c6 frag u_tint 912 vec3 1 0 -U cb13f3c6 frag u_rough_scale 924 float 1 0 -U cb13f3c6 frag u_emissive 928 float 1 0 -U cb13f3c6 frag u_blade_base 944 vec3 1 0 -U cb13f3c6 frag u_blade_tip 960 vec3 1 0 -U cb13f3c6 frag u_blade_cols 972 float 1 0 -U cb13f3c6 frag u_blade_tex_on 976 float 1 0 +U cb13f3c6 frag u_fac_base_inv 848 vec4 1 0 +U cb13f3c6 frag u_fac_mr_inv 864 vec2 1 0 +U cb13f3c6 frag u_fac_emis 880 vec3 1 0 +U cb13f3c6 frag u_view 896 mat4 1 0 +U cb13f3c6 frag u_tint 960 vec3 1 0 +U cb13f3c6 frag u_rough_scale 972 float 1 0 +U cb13f3c6 frag u_emissive 976 float 1 0 +U cb13f3c6 frag u_blade_base 992 vec3 1 0 +U cb13f3c6 frag u_blade_tip 1008 vec3 1 0 +U cb13f3c6 frag u_blade_cols 1020 float 1 0 +U cb13f3c6 frag u_blade_tex_on 1024 float 1 0 T cb13f3c6 u_arm 2 T cb13f3c6 u_blade_tex 3 T cb13f3c6 u_brdf 4 @@ -1130,7 +1136,7 @@ U b8cff226 vert u_px 4444 float 1 0 U b8cff226 vert u_dbg 4448 int 1 0 I b8cff226 a_pos 0 vec3 I b8cff226 a_uv 2 vec2 -B b8cff226 frag 1 980 +B b8cff226 frag 1 1028 U b8cff226 frag u_cascade_vp 0 mat4 5 64 U b8cff226 frag u_cascade_split 320 float 5 16 U b8cff226 frag u_cascade_range 400 float 5 16 @@ -1168,14 +1174,17 @@ U b8cff226 frag u_fog_inscatter 820 float 1 0 U b8cff226 frag u_fog_desat 824 float 1 0 U b8cff226 frag u_fog_wall 828 float 1 0 U b8cff226 frag u_model_h 832 float 1 0 -U b8cff226 frag u_view 848 mat4 1 0 -U b8cff226 frag u_tint 912 vec3 1 0 -U b8cff226 frag u_rough_scale 924 float 1 0 -U b8cff226 frag u_emissive 928 float 1 0 -U b8cff226 frag u_blade_base 944 vec3 1 0 -U b8cff226 frag u_blade_tip 960 vec3 1 0 -U b8cff226 frag u_blade_cols 972 float 1 0 -U b8cff226 frag u_blade_tex_on 976 float 1 0 +U b8cff226 frag u_fac_base_inv 848 vec4 1 0 +U b8cff226 frag u_fac_mr_inv 864 vec2 1 0 +U b8cff226 frag u_fac_emis 880 vec3 1 0 +U b8cff226 frag u_view 896 mat4 1 0 +U b8cff226 frag u_tint 960 vec3 1 0 +U b8cff226 frag u_rough_scale 972 float 1 0 +U b8cff226 frag u_emissive 976 float 1 0 +U b8cff226 frag u_blade_base 992 vec3 1 0 +U b8cff226 frag u_blade_tip 1008 vec3 1 0 +U b8cff226 frag u_blade_cols 1020 float 1 0 +U b8cff226 frag u_blade_tex_on 1024 float 1 0 T b8cff226 u_arm 2 T b8cff226 u_blade_tex 3 T b8cff226 u_brdf 4 @@ -1341,7 +1350,7 @@ I 9dce3246 a_pos 0 vec3 I 9dce3246 i_pos 3 vec4 I 9dce3246 a_nrm 1 vec3 I 9dce3246 a_uv 2 vec2 -B 9dce3246 frag 0 832 +B 9dce3246 frag 1 848 U 9dce3246 frag u_cascade_vp 0 mat4 5 64 U 9dce3246 frag u_cascade_split 320 float 5 16 U 9dce3246 frag u_cascade_range 400 float 5 16 @@ -1378,6 +1387,7 @@ U 9dce3246 frag u_time 816 float 1 0 U 9dce3246 frag u_fog_inscatter 820 float 1 0 U 9dce3246 frag u_fog_desat 824 float 1 0 U 9dce3246 frag u_fog_wall 828 float 1 0 +U 9dce3246 frag u_fac_base_inv 832 vec4 1 0 T 9dce3246 u_arm 2 T 9dce3246 u_brdf 3 T 9dce3246 u_diff 4 @@ -1410,7 +1420,7 @@ I 439a2253 a_pos 0 vec3 I 439a2253 i_pos 3 vec4 I 439a2253 a_nrm 1 vec3 I 439a2253 a_uv 2 vec2 -B 439a2253 frag 0 832 +B 439a2253 frag 1 848 U 439a2253 frag u_cascade_vp 0 mat4 5 64 U 439a2253 frag u_cascade_split 320 float 5 16 U 439a2253 frag u_cascade_range 400 float 5 16 @@ -1447,6 +1457,7 @@ U 439a2253 frag u_time 816 float 1 0 U 439a2253 frag u_fog_inscatter 820 float 1 0 U 439a2253 frag u_fog_desat 824 float 1 0 U 439a2253 frag u_fog_wall 828 float 1 0 +U 439a2253 frag u_fac_base_inv 832 vec4 1 0 T 439a2253 u_arm 2 T 439a2253 u_brdf 3 T 439a2253 u_diff 4 @@ -1479,7 +1490,7 @@ I 86f427b0 a_pos 0 vec3 I 86f427b0 i_pos 3 vec4 I 86f427b0 a_nrm 1 vec3 I 86f427b0 a_uv 2 vec2 -B 86f427b0 frag 0 832 +B 86f427b0 frag 1 848 U 86f427b0 frag u_cascade_vp 0 mat4 5 64 U 86f427b0 frag u_cascade_split 320 float 5 16 U 86f427b0 frag u_cascade_range 400 float 5 16 @@ -1516,6 +1527,7 @@ U 86f427b0 frag u_time 816 float 1 0 U 86f427b0 frag u_fog_inscatter 820 float 1 0 U 86f427b0 frag u_fog_desat 824 float 1 0 U 86f427b0 frag u_fog_wall 828 float 1 0 +U 86f427b0 frag u_fac_base_inv 832 vec4 1 0 T 86f427b0 u_arm 2 T 86f427b0 u_brdf 3 T 86f427b0 u_diff 4 @@ -1684,7 +1696,7 @@ I 01089da8 a_pos 0 vec3 I 01089da8 i_pos 3 vec4 I 01089da8 a_nrm 1 vec3 I 01089da8 a_uv 2 vec2 -B 01089da8 frag 1 932 +B 01089da8 frag 1 980 U 01089da8 frag u_cascade_vp 0 mat4 5 64 U 01089da8 frag u_cascade_split 320 float 5 16 U 01089da8 frag u_cascade_range 400 float 5 16 @@ -1722,10 +1734,13 @@ U 01089da8 frag u_fog_inscatter 820 float 1 0 U 01089da8 frag u_fog_desat 824 float 1 0 U 01089da8 frag u_fog_wall 828 float 1 0 U 01089da8 frag u_model_h 832 float 1 0 -U 01089da8 frag u_view 848 mat4 1 0 -U 01089da8 frag u_tint 912 vec3 1 0 -U 01089da8 frag u_rough_scale 924 float 1 0 -U 01089da8 frag u_emissive 928 float 1 0 +U 01089da8 frag u_fac_base_inv 848 vec4 1 0 +U 01089da8 frag u_fac_mr_inv 864 vec2 1 0 +U 01089da8 frag u_fac_emis 880 vec3 1 0 +U 01089da8 frag u_view 896 mat4 1 0 +U 01089da8 frag u_tint 960 vec3 1 0 +U 01089da8 frag u_rough_scale 972 float 1 0 +U 01089da8 frag u_emissive 976 float 1 0 T 01089da8 u_arm 2 T 01089da8 u_blade_tex 3 T 01089da8 u_brdf 4 @@ -1760,7 +1775,7 @@ I 254e7887 a_pos 0 vec3 I 254e7887 i_pos 3 vec4 I 254e7887 a_nrm 1 vec3 I 254e7887 a_uv 2 vec2 -B 254e7887 frag 1 936 +B 254e7887 frag 1 984 U 254e7887 frag u_cascade_vp 0 mat4 5 64 U 254e7887 frag u_cascade_split 320 float 5 16 U 254e7887 frag u_cascade_range 400 float 5 16 @@ -1798,11 +1813,14 @@ U 254e7887 frag u_fog_inscatter 820 float 1 0 U 254e7887 frag u_fog_desat 824 float 1 0 U 254e7887 frag u_fog_wall 828 float 1 0 U 254e7887 frag u_model_h 832 float 1 0 -U 254e7887 frag u_view 848 mat4 1 0 -U 254e7887 frag u_tint 912 vec3 1 0 -U 254e7887 frag u_rough_scale 924 float 1 0 -U 254e7887 frag u_emissive 928 float 1 0 -U 254e7887 frag u_cull 932 float 1 0 +U 254e7887 frag u_fac_base_inv 848 vec4 1 0 +U 254e7887 frag u_fac_mr_inv 864 vec2 1 0 +U 254e7887 frag u_fac_emis 880 vec3 1 0 +U 254e7887 frag u_view 896 mat4 1 0 +U 254e7887 frag u_tint 960 vec3 1 0 +U 254e7887 frag u_rough_scale 972 float 1 0 +U 254e7887 frag u_emissive 976 float 1 0 +U 254e7887 frag u_cull 980 float 1 0 T 254e7887 u_arm 2 T 254e7887 u_blade_tex 3 T 254e7887 u_brdf 4 @@ -1837,7 +1855,7 @@ I 1ce5c5d1 a_pos 0 vec3 I 1ce5c5d1 i_pos 3 vec4 I 1ce5c5d1 a_nrm 1 vec3 I 1ce5c5d1 a_uv 2 vec2 -B 1ce5c5d1 frag 1 932 +B 1ce5c5d1 frag 1 980 U 1ce5c5d1 frag u_cascade_vp 0 mat4 5 64 U 1ce5c5d1 frag u_cascade_split 320 float 5 16 U 1ce5c5d1 frag u_cascade_range 400 float 5 16 @@ -1875,10 +1893,13 @@ U 1ce5c5d1 frag u_fog_inscatter 820 float 1 0 U 1ce5c5d1 frag u_fog_desat 824 float 1 0 U 1ce5c5d1 frag u_fog_wall 828 float 1 0 U 1ce5c5d1 frag u_model_h 832 float 1 0 -U 1ce5c5d1 frag u_view 848 mat4 1 0 -U 1ce5c5d1 frag u_tint 912 vec3 1 0 -U 1ce5c5d1 frag u_rough_scale 924 float 1 0 -U 1ce5c5d1 frag u_emissive 928 float 1 0 +U 1ce5c5d1 frag u_fac_base_inv 848 vec4 1 0 +U 1ce5c5d1 frag u_fac_mr_inv 864 vec2 1 0 +U 1ce5c5d1 frag u_fac_emis 880 vec3 1 0 +U 1ce5c5d1 frag u_view 896 mat4 1 0 +U 1ce5c5d1 frag u_tint 960 vec3 1 0 +U 1ce5c5d1 frag u_rough_scale 972 float 1 0 +U 1ce5c5d1 frag u_emissive 976 float 1 0 T 1ce5c5d1 u_arm 2 T 1ce5c5d1 u_blade_tex 3 T 1ce5c5d1 u_brdf 4 @@ -1913,7 +1934,7 @@ I 5e70d731 a_pos 0 vec3 I 5e70d731 i_pos 3 vec4 I 5e70d731 a_nrm 1 vec3 I 5e70d731 a_uv 2 vec2 -B 5e70d731 frag 1 932 +B 5e70d731 frag 1 980 U 5e70d731 frag u_cascade_vp 0 mat4 5 64 U 5e70d731 frag u_cascade_split 320 float 5 16 U 5e70d731 frag u_cascade_range 400 float 5 16 @@ -1951,10 +1972,13 @@ U 5e70d731 frag u_fog_inscatter 820 float 1 0 U 5e70d731 frag u_fog_desat 824 float 1 0 U 5e70d731 frag u_fog_wall 828 float 1 0 U 5e70d731 frag u_model_h 832 float 1 0 -U 5e70d731 frag u_view 848 mat4 1 0 -U 5e70d731 frag u_tint 912 vec3 1 0 -U 5e70d731 frag u_rough_scale 924 float 1 0 -U 5e70d731 frag u_emissive 928 float 1 0 +U 5e70d731 frag u_fac_base_inv 848 vec4 1 0 +U 5e70d731 frag u_fac_mr_inv 864 vec2 1 0 +U 5e70d731 frag u_fac_emis 880 vec3 1 0 +U 5e70d731 frag u_view 896 mat4 1 0 +U 5e70d731 frag u_tint 960 vec3 1 0 +U 5e70d731 frag u_rough_scale 972 float 1 0 +U 5e70d731 frag u_emissive 976 float 1 0 T 5e70d731 u_arm 2 T 5e70d731 u_blade_tex 3 T 5e70d731 u_brdf 4 @@ -1991,7 +2015,7 @@ I f4a2b586 a_pos 0 vec3 I f4a2b586 i_pos 3 vec4 I f4a2b586 a_nrm 1 vec3 I f4a2b586 a_uv 2 vec2 -B f4a2b586 frag 1 980 +B f4a2b586 frag 1 1028 U f4a2b586 frag u_cascade_vp 0 mat4 5 64 U f4a2b586 frag u_cascade_split 320 float 5 16 U f4a2b586 frag u_cascade_range 400 float 5 16 @@ -2029,14 +2053,17 @@ U f4a2b586 frag u_fog_inscatter 820 float 1 0 U f4a2b586 frag u_fog_desat 824 float 1 0 U f4a2b586 frag u_fog_wall 828 float 1 0 U f4a2b586 frag u_model_h 832 float 1 0 -U f4a2b586 frag u_view 848 mat4 1 0 -U f4a2b586 frag u_tint 912 vec3 1 0 -U f4a2b586 frag u_rough_scale 924 float 1 0 -U f4a2b586 frag u_emissive 928 float 1 0 -U f4a2b586 frag u_blade_base 944 vec3 1 0 -U f4a2b586 frag u_blade_tip 960 vec3 1 0 -U f4a2b586 frag u_blade_cols 972 float 1 0 -U f4a2b586 frag u_blade_tex_on 976 float 1 0 +U f4a2b586 frag u_fac_base_inv 848 vec4 1 0 +U f4a2b586 frag u_fac_mr_inv 864 vec2 1 0 +U f4a2b586 frag u_fac_emis 880 vec3 1 0 +U f4a2b586 frag u_view 896 mat4 1 0 +U f4a2b586 frag u_tint 960 vec3 1 0 +U f4a2b586 frag u_rough_scale 972 float 1 0 +U f4a2b586 frag u_emissive 976 float 1 0 +U f4a2b586 frag u_blade_base 992 vec3 1 0 +U f4a2b586 frag u_blade_tip 1008 vec3 1 0 +U f4a2b586 frag u_blade_cols 1020 float 1 0 +U f4a2b586 frag u_blade_tex_on 1024 float 1 0 T f4a2b586 u_arm 2 T f4a2b586 u_blade_tex 3 T f4a2b586 u_brdf 4 @@ -2071,7 +2098,7 @@ I b4587cd4 a_pos 0 vec3 I b4587cd4 i_pos 3 vec4 I b4587cd4 a_nrm 1 vec3 I b4587cd4 a_uv 2 vec2 -B b4587cd4 frag 1 936 +B b4587cd4 frag 1 984 U b4587cd4 frag u_cascade_vp 0 mat4 5 64 U b4587cd4 frag u_cascade_split 320 float 5 16 U b4587cd4 frag u_cascade_range 400 float 5 16 @@ -2109,11 +2136,14 @@ U b4587cd4 frag u_fog_inscatter 820 float 1 0 U b4587cd4 frag u_fog_desat 824 float 1 0 U b4587cd4 frag u_fog_wall 828 float 1 0 U b4587cd4 frag u_model_h 832 float 1 0 -U b4587cd4 frag u_view 848 mat4 1 0 -U b4587cd4 frag u_tint 912 vec3 1 0 -U b4587cd4 frag u_rough_scale 924 float 1 0 -U b4587cd4 frag u_emissive 928 float 1 0 -U b4587cd4 frag u_cull 932 float 1 0 +U b4587cd4 frag u_fac_base_inv 848 vec4 1 0 +U b4587cd4 frag u_fac_mr_inv 864 vec2 1 0 +U b4587cd4 frag u_fac_emis 880 vec3 1 0 +U b4587cd4 frag u_view 896 mat4 1 0 +U b4587cd4 frag u_tint 960 vec3 1 0 +U b4587cd4 frag u_rough_scale 972 float 1 0 +U b4587cd4 frag u_emissive 976 float 1 0 +U b4587cd4 frag u_cull 980 float 1 0 T b4587cd4 u_arm 2 T b4587cd4 u_blade_tex 3 T b4587cd4 u_brdf 4 @@ -2148,7 +2178,7 @@ I 4dda406a a_pos 0 vec3 I 4dda406a i_pos 3 vec4 I 4dda406a a_nrm 1 vec3 I 4dda406a a_uv 2 vec2 -B 4dda406a frag 1 932 +B 4dda406a frag 1 980 U 4dda406a frag u_cascade_vp 0 mat4 5 64 U 4dda406a frag u_cascade_split 320 float 5 16 U 4dda406a frag u_cascade_range 400 float 5 16 @@ -2186,10 +2216,13 @@ U 4dda406a frag u_fog_inscatter 820 float 1 0 U 4dda406a frag u_fog_desat 824 float 1 0 U 4dda406a frag u_fog_wall 828 float 1 0 U 4dda406a frag u_model_h 832 float 1 0 -U 4dda406a frag u_view 848 mat4 1 0 -U 4dda406a frag u_tint 912 vec3 1 0 -U 4dda406a frag u_rough_scale 924 float 1 0 -U 4dda406a frag u_emissive 928 float 1 0 +U 4dda406a frag u_fac_base_inv 848 vec4 1 0 +U 4dda406a frag u_fac_mr_inv 864 vec2 1 0 +U 4dda406a frag u_fac_emis 880 vec3 1 0 +U 4dda406a frag u_view 896 mat4 1 0 +U 4dda406a frag u_tint 960 vec3 1 0 +U 4dda406a frag u_rough_scale 972 float 1 0 +U 4dda406a frag u_emissive 976 float 1 0 T 4dda406a u_arm 2 T 4dda406a u_blade_tex 3 T 4dda406a u_brdf 4 @@ -2224,7 +2257,7 @@ I b603a056 a_pos 0 vec3 I b603a056 i_pos 3 vec4 I b603a056 a_nrm 1 vec3 I b603a056 a_uv 2 vec2 -B b603a056 frag 1 932 +B b603a056 frag 1 980 U b603a056 frag u_cascade_vp 0 mat4 5 64 U b603a056 frag u_cascade_split 320 float 5 16 U b603a056 frag u_cascade_range 400 float 5 16 @@ -2262,10 +2295,13 @@ U b603a056 frag u_fog_inscatter 820 float 1 0 U b603a056 frag u_fog_desat 824 float 1 0 U b603a056 frag u_fog_wall 828 float 1 0 U b603a056 frag u_model_h 832 float 1 0 -U b603a056 frag u_view 848 mat4 1 0 -U b603a056 frag u_tint 912 vec3 1 0 -U b603a056 frag u_rough_scale 924 float 1 0 -U b603a056 frag u_emissive 928 float 1 0 +U b603a056 frag u_fac_base_inv 848 vec4 1 0 +U b603a056 frag u_fac_mr_inv 864 vec2 1 0 +U b603a056 frag u_fac_emis 880 vec3 1 0 +U b603a056 frag u_view 896 mat4 1 0 +U b603a056 frag u_tint 960 vec3 1 0 +U b603a056 frag u_rough_scale 972 float 1 0 +U b603a056 frag u_emissive 976 float 1 0 T b603a056 u_arm 2 T b603a056 u_blade_tex 3 T b603a056 u_brdf 4 @@ -2300,7 +2336,7 @@ I 3b183d8f a_pos 0 vec3 I 3b183d8f i_pos 3 vec4 I 3b183d8f a_nrm 1 vec3 I 3b183d8f a_uv 2 vec2 -B 3b183d8f frag 1 932 +B 3b183d8f frag 1 980 U 3b183d8f frag u_cascade_vp 0 mat4 5 64 U 3b183d8f frag u_cascade_split 320 float 5 16 U 3b183d8f frag u_cascade_range 400 float 5 16 @@ -2338,10 +2374,13 @@ U 3b183d8f frag u_fog_inscatter 820 float 1 0 U 3b183d8f frag u_fog_desat 824 float 1 0 U 3b183d8f frag u_fog_wall 828 float 1 0 U 3b183d8f frag u_model_h 832 float 1 0 -U 3b183d8f frag u_view 848 mat4 1 0 -U 3b183d8f frag u_tint 912 vec3 1 0 -U 3b183d8f frag u_rough_scale 924 float 1 0 -U 3b183d8f frag u_emissive 928 float 1 0 +U 3b183d8f frag u_fac_base_inv 848 vec4 1 0 +U 3b183d8f frag u_fac_mr_inv 864 vec2 1 0 +U 3b183d8f frag u_fac_emis 880 vec3 1 0 +U 3b183d8f frag u_view 896 mat4 1 0 +U 3b183d8f frag u_tint 960 vec3 1 0 +U 3b183d8f frag u_rough_scale 972 float 1 0 +U 3b183d8f frag u_emissive 976 float 1 0 T 3b183d8f u_arm 2 T 3b183d8f u_blade_tex 3 T 3b183d8f u_brdf 4 @@ -2376,7 +2415,7 @@ I 79b77ed9 a_pos 0 vec3 I 79b77ed9 i_pos 3 vec4 I 79b77ed9 a_nrm 1 vec3 I 79b77ed9 a_uv 2 vec2 -B 79b77ed9 frag 1 936 +B 79b77ed9 frag 1 984 U 79b77ed9 frag u_cascade_vp 0 mat4 5 64 U 79b77ed9 frag u_cascade_split 320 float 5 16 U 79b77ed9 frag u_cascade_range 400 float 5 16 @@ -2414,11 +2453,14 @@ U 79b77ed9 frag u_fog_inscatter 820 float 1 0 U 79b77ed9 frag u_fog_desat 824 float 1 0 U 79b77ed9 frag u_fog_wall 828 float 1 0 U 79b77ed9 frag u_model_h 832 float 1 0 -U 79b77ed9 frag u_view 848 mat4 1 0 -U 79b77ed9 frag u_tint 912 vec3 1 0 -U 79b77ed9 frag u_rough_scale 924 float 1 0 -U 79b77ed9 frag u_emissive 928 float 1 0 -U 79b77ed9 frag u_cull 932 float 1 0 +U 79b77ed9 frag u_fac_base_inv 848 vec4 1 0 +U 79b77ed9 frag u_fac_mr_inv 864 vec2 1 0 +U 79b77ed9 frag u_fac_emis 880 vec3 1 0 +U 79b77ed9 frag u_view 896 mat4 1 0 +U 79b77ed9 frag u_tint 960 vec3 1 0 +U 79b77ed9 frag u_rough_scale 972 float 1 0 +U 79b77ed9 frag u_emissive 976 float 1 0 +U 79b77ed9 frag u_cull 980 float 1 0 T 79b77ed9 u_arm 2 T 79b77ed9 u_blade_tex 3 T 79b77ed9 u_brdf 4 @@ -2453,7 +2495,7 @@ I b9fc2041 a_pos 0 vec3 I b9fc2041 i_pos 3 vec4 I b9fc2041 a_nrm 1 vec3 I b9fc2041 a_uv 2 vec2 -B b9fc2041 frag 1 932 +B b9fc2041 frag 1 980 U b9fc2041 frag u_cascade_vp 0 mat4 5 64 U b9fc2041 frag u_cascade_split 320 float 5 16 U b9fc2041 frag u_cascade_range 400 float 5 16 @@ -2491,10 +2533,13 @@ U b9fc2041 frag u_fog_inscatter 820 float 1 0 U b9fc2041 frag u_fog_desat 824 float 1 0 U b9fc2041 frag u_fog_wall 828 float 1 0 U b9fc2041 frag u_model_h 832 float 1 0 -U b9fc2041 frag u_view 848 mat4 1 0 -U b9fc2041 frag u_tint 912 vec3 1 0 -U b9fc2041 frag u_rough_scale 924 float 1 0 -U b9fc2041 frag u_emissive 928 float 1 0 +U b9fc2041 frag u_fac_base_inv 848 vec4 1 0 +U b9fc2041 frag u_fac_mr_inv 864 vec2 1 0 +U b9fc2041 frag u_fac_emis 880 vec3 1 0 +U b9fc2041 frag u_view 896 mat4 1 0 +U b9fc2041 frag u_tint 960 vec3 1 0 +U b9fc2041 frag u_rough_scale 972 float 1 0 +U b9fc2041 frag u_emissive 976 float 1 0 T b9fc2041 u_arm 2 T b9fc2041 u_blade_tex 3 T b9fc2041 u_brdf 4 @@ -2831,7 +2876,7 @@ I 1fde9cd2 a_joints 5 vec4 I 1fde9cd2 a_pos 0 vec3 I 1fde9cd2 a_nrm 1 vec3 I 1fde9cd2 a_uv 2 vec2 -B 1fde9cd2 frag 1 932 +B 1fde9cd2 frag 1 980 U 1fde9cd2 frag u_cascade_vp 0 mat4 5 64 U 1fde9cd2 frag u_cascade_split 320 float 5 16 U 1fde9cd2 frag u_cascade_range 400 float 5 16 @@ -2869,10 +2914,13 @@ U 1fde9cd2 frag u_fog_inscatter 820 float 1 0 U 1fde9cd2 frag u_fog_desat 824 float 1 0 U 1fde9cd2 frag u_fog_wall 828 float 1 0 U 1fde9cd2 frag u_model_h 832 float 1 0 -U 1fde9cd2 frag u_view 848 mat4 1 0 -U 1fde9cd2 frag u_tint 912 vec3 1 0 -U 1fde9cd2 frag u_rough_scale 924 float 1 0 -U 1fde9cd2 frag u_emissive 928 float 1 0 +U 1fde9cd2 frag u_fac_base_inv 848 vec4 1 0 +U 1fde9cd2 frag u_fac_mr_inv 864 vec2 1 0 +U 1fde9cd2 frag u_fac_emis 880 vec3 1 0 +U 1fde9cd2 frag u_view 896 mat4 1 0 +U 1fde9cd2 frag u_tint 960 vec3 1 0 +U 1fde9cd2 frag u_rough_scale 972 float 1 0 +U 1fde9cd2 frag u_emissive 976 float 1 0 T 1fde9cd2 u_arm 2 T 1fde9cd2 u_blade_tex 3 T 1fde9cd2 u_brdf 4 @@ -2897,7 +2945,7 @@ I a5ad521e a_joints 5 vec4 I a5ad521e a_pos 0 vec3 I a5ad521e a_nrm 1 vec3 I a5ad521e a_uv 2 vec2 -B a5ad521e frag 1 932 +B a5ad521e frag 1 980 U a5ad521e frag u_cascade_vp 0 mat4 5 64 U a5ad521e frag u_cascade_split 320 float 5 16 U a5ad521e frag u_cascade_range 400 float 5 16 @@ -2935,10 +2983,13 @@ U a5ad521e frag u_fog_inscatter 820 float 1 0 U a5ad521e frag u_fog_desat 824 float 1 0 U a5ad521e frag u_fog_wall 828 float 1 0 U a5ad521e frag u_model_h 832 float 1 0 -U a5ad521e frag u_view 848 mat4 1 0 -U a5ad521e frag u_tint 912 vec3 1 0 -U a5ad521e frag u_rough_scale 924 float 1 0 -U a5ad521e frag u_emissive 928 float 1 0 +U a5ad521e frag u_fac_base_inv 848 vec4 1 0 +U a5ad521e frag u_fac_mr_inv 864 vec2 1 0 +U a5ad521e frag u_fac_emis 880 vec3 1 0 +U a5ad521e frag u_view 896 mat4 1 0 +U a5ad521e frag u_tint 960 vec3 1 0 +U a5ad521e frag u_rough_scale 972 float 1 0 +U a5ad521e frag u_emissive 976 float 1 0 T a5ad521e u_arm 2 T a5ad521e u_blade_tex 3 T a5ad521e u_brdf 4 @@ -3858,7 +3909,7 @@ I b20fdcb5 i_ground 6 vec4 I b20fdcb5 a_pos 0 vec3 I b20fdcb5 i_tint 5 vec4 I b20fdcb5 a_uv 2 vec2 -B b20fdcb5 frag 1 980 +B b20fdcb5 frag 1 1028 U b20fdcb5 frag u_cascade_vp 0 mat4 5 64 U b20fdcb5 frag u_cascade_split 320 float 5 16 U b20fdcb5 frag u_cascade_range 400 float 5 16 @@ -3896,14 +3947,17 @@ U b20fdcb5 frag u_fog_inscatter 820 float 1 0 U b20fdcb5 frag u_fog_desat 824 float 1 0 U b20fdcb5 frag u_fog_wall 828 float 1 0 U b20fdcb5 frag u_model_h 832 float 1 0 -U b20fdcb5 frag u_view 848 mat4 1 0 -U b20fdcb5 frag u_tint 912 vec3 1 0 -U b20fdcb5 frag u_rough_scale 924 float 1 0 -U b20fdcb5 frag u_emissive 928 float 1 0 -U b20fdcb5 frag u_blade_base 944 vec3 1 0 -U b20fdcb5 frag u_blade_tip 960 vec3 1 0 -U b20fdcb5 frag u_blade_cols 972 float 1 0 -U b20fdcb5 frag u_blade_tex_on 976 float 1 0 +U b20fdcb5 frag u_fac_base_inv 848 vec4 1 0 +U b20fdcb5 frag u_fac_mr_inv 864 vec2 1 0 +U b20fdcb5 frag u_fac_emis 880 vec3 1 0 +U b20fdcb5 frag u_view 896 mat4 1 0 +U b20fdcb5 frag u_tint 960 vec3 1 0 +U b20fdcb5 frag u_rough_scale 972 float 1 0 +U b20fdcb5 frag u_emissive 976 float 1 0 +U b20fdcb5 frag u_blade_base 992 vec3 1 0 +U b20fdcb5 frag u_blade_tip 1008 vec3 1 0 +U b20fdcb5 frag u_blade_cols 1020 float 1 0 +U b20fdcb5 frag u_blade_tex_on 1024 float 1 0 T b20fdcb5 u_arm 2 T b20fdcb5 u_blade_tex 3 T b20fdcb5 u_brdf 4