From 7ff67a194b2c6d44f55b2ce63aa43f423217c2d5 Mon Sep 17 00:00:00 2001 From: SeanOMik Date: Fri, 28 Jun 2024 16:15:21 -0400 Subject: [PATCH] create an example for testing shadow maps --- Cargo.lock | 10 ++ Cargo.toml | 5 +- examples/assets/wood-platform.glb | Bin 0 -> 50576 bytes examples/shadows/Cargo.toml | 10 ++ examples/shadows/scripts/test.lua | 59 +++++++++++ examples/shadows/src/main.rs | 165 ++++++++++++++++++++++++++++++ 6 files changed, 247 insertions(+), 2 deletions(-) create mode 100644 examples/assets/wood-platform.glb create mode 100644 examples/shadows/Cargo.toml create mode 100644 examples/shadows/scripts/test.lua create mode 100644 examples/shadows/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index b5960e5..c5c7786 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3075,6 +3075,16 @@ dependencies = [ "digest", ] +[[package]] +name = "shadows" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-std", + "lyra-engine", + "tracing", +] + [[package]] name = "sharded-slab" version = "0.1.7" diff --git a/Cargo.toml b/Cargo.toml index a4afe80..737e1ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,6 @@ edition = "2021" [workspace] members = [ - "examples/testbed", "lyra-resource", "lyra-ecs", "lyra-reflect", @@ -14,10 +13,12 @@ members = [ "lyra-math", "lyra-scene", + "examples/testbed", "examples/many-lights", "examples/fixed-timestep-rotating-model", "examples/lua-scripting", - "examples/simple_scene" + "examples/simple_scene", + "examples/shadows", ] [features] diff --git a/examples/assets/wood-platform.glb b/examples/assets/wood-platform.glb new file mode 100644 index 0000000000000000000000000000000000000000..11624ca09c26b3227692246b92ad0e089b08503e GIT binary patch literal 50576 zcmb4q2S5`|w?3y;rFgdY335 zAfQMU5v3~FUhwjlHHw|)6dMDotfRm_*&_nrJ$fl>8GGrJx@VlU}4^u5`Yzi2^xB01N;Mm1u$e10WDv&zdIT$pf77G5T+m_C!+)r zloAX>V}rc{{K?4jGGM`IDZyYAnSme-{C6%`5at*u=#TUx*9ltwfk_Ga2e_k80bu87 z=l@-b6!b#}d;TH)8y_C(h9=7hMj?I4+6NG2nfY^`lEx%)RBU2$Y3-)z&8ME zg}xRNiX{t+6!aondyT9O*(SfgX>^gOKaL?Ahy92AKk8%@qff0lwc(F(|6%ptRs>?b z{JcWE!u|##Lqf1#ZlNKk#YjOjQ%ij-eN&S^)|;4G7;72{!sMg`t#s_*rluC!SHXfX zd9o&CrMyt5BoMNsf9xXb_{WhUe<}Z$KZ22dfxc*RE1tGQKqwY<+9;fwRL+IXSE1z`$ghF*SXtLuTME%gUU);kc5A$#p_KZXYcxXTHivOuE9Is^w`|C02t zT*$&u0e*o2{%HS@zgQ{C$t#^!hWeAcm;9*|B-yKua#G~qsk^+$eaBH+PU_E}ToLk@ z0ya8u2)R3vo9171Bs=7P;{M-}%m4q7%l{wJ$u9ptrT?k?V;h8Q=HJpS;hIL87Jppz zzt#U&XZ>jvx9cHjBeXvzgxu%lRaB$|Pb*A4JpK$svLi!~Sj_2|geX9j$Zh|REBU>(FL|sB!l26X&_8|VKPsRq%BMZ@FE{_~;(zh00#qKVL>?Ui0s<+|C@8e_O~{e& zmd4-5)BhoV3jYV^|CZPI7asq&{69QS;r~_spSsiQf0zFU{@-0S{?_LoKBwh>&;L_C zz5W+@vWxztQ`l)b_1C{%|0?}m_YclL*S~T96VAWU|HJRU#QE>|{2S~a{r(f5e{lZo z`k!z#{wn>W$A8J^ADsV!kH9HRWACZdv%R;zS0b5sHI9HM>J${u$OnZ+mU#4^gKni? z{jd5{{9EdO@C&7$o#NB2;Qq$HrGAQkD_8OIDgIyer}$UM{C%&S@~5EqtNa)LD}QiL zY5pny1*f3+gHPuFSNYc8aI$1F@6+Qi{977lC>SZ&DbA1&Y6@BkDhf98nT>*z;vxkH z1rzzqM8QhILUEpgj(n!0xIjTkah8IHe5RqGr(mXFAe+ccKF(46p8frfg2g~rUzg&{ znKKl6kY)`A7D-%6E z%LNuzb`DNXP6p=L{{+Z844;gjO!FYPX9nC$UZuI?mX4+c?yPeIg=GZ*A#Q7;O`9s7+--t7N*efaWweP8G~ReQeG(&;-0o=EUf7#^ zAX!1E+`=ev`eD)~OR*EktB6;DR#WSobAHBXM})u{g6@?@kz+xtWdu6^C2Yd&6Ix>5 z?eL;~H*@j+CO6L*BmHA9XI-fllK?%-%Dh)HYjeh%HmluvQv>$h=hp8{odZ7T-P!|H zbbT;pS~hi6P>jP^_N}9vqxmU~P0;pf3+n>jU%1QnZLPwf_ucVEO)5^!}OY zZ1T#*@<&Q_g9ckDiOv`4ZlwubuXkyIqZ(le7)?f(vS8&*M#37eWJRi}?!%tA7na{* zsy0epmxHW z+O&?UJ?ocCXeA&-(z9kb984O6JoYXP5%vG1ird!T`GB>VG{1Uf^4M(Cm%m52bC}07 z*dihm+J=P3&afEdRqff5Bx?<`ZhTfQFEY%HdMf#0Lbz`oBX>dM;67^YAR=oq;C5|V znwtDlfF9d@#UDN1fKvZa<3(i*df~-;TZ;%fHNKbg;0Kq&eSxE~Py4yIZ@r4(JO*9a zy2*-jbTYU+1w%)>2rJWTHg1U{QL>{akW}}au^E5ipR>rBims8ZrhbH1y!2XEKW7Lu zt4zgrLKx;!kyjRS*>pKlf`@{D-affMsW4g5bYiFE+f@ zgU%WIg<3n_8StnR9deU0UL3a6tpfkz&OcPeh;b`x^IJm8J=iWvbaaYsK6u%uf%_p5 zAhr|EZ0MFXCW@9OtV1JY_9lsG$t8!D{pHr>9-9+y5P9>4*8`*$Te7C^%VdC`GGNCfQKZP{CN7!Y((#qnkR4S^bvSJ^5lq190-moluR+fqy3Tfa% zA1LCR-5!rn6|d#B`&qa5PQr>3MN${m*(@Bn#zh}eUBH9ebGnAM&z4jsv-k*0+lWVN z`dx4+5N&T##>P}N%&kFkYcDB4GHq5&XKU-MrKH#CFI80cqSj2^PAdRqH|JD4`ILM<`?=oLgkAXU94E?3@N3ckRpNU(bu((CKg_*soqUy#D!_A8E z5z6xS?}|#QtItow7}&yfaStEvcz4Y%YR>FeL+s@jj2aIVuj;4=e+#vE46q^19vtP4 z+vZn+#eMgMiqv!^RE+4oUGher#9=2kBf6byZQNcc#@O?ahf$OH@OwvVDHny(Vl*+= z7H%$DwBl^612pwWfBEh}r=lyy1j1Fea}IJp$nimZUR%%k#jx8i+={Xl%pI@Ha3nF zZZb{kX-SPPC~Y$Q5FqY@w51Ve>}M7En9-U5aOo3KiKoc1R`75dZe$lP#Vd0|^?V&I zp-o!8WmDJRn&l80V6)yTw_-fBzrD;oJ9F$EZnR#uJ(k8p-N4vwc}N?q0G2IE_+Yd+ z!fv@fId;L&whZjXP7nX_dY?A&{t)qc`gCsKU3zcx{L#u))2F>$HtaYKe^<98=ivOAJk69GU2YgFFEtVG)EG&$v&*lJ85NAeY;dJmRLg z1O9S*yBxmW*7XzXD&i#(;o!U$$)b)A5nT&)kKV=08Ik#>)hXybA+D*L4drHC3ZaZC z4ja(#mOfX-vQhz;=yGh*<+OO zpkTJgjO&JBmv{l*KhoD%&X~`2D7hbTR3HN`a1r_|zGqFvC0l+oxiU%XUcXq8r|2kX zN|XyvQxf+?9%fBn%@-bbE9l`G1v^%}p?cK{sBj}D+<2doX`^nTYhG*~SFw3$zZ$Q0 znaf!h0xUb=8aK^F9zgO!;@-*Uo_~Q>LWf9~Y}@(waN~$>79iR>Y`1ekhI;*cnF=@6 zya;wLLboPk@zzw_cqY&)u&fC^jIe}aAK-&QZP-?V^5hrY#p>MD*CIk5h7SiYjTy}d z5s1OZh|DVx_Z>jDk+BrqWCR9YsIxqG_i6vfFcmr2Qf1flVP*?UPHz=Fj;2K8Vd8U61Ubn^dOEOE z-SOK^!xxgxX}g51=Su}Vc|q-J_6RwR9O(tYk%JlQ17`U3`>yi2RBugty*8CxB|5ps z=M8O&euxM%BlCxL<|He4r;mGLDz_b=A!($nzN$vNqH)st<9n(XxdGo355-p6VzTfCKNyfZN(0 zB=@FXY;DDN@%?Ux6#03s5jRe0B7q9LLu2!;!v9@KyYzY-@0Hor-xLZK7s_&?&pZmf z)H(UfqY2bGHNmOKFVQ)avpup!CtbyPkgt$6fPJx0i?7daF!U_Kb*YeYZz}wBcqp&R zJBI9+E*JX+RElTJ4zR8GAzAXoprZ}s^^Mrbb5Q zWydS;B5X__t(36zWIa++i{%C{O6G@P5B-7TJk?sxnUkcjoZfToj%gFFTa46K-nf@m zcCCK3TtA4Z$oCfY&EOx+IA^n3-N~(zv2mnWg% z-lP2w(NqdV@rDJVE1p#MO7=rO1TiyuBu&X!hfmj z)#6(+p^~*a#e>2Q7rgTiT5oe#j3Hc0Z|s%c4>lWb>j$-WiGTQjK3CK=ylEMRlP)yg zczFUGNS)#ckWG;uY3lF6+uvlTWG_dWB6RNZLb9l_g{oRu1d^VSWQe*Rm$X(koJpD! zFH*+Yb_klS#;d84YC^2>NS~~;ZWL4r1x}Bn`Ct0P>PmiJO|G|$a=UL zPBZDyVSQZ%9cH`cRU8T!l|?~K&v?iWZ9x-XAvhNC!e1%7P2Yn+FYEeEZTh420~DbH zT-|g|3re~#lx`Y*l=7cD2hFNe4cdZ-?Y&sg?2#=lgG%=%jr}at8N8yq`=~{-VaMOh zZ@y}HMY?EvzI>4iJG`l!d5ed|dg_W{=!66;pSClmJg05kgI@VQd-1s8$6UK?t~`n0 z2#|Nz>QM;lXvm&0EyvPn(c#E3+oOh2_=Rq9Yti#Pk>Pf}m*Xel?IY@GB-}C>b!D?; zVpMwzl4YxzUz%(VsWE#QHrmx(49&%uJL`^ay5F8H-K{kr(QxX_>1yoYyzbLXRW)Ji z;caUcqE&Kt3Rc)QXSrb1M#?UWSDUR#Q&qo{KnXpM3E>%^LBP*lO>RuwtQ+r-`Wp2( zF8s=z3D9p1B@r!OTNy=yKr<(k-$B}QWYSbC_FkTFkHk$_UQ$M@dofa0?WZmU%bz5I z3<^YOjqMB4V9l3Fvp3oD@H)beT~;Vtg>t&78_;FGW#cysIubqWhS{SwqB`RO^j2NB zzZGs&L^mV^$bw?}g(j^F#w-qnI?8y_t$M!uJo1he`>kHa7mme0Ln|I!Qi!NT7R5+w zD{z?Fikc}DDJ3-YT11Vnn0KPI z^d`IWGF9E?#gMKI79G}56%;yW5*n68vMgve*lHOzz20lGkUXAwS)qMohgWJYwRMGN z#?^Z)%$gLOh?}u)G2OIYqqf*y!pPMkyyLjK&ntx4OfoXN_3}$*qrxZd#%e}_9m2+@ zf&HN7?&)J6#gWvh069JG@;w9b?Wg^S>r53VWe2pmSrYcP`ri{&s`Z6vX3&Qo-3D7t z!|VYP9hs9yGTx>-Og_*_1=ZL!_S!HltFP4dKFVUnJK_(FQyaJP`%3$ieF+GmjDk!T z2eyckkle8e^dU5-%S(;(cx1cZbWS5|t57LfI83~pc>Dd<3$HX=o4Zm9H7^WXacUG( zOKjRZI2psU9A)FZ`kO2^Q|AYY&(OOqxhq8!j3xxgca$6eMyH^@nV5!$rIr3YudYQJ zrOKC8mI{1SX-@8IL5uHKxEW%(b4Fm>$8wBm9SNG~moKDctK^f5h~FOT`$y)^pbxCq z*GhLpynYG@94Kd(43os0bWCaNRxjk$_il<)BaF@0aa6C4{BuStedPAYQ*6-YxOnA_ z32UjT_R7r%?SzMJOis(mny9pnChK;It=Si|BE&=vM$`A|<}E;{iZ{)cu$&^#k_nZg zjHwPl-iU~6$}H8IcivcSG5wF!&2yJJ!IRs$LldDIXqiA|kBrHJI%}XpAhp%_7}`GJ zvJNS2+B;?HxyHC*Q2qD^W*w8jif9gSO8wOFlXx|^wZf+6+7UqRh||cy##Mi6d}+2e+}&yZOtjNbMlt^9-s=}gLEWa5aW`QFHfApSmutJVzC$oJj_y%&q- zawgXRTtXKOTjFHQy~SzSCe0mfh8KEKXu4&_9Nssj!9jd|&mPvUQ^m;7vo83)a8nD* zbW0dt?~%&Du4hh_))C(&XOj0n)EF(l-FYarWLy8`PH~}{-WC(v;s;^nl+^-aO7hH#jOR~}{g5Vg_}bMgZ!&62_ah4X zQ=KColw`*myf^PN*UaP9is;tcI#i&RdYOAK)7kNo5=V}V*_=)Hu=B04<kY~a zQv_~SIkEK+5F(x_Bv!b0hhX;C_ zu7!Q;_RiD|{%KQMJlMErezvZ?SMw>)Z*flN&Y{eElKI(S1wEb!EH}$yMfG0l!SybL8Sp3RK)RzbxVQ1l6KOa<>C^)58)s^(a~@F4)f?Qg-I ztd=xwf~|ytgR4=D0cW`LGmWe zy7#pviBZ%;@(MYHG!RUm({al`p(6oKy6YaSE!<+ay4K{v<$P}11>3C`U93`)toW7nc?{f`)l^_xO@dVVQXv^HYuxJM_HtvvV@7j@NbsG-|D`>aJc zJ+$FjXSl@nlO(pt4wqWx$z2csFWtGeM%&ls;)c7NnmbwYM^#I&lNVl|Rly~p zbh;zOx##bo(zpREkZ+_bzMA(Z*DN<=iHsdZFA$d|OYgf1c5;xi!s+eH4w!QmBt0V~ zU~zfE5%#qIz|?Odh#SiQvgwa~(WJO>fGj?;9Bf98OvdX$rTe^SIJs=4(x#u7#s zpmbeDrv+Hp6V-NyJFh9Qpd>VcZ!9Qh5+k>VE9{ATUREKUQ>SeB;hHx>uUN}g(~v<} zP7R-#`cWAdjcLv*IkH?o<{o=e5!vchop&ijPXDndW7gwA1K*vHf@eMo?d>|DfbxAK zAvi|QcS^Ft*dcDOP@eZ}I@A^uIQp^BoRV>aeqRTv`9g(~Vic^fX{fX$6qq}tdG*TN zf~2>P)cC4#yW#cKjFzkLo=lRuYxA!=*}8+EOC}K*x)Z7w%Z8<4`rc>3Mwvj14y`nd zeek+7jkEm;&!`64#A|Okcc3Knc}4Z8r+rnho-W&l<>P{vk(^WO7zj4**3^WVkP0Rw zhUgYIZl0KW5XIF=0J$qEW~%WJISU+iXmc|K_XwOxz)>VtZ|jcz1(uwUw& zYOTzlzdT948+^$3EEzY{>ZsfgHS$2g?oWb*UP&~~IgM|PiMMxwJRrs&C>0?Q80{Hz z(U*bd3sJ@Hj}_znoQ#x7*C#vZ0Quv}wZ@se_5qp_8b#p*n~8-;4JJ4+QJ;XMa;Xpq~A8kG6MZytU3t5|22n&<1dM z%=(TuPd@fpcrJWr+jEYdo#w)b%FkM@n=gw@pY^ILcz>w6e)3e;!cTOnPx$*Kl+bJu zg1R9FsQyrG%x|cNAz!aPJo?)k368th90%_oN^t(dGl<{VtMdtb3+F^neZRyg(^DtX zKjgM<$H#O=l&?ywT+vTIt?kQNt<3ZuK2QH+fCd^_gI4j?U(5day6(NUVw0l=BhT&X zXcwoju{Zj8(h{pjcRpgSYvHyBFPhF(%BI(C;v#-i1iVUYe3*UBnBfqhvFQX|crwrl zc$HKJQXll(*H8QQRVe|%cOlAom9&^Pe&Kw+pci^*Z5c7%LQ5Q&+5c+eFvC9IrZzIT zj%>mjFU07Mf004fI8Jv+G7IUpW=Kk7k}7r(s1x4Fyr}5XyUo$yb6sj+EeV(#>OI1iTDl3R0l9MSc zKMJ7P5spm5CE#>aF!Pxuqc8adhF)(coVlYps5HSz!xweeNe{=p;lIM zqmaC{@v>{rw^#j>hK{1D%%AemE!MQ__8pzkkC@Kti@_n-MfhzKxF-jkqkdCt2De17 zgySyG)W+dke!VTw$9Lq#kH2n|s8!j+8|5mIApKzZeNNuu*8HSO+Ur;7}l^h%o$BR zyga`uTeN6@v2!*(T-a!jy5_7|@+)jg`Fr|ys@Dpr3RU5S>YsTFS`V#dU01%^q;y-y z`i#dNMGDDm|E9pa-Of*U(_ReFL09iJQR`?$o|oY3kv`vp&s&8z!-Y;JNx9jT--^8v zCw%gBq@^QCdiJ1(Pf@+!o||k>(_+op;@kHqY8K(mFVQ&lcr*_tXp*`5g(kyQBvJ@zUh3( zv5T|PqgOe$d6lncALQ>~yE3^&s7weu3ig%A-A@SjnyXmGeOz|&q)!J#IdHz*a zYXTKz*GY-=J#kXZyO)ezUcIPslZDL|3JYH2F5^Xxn~e099m+OT+kPtcN00HXfS*iv zLg|ms_K9rt9ZRh_*Bo(oJv}h!D>WmEDFQ*aqp{208Zq>V3paSPTfDW%9-=|d@ zUN#w?ghyEsg?#=J6Y^$JZ=Hx%?QSaTx5l1GTeD>v84m59Pb`Jf#V$hw8qAMSURwR1 z28G;_jt{8ayYrJQ0u-+&@wEGGCvDtO57gn)PIw#{3QM$oK3 zRFJh2w_!e;yrchcCzHo0$JK$%7UIwJ4UOs+gX7z zbU3)x4fA2`$+uU9B<5JgdEReXE2p?KPGC6|rFt{8j8cZuoe~|4&n6iVeu3XO)O80E zR$<=6U=<^n)JjO3*i6DjDW~e>jn=bIZ8zT6KGx3RhA!K#kgTeVt{}qIGyIBThfF<;J5n8ywN&g+NVRx%Ng8QBZ<^CZT?FMz4MB?nN2ym z8wjE8iTV=90SG#9smiLTKT=d-!sIe)mHs-*Zp%*%rTX2Y&ZgACUXjE%2e3LwEB7b; zhIDJqUu+dcvjMV$(_A_{z9(xYSK@H!&ptny3*9;Qiy_D{?p6!k&?>ryGvmE?<#~xuuqnRGScR{_Ypz z)oC{`@qo8k)?EOt zjAa!~)?g-8wpuF1>{?KF3;HTf7bx=;HO~#P2yJ>k5wAbGk@$RuH8!-a2C7RF6Q^in z4kQ3{-{ySq?H&CpH?`Cir4U`IesI|G1KJ2u6YKS;%d@Rib@^y(K~V6EDS&k+SV?_< zCp!6PsgLP#`NmHgzE)iMmRo`jXy+;P5{y-G*AvI@{@IG$7D~}RAB{vUDM&T8db<42 zIcaNot{NDrExk5SbW3VfD{H5oT2gl&QAEJ6`S|NrlAa7Un;pt<%~08YGQ%-P300WI zi1I)Xmz2en&>0KU4znJccnGU>h{z$yQO~ zJPv=q0kf<2ez*8swEf(y(d78EvjS|{E0u;(L#oBzIMQ*C(aQ;IqIJC1vS470a2slC zRWhXa_Ui}-e5B>CK;gK9mAt3Onf$0OWE;Xz1?BJXDZkhG9z8E#34-5_<#iD5D4)>m zdliLQ`qK3}X~24iw4$@;1th=)cg;>NTg+Uoa)b<4T`qVp>sIr4KE#bd41WDvpjCpT zsQdD@)sV-t-M=X|ex$x0C@$OPW{7&q&;zqm+9l>uSf@wkVySD)p0}P?UNVA3r}(>ClUG1CN?M>4(`ya#NacFqs}Xc{Hgjzf0G0Y?b# zRe~3Rx$?==m|t$udg@Qq-xeDei!#FjK2`VXcrLF5TIHjdazOj%-wv{y#Uc*H)vA7rn$?^U#AJRbBN{CF!iKpaP_)~675kNnUxo&YKsJb&jw z(oVS*xX=}^>?Fb<>@0ZcMm2 zSQnKbYnQCwq2a1=z=R9!wprHtrF3i9C`|BmA=`DYJv8^k>zky0Wvr+3RGxL*cTTH1 zs~oYOOtF=mT4tY=bgv#|z1(AfZzNOgVYG%wnC_>|nI)@m52K*UH<1lbB`#qp>7w_J z8fDIX%O}QHj$tDO3WI)AXn9ZATRXtg8Mw>!4=ghpMBB9vrb`1eoi)UaYq9w1g;?t{ z>V_6a>PMeoP@wY|`wo_Mnr7PvQ`G&dj@kCrzB}Bj`|QAD7v9CY@9#NACj|_%#9+bH z%{x6FH*vM_MBOapzVgtWB}8|_N8WRll=lAjp6Zl;dpas_E4cn9PBlR|3PiWZK)2ZRV6D23~sMd>c^8RYhrA*1*{UU5-lI^uPlqs#-Icb6E3S&-+dqY zDAM6gYAlyZjO&ig55E#hmd&PnvRh8jUpRn6_nOO$Ylxzaf$)~bSo%$2yD#}z>O8&f z*4IqTADw;>*Yc1eer3}0Usd$Q)dv_;I$}3hgCYqxU%o4QSB?skUw3>ly`m0QZ?-Pw zwEC(P?dM;Fp!|g3uv5(|Zig)oOk=idCuBChMU!aFvtYuC27XpFqT1(RX%j&oyM8%U=BV1*KmSEE8jE zo4$){o>jEd)rxR@4yk4cFTZqc{#Wk}UA)ID-|nhUD`C2zP(%I0YOU{MSXJQSlY=lh zohKlx>&?Ty3-j7Vcf(#65{p-N`?AhwH7K;Ut>yxffGk-Bh7IUF-cmVS?s1NJP`)0%j;#cVbQ9 z+N+f04eiMtPM;saI_B%0Q1PR^^RvFwVPahIkrcb~`*8jGP~JDg%BznnmwBHug-NJ0 zD0!!c3z_*Wf6{ArE`NIz+)&ONcQKZ3ciH*j!Vv>lN;P(Fplo-I&iVaC+N#w-L0*Nz zhF8BSim`#YvPGM&-+6yi7(_xX@i)ho_@4EY{dE6sM}nG~D=TIO+)lE-75$L(DZ>?Q zr>pByep1yO22-n8IMSGXSzFj(w*2q~`9%tzJ;h_4vw##SQ!avAjH3)K%ChCpW@&BaX zj(oaP-g8moSIANKyx8>w9KWG8j;p5ky{#>!tvGm*`^T%SBbyZ|dTUDMQYg6m+4-R*W6CRcKlp*5^unuLR1iA>e!k3kjvnfEHz;>E z>hg`&yj^tG4~v)43wMNn`F~Zkvpaei3DvE0H8)WIVu_z_SK51&%az% zu4?@Z+s|JqZ8qh`T|ZN;J3Ae#T0+-MZmT;fDLy56RNy-;+ov%L>DyGII(<*$zS`qk z*F%eE?)%s=lrFhu8+e?=zFqOU?^u3!X1;#tEuZH(^K;qbZ-2{UD4A_TdAIlH52Te zs!~0jcD>&jZs0W=ELOgo&&*by|l;-%jfJa(=-(Dcfea=X+{;ai?ZGi;=XF zs3qNJC)w`k#HwL+Q;mui%F*VPOVpz&?TqjlB~mfNXwTg68Jh}q^FcO?X=d&yhL$(y z!ouuurAMgr4v=HITcif!P_sMqI&Hc%y`6&VQg!9sK1p4|%xsI}&w;WQaE(b%qP783 zjkO3raTKqbxp01I#oGIf|DNYO&mI$bnRWiUO2%>f5dPlbr6Q)>Dq0;DP^ISFroz2S z>iWbd<7l%_pzJjo-KvWZEN2tChZOX`8YB|+Nwry?W*$I!oMx{`4ZSI5$>!HBvqTKF z$HTtmJJx`;=anv}Yabu-+UK4vlzIek@!P^;jglYI%=%~Y9$CGVxxN{;yjPWSC(w?4 zSvz9FQn-L7-cq4a7z$G+-kB{r*YM

{RkJzpY>rvO$+U4nzu`!T~Uh^tMmmemvq0 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 a!toKd54f-GRLL|${ZDAEKtc0A|JeXbyuc^` literal 0 HcmV?d00001 diff --git a/examples/shadows/Cargo.toml b/examples/shadows/Cargo.toml new file mode 100644 index 0000000..d4223db --- /dev/null +++ b/examples/shadows/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "shadows" +version = "0.1.0" +edition = "2021" + +[dependencies] +lyra-engine = { path = "../../", features = ["tracy"] } +anyhow = "1.0.75" +async-std = "1.12.0" +tracing = "0.1.37" \ No newline at end of file diff --git a/examples/shadows/scripts/test.lua b/examples/shadows/scripts/test.lua new file mode 100644 index 0000000..bac6e90 --- /dev/null +++ b/examples/shadows/scripts/test.lua @@ -0,0 +1,59 @@ +---Return the userdata's name from its metatable +---@param val userdata +---@return string +function udname(val) + return getmetatable(val).__name +end + +function on_init() + local cube = world:request_res("../assets/cube-texture-embedded.gltf") + print("Loaded textured cube (" .. udname(cube) .. ")") + + cube:wait_until_loaded() + local scenes = cube:scenes() + local cube_scene = scenes[1] + + local pos = Transform.from_translation(Vec3.new(0, 0, -8.0)) + + local e = world:spawn(pos, cube_scene) + print("spawned entity " .. tostring(e)) +end + +--[[ function on_first() + print("Lua's first function was called") +end + +function on_pre_update() + print("Lua's pre-update function was called") +end ]] + +function on_update() + --[[ ---@type number + local dt = world:resource(DeltaTime) + local act = world:resource(ActionHandler) + ---@type number + local move_objs = act:get_axis("ObjectsMoveUpDown") + + world:view(function (t) + if move_objs ~= nil then + t:translate(0, move_objs * 0.35 * dt, 0) + return t + end + end, Transform) ]] + + ---@type number + local dt = world:resource(DeltaTime) + + world:view(function (t) + t:translate(0, 0.15 * dt, 0) + return t + end, Transform) +end + +--[[ function on_post_update() + print("Lua's post-update function was called") +end + +function on_last() + print("Lua's last function was called") +end ]] \ No newline at end of file diff --git a/examples/shadows/src/main.rs b/examples/shadows/src/main.rs new file mode 100644 index 0000000..5e3a9fc --- /dev/null +++ b/examples/shadows/src/main.rs @@ -0,0 +1,165 @@ +use lyra_engine::{ + assets::{gltf::Gltf, ResourceManager}, + game::Game, + input::{ + Action, ActionHandler, ActionKind, ActionMapping, ActionMappingId, ActionSource, + InputActionPlugin, KeyCode, LayoutId, MouseAxis, MouseInput, + }, + math::{self, Transform, Vec3}, + render::light::directional::DirectionalLight, + scene::{ + CameraComponent, FreeFlyCamera, FreeFlyCameraPlugin, WorldTransform, + ACTLBL_LOOK_LEFT_RIGHT, ACTLBL_LOOK_ROLL, ACTLBL_LOOK_UP_DOWN, + ACTLBL_MOVE_FORWARD_BACKWARD, ACTLBL_MOVE_LEFT_RIGHT, ACTLBL_MOVE_UP_DOWN, + }, +}; + +#[async_std::main] +async fn main() { + let action_handler_plugin = |game: &mut Game| { + let action_handler = ActionHandler::builder() + .add_layout(LayoutId::from(0)) + .add_action(ACTLBL_MOVE_FORWARD_BACKWARD, Action::new(ActionKind::Axis)) + .add_action(ACTLBL_MOVE_LEFT_RIGHT, Action::new(ActionKind::Axis)) + .add_action(ACTLBL_MOVE_UP_DOWN, Action::new(ActionKind::Axis)) + .add_action(ACTLBL_LOOK_LEFT_RIGHT, Action::new(ActionKind::Axis)) + .add_action(ACTLBL_LOOK_UP_DOWN, Action::new(ActionKind::Axis)) + .add_action(ACTLBL_LOOK_ROLL, Action::new(ActionKind::Axis)) + .add_action("Debug", Action::new(ActionKind::Button)) + .add_mapping( + ActionMapping::builder(LayoutId::from(0), ActionMappingId::from(0)) + .bind( + ACTLBL_MOVE_FORWARD_BACKWARD, + &[ + ActionSource::Keyboard(KeyCode::W).into_binding_modifier(1.0), + ActionSource::Keyboard(KeyCode::S).into_binding_modifier(-1.0), + ], + ) + .bind( + ACTLBL_MOVE_LEFT_RIGHT, + &[ + ActionSource::Keyboard(KeyCode::A).into_binding_modifier(-1.0), + ActionSource::Keyboard(KeyCode::D).into_binding_modifier(1.0), + ], + ) + .bind( + ACTLBL_MOVE_UP_DOWN, + &[ + ActionSource::Keyboard(KeyCode::C).into_binding_modifier(1.0), + ActionSource::Keyboard(KeyCode::Z).into_binding_modifier(-1.0), + ], + ) + .bind( + ACTLBL_LOOK_LEFT_RIGHT, + &[ + ActionSource::Mouse(MouseInput::Axis(MouseAxis::X)).into_binding(), + ActionSource::Keyboard(KeyCode::Left).into_binding_modifier(-1.0), + ActionSource::Keyboard(KeyCode::Right).into_binding_modifier(1.0), + ], + ) + .bind( + ACTLBL_LOOK_UP_DOWN, + &[ + ActionSource::Mouse(MouseInput::Axis(MouseAxis::Y)).into_binding(), + ActionSource::Keyboard(KeyCode::Up).into_binding_modifier(-1.0), + ActionSource::Keyboard(KeyCode::Down).into_binding_modifier(1.0), + ], + ) + .bind( + ACTLBL_LOOK_ROLL, + &[ + ActionSource::Keyboard(KeyCode::E).into_binding_modifier(-1.0), + ActionSource::Keyboard(KeyCode::Q).into_binding_modifier(1.0), + ], + ) + .bind( + "Debug", + &[ActionSource::Keyboard(KeyCode::B).into_binding()], + ) + .finish(), + ) + .finish(); + + let world = game.world_mut(); + world.add_resource(action_handler); + game.with_plugin(InputActionPlugin); + }; + + Game::initialize() + .await + .with_plugin(lyra_engine::DefaultPlugins) + .with_plugin(setup_scene_plugin) + .with_plugin(action_handler_plugin) + //.with_plugin(camera_debug_plugin) + .with_plugin(FreeFlyCameraPlugin) + .run() + .await; +} + +fn setup_scene_plugin(game: &mut Game) { + let world = game.world_mut(); + let resman = world.get_resource_mut::(); + + /* let camera_gltf = resman + .request::("../assets/AntiqueCamera.glb") + .unwrap(); + + camera_gltf.wait_recurse_dependencies_load(); + let camera_mesh = &camera_gltf.data_ref().unwrap().scenes[0]; + drop(resman); + + world.spawn(( + camera_mesh.clone(), + WorldTransform::default(), + Transform::from_xyz(0.0, -5.0, -2.0), + )); */ + + let cube_gltf = resman + .request::("../assets/cube-texture-embedded.gltf") + .unwrap(); + + cube_gltf.wait_recurse_dependencies_load(); + let cube_mesh = &cube_gltf.data_ref().unwrap().scenes[0]; + + let platform_gltf = resman + .request::("../assets/wood-platform.glb") + .unwrap(); + + platform_gltf.wait_recurse_dependencies_load(); + let platform_mesh = &platform_gltf.data_ref().unwrap().scenes[0]; + + drop(resman); + + world.spawn(( + cube_mesh.clone(), + WorldTransform::default(), + Transform::from_xyz(0.0, -2.0, -5.0), + )); + + world.spawn(( + platform_mesh.clone(), + WorldTransform::default(), + Transform::from_xyz(0.0, -5.0, -5.0), + )); + + { + let mut light_tran = Transform::from_xyz(-5.5, 2.5, -3.0); + light_tran.scale = Vec3::new(0.5, 0.5, 0.5); + light_tran.rotate_x(math::Angle::Degrees(-45.0)); + light_tran.rotate_y(math::Angle::Degrees(-35.0)); + world.spawn(( + cube_mesh.clone(), + DirectionalLight { + enabled: true, + color: Vec3::new(1.0, 0.95, 0.9), + intensity: 1.0, + }, + light_tran, + )); + } + + let mut camera = CameraComponent::new_3d(); + camera.transform.translation += math::Vec3::new(0.0, 2.0, 10.5); + camera.transform.rotate_x(math::Angle::Degrees(-17.0)); + world.spawn((camera, FreeFlyCamera::default())); +} \ No newline at end of file