From 3692736a618186f2a3deb2459b65485b1b0af0b0 Mon Sep 17 00:00:00 2001 From: reo Date: Sat, 30 Aug 2025 12:55:42 +0300 Subject: [PATCH] wip --- Cargo.lock | 2 + asset/src/lib.rs | 14 ++- asset/src/model_manager.rs | 6 +- assets/models/monkey.bin | Bin 0 -> 68720 bytes assets/models/monkey.gltf | 104 +++++++++++++++++++++ assets/models/pink-monkey.bin | Bin 0 -> 68720 bytes assets/models/pink-monkey.gltf | 121 +++++++++++++++++++++++++ assets/models/tree.bin | Bin 0 -> 13584 bytes assets/models/tree.gltf | 140 +++++++++++++++++++++++++++++ assets/models/tree_texture.png | Bin 0 -> 845 bytes {platform => core}/src/context.rs | 2 + core/src/engine.rs | 28 ++---- core/src/lib.rs | 1 + core/src/system.rs | 3 +- ecs/src/components.rs | 2 + game/Cargo.toml | 4 +- game/src/main.rs | 24 ++++- glium_platform/src/assets.rs | 10 +-- glium_platform/src/platform.rs | 23 +++-- glium_platform/src/render/basic.rs | 5 +- platform/src/lib.rs | 1 + platform/src/platform.rs | 1 + 22 files changed, 447 insertions(+), 44 deletions(-) create mode 100644 assets/models/monkey.bin create mode 100644 assets/models/monkey.gltf create mode 100644 assets/models/pink-monkey.bin create mode 100644 assets/models/pink-monkey.gltf create mode 100644 assets/models/tree.bin create mode 100644 assets/models/tree.gltf create mode 100644 assets/models/tree_texture.png rename {platform => core}/src/context.rs (77%) diff --git a/Cargo.lock b/Cargo.lock index 308e9da..0c0aafe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1271,7 +1271,9 @@ name = "raidillon_game" version = "0.1.0" dependencies = [ "glam", + "raidillon_assets", "raidillon_core", + "raidillon_ecs", "raidillon_glium", "raidillon_platform", ] diff --git a/asset/src/lib.rs b/asset/src/lib.rs index f0349ac..617ced9 100644 --- a/asset/src/lib.rs +++ b/asset/src/lib.rs @@ -1,10 +1,22 @@ pub mod model_manager; + +use std::path::PathBuf; pub use crate::model_manager::{ModelManager, ModelManagerRef}; pub use crate::model_manager::ModelID; + #[macro_export] macro_rules! include_shader { ($path:expr) => { include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../assets/shaders/", $path)) }; -} \ No newline at end of file +} + +pub fn model_path(path: &str) -> PathBuf { + let manifest_dir = env!("CARGO_MANIFEST_DIR"); + PathBuf::from(manifest_dir) + .join("..") + .join("assets") + .join("models") + .join(path) +} diff --git a/asset/src/model_manager.rs b/asset/src/model_manager.rs index 4f1a9bb..2989a3b 100644 --- a/asset/src/model_manager.rs +++ b/asset/src/model_manager.rs @@ -4,14 +4,14 @@ use std::path::{Path, PathBuf}; use std::rc::Rc; pub type ModelManagerRef = Rc>>; -pub type ModelID = PathBuf; +pub type ModelID = &'static str; /// The asset manager trait of Raidillon. pub trait ModelManager: Any { /// Loads a gltf model to VRAM. - fn load_gltf(&mut self, path: &Path); + fn load_gltf(&mut self, id: ModelID, path: &Path); /// Unloads the loaded model from VRAM. - fn unload_model(&mut self, path: &Path); + fn unload_model(&mut self, id: ModelID); fn get_model(&self, id: &ModelID) -> Option<&dyn Any>; } diff --git a/assets/models/monkey.bin b/assets/models/monkey.bin new file mode 100644 index 0000000000000000000000000000000000000000..e7992f36d75135cc5966e2abe94e5937420da413 GIT binary patch literal 68720 zcmcJ21(+2#+xBD>cXxN!1@d z-%oPz6dDE2$6z%ie|`QW2T!3<;CxL!3jY53{7LR1y#nWJGXD<#`YbrqjgDskJwHzp z07l`U7x{>D9na4LsKg`d2K5U3F?e(Tvf!`8U8Gmw&m#RRfWH!t^bG11_)YL%4~frD zB@UiKufT)XQ1Gt-{z@D?_xXASJ|48ZKXt%giG!!mEAUR>&5tklSK{C)^a`B!IYXqs z5(iJASKxfid4K9fj{pC24t)@w|35hN{V`m#{rU4r4t)?B1Q#6m(DKCp{u|x_JmPr&`lxVzEol;|SK-rO4%ds+tMEfG&f6gIzfbX6FlPK% z@O~(9&9(JEAZ$0UnLHnLa)Hz zf;V4-3qVrhF48OT<=|fyyh9-=aqtv+1)c%?`89{vQR3h!^a?x-)^a{BrNLi`!(0}6 z1)c-E&qCsRcqI;f7J3D)f%gJP{GL&XgQw6daDENi2V>+v6Zj+tPoYuZ`@laeRMUz; z|CKm+3cUj7$BG|Ueh;X`xu>sJ;QYKT4Q*rtRN@}eEATAfJ15d#iG!!mD{#Ix@Nv%t zsKmij=oR>7@V*9#pOZ@5MS2Au2HuY$@%2H8gQw6daDELf2j7#gZ!&%j=1WMV=CgSO zs{5Io-y1c6cKLNfiG#n;D{y`uv;qG@;IG8NQ|J{qAJ2B+&#z6Yyb>I<(vf=1`JTkT zFZ;jcr{Vjii1bn7@EwI-fol|=JNW%q;h+_I1-=>jKNEC(96p;v|3%%;}l!iKd zjaA~%N1<2X>A<%Yd^f(nDsd0#6?jSTtp(qKuYXD$JcV9?^W(7({Br;*aqtv+1pQsUq#^a`A> z75v)P2>g{eoGU`Fz%}qb4Z2$3|6g(VF2d)(;EkX^H=#bi?kI843cUgk1OFo4zjIlM zgQw6d@bTbZ2mJY-M~Q={&@1p>;NJ!OGl9Pn2T!3_;QT(KN2I?J2T!3_;QU(L2mJXt zrpimhIl$K+{`cQ-KA*}(`h1G72JJIQd`(s2@ZE)8f%CCV0EzE6lsI?_y#kK`-uyfA zy{i%jPoY=fkKvdU@c!MqDsfn2gkFJ%gFip7`S>Vt@DzFl&gYV^SLLgrKYTv$zfbXf z(EmxGuLOD}4t*AS12A4mSZlsNbZy#fyh z|1j|9zoSVx_y~=J^D&

7&BOP-qYI{Moe<2d&U6@EqVj2y}d3p~OKe^a?x#{CR)4 zzY+(n&?|6$tq%hoA0H(STA^3q{1~kKTD*4v>bdy zzJ!+spC;hL_n%4}e1u+s^Ra3c>94{Izdhx7_O z8Tifw{{nzY96W_yfhPgqO5mRlP>F-5&@1p~;LV>4@Mqvk+(mi?z7PDvz@P7Xl{k0` zy#nt9{@1{tpT9~RJcV9?hk*YaNZenEgQw6d@J8Ux$A$YVaqtv+1#!a*bQ5sv}-^`PhHV-yY=k&pOU&>n@v??a<-7v&?) z+dKiO9O$EP(1?7*d7GypasMbBG$J4ITA(cusgJ@zBk~dFbD&eCJ_-ko$VZ%?TlYbq z2Kw{aJOb7IOwRkp_de+$NjdaWXe6AEAz#Z=K$3E(D>M@R3Vir{;_0(Fc#688$@#pz z18u*Bq{Ka>SK!sa|1@~>W30r%Q|J{q-)H0iZ@x|_aqtv+1)d80`5!+Ql{k0`y#l|+ z`wnyWG2mx&7uEet&imK_zS~S_SCtO~eK_=$|Ecgw(5F0+W1zzCgT8cRe^mGo@aFT1 z|EcgApx+#+SK*03zdTZ}!e6=nuED%NpW;o}zt`7Rfq#F?=>_flM-F`v8U@}A{CVH` zZm#5(3YtCnVio9e*P4JdP*GnC-e$D6uuW9%V}`DKAS_I zMBUHi{JNq+|8hY3Yz}RSx}VAUeY*z#-taQCtHim#uUFvf>A&+m7ig6@^n;%tLA?U! z=gKzFod#6mpcQ%r9s<5+K{p0aiGxOM#2+7{j%V*7f^|VkI*Y{4SZvP|4u+94xU1Oey`G1G15%?={@DzFl&eu%-w-@}CICu)Z z0_W${KA4|;zof*$Q|J{qU(>?qzy3-bJcV9?e+&M6K3s$TD{=4?dIiqc%+27x6a1Ap zcnZA&Zv_5)J>m05iG!!mEAR&3UjY0kfxi+5PoY=fWx=1%2kx)L!BglJINw9^-@CcL zl!K4ZNH`x`{%=mXj}iwTp;zFwxIe4|++T@vPhYRV`Mogz<7=xD2T!3_;3448*QEl` z|Ig;&FY10Shjuf-@hu(M?q_jmOXxq7^Lw{i^xyMNiG#n;EAV#UKM4HC!}n6+;3@Pf z9Q=EM|ME!xPjc`S8U^mpVeT*G;KS!|P$S_@*uUoy*C=uB6Z)@b69vxqB;hcBxW5ty zPoY=f<-mVmq`#DdkI+asUvmo3fBUJ#!AIy7INuwr2LH1#4oVz6gk3+cnZA&9}E8c?;`jsaqtv+1K;@~Ot z3VaIqHv<2o;4kIiBQz2|5qu^^`Y3Vm5qbsA?-8znKVN5*ICu)Z0uKlO$KcPO>nd^3 z3B3Z}1paftUjwa_Lz&P>_-gQJ1?OW7C|Ba36M6;CuW_3r{=Hr(aqtv+1zrXGH8_TR zy;9=fDf9}QzngRj#+jclN*p|e{*(M*`Z{z~qB`EuNin=HYwo0z%In^!e3jU$Qn^^u z1=ZcPIYQXDwbj_OZCl+#vtPTQcah#jdJpM6UynW0cxP$F6ji;SPu!r`KVkiPY+9fB zZu6v%Dd>eK=v|~2{-F1KJ@&*txUNjUG3M9quvQJd_SYU!;MC{1uB`vX^DK#olQfpM zb8!QPeIP%8@`b1Dd&$Nh`@b%6(H(K2qSxrgJs0~!KK1iu$3^B7k?66TXH^Av?CfT2 zO|4qq_^-FP$C5pi`h%V#Jwy6v#{v60Rmyv*7p`-+yRjJVKOS@J4|?Y7@z`P?To>yn zbt>n@NWY4)Z#FZ^*o-Net_&`Mv>cN>~AnGfzK=qb{FmOmczM9=GZWzwvm zM+QH1W&WTSV-9-e>z_0|5Rvfbglv;mn?=qO#^(wCF4!OR0i@^i$JdMRBJ*GJI?SC= zsy1uB#$?zZj}`U@Jw?7+x__)YN_(z_pnS9wNdp9lo^&DSEWPQdypcmH>S)Wz>@ih^Tzsw)>;+hD0G5#}7oS-D%h=|Kc zyRiH>Ptckby9B<@)+Nd{7yEhgU>aNgo}vHy$NBO;c)KO35?%ZMmz9bVr+ z6F?fVzTq_uw|jNQh=^W4|G8J|FoI!!+4>Cn0Md)LWb5<7ar*;TZ(65TajZD zyr$!}uz%!O`5LkQgJ*>AiT&|d;bT24^Fn%XVPSX0pq@-N-*DgXIN<)^vBiDB^@<7+AIGaf5ECb$og^VY8`+Ld|Yalq%Y%m<%$_*`Ch&S9%z{mrNk zbKj3k#s=q)$2da1hw?o?|Jyi}F0c2cYxV8Remn6aZB^=uJG4{HU>&4!k;X+D;RE*& zk$+)qQHNZm4m24XF|W@E&iDAdN{SiuV!Fg$&D`Z!zjhaB=R&Q$duiKJ$ahh`>*uE# zoSiL7nu>)C|BLo6(uN%}chF+`0t)#a%J=;ITZ!A#H662iJIoU7R*?mC+uh#Y+{=Fl zAm2s#uAg6QXjXbLQ-JQsJ&2Ew7&pjwQN9?r-xB2ulquDPRqTI~;=1$uccP=7CSqGV zR%W1yKpNo#8rRpHoT}6GeFw7<69ew^<6GzwmV#AjRlG5n2BFz3h zJgkR&7v)E*zi}ag)~)lzO**ZbhxL%}`uWGnRC;-KU$5wK!)=muG2N56o;P^zLl^R0 zl<)faTAdA6PF|nt628j~}Q#q%-^R(t0|1cn`Ngx2~*v zvADEm?Y%DOJ*4-L-a~rN*AF~bj_oX6Gh$=z%nY}MJ-?aKgH1h|jb3`Q!UesD^r9`$ z3s2B{zJ7i3X+_d0a{lj3%Gp*Z8n-^}yzFfB0J-ULh!Cz)&UnWh&aJ$$a^e)nSNH5xzc{W*K4NbGKA!I* z+hbtQSNjgRa~9@~=$En^Z%cSWKK1j#C)#~Tng#o4_?rQNEZ=owEqcdtPZgU$?-uOG zmgJA));V6+@ zK3yF#q-G9p;~vI<2Yim(g1RoMEBvq2{)!eEorV>w&KUL&U9>bJe~B30(jOagPvH;w z0hBM=0v{Loh_+Td$WBMD+ezEU>B=&^Z%tRGf9y7Y(1gj(HGFUEp}AIm?S`D{#9kC%MQ`k}+!)JyGEz0I+c>P6dm&;VJn#4a!gxOQ z^YOkKd|c$?`aWSlP+D_TA}?d_Y7Do9{Ttq&=q9{-CZf)zeo_1(pZfXW<02o?)?aI8 z1S-`pc!yELEOIh5nMzm&F51I(1agiokpQJJSvL6a}rCBF5b-(J_64F&S z@qm^L{6$^Jrzl^vi`xPp&-ZCv=6Cu&x#`}b?O4UqwOOUuiM_h9iblxV!v0X#MRh$? zSNJz3^Ju;z)dPD@^^I~5C~J3g-&T9SOW8GWV)6(EJk;ml<02n%&nW8yzE8pHEnd&@ z9uoB8J_WD0___dkv4_N-c#XxLc)y1|@fwajK`-`ucwNQ*c#ntuWox)>KMCukSYvTp zcwdLx!s{w-3-n@NhugybvV9|7V`XbN)Qxrzi9PXN@pIR3><>O-4~f@p?2q?;xGlVg z#McY(5o@^2A72-+Ki=$V}FMLknX99R{CR?xY z-VCoTc+JG;CO#jbE%7`7uQLgLUO*#~{JJ;pyuMNH_wlm@yq zCcfXt&la#J=*9I>_G|%PE3rSm$H#5SuD`Np3;0@z@8xm3xGjAB1--bJ$L->_@O2a4 zM6oExfnH`%=(HAiZcy#b5Rtf$TR0S-Xdd#|-q?b<+K@96VoJ z76?rGyBp2_!ytxzKofy95lAC`r@(dbIN*L_PtXe=JPtA+Jf5<;_;|^_mux=BzN2hD zV1L;h#-6fyEAx@n#n<#DNn5cL$4AqJ)6Yct?VzjCgS|){PG2Uf=;CWS=slztza4X1^eTD4&K|~Jq*4#!EMR*Ex0Y&_rm)Y>@WLXxX*YTaR2ddH@Kg89B`jOFMhkh z_sGpYWTe^R^kwh<{F>r>WXN|vm5=Y)UyUm0{aLLjd-m4hKH~lz`{QQ?pl7~b_M8EG z!nFt9OZ@i_Ki`mfM!rWKtPtgS3;N9ww=47i$S2z0C~KsB7TRs`95*rT7v(oi$lr_d z#c!Hezj{(Ex;euZclYq_QR?FU;67kasOzG-!XJCe#t@G`_Q#&Ge&V@-{qeEJ{<1z} ze_R*qaa(=2Rbr_RKL|K!(y+94ZPsJ^tcX4f60y(S=YWrgd_3RhdFu~!!v=>XnwFp8 zw(#BwKcmKbC&(9jGw^Ydk7x_;Gx6SX%>AkK`I4{PV_mwjEZIi6oA+n)@)^ZBr#{E~ zOuV;*x~^Xr`(w|GGgr~`)z7(&(>0Frdx7j3CiaB7u3s1T89#%~_u=f`M|~T4na0J4 z(tpSgMfu{p;Qr(1z1R~!H^%+u}G#~s(j8kKp7H7e)D=bopZyKZ1TUWf5IgV$u)8Y^2ru^#(> zxxb z!v6R>f{%-Q#QPPvUHndntX((!EUj^;JzLQ-iHqOakokk&MSAhh3HHJ7nap1^gl&vn zg`U4yK7jqP4}Q-C^q#NB@623WR+m-#j(90&4xuuC{LT#MJ){@!$zXr{&d(Q%Zqi?? zHuqjl?nY(p;&*;P?;^c;=Lffo-&q=|kE0bE-gck$Y{K6i67MYGb}v;*&1SqSBt7= z^W4M>YrE~c_hH+$y@4vr7gBs);5h?&59vLm7v}}`T%WWvt3i&t&zC-q!2X*fhOh=n zzo7kEkBcbZXeb-MC&c|Fai0k64|P3MSF{CnJyh58>ppxEihw_m;@*~y!&&xOA41b){4Jtcu1a2&(dpT?)=NTxGoOQxhkQKb z;~^i<_mRE(+OXa`x}^H=^snuuy?;_^?BLF+ZmD&(qrBq^@5+jIVnOdBz31zbO>^n- zh26a712zQk`KX-@VP77~=gppbJ3@9$p{|SSiZuc1dZ?~gi}3hws#XltmikhSc6{d7`&sszeYE2_mOX1$fqcu`uX7LB2Upb+#lSo?3m)VfJf^u zJC68x;q~F&^!K#Och}t$HJS8y;dKM_F4BwR_55XNcJ9j8pYOO`>@QmfaJ$%l%7|?A)$}!?YbOlzWbXqXH|Fi# z^st3n@bq90c&N{zu8Zo5_l@zpyVxK1S@v!-_QZY0|%;u_qoM*>wt!kF5W)YZ)FZydQWzrWDI(W%e!( z9w2>=jproZ4?tZH)fMv}Kg-4Q6Yo`UAEG=fM(_6H{RwUt`{U=svV9SL<}BO)U?2Q% z7VvpmEq5_Cs$*gAtD@Bdc--*#;D6VEuia4BLv_Wt;qk%k;=K@Vw|vSi{@7Eteqw*T$HV`Y1Yb{U^vuGNJf|#Bzle+XezNN+=sjOA z+fQQ8!k3G)gopF8!1^>)w$H?#p!bkI+Wjr|yp$=xcD6W9d$fqnus{AcIM@^Pp0CIE zYk2>R@1d|izAwZ6_#O)TXS^3mPo*isl5NV*@O=~Bzv2BM=v|~2_g|nFdp3MugZ*)z zaa*|m*dO;9-=oR;pW8{z{u)z}m0FdB%Ell2gWf}WaZFYG@%Z5Vt;`>f58l(_KF^3< zgxx8Xk5wsI$Hks_AB+18dJpNvJ{k04zl#0woX2h9vBLg%&f~W5T$P=tcpr}2!uwwA z4|=iR#%;-b@R-Qz;&H(J#QSsEy#wwi=*4~y^wHiU;C-xYZ;9K&YbM?&%l4VLUA%tY z+y6_T_nCCG?dYKl&l!B5g~v*E9|S%T$Vbd2@DcZ1cs%hv0=`ed*JykV!q-08eG0x_ z`b@u>`9k(f)*66mYm2Sh5%`#j(hLBHDzPPW% z;|V^l?~`hv8)zJFxYz&6@`z(i(z7JD=et*?hp^ARw*sFCc{t*j` zw_)qDYHaoV=AN6t2*vGUAJDrCRGa8R5R)GKqrT zMfzy{LGK~G@E^p+&`t3#2D+c?&t6<=z<&NU7R&idstB1s=v}1ukY4y>&%KB5(##9< z(~w~;qxh%I)!W^Fswb;HZHx_{gJ9L8&l@Cn>=$ohJ8TqBE9H8=sjPL$4BPBrn~Kh&f4MbI9;9rXFkW{ zBWnxKAKVu9ECT=Dcf`CdH19<{ia+EtKOfI4+%ERV^Yg~U@ouGU_1Lz!|4{4?`4r_x z>yOWiZ`$9c3%BNA?<=Q@GXL>8h1*X6Q1ba_68=Z|b11HFgzV*X&C`fJj&8vBcQFTY<$ zv1k3_rP!-5_&4+E%Tw$FdJpM^C+Iz2FB_kd@Nbu=g^pkglP(O@YSBL8q&b4UT{Iy8 z`JpI3;OEQ63XeJV!N;`cp#y?=GVWbNh;faqmXqd0T$6e-w=j75M^}RD4`_i1w z2Uq5a&jrvkUoSh4E)=Zqy@;)QX)3mMu|Gb4u_x#m(hL8Qk0#QVU$*nculb(h^#Qkw z+rs|X6MS6cBi1FEzickad}MP8&;RTPlCb8De{o++W5IT{#^s~p0AhnAGeGBRn~m`U2uPJyRzeg=M4TG2lqjC zjPU%CeP4WD$lAi^9X>B){<8B9pUe1KgU>Oe z*DQRU0=0sa51Cuq-% z_sMwv*c1EUal_+-#{v6ePdq;FQ-sqY zaoo_1$@?e7eeha=J#k&U&R`$eIw|wSYZo2|>>o1g3pa81ANHmx zHq?_nWBKOinBMux8TQ87+0X+$MSAgU2S0lOJ@fSma{NSR-}yE4oZiL5&!A-O%KX8{ zMLyzrk<1@I?wP$i~VKq4(0A%pN;zNFqPr{!_8T(*QWzAyjr_zu)Yj= zy~pXog7u@rT4`CZzK>kL@0Y%zKDJI#i5;jnpJLQjRtxaY9QW+1#rn-&PyZ91ZoV$4 ziw;X&ZO8`vv77!UJU!uNfR{&yyr1>nZ>KWk-)_rG)rj-L$qxL!;~gX0?=R@~S&IDRtZ zwiw>8S>J_XnLtcOUj=I76(P80U!-DmF;qA(h`%lTTE9f5` zR@52>zrPH5ecu272Ko5%`u{h`zZd`B{|Wi==jG8M|6aWRGUWX#@XeLr^)EVvfBedB zyiLph+h9`caVbZzTouc=fpZ@GKE|%!!?g(VWtjC;jbOP9%f0LrERPN=l&ejjPSu0u zcgrPWk2Y3i`18rkbyMvya;{bYuIc^khD^{%28ufA+C&wF>N5i7%Ot#ZGmg{Iic4ODALTp4VkE^hW$b zdASVfsRZnPk2Xw(W7_^sdASTT^^VPm*M-S2BJEwu%Vqdoml!N$Sq~<|g}EM4UM|BJ zCmfctQBNkrzdJsryj+I0t6S{as9sElE!sb)yj+HSo~BR4|9`#FWB$$=Sc)B0m<*TX z^(Zfw;hiPfSPJ-mN64_i-Yt}u%P{lk0&GtHQcQ-sUoWD(T!y1U^Ru_`o23ljja@={ zxeVj}o|_G?or}rv))%WOFPGtFBQx8cJR_6gl2^MZFPGtwys4PGI~9{*pXJ9XFPC9; zFA3A$r(`nhIPyH@C z8=9ZVaOpc_5_y!#aM8BYl$Xn}Kv)_!t!5~b zVfcr`l$Xo!(dvvWZr$Qch8Z{RrMz5*gSKX3uM-w#GK@cWH|6D0JePrmhZJD(C3vI0 zOL@5r!}6wPZ`bBwG9)XGQC=>?B!MI>RpMMsh8MoNKzX?g`MNe~;lI~YjN8&0tVrTc z>{B@V&}(=fq!arTW;G4AtZ7#!!yPYQQ(i8^n=WC8wsvDO3>o#7@^TsS?^!*6_ux7% z!vZ6!2g`kI`4impLOm7i8Q*60QdMU%%yj)J<>fMb=Q`}S-)b`%+M^y*UM|D&c`f$i zZ}r)y@bU8Jld^vla+$X0Kqyj+H*lc#0h&&$eW zIP%O7l$XmeZkiPA{nHFghJPOUiSlw8RydiM?e3O=$*^zxiP#+x@n~|KwIhu>faOSV4DKD2{Lpv_hu7xle)_Ho1 z@^Tp-&mEgBzg2|Eu=DD>l$XnpO*Yu@bRC%tN8NfwdAST5uQXV^i_Mt~YixZ*dASVv zaY!>Co-O3FDNgUVU76~tNc}MCc}2eo>5*d!xooJ zRwG*tCd2YoUr=5y!*r>1mUwt|Cc__&zoEQbhJ0LFHQ@jMcs0CLMrU2z8th{%I_wSQ z`5z;@ZLlryPQk}Gy6`K?^FPL<^-OlSS8XQ4^9^58UM|Cu0}a@-)?pvxq=c_2&;J`VJ})VV>0x1U7);NhLvi^W&;k?Wiss5{4V9?GVC-n7W=wUBPPQF z7yhEWT!s^CCS}zoG-5Km+v*(U0}2QC=>?$-{Iu z>q!?T!`t>7%FAUqZi3Eg9qzy9B>qbePN|EaB14OonGizNNfe zhJ&^d_RWSa>|=~S`z_`9ALHTc8cS58E0baW(D#&=%aDJcY`wY$zfW|SID34ya8wZ{ z!(YFzt3t@ZtU6C@+^`+6+nH z_rwCs$HU$Q%0K(a4kcpw8WmzbjvRQ2^3Oh=nwXgVk*PQw-+!^)or{!z_OU-n&i<(o z!hB5n?hNIheVm*lCA&7RIP>xL#*>tP_OV6V)a>^@MVXIZlsHEDXCJ?snVRiBSD5+u z{QObMKl`{hb85z>6kLao2%)(4Rlbt2}x&-_E&m8RI&qFWFp}hRcy-AdpfBd;t ztzs;^M1Cg2mMv#cUM|D>aIbT#b%4pRLHpU1m&>qBg*>cWj|xnN!~3qHyj+G0UuI?p zQdDQ3!XpWGQm*?H?rYqEoi3e(`S`Bj$pHWCS(i~+n2%kOgk@C+zwvCa2(f)&&k0l;?lz;ZIPvLUxQvGsFh9QM|QeG~@3Z*Nv z&6~=zPvM{Mn^3O%6yB|zkqsO32OU(V7JCl&4-mN&Aa^0tJ*!GGn-LiV@W9;$zG_6$V7wTidESrL# zeT<*0HRbg_#&kbaXT$Q=W1X+ttliyv^yAO-wzs1^f5N>=l?_F^An;P3mC=YNdFyT@bs$Mt72{3h!S%FAW= zlBR^~e{Uwk#G_8aexNs#;mxNu{BG2j$*_2eC-A#bUnaw$7t*jHN1DTRWP0NqM;pA0Ma#->n0aVVP$|C@+`cN!pRcOCDe{oEP(OfS1d#>de-x z$!`Ui4A(V(8sOzJ%$cQQW3RnS-Epu)S>W3VuOu7DJOkovd$NDs3 zpTeJ>FQi=eDNOvd9J>+&{$Gj`++MgF<>fMreeMAb%auLg`Zm|thxj(<;Ocw*Q<%FAV#b524w$6HEexbRX5%FAUqK2JJ!^v9`GhUq3a zl$Xn}MWXz0&p3$6aO#b50bVY{v*n7ju#-Ord@P%_BpcRx9`$i|!H7`)dB@^70j~4W z&;L19V#dec$DU_PvYB=EQ6FPfTNTPb`}pFg!ol(P@#d1)tWvA{0U2)ETAT8687BBE z6+7`=8Y;sN-z1^DT!vR)rDEX+n^76=Z)gVWm&MYST4iF?Vi!i!>$BmIBD0!V7UxKy1t@$+NGm1 z?6hTEuv~@*@;|4ercb3Zyz=1dV7Ux)^)%SCwPUFaXASQ|dAST%jEx2FKlh_DT$iB% z<>fN`$&JUxENDn&Xp}BbdASV79*xUFx)-A|%$Bk;<>fNGP|IdnI%cFYy!o;N<>fNW z5a%rIROEHwWBj9kb++bmH5Qg|eX#sv9F(I9<>hbRU7|5|)}k_8mVQOBT!!1GU8F}V z4y7`@H)&O{T!!yPU7^K}jHDmq(s@gR`5)t7=4Bf1$=6hd+fytLmdkK(<{R|V^lzvP zv;VUoST4gRdCIfvv1>9J&Z*Ir@^Tq=+zr2WRA?qeMB zrU~VGA6KV4MtdZkNk7IjnX9ml@NX}CeD!`uQ1>xL^lC`C&d0mMj?!=zpg!&@R*mhu zTb=p1BmDbdxsPeG)}*}L$7y43(eNaBsSM-Kofj;Z;=+ft)q+Yiz67U-O%ImKFwv5` zwDgtn^kbYn?Au`e$GD-!Z91g!Xez@er{)IBW!U8D4Vq!ZU@F7%xfTS=Wte~2HCk_D zFZwa|8nQT;|1lnHe~X^}qB)h}6D*hElt%aHi8x)U3={q^GgvOe z5lbG?S{nyb8DfMLzCRaxReUFv;modU1H4>@3yS1r)eeSJ87?~WZGe}{a8I1v%kOzW);*1{l$X`Qq& z+Lziuhy%4AT4!yfHXh=5t)2F@_LbHXVo$B3Hd^~en*?!^HbI-BeXEUwI8K|W4bkRm z(;-gRMrpIOh1zh4!?m&6d~K+<4&pj(nYKwAp)H2ESX-qH(t2s%LHtfzt?keTXu}{5 z)7EQ!wc6Tlh`Y6|T7*_#>kqNNwoR+6Rn-ncJgDu_j%YQth7cQSu2x0MtsRGWTsxqh z((-FHAlA?hYdN*d+6{;|v>&ybT2?JD#Jt)`Ed%@jcL(Af?YeefGqr3GvuU?ALz|~9 zg}79^r>)c$X%0k3d!(J!{?fv=<=R8-ckK`DuJ(&|MSGzAsh!r2YS*+|+E3ag?Yy>6 zJEon`4rv#)3)(JizxIQ+SNl~vqixo9YM!=T`%U{jWjHNCMuob)4&^?sz5KA41& zCJ>wGb@f*I81f})rGH5p>7&Sa(iUP{y{X<=pF+lx&iYu=TAx6sl5P;Y>Fx9$`V2CW z^w1}g4*GO5m-L6&U+=CD)EAOjWS~Ba^wj5&r`l_64tcHh(_d(RYYWH=NCWh6a+h?4 z*j4YV_tqbhm87@6k_^`GkO;jE#5Q^ty_0@Ge?U4x>ZM;N&GhyV+v}d*QE#E&ARQs? z(=Ub@U6Qp!H{GC4xZ>Q(h4q^f?J z)YL2J#~~gkXURTNO8-LNN50UHl8QRh4?#RcPLS_OVZEgOJt?VsgzClhy%6`3gJcsK zsu$5Wks|s|5~7dMcR<`hBFJX)gT6!GOm^sB>Ra`r`c|?PQkcG&^wFPdi^+3sHF>2C z(pNxSK{k?AFf2_x(-p-m+H^RI}#2tT>n;It{eJ4WI3dH z`Z)cHeh%U}eTsfbzoAcrI8pybe@M!(1 zdPYdO^{4tjdNzpJ^n!Xy{e%7z;!8b~{zf;9^bphQ+4V%aX}pE_R!^a8Ml2&K#H4yU zJ)v$A$4ICB{@lMNbxHY1&p)5vGUhZx_;WF*s5>m&4JkiOSP>1p-E5EJX$^i+CgeK@32#&A8< z$fA$bv*>9cX3%r#WsD4vLX7f80X?f;-pHy4j2!x9eXO1XQfcFB{SQ5#{xzg>MjleY zC=0QyF+s0j6fp{r3Xmr21&vBZ38NsSFAQo_Gm1hiYE(3`l3{vDh$W3G1~b0Wa}s9c zBsGkuYJXlS%B z216Wdj5LNCZH%T6n;N5ymPSXTFT}pa5Tl>b*=P%~tuf4KZ`h&X;jJ^9mEO4g8@5N{d}jN8UKvYgyDmXk-u5q%4}0`ZD5 z%eZQ6CqL>}jUV;d#&={lIS28aaoM>=C81!Eie-PlF;lOG}eX#8TFHhv&3Ic>P) zSK|QrksO40&^T@!Gft7iRk$@t2Q=gBVPJlSttB-h9~i0h0k#&^bTa)o?nTp>G+tHjmkL!57{HNuU9`YjS}+#;Ke zz51VIDa575JY$t{pX}FH8T<9c#$RL!xexKavBG$0EF<^GL*pJ~9XBN@bGW-2p30oQYJH_IoFtGWHhH4SzIAX zP*TSnN~)NBNEgxwVk5Jb+05)g29Rdv08-EFNLrIt5L=lI%ywpb(v`F`yOJhmOVXHh zg4oGyVRkp0leVP0*_O01$D5PPYY?xQj&;+VVt#GjgcRHQ%A8=vfEdHltT@(0bDSB+ z8fRM8NOO$&-W&-jzGYZr&C#Y|jW&~5RY_eEW>$q1&l+XcCpF0^vnEMweL<>`1P~Kg zugs)YEmDyrwJMUgCM6ZfYlyGSzsz@L6;hVGGs}`kW-$^VcOl+2pPCQNGNdGVXqF@| z%{%4?)3)wFdThqBOzQ!}2j(;Lp81cN(7FeSSc$AR=6y4fb>Gyji{{^EOo%b9Kg_t+ zbMrF9%jRt}A1O+nKzw3eGGCY_NFnmVEJS`c3mYk|OjcndlU3QsW~H-=Lo9AoH}aBS z%@kH%lENxvq_wV?1xZ?~ASq^KBUO#eRyLB^%4KD@Y8tsnb}JXjYh@-mtPW;o(!p#< zx|+GI>=3h)rX&qHW0tYfkTTX_v%GcAOh?LF>BvxXkXhO)VGS}%SQ$vbDrXHb1CTP2 z^d!W}XQe0ktYKzhE7ZzJ3PT!here{nu0yHI=tCH2Ibo(HOv}pjkLx? z9B)mtCRtxuUqbxSnrVGwO|X_gTw=|)mRpmpZy|nbEw+}MYpi(?=UL&_B5Q-S)?5T> znYGcZV$Fd#$69GEuxeOa%mt9vT2-w&)^v!|t-01LtASM$VohtIRo7}_4S_hsnqdvM zT38JsHne72O|7<8UxkG4k6`!=W z8bfSs^){PZ?X5(lIi$X34zqw+9Aa^^v{}L|Z03QO$1G!JGegZ*RyIg+Njs~oncr+@ zzlJ7^|Zb*=b57*jStuv=W+HV!GN?NBNp0a+h zezvGp6k<{9M{ApTz&Z)>q~)1stRvPgh`Y?gW=pfPdC+PJX}fvU>S4Bp*w)-_b}=(r z$*eABGV73)+RAG6G*d%5W+k@@T8FLURxvA$)zQppWw5eXd8}^cGV@3CJ8K!F)z%K{ zCv%Ot!&+mmw>Fuptj!QNTfdmwt##H`h+EAIrfZ(CHd?N^(K>2wwN6_WcxX_m6S zu(nvGApK;0Z&kDyL}vYB{cLWs%32kyZPt0yw9i=q+q46A9J`GDn-vRUEIWa1+41aT z5R=*OtkiZQJGPw~l5W4XlGte>rnR42neCJ|u`@$@Z9TKn*jemnRu=odmCMd#zk>M6 zdTc$gvf6p=2UcGDmQ~2kZT}7NZ|ko0raUER(D zsiR(1}EIqU*d0%8k0yWPg_Y-fa+(avcn zw|m&_Ahxs9*`4fOb_$3o>LPG!SCMYk(JtY8nctJq)I zi6JJohuS;LedacZ+w8UWZu^M2$J}l2F*n-#&EKu!5R2P8>=65!b%huJPf*ScgCv8&lj?IMu2*sJV1b_s|j z?49;}JHp-yajU(|-en)K7eicZueK-Kd+m7;=h?IDMfQGsI>hPr9DAI7#C9RN_Eh_z zecYZ1aiTrL{?a~dkAXPGK4p)$f3!zJ9BKb-Q+v4m6U3kFa`rFwD7!4gvUVkVfqBdx z0da)A+Zt`3w3nEpA?>r~n(J-Po@;vcQTvd+*(U~jkg*+1BO?C~XCVD*6X$FD9K>_>75giDiv0rO3;V78+Wy9#0C9q? zIg{*}_CtFTr04b%d$v6d;xzk}{jI&wz76rV{m8y&FR|xBoNGU|7ud_~-y!~P-?DGm zYwU1{;r3tl3cH4#+gSnWs-4fNWv_&|(!OpFu*=&;oB@z5C&a0253xg>A$Clso88aW zA?i*n$94wUeQew5W5;(o*gfsI5aT*YoOn)eyNeyq>0&2yTG}1$q!5!jX`SRwSG%p9 z+-Ym4cN*Hw?KBY6I9Z)^PHVe~oz7`uXLoAa_3bPWvp9L2Y)&J)ww=wXZRd9$*f;I6 z5X(BHoQlp}`)|9V^S8~Mfb)e@6=GGVo>SAQF1bEA*UI{W=Np)>$0^7;v(l;XSwr-b;nxn+_4ro53SqQY>2a+sm?;@FYAf5(0O9bbY5DItZ5LZ zIbS=ooTt_sYnJoIn(Vx{URV<#PH;v#lbnAn!=B_A_BhA3KUkw7j&=q+Upbl`!~V*N zVSnkIw;X#2#39ZqXSfs7zGw}1E?R4yq0U@q3B)DNYG;`<-x&dMgtN{W6j=ZO literal 0 HcmV?d00001 diff --git a/assets/models/monkey.gltf b/assets/models/monkey.gltf new file mode 100644 index 0000000..d3e2438 --- /dev/null +++ b/assets/models/monkey.gltf @@ -0,0 +1,104 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.4.56", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Suzanne" + } + ], + "meshes":[ + { + "name":"Suzanne", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1966, + "max":[ + 1.3671875, + 0.984375, + 0.8515625 + ], + "min":[ + -1.3671875, + -0.984375, + -0.8515625 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1966, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1966, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":2904, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":23592, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":23592, + "byteOffset":23592, + "target":34962 + }, + { + "buffer":0, + "byteLength":15728, + "byteOffset":47184, + "target":34962 + }, + { + "buffer":0, + "byteLength":5808, + "byteOffset":62912, + "target":34963 + } + ], + "buffers":[ + { + "byteLength":68720, + "uri":"monkey.bin" + } + ] +} diff --git a/assets/models/pink-monkey.bin b/assets/models/pink-monkey.bin new file mode 100644 index 0000000000000000000000000000000000000000..2db45966ba391e44f67a7dcc92cd338340566448 GIT binary patch literal 68720 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 avGu<>G5hAoEVHk!#K);QG(HZ^t^5H`4fe$V literal 0 HcmV?d00001 diff --git a/assets/models/pink-monkey.gltf b/assets/models/pink-monkey.gltf new file mode 100644 index 0000000..a27e895 --- /dev/null +++ b/assets/models/pink-monkey.gltf @@ -0,0 +1,121 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Suzanne" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Material.001", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.8002749681472778, + 0, + 0.07706787437200546, + 1 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Suzanne", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1966, + "max":[ + 1.3671875, + 0.984375, + 0.8515625 + ], + "min":[ + -1.3671875, + -0.984375, + -0.8515625 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1966, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1966, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":2904, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":23592, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":23592, + "byteOffset":23592, + "target":34962 + }, + { + "buffer":0, + "byteLength":15728, + "byteOffset":47184, + "target":34962 + }, + { + "buffer":0, + "byteLength":5808, + "byteOffset":62912, + "target":34963 + } + ], + "buffers":[ + { + "byteLength":68720, + "uri":"pink-monkey.bin" + } + ] +} diff --git a/assets/models/tree.bin b/assets/models/tree.bin new file mode 100644 index 0000000000000000000000000000000000000000..e7826210d4c2a288d9825d6987ca7d963ef294b5 GIT binary patch literal 13584 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 A3jhEB literal 0 HcmV?d00001 diff --git a/assets/models/tree.gltf b/assets/models/tree.gltf new file mode 100644 index 0000000..51bf9ed --- /dev/null +++ b/assets/models/tree.gltf @@ -0,0 +1,140 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.4.56", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"tree01", + "scale":[ + 0.009999999776482582, + 0.009999999776482582, + 0.009999999776482582 + ] + } + ], + "materials":[ + { + "name":"Mat", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0 + } + } + ], + "meshes":[ + { + "name":"tree01_1", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"tree_texture", + "uri":"tree_texture.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":395, + "max":[ + 123.4296646118164, + 509.0864562988281, + 168.36563110351562 + ], + "min":[ + -184.9799346923828, + 0, + -155.37196350097656 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":395, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":395, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":471, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4740, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4740, + "byteOffset":4740, + "target":34962 + }, + { + "buffer":0, + "byteLength":3160, + "byteOffset":9480, + "target":34962 + }, + { + "buffer":0, + "byteLength":942, + "byteOffset":12640, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":13584, + "uri":"tree.bin" + } + ] +} diff --git a/assets/models/tree_texture.png b/assets/models/tree_texture.png new file mode 100644 index 0000000000000000000000000000000000000000..f5726d41ea881c58cf74e16442f6e7856ad98742 GIT binary patch literal 845 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911L)MWvCLk0$B5l7=R`)GBhwSI502( z#RSL@CQB1Gn;9NBk>>&o!x#>, pub asset_manager: ModelManagerRef, + pub frame_width: f32, + pub frame_height: f32, } diff --git a/core/src/engine.rs b/core/src/engine.rs index eae1e74..6eb000f 100644 --- a/core/src/engine.rs +++ b/core/src/engine.rs @@ -4,31 +4,25 @@ use winit::event::Event; use crate::SceneManager; use crate::system::{SystemContext, SystemManager}; use raidillon_assets::{ModelManager, ModelManagerRef}; +use crate::context::PlatformContext; pub struct Engine { pub scene_manager: SceneManager, pub system_manager: SystemManager, - pub assets_model_manager: Option, - winit_event: Option>, } impl Engine { - /// Initialize the engine. - /// Engine is expected to be initialized after the platform, so reasonably - /// it takes platform-dependent structures while being initialized. pub fn new() -> Self { let scene_manager = SceneManager::new(); let system_manager = SystemManager::new(); Self { scene_manager, system_manager, - assets_model_manager: None, - winit_event: None, } } - /// Run the first frame, load the world. - pub fn initialize(&mut self) { + /// Initialize systems, load the world. + pub fn initialize(&mut self, platform_context: PlatformContext) { // Engine Loading Stage 1: initialize systems for (system_id, system) in self.system_manager.systems.iter_mut() { system.initialize(); @@ -36,7 +30,7 @@ impl Engine { let mut ctx = SystemContext { scene: self.scene_manager.current_mut(), - event: self.winit_event.clone(), + platform_context, }; // Engine Loading Stage 2: load world @@ -45,11 +39,11 @@ impl Engine { } } - /// Runs every frame - pub fn update(&mut self) { + /// Update the engine + pub fn update(&mut self, platform_context: PlatformContext) { let mut ctx = SystemContext { scene: self.scene_manager.current_mut(), - event: self.winit_event.clone(), + platform_context, }; for (system_id, system) in self.system_manager.systems.iter_mut() { @@ -57,14 +51,6 @@ impl Engine { } } - pub fn set_winit_event(&mut self, event: Event<()>) { - self.winit_event = Some(event); - } - - pub fn set_model_manager(&mut self, model_manager: ModelManagerRef) { - self.assets_model_manager = Some(model_manager); - } - // pub fn build_system_context(&mut self) -> SystemContext { // SystemContext { // scene: self.scene_manager.current_mut(), diff --git a/core/src/lib.rs b/core/src/lib.rs index 0527964..6fddfd0 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -1,6 +1,7 @@ mod scene; mod engine; pub mod system; +pub mod context; pub use scene::{Scene, SceneManager}; pub use engine::Engine; diff --git a/core/src/system.rs b/core/src/system.rs index 7bc5a94..4412d7b 100644 --- a/core/src/system.rs +++ b/core/src/system.rs @@ -1,11 +1,12 @@ use crate::Scene; use indexmap::IndexMap; use winit::event::Event; +use crate::context::PlatformContext; pub struct SystemContext<'a> { // TODO: time delta etc. pub scene: &'a mut Scene, - pub event: Option>, + pub platform_context: PlatformContext, } pub trait System { diff --git a/ecs/src/components.rs b/ecs/src/components.rs index 83bc7df..758f0f4 100644 --- a/ecs/src/components.rs +++ b/ecs/src/components.rs @@ -13,3 +13,5 @@ impl Transform { Mat4::from_scale_rotation_translation(self.scale, self.rotation, self.translation) } } + +pub struct ModelHandle(pub ModelID); diff --git a/game/Cargo.toml b/game/Cargo.toml index 835bf39..e8fac5f 100644 --- a/game/Cargo.toml +++ b/game/Cargo.toml @@ -10,5 +10,7 @@ glium = ["raidillon_glium"] [dependencies] raidillon_core = { path = "../core" } raidillon_platform = { path = "../platform" } +raidillon_assets = { path = "../asset" } +raidillon_ecs = { path = "../ecs" } raidillon_glium = { path = "../glium_platform", optional = true } -glam = "0.30.5" \ No newline at end of file +glam = "0.30.5" diff --git a/game/src/main.rs b/game/src/main.rs index e0403c7..e4d1136 100644 --- a/game/src/main.rs +++ b/game/src/main.rs @@ -1,11 +1,16 @@ -use glam::Vec3; +use std::path::Path; +use glam::{Quat, Vec3}; use raidillon_core::{Engine, Scene, System}; use raidillon_core::system::SystemContext; use raidillon_platform::{Platform, Camera}; - +use raidillon_assets::model_path; +use raidillon_ecs::components::ModelHandle; +use raidillon_ecs::Transform; #[cfg(feature = "glium")] use raidillon_glium::GliumPlatform; +const TEST_GLTF: &str = "pink-monkey.gltf"; + const RENDERING_TEST_SYSTEM: &str = "rendering_test_system"; struct RenderingTestSystem; @@ -17,12 +22,23 @@ impl System for RenderingTestSystem { center: Vec3::ZERO, up: Vec3::Y, fovy: 60_f32.to_radians(), - aspect: 1920 as f32 / 1080 as f32, // FIXME + aspect: ctx.platform_context.frame_width / ctx.platform_context.frame_height, znear: 0.1, zfar: 100.0, },)); - // TODO: Load a sample glTF file + let mut am = ctx.platform_context.asset_manager.borrow_mut(); + + am.load_gltf(TEST_GLTF, &model_path(TEST_GLTF)); + + ctx.scene.world.spawn(( + Transform { + translation: Vec3::new(0.0, 0.0, 0.0), + rotation: Quat::IDENTITY, + scale: Vec3::new(1.0, 1.0, 1.0), + }, + ModelHandle(TEST_GLTF), + )); } fn update(&mut self, ctx: &mut SystemContext) {} diff --git a/glium_platform/src/assets.rs b/glium_platform/src/assets.rs index 6d33887..1b3b4e1 100644 --- a/glium_platform/src/assets.rs +++ b/glium_platform/src/assets.rs @@ -12,7 +12,7 @@ use raidillon_assets::model_manager::ModelID; /// Glium platform asset manager implementation. pub struct GliumAssetManager { - pub models: HashMap, + pub models: HashMap, facade: Box, } @@ -27,13 +27,13 @@ impl GliumAssetManager { } impl ModelManager for GliumAssetManager { - fn load_gltf(&mut self, path: &Path) { + fn load_gltf(&mut self, id: ModelID, path: &Path) { let model = load_gltf(path, self.facade.as_ref()).unwrap(); - self.models.insert(path.to_path_buf(), model); + self.models.insert(id, model); } - fn unload_model(&mut self, path: &Path) { - self.models.remove(&path.to_path_buf()); + fn unload_model(&mut self, id: ModelID) { + self.models.remove(&id); } // fn get_model(&mut self, path: &Path) -> &Self::Model { diff --git a/glium_platform/src/platform.rs b/glium_platform/src/platform.rs index 69b0735..9a491c2 100644 --- a/glium_platform/src/platform.rs +++ b/glium_platform/src/platform.rs @@ -2,7 +2,7 @@ use std::cell::RefCell; use std::rc::Rc; use std::str::FromStr; use std::sync::{Arc, RwLock}; -use raidillon_platform::Platform; +use raidillon_platform::{Platform, PlatformContext}; use glium::winit::event_loop::EventLoop; use glium::winit::window::Window; use glium::backend::glutin::Display; @@ -40,7 +40,6 @@ impl Platform for GliumPlatform { let asset_manager: ModelManagerRef = Rc::new(RefCell::new(Box::new(GliumAssetManager::new(Box::new(display.clone()))))); let mut rendering_system_manager = RenderingSystemManager::new(); - engine.set_model_manager(asset_manager.clone()); // Install rendering systems rendering_system_manager.add_system( @@ -59,7 +58,14 @@ impl Platform for GliumPlatform { } fn run(mut self) { - self.engine.initialize(); + let (w, h): (u32, u32) = self.window.inner_size().into(); + let ctx = PlatformContext { + current_event: Event::AboutToWait, + asset_manager: self.asset_manager.clone(), + frame_width: w as f32, + frame_height: h as f32, + }; + self.engine.initialize(ctx); let _ = &self.event_loop.run(move |event, el| { match event { Event::WindowEvent { event, .. } => match event { @@ -69,7 +75,7 @@ impl Platform for GliumPlatform { }, WindowEvent::RedrawRequested => { let mut target = self.display.draw(); - target.clear_color(0.0, 0.0, 0.0, 1.0); + target.clear_color_and_depth((0.1, 0.1, 0.15, 1.0), 1.0); // TODO: let mut context; let mut context = RenderingContext { scene: self.engine.scene_manager.current_mut(), @@ -85,8 +91,13 @@ impl Platform for GliumPlatform { _ => {}, }, Event::AboutToWait => { - self.engine.set_winit_event(event.clone()); - self.engine.update(); + let ctx = PlatformContext { + current_event: event.clone(), + asset_manager: self.asset_manager.clone(), + frame_width: w as f32, + frame_height: h as f32, + }; + self.engine.update(ctx); self.window.request_redraw(); } _ => {}, diff --git a/glium_platform/src/render/basic.rs b/glium_platform/src/render/basic.rs index 66ffadf..60e7621 100644 --- a/glium_platform/src/render/basic.rs +++ b/glium_platform/src/render/basic.rs @@ -9,6 +9,7 @@ pub use raidillon_platform::Camera; use glam::Vec3; use glium::uniforms::{MagnifySamplerFilter, MinifySamplerFilter, SamplerWrapFunction}; use raidillon_ecs::{Transform, ModelID}; +use raidillon_ecs::components::ModelHandle; use crate::model::Model; /// A basic renderer pipeline step. @@ -65,8 +66,8 @@ impl RenderingSystem for BasicMeshRenderingSystem { let asset_manager = ctx.asset_manager.borrow(); - for (_, (tr, mh)) in ctx.scene.world.query::<(&Transform, &ModelID)>().iter() { - let model = match asset_manager.get_model(mh) { + for (_, (tr, mh)) in ctx.scene.world.query::<(&Transform, &ModelHandle)>().iter() { + let model = match asset_manager.get_model(&mh.0) { Some(model) => model, _ => continue, }; diff --git a/platform/src/lib.rs b/platform/src/lib.rs index 0750166..3ff1a65 100644 --- a/platform/src/lib.rs +++ b/platform/src/lib.rs @@ -3,3 +3,4 @@ mod camera; pub use platform::Platform; pub use camera::Camera; +pub use raidillon_core::context::PlatformContext; diff --git a/platform/src/platform.rs b/platform/src/platform.rs index b0250e4..3e0309f 100644 --- a/platform/src/platform.rs +++ b/platform/src/platform.rs @@ -1,5 +1,6 @@ use raidillon_assets::ModelManager; use raidillon_core::Engine; +use crate::PlatformContext; pub trait Platform { /// Initialize platform.