From d4c86e7ac56430c2a9af0f6b51989b911b0bf82c Mon Sep 17 00:00:00 2001 From: matthew Date: Tue, 5 Aug 2025 12:59:20 +1000 Subject: [PATCH] added some basic loading model controls --- assets/shaders/convert.comp.spv | Bin 4280 -> 4040 bytes assets/shaders/oit.frag.spv | Bin 9180 -> 8084 bytes assets/shaders/pbr.frag.spv | Bin 9380 -> 7180 bytes src/gears/game.d | 166 ++++++++++++++++++--- src/gears/main.d | 2 + src/gears/renderer.d | 165 +++++++++++++++++---- src/gears/vulkan.d | 248 ++++++++++++-------------------- src/shaders/convert.comp.glsl | 4 - src/shaders/oit.frag.glsl | 4 +- src/shaders/pbr.frag.glsl | 9 +- src/shaders/structures.layout | 2 +- 11 files changed, 382 insertions(+), 218 deletions(-) diff --git a/assets/shaders/convert.comp.spv b/assets/shaders/convert.comp.spv index eef316d969182453a571476d54196d6c0d6b03a2..c8447df7aea2d913905f7477e3be7a47e210c9d9 100644 GIT binary patch literal 4040 zcmZ9O33F6c5Jq1%R@r1nzyVwfjEH~;vKitKjUfmsuEUTFVRV=Y$*@FGqoUx3xbORh zi26tTJC;k8Rh~2RntGK>b@kU@_r2Y>Z_f*Dt*a&{lUkDL$&BRpq`BrKtw{?|eQ-{K zZ&Jg~_wMWM9IX#_uHUfM$eBr7V}r4?lBr1tx*a)MELU|*M;0O5kbYz~=ji9iB$tYN z+xXXt{sW^unUdst3*86y7eQW~h2Pc-5h=cIAv>OkfAU^bwGld`pTP{R~zIE8e8tbM3b$X9BIij|(~ ziP}K1UanPpb~XHM+$BlI8n`1_fbObQN9)CEeH8310VQzsp=5$!hqn z-8=jGx_kElVcL^h(dFu3saa23awqmct=HF~Zs zw)cah^~SkRg0try!9JYE)zHNhpF}tFwI^r6**zChU!FScld=@algoSimb=LoJy?b9 z3eG;r*?-UQ{&FtuE$B&zoM(EsI5X}UXBzK(t+*23v{z!g^m~8(uCT*DmyqnUDlBY$ys~&d%#IDzI`#b?gQy>k;*LJT+SSOQr=kmtL^-_%<&M~p1LRc z_h@QIzaGPme(5vL_v5qF*k_(0usyP#IOk<>w(n=K;~af)&iOPh>|e2S$QrWvw!a~A ziZiv5-=g*UJ}z_o4by@4j@IG(sKcH;!S;I;e&5&cQP^s~D`5|T{jOwfzb#?A|76CN zKbx`j`;C#`NtOOqW+MKcoQ17vKWC-*m&e@+wa9YhFLJCvyZ*%|pF`yAy*SQY3AUcdeI3}` ztB{Df9xNZZZveYb{vXbZbJc&+IcvEQu@>Li_#9$gH=|wFWz0>8oOOx+OIjLO&iGEW z%Xq&9w;+!o#*3rIwP1S~_HE$oz1Cq*?CI@r@@J^h-^hBzee&Zew*l}=(|(jF>G^nrQ9&Kzr$TAcaFT;_oQ4mx}P0+^zM|`r|eB* z?@fKEE8Kl4*OK9SQ?3==&pY{zydQDD@%noZ@9A$$pY`{l_agnNZT$}*_WLw`ze)R2 zF8Z<`+y00DL9kpuHTxZV7;%rhd#vREV%`C4^BE)Oj5!Csxo_`WJb`vO7k={|M_xjV z5l0;baCR;ZVrS=~h&^#G4#COCTnvB@BJwd8gJ93r7jcKd@+HI``dyNXTFPL#n3bo% z+Yo0(pK;F0(}=#9l}gIRtQ^Ibi&?3H<(w7s9zn}R-eItLqxNH9xj9JGG6IfT^hYhD zV0}?b9V{2M90$uqEhoToQA-Uh=XuWcDa8819s?T_^Y{$dm=OKm=_Fd8`<%yTk^a;=9K@zL0V;kK@?xk#~>t_#$Fn=h1xQh@A82{5fmRob&i9+T}c+ zLBE2?86%E5&Vj8n?AO5772n_2!4v244LJFjvp2!+laDuj3+&nYBJORl{CUJ4o<++= z?svd)F$3>{V+QmY=RCfL=!+S6KjmTuKERfX8Tb$^=L|%ykHF@NdOrrsWoPgc?8vV_ z@_!1}7x_N}%SHar!E%xR3$R=^|CiX={9j?qm5{jq*Wk#nKk|PA)))D|1zG+}cFvvm?02{m+rQPDkpBTMP)8F0 literal 4280 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 HJ6q2K_Rp;g diff --git a/assets/shaders/pbr.frag.spv b/assets/shaders/pbr.frag.spv index 36729ed2ad622f2b2e1fc94520c58078888a82e0..e69ab73c355de2e18d0fbfc4dd2870b6550ae233 100644 GIT binary patch literal 7180 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 PL^3|$|IxRI&UgM_roZPQ literal 9380 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