From 85c18f29ecd3dadaeea55ffaa7636078f5690721 Mon Sep 17 00:00:00 2001 From: peterino2 Date: Tue, 23 Sep 2025 17:29:37 -0700 Subject: [PATCH] particle systems update --- engine/core/src/math.zig | 6 +- engine/rend/shaders/meshes.vert.hlsl | 9 ++- engine/rend/src/particles/particles.zig | 4 + engine/rend/src/sgpu/ParticleRenderer.zig | 10 ++- engine/rend/src/sgpu/renderer.zig | 43 ++++++++++ .../content/_shaders/dxil/meshes.vert.dxil | Bin 9256 -> 9236 bytes projects/content/_shaders/msl/meshes.vert.msl | 75 +++++++++--------- projects/content/_shaders/spv/meshes.vert.spv | Bin 6300 -> 6244 bytes projects/sampleGame/externGame/externGame.zig | 16 ++++ 9 files changed, 115 insertions(+), 48 deletions(-) diff --git a/engine/core/src/math.zig b/engine/core/src/math.zig index 9144439..0f74acb 100644 --- a/engine/core/src/math.zig +++ b/engine/core/src/math.zig @@ -10,9 +10,9 @@ const pod = lua.pod; // LUA END // vector versions. -pub const f32x4 = @Vector(4, f32); -pub const f32x8 = @Vector(8, f32); -pub const f32x16 = @Vector(16, f32); +pub const f32x4 = @Vector(4, f32); // __m128_int +pub const f32x8 = @Vector(8, f32); // __m256_int +pub const f32x16 = @Vector(16, f32); // __m512_int pub const f32x4_zero = std.mem.zeroes(@Vector(4, f32)); pub const f32x8_zero = std.mem.zeroes(@Vector(8, f32)); diff --git a/engine/rend/shaders/meshes.vert.hlsl b/engine/rend/shaders/meshes.vert.hlsl index 9a14135..43d77ed 100644 --- a/engine/rend/shaders/meshes.vert.hlsl +++ b/engine/rend/shaders/meshes.vert.hlsl @@ -85,20 +85,21 @@ Output main(Input input) if(billboard > 0) { float3 billboardPosition = mul(scene[input.Instance].Model, float4(0,0,0,1)).xyz; - float3 toCamera = normalize(billboardPosition - cameraPosition.xyz); + float3 toCamera = normalize(cameraPosition.xyz - billboardPosition); float3 up = float3(0,1,0); float3 right = normalize(cross(up, toCamera)); up = cross(toCamera, right); + //toCamera = float3(0, 0, -1); float d = length(cameraPosition.xyz - billboardPosition); - float perspectiveScale = d * 0.1f; // adjust multiplier as needed + float perspectiveScale = 1.0f; // adjust multiplier as needed float finalSize = scene[input.Instance].float0 * perspectiveScale; float3 wp = billboardPosition + - mul(mul(right, input.Position.x), finalSize) + - mul(mul(right, input.Position.y), finalSize); + mul(mul(right, -input.Position.x), finalSize) + + mul(mul(up, input.Position.y), finalSize); WorldPos = float4(wp, 1.0); diff --git a/engine/rend/src/particles/particles.zig b/engine/rend/src/particles/particles.zig index 36e0f4a..cf2bd2f 100644 --- a/engine/rend/src/particles/particles.zig +++ b/engine/rend/src/particles/particles.zig @@ -287,6 +287,10 @@ pub const ParticleEmitter = struct { } pub fn update(self: *@This(), dt: f64) void { + if (self.state == .paused) { + return; + } + if (self.state != .dead) { self.updateSpawn(dt); } diff --git a/engine/rend/src/sgpu/ParticleRenderer.zig b/engine/rend/src/sgpu/ParticleRenderer.zig index 051a5ea..1c3e48c 100644 --- a/engine/rend/src/sgpu/ParticleRenderer.zig +++ b/engine/rend/src/sgpu/ParticleRenderer.zig @@ -6,6 +6,8 @@ spans: std.ArrayListUnmanaged(core.Span) = .{}, renderInfo: std.ArrayListUnmanaged(SgpuParticleRenderInfo) = .{}, +lastParticleCount: u32 = 0, + pub var NeonObjectTable: core.EngineObjectVTable = core.EngineObjectVTable.from(@This(), "rend.ParticleRenderer"); const SgpuParticleRenderInfo = struct { @@ -58,10 +60,10 @@ pub fn uploadSsbos(self: *@This(), copyPass: *gpu.GPUCopyPass) !void { uploadMapped[i + offset] = .{ .Model = final, - .textureMode = 0x2, //0x2, // default 0x2 is fullbright + .textureMode = if (emitter.billboard) 0x2 else 0x0, //0x2, // default 0x2 is fullbright .animation = -1, .float0 = size, - .flags = 0, //0x4, + .flags = if (emitter.billboard) 0x4 else 0, //0x4 for billboard mode }; } @@ -70,6 +72,8 @@ pub fn uploadSsbos(self: *@This(), copyPass: *gpu.GPUCopyPass) !void { offset += emitter.finals.items.len; } + self.lastParticleCount = @intCast(offset); + if (self.renderInfo.items.len == 0) return; @@ -121,7 +125,7 @@ pub fn destroy(self: *@This()) void { self.allocator.destroy(self); } -const MaxParticleCount = 1_000_000; +const MaxParticleCount = 10_000_000; const assets = @import("assets"); const core = @import("core"); diff --git a/engine/rend/src/sgpu/renderer.zig b/engine/rend/src/sgpu/renderer.zig index 7a9080b..42f1ed3 100644 --- a/engine/rend/src/sgpu/renderer.zig +++ b/engine/rend/src/sgpu/renderer.zig @@ -44,6 +44,8 @@ pub const Renderer = struct { depthTexture: *gpu.GPUTexture = undefined, depthFormat: gpu.GPUTextureFormat = .textureformatD32Float, + transparentDepthTexture: *gpu.GPUTexture = undefined, + textureList: *TextureList = undefined, shadowMapProjection: core.Transform = core.zm.identity(), @@ -398,6 +400,7 @@ pub const Renderer = struct { gci.usage = .{ .textureusageDepthStencilTarget = true }; self.depthTexture = self.device.createGPUTexture(&gci); + self.transparentDepthTexture = self.device.createGPUTexture(&gci); } pub fn discoverFormats(self: *@This()) !void { @@ -696,6 +699,7 @@ pub const Renderer = struct { ptr.ViewTransform = @bitCast(camera.transform); ptr.ViewProjection = @bitCast(camera.final); ptr.NoTranslateView = @bitCast(camera.noTranslate); + ptr.cameraPosition = @bitCast(camera.finalPos.toZm()); } ptr.ShadowMapProjection = @bitCast(self.shadowMapProjection); // ptr.ViewProjection = @bitCast(self.shadowMapProjection); @@ -963,6 +967,45 @@ pub const Renderer = struct { self.state.pass = null; } + pub fn renderTransparents(self: *@This(), cmd: *gpu.GPUCommandBuffer) void { + const targetInfo: [4]gpu.GPUColorTargetInfo = .{ + std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ + .texture = self.state.targetTexture, + .load_op = .loadopLoad, + .store_op = .storeopStore, + }), + std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ + .texture = self.state.emissiveTarget, + .load_op = .loadopClear, + .store_op = .storeopStore, + }), + std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ + .texture = self.state.positionTarget, + .load_op = .loadopClear, + .store_op = .storeopStore, + }), + std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ + .texture = self.state.normalTarget, + .load_op = .loadopClear, + .store_op = .storeopStore, + }), + }; + + const depthTarget = std.mem.zeroInit(gpu.GPUDepthStencilTargetInfo, .{ + .texture = self.transparentDepthTexture, + .load_op = .loadopDontCare, + .store_op = .storeopDontCare, + .stencil_load_op = .loadopDontCare, + .stencil_store_op = .storeopDontCare, + .clear_depth = 1.0, + .clear_stencil = 0, + }); + + const renderpass = cmd.beginGPURenderPass(&targetInfo, 4, &depthTarget); + + renderpass.endGPURenderPass(); + } + pub fn drawPostProcess(self: *@This(), cmd: *gpu.GPUCommandBuffer) void { const postProcTargetInfo: gpu.GPUColorTargetInfo = std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ .texture = self.state.swapchainTargetTexture.?, diff --git a/projects/content/_shaders/dxil/meshes.vert.dxil b/projects/content/_shaders/dxil/meshes.vert.dxil index dd3a943528b915dd36fd385b481ee983d3620f48..562754af119da13f1c80d0ebceef2a7bd7bd9b76 100644 GIT binary patch delta 3505 zcmZu!4Omn48bA9w+hE}4B+mHQ#(;^jY8!$!u5$xJv_V4&@wur7@B@RmL@6ZGvkj)J zU@n0~`f#N3P)beVDqO9*0m3k@NqG&QkRZWGr=gZgkJbGjcFy!Z_wvB=aL)UCfA9N$ zKmVsSy*^#AEH@?f&yI-$Jsj%kSJAP5N;uy=OMxJ0-f=-{@Ust|4Yi%8F%S zuI`=7a#!daArOQ@6sV8^LHINH7vcg9D|nxh>KcvWK+uNvhT#27tbztXe0sVJ7xTei zM=iw7ia3&0aW;{rw^BB(QBLNRF;&xgJED zZjKtQ~t^ksaqEenj*dKaHHF*r5eQu(yC!@b1_SO zd}b6qoDw;#6?K@98YBi{nN7_B+ozek#LNPMzwgNrO58(txE&{W9%ndaWHv(qW%^l< z07FNLusS8~qDeq7j0fxx2Ye)EZXp@sz3#Z0lt_p6sm5$OEYCOM=MvTJ43%SxdD+H* zMZ_DK$K5dKE=+;46H!KqBayDx%0{dd+-<{2BXhl-d5BHXr$%~-cU?|q9(Nj7sLx_1 z6C}?(pa|%gyon1njJR!x7@Wy{Kd`wJHpSIQ=^Di;XEe+Lah`sYwxD&BRv&%G-7C zApB6#l3}WdehMcEflrVMSL#k93$ax8Hgs7OqR>EGdX+5pl8I+=QDIeIquG$g;X-t` zxPV=b>PW<~*in^xixeZJw}0hI#C_Gh@MY@e+~QtVgx^g zLV}|y(J&Llue9yCm7P^km~c=6?GE&PAkl7v+gqljST(Lya$m%&`1d z=U&dmAt60Ng*T|j=Cfr9+kAX({$sY1B5ofax9$yE4r2ENh@I=5+P@>!DA&xR(IBnd zxbe_a)OhMlZj`70Ev>qbpK8Depu4t{yIlf)5rrINg2q~OP2x1#_p+-E0n&3+Un<5< z*PfYvQ}aw3pE_pFyD0?`T}!{Mh_UaDG8=SbV+Gx?s6ae}BnK(}DTZRf4+T|mo-Mr)MT2oU%KOHkr3i454qWt%MkoD(vSd!$)Noe7 z9f7Ydbn3$Bc{UVR;BrpPwAQK@Qv>fns*?_X4Ybc05nE!3I`XQ^X!G86QPoD zrE?|McvcUbItb}`qmy17O$&8Ky z`wM==QVQSWNBj|^6Cd;;a{Y*`D1N$(*7^~vwR{hWz&x3;8RB*vl92Dj zyEOA?BO5UY5yPm}L;>Sh(`J^M82MrmzgMG9vYPy@)sV=h$scq>oG-}kI+8&R?9-^F zH6}wbLYt{UWcXHjExuF&=Rt5j7Y2(B#cf<@^Q=HA0#833Q`+|iZ3NS)c$wOlAp7LG z4;LoQ^%a1&CEoD$a60)wrrdSjN#*6doR9u-*h^Wd_kvm zWp^}KUNmry^s6W4GkJ#xwDhe?pBMTr<4O$GN<{qNnPELJFb0A4`t-F0A&El`L)8$H z!8H$6YZ1j_d^Q)YTXi;L$EJl*P#V7)U6{vB;{<~dGqz)Y&O7|q1sN>k5IqXXK&p9F z_^j!?7MtUxuLGk3U8rTH@nQFeiT1C2BW~mUeer_=I(}ZT)$QYNe;QN3ZM+Ek+kHdD z*?eoO3BvKXZCd&=7qcqi#PoN(t3HmOA~ANBiw zpn3m|7fIhYx2*qU4O_;dO(BW#WNZdEPe0exK*r|1fzZMnYM=*F-5Ys}T$tYoc5N*o zM`7`n-!^qMxXcMgo2AO&H*}C9xIb+{dokZgJ;)aPIt(6XpOj9X;I7N!I@hcw&wXIn zt}|FuiLhNBuGdvQOd*4Kxly-cItBg7DDpd5tlzC3Bsa3RconSfBcC|0Wba<$igIor zo&&;y%_gNKN%orPIvJOfNlzt+ek7mzlAgXRoZt@5ji7~84b1x?kCV-juAbhl&?_2s zdEtGUvyjS?iO@o5Q}a}~(6M@|8VE0}8D|0^x`81C!m3>%WhfBJRy$2TO&HfyVhjYA zelf2JytU_Qg?&~x-t{jT4ki5At;DB$lbC*pT_tbQaER@1IscWNa~X`k|K0wZR2%D* zFDLxJ?f>od!?j;d{|le(QkJ{0TU;aMR%KxM{@Ov8mk1SP?Y#X#*V?oE z?SuXf7_wbS-%JK5C%OD;BU#Z0ZjRMSZA0=WupyrFH3fKn8T0N>EFv+J?wc2&Rxh_2S4fC|<*&Li`ARX218G?VJI>{lRnY>$&dxx$ft_ z&N-H8%@n0+Qc~rY9=jQOpm_VQoNYz_{bbi74FG^Bn@$G?pap0^DGLCIHU2LE;XB^IpQohuUk&90Kw-~uK`V$JVgNt@Gc%S5<5A#D z697FL^!B4wwL9|Tfm&EyvF`DG>zrBDIB9o9cj- zdoFGIqsh-8;TSs+74)jMp;FJp7mIQ_P6>pwxqwmIe;qr^t}=i+q`(YFIPC9&^YWq$>h;AgUff;Y?9SX5&KQz7l`4rg<4o#&ev(NV+tA~*xtHfsNLOAnk-oW*@Xn-&U76#&FEWv`pS{A&B@?9D?KW3`G8 z0ZhAO54TdAO(90tUB#pxgw>09nR`&1OCho&u3?Y55j%X|G6Z&;b|c4F|7m$dv<7r> zVZNLh-?Cp6iJs6jGB-2tml8G2)(GTGJ&k?a=N`Zk+yw#!VYF~IhznO{OW)S($iolb zUt)wBBlrU)bZH|TLFq)5RS`3d)Fnx9%EcCR;zpg>8)B*h>Z^ zjS-Ne!A`@QoBtvfa1RoqxNJzfgxSS4A?*r&4_}2fdHQ!*m@M_byq!o%wjQOeUWe7X z**p;8nt}uVlNtgN=m?h1`8r8#aAIvp5wOb2Tnze_PX8xJC;Z zQ9lL)P$Gt+t_SEb^d(KGbNGldc_P3IywKDORfOR`Sc>4SVMNKVg+;Z(K4ho9eDHT; zB>fzm!!h{OZM<-#dF#&V?9)H$9g>i>>?I4-Kg>xB;+M;yoiUSv{tTI-?}#OmyfQRY(xVItYmMYA? z&*Ax@=x@9{=&hlsM2v+39eGCmAV5<<{N%r9eaEdnKM+U$%;$T9AA^YtxcE0Caa%a2 zdAtUQ>T~*%>TFLNVr--@5Kt19c``BAAsp2wgaW_BE$TB+_uZa)*zZyXk;w9xuW*vgR9Ki?7T!q| zWSyv5MHcjtYECaV-X)+$-`jXmsJr;G`?pkwj}cg^@Qgc*#2IW0QP8uFqzX?#=YwxF z-{AaB6vUIesDcy1MJCa&r)geN=)U>CA+=Y?V1ENBTarT!X(y&%=`XY>x(i53rPiCYzvj|E6M3bJBK{)cW+U>6RfC{mJLjD2;9(IT5?bpVa7D z40?JdQ_F337JJ$#E8`xo$uPR_35qxe(sTWTxhnn|{2+=jVbZ1sNsb^avxTf;l$A^O z@n5o(Ifv^Ab=-FNX4ZSw3m>kqL(|5hrkGObpgau-U4oOaUCeN8$w5vCfL%y}16jfaKMS@5dy}Ku5 zzc2ho?MB;1&iPb=*l}f)H@W2{p>)<;yX9zW+$#FW?sTg5FZg}=A5qO!#ovCcZ<|&L zD~7FkM=5ROrns+8d5tdnyrRcnqhOEOe%|Tzxl8j|&&SvsQ1_QcVdB?uBOfqVzdOZAM?u)_5Xlj_!8{-yS2j4DuEb6<>f4%hWGxJC=m6 ziEuL=XNJN#aLqWg0G2*Pe8FUuAFeCBScKc3DxgN2po3Ha4Z6W803Y=azYcxRRCL;fWdqHy?1Bz!_VDppzcoF+~^l! zY)ZeLR5`fX^0apXPF2jQWYjH^UHNqFFrRA1K5+ki8@jW7@ymd^zf1FepUrvO%k)`~ z{HS-beiQtVpoQR{mw7AyVn6TY{b6bCMPG{dFjy{;;TPYZa1!Z>$!YObtmA}8nn`>( zd|q8tUs+ZELUqxggmAq3Znkw?okqp3qb5HS@fK2#7FYbUzETq@SZ25`zIs6X5bR}m zx1tKHxT;-d_;y-6abN|(v-Oqv@A@tid`gtCBI6YtzjZ|z#S?TCEc0EN?zoJ5A#nmj z^ohwg@$F*U@(GHG{H_)G@iR{3t;mm`F+XEP{&6CI!twz!2noiP2|~o*Pm3>aTES3W NU%7i2|0?kO{U2_jsLKEV diff --git a/projects/content/_shaders/msl/meshes.vert.msl b/projects/content/_shaders/msl/meshes.vert.msl index 4cff0f8..1cf9fc6 100644 --- a/projects/content/_shaders/msl/meshes.vert.msl +++ b/projects/content/_shaders/msl/meshes.vert.msl @@ -60,61 +60,60 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniforms [[buffer(0)]], const device type_StructuredBuffer_Scene& scene [[buffer(1)]], const device type_StructuredBuffer_BoneTransform& animationBuffer [[buffer(2)]], uint gl_InstanceIndex [[instance_id]]) { main0_out out = {}; - float3 _112; + float3 _111; if (scene._m0[gl_InstanceIndex].animation != (-1)) { - float3 _84; - _84 = float3(0.0); - for (int _87 = 0; _87 < 4; ) + float3 _83; + _83 = float3(0.0); + for (int _86 = 0; _86 < 4; ) { - uint _93 = (8u * uint(_87)) & 31u; - _84 += ((animationBuffer._m0[uint(scene._m0[gl_InstanceIndex].animation) + ((in.in_var_TEXCOORD4 >> _93) & 255u)].final * float4(in.in_var_TEXCOORD0, 1.0)).xyz * (float((in.in_var_TEXCOORD5 >> _93) & 255u) * 0.0039215688593685626983642578125)); - _87++; + uint _92 = (8u * uint(_86)) & 31u; + _83 += ((animationBuffer._m0[uint(scene._m0[gl_InstanceIndex].animation) + ((in.in_var_TEXCOORD4 >> _92) & 255u)].final * float4(in.in_var_TEXCOORD0, 1.0)).xyz * (float((in.in_var_TEXCOORD5 >> _92) & 255u) * 0.0039215688593685626983642578125)); + _86++; continue; } - _112 = _84; + _111 = _83; } else { - _112 = in.in_var_TEXCOORD0; + _111 = in.in_var_TEXCOORD0; } - float4 _116 = float4(_112, 1.0); - float3 _210; - float3 _211; - float3 _212; - float4 _213; - float4 _214; + float4 _115 = float4(_111, 1.0); + float3 _207; + float3 _208; + float3 _209; + float4 _210; + float4 _211; if (int(scene._m0[gl_InstanceIndex].flags & 4u) > 0) { - float3 _128 = (scene._m0[gl_InstanceIndex].Model * float4(0.0, 0.0, 0.0, 1.0)).xyz; - float3 _133 = fast::normalize(_128 - Uniforms.cameraPosition.xyz); - float3 _135 = fast::normalize(cross(float3(0.0, 1.0, 0.0), _133)); - float _141 = scene._m0[gl_InstanceIndex].float0 * (length(Uniforms.cameraPosition.xyz - _128) * 0.100000001490116119384765625); - float4 _155 = float4((_128 + ((_135 * in.in_var_TEXCOORD0.x) * _141)) + ((_135 * in.in_var_TEXCOORD0.y) * _141), 1.0); - _210 = _155.xyz; - _211 = _133; - _212 = float3(0.0, 0.0, 1.0); - _213 = Uniforms.ViewProjection * _155; - _214 = _155; + float3 _127 = (scene._m0[gl_InstanceIndex].Model * float4(0.0, 0.0, 0.0, 1.0)).xyz; + float3 _132 = fast::normalize(Uniforms.cameraPosition.xyz - _127); + float3 _134 = fast::normalize(cross(float3(0.0, 1.0, 0.0), _132)); + float4 _152 = float4((_127 + ((_134 * (-in.in_var_TEXCOORD0.x)) * scene._m0[gl_InstanceIndex].float0)) + ((cross(_132, _134) * in.in_var_TEXCOORD0.y) * scene._m0[gl_InstanceIndex].float0), 1.0); + _207 = _152.xyz; + _208 = _132; + _209 = float3(0.0, 0.0, 1.0); + _210 = Uniforms.ViewProjection * _152; + _211 = _152; } else { - float4 _162 = scene._m0[gl_InstanceIndex].Model * _116; - float4x4 _197 = float4x4(float4(fast::normalize(float3(scene._m0[gl_InstanceIndex].Model[0][0], scene._m0[gl_InstanceIndex].Model[1][0], scene._m0[gl_InstanceIndex].Model[2][0])), 0.0), float4(fast::normalize(float3(scene._m0[gl_InstanceIndex].Model[0][1], scene._m0[gl_InstanceIndex].Model[1][1], scene._m0[gl_InstanceIndex].Model[2][1])), 0.0), float4(fast::normalize(float3(scene._m0[gl_InstanceIndex].Model[0][2], scene._m0[gl_InstanceIndex].Model[1][2], scene._m0[gl_InstanceIndex].Model[2][2])), 0.0), float4(0.0, 0.0, 0.0, 1.0)); - float4 _201 = float4(in.in_var_TEXCOORD1, 1.0); - _210 = _162.xyz; - _211 = fast::normalize(_201 * _197).xyz; - _212 = (_201 * (_197 * transpose(Uniforms.NoTranslateView))).xyz; - _213 = Uniforms.ViewProjection * (scene._m0[gl_InstanceIndex].Model * _116); - _214 = _162; + float4 _159 = scene._m0[gl_InstanceIndex].Model * _115; + float4x4 _194 = float4x4(float4(fast::normalize(float3(scene._m0[gl_InstanceIndex].Model[0][0], scene._m0[gl_InstanceIndex].Model[1][0], scene._m0[gl_InstanceIndex].Model[2][0])), 0.0), float4(fast::normalize(float3(scene._m0[gl_InstanceIndex].Model[0][1], scene._m0[gl_InstanceIndex].Model[1][1], scene._m0[gl_InstanceIndex].Model[2][1])), 0.0), float4(fast::normalize(float3(scene._m0[gl_InstanceIndex].Model[0][2], scene._m0[gl_InstanceIndex].Model[1][2], scene._m0[gl_InstanceIndex].Model[2][2])), 0.0), float4(0.0, 0.0, 0.0, 1.0)); + float4 _198 = float4(in.in_var_TEXCOORD1, 1.0); + _207 = _159.xyz; + _208 = fast::normalize(_198 * _194).xyz; + _209 = (_198 * (_194 * transpose(Uniforms.NoTranslateView))).xyz; + _210 = Uniforms.ViewProjection * (scene._m0[gl_InstanceIndex].Model * _115); + _211 = _159; } out.out_var_TEXCOORD0 = in.in_var_TEXCOORD3; - out.out_var_TEXCOORD1 = _210; - out.out_var_TEXCOORD2 = _211; - out.out_var_TEXCOORD3 = Uniforms.ShadowMapProjection * _214; + out.out_var_TEXCOORD1 = _207; + out.out_var_TEXCOORD2 = _208; + out.out_var_TEXCOORD3 = Uniforms.ShadowMapProjection * _211; out.out_var_TEXCOORD4 = gl_InstanceIndex; - out.out_var_TEXCOORD5 = _212; - out.gl_Position = _213; + out.out_var_TEXCOORD5 = _209; + out.gl_Position = _210; return out; } diff --git a/projects/content/_shaders/spv/meshes.vert.spv b/projects/content/_shaders/spv/meshes.vert.spv index ac4afe703f0d92d0e5da06ea5ed75785986409df..7c3da46472e516b717300e18684e0fa2f4b13880 100644 GIT binary patch literal 6244 zcmZvfiF=$?6^Fm1Nm^)W5h$RQI_V-Utr4UkTA@i78Z@OTDOh*LWCDZ9Or1<9AWA9) zToF-F+1$VlQE}g`xZu7oe~Ih!_~83~a}T)=-afzHbAD&J=bn4-H|>(%^-GJQrznb* z#b5c`@vNe^WR@2L<-B)nVr*!xJvFrLf^)U6ES5NxwpGO`rQFNkv(Qt+wk;3y&PuKRr{uW-jC0 z&-6^Q+NJ}p?XKs_O4OGZr=tJ=dUrM(wS%o{V{W?Hn#FgZI1S(bWjkxjJErT6s`cx; zn)&G(I~^$b)8WhYu58pz+^KbGA@8`VUOO`0YF<~H>}+m;Q_yBFE^n6g%v9So-B_h# zvmX+R)mqoGGR~e%Tw9%L9@$qtoF$G}`!iXct+lG-&AEE4*74jfvX(i!+$B zvSF5%cc$JLy1v>PI=JW1uKoM3*j?T=ZRYN>o!7~=l-Ot3&JUY+uPbg_*u0ZnwhO}M zJ#EgnpHYmpcz?TX7NgC3-EDhOvU%UTZ5C>r@1Waeq1t>O-8KvL4(4xeFS>8c8n%GF zbTrwhq~vvw$wVhJy!RAXt%HG`l;JXb^X-spSphP_DtQOZlBa6pKGgIvv&KT z9{H_RJ@UJ6^~mpgTL&D*s}Gi1NB5oNc6IHszIRT0u1EYRtN5L8tnW-k&be2=N29D8 ze%2X2<}_|N<9ZXfJLBA|exn&@9=S2#zRqN}*Wp82NTmSfmEc!2U z`98ug`u%L;U3WO;@q6Z2%+ptX;DB`@Iawo%i7S`^1tBHILa|KxUmZYyi zHgD+9MRtUK7P9f7`v#t3oKDp9kSoa+GAiHGzVfcinR_cIImo;YR5C

vb>c#%usZ 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