From 06f99406824b8bb03db17029279a0d139808cf6c Mon Sep 17 00:00:00 2001 From: jussi Date: Wed, 25 May 2022 21:52:36 +0300 Subject: [PATCH] Rest of mesh management functions. --- API.md | 36 ++++++ README.md | 14 +-- devnotes | 1 - examples/.gitignore | 1 + examples/resources/images/LICENCE | 11 +- .../resources/images/arcade_platformerV2.png | Bin 0 -> 37323 bytes examples/resources/lib/vector2.lua | 2 + examples/resources/lib/vector3.lua | 2 + include/lua_core.h | 1 + include/models.h | 4 + src/lua_core.c | 26 +++++ src/models.c | 105 +++++++++++++++++- 12 files changed, 186 insertions(+), 17 deletions(-) create mode 100644 examples/.gitignore create mode 100644 examples/resources/images/arcade_platformerV2.png diff --git a/API.md b/API.md index 976126d..e5528cd 100644 --- a/API.md +++ b/API.md @@ -3297,6 +3297,42 @@ NOTE: Currently only works on custom mesh --- +> success = RL_ExportMesh( Mesh mesh, string fileName ) + +Export mesh data to file, returns true on success + +- Failure return false +- Success return true + +--- + +> boundingBox = RL_GetMeshBoundingBox( Mesh mesh ) + +Compute mesh bounding box limits + +- Failure return false +- Success return BoundingBox + +--- + +> success = RL_GenMeshTangents( Mesh mesh ) + +Compute mesh tangents + +- Failure return false +- Success return true + +--- + +> success = RL_GenMeshBinormals( Mesh mesh ) + +Compute mesh binormals + +- Failure return false +- Success return true + +--- + ## Models - Material --- diff --git a/README.md b/README.md index 5f7e92f..47ca96c 100644 --- a/README.md +++ b/README.md @@ -12,24 +12,20 @@ Reilua means fair in finnish. ReiLua is WIP and some planned raylib functionality is still missing but it already has over 400 functions and should include all functions to make most 2d and 3d games. Current Raylib version 4.0.0. +Included submodules. + +* Raygui +* Raymath + List of some MISSING features that are planned to be included. For specific function, check API. * Core * VR stereo config functions for VR simulator * Textures * Texture update functions -* Text - * Some font loading/unloading functions * Audio * Wave * AudioStream management functions -* Mesh - * Some mesh management functions - -Submodules. - -* Raygui ( Done ) -* Raymath ( Done ) ## Usage diff --git a/devnotes b/devnotes index 0498196..d91bee0 100644 --- a/devnotes +++ b/devnotes @@ -3,7 +3,6 @@ Current { Backlog { * Text - * More Font loading/unloading functions * Codepoints * String management. At least TextSplit. * Audio diff --git a/examples/.gitignore b/examples/.gitignore new file mode 100644 index 0000000..a1bb56d --- /dev/null +++ b/examples/.gitignore @@ -0,0 +1 @@ +platformer \ No newline at end of file diff --git a/examples/resources/images/LICENCE b/examples/resources/images/LICENCE index fca0d39..ce0f32f 100644 --- a/examples/resources/images/LICENCE +++ b/examples/resources/images/LICENCE @@ -1,5 +1,6 @@ -Resource Author Licence Source -tiles.png Chris Hamons (maintainer) CC0 https://opengameart.org/content/dungeon-crawl-32x32-tiles -apple.png Jussi Viitala CC0 -grass.png Jussi Viitala CC0 -snake.png Jussi Viitala CC0 \ No newline at end of file +Resource Author Licence Source +tiles.png Chris Hamons (maintainer) CC0 https://opengameart.org/content/dungeon-crawl-32x32-tiles +arcade_platformerV2.png GrafxKid CC0 https://opengameart.org/content/arcade-platformer-assets +apple.png Jussi Viitala CC0 +grass.png Jussi Viitala CC0 +snake.png Jussi Viitala CC0 diff --git a/examples/resources/images/arcade_platformerV2.png b/examples/resources/images/arcade_platformerV2.png new file mode 100644 index 0000000000000000000000000000000000000000..1a529d22afc45c411e6c701f417676be8845ad8f GIT binary patch literal 37323 zcmV(xK zaB^>EX>4U6ba`-PAZ2)IW&i+q+NHf~*5o*jZTVlLxI+*rK8Hh6;#xg}9)9ml^T-?d zsOnqY85!;#{+XF15;!;q1YpSji z@ZRg5{Ifz2k?q2c>s+mI{@toDB-R#)(}|8#s&>;Jw7Q;b|B;&Uv4s{=PB$>i(Z@dOvvI zs3}J-KW7B&TK-arEO4k}f;ksXThBw8R+erQXSk(8)YeYO{mYmp%)Sq>i z?@K#{P8dqHEbf%$yHsZ&m8>`b_>?E^}Jk7h(CM0BRot+ui zjEiN%!&j~Ec%FC9_RWkv>D##8eh$2uEa8= z$c5I#(ATOUPs74$d)Sv&CKkjUjI>z?%wX@C#yj@IgT!x)c41oBEI_^PkBbN5&NdL# zyxxE*ys@$Q!aqyaWBOLPC)Pc3+jtN*pI_EvU)bk(>l0TGEP4gaY8=ZO!Gc#1#8&MD zn4LcCoE1;3ZG)bD^~LnVF7cUdUl~*AY2qRwd@MFd8q=65-QTx%dA{+ycik*+uPk7C z+lRr%m7dCHJp0+-c=wmCys+ztRlgnl1zNg@x_myIvFz__*jDFmzVf_fOsuQ+jKA~p z#Gl|WE-41d6LS~r0H#`rpltTSvBJFwvuwy4*1Fl+hwuZhTS>S6K7&Il&$z$YM%mZf zzibrc&M>dRVmx5U>XCSPV|h@;uvx#IN8j&P<|eYUWqW3BcYOdET&l80HGZG2{NR8S z&VU8q6Fa$aju8YdZtlj<2tPbvUK^jsL!a=jRW@MtzChN+I^6HTrtpIGu-GpP3+UB* zzS>>B=SW!Nh*IaCFx(rqcX#+f2|Ocq_w=2vrC%(JF7Y@Ml)u4^V{qdcJyi@n>A?rsf$OxzcBYGm>IX2yjdNa-2!Akak8%d z82Vp~cqBF@xA#ir0|@}(?kiatD01rn$or+Ifn@E=tuKIsjs0{YFm_EKD1#vnf4IlD zB%{Wq?_kNjpET!(%VFdjY@HJjY>Qp%ZI6m!tiCbEHHEBRXMQoKx$sb*i5sQK;z0<(9Z{Deb9c8x%~@!a}` zj{vuu|8j$14Zw^6zu5gMuMx3yf@v4I*NWgQQK$BhdJFrCOV`1DF?M!nVbae8fFjyp zfX6M5@Z#u%eVz&M}CcYzZIb+d>9#KOMn_ENVWOt100XW~7!Nj&SINH%KC72e7p zAsK|!8(M=|fokdQHHEmtN?kkGn}Kn1QX1&#gCZVHsCvVY2R)O+AjM}5ws1wets8ziX_7mG%Lu$@&8?-O-fEQc=A2R9=c zvYf7{sKEX1No+_&@?E&g?_x(I2KmJLvO4Gn=oXI3#kn0^>dhbgGfU>+4-K$^5^@QQ zv|~ElJx|s<0g`8mEH3d%1Lw|J@EhA2g#Nw!cNL!D0iJ!UOu`dksAv!^|fMHM; zioJ4|@vuoy%1RhpyY;HOuz^n*EkJl42#(_E`4HOR(}h(|w!Hw`-}tcKnckE@xLBa- z#G}DeCTI++U!dQ3nQ@Ed1<_WMX3ZVSca1D6l)kZg)i01zV&M&g*8sqTKTH)k`Zk7_ zz`wjdazOaBS zT(asu_nR(Eon_(29Yq46g7cR7-cO$U?yzaFAgl?}Vmk!90>NSpar>tNV(9mb>+!VL ziyr_k{MX2V&4oHNX>9`_VG&q;2ReYi8Y&+Jb>ht^BtEjd+BWV;v|zE>-NlBseY1%0 zyunII){OkX6Rhrrk4|uY$Ob1Bbs4 zcFKJd55mPm5nJk(M{zYI6|X&Pc$G3?>hO62xhxJ3O!EDKM$QS?+7JQm8ZP?9%a8){ zpbBB=paU*j@Y7GOj(|!ZtciH(nwRI1t?^X232p=XYi4}_v#(q%S(8nEGH?R6#w)_0 zVB}NyOeCrYgC?tUyVv|3FVCoEO#U`vVH4Mv;ERBKhwRGBiR@2AOu!`S;>j8xL;pl;;%Hd&AQAH0OWW9447a%pOFn1YSkm; zz;T!lh>}<#HVfg$IuLhSzi$@&L&O787YxO`ff|&(A+%=|BU+wFhjC(ZE3(LNI%7Q) z2TF=-JZ%%NI{u!xff5>;_GNW9%9HnwNcc(N9U6%28Arl92cKtjA)sx9AIt)A5JIa+ z_Cx^Qi^YZz@zxvUj0Lqczq^eG!Y<;@Fj$5X7rX?`!-L?&w=f6YE`S}N{i%^gt5-w= zK2ROB96T6e&OH#hCB9KTwEzsHEZ{16CD;*}FvGyA4fA-dyH}mX?re35=;6o`9!gUI z38Ebl7cH7$)Iq=Sde65JITgOSss_JXh4xHX>X5PF5T8Hk1fs@4`)qT&#||LyNI)d zs=*_|Nzg{igcLkG2jU*|T7|ILu>mG22TLT57pFx%sPyE7^7hfdc{&ho|P~|t(DBO=Llo)@pnn^=p8 zeW1;VByb%56S%>r1;SE=Pfo}`Vh}1YFJx8e=nD|>ds&c3+#zU#N?%6h<7bds z7>SYX#7rBH2>P(YdEp=!6IX$ z5h*)6@&rgF1S)r+C)h2&>SD=&`NbH!S(FZp2M-f?7AP;y0GVx=U%V1z3=%mIn#kFBL|G==NVIEh0V8m6#VTBc`%Xx+n>TLp31$NGOfrid zppf_-ZaEgB1pFXWgE(0NglfBRF4Pnnk_E+ep!y0WmH^fph~UliL*~f|azHP?bhRiT zW#V(<18)O4Cb2(DyF4zyf*#By0lEu%1wb4#PY4FU>hrvV{rpr2Fcx6v<_D!?G`sJM zfQ_C8a!Ouiwi-*U2ml0v=^>)Ibgj8OQogI$17chpT6yJl|wq(pcc z!ankTra>5*HA)LG^BGaqnCRyj&xhWqFVvL}+*2k6P7(zx+rJmlm*7BDgeD{KUOi6G zonONU(2glW{+jH&@gZ#AFjIcRbTYwUKls3f>GAAOc;8ng_QHL#8AM zjKX~Di%Kb1f6kG^gZ=`<%KJ;!wdH}~G|LGhAi-JLmQw;#`R{-|v0g+&@LeP|cbuRO56h%(M-Ih31E0F#`3TuO6Rdw~YTyoj)l z0m;YCn}tD|Dj@KXsaP;CHQ9g-4j?Z+oVQ`6;LN(PL!?VrU%%TNT`tIQBy8!BRUH7t z`?#M?0EGh}2%}09tz@1E`G-%lAy zU#~$tCqllsCz$`e#D3zj*NE~L2-}Uzb=G2_kTYAtvlPQ{sPUd9n1z-x^XRBbA9mp< zNKvqdICeLU;CadotqJOqM;MZR2D2zHN=nN2^74Wl#wY>+Q^8ksbw?y#ozKRyrtj69 zK4le#TnV%Td)x$H2qU&&MoLY(M3e&Na^dR0FFi)FKw2`=3;1>D&WxoOLo!0=V9$tNB?i&`5ycD`>C>5`kQWi9k@Q zTpcqlx+kV_PwbrAOwjTN2djKoDG#P>q#aTcL`ZG!(b)AukSypR|5|5&K48H=LN$e0GHpdnp%$%Jes}(L%O`P?lY zQn>lo?4v1RcnwqmMHtbZ7eN{!2WtR^Zos}KJWUE%TiIqngeI6Nn#r&q28(%k68^J+ zYqS6lQsebLDo)})QMr4*C(z(_FNzf`Hw)3s9Jfi>dE%W5hJm&rHk4)l5E|w_Trkxq z_w<^w=s5a>yqHrswv6Gh@+X^t37FzBsmr5|HM>;?!XWPdL5~{_F`%mHgQa_@Kp@5b zaOv;%be4#O&_~cg9$)A=1Q9QQfbX)5n#ibU<2M9Im?b(8LNd@$EaUrBNe`QdsH!Fq zxdmu2fPCL(typgG1IvTpq6X@CG5^bCY&N9|5y(6am{9ck?*Z}(5gP#!9~jzz*%E4C zHXmvjHYW%FAe+@^dM-?ny;=k#eJ?Dj+~Q5}?oGHR=-(m-QQdq6n@BKXmkVYH;^d=X zxP#|H-Q6kggrmbz%L~aTh!G$nKpsq4@_)}eO)0=@SA<~07rEe#M!_)5q@y7FXX?11 z8QA`t*qEfsFr{LV%Ht(ZxdkWk`-&^nd4QVc_@Lsp)Xi7PK7Z) z2&v~BC9PJ>VVURrOnN|9%vJK4gqVnQb%{_~>4L0ajc}KJvoGkar+d1)rQXwMhSxQ` zju84hXx{}Z9G>H#kGCj)y!qW%_Jex!P@H?@&QR)Wu|UK!LUT2R0eJHs4>tK6==_UP z`c^?@qA@@XAnAj!6I~&4_klw4bK< z?rVe9A$cI7+Wmmp69W1TP_Whzz-(Gj>;Z(KT{Ao$V4@VjB+r*IYsd|(mYAMB7h)UW z-tXiOgfODqh6$^Y(P_nON5bj8k3GbQS*qQn>)q3<_(HTWa)>_o#wMq_^o`Gry(gma zIL`}?dB9l14g7+ru-RS^?by@?`=QCn@-yzY^_u|l;pi+b9uNWnWvGZ69D6*TGb1-8 zSlz&aGTGo3H=HW6F`>RL))no+UxMH_Rt&G6fu(Botq28ALWcR@9=i&=4pQq^AAQ0{_7=xeRqvq508`Npt7%Zc^@($cbv96z3@;_xjOvXxc=qy02(W@S&Xb{ou!tkK>V3hXiNgJj0wvM# z9q(L&=psw3m@7qV%b3z31CtM%Q;KoX7%9>L$by1aiw@U_(8Wv0~5IDm? zwu!}zc3kEG2jI~BFbKuPx&-2XDcT~263s55xSok8!40j?!J>O0u1;VJp*6v%_;^Cb zJ?<=$jqk!;x+$E>&9p$|Ch%CuRI9}P95G`j>Nqxx_-3^RcFR4oQt@Q8F_m~CIQl8t4pY2T1fD0N18L;oSl8_YzDr-n{>2#iq-NJJ2d2%Rut=*NQ= zsb92cNj?w1CkO$;2tDX&4PY$Vi;Y{q0vEiAM>)xERL$W`!UV#+GVWp|O$0o}op^X}WTJEKhD6S1S&Aq!>4;|`XWp=!X8cT`VM;S8NS`K`A zPFpexz={J;VBn{`{pvh)8OOvRv=S8d4OBr|u}3M1yB2Tr0g%(WVQ`;0J(y8P$sGj>*BH227=~E`#wirEE@k&_Oeojy?CH_3y~8p69l!KtOn09 z<*g|%tP|h{tT9Id;r(sA=QE)9lR}5w5+1;iXAvBg-xs*i9}sw8y61GCuw){5W5Ao0 z2WW}h-O__@GM^iqFp-cgkK7jWKt&?q2#Qt_ejZLBMBzLrJ`01`rJf0`I7dv@m0`xo z^9L}msX2n0oDeci!~%Hn^1z5$7x#8e1i`SOAHo| zdAvZNx*)7F-gGvXw@lL#+0#WL&&yiP08PayhDBo@7P57Zx)QTqDSQ#jflXcDr0O+6x*4GuskGR&)WI#VWj0 zp~zA%yA-~{j+Bs$8c6xHJbfS5Cpzh_#Kp#nasPAs(C zrYTQhQNBHkF`DcGoRxrilndHk2(<4D^?ADKuW9JBbV~|<%4qOBqBc~$m^Fs9aT5&& z{vrKwd4YFco>*+i+-mF%j>G^@)CliORAHVL+G9rx*q$g3?Oxi#uNg zDL{kA`ki=qW*fVCedFoiu|9lqae@Ad?A+C}W?ZtpIhJR_7!ADTB1$Jo^*UAAExaBW z0`UbaV{f>4SM6X>wRR%Y?*t%hnOA`;y_LuY5xB;e`#6>080}&U;3-&-6mwd@f3}^V z-xk!5Ma$=m$dgTI9xDw$07=uj9&>&*d%62qPpPXZr~bv&jKLAk?*YDMp<7GERoH5xD%0I zMD|zr1%@6L-;-m^Sb2?nhX)rVzFxG@L6Gx3Gc<0L#$AGIL zE37RDxCkPc>z&Q+^FyI%4BMown`e>d9w zhQRPq)g=Qjp($)j#O7Eb#1bHuh*}Vk&wMe+@oge@i>**vwRqw*#NZV) zB~Rk(nE5WiWmKbJaC|nfcLP23jzsQ2sI#&Tf(}^%V2k8CI6|URo zlZ~KuwtND=eEohSKkM&e*U%ps{n`NQAi+-iaQ!-QU+`GsQq6&toW9!-Qg#jcT_V(2 zX=}o`UhMeIv+TkRVr4TFf&kDlgEehF1>qUu1!Gj|Vdhv_HT^{dtyTb?@K9j>_-pLB zX|>sm=xe1htYhCmUcRlfv9!5|HuF3^kPpm{r-$KTvcp7Xsy2B|vr^Ij@=n#8AxS)r zYb}=hBRoGSaPVociLa-M4UT>4Gf@&9m$-t6}e1DDQ;c5@eTTJX0@3ZKSnP5y3 zGt$bBNLQJUXbm9b6sVOJdxx+XOP|!`p5sh=nxL*Q&Kgu5AO{+uo07R3kNAQpurcC7 zA1bB`$AdCJPQkA6$Qb5Z3>tbBq70@2C0)P5893Oe#0Rtl=J$3)0*;IVL-$8&%^^U29&%to-7BBP+qv#l{LW;OYEKxBY-U~^>l2x z80Uz*AgUtnkCj@#go$dfR#|lb+0-J2aRqSWJ|(+F-S^04c&;s>hC(3kT0G=t@B(uo z#_j}oop@^u@$g_mA|UrK)bx!&)ET5XsLLvR zxLfpf)$-1BG}1qOkN;zX8=LvM6+gI5V$T4dV4neTjMcV?KM;A$-k2R7THy8IP^b(n zRVzh9K`QQIp|0f(1h}xE9v|R{V78cBs7Oc}LZrJf@oA#ibA2p^5f!e~f|UpdW7xHU zSezDF^c4wsmZDnT1UP#1I5#>LZ4Mj#&Uww1<6HC*s|tjSci`@zR?>5btZe^W7W*fA z&FmW)ZcOsf<7?3>-;|^EM`@d^S;_u`HSY$vB3vRs*vgZ)I$@WYXlo)}sy z#r4lRUBh}91jKFOHp>A04W3l-NNRSX6IjZ_Ry&)li+Sz*XfV_|38@GQNN_@Br)Vu| z1SM0miwwdok;nH>_YxSPW@t&D#Dw%1PfKhzZ)P}*{xxn$1Te;3S5`&t9H3(P&Tu96 z+CHEmmnn;_wUvk^yxCYpR<_F{Skyy6#h|PiHMHJVS}Y$U*kpw(XGH$CI4|1L=g}&g zjpQ>e&=z3?!c&5+jr;p%zlv=pQ_3*E4tkVXhRsLQFf3!!@0y-i4Q zr%~txicv(6h}%ktjE};CiQ-j{f#4AbU&wef!M7?5{((HhwykA6_39I{(-xwKpLXeS zQtnyqPM8?4WrdzE6->@!n$v9f0_sU^I}JrjyV&i>f_CIXQ|o;}1@IKu{t7&`p~Mp# zrxt+A7X9D>S}r@+*yiw56XFnq=Tz9f7M$BId3pBUS>8;PY#!IVHdww1kL5{WqAvn& zpZ-0N5z1}?lwU)uBMe3P?V)BQ((cJplnEKRZM_S&``JqstUS2wqO$DC?lQRI3IL&} zthaS922>g7iW5Atl4YKH5q?Wak~GY6K-QC7iH}3ZpKcF}6roVLsu!XUrbd#)5orNo zE9syS#8=?XJk7Totfa?cG5&;F;*57qr#5kTvI1Ep`ofi7Hl$nUalzXk^M%o(lK7$e zK97=0h5o_-9#Jt{**3zd9BG!p!K}WMEy|SmBw>53VgD9bU|6J~|j=*#fEU{Sx*=^}#tF2tL9e|ylcD@Gt zLoTy_9+i)5^#q*RVlW;T^1nS$DXRNl&k_{3%+u2N$cP~!7Q{t-21^EN*>JmiJ>9`r z$NeNkfalvC4>k8?Bb&yNbF|=hyrs{ME|e4adZC zTo~|5{>@{Wqp|Fg7-;Xa3&MWz=+|I@-`f%rxX|L#TsZiXzx{vFWE z{c$iW@Ibg*ruMbKy({!RXe%4FRaJi2VQxWS;O`}@|ZfMMFi=CYhc2&3!d$R~t#YFF8b11=`=ybDM?|1myY3<(45-_7B3KHwJYLx6LORfo^M0QWg_80nQEGoR(>_ z_~8nMHy;{0Tou7z9dIDPae^|{v-|u_Ddl4wU~J92n|B^%P~BM>b}nAgy7Re%XE(6H zY)xJ?e0$u5!AG;+*3~-I!UCA0Y(+@6V%0YYnd>-GG}{=546A7#vz0wewd!|fH~=Mh zgybflsuP$na@%^H&khg78pQu4(!$Fue49|uZHqWiK1Z(@Bq2Fj^l8e4r6sN}Xu4&| zlGbU+3a^J=H}NfA9(iZe6~T(U_cpa~YR55-2$sM0fn;+_r%~Tyj&&FG#-T1SIYd06 zw_m{;VO+X)BH=(iJ?1cxK3u*}sLRVDJ)UzvmRrLAjm0<{p$&?8gE%Om6t3uDQhMza zz5(x%LsypnGA{5>JG$_kQ~O{vnh>^8|6Bb`(zWlwm`5EKFn* zQJ@uLv(US`{?@;kI&I)a^st5pEcZEKi!37A$efW4<(S07%f11>0q(ig8-8`2bHm^% zGJp+Lw7F~$&lZnnksscK)bo%F*@Wo$MzOXg8>=0lWX}p@AYHeI>*~U4nOwrWUZNlC zQaesWr0AAeV%yflq1iD@LX&7iu;zoCS>P@64=3lAO^-yL@=c#ek*p}qcIDjnjAn@e zzS-fl7PWV0Zp5~&WkCN__TlB<1&){3|Xbf9UC>{tSK#k^uy@%Y@ zAE%8kzo^P5TsAw+U#(g;Yvnt@dl-H7a0m8Npgp#7j#F;^PMdOI27QKu_((24JEwT^c}srKT2UbAltV-6P!SNN;+DpYwIG?(djPqn2j_ALm;=GZ@? z4*JxCKVahoPgOK3x`bCnmsNr|~otLiN0hb)VfT zO33#q-0AUB41mkPc`>3lsR1N1Kof)AciRHFZ-6wY7SlCvMtic1#Ba8-fvUjY`&@8s z_^)lnr%$7yW8YVJzlmqixfd3P0R#JH)*5U-EqO3* zzTt-6qgPx8lnU{2yn3VKCp=$k`Y^U`TXDAJYhN=u=Viqc2<@!fu+r~-%Ng{+!i@*P zXSyz*eujo=5L`R{;Y)6aU6i|DnGa`?zA!Ksv6}^hOJdbf9H z1YX=cVV=#iS9AbQ15B{6(ysQ{RjlI+tQOmjT=1|A*9I(+m;d(Itm}QKAfRMV5WM6< zOPTACETvE`jwEF$#h9&2_}GsIiYrxrkQ zS(vS%0N|=NXq`b8&J6%@z^yCU)CZ~Her`LBJ4}`h_9UyGZYeWDo-9})Pkc|O;tHg< z@c{(@8d=eU(?(}eWpjGOz{gxuv_X7^Ux=P6K66;%Ji*?7yL~&&xR&)A@xmGjb>yahmsW{vaOW-EKwAgZDRcn8)C%?N~nk!Es^_VB@q+8 zO)L}Lt@iQM^}Vgb`E%+2mwi-NpRW7-st;{JNBDJlVYyp_A>N*1+lOnDBJt|A2yZ@! zThYR*EIc>^mx^u++|R>(mZ619pt~m|o_hx-RRbplb`poL^!k>TydI*N%h=LP zgbW+q{h)u{n29b|FGEq;qhSp@}$=K z0;X+?A+!E`i{}0;>xyVDxR`B)&*f|iClMyIcsw@@vD$75 z7u?ASM!=giqRJJZBp!0`>6ZCB+oo5g=IQZU<{5Tg0PF7{BWJ>lo#!?A;@5@E?|gU+ z9&F;$T$P~Ysjf}OP~Zp5ei|f)pl$IxaiYP{QNOVgw(1#LXSsP)A!m$`|Jb6s1I^XawO%#8ImE#iD5 zh$#{SW@v(k{cg$aft8=F55LqM0TB;;jya5m;qUgd zkiWJA0`vF1;GTX@{`b9Ld9FX};|crU_u^Er+UfbvX7@L%v$_(>z_ph}+0KWI&`YbF zibKDGEs@Iv(f_GAcnmq#m57k$NW&TIkk$L>dt}%%fyL+JYA<#Y3YO|YDAC)CN;K@w zTc<0DPrhdGG&1~X_@nTYZU22g{+sP6Fp^AQn;<0O1mexI0OpvZO}k*^$$UX+AaSfd z|7oh_wC~|tSj%!MT68R*4H-7wT+5<7OOgf)_Z30}atf4*DTZXtm9@X|ZAOr>YXm0} z+#dKsl_7ppf9$TDS8yLnS+AW<5{ho3n2Yui$L`spu-*}Y*ynsKK}S^ndEwbZ1M(Z^ z<$k zK}dZ}tR7(yrNr>YaRs|+?e3S&+v44${Q`$J_4&$6)45HDmW=RUJaP`#?>2RjGl2-c zy(~7ummRRP9BWXZq_05&i?daX=rXh1!{*cjLLMD<5&O;Q&8`dYg>-xwg|pOamPid& z(MJE%SKF*n^8lheY5WNmC$?R`k$`M9F?JowQohhCOuVL_T4ZJ3^H{$fGLif(Cn_E~ z4mAzV1HYg*&Q=M$wuEY%N^79*lpxC}og(1CEu!hZnt}~y zoADQZc_x@*%pQoa1sZkcW4bK>uD z_5+1v4d)+o3nnPjd*G`7CQMz=a}JCwd2+&wXCVLaO{Xd0A9p+3|GrxjUtREb?ngmZ ze3qood|Mt}9K(TbKZW#|WLT%?*Pe+p4fM4x$~v)uZ3K^bFMfg=fSY&I(Z?t!tK;;k z=eKaS<^7p+m1IgUsO8u;W50Py3>p%B{bix~yr4RpG5xh-16A#(nQe|9qz%N~^JjJz z=!~~PbI{%^Es(MC9IIG)KGs0q&*K669`jCmp~-0}u|t9UeQ4VfR+9TDO{%-Ao> zR=OpktWN-7tayj0*6_v$Qj^MW!bY>G@(I=;puMt{UKVK}F&%4@*1ViP0ZQMkWKSp| z`Yg63Jk^Gw$9lEfCi>!AaBa{ohug`1Y#sW*>638#=L#lQE!g0WZuDcao*5BG9OWH} z@Eh!GdCD~95`$fuv6t1&GahYZcXZuI(J*j~WNEU=d6Nv&(-bOgJC6qq z6ZLmNC1IGwM5xUi7KB;(_>yQ0p@>ll{A66F;A0syPw-vX=sejTXm zKE3_5O7d=nDHD@eoPK=V^{btLf2ygcvwE6=~?K-$5D8;}hBGeQ)3swvuu!ar> zfc=D^9CRq!3o#1BM095)x?yo1rR;IZ;rqj8pB8qWTv>m+z1y;@ z%>`SZZ9JK9SZzI=SAX8mMno0utmgpU;t$KD%s{u_D4k^SPqJnQOLw-$?F2BE!9iy$ z@oIeSOdBZvf_7kMVOJm}R)SQ3M>=r>bcOLf&+Ta4b#qwS6gD69K2@hsBDgR&sXS|iBg6+AL9pIU+y{!VYzL=gR= z*T4euI#=<~)e?Lh>>L9pJ7UizJTJU2PlAxu&idFzeDu`1*mzVF|NTRQ^Z)#y06SES zSC4SJ4J=4Pu7k~x^l+qT3v$;re;LZx@NPj?buDo$eqyfSW9x!l{;$KBvMP|J*UA;j zm*UdF(aw4UC(i`be@972mZi2^!NctFbE1%GmuR&v&fMNB^R%98B5GdSR$#r=9!~pI zDgoNjaNH_kBcO}ALBk;l`wcN#HfU1ZR#?0r%EmVO^$eer+IZusj)rqBhu5)i-3gT@ zdmJvsGx5w0N-Z8vLNpyMZ9`=o!A6ek;Dlizc{gEirSPyWxbdJRyl4Edvxi!+zlgB( zfkej34+Clavf}7&5S|F_eWwEtJa`zz@*XD(6QgrJQ_vj6CER7lVguS17}y(_ogZ=8 zaUQveuOa1}%~emyl{1oAOvm_%j9Stv#V<=3!*2_5+QCU&y>=izy;dWBjbu0M%g}u=DDdAUIFxOeshD4LjL$OxG46tu0*w(O+IS3}KzA69^oE3m`T$bW|=PO5etnjhypJE5cuFdf!4sgU1ESGM_M}RSi z5Xf1qEYnE>pSk>o0q2r6uG}5&Fg*?a&Zrv?so)L-l&3zwHu-+W+Ont4`a?XX>L^@m zTQ9iwsnaP|(|`6Ue$E@Q4zSM^L$J%EdkDU6OCx_Xv|cAavZLdC$qVRWoxddCb~Y1w zHrs-huj$5Bi1V5vED1?sg6>T46y@G*lfA9$_V_Fq$z|$m*xpi|Z^u^M)3yHTB8y{! zh4E-B>terC`aI52gawuu386r9+86SAx&XJ*IXt$7=GSp)E1zS~w#^~_+0>%NvHKJdBIQNBb?XG3Dv(D&|SEOF0j zhHMit``{D^792Kw`LjeQg#6pk<#$2cw^jYaNi(B4RCx=h1=;S&hXu`#DS?LbecL8% zNDNXmrcfQD5-id>Ltrfd@cR;enNsMGRBt;4&555dj_!b^6fJUvE?DkuCChCQO9x$y z<~iZ5PEyPLHkIyp3ajItxm=UQ$ShtMXDFY?V8N0iho#@w7f#m7sV5L=eFIzZq|u1G zQa>e8&9Ogz$qM^7Pa@bs)+V%@1C|JUh3#)B3`+#MBPa$yb~|}WBHzqd0Byf)-&@aR z&iKIWVI}nJ6*p`>f3M}xET@Cw$$n>yH9Kqw^3t;XJtR}6em{i;QRwc*1=L-B9Mj7CR@y;gdiQ%(>aRMSO^7*dPSNvghdca#-j%`rXi1+7x2YxR+pTXG$z| z*;@WkEK!)AO4|qN%(6Fc3&~*PZzEpyye&gb2OXeh_J&TsN#e52$g-&i20eN9?WQDW zLv&lRoOyg|KJ6L*u&en(Hlf1^=VbecUtcuh9WO;A65)fyI;DBHPlhb*c~G+J6u@^@ zJQ8OK{1${48*enCQ!?pVz+5h?;uNV?%tn9+Jo1Y#;2)bu{}n~THb5&_yE5{OdvTUB zp(>rPRr`IDmnom*_iwDx+^crdiRhj2{H_((xs+5CSL%+YVtvPXQ&oeRJhih2JaCa!11HN1@5XweQzuly$d{Y1+?Y5iFOz_}o5bDb5 zp>tFkylUdb!#N6855#WkkaHyZ`DzQTG3jI9JuLNn&B!Yv@8$Hb&)|x&5|rSakJX8< zJ8?=E94^(I?y*^r;ID-2uv)v2aonB7^GHtq){Yf3cf7*l0Lw7}X-8p32kDs#cqL+N zqeG`X8BXdfYme3KHj*1Eafjjej&z$#ZMO#pF^Dx+L*6_PBX$m`^7|fsH~QJEUdQDe zqk2XZqSUSWbU-;Y(tag}UL$Yq(oCmO5!tJ9dFp8+@N1olL2UC8mrpc)Q$00I?im*1 zyoc!+)~hM_TiI&&#sVE<2jiezw{l z1OxyB8QTC!fOS;~_*)!|P@VTaoalYZh#y-@MZOJC0LPlqtR9HV%rdTr{ouLpJ?$xB zW7C79Z*T24x*)=I0Z5bqz~hLECS>3p+r9-9Td~>Zb8Pr@p4w^;#vV|lj@+q^rr}cg zGRWsswT)ml)YzU;r}R|5;Ca5u5BR;)HRcXh8J_ zmh)Xq@jZ2UczihLQC8(zx#@RcX|g67U~Twd zb*-o-4;An>8=#jH``4>u#buodz;;92*;xnLIAnl;gDyp|$;4li1%B&7NzMUtsDXn8 zPm|EF5DoU?_vKg!c};~$u4n8T*wm!UZ&p?0xK?4MW z4(=KtgpgpteQg1ZF>ZebW02ENVvo^$TGpWLcj_5J=k zRL#`hy}Q@yetLE9)laW!_QlIw>xFqXY)tRp+LLns&0s?*NsU$ka_!A=-XdOox6_O( z&rf)km~4@2ld>8J*{$Xnhn_VIXvW$gR#x}Np{v`QCRH5{Tv_BNyfv$QDNGv2r|M0) zr~Ol&*@>bBusgZN9=zhlSU2ECr_&dgQ~_aPM$Y~lesxCm1D$(2wr=!27sqR4rOB)9 z&*6Ybx=9pZT3)~WXWnUUN9$2twCsv-wwL3{E9G&kw@=ykX*LpsY>k5talg}=x8pwx zUG^zuQjAR%!xL`koYBz7o}a?&R*+#CsLuBY6bert3lz#$@Ar`z+%=G#j#-u9ZH#J5 zuye(DOW+mnBY7MjcnS>=b7(vn+7T9j=jzLFM&?Ew8f1%U@u8jBjyP8}TCpfJ$c%5* z&z5CvHRx@gWTD{oL%V{R8}-SO*&e4Q=ZwHPedBr6vu62ZjEt5WYYm2OztX&i*f@If z2>piPYfh_;&#OS(*4`~C{_RQqvHjC|++f2F9U%R0%0yJhww(!(A3QX|q zDvn*H6Bd81dHhI46V!g$;5LdRayeP5j~lDa-DM%k{oVnM-xVHmDQ;L+7!38)mAD{m z`r|x82qg6%G!`Bx`;aSoOB3=;r`Gb#oyr7tlrgHdvn?c*@+2>M3hpmcHE;BnXTa&q zc{-GfDk+l|YOnhl9?)dJ->?*~fiB}X__J#ZE$we@Zq;%5 zNZj1^ee^rz;z1MH;A1({NbA}m%DqXBr`ul?*OrLdBqe?nR{nH_GmeA5UqEhK-dWbj zJI`kSg5-)PNfI@$_+FFF@P$tgnM1LebyHYusGqlAToaYuGW9DzV3fRrzT~(+!b&^m z(~1CjNplC@*8C&wxvr{vKM5STv6bE}r*ldim#QZ0#YBP*_nS&rIi3B8&^|V{Cg##M z6obKf(QRQtLUuPfY0n?~Z5fFQR5Ug7cW&~|oIUDw)Id}y2bE3VHMU@(JzC9LG6>7Q ztCdJElVJMrNt|va!J+i0h4~K36|<^AJ#*jJYFhR~NtFzvMw&ITDzTyOxlXH+4{*iD z#+6ygAehiR_%qhGy%AEbhtUVuFQF4fTzf=GH$wle2bW?X4T;GVrU7!}fRA$E6G za_c*1&fH{wo%Ks){rz3f$8VGC*v6LimTbX zmrct0<&*fV&F>(hk9s3?WJ4CZP8G`RfWdjvMutzF$+-YUL zO^0%}7IZWuZt~)BzF!GaHBy=FWR?u9Pdg1Ey2W7Ev@9g!CqXu4uXiYdy{cVcv@Q_^ zzL0`@&$2{|?6W&HZicUDoejN~Bq6wL62y4fZFsUYoVXG;T%o3S-Sb>NZFD&9CX9yVt@>R^W=;qxWN%|%8PoJDY;lOr#s|xOTy5-XP4)_tc9lina+xJPxEj(r zj$zMsWNZhzIeKY2Ava;X`1RS&6V+B%snxMH3$>mrs7TY`Z{m^^b-QqodWQu^nq zCE!^l*`cpwA9g4(bXq)BS1G=6i^8))j9LKWdQ@HccVBS;*(`w)AE%qk3)GEYk zdnksR$xKbfMQtHp=djLmeWqVB{?L5dvk`GBd|p60>`mfR+R!YD^gIVX7L|M_^Y9=f zrM?$DusXk6){F@*7+HiIiFwUPhBD27$IIMy1dow1eDYYz+TE2OX5(&U%OBwC0Uk30 z05b9c9x!WXTOSrHTYE=0S=Rl=R#p~A8(CHZ(I)~=Jd|u593KXG***=@(6tV7wwAPE zm6s!y36KH>xZ3)_SOQ#K+`Od%WLf``D+OL(Cqr3T{>tLxEX!*6M2khq-OH9mgkOYT zfKMgB(NBm~j+jNp%f?PhNBO}&M1Xg)tPVat9#T-KzrR1fzc9bMmpxQaQc@BsAOsZ> z;sbN=c?Y`rzykQ(yxFcr{4GP-*4x_4(Zk2l-Hqj1Cd|s+*GHC>6@1R}&-%G~JON{N z{~_MZ`yVKPct8VS9#BDk0jR4h^xsQ(`>6PVLjI=`-n!svJWw55Z+BlWYg-jRTQ?uJ ze-~k6{jc&KzFsbWHOIypYU^U_3TE{NwF>?>m8xn_wEk7%8UlMqSC79+fnfi)oIZ|r z{{_~6Yt8kOznb&!6#;!Dl5YD8dI577`V+wH1fKL~Z{~gr=7xXq7ORf3MZG zC>v0ejV;X1PSRSK4<=x1#U~;Tv*EK6w}tW93Bn{qY^}g5iTy3g##-uuyO%2r>`q5l zn7u93!_EFL9oK+MDQc<7vI_AF{8x&W3(Ut3EFjDJ*wM{5;J+T|I=b3E^?_ZZDJUi? zEF=tmONa;w35ZGlS0;U1FK^HiuVo4f@C*Mf_qto8z{Y^U!mjNU6!2FGuq{$bUbZkF zcQ0LccNbaK>ngEam;B4TS!Dk1l!uPqV2;3Ri~onsKehGz`|j@{;Ntk#BNmpw%vK6! z{kIZtn4hi9Uy8tTe?PKzfVtV*g5&!i2KCQ$$N!hk5)c*=u(Gzc;S+^{y(}UwD8?r# zE+Wb&Vk00fEGQ&m3$yvVzyBrO+uhE`ALeDNXb-j&Yz=5Yf3=3?-d|91{r9@~JJ??1 zBmjSB8I^2EcNEr-9Q8 zI9oygHC_D!vuhat5B~k5Fa8f|07d^t$^Q!9|G@Phxc*lN{I4?q$GZLl*Z&HE|5fJy zSl9n=a1sC4g2&bk^n(1sf6JyYf3gPV#%Eu`Fn;9*mfiIsiohBU92n%}=R6}X>3@tDPq##TJyYd$IT1Itmh z9k3xpfltn0Z-@8cPTp)%{!$OGF}hDj_N=Dt zNp>M{lZ)l<8#T7f$G1IenURNY94T3+)nMMH9(Xv4Bsun4??mxJ!ia!zN%D3Q4OEMe}t6;bd7u z(@aW2nIdoXPerlt5V&+E>yuat`#;?6cT@?&8;}?Yc>U4|u^A`r22N1`N@$HIng~G= zQ^5^ju)msFa01M4b$7O!kH}AO@*9x8=Z$9}eFinHu>`Tm?{8}NSK8jm%7)n+UU51v z;sIltt}jH3XhYK7r=uOk7o9GL3u7B7H~?q>IGy&$}za*WcO z7tfG^LsOfmc|>|_C3QhDD5+_M5T-p95$oP^KLcP8G?U&@T@Mon{*WwPs3FXc&1;e( zalx|rGL}3cStZaaGS07O?u8PH*Pwf+@nZqJi`75;X4g!_)~K&R8|~)X7QSr6%Qpze zK_JHM1w2kN6DDyC^0blf%RF_ry>}~vXEpryg(2ghjL_5{E9Og7sSZa}ImROW4-iiJ zP|&j4x3S)@8;7qunvUF!y*K*6X)*cIO$qW%C&j(@Ft0cr?YsQHU?0YxRBd#b5}hQN1&0L12rvrsjQGDdz{ zPT1LuVQJPhlqg6qgvybyZ)sb_Gsc58DSt&XJLE@jcGG_N<|n_obE(0kMnN{R#4_tU z&&QSUS;29j9EwGV{&F%AYM9(M*iy^99lZGhPvZEijrInz z<;+HImr!Lwnm{_4k!{oGik$sWP4fLb0tfX07oWNFhRjYx#cF-(N$N@cEJ17eC%d|D zyvCe=UPz*j@~FdfWDdIu16C3>UFBy9jFXm^RZdsm>b6P!9iFBA+{4grpE36ARNyQu6_$|SH%po4*!Y#5MLyms4=Yb%D`f_B{wO_y$1q=ndt?B18}Sx`7O5V}ri0zl z=@Fzj;qR4QGb7(t)24zMVOUd;XIPegEeRPCcl*3g*!G<3D`XqDw7>Z2{Tk|K6_1*p z@}Tk~x7j^2l&&3K40{)uBBw5EvK5!ltbQ!$H9rMJA`NP}Vl7v$vq|<=lq%Zsf4QeK^NuRK_ z{_0+m_{4)tZ*F~z*DWDnlOSKgNo zXRaN5(GkY00oHuw_nt&ek-5wVw95pn95?w7V-<9f;&^OCTq-kmV;T@N->UbdAc~v-wgM=$rSpEPA?oW{cM@!7px&<2nw~z1 znCITvArAREnsZGf)_+IA(MTSI8V{Tt+Oj{X3s|jCrKFv7EHg@{M0htiD$j~zv1T-y2%jkCJDa8B00poiG&EB zFw5RnYD`-?f3;>P=tol)EHECAwP$9fVty{FYDm6@iKp|esbodW%|Z8=8YGL zCDRZ9SWN!*;M-8$t~-A4=F5&#&EA1EPY@?- zOel`P#S1sX7F)_Xg9@QARIJ4a83-Z*x0BX`JM~e%Q{K&JJ;mGhsOl5}&X+H$>E~j& z)_Kh$?+S0w2KrLEouxgwH+#w9rW3scO2=k%KUiZ4)A8a0mI6&bE;xdRr-rcBSu7`4 zE`-g=sNI!N8G~Pqd=Ru;@Zrr0pih%+Y&Vs+-tF?y$Mv@!glGjtK!Hzkt^_7*lzv(f z6(-Yx-JTJZI!4Vrk7BXI{|tV5Eb44MO|WxI zM)7wuCR4o0u$PE3>JO*2^G~L}4}~F(B6v<@^y zE*Jw#IzQ8bZqrLcCrb!Qs}}`Yz0C`m8xv2ZrY&uu&J*QAUcUUOEi4mj3H=@cl+oG- zFV(ur)VR1UGyLqu!uq_Wyeu$HYZyj*0pB;*0QA2ljI&v;+8PWzrdcXJfxIn&wpFV_ z2OESuakQp4Dy$bBWqjq+Z#180y~DxRz*l1gj_(k`TU`fYl|Exwa4HDX+?Gol%KDi~ zAQX22p6>9ozVn^Fug1qh@rp+%-K!g~=ZA|bUU!6-mE^rZz&A7e2V%tmmblZs@hCov z5&Dy-udvwQW|%P!+oc2G6z3r+Tu4)Q4fbYWJbelDc#?uE0tb9UhJLg-6?K47a?d+9 z2D~)Zo5_T1qAfK(T{U~56K}?qIu<#a>QH+27(OHaRB2V4b>~Iq~b8%l}gD*&>eEzFCH>^HI& zD*Hd^Ve-c1aVrdNRey=$$7H~FsOPlHNwjxp0Fq_9H#@TDCkwL?Bp=k*$VCi3%y*Q} z*c(RhM(IkCzS%T7d`G7@b;c*gH^DDL#jc>Yv#}!my=nQKnYz#nGCjn|kvYovGP}w& zxcaWnMt;#{RGxyK9zy|V_xsz%cj5x4%(!Exu*YsN?L7MRyX_JXf_f%1H36;z=oA@y zdBBZ8(eD#EzJl)#8lz-RLi?o;4FG=3R{|uZez)N&;sE05$-eSU{)ux)ILe%26r7Yh zg3-y`SM`)(QF2H}hmUhFT4Afmo5J91stGl>Y`ik^-jLqwh!0K8vQ!NV!jdwbS0mJ# zSp0!wx7{=s{pAbu`o@6L6tSUssqEH)9?_TSwyF3PT(hHawhKHxpy*C82mQ8*c3}Ot zmWHio3BJ^+{_5(sTT=$wt;}%zC1DfD7_l}y6KkwQcPBoa;ulfQqfa+A#|vd)_!HVu z(pL8KMhUm)Myh?KQ&#a8cRWi6zWxZ&{()Yx7(jDEB<`==v9ISZM%s!x`EJh@PxOx04uuB? zbl=!1m3B_c%Qjme_<-*(V&C;Vd?(i5kc3uxd#2eEFhu<%04yUVnU|d}^T+$e9zBq; zjYRHzr62I~<9n%ja2MEkhbr_rs8Go*HM3~+^#f|LhXxX*<$=9%I5_3~$*dl;)NIYD z^y120aqHF06Bag0uwQ$pfQ3Nt+)(^gPa6#`5+-jflvS*PQa%0V5+#m%mYUFqcYqBF zg@}GmvEvFond#$XogsSV{@Xglo{6YT>SbEIVVu0=O{UeT+{1Ozcc)&*WiX=R!HV?$iU;k6{ zT;Ue%mJPwr6I`c>f_D<3gO9^Y+MZa)z|SX&cv@mNFr`%&O9swS?6>>69eaC*_<@Y~SR zSV$7*d7BFcB0eI15h!%jRlF|Czdh=Uqm_1ly$ddsNfkr!6BgsXI{W3;$|AG5L-`f> zZWHUER18L#&m0ZRKD$fC=N@K57i!u=OmU+CRAUcSl`UzX9^U1_a>jWG<^qh0Pt-%wC_Bcv;94@JKD@$qo`HPci; zaVURB*HCg4b0O&R3ovigxT3QH^4Btagra>-3P5)?Q(h#58Gme+U!x*-q*i^R#t|+( zEoi)Gz|Uz_X>Ay`2+X=hYDAHk{IC%M{c;1jf_Ha)Sg7y;lD3u`3S|Pv*rfGHy(J{5 zjc%6}=&RG)>`*eq_pe(_EKEpP^}gL<8q%G?C$`yf+s$%2w>XU8n^b|oAP;bl?l5H& z?+a;Ml8J??`oK<8@IFyaMDH^LtsNjpBXjZ~o|oea+6uf1U>oeV@cR1D zxFS6@w8lBP{g~DFPu{E;5zi3T^!SGI?sy`Z@kYah?dQjebDyC;=w}>e$)W~K?nCHq z`aY&+i8O1O)sd$eexvL=(|XApG;%2;enUzm!gkobGb*m0BeD>_?{g$qaXG&Bf}w+` zggX1Qrq`a7`V;Vul^o;65<`1M!)>aspG_2Aa3~nH@~0{ZF&hV7R%sT$Bd@?T-z)8A z*xbI!n<+^Ey2x#yS5<91{aB&V&&b471h#gkpMT%_mU(p@mWK<30U@-niH|rI#Uqu^ zd$@yN`mGWgC2O)@h>?h#Bms=n)HvWjRbtIC1DL7K2;Xy>_d1_-SDG=ZWFt>GrX(b5 z=sm-(8k5s$8DbWYW}p*QFdtGfy_l@}Vpd^c0tdpQ&elJqP8042 z$#!w}lZ(N`Ur_@dATwG$E_pz`7Ni0!ibXm zeek1$%>syMW`~0g-;|*ZIzH|ilfUKoi5CbFlA`M z71dXYd>U7_2J~(=WKRt9To_K)DpNgr_}!{7N5pVYCs=y*!=t+!w8Iv}YAS zTQH76h8jbz;D~g^sMvCD@YLkv^Us?p?~rQ+h!(?dnRN8=!GwW*6&IS=vOMT z+vQfm|8|qgc8*MT!Eig+?IA$;rL_Ih)K=xk~!RK-avO( zc&lV?{1`8Mzx9tQu&ML9Pb2r%Fab2wAM8AIaNVTpSBQ$o$&YcG^zLSPLj%o z1o#GkMbapw&#M1qSsb=1r~k7eGqo#EvXlllPx^6Ncs+f0YtNY4M%H3P4nR1zHdL!C zc^4O~eauHcy={zgbofQ2tgMfk`P{eaPxwXs0{BYU(*I$jg9P-cAIe@-Zk@eAQv8AV zt2i2!+Dn~dElIRqO|4_Si5$tN*;t;uD=XkLR+BJk4h%-6J6`3)KMpVHbtRo9`JH`U zwDYv)$*_UCd*TlDKGf7YO8>N^+mvd%esPYxJQQ>tYOV%VetQKIX}CN52w)UJq{?ax zR3~Y}g`OF7eq*X+e&H>#;D?;h43)e73z6^`jM{~`v|of!CH?M*&Wpz}D> zl^B=#RWyW~;4Nz@Pqh(*z_onMg>QK2CLdh3(h2$l{4xC#kRZ?8We!RuF>7e)bM~{} z5pM_)c<=J_UiYz_t@gGGPaalGi>aH-tV<*2zrWmN;cdX`cAGLvjepJ#4_IQ?VFyfm zG?g?s-aOdo-tt&~)fTZM50X|)K!SyLZZY97q=rFhbgSiSfXkD1_wc+^583XQfpNn7 zbbtqe$GN(HCfXkzxH*VBc8JIs^Q)vD_{z?s#IDiz@!%IXU29*o+6tu&<}Kn*1_|14 z^XXl-Tx_6btY06w&~)*z52l8<#SjZwMxE}8$sBNt2TAG1T zcg-)h&YCWKDOm`~updjmcKgPUI6veOxST$&1DWUptpSsW`w}$QeuiM+B9_Zk$c@$0 zfo>k9Tb36sXGXJ$7c;&YqW&$bUk0Yw;+t|0Si|!&JTpf=SBodK={+3NdtY0uMhKG* z7cbj$MsD2c?+6CX9+ly)Pda@AVaC+ThWUW{klsJ(VuXi~qE!3HBtfHbxDqk@d<$z- zIU)NQ3+=)B#nvgErj((?3b#zO8sc0uLLP_jA(~z+PpKR9alupkA9Sbv39ImWW4~>0 z`0OMYaa8#oi8)CPI%^QeIy-e+!1X!&=#-NcKG9O$4=JRrGtri{EGEdN1WcH>t<21i z{1@9xPqxf+W+_>~{~Dvq9ifU(Zx7S}3ac&$g$F8kH?5%CV&w)>3-OOQmR8eFj4Enn z(#qxq8J_%(t~qTCcJ>E2O|hD4i^~ddPi-e0*MnM4%$=1tH<(V< zUuhe|z;NeZF zg}gLs1vzhygN)OXEyeA1!R>%0I9K`jP|$+>f{)e$rqDpf;*OT=QuuvxkW1(63^gh|oYQKD?0*AQ+`xOJ0eo+*5+MNs_0+a~ae^CY{aWx?8!I3&WJdCQ1K$Ua%Uu$j(ok@ni`V1g@q+wG=8Qo=``?nQvpEiXx zwM{l2l*A~f=t=IjB`{~_{~S+|UGiJ{G_D^eP>6H0F7&muN8?HUd^DjljCB6;8B-8B zm#h&R*&?{NA?h8ccc0QT5l8sIn1poR`x3n)9v5GhTi~L^bFi~gW)9(SL4Wj+aaiz1 zR)_sn_+?<5OC3X0MV{btQBd>yUbnt_mlY0g83z>6vK5o*?$G?r?bpokzBjL0ANwXX z#<=EDF7en!~ zH0zG#Ex3$2i_iBTe+9>7FZ4?AgMKvqnYQ}<0Lti`!DhH9?5n7N#j_{xNBLS8Wuj&UT=^?GocC0m`%!83xyts%C_g|Cc zV0dsABl?*ws3pY0+#s=)ME!ElWCde%F5euWI1w~{`LVw$d$L*f?ykw?$?)5NSKH6& zzojsrB&aRuu^R_2^~_3m{MrQ%sR#<{kVUg=JtHGa?uRv0!|0Z*1}J(n%N9hPn+ z(9^(6xy`ek7mxC7LDZjjAcZVi!&YgLi{E;@U%YnLyVq1N|3#xG*X*P`4d*c2R?twcpje0^(sgkngq9$wDKWwTDSB#OSh*t{ zF7(@|?KgYf6R=~SyiERV622QX>gb^%d^mNu*KAof-93}{vEYTWL)ud>HvNI> zegYW=R$g&@bB{MvEgH|x2%06Js~ov+(iv)p?@wV?%^?!$n=VFxoSZ1PhD!JP*tIt}@P_ zQ?0z;E$b@_NR+WUdLhfRyq<1$`q5(soHaDMm#Cz7hD%z{tSv)dK!=&q>*N$thGgZy zov|3%)JyjLMXq|y`Z_1SK<4j(9NGLC24)gwgdEPfq|(*>1AlqInxhjpb$h3 z)J2A`n11O771+3GgAVG#Opc zEuiR=d5Uk?NcmRwbnwP79C$_rg$Vz?Y+QX169E8>i`TIL$zg=~Sx-!)p5C9~|F+MV zF0uEGO?pJT?M>Rri74)}|2+l&bNjKKZbrD2<|qDN)?c2^#UBdv1nF5{omKI7eIOZG zk6HZvj3r3Mo3~QEXfUmil`srz!IWVN@Yk*kJKo6qI{j(iy4Gs#STf=XxI@mdFCETo zF-8Fi3%OMiODdu~WJf|A>4(;r6w?t1a<+k%T{2pkLr`0SLA5Mz=|cz=88YUkpKe5y z3?a%}ozT|FcJ^}D8;Phk-!NO}t5>S0wtwo8+OAidL-4d(_gh_+qmZjZX5n)abWz;~ zc1sR(NypY5oT}T1U!erUXH`;5uiEG!b)?ry?Yi*+NLY4@O&ya7zs!zl(2_1BV++e3 z05{G9F{t-R_bnIT>V8`Sixy);pE1wH7I`w&8Xs#U( zfi6~a)g0>>Ca6-kOxU(CAG^)hyt#OGV}INgbQa&7G78+OhaF2U+kXQ^l`;uwp_EGS zuI}J`TBP@Lxu`w~En1+dbQ=o3x`2e&&Y$D7)k{x98jF(hR04gPdL>RF>Ye7xeNA|D zrtYnuBvzHZoKCr&wV7HTe=4%n)DOPOHAa@D&ICXWbUOz=&uiMIXouKTR$=+>t{(I( zC8+OS2Ni^L!9&Ej!)vAMKo?=B)%%qsqv59{oUD6okF=`A7Fu%jA#{ZJHhSp4;6r0u ziXYS-yX44Nx6GFpXFeUUK=$0(rW6`%y3p^EYDD71BGpd!se~-4Cmz6e8%p69U}AId zDL!(!TIhvLG=aGX<&BU!J|2Ti#g}c}#10iY5v{+cN)JjdD@W>RZ&<`szc=B!TJQu{ z5ih6fnJoUXqF9Gy6l1==*uql%j)Nq&Xqo4Fe8*`6%L%WLw3j=XU56T?#Uo*>f(wH2YA66! z!jJ14*2d#{c%S~@06`^|_)J|r#vel-Js$7oESFGseyIbM{xBa)9xa+OJT-NX>mIw? zsq_vDHWX(7oH5sZ^U|=Sm?HI24MbQHiYNsylbIO2OVaH41q=S@CKJ?;x^xVx2M#pN zBtQKfv4s_D3NiHgqJr15!!c8}DZ8WD!;QxIeO51Ay z1G+oidb$t^tCMiO@dB|2hrvHi}V(0%hA)w?wcC*j_+Ve5_i^t@a!$DzG)cz%3y`y_PQR5t0!XE}cJ;xiH+_w^rN+dyg4Y@O=Bw<7tS-w(Zd_V(zHUH@*cFJOUi5V zO0?dn#r6%6@rZ5H&P~(1b8Y9s8MD)J2h(B<0gJ8bq4oRo?&x0>G`R*c$MdIT_;#FH zG_gb$ItQ-`JLA7n2a>Y#--&V&dh1Ji+O{?T3C2p!egiPZ_Lcj>2lg_!%uxDPKk z==HSZ`9sW7<0Ii(Gukmvx%%n*(jyD9 z+`adX@BLbDHc&4^!G&n0T;Bk<*z)}v^S5~KieMcvbQ+qE?I`(`w{4BcJr5#n-%f_U zC1R0xQWPL;I84JF$@xCYDxRvi$0zKvy>{PRb5c$5bTRZoX_l9;aJXZz;R|X*{zUaK z^@9~rtGBA(maQV{M45D9em!E=b9=j|lU=ni%aJ?z-Q=s$fts$a0M6O3c+;R|-fI4x z7rL$%^Qt|SBuhio*VlP3X52#b&yp(a=)T_Jsw#Y;<$J5X-n3a8;FkD49X~Ntxa}9|B+n%g2Y@-_z#DgGMk`>cmwZ#xPH(` zZCu?woSt^_6x#}X?UbVL@on3G#gmwg)v#c}=x!{$QB)bkc|94_0PAy>wQyb&tpN3b z96<|Q?#{Q2h>>E~*~RZqUP!|*wxQWGi;L$P6AdRPPcrfy@=nrEJe|@Nh5JbKf%h)* zpd)4$H5RW7#z}z-G@^E_AK=NRm1||W6}7n@8KBgcdC8XC??*Z5jX~ytSq% zZQ$6Rj2WuE>6_|M<|K5r<73rjoAi#M(bWfCa&PDItoYs-!a}HL?Q(O0UWfNyO!++BTbu9LXwR-h2y$0m{`N*uR zJFxv{lke0zX)8H0ZLhv3^j(L&d14FjoA})ia>?Ni#_7`_oZUJ9{Kp`ouvc*AhjVL) zfhjZh?E-`CZX8*x{3&8BXWDk6mU^>n#1rfCA2%!#zIDx2n4#TW_J)rtQ`-E&4H$uU zP5yqUNE7=>^I#!Ik+MA!2}C;9$J%0|oF&qybRRzyft<@jiHO}X@K9ZA4{D8OV@Fe& zx-RM-S{b9OiDHgP0bR*1fnTa1c#!5pu^-JKsF}-FD>bwR+UL zYgvLs!`;KyF-c&2j&*J6sv!E+)s8x$)v9_}zv=0j=NwW8edaj1r%Kp<`%#hX^y{j@ z&$5fZ?EBBI=>bDO>_YQ05s;X%Bp(=uXpNnmn#~9l|GMzl*~Lu>nOLAbT+89+%D*8M zx@oa$z&E#s9{*6)idSX0hqA{^H<#`yIRNHo>GH&yU8$87{(UoHKP{li^$k^urmf@e z7WkbfGr9C0He6F+>Zm*XOr-{ix92FpXq}|Zk^SM8Ge2<0uZr&}_!@Cq3>oG7p>9Nu zM-C@EmZf@sV}B~5L)!0qU8|dZG=EC_US3~9oK+()e&&>zU0ReKIFF7dio@w!+X;8p zvz}&CIV692K>Yw7&8*S?^>M%#_3^0GlgV0Un!l;#ffvIkaUFa6_PG^o;VMR?tV_i8 z)0Z6jmn!>!^7UeG?^2eejjhZl;VODGt7D5p)9!RY0ZG^6P_ZxoWab{utm7Upyn%_7 zxy3^Bl6j))ES%~W#c{qCBabD`5@c59g1+;TBJwwG!9n`FjPo&oT*1@i*2gZR>@hBR z8(xg{u9>-FnL=(g!maMrLrFr#sVCnpU%OH&lTHnY!3$ms65?#qSqmLhyXwKpiFfni zkDI0nvs|fyhRI~L7^a>P?BM=P%ws0dFr%1Kl!&N7+Ncl8EQ^$W|Lj-{titx{Djb-l zLYt>JA!+v^=56X;g%5Ka8bp0CMS1Gu?Q@$g>J?<7$ur5*8B*uWsWe?;5Y#~uBTAzW z&loLGZbq>vvox?F@OuebgVe6QP{VLqDPz6=Ve>N}=nz|1cYzEj0)6@~>x1IXd=k6q zCj>7?H1TS{=U=z$OaNe8%uP&p3v;t{_9R}q{A6q&y1K z$#n{zvu`=`m1N$ygngbG(u!nMR>>{n-myXFfLv&x3y8o*vx%m7xo*7)xZHWhA`{f^ zmv46m&&YK0vsou)9gZjo7b){bx$K_!?1k3cQHZ#UT>9V%#_Q{F|+aAoL&OEt1#NqI{s(JOewgzT8 z5Aj?fhFM>#Ps2*(+eC|S^(uYd$>dA>?)f6KA&Hmd(W7@;%Wd-QJZfU_rV=Iko=9kt z-#u8DV^~JnP!m1Wo6Tvb&^Uy3%b=dN+03Zi`IG;2D8N2lOosk=|Fedywfq(l`ZeC2 zqqn=-JDmt4+yO z8};6ROU`v^dDtk_Ve8&n(3&1B*|F;# z5&1QTNMGbAIw#`}pKq>}j!6!dFI>HODg%RF6A6Zet#3G8=pzrfUrm>Ylhcr4s% zfcNW~tJ-VWy%m&E7~@YL&AHRnI8Z2KuG2*Qm8MYYgGOBruhMP)X<^RiA8 z4k+p(V-9)O{nI0`t4)JR_Z$Bhca*3$AEvy^!8?ro_JK4rmi8nF0j~*b+&Hc(k6G`O zUPm)$EhufH-^BH)?TN~)_@h9E7@3!t&ckU2Z2y7WL};fohjRj_ar%k&78sxgs#WsrfQ|LSo`$%Lm)m$D@~I@vUzVD>+q|i%S6mX!6Fk>(r zUA;cF%=@PF4Q=^GX2Oxf_?c;`>FRm8$P_nOBcrf!WLDVnK-BCJhVgnLA$bBbFprPi z*h!zX_>Pk_uRy7oY*7~!rh#cpW2Y>AQWrJ?FYCLI139TXAiK>9l4IYOW{t;fG}PB3 zOpPa?I95^zzSv&~-%gya)yQWmqklYW8hf*bjyrF3Jbi8T{geWnaLgTk4p1gFUXXsH znl{@z2B-p?^${~C_QKNvwBMQ&Hcs1!_o-z6eBiaLnk-Fhs|S4@pW+?9QZfX~4ql7K zLIE+k%Id2AMCdOaH3s;gRd zxHUGkuS8p3*?s|U>i;Nz= zGk8|-m#VJRNI5{t^)NSXdyL6Gxo&vvTW;kdQzea&5;?1T24B34jdtAqUzzdeC1ZKE zOcjD(iMy7H6MQEsqeK~&IYXLb2-=DHP`gC4wTGg1DkpY1GkSpYWLMtf_mq8~bCi#E zu>ASdI5g@$k}lxX=Kc=pM>d^q{a&kbRX#M|zT~S+>&h#`Fgr-bP|$LPc#HCN0|5B4 z?YJX?rH9jB2mXk`wr%ouk_V1-Ds6Q?iC+WJ#zZ6Xc01uu%CxrnT}z&~ckua3#GNM> zmiwG?D@j{6l6I6;iCzvdPG`b*hc&n#Cr>9kIdoR{h44_7?SgNf>^h#UK6f_f^iSzV z_4V8GcJsbnr!g(bAY0%0qjUb}>=1?=a%1!wPZqb<1? zZ~6T@*XGObGkSCtn3P!=i$d3IH^evBq1sZxS#xUUwXqgayI`>)w`@GFc{(r8^t`~9 zN5H!K`_Iv|Q$Ggls*v?|ToSc?_i6M|N8z>@Fzz@~Q)SfxTtRfiJ%9Rms@EKiXF>NT z+mh?8VO#er-`S36cUtnad1W@jlF!3mSiK}`8w~OBc^K%(RVwS|z6--F@wn=lm2i!X zN)0%+>ohhU;K9v)=9Q%I>gQ||7xP8-(qALo`R}--zf&ORNS1Ii_k1<}^h?%fyJr=I zy-hS-!NW}(&i)D-nqqYYR;ge;Xh@icrq<)1C1=eZzzF2nDR2{V?5cmr*rsNBHQCdv zq8g?-2*IzIlwAs%+kd?iJ&(oiRTzSN=DZ&_=FHS0^V+ne75eOg4$0S-`+{3Y+ZEfy z9aLl?Q)Grw;g$52H>1_GUwJWA=FF{ANbg!uz4h4IPigF9VMy61p}eoP>F)oAub(`I zH`xHM-TY@?>Fc$_Vug&KefR#bJk@Y-7wnN7pRbJ{X&7KbI$vE#asI~LJSzsEJ*LY7 z;CoD=m;|OH@Qy&I@{yLAiB1M_W2J29l^U!#E+$-=^%Wt4{pNFJfaBFe_M2E4|4Lv5 zz@G^Ho$wIX63p>;!gJs;>#KhxP=u?2MgQ*!pI_?A1WdFJ-+Os~H0^AWaQt$ZYiJ}^ zffe#U2=CLnTkW?Q>aQWi~K5lmjv?0E5T z0gr63To-gATED(ma?GzRVIgjH3Ry*R*^;r2bbs zspY}B+mB}mG8V#7)HjG?+)^9VULjg}RrR39a4?+kdDjqMc$wwPh?QyKG8Cv%&@Djq zTz>>boltt6YGEwbre1H6B<;>Z4hjG&O@>1%yg4HY6PeYp-|nZGJ|r(VJZ47tNIqFr zJz76`MeKc%0=P88sC4r}s1q&VeL)@fisVG#XX5Zj0Mg4ocW-?ZMg5{_F0;^u@HQB( zNnCBRzuqS!9!ZdxSA6uDrSZhArQbWASmu42y-D1vs^)hVif|GI?$72TM(n4ns!w03 zu}2aB4T7{?C=k$(GBj&ks{R+(M#Y80n^KtFc*u5bNf!KtYJ1(ups}odyQeAHu&N4L z+>vQYA;bJ3&)`PHhoD9g_{W;PsRPBGBNr0b#SuP2*FC)}`PWWrGhw82N*5G*pZu>B zXDt8f7=G$ls}~fNIY++X(8~Iw9|`#ewE4!LHqGc3U2_Qik^}XIpA_D|W7t zT`%F>d{cPH_UgWY`IGNc4QSrFNEzYld@_HT`u~S%{AKF@v#ppAIV&16YvT+n(apzo zK^JbyhP-0ZS6iitzG+<#w*(iA+}O{h4}PMix5quxIooUG-)(8eFiMoNzWj;fi7ffhF9WNX%fc%Hulx$E9cT$IomCfc? zG^(o`^x>OS?5`ev^hl9#3~@qLvB{5?yw6qLMi$T~=3Sr~I4-%zL_|7J?dkiid7FCL zLmzyDM-#g=;UO(pQ^}OFTY)u-;q}AaPzzwE`#IBz%nS>{6dtkVc!o`iY>7a#`0dt< z)5s6Gs`Pf{Zg&!x*RVkI(|LF#OZJ3A4#V|Z#&}+4>fVA#@8n@$y@*IA>Q7<*v4iii zrFZCP*~@OIJ@9|6PwB)XhI=*g`<)mIL>$G~KRo;WLo|lNXwB;6*BJFiYY~0e)&pe-8hjtr+wF^Z%_pDf8bv-+gWGzTh4I z)=9fh{L8d`{*LwE@_F|AbG+s(&;KuX=U^}3|%GmrDU?tJmBCB*h&iqh}a?D~}F?oRVLm%mngIqyWu{(`sa zWpgXfY_R5h>*rGTXs7MNyABO+o^SuF!Eoc9O323re?H7PQI~itoN0qk-JBm<3<|%0 zX4~^IlvOAF;$_%0fB(1cyK`#l=6#6stJ^ex{s-3rO08&t#p0*zBvDkP4n%)EuO+U@wIpSdUcbV=jDHUG32d#sT8ySL1Uh! z<;#aHwdtcRmpU_T757#}0DbVrUGTs) z;k+AP!?owmxF&pQb-U{~?&Ecj_TAcV7~*g7@5tlriGRn zmATVBY}>5$Z@)Qz<39gSuSI*c`r{{mS5$cT)UKBX9*XsE<<)1|yZ-_;ZjN75J?Z2g z`Fq^2BCc_!OGi!B?>uRDlRtWu`ph%GAMRbS?>g^++xap<`&86^wjBzdu3FA|4g;d6E>XVXA%1T#M!3?H_yla zzNEvk-_LBh_m#fXxenjBum8IjZ!3KgCJ1yH!%h8|-<=cf=chKfaCruLI4|~Z6q)v7 zW&ym_fj99J(F|d@EHDAqRDm>Rh|mNn;eo9kpiW@bPdOFT_ Mp00i_>zopr0GF++)Bpeg literal 0 HcmV?d00001 diff --git a/examples/resources/lib/vector2.lua b/examples/resources/lib/vector2.lua index 305f483..862718f 100644 --- a/examples/resources/lib/vector2.lua +++ b/examples/resources/lib/vector2.lua @@ -45,6 +45,8 @@ Vector2.meta = { function Vector2:new( x, y ) if type( x ) == "table" then x, y = table.unpack( x ) + elseif type( x ) == "nil" then + x, y = 0, 0 end local o = { diff --git a/examples/resources/lib/vector3.lua b/examples/resources/lib/vector3.lua index b0f1be9..bf3e4a7 100644 --- a/examples/resources/lib/vector3.lua +++ b/examples/resources/lib/vector3.lua @@ -59,6 +59,8 @@ end function Vector3:set( x, y, z ) if type( x ) == "table" then x, y, z = table.unpack( x ) + elseif type( x ) == "nil" then + x, y, z = 0, 0, 0 end self.x = x diff --git a/include/lua_core.h b/include/lua_core.h index 2cd120e..58b84d2 100644 --- a/include/lua_core.h +++ b/include/lua_core.h @@ -27,5 +27,6 @@ void uluaPushQuaternion( lua_State *L, Quaternion quaternion ); void uluaPushMatrix( lua_State *L, Matrix matrix ); void uluaPushRay( lua_State *L, Ray ray ); void uluaPushRayCollision( lua_State *L, RayCollision rayCol ); +void uluaPushBoundingBox( lua_State *L, BoundingBox box ); int uluaGetTableLen( lua_State *L ); diff --git a/include/models.h b/include/models.h index 15dae09..3e1d63e 100644 --- a/include/models.h +++ b/include/models.h @@ -35,6 +35,10 @@ int lmodelsUnloadMesh( lua_State *L ); int lmodelsDrawMesh( lua_State *L ); int lmodelsDrawMeshInstanced( lua_State *L ); int lmodelsSetMeshColor( lua_State *L ); +int lmodelsExportMesh( lua_State *L ); +int lmodelsGetMeshBoundingBox( lua_State *L ); +int lmodelsGenMeshTangents( lua_State *L ); +int lmodelsGenMeshBinormals( lua_State *L ); /* Material. */ int lmodelsLoadMaterialDefault( lua_State *L ); int lmodelsCreateMaterial( lua_State *L ); diff --git a/src/lua_core.c b/src/lua_core.c index 9a61120..f109f1b 100644 --- a/src/lua_core.c +++ b/src/lua_core.c @@ -781,6 +781,10 @@ void luaRegister() { lua_register( L, "RL_DrawMesh", lmodelsDrawMesh ); lua_register( L, "RL_DrawMeshInstanced", lmodelsDrawMeshInstanced ); lua_register( L, "RL_SetMeshColor", lmodelsSetMeshColor ); + lua_register( L, "RL_ExportMesh", lmodelsExportMesh ); + lua_register( L, "RL_GetMeshBoundingBox", lmodelsGetMeshBoundingBox ); + lua_register( L, "RL_GenMeshTangents", lmodelsGenMeshTangents ); + lua_register( L, "RL_GenMeshBinormals", lmodelsGenMeshBinormals ); /* Material. */ lua_register( L, "RL_LoadMaterialDefault", lmodelsLoadMaterialDefault ); lua_register( L, "RL_CreateMaterial", lmodelsCreateMaterial ); @@ -1626,6 +1630,28 @@ void uluaPushRayCollision( lua_State *L, RayCollision rayCol ) { lua_setfield( L, -2, "normal" ); } +void uluaPushBoundingBox( lua_State *L, BoundingBox box ) { + lua_createtable( L, 2, 0 ); + + lua_createtable( L, 3, 0 ); + lua_pushnumber( L, box.min.x ); + lua_rawseti( L, -2, 1 ); + lua_pushnumber( L, box.min.y ); + lua_rawseti( L, -2, 2 ); + lua_pushnumber( L, box.min.z ); + lua_rawseti( L, -2, 3 ); + lua_rawseti( L, -2, 1 ); + + lua_createtable( L, 3, 0 ); + lua_pushnumber( L, box.max.x ); + lua_rawseti( L, -2, 1 ); + lua_pushnumber( L, box.max.y ); + lua_rawseti( L, -2, 2 ); + lua_pushnumber( L, box.max.z ); + lua_rawseti( L, -2, 3 ); + lua_rawseti( L, -2, 2 ); +} + int uluaGetTableLen( lua_State *L ) { int t = lua_gettop( L ), i = 0; lua_pushnil( L ); diff --git a/src/models.c b/src/models.c index 0ae7805..2ae4de6 100644 --- a/src/models.c +++ b/src/models.c @@ -1374,6 +1374,108 @@ int lmodelsSetMeshColor( lua_State *L ) { return 1; } +/* +> success = RL_ExportMesh( Mesh mesh, string fileName ) + +Export mesh data to file, returns true on success + +- Failure return false +- Success return true +*/ +int lmodelsExportMesh( lua_State *L ) { + if ( !lua_isnumber( L, -2 ) || !lua_isstring( L, -1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ExportMesh( Mesh mesh, string fileName )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t meshId = lua_tointeger( L, -2 ); + + if ( !validMesh( meshId ) ) { + lua_pushboolean( L, false ); + return 1; + } + lua_pushboolean( L, ExportMesh( *state->meshes[ meshId ], lua_tostring( L, -1 ) ) ); + + return 1; +} + +/* +> boundingBox = RL_GetMeshBoundingBox( Mesh mesh ) + +Compute mesh bounding box limits + +- Failure return false +- Success return BoundingBox +*/ +int lmodelsGetMeshBoundingBox( lua_State *L ) { + if ( !lua_isnumber( L, -1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetMeshBoundingBox( Mesh mesh )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t meshId = lua_tointeger( L, -1 ); + + if ( !validMesh( meshId ) ) { + lua_pushboolean( L, false ); + return 1; + } + uluaPushBoundingBox( L, GetMeshBoundingBox( *state->meshes[ meshId ] ) ); + + return 1; +} + +/* +> success = RL_GenMeshTangents( Mesh mesh ) + +Compute mesh tangents + +- Failure return false +- Success return true +*/ +int lmodelsGenMeshTangents( lua_State *L ) { + if ( !lua_isnumber( L, -1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GenMeshTangents( Mesh mesh )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t meshId = lua_tointeger( L, -1 ); + + if ( !validMesh( meshId ) ) { + lua_pushboolean( L, false ); + return 1; + } + GenMeshTangents( state->meshes[ meshId ] ); + lua_pushboolean( L, true ); + + return 1; +} + +/* +> success = RL_GenMeshBinormals( Mesh mesh ) + +Compute mesh binormals + +- Failure return false +- Success return true +*/ +int lmodelsGenMeshBinormals( lua_State *L ) { + if ( !lua_isnumber( L, -1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GenMeshBinormals( Mesh mesh )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t meshId = lua_tointeger( L, -1 ); + + if ( !validMesh( meshId ) ) { + lua_pushboolean( L, false ); + return 1; + } + GenMeshBinormals( state->meshes[ meshId ] ); + lua_pushboolean( L, true ); + + return 1; +} + /* ## Models - Material */ @@ -1544,8 +1646,7 @@ int lmodelsSetMaterialTexture( lua_State *L ) { lua_pushboolean( L, false ); return 1; } - - // SetMaterialTexture( state->materials[ lua_tointeger( L, -3 ) ], lua_tointeger( L, -2 ), *state->textures[ lua_tointeger( L, -1 ) ] ); + SetMaterialTexture( state->materials[ materialId ], lua_tointeger( L, -2 ), *texturesGetSourceTexture( texId ) ); lua_pushboolean( L, true );