From 6e08f363ae3c19e70841653660d3b3a2f271f38c Mon Sep 17 00:00:00 2001 From: a dinosaur Date: Sat, 14 Jun 2025 21:39:25 +1000 Subject: [PATCH] Simplify lessons that use textured shaders w/o tinting --- Package.swift | 2 +- build.rs | 1 + data/shaders/lesson2.metallib | Bin 5374 -> 5374 bytes data/shaders/lesson3.metallib | Bin 5687 -> 5687 bytes data/shaders/lesson6.metallib | Bin 6298 -> 6042 bytes data/shaders/lesson7.metallib | Bin 7044 -> 7044 bytes data/shaders/lesson8.metallib | Bin 0 -> 6298 bytes data/shaders/lesson9.metallib | Bin 6730 -> 6730 bytes scripts/compile_shaders.py | 2 +- src/c/CMakeLists.txt | 2 +- src/c/lesson10.c | 7 ++--- src/c/lesson6.c | 8 ++---- src/c/lesson7.c | 7 ++--- src/c/lesson8.c | 2 +- src/rust/lesson10.rs | 8 +++--- src/rust/lesson6.rs | 9 +++--- src/rust/lesson7.rs | 6 ++-- src/rust/lesson8.rs | 2 +- src/shaders/lesson6.metal | 5 +--- src/shaders/lesson8.metal | 45 ++++++++++++++++++++++++++++++ src/swift/Lesson10/lesson10.swift | 7 ++--- src/swift/Lesson6/lesson6.swift | 8 ++---- src/swift/Lesson7/lesson7.swift | 7 ++--- src/swift/Lesson8/lesson8.swift | 2 +- 24 files changed, 78 insertions(+), 52 deletions(-) create mode 100644 data/shaders/lesson8.metallib create mode 100644 src/shaders/lesson8.metal diff --git a/Package.swift b/Package.swift index 535788d..37babd0 100644 --- a/Package.swift +++ b/Package.swift @@ -41,8 +41,8 @@ let package = Package( .process("../../../data/shaders/lesson7.metallib"), .process("../../../data/Crate.bmp") ]), .executableTarget(name: "Lesson8", dependencies: [ "NeHe" ], path: "src/swift/Lesson8", resources: [ - .process("../../../data/shaders/lesson6.metallib"), .process("../../../data/shaders/lesson7.metallib"), + .process("../../../data/shaders/lesson8.metallib"), .process("../../../data/Glass.bmp") ]), .executableTarget(name: "Lesson9", dependencies: [ "NeHe" ], path: "src/swift/Lesson9", resources: [ .process("../../../data/shaders/lesson9.metallib"), diff --git a/build.rs b/build.rs index b0f1af0..e704694 100644 --- a/build.rs +++ b/build.rs @@ -53,6 +53,7 @@ pub fn main() "lesson3.metallib", "lesson6.metallib", "lesson7.metallib", + "lesson8.metallib", "lesson9.metallib", ]); } diff --git a/data/shaders/lesson2.metallib b/data/shaders/lesson2.metallib index 0a3f31e539d4d46de8fe0677cd569cc495bf4952..ce093814736a321d8c13ea4b0d150a9a71d2b089 100644 GIT binary patch delta 134 zcmeyT`A>5~oxTc=(ex^d=IR9Z?x VN?J@#O2TGIHft^%Qkeo%SpcX|K+^yK delta 134 zcmeyT`A>5~ox+Ob{EbWW?YA!R+d9eTOV0HM)(tmag!UR~ER78eov@E%;=B-rMacp> z&t1NMjXJEuyCnV8(RbQ1`v2rs$ww?UQ{O7~@ZDx1#!oDwNkt9;w@$q{bmPpasI-)X Wl(d+fq@vA|Y}Q;jq%sAjvH$=Z0zXy& diff --git a/data/shaders/lesson3.metallib b/data/shaders/lesson3.metallib index 0733a7b6a658df2ad41758833ee6947fce3c9e36..cd0c8fcaec2757db70ad6054c08d093e06c3d9f4 100644 GIT binary patch delta 134 zcmdn4vt4IGox+V1*NO$axL5A+j!gTt%I1)=@P)M|LP3VJu1~GG!(6p<;=B-r8`bw) zU-Wq0>|>j%du<;B?`gFom(t#Do&MN2zb4o@XVYdOMrBsflmv%>Tc=(ex^d=IR9Z?x WN?J@#O2TF@w(ndxq{0LrvH$=O^gu8G delta 134 zcmdn4vt4IGox**u4RYpx7N69gymr>~Ue*A4#|PUEY6!Rq*L^7ep|q@L;=B+A!Fd}N ztzM)3dcpsTt)D^|xR*vr-(J}B`n2D(h_fc&EVgbIVpL`oO)7E-xOM8qp&MsTMWv-A Wq@=~v#AA(A849Qw3E-h001x}PD8qH`e z)G8ILuXGfhg2NwV%EaOi{55EmHCP=OGi%2fV-?Aw$y`i~$ujp)|1!Jea>?C&?>^t$ z=dOKWdpf76RJ{x`!2kwtrG54xPA(L8s6-;NH82j_pC@%BmyxS&y}n23xqFXs!s$OW zX4YSxte3VQI##+Q`L~bOKY7(Xuci92{Huy_TF%QI+S3v8meBaE@65Yz=6;f&U&;me zyW)&@79~@lTI@v>0Iw-oMhuLLSpZxmPeVFrg9m|6K%9t`TmT>{Kc-O$_K5%xkv}3L zL!J!y7&P220-rG|xdw1p6v(@a`U&S7fX=)DVu7dN^56Be&3n&|~rd zJps~^=jbVrfqY2MjWlkITfZ}I0~sHg+u%`0U(77LsBB);sO@^380$)YQmIKU&{$u# zPSG_51u2rEdri-3CH4i+?mkPsd*CeV;CPu^=dR$cWmLJ`c{sVAp=i+CAL|B8yto5co1SS|&T>h$0Ta(9)3@9% z8_}Cx8QeE2;I-7pL9obbH?~<-TZhzx4cboyt{94<|V14vvn3azq6x5 z?46_&_LFSak_`^=5F8mT$ne{2@xei1XpkNHJ>K6b40Z~}1_VK|;GRK9zK*SnDfWuv z!-MRnor17gI1DA6qSbi1nVoP0LQR<7aXl{s`=F=IOsjCHl+>nx2ugKUk2Utc0`x%8L-HlIXx9I-*Q4UpLJb^>c*``_0?o&o{Qu$H3|H<{X!!yi zFa4@iaW%VN%99HF@Wrw?NB{YmNhJvDjXUbU+-4-^4VjiQSZ!vk12+j)utd>wkOebz z+HR=bT4UU%nDT}ug2Q3!iU8CK(ddBzh68DELshD3oMy)T7C*?gh^?>^Yox!R*jMfi z-uF(GPYsPv3{Mr?!`^$L;j!s<@BOh7D>^bqxk)LJ6!j$8)6!~sj9Z?vd(JlXunzXD z?y1>ggDygSbd--q7m}Nq>k6ZfYaDrIJVZmC7%`IVenTAQ)%Z9ZR@a zFCq^Ta_aJ2N3tFua;JsghR7RzSplC@#O*x)E}HEivaTRGYNiz{%I(9Puno{+tOKnBJ(IgL6MJ8AlROLv+lys2c(9ZFi(+R$7)2YP?Tcy%*EHy LCrmTseqa6rTXI3E delta 1854 zcmZuy3s6(p89p~Rx%Y-mBnb$Y1=Gu8BNVWCNrD^K@G!85l~RgS=$ZgQXnBMXAwhR? zNgx+Bx?v+R(iu0%Ds;3~M7xFU&JaWd#4fr%z%o0qP_VnM)!p&IxYPE6Zg-}$|IC^H zoO}M~J>Pdu$Im(>g6(86NlO^;UIZnXsn_q=wsw|r z^l$$rNd&09U)+d^j%quRr%3~hRKJ>*Hm&r^riWDM z<%RLHT~4+rV}zMzdqd2~@j)y+hiJ*+ZB^GYX&VdO;1aE0hqHO@A4@KZ`~TE0|Kvg> z5~Bhp_ZI%T#A2g5=id1Jp{a@SU1g=((z2q;Vq>lYdrv$}GO;EkWV_y^t4woslgv!g zeSj}yG%vYz$WI`%y9tSd=G6_+A|QExNB9Rg_Z= z1l6dej0U()OBs|_%HkC;qk~^7=P9F$vSd;X1}YAc*aB8R z(w+vYu7~!gjL%v7Vo{5iGMUi^uKpHlSiDjqK$iML zWE5+RMfZCJgHT@zyOUvEK{Vp~Yr33&j7=P76#>Dr?X$de`EtwdTLZhFU#Wrt&=CN< zN!tZ6QxbTzUh$D%jbf(oMxty4rU94-x*~|RNeLOO)+6L7&E5I6hkp61H7vbrE-pBT zvFzNb%JswrA5C$@S+cQ(k`(BJ#{pk{qq0&q=_r}p&TiU&7Mqp5(^gv|Mg*)Y4)E4I zccuXeJ}PMjTnz^!3hde={(xIrPLtNohZ)!m;Vr=#3Or3YsU0SPO^Gey4mEd#cT|E) z2$Ec5OLj!Y+NT|2Gdb-bxwdJCmM6tpA-Z^!9)%8~$DSxi*6x)dbmgsDSHk)j_0ESO(< zjB(p=Mk-v+@iy@ZGz%WJ-PE=+bS|_7G9j+lIg(&-(6`YS>Ji-)jCewl?n)I;k)26Y zaZG6ao%}`3-C)n6N7_uzfZxK!bjgXj$_iawVqHm%L7!++>dmITMtxlx2U|lZ$j`}w zf{vnXc;T+8qH8l#;YGi`R#XrkQFwf2h6le7k8*uVJXLJ~V}AEZ%o(N~id?tg=T4*u zhvp*gbw4ROxwObULkRC{{zQ-&LV{l6Y%5M*1-~gX~SCDa@TGPa7<`s~m U>+K|cGq1iqg~+UT#rAvoFFL=fS^xk5 diff --git a/data/shaders/lesson7.metallib b/data/shaders/lesson7.metallib index cb46b926e559b83731b8ba0fa96e1b6cf9006b2c..94829cc08e555778b93c360df274c6528a1edad6 100644 GIT binary patch delta 134 zcmZoMZ!w=xr?B%@+g-SkpQ^c_}ueCQ#?7+o9&djb;(e5fc_9ieOD<(9 z8vk5wwOr-;sl=Pc(!y4DQ(e6HUO2nKb-&o diff --git a/data/shaders/lesson8.metallib b/data/shaders/lesson8.metallib new file mode 100644 index 0000000000000000000000000000000000000000..429421d5b17153b51acb88bb321e7a5a66b1008a GIT binary patch literal 6298 zcmeHLeN zQBx;=fWev0Bw8JIrsJrqGuqJ|5)c8YgH&6j8BQpO)Io>VihA0!-RCA~#k#Y5_MF|b zfApT@{kZRYpRf0QpXc|ytMhWwX@n2rgLt3A0&iU~(;uIy(`nv@bf#ZF)926hcR%R| zdtXrW)bM{bZFS~cB)?RxE!C}7R#YN+8*?*ZZg$%GY#jN`V|;$&k{{@N-c+s~9QXZm ztbOsi%kLy8J`Fna#fingy0#`OD{n@i89vWe`I+n1vk)3W{b@+%s~LIP8IBwzORaok zYiXtS8J;vR&w_8(FAeP3 z^)|lCa}f;Wr{#g1K8UJHQ=zS>szeY1^ewKcQkNh!0!BA7VAPjE$;g2DFRF*zgFQR~ zVZ0k!-@ubDZyy%35#;Y+&bbEMvq}Llj_SkrrFAn_F!`}b`)LjAmwZ_v7-LTn5t!+d zzJG4|yZqQdDNC?oPHaX*_8f~iymKAF4iT#((C%#iqBdKbtZRx|u(e>^pFkbDGvX1& zk7hx3vrrv@*6Gk4<#bIOS}PzEB&e?3Si?f=WhjA-*|A<4J|q^o?3_Wn@TyoiXy;7Y zg5QWxclQqah8g|DnM4X~wJEt!VbJ|6{c8+^QG~f_T*o9+uPOn}xU>6Owi-sMd zAwtwE7WUC>Xk8nr_7Vqz60#12C&+|yQe{K6vuL`+LYER7Y8SfgoFOqKDpGGD>!VOY zMb?%Z>#|9Wid5rdLO&%{t@VZKyGDRDHYOIjX&4B0^?6cOw4Oy)7l4A4CF`TeY8zP# zI)W)As3r=nqZpxYMWF}}If8*aPKOZG?4w~rHjz`0^*_-lLEuCd$<8_i{|>A3QzU}$ zK~}(;QKxHOgUrf@y|D{NkZ|b7hGqNVC5?;&Ved9TG1_3a1P0{nHqUK%H;11Whjg$Q z5;Kk*g+`}>#JeRo7{GFF@;6#+oP)8?EW5r+VxL67G;Wl2#rLTWS6JkSX$0 zb?CdQFs5G=J1inyyxV_wzCY8Jz?UpXm>PynV&b!aMZCw6%sZ{hM(a+}mz5h;1gcYz zYH9(Q#Q0lhSn=kt*5co!mYNUI{5W7KO@k3&yRYk zKn;LW0};AugCr?M${vl;Q~ zJW{D)4j+YbtAbaJQ^J2+_A{sXXdRB$?vWII+xPr+Y+YbQeV|SQ&Q9rR4t>3 zt8mIb-tJa6mtq0bzygv6B?2yxdIV0XY^GVFr(XEMKNhp{L;Q0rX1~bgT@1P5C5cb2 zjpi%J#T#?^nX+oiAJxI0x()RLdJez&PcdgC=YM}b{^DsdGa?1iO1K8Md$3nF)H~rE zluh=IjSmdFWMw6alCr`rB??)tXP~e5wWqJvHL-ps=_D8|Ju_%^saCl~ZuvFA$R?PT z$_n+8;;OBxiY=u}N=hrM)LS*1ODZ(VqAjKJhTC{>OXTg?>5rI)y7I@1f)bWLyb+W| zPXBm3D6%U*Aww6?l2&l|7gq*1g%&Q@)Vim&uwYYb!8@%RTV01XhWu496ufb$&??w; zlRvVtyWv>R`Syz+9J_Yx;`x|4s}5-V4kUkdn&ZZ`nB-_p^ntlY zqr>G6dvr(W_U#A4!%rW09J|WyA^Ebr;RL&C^6u)rTUhsVcn_p&9>{)n>2L4#{Vr#T z`GlE$tZeda80_9VzK6BA(f2jM&qFwSP9^>!@w~V%E_HA;Hp$*?!Gw608xV6iuCT@QpO=ULF01Ra+}7R8?At|9Ek^QoZB&z!0^AoAUEzZ4Cwk zY)>IO=9g04IKHk)z!Rlt`3u9tY82@9ax}4=ti{QCa9Jw4MnS5iWSupD5gs@*nvJTX zP>5Iy9g-qHQfomIPf~FL!bYu%Tu6&C%<;U04^^b5jrv^u$agz!-_3~LBd3ydB$))HvFheDk-7M~NB{w-w)9_S8hKs(KIMvuW6jbjnQ&Jkf*AT8A- zmo{{m(>*~(W36V7BfPtO?w15Nj-3u61>%yhOycXAW(@74r*_Lz&Gghhoms0wx3f?X zTBQQVPp{FDDx3`I^XE=lxFZr?rGz&+#huFK#_>Bv!w})cBBv57lk7^qU`+0pC!L|E zTrj3I(3AV7p4g=vTs)dckSYtQQlJn?Y99Fl*;<0!41Qlgs;yv0{i1tQ+$*XDd_;ZYXA-o$#9!U-`2H+Iqh{s{ZT zqA4XauhA&&>qtH+PX&W~?MxYyC!3(#VZJm6G$jEyX#p`sp=ztXaFoxTZ0Fv}<=&Ts zI|kCQv60}x5z#ORkR6hI(wKV27~0SwHOrIwI#SL#lDa!U$CSS8Gu04{6=<~wN`!pU z#hp~}?z)*%IPaE(cMIoD=W;9g+))V^y7%48&)nRxT<#-D_@|Rfp;Ip!90{Hji^j#G zPO%79a6{VHHo8)H=86n;${=UG2CoY@MBpf3O`fIZ)(EZ zjEm*|*Bvcses>gCrWo5!mRbzUU})C!EWQ^$hwnT87x6un6NNfw@Vx@@Ycr_;lELb= z1GM!l>5H)P5ejfq@Op&WN<;0QLogx&{C!U>>ZTB?iJsI>S5TmtUfl+M3^oz?H!qB) z!|qT~E`hGo0q&>H0YF|g9MkfrDFlU~+l7FkhwQ>31RI8oLXY)A3Sp!C&5)e~6TCSF zfa6&h9SCavb6nmo0?#-8A~5aAJ-`o3(ONi{<#fQ`b%01;q`oKpfKsZs&j2GxA&@BqzXS3>mI7*iH|tOs#r$@kyil_p z39=0ld@2k35yHl4H<(9Rgl}7dpovNVXi44#Kp^vZ1=f?w0Vv!yuSq6|WM?RI1bdy( z_2dE~sQ+OukWHlk3<+IgmH}cns1C+w9+W)(CZllPeE&bEe*K|*51@H_C$ zD&+p6j4#&|Gum;dI53DgH6m zXH5JTSfBWBV}06d9+ckQe12bZ&s*0Td){fjHXCnJfWKHD)K!)h$Ive*BZLznVKRQ} z$@rw;bALP^|Nfc8#8*6t3E;(2^+D&rSfOk9-`tSsxO=-M1}1yUt*0(FUb|+YfH9Ru zPz1w$9wr>hIy60=z$jv78zM~xVVhym#F0S2wMCJ^H6P`VXFY5lXKq-2dGaax_a$eN z19SJQ<5w0nu7PxBZegoSSa?(L`r+3@IB|dYqhwh~*ptg6c|;Zwn{A9NHwsP0MQx+o zo}&GAanoJXk;_Y#-_LAlaTZZYMWv}zkjs3lpRv_KPqp~!X@@8c-;Ygsf7$uim6U>8 zs*07=_0;By%92uD9;N8GlS0NiNN}#*=xOe;d~Rzz)q0BPYdq^X)%F4>6-v!w zO>vc~bTJr3yG>oHk+WG`JdqeC3JMMvt`cl|ZLsi)YcRBM2df}2uxl&>-aEe7^ z4(eKKOoJ`d(T!T13Ck?UDV`3(RGyZqs`^vokGi=$ZenV8@8y%Os?O)E^eaa7lWJE&X(NopT@BI&94>i6X%5}MEnmn z71`{`6mNWEl6%V0nTHd3*iM?h-L&=GvEvG@kGE_VVhmyxO-XPFxOM8qp&MsTMWv-A Wq@=~k_`a)i9#~~ delta 134 zcmX?Qa>`^vokH(~AKvUDg3q@f5WMJqZ1=YEg*=BsFGe^VE@_%~bm4`9iSt4fT$WtQ zR5bp%+-kYX^;3yAji*gK`Of9HdG7Sg6=!#~Zr!_Ch%ty&G^xlT;MS=Zhi;rX6_u8f WkdhXYlT@_1k}a7Rhtx;mNHzfMzCzsq diff --git a/scripts/compile_shaders.py b/scripts/compile_shaders.py index 933c893..0adcb44 100755 --- a/scripts/compile_shaders.py +++ b/scripts/compile_shaders.py @@ -134,7 +134,7 @@ def compile_shaders() -> None: build_metal = True build_dxil = False build_dxbc = False - lessons = [ "lesson2", "lesson3", "lesson6", "lesson7", "lesson9" ] + lessons = [ "lesson2", "lesson3", "lesson6", "lesson7", "lesson8", "lesson9" ] src_dir = Path("src/shaders") dest_dir = Path("data/shaders") diff --git a/src/c/CMakeLists.txt b/src/c/CMakeLists.txt index 1926336..6e40d30 100644 --- a/src/c/CMakeLists.txt +++ b/src/c/CMakeLists.txt @@ -7,6 +7,6 @@ add_lesson(lesson04 SOURCES lesson4.c SHADERS lesson3.metallib) add_lesson(lesson05 SOURCES lesson5.c SHADERS lesson3.metallib) add_lesson(lesson06 SOURCES lesson6.c SHADERS lesson6.metallib DATA NeHe.bmp) add_lesson(lesson07 SOURCES lesson7.c SHADERS lesson6.metallib lesson7.metallib DATA Crate.bmp) -add_lesson(lesson08 SOURCES lesson8.c SHADERS lesson6.metallib lesson7.metallib DATA Glass.bmp) +add_lesson(lesson08 SOURCES lesson8.c SHADERS lesson7.metallib lesson8.metallib DATA Glass.bmp) add_lesson(lesson09 SOURCES lesson9.c SHADERS lesson6.metallib lesson9.metallib DATA Star.bmp) add_lesson(lesson10 SOURCES lesson10.c SHADERS lesson6.metallib DATA Mud.bmp World.txt) diff --git a/src/c/lesson10.c b/src/c/lesson10.c index 3df592d..9ea778c 100644 --- a/src/c/lesson10.c +++ b/src/c/lesson10.c @@ -307,10 +307,9 @@ static void Lesson10_Draw(NeHeContext* restrict ctx, SDL_GPUCommandBuffer* restr Mtx_Translate(modelView, -camera.x, -(0.25f + camera.walkBob), -camera.z); // Push shader uniforms - struct { float modelViewProj[16], color[4]; } u; - Mtx_Multiply(u.modelViewProj, projection, modelView); - SDL_memcpy(u.color, (float[4]){ 1.0f, 1.0f, 1.0f, 1.0f }, sizeof(float) * 4); - SDL_PushGPUVertexUniformData(cmd, 0, &u, sizeof(u)); + float modelViewProj[16]; + Mtx_Multiply(modelViewProj, projection, modelView); + SDL_PushGPUVertexUniformData(cmd, 0, &modelViewProj, sizeof(modelViewProj)); // Draw world SDL_DrawGPUPrimitives(pass, 3u * (uint32_t)world.numTriangles, 1, 0, 0); diff --git a/src/c/lesson6.c b/src/c/lesson6.c index 5b91892..21b2234 100644 --- a/src/c/lesson6.c +++ b/src/c/lesson6.c @@ -229,8 +229,7 @@ static void Lesson6_Draw(NeHeContext* restrict ctx, SDL_GPUCommandBuffer* restri .offset = 0 }, SDL_GPU_INDEXELEMENTSIZE_16BIT); - float model[16]; - struct { float modelViewProj[16], color[4]; } u; + float model[16], modelViewProj[16]; // Move cube 5 units into the screen and apply some rotations Mtx_Translation(model, 0.0f, 0.0f, -5.0f); @@ -239,9 +238,8 @@ static void Lesson6_Draw(NeHeContext* restrict ctx, SDL_GPUCommandBuffer* restri Mtx_Rotate(model, zRot, 0.0f, 0.0f, 1.0f); // Push shader uniforms - Mtx_Multiply(u.modelViewProj, projection, model); - SDL_memcpy(u.color, (float[4]){ 1.0f, 1.0f, 1.0f, 1.0f }, sizeof(float) * 4); - SDL_PushGPUVertexUniformData(cmd, 0, &u, sizeof(u)); + Mtx_Multiply(modelViewProj, projection, model); + SDL_PushGPUVertexUniformData(cmd, 0, &modelViewProj, sizeof(modelViewProj)); // Draw textured cube SDL_DrawGPUIndexedPrimitives(pass, SDL_arraysize(indices), 1, 0, 0, 0); diff --git a/src/c/lesson7.c b/src/c/lesson7.c index 21ce59d..983798d 100644 --- a/src/c/lesson7.c +++ b/src/c/lesson7.c @@ -319,10 +319,9 @@ static void Lesson7_Draw(NeHeContext* restrict ctx, SDL_GPUCommandBuffer* restri } else { - struct { float modelViewProj[16], color[4]; } u; - Mtx_Multiply(u.modelViewProj, projection, model); - SDL_memcpy(u.color, (const float[4]){ 1.0f, 1.0f, 1.0f, 1.0f }, sizeof(float) * 4); - SDL_PushGPUVertexUniformData(cmd, 0, &u, sizeof(u)); + float modelViewProj[16]; + Mtx_Multiply(modelViewProj, projection, model); + SDL_PushGPUVertexUniformData(cmd, 0, &modelViewProj, sizeof(modelViewProj)); } // Draw textured cube diff --git a/src/c/lesson8.c b/src/c/lesson8.c index 1fa4aa8..752cc2c 100644 --- a/src/c/lesson8.c +++ b/src/c/lesson8.c @@ -88,7 +88,7 @@ static bool Lesson8_Init(NeHeContext* restrict ctx) { SDL_GPUShader* vertexShaderUnlit, * fragmentShaderUnlit; SDL_GPUShader* vertexShaderLight, * fragmentShaderLight; - if (!NeHe_LoadShaders(ctx, &vertexShaderUnlit, &fragmentShaderUnlit, "lesson6", + if (!NeHe_LoadShaders(ctx, &vertexShaderUnlit, &fragmentShaderUnlit, "lesson8", &(const NeHeShaderProgramCreateInfo){ .vertexUniforms = 1, .fragmentSamplers = 1 })) { return false; diff --git a/src/rust/lesson10.rs b/src/rust/lesson10.rs index d429b90..893d84c 100644 --- a/src/rust/lesson10.rs +++ b/src/rust/lesson10.rs @@ -330,10 +330,10 @@ impl AppImplementation for Lesson10 model_view.translate(-cam_x, -cam_y, -cam_z); // Push shader uniforms - #[allow(dead_code)] - struct Uniforms { model_view_proj: Mtx, color: [f32; 4] } - let u = Uniforms { model_view_proj: self.projection * model_view, color: [1.0; 4] }; - SDL_PushGPUVertexUniformData(cmd, 0, addr_of!(u) as *const c_void, size_of::() as u32); + let model_view_proj = self.projection * model_view; + SDL_PushGPUVertexUniformData(cmd, 0, + addr_of!(model_view_proj) as *const c_void, + size_of::() as u32); // Draw world SDL_DrawGPUPrimitives(pass, self.world.vertices.len() as u32, 1, 0, 0); diff --git a/src/rust/lesson6.rs b/src/rust/lesson6.rs index 01c1352..929ba39 100644 --- a/src/rust/lesson6.rs +++ b/src/rust/lesson6.rs @@ -252,12 +252,11 @@ impl AppImplementation for Lesson6 model.rotate(self.rot.1, 0.0, 1.0, 0.0); model.rotate(self.rot.2, 0.0, 0.0, 1.0); - #[allow(dead_code)] - struct Uniforms { model_view_proj: Mtx, color: [f32; 4] } - // Push shader uniforms - let u = Uniforms { model_view_proj: self.projection * model, color: [1.0; 4] }; - SDL_PushGPUVertexUniformData(cmd, 0, addr_of!(u) as *const c_void, size_of::() as u32); + let model_view_proj = self.projection * model; + SDL_PushGPUVertexUniformData(cmd, 0, + addr_of!(model_view_proj) as *const c_void, + size_of::() as u32); // Draw the textured cube SDL_DrawGPUIndexedPrimitives(pass, INDICES.len() as u32, 1, 0, 0, 0); diff --git a/src/rust/lesson7.rs b/src/rust/lesson7.rs index c430f23..59daf94 100644 --- a/src/rust/lesson7.rs +++ b/src/rust/lesson7.rs @@ -335,10 +335,8 @@ impl AppImplementation for Lesson7 } else { - #[allow(dead_code)] - struct Uniforms { model_view_proj: Mtx, color: [f32; 4] } - let u = Uniforms { model_view_proj: self.projection * model, color: [1.0; 4] }; - SDL_PushGPUVertexUniformData(cmd, 0, addr_of!(u) as *const c_void, size_of::() as u32); + let model_view_proj = self.projection * model; + SDL_PushGPUVertexUniformData(cmd, 0, addr_of!(model_view_proj) as *const c_void, size_of::() as u32); } // Draw the textured cube diff --git a/src/rust/lesson8.rs b/src/rust/lesson8.rs index 6cb249d..2086a7e 100644 --- a/src/rust/lesson8.rs +++ b/src/rust/lesson8.rs @@ -143,7 +143,7 @@ impl AppImplementation for Lesson8 fn init(&mut self, ctx: &NeHeContext) -> Result<(), NeHeError> { - let (vertex_shader_unlit, fragment_shader_unlit) = ctx.load_shaders("lesson6", 1, 0, 1)?; + let (vertex_shader_unlit, fragment_shader_unlit) = ctx.load_shaders("lesson8", 1, 0, 1)?; let (vertex_shader_light, fragment_shader_light) = ctx.load_shaders("lesson7", 2, 0, 1)?; const VERTEX_DESCRIPTIONS: &'static [SDL_GPUVertexBufferDescription] = diff --git a/src/shaders/lesson6.metal b/src/shaders/lesson6.metal index 0b05448..ebefd03 100644 --- a/src/shaders/lesson6.metal +++ b/src/shaders/lesson6.metal @@ -15,14 +15,12 @@ struct VertexInput struct VertexUniform { metal::float4x4 viewproj; - float4 color; }; struct Vertex2Fragment { float4 position [[position]]; float2 texcoord; - half4 color; }; vertex Vertex2Fragment VertexMain( @@ -32,7 +30,6 @@ vertex Vertex2Fragment VertexMain( Vertex2Fragment out; out.position = u.viewproj * float4(in.position, 1.0); out.texcoord = in.texcoord; - out.color = half4(u.color); return out; } @@ -41,5 +38,5 @@ fragment half4 FragmentMain( metal::texture2d texture [[texture(0)]], metal::sampler sampler [[sampler(0)]]) { - return in.color * texture.sample(sampler, in.texcoord); + return texture.sample(sampler, in.texcoord); } diff --git a/src/shaders/lesson8.metal b/src/shaders/lesson8.metal new file mode 100644 index 0000000..0b05448 --- /dev/null +++ b/src/shaders/lesson8.metal @@ -0,0 +1,45 @@ +/* + * SPDX-FileCopyrightText: (C) 2025 a dinosaur + * SPDX-License-Identifier: Zlib + */ + +#include +#include + +struct VertexInput +{ + float3 position [[attribute(0)]]; + float2 texcoord [[attribute(1)]]; +}; + +struct VertexUniform +{ + metal::float4x4 viewproj; + float4 color; +}; + +struct Vertex2Fragment +{ + float4 position [[position]]; + float2 texcoord; + half4 color; +}; + +vertex Vertex2Fragment VertexMain( + VertexInput in [[stage_in]], + constant VertexUniform& u [[buffer(0)]]) +{ + Vertex2Fragment out; + out.position = u.viewproj * float4(in.position, 1.0); + out.texcoord = in.texcoord; + out.color = half4(u.color); + return out; +} + +fragment half4 FragmentMain( + Vertex2Fragment in [[stage_in]], + metal::texture2d texture [[texture(0)]], + metal::sampler sampler [[sampler(0)]]) +{ + return in.color * texture.sample(sampler, in.texcoord); +} diff --git a/src/swift/Lesson10/lesson10.swift b/src/swift/Lesson10/lesson10.swift index 840b50c..b00b04e 100644 --- a/src/swift/Lesson10/lesson10.swift +++ b/src/swift/Lesson10/lesson10.swift @@ -298,11 +298,8 @@ struct Lesson10: AppDelegate modelView.translate(-camera.position) // Push shader uniforms - struct Uniforms { var modelViewProj: simd_float4x4, color: SIMD4 } - var u = Uniforms( - modelViewProj: self.projection * modelView, - color: .init(repeating: 1.0)) - SDL_PushGPUVertexUniformData(cmd, 0, &u, UInt32(MemoryLayout.size)) + var modelViewProj = self.projection * modelView + SDL_PushGPUVertexUniformData(cmd, 0, &modelViewProj, UInt32(MemoryLayout.size)) // Draw world SDL_DrawGPUPrimitives(pass, UInt32(self.world.vertices.count), 1, 0, 0) diff --git a/src/swift/Lesson6/lesson6.swift b/src/swift/Lesson6/lesson6.swift index f2181d8..422332e 100644 --- a/src/swift/Lesson6/lesson6.swift +++ b/src/swift/Lesson6/lesson6.swift @@ -209,8 +209,6 @@ struct Lesson6: AppDelegate vtxBindings.withUnsafeBufferPointer(\.baseAddress!), UInt32(vtxBindings.count)) SDL_BindGPUIndexBuffer(pass, &idxBinding, SDL_GPU_INDEXELEMENTSIZE_16BIT) - struct Uniforms { var modelViewProj: simd_float4x4, color: SIMD4 } - // Move cube 5 units into the camera and apply some rotations var model: simd_float4x4 = .translation(.init(0.0, 0.0, -5.0)) model.rotate(angle: rot.x, axis: .init(1.0, 0.0, 0.0)) @@ -218,10 +216,8 @@ struct Lesson6: AppDelegate model.rotate(angle: rot.z, axis: .init(0.0, 0.0, 1.0)) // Push shader uniforms - var u = Uniforms( - modelViewProj: self.projection * model, - color: .init(repeating: 1.0)) - SDL_PushGPUVertexUniformData(cmd, 0, &u, UInt32(MemoryLayout.size)) + var modelViewProj = self.projection * model + SDL_PushGPUVertexUniformData(cmd, 0, &modelViewProj, UInt32(MemoryLayout.size)) // Draw textured cube SDL_DrawGPUIndexedPrimitives(pass, UInt32(Self.indices.count), 1, 0, 0, 0) diff --git a/src/swift/Lesson7/lesson7.swift b/src/swift/Lesson7/lesson7.swift index a241f9e..478e978 100644 --- a/src/swift/Lesson7/lesson7.swift +++ b/src/swift/Lesson7/lesson7.swift @@ -266,11 +266,8 @@ struct Lesson7: AppDelegate } else { - struct Uniforms { var modelViewProj: simd_float4x4, color: SIMD4 } - var u = Uniforms( - modelViewProj: self.projection * model, - color: .init(repeating: 1.0)) - SDL_PushGPUVertexUniformData(cmd, 0, &u, UInt32(MemoryLayout.size)) + var modelViewProj = self.projection * model + SDL_PushGPUVertexUniformData(cmd, 0, &modelViewProj, UInt32(MemoryLayout.size)) } // Draw textured cube diff --git a/src/swift/Lesson8/lesson8.swift b/src/swift/Lesson8/lesson8.swift index ae533fd..344d10d 100644 --- a/src/swift/Lesson8/lesson8.swift +++ b/src/swift/Lesson8/lesson8.swift @@ -90,7 +90,7 @@ struct Lesson8: AppDelegate mutating func `init`(ctx: inout NeHeContext) throws(NeHeError) { - let (vertexShaderUnlit, fragmentShaderUnlit) = try ctx.loadShaders(name: "lesson6", + let (vertexShaderUnlit, fragmentShaderUnlit) = try ctx.loadShaders(name: "lesson8", vertexUniforms: 1, fragmentSamplers: 1) defer {