From 6cbd93aad01c06e2e909e76081c1f22aeab74ee2 Mon Sep 17 00:00:00 2001 From: CDaut Date: Sat, 18 Nov 2023 01:44:04 +0100 Subject: [PATCH] algorithm to cast rays and build an image based on result --- Cargo.toml | 3 +- result_image.png | Bin 0 -> 6853 bytes scenes/cube_on_plane.blend | Bin 912860 -> 929412 bytes scenes/cube_on_plane.glb | Bin 3640 -> 3620 bytes src/geometry.rs | 74 +++++++++++++++++++++++++++++---- src/main.rs | 29 ++++++++++--- src/renderer.rs | 83 +++++++++++++++++++++++++++++-------- 7 files changed, 159 insertions(+), 30 deletions(-) create mode 100644 result_image.png diff --git a/Cargo.toml b/Cargo.toml index c2e914f..b60a5bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,4 +9,5 @@ edition = "2021" easy-gltf = "1.1.1" clap = { version = "4.4.8", features = ["derive"] } cgmath = "0.18.0" -rayon = "1.8.0" \ No newline at end of file +rayon = "1.8.0" +image = "0.24.7" \ No newline at end of file diff --git a/result_image.png b/result_image.png new file mode 100644 index 0000000000000000000000000000000000000000..df85266f5468f409e419013d2646cb5f27c98cef GIT binary patch literal 6853 zcmeAS@N?(olHy`uVBq!ia0y~yU}6Aa4mJh`hA$OYelaje^?15ChEy=VeZV+D#dDI1 zr%?B*nY-OxT+-6g!a_qsL(4(n`x#n*5|Gj1;UHVm(%jr!T6WK#$#vc*Exf$6yxjjh z$V#6i)-$2uv87i-!(+ex=bXBF-L6-wK*WD(EvRtm)&J%pFyU4I^H;=xRhM23{eM4T zCq(tC)&KS{ECLw)I1T#3k`&4N7Uuh(R z>P0~Yy-%6_+w&2m9Q*$fRO;0$+`i*41kJ$xE>Bmj{x=y}8xKfZ`~kD?lc65_zg8e& z-7outX8&({z)UIvm8JV9=Dt&hdDRShwrde~H`BAaVkk0u6I~Mfm^MH=jYm zV)Z{!u%U*qh-h6zM#=xRz5^Bk;(cRC;y45V4iSe?gcNT%B-NIRCD1Itxu_ zf2Bb|jmx+H_+bfB--wLL@4weJSZ!FZ3`z<6=fHdzPI28>ZwO1%>)oEN`d^w;46SVc z^MMiuBxZ=OoBvIp1WTf7c=XqcB4S0D=vZ-r#mfC23akElUby}B4Cql(F9{2h_jqC- zQhMxqMOHEUpKIGrE|o$^Q16!}HUuE4jl9;;uXrbD-u>IY0C&Fn{}_=SnTgE8kb*1r z>wmnhuzE&Vu*!oa+(jEji5n8=;iD~4NKH7}pZQOlF5kh>@W1?Nvmtrq-(kU+ulCcR ziF?;8dq#Q`sw8dd1yWt0jmUt# zkP7pHFR~Z#HJ0IKJy`X>6xKuv{m;h|9{Y9wj9jR6_+s2m7{bjFuvv59W`WY0Dm<<2 z7bGSWki8=iQ+gHD6@qjhUEOfis|Q2>XCv|>FR~HHAp(vRWmu$iw-A%0S;GIWSA+KZ z*8K`s0>!H{%!vIR#2A6xTnFVUq^_J`%-8+%;7KmNkr?AZVO&1}8pc(PD`LLZH>ohd zoD}+>Nh|#Ce5Foycpu7E93-OF`8*AlX5v9zb?ZqL3b5?`pNr{CXt-@d?!Wc09@Y8g zQ=#Fu;+}WTn?d6J?|jf0VH}624b1Xi@%^BVxVFcmMws>gtw6rL?~oW|1U-o(cv(F1W#<~)&J@sdmtqp@jW|e#v2`Vh2-+lf$7n) mduWa#(C;1o8SSAwWB>ODi}tH#d|+T;VDNPHb6Mw<&;$S<7#0%% literal 0 HcmV?d00001 diff --git a/scenes/cube_on_plane.blend b/scenes/cube_on_plane.blend index a345c0ba8e4523f03d5ecb0319b0630b57c6f352..ffb9fdb5554d2e9ae8b439c40153dc8b6bd391d5 100644 GIT binary patch delta 91472 zcmca}+q~tj#RL)71;3Lr|4fvOW<61*I{)y*%Ie7qjJ1=`vgS^%;o zC`cbnKxK0eUm~)A#N-~nD-##+Ojcm*oqU$H7OIg0A}lglfpOyGv#gDi>-g9vPZ0Y8 z4!$^R!znmoB*PkZw^Ej5sW4U>EHj5e>+G6I<~XL65$)#i0t zb|8~GCifUQZC%%U?lE%PJWnGD#EF1#w3UKfGMYu#EmuhYtAoZRas1LedsPVV*4fO3KvC--`pKsoM=lY4y} zpd4$)$-RC)U{0KOIpgHHZZkLM`4%%yp6ek37G0+$%s9C>q-641x6aM$w3rzu_lC8A zIFr|DeVW`8#W8tCRPW@qZoQM&Y2BOL6C*MyJ!0|#KTD|4xye0oDi9%CsL-y-JqacV zp{bMCX)T)EljH&s3Se(-@AzL>Ts*lxzIpOGt**&EDIpLk3;vF-?*H`-jsH8lyZ;v! z6-};BoIQD+R?+01v<$EkFB$Qk-v0j$P0jyX+S>p3^!0%;NNIn%7*lWGWc|pmlY7!i zCNGF#0qbyMk?-rD_`j*S<$q&yGgviD7l;PwtWOu6ye34sn>^QzXYyLN?8y&m0wyoW$YF14Y5m{O z)HK;YR~Mot_uS;UKA>3To;;yUZ1TPSdEl^XXl$AspDsH&Ay)#TF5i*4yu5Pq`TV_; z7r60E?x|3lJg=m0vcYVP$qBh4%!P$Tlj{o|nUj)|k<_f1ydZ{S@`RZzj4hK5CtJf* zu_h!W{_mT7F@HDIEVIe;%Bm(C)H*O16c&QbiH(h$+@ItM4qhLf$roCpCeJGgW9*)6 zSZ~idIWI2{B+niZ9`V1c zyBA^(NL^b9NFC#($@=Y%%sIKaAXSqmq_RvtQ-5&s+!&6@y&V~o*EYCMHfVQX&d$yT z$+L$92mkLxHl?d!^4bRd$p+mH%$b>)AT^UuG#`cN@0l}sZG-S+gI)*bw6t`P9D8t3 z@c-8KPJ}CZ7EfN#z%$vP-+?(bH4UT&cCu9UNO0Uy7A<7GliHdDyk;`pV|zLjR`YZCQq1RGI_z2ipd7k&1C!k_x4Zx z-#1|r7=zf=)wTcA(=+~uhlNkB&()v2ZzdaaX<7N?{x+}4f2USY-mtb}@`Gs>lMSZp zF!%QNPrhHHIN6|{g}t<_{68qc&7ZEzTwGi_`TX>~lNU5_OzxQ{H~HWCy2%fwiA*-= zR+*eI(*TqZx!XEA{}&V#{f~`_oxFOcA~+o(^emXXU=q({gL=8iesgsu&nuCeJYgn> ze0EOm|H#Ow|6!q_7&tdK4`Js5uzvQgp5Ff*U0svS=ciAeSHdRQ-P`xSva0%jdV2c* z@USqr8QGK1PTvo9?Sv(wlh-Z@o&0aT(`226Jj}g){geBf)F!WO@aAvt?D}6?R`x$B zG3kF!PA=TG3CnaRuU!&3`QLgqZjg8JdF_&L z;m+=!|IMv!U{l&Vy8id}O_&_N(vuq`1}a2Asd)YBTa$a&bWC2m#90{RPf(!?k_Q!P zVAnM1PTsKm?&P^sBqsN++c0_U5_K+w?US?C%1!QB%KBRkT2Bd&iH;s+z~) z5s|C%@(Zp^KCsVdvfN%bsETFslWTTyDkY^HaB*?%P*zb1;NakpU_b(FY;3|ZGBT5o zA8?;6w>N6@flVrmY#{3!nkE{eia=Z-FR;wpDAhS87CT=nm={-_D#NjVD@CWyq<(??oKv1Ejsz@p_7y4_G+@{^Sy1IM+PZl_CI{E9N)e@jI3vyayRP;t0TiaS08CeHr zW){BXj1L$YCp(;H6&4oJ*VETe^7jv%pPOHBrKPp~>tuzKxs$&h3ZDGqBtL6`h=_>c za6dR3og1$E;!FI zdCqwb2~aFHG&X-qOiDiBjFeoqGd^IPz&QEGF&>_XsOXKARW(mLI=lZ(PB?EM(b?Vm zzrLaALqcNm0b4u!23TN#^lW6bLPS-9m$%Q<7=tE9);F{XQ z$N}lWOr6OnBjP$^`r𔐗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μ!KQ3?TncLZc|gTr`oSiHLIZ3L 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�H-g3~}fI1zxfgM5so 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 z%0D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

nCtbOv zIXj?NxInLkk#XY&UkmdTG)kcX8qTO^VCVqR(+|3FPp*dvMM6g@JU~)Nx7C2J_JLm7 zEy2LR0F#HQ&w#3jnFGGx2T46l9;O~_HR#qGh(0d{@HIb38ej@w8bBLKK^SHb_^uz& zjZRJs3>R1#;QEcH3(7O=PxtZQj$wQ@-Ekvh^zet7#rPwqEN zETwX*4}*rSI2l25QPUTQF|u%eU|?Y20Lw7?akDVOd<`|!#-BR`w7-CZ@%eN{JIm}CP8u~)Q*T)?ij|G$o{K<`cHKGp*U`L z78Xz-PUlVL?q_^8{h|(|tDp)fV(cN8Nu6*yc}aKs=Vb1^jGSQC)iW@>f(({kAj5460u%BLVj8SSj-#Qkq=@06-4OD-edpz$jsKB{!5^Ti{2G40A zzQh5?Wgz;*g1alBX?LQ764-y5AQ!`24{|9ZC?#KlbjCm<%?ykT3=r4%HgFfSf{la> z^EC8xXVim@M9S|G4DL&U;wMHXJBv!83Qt(p}`*15C`GIsQmp%{QYS1AU;eU z#0Hyjn1R8Lfq|g`CV;E}ECw|Y#0Fy!ALcNy!>8LeaZhFi$H?@(6S#|6!660lUP3cB zCkrUxrspon-2Q=72AYZS(4UPaQP?k$) z-2sXZh^ZeGSXk>B85m$XoIq@_HU)bI1_pbEADYt`7!ttj1K@B4u^sFgE;LMIU;wFc zu!o2ruw!6wuxHqkv>%Rcz_n*^$Xx|7hylqU2YUvI?)ePh2talagFVBUJM*FDL)C-Kcd%#p01^i|$UzV) z0pc`(Vvu3FNgKB=3pkWg+qkc=fHK5%+jj0^R&bJr1Rc1b^#I+E21@4BueNi?uz-u0 zwUyka)3Z9bqZr?U!aI7pLMOK*%Zka z%jo4cP<>GeiTM+MJ;2&;{FPY^%4$ELe2;XkRcKjm`UO8G7FG_h`yhD=qzB?hP@Yl+ z>jB3-IAJhEJVxXx(EV^=JErqa;1+iSrD#xAf#d=P1}Gnt+CfPO#s_B?kYONsP!0eY z1GC10adO}xH*jgd3Cgk@px^>!hY}W$Cm;@c(7?*U3ij0W(23kGBGAyno*gu*Ab|q1 z5ridj8Nme{G&_L93Slf4Ot}-tAtIpbad@WtZDr?}Zl}t|F`X}xn{9fID>nx#MBm>@ z+{Ucn_=BVna1209J207>gB8L*JDFR7<;-7DQ9hZwpYa_eVceO*9l$#y7IHgb$5~LF z@zI(?etJSWBP$D-n>dxbpYc7Ybam$C0O0Tjv!j0_ANP%X0<89+rT157I@TtJwEWdc||2it^cho=Wl=bppS zBTys}#=uZJ(a>=Ez4hGbD)!3Y(gbAW1yDH()iM)iBv>mW8>8^_nho5Om^Xo3JDdA4 zE5unBBechudtT1K0F7bGSV@(geXiY6AHvZ!UMbiUFFBpr*ln#03fr zu#b4=L4CAv9=9{=3vj*dc#`{yNG!sMpbHTpG8gA_tH^*f*E2A{4TCumWXW{F1rU!; z-?)I=nU&)JXb!gVBKH-MI8^f>G7lGWtFVCdPX`AT$mHpYi;zvw0Gq&gko$^AJgNy0 znU9OPRaiiQ12RE)`hiMrf$26&Abx@db|ONb1p@;EB-R+0am$!MlNl@xae&MLB}h<| z)k7*GP#OY7Dkw*TQ}*=0W!xbg&?_b7r*Ev})}MZ78Fvih2T)TbaC_HsZX-rT33Ux{ znu5_FBQh8m7+`z>kVf(8UsiA@vRnXVqlv4zO{e#*GCgArw~eUBdC2rJST_R$ z!wXQ(1mC_meM23K0O(c*fjDlB>6~l1xmm%Ar-Sq7XRtxM93Z1X!2!#k-l{ANiOviR ze;hk5Loz7GRS4~o2PuKTH29Lz>3i033)-}yWmc#*cxHuahdGer0i?;x@eDLg3r?Rh z>$y8QCO~p*4JdtsbL?zIaOi@91Ds=_`rt|O5nMlNj)k}nlw)-xk`T!PYz9aVac6TrDD18l-VMfS_05@`q{K-m-`^>Hz`JSVtd0R=F)U{Qev zJ;w{Ex1?CWbq0qF5G}t_+d)P8bV$hw)(VM}Y=o(xIC%k<0{a3bG7hsQ(dULp8u!!NHk}YA8eo9Gp-?;D&yK8Va&( zy5})yaDpA_0X7dDo_VO|L1e(@LG{DU`vEl%WY6@-6UgRefX#yhr2?ed10_IEP(q|M zPjRcrKn;K!_zP+v$fD_)r;rWo02>GnMMYHeATnSFLiNMV`vWx(WY6@*h4bcuajsco$LDo#4 zc>&qD7hvPS(V>fK97G1}Td01xc}!6AK+c@L@)ELn9EU(@5E32ws0Ko$zy?AMfE&mH zH4tRc^qp6b4b%V|2#yW|RP!J*;P8X$hnvR+H4kLZ^u(9kBGd0)Zi!2c;3Jp%9ssx42bgpoYK=<$@Xt zvTXXxTTq{a3+@iEd61wqK{XH}wet?BeFZT9ZXgeY&jGS%`p-L11HlC&*gSAZnxY!F z0xSdeG*mm>I6kOxAa_pZypJ%>ne_x%7dQ~jP|btLfX##Ihnpt=H4kLZbjgQM^B{#H z*gR19NtmOW_W~qS&%m$<)D9Azerqo`w+z%ExWPhDgFzNf*L(~$7#xrshY@Mg64hjg z6sTb-12q6{pa|4JkVVripF#};Cm#*4f#8s|LNyN}!}*+BMFy%LZk`y_Jdi!pJ)c9( zgH-Zh^S~i#jW7>X$9RBcK$W}dqBw%++&yyHZKFL3lx$fHmK%7WWeS@ z^~24BRq-HurdPg3c3%hBJV;8kLp2a01u~EYWB{ZU0x}xWGC#P8+l2*e0yxC%5e9$? z=@noZaKjwbxBwXdZJ4il4{0Q92e+a`XE-1-j+8Zzj z({_Oej1w7oPwf2H0C*zou`^tBNoyk2h-CZ8Z(LTR71ul zEp*_GA@EQNsK)@&n8?AS!msu@7`H^g>CVXjw3`o`C@-)d7;KXJ7zpnJy{C6D$i8f+=|c zRRY#Jy%VGaCInOBu^$pxV6D@Cf|S67U`kd%m4LNQ&y?l~mW2tylyHE88Z_$wQab%6 zNC`{`rUV=t^$ZMPt5FnUbxQF#Go2WZ(%?o;^$W;ZYzZ0=E+ z3f6O0JbZJH8VBR#1G;M`pA`4r+@r?BIB@|7h(GZ!$K-B+Cl)?nLnr=a-~7QYhH>%+?In|YjQBSHb4X&G+@L&Ra*vVJ=6?=p zjFVU!CifUAZT{y_#yE*JV{(s?*5-c>ZH$vx119&Fm~H;&FoAL6Jhn-!CX;*2?4Vq^ zNvtB1do0|bT%E~%4gpZM!sI@O7${q0a-TyAl+Clb&*4Awi0JkLO2^FN1V#>u@NB9rI3!34q?C--_OKm|lLpEGl3 zoZRc9gCt@#9!oZK5$01+^fnY_>F z{p8+=1|KpUDeidL}1ivdDwXX>M%= zs{yG4;jqv!ka`e?=rPNh+>@3tc|lBxbaQLl|AwaK|J}X4D0+JO`X<+BicUVz%)%WL z9s9qcvg&_d|HR4jGY>=ECpNh!qh#`emJ-_ zYxU%L7FLscaylk2h_T`B?&!hJ205Yw|szVI?)WCuh#&1u+UB zudsuh)!foL*}qV8azmlPuqaqpKRY~$qX{1zSni~ zgiH?Rvhs?_`wI_()G;@;v`)5fw4Gd#%Ysmo&B2_Mm<(3aQzA5(uU>ERf~*Y2_Q{U5 z){_fzIheb8dM1NS%jRH?k4u26RD!6?h+qc!9A+w#TE>{k2dnibZ-|>RxuHj@`5$gubJPx#;32J#KWwH=+EFddT*)E}Gts3~f) zK)nt~?PQxu2e3QaIyzu#7{ezYY&zWx(bz0_pBdalVf^$>S7 zwX`6qJvzC!$pfOUL}0Q_BScMOb2CCsCo5B1$L90Ra*UI6=Q>ZeX@#h1Xl#V4;bAVX zsN8(M)rxU4Z@W5NK|PX!vhs?}=i7ro3iv16v_nm3YJ!_kQCYS5d}ksfb9-kOG!bwx zH^H3&vI3%DvQ0NccQf1{Jj|tK<&*!{*-l=N(=d6#OqR(LdRQjEm=rR3L5l}meM>7W zJb9RlOG+pASJ*>BJuLvDr%z_`f}WPiHvM4p+1ooi|A&W#LtV(m8v4JWpl~w(l-kJ) ziX0$1CYVfK(33OSW}<_5PhbCkP^##gFzJ6sXZQcovhx4&aq*MuOYJA`o6I)($V@{> zC|9{mo&a)LPrziG$!45=|9ksEIwwx?w`DE zTHE9W4KkB$CL2snm~Jq6!AuVJtgIY}8*}Ah>L(wV&cd9LnK}9V)Weg%t?Zk;pofRK zw{OB^`%=xx3DYemFNos-mkO0tHUCpmQYWvTEIIkWR2GoF$p>b#FsG%ZPd-2O`s7v9 z>LxGf<6!RY=>rustYCLe4xDW`nXg`ryS=ju?8msc_{r;Mih^|}C#P&aKRuR_xvRT( zvVFDaWS`klljoIiOy;ZSk)8M-FMeJ!^6V<$HvA@K0o`=E#)TIq z_b#xRymoc2mpjHP!c_b!T=ymocGa90n+PLNq` z?VbO7diy8$H+fE;vGnES-X#r_*RFOK2Biy7aSd_{NFCVD2E)lc%Q?WY-PX}LdHvFR zljrtvOzvH_V)EM6`fOmkTPNo&mz%txh6SXQv1M}SN>y-_9GDh5xp&!y$#WN|OtxLl zqtrLye`j~ke~{Urss*ICtGgHM{^piekoe^OmFduM0>!An6>Z5SX}m{hBJq$!k})PwrX6H92a#-)5fmDU6dBEOME=VT0CW zy{%zTfdw+m-MxL2_ix&`nPr`$G$%9f6=JKcd(qX?yZQY#N5;txTQj)3diwrX z)zm$Yh>V^by~S0Uk&%&8SXe|~PhUUD+sAiGW>)rvmbUh<-MxL2|L1O;hP$?dj|&fk+A4$hfuuvbC=6uzKv_74bL zprfmsIN4#x-02rqGR+cY;o{O)s3nxEiEsB_zB>AmQ!h<1-Z$-p#G;U%PtxCg&gZoUF4~Ve*cn{H&cIy^{@g z9RO+DBf-kXCM+c-ZD(d?UKkb;xvr$N{9b!!_ut6{M;#_N9OV!JHwnFn;AoPShR7^JPTy7qZ^WYh*zQ!{9wXo7Xk&_;@reLIR=drgEr)S(!f_T32?+^XUS3`$u*bJ6 ztmlwtA(heiEtrYy|M`%f{eM2lL@+&_k&RJUbO!&zK9Eqx zuO@F0-SJ?xcj|OaHb&oIr8yvh6I1TZ1<@Q`5WYtzgocT)crq7kfJ9@n3`iY}&tbR; zY!}pOh8b4#`%<@`WMllz%n5U^^7My|%;K^Kv^Rr|;P|o}OvAK*17JEMH=|DoG$=G4 zZvv~>0i`*vLHHV1Aaukt2<;Ku0=AqZ4nlW8gOrhhfq{*mjo}O5FLs9M3%MDELmx3P zFq~nBS;@d~;>>@r6*pGBP6PP|CbJ`^3v48e&H(wRo`GQnQwuoYJdkN{*s@mW8K$Lz znYtWSPr;_TIEFYXFfcH{JfhFczyNYoNBRe_=^or43sR>$hBJvzpD>l1l?7}NsfUTf)I~re zAEqB>J_Catm5n z5X>%cz`=Dif^4@*eh}m;s0x^lA5S56!0dtr9ysu)JMLu^(SfRf z>Ck}YL6}`I9pDh0-U!kGRRPlh%e64OU=aY(ad0oA2n$HZ^g?lFVNsazFhvlDG#+FW zu7~CNMra(sazEBMfQ3^%0|P7+VCq2hXFdjoHSCZ)A}Y$j@P*G0B+T&tKLf)F_cCzN z=pp*A08~VDfLvG4AjSY?FmRmN1r**}NuPpd5wlyy+i=8I^>g zE;#xGY@h^)hPZ%(4dMb0gbPlH{3`%E##ry z`qg2gp$gMyzUgkFj0Wsq_?Q^J@G(Jx3>2ZO*%=ttfP+jGBnQ<44lWS;8w-epV2-Di zb5cPL4CeLN-vBP*SFpl^=*2gvto8H-VvHQD;E12TR*cb_6`bg%Pb@-8kKiO)&%l6^ z6F{K`t-T;NLP(G^K`d(q1_m)PP`a}Lalz@X!wr(|GN9>h2PEAwz-W()kYop?rzcA? zY9b{(u(s)Y#Tn&U!78Rd6lXL*gk6CXH0+!tz+q>@@P*F?5q2O~SWh$*HvPf}aS=!W zlGGR&zOjgaxM0lj1RB+kp-~N@K_ThPn*odJC3{=I@vF>w;wLC16D1jqB~NVq49+#6 zs0J0OFmIikzEO-(eYy`nE64OZl8l@j36Q!{7u0%CpXk6bT}FyAhLHo-9Fl$UY75vP z7<~g;Zh~o0m8m~Xn$d(4Can!JN1U}|=lRss>5;OGJ{(Z>dSD4&SX~WPKmDRKqXIj1I1k;M@kIZ$JxoFb#1=j59OO^bj3JMGmN1m@|%m zodF6Bs3tULfX$qKQI=7J1KM^$iVp?G7)EZmGr*0SdIkmKph5d%1w`yX7uI+>#t{EKyw+`n&}r68AZT(v7UiJ z3mlQtS(F%C6!}2y;F*xN9f!>ZaI}C@Tn9{i`o@_|^3yw%8GU$PK-Gci=?|3|m02N7 zuo4XwMjzgeSrDVZ^z?(Oj4CW35r`ox)EH|yvd|+bMx8N+kp~_+9ZUDNfNK#beF9pa zg6Zjk8jQ)DFeR`cI0ud!P!NC>VFm$M!}N>tj3OMl7}jet#xU~2t2=3~Ibnr_a=5^x=T&M2ilv!I1QtkKq<=#u!FE zxLZy@jfT+`P!qv4#4R6USy`rEILO8U$~y|2FqJUJ7=s;SfYUKx^^iPVfZ-Tj#u!F^ zxMNm8(;b|KI%Wlk2BlH`=?;2~CY&&Nm=nyvPB6jg1h9HY#wo;bf<9vmqX66q9lVgZ zfzdZWR@XByfN4m0++kyujsKNGU{L#wbQ% zmU^c#ncsv72YrKc>JK`bzOpop<`QVC8e!7Dhqm3v`AG9mMFau-`DD8+&UuMS0 zCky5y_0>**CPTvSJ1ttVjvID9FtabWJkP?^>OvwwV60p|k ziWZF0vM?c-5{Xw3=Yq9Pj|3@!3BiCPM-);0uzEMsemd0Yn^@)qy#1eQ?df8 z1gv#Bqa~xXEKCTdObG`x?!j887lM?)gkVZ6pi016r?0eRlx77B zO;_B*D9j30J^i62qqHt89l?4+GoTv54Jif&NP4MfV1UHI!99#3I#3lb9VeiCm`UIW zt!H3>L;mVHdIknassi`Pp(s#51^hDD8)_(=MSg~n2r-rKFlsyoI~;>IDbG@z;yh8@?mztQaeNkIDbG@ zz;wWB0hnE2_t!HpKy-le2Meg4fQ(!F3j^os`>#iviOXH=D`3jz-%a=_@zkX~WOHPGO~#y&_c*u3e9YnX1cc8G-Kr%rcV%ajdeZd}VG zEII)sTF<}$>KaU7U|<0Arw95liqu2LqSe6h!pOkkR0AF!0CAa_7#TPwA^4#FF~=P) za3>5T59TW`1P|-O`4Zi5{UG@hw-=zw_n?~R%kiultO4Y-9SjT%uwaD;bLSLr0)PcS zEL))@eNc4128|#a`ZC(cr2Geub#p-J6SpCueBu!(*c6Kytwmu%uwd@EyQ?pC`%PcQ z&5W{OHd1==xDVA1GG@ACDWk;npT3MX+yDAAhBL~-WML+8JcOtQo3gzyka0DmEKCfh z2J8?}nFum@`o#*yIoq!WGx9UCf+eO4dNPWzfQ;GB7|K|}$TBAs(hAd_UJ%B@3FdC! z7{<7TnFZv*>5L7GF)W}^oxZV>U3mI}Tvop6aobsT^)B`8oGC75kQpdv6|dOQQkRIX=S zy*($9k%LhdEPxcS94{b7fQ{NdF$o-0P%)SxVB6w0qo55m0AK+EZsdZ}4>X`) zB^fMWzySeov=nB7vhf~BSaiVX*AS1K_yF=TI4qzdFmHIg1*I>^EKvFavyp@0Jw$g0 zNYD0{+2CM+iox`QO$G%6$Q)2tY4-GnN@kAjA$g1(jI3Z;NLYaMZLiD+g$3Aks9{k( zJ;jYtfEDcJ>5c1{L{y-Gfl|i9+FS5?{$vrOjZ79aQ$gvDPf%CO{p?Gf4)!xt1m5@f*kixuEt0Eta+oWuwzH5o%0XHUOV%E&R@rke30ivp;$Oq67V z<}EOH<6TDi?HM(UQ<+&np2e2Iw#RK}dCf9Cx0R8d6*9yH?q{uQWsG7Jf%mf_K=mYO zr1T@C_3;Bne}V8%^g#0BiGFB5OBymxG@*^rMiizQ)(Y<%HLNFyWpi016rw4X2O3T88U`kFvm4LNQ@9bohW(5mD zx=CQw(+_qsO6$Us0ldNW2@>X@DinlaF$)PjP=iYcssg4X0?LP(1da+&@c;_3>EI3t zR0T{&2b8Y?rNL%{nzLXX;0_5?2Bu>Nln=8D98qu`;0_5?1x&{aC?94Q%vF%c0e48C zDquP!K0|yCvkT^Phz@Xv1gZk2!vo5P*#%A;pm}SEKR``?s0x^l3Me0D7c5^vViMdT zfvSM%SOMk3?1F_ABx1oG5~vE8jvG)u%r3Cmpn(ril9&$ekU&+ybZ|h60GM4cSAp%C z4(^aZRlsyuK>0Acz&R8i=im+rR0T{&29yu83+5_FQUrHMpekTGWYW zvJ+N~cl1KaQcwm0VQ@ggk}E8MAj&>?_o5!!y@1h5Kfz<@9GakN4cxteiooia6UrbN zr0xZXk6fXFbb{(2kiP979YJ*v#5C|UA4v7|#R)VOWC5!J zI})U5I;?-u&&UEY57NCj0qRIVx)%^8xO;H{B#P9%0P_cD_W~BGuu$dz)xDr}0S$dv zMucS+Sn>p?r|FR9-+pNG4@z?s_=0;VCn|jNQ>TN|3{(Ub${wY@`KjBX%|8$uIlYua zbc0QSHUFSuF#TYYL3tgd7qj^Xwin!M0O^A@|3I$8*8H=Dc^MW2;N}O&bZCNuWj0vu zhb1^jo-WK}6rNtQlu<*L;~*p)V01?n#3vooK;Zyx5<*2_{_vOx3J1Yu;ASw0jT{b> zp}IkOwm)1BZU{ofVEVx(gIo&IJN@ldW|{3rS2Ff9vVtWbEntwA?S-qs*$(8u>56L^ z&p>(uAJ;N2VFATActTqh77nnehWQ)pPk8BlaUH0|e+c5$4k*oWZZEit>2Y~)8Z^qG zA~2_(IKMY7b$jJ{kXONMB(HW{gy;sFGJRqaqwMyyjf{PavM>plAzJ`0U0x0F^y4n`?oEiJ`vb;s8NpG`$=hK6kz25&xC&5&e+c=3U8=te1+7* zGrmLU6HvM%?<2T0?3e&4ia4fXG*nrp^Xz1_5QUilYYatzOoX&n4Z1nmrZ=##aL9rM zk(#U>AVr|A6^NeR$j2-r17abm*a78(bwXOKFd>*tFQ7`mhE4y7#Sn>a5MP0HPIuhJ zC@l*Uf*IlgRRT6_dLlowj0{u+rlJDM2kV@^5o8EV2&QBOR0-Iy=`TS_U_vk@H=s(u zTBj@SW|WqN3BiOi2b*30Uj&le-zEZDB$% zC9uebX$94q5S#+0Km#(M#eHCPkVY)ni0PJl7^QV#Nd#W4LoEbr1+5^1MhhfF!Q+fj z6)+tdKOoTpGYK5Wpz&*vPRPnCs0x^l2q^yt)Fg0(f_kZ-P=z#mp(5nvtQW-n9)Oozo^h(BOCniA=z!S;PCuYl4cJxSE&@~qOvei-A7&TK=a4i5Zj3`!z;sCD zKf~RRPoC0p-K&0=pkHp$m2ucy<7)0;Zz^%7@tnP931e5-3I?s{)}a zU^-Sn`7pa+u7V_NaAO>*0;b~zln=8DmP)|s9MTwvs(|UR$c6YEW*00aLUe$e)=(8N z9T`wQ%r3BNKx5=!e}J3TP!%v8C!lI+z505cXPm_TC{;H-Y}Aft`U1IXe-4j6qEQbl&$fLE|k5m?=L;u=T>+zwYc z3>sbp3n16BAg!RZ1=2YEqa<_S7Tb#sWwJGTIL^W4qunMqx(Y4Cb5QR-6aR&3y1u zx#sB`a#=V;Vd6E=RgF-2Hb&uTxhy+aA>4&07=>BEDyJ{ZWIDnE^2PSXlZ-r!HqfAe z1r5g}NYKElR9IlbViz^ez>Tdtrx-P4JB~tIAW+)l7BqnFgMtA(bpREC1rWy_Pz$8+ zG^hmvW+R2oiMtTpU{kg`o&`0wU}7-+9UzlI;RiAY)Yy{Uu67>W%m7J1!VhH3_KO!l z?Gms9w>Ms5EM~NYc@pO76HrgX(gjLE0V}}aMW*2uMjM$L=x`&H_IL<&@C&$ip&~Hn zay$lk_vRI_cR_4q?>>R*2I+wg;a>p_;a>v{NuGep!c6LT22l+$vG4{caA0CEH69>$ zfLdlCy+|$cJGVdsvS3+A8x3R@M1Ia4#+xh}sN;DMFevkJMHDJBlBVU8mz{Fr` zI6$_8I$$8ZkdP91!N{`xz*|NhMpm%w^pDdSMOZ*)ZGZWWaWx|+%m)`CYbgylIXHNC zfC?(mJR*n&Z&MI_0b+t$6i}LJ`b05CaZZ@Z3n1O%t{I?R3H1yNu;sEVpzBdV?H>*X z1_qe?d1wL9fh5nvz`y|JPp|yQD9;MkI(;sP3ATIs!H@_u$m6F{xbZ;Xf4Z83F+v==o6nH;oR{B6qAsSK2!)6%n&JAA(q(fW}g|u z7+E0#;O;(1DX6||7M)ZC<~K-8PWkV9#lYs4HNteE`>p2kg^$M477LnkFlRo1nNk6n8!hm1@+LR zr~gT3TnXtRCo(csPydq1C@At5;s}^s9RERHDLl=%dixqCCJshfumG~F8TLVX#2}5^ zFETT&W|Tbv6@wYl!30qQ*1LTsE7NL5R~o!CS&$;-C}*>L0=Ef%U6AK=y(HR>V=c4pIn~K{3A3*HI5u2-CO&%7+;U z)A*SWv^NBy5vC5N?*&vJ%wm|nXdaM58NsUxKpuptgXyc6fCf3tK!iq+g$Ru>buf({ zP<=215&GO&L3=`AK@U?0(^mo22Q@DYrjOw>A4ns@hcJaOjVquUVFtoAGW3D>Q@|_) zs{{9iePKqxlt%M_ltTOjTJL`YY9y?w&G8o!+c5R8FagItWW*n;0;aW*(*ch6 z>ELb&R0T{&29yu83l`DfaGVbAmOxd&bj*PAVRpfy7@`9_;ty2;({TdIhuH;l6*$bN zgF7-%6)+t?pnRBJV6#E3K2QjONBni5DquPy{z1YDW*5v=;OK#L^r0$XIy#_ym|b9% zppHH`GlDuYI#3lb9Xp_Wm|bA^gLFV#1zKt7zB5zp(F|K^VRpg73X<@^U23Qbm=0KR2Db}p2Sf*Gev1X91Js2R5dpD4 z?QD=AL5)KY4O*=wTn{S^VXcymX^_$pBe{aKz=8=xg95l7riy_fjt8<~3bYB)g_VJU zg@u7(8WTG!Xj>?Fx0wZG*AGkw$3t+(PmBS|VDMmpR1zoH_d&Lsitx;VY}>M!cM-Ik zRESC19Ht0Xvv9CMG{H;-(+*lLV47i$6PRvLo$fEpsLMH(3Cv~ioqq8UqbB<_CO?L0 zOn%cJx-&}i!kqt|g@M6kx}q?Xuqj9$q5)L&fYvlIFx+N9+K%=V;vv_mMi;v8a!5NJCZ%o8wAfkOZk#Ly6dIAWa>L&Jn4 z5H^Th=ft2e9n3dlU|KPbWk z@#hvE$R5*g(=U253cG^jp}H9u88{i383Y()876`v4lK;^4C>El=(am3?NJ43jDl%U zy=TnJ@i7y;Lr>!q+}|GGVLPKlCC(%K4JutB8b69M$*>41=BG{<6l3a_toi-_KgcsJ zED%qDXpl2_CmI^FN`S1M{!xrcm=zpI;E{h5@bcVUGFlO_`b zgFQ3}?3f-X&Lqxh2j>=wGs#S^J;un(ZqKxn#hz*B^o8O~(!5)dQZ+QVK=L4?K^PWB z`;dd{2{gD4?FR3Em+<5UFP!VBh6EQ!#|O|j0~@0-uLdh*=z)U`JoEq(dI1VKP}}Yc zJOo$3w-K7I*p3>4Ff*&5?edQMkQ@VY8whjkDVviz{i6iamU!48^! zQIbhS1*#mT-J|fF7kCd3%&Fg}6{b#abYc>j?rYD)KK)G~Qx7B0bip!4V^)dIFvHa8 zj516jDo|Z8Q%)2^O@W%u@e5>1paYZe^glsNQ>Hs8GMTcpfOH>JVG>b+s)p(2sDkK* zxrKvadSU8xux_1DChqC-Axxc&JkuRb7=?K~s-bE@G`Q=>Dsd?Q>MRzpAUJg~BO5Vg z`VUzqQI&8}DT?Wn8q7GD@h2J~x?$FGc!1Teie_3jJs^NdcY13Kleij86-<{$3q%*p zG!AdDu0t_Q>!xP}GU-mA8_OiF22%yo)zJ#k1v8B!1gz^;EYmth?&%LxnRKRajbjp5 zgQercmCZ0(`4WEr#*qxxq?E|CZu$*%Cf(_O6Pd)-V5;D{K-nKuxI<0j@B{0z zN@7|!{Yfpm!1NEPOtRBOlbIw~Kq{wy6lD_TgBik+09G87%(RY?4-yKxDNMrC7i2K8 zh{8$}*nlOXQ~?iILbwZ0Fp98%iXF&!C8!dHEOpMxXW^+AVCaaP4W9Xn&tzucgcWZL z3=Autdx9%D4iCur5uk=KsM`!{F2I@(CuTsJ53pthtaSxz&!DvE(3=k)d<+a;tPBjG z0~VN>LG6bGCXgFI?S~E{NU;hk)qY#s{ zXa`ggtfqx1j?7_FWW;DAY;?!fMu=f&U|0#>e@(cJa5fHHAxbDhD+3Tc{bMnc3(r?b zRk`9Dyr9?cFHHlt7K}w#BtQysP%wj<2oQ&YCVxYqUI2vwgM*O^L&MR-U^a+oP<3Hw zU;)>D4NRc$V_*`IW2nP`!a9}h0z|MF{tT|YneQ!GZiuk z+5WJAY*GdVod9SzEJz;9*i`^j9Hb89U@)KH*cGT5NXpW9@KSmbm&Vt_#;!nN2)0lT zb!|PzW5`;3kkdh#5SHm+nGig(0U9)cw&lSc74+smXvh@WWdPX&!x20TZr~G0x)~T4 zcz75XB6<8kjWx*DeH+wF$Z-}j@CB!Np_xz!nhAw@JN~AFbHEPXg`oAqLQFCuP(`pz zc!Ce4_-7H50`mk{=y4GdJk!03nGD!LmPhhHkBf+awp+VF`}aXIFgJt32vkl;ARiVn z0lI%bXB~KaN&-ZKa-J(UB;9fRf~PwV*ijKCIw^>B2g-L~w;_#obqGK_$N}=h^phn_ zcbP#+R`3hU;pqYXESxe>d6?fkKmh?7;|2Q>v<8_MkCWnf^in`kIJeL*F&1TV<> zAn$NYf}1yihlP^`q#rV&05W-cWCfG5t}{4R7#LKbBYGfxAQM3}NDM^7_>9vF(-<|G zBYBvn_qKB@bArTSHmgSRz%ws6ia{DBV8h{{EgA1Y%}2&i#$etb=8#;)@fQ?o;4_yp zKmmwUgs*T19k{_5$_PG9f@QiwAtNgbD1jiYOnF$v)XfS`o}i^TBK6SP0^BbK%?m;k zB&@ao_hpf+067rkgNY1~N`jFQls+ZF2LQ1$Ffg1jMoXVf(AgvyEdq(Y6EYBbItv@4 zKte|h#BVSDK$0qW`+hy5Km%nnP-5VK>V`$`2~mhCAXmZh0tM(H9?;GwEJ=ey9;C{5 zx}hJVCT7Y;s#OT4?WO{7o|0g>0Pb3VX-KJh0u(=>=EZ+dJS9ppDzkR{0wt-1pSVqQ zQqfX3)B`XNb%;Ye1or53#X2SllpL8=hb>3)u`@70YXekw^MKP7EKhG2#=|Xr;5ty5RRdfbBuX+G>;6DqU zV_;wa>Es31a;{K0urZ7btPG%o$jlkk!I=l_uLh{UE<+kW5>Wa?H>8aMrXfA#7a;$E z`gf1v{(RvDs`kOPUK%2PK!FF*2WpnHESLl8iKQ}0PruU0bdUvP0k|J53-dZGC^)1c zK>-e;=_i|*X2VMyh>sX+nM9`N<}nISpV7?3#~cSbABK%lSeBy~;#iN#5PAi43pxis z=qxY6FD#R%PdLxbDFRgnYtMT0fx5Gal8n;R_p~x`O<&i-bYBJ}R?olyQ*&Yh#7M9e zkZ#AGR;GFA)C8D`9FrhgA-02xqv>zj znO?}k#9``So&mc6Vg=Zhe4R}9SizFu1~w~LA4FcJi|K_Z%=6XIjx{6@B)ge{Ss~2A zZYE(Km@3bb)ZFQfQy6WgJ7h9*%0OcP79+621{_n7Op43}&SnS>cx!DfL+Jy<}tfb!0KaLEFSTSzWcjpRAa22QF- z)q@0!BRI8!#5vA^;~Z3~b3jXVjh~>@2nt5q3{b*EDsnZ}CxRRPAe|u0p%aF}2W1sd zkqnZnot`*>Nk$#2LJ)c=+-ub-_8?hgY_OEgVfvB@Oe^ZcZM^MYH0teVR#M;Jc1CUg z)Y;+od37rGx4UHR-K=EoU#m{ptRVl8h z6Svp7cyZHC)U$c>G6VfXE3e5pxh!Wo^z_>N19tCq zoHRGf9CB4+bh@CiK+s|KOi73RmSPTO#>V^Wigor+FWAgt;Zgmh{~!ZHgZ;LXg7zD9 zOZOM84BWqCUf_OS#YOgE(QoYLn(nky*4b&-`)1l6mVOS08y-*gY1uy62lJ#!P@iM< zlYYnP2mdp_m_FeTbHnr_lbHl0K~9FLdEv`%bt-_>Rz+^(zNgdQPG*wfw==i5+4W%G zyVFzlvAub4?Rh zU_qqWEe@z9V9lV#ozk)}A(%N9P$gikkky?qA()a3s1mSN$bKZ45KPGos1mSN$l(t# zA()aAP$gik(6E);fLTTqbE&un>5%hZU@PI&TuQv@R^rVB_x*&_IO6 zCfL8A)x#h=A#)W_6)+tgP(I8gu=n9Qz;hK)6)+t;pnRBJ;Lrd~MT6}CFG_@}fa!Pv z<-_a(2M$~Zc&-Af0;WUa5+o78>;i`ssL2Yp1HAkXssg6N1ImZl1r9p64)9zBR0T{& z1(Xl73+5_FNQ34obf79=I#xjWFuP!31YW+ym=)hQkd`_fXkpG{@n!YBh`B6U%~ znn0aDke2P0i$Rm^U@^#Q8j$Mkj!Qw4?I7E>e_Y1I&1egAGt3X*k^t09f%*;RcCfEO z>m5OX3J=_kZj8dy3v!q>Wu`)^uoEy^8RC%+Rggy@>r>pc_%Zs=zB#K#I0+ zTm^DF*ep=j|2As}sLKxO>Ssfl;7uqKK%z*SP{8~_u?a;K){zJGAiy1UP|^VPe1uhD zA&!#hU>Ox&C=_Ngici0=j!9Lf1KN{;(jMxNkmV@2)rly6G#nA45r3I526Na-u8oAKx$xO zFg0Kog3=?%yzQOaKyeBdgQQ2037}@og6VIInAxYx)H0uC5r{z9_zvQ3XWYfKg_#B9 zd%U%vD+>$wBrn6mO#O@!@HHV8po|Q1#1&{^2c>6RgYY}%Kw9o6=0R&fyFd>*ZCqPo5s0PuHY7iy_Q}P2O1xghl8d43ygkVZE zpk4uMh3s;G3Bi;^K$U>CLbm0?gkVZKpi016r++-kB+UvIf>eWG)zdYPF-hz0fGUI) zqA#F)STzU>2Z&wZ3J0nJrbFT?B+OwZfgKLo4FXaJnH-0zfa&mn@?my?&4%j$S2$1= zFdY?8KFltdtH5?a)|*3Bz;vvD@?mztA`22A;0gz-0;b~zln=8DmQ28|gRD1)s(|U> zfTlK>T`(Px;015~gsOn)uz>PmcEMZ)(E(lx0#yOikpbny>;k(VmhvG>L7*yNI$(JK zW*6A~a2=qfAS@sqkZKTSJlFwnMc{K^pjil3g>Znf5>hn?GZy9`a8$rkzvD?J8=1$@ zY7k1FD7*unj`S#nmT}giFddq5>o%nZ+2hz4jtgIHN3B0Lf1sRS+YRDKFgvBYO$hdfu$wubGa&R}114h?D9o-7@9oXMc5tx%t)Zg(+ z-ClVMR9}JF$X;%Q>IUfn*B0Af-eKZqlYI@A?F5wexCh~TEP&QAOEBsfTM?*USaJLV#7D1Uz=B9sjK+0{!C;Fa zRSZlBW=;fD30Nznih&8ilypFqfVEDa*v=>;0~LX(*a78(bwX+wm=H|K3#byXVW1iY z!w`uZ5XXXbPM^uoEG-KYf*IlgRRT6_`bCfum=H`!1yl)G>vT>5W@%ZN5KPGms1mT& z>5d>JFd>+d8&D-+t5#Y$ z@j1*cm<~u90rzpCDquQ1pnRBJFjqlzfSVjp6)+tYP(I8qu#Z8LZV-Qf`kzo0FdZwP ze3)IZ7=$ECaFYY70;b~zln=8D>>9Wo;PWP+DquP|?m&DFvkP2SfK~v4T?KA(KvlqW zSU~wOyI^4j$qC>l2UG=2M+TG+vkP33fI7HfJHV??p(C~d5|$6s0x^l9Z){ZE|?BTMhB;Ms0x^l7f?RTE?DS7bbuS!P!%v8 z63_|vqPn2R_&BzKCgEWIc+P7=UFt1@`0a*%b145k-^Uet< zALdP1p#V$1sD+)PJhQbd$8^Yu2%PSL_~k?|$id)t5L5)_6|f9wKx8u`E0_%#?gyy? z?bVUpzD<$2kC7E@AY`wO7-+8!_~bthFcUl~A^>6{jf#NzgJM(!15V-Y0P zz)}xN&V}VJcp0`(mDyVM1au4tMtAf>g4tstD44+`XiyPYFoR{bd#W*SW@H7kAqfGb zYP+Nc^J+#;m{}V^+r`wU2Xu3CO#h?FENBCD9?ZEOiy_X1c>|WXVW|VPA^?w-#b_~W z$a>6xBn=qNF&X0K6H`EL1}6=u2+Yl3ne897KyC)JAxQ(IYWqPQaFPa@2^uWB!vczb zP*d4?`V@U;4OR~@|DZmzaD4!X2~8Rf+zbpbz9|y}!xm^(1ud!I0JVCdJvb1*LlODN zM+OECv?Cxp6k@;sO1sEAP{-NUTz~~2MKAcK2_!!F?gu13_zngnKJ5M;ke5Iq>H)n?2gZlpg$LuqZct$W znE}#p0(z$jTmkf65g6YCdbJ0P-vPa61IFio-gg1xdq6Lsfbluv5cd#*Yd>fdg6wAi zIe-JDenve48mwUwWb6`RAOi!W`ULSnA%>)QNYLm zKBEdE4RIj!W+1pcih~%@9K?vxAVF;pFhbKDXd^T%m7=(i5z+ve{?LNCh6Uub>4}!i zHYyNTgWLdd6e1;q`Cwm9KWND;V}kBHkQvC{L1~^aGH`%wpDt*{tfP{ET#GU=aAcwJ z>lPTMPEWLAmZ^V>)}}%_wi_I$*j$I~1{B|rp3hk!j%KuGwy}Y>dtvQh4$!zJXaEY@ zK8AIlVckzyFA3ZUoL*_oY$Njkas)UBl=hepZ2@lwwSd8snoto~3)o`|XpmUZhIuoi zESQbd#pBop(G50b`$t=5&)Si zh{HKfgS-vytUyIz&i2?1lDP>wQhB8Zv(0u{cV^HL9yP^-Ma{(5E43dLXgMx4V^bcyx zEYo}Zm@l$Opw8NYx!@y}cla|;Wo7|+7T45m)OMW^=9w%kpzwswG=P|(1qhwoXY zlm-VStPePyF_PIv#spGIbwKG8XCPkeI0p(d$Y=pn2idaQ( zVADFbE~%vF$301t0N zRlsz3K>0AcU_OWF01f!*KvlqWR6zMKyTGmi4c$Tf0UF+hs(|TO0p-K&0w*z0mImtp z4{t+Nz;xVz@?mzt!U`M$kQsHT3YZR9o`Bf}PJoE`IKU{v0?IXzflHY2Fo%GR2kn9v zv4LhOc)`9LlEq*N1FRAjX)sTNMxVi147`NvDRj&dN_$*@ltL#iLrWnW5vT~P5aPH5 zs>;r$f~qnw8@VJ0=>k<#AU%+2>z(P${fw*-;{-t$MS!)ZW`b%cke!fSe7^)(>}{Zq zhj|8EPJrrVs3&1D2M$$GQ3{F=n5U+L$EON%m^EZOWOF#0AWa8GP3^M)QQ3l)I{?ulEV z^wL@kN-tnGQhMpQ1JTU^(z89Z6x8&AiNW-H+=HkA>)kF}4pIXXgQ?-zPzD~c1M3B? z=UT%k0~LZP0Xq+{NU*y`YXclbHn+ z0@xY`+vA#;KeMoaF8~D3w|BKOM=?sn>q!ex&ISzwKY^5fH=uNcOcQuajAIof6ML+O z){`h}x}ch26-x$)k6u}V1(7Pt86ZWV90Q^ul_g9FX3hza6e!9;G^DbG3Bi>707-$$ zC=d;)EMY=0B^r+*UIJ@{RF*Iyn34#n60lZqWf=++f+^{MDuHQ*m1gLbB}^Sm-wvog zuzAycyO^azVL~t^FQ7_bT46>rFkE5;bwfZ49zpdmOdU+01T>Do=1t!VG8!fXQ{n+t z0@DgJT7?lbn1MLT2c{0DuL7zMY~FO;Zf0p)m=H|K3aAp8R)o>0t_G`vv>w1lOrP7$ zEUgPmU+}u;DI}6$rod7QG)6$@zd}{ObXY+7Fq6R13tGnp3QfqtK2Q}f9T`wQ2b2bz z4O)N$)&ZVch04Hm%z*M?cEKVa5}DwsRj3M>jvL~T`~tHJ<|=U9LTX*83YZQK35X7u zT`-?Rbbu$7p(Ljo~z>~^Q6)+t?pnRBJu-p!bUhwoSR0T|jh9tyQ zFuP!315!0u=z!S;%go^P0huU;s(|V6fbwB>!9o|J1Ke(cs(|UZ0p-K& zg82iI1He=EP!%v89MTY1!R&&$3ZerXx=52^yDV+NED zvkM$Xa2?=O0#yOiaRSPR*#&kDTn8iQhDN9gn2sM%KFlsySV3|ZI0m6AU^-wWH_R?r z3_^4q+{-A!0xH`ftvQ(S;2a981|SRap#?vz0dxY&hh3DU9s>l9F1 z4rC*wEmt(1+0GW`c9>r}RzoT^Smg%u11xY+GcT+$rztZF(v~{`qjx|&)UgZXAxI|~ zDg^TpSPImb+rr2KR+R|4tsbNZ+Li;G1!>Ej0JqY>Q_v75xGi@9B#P9Q1M>$(TMlCi z8WyauVD?x831(REqvTpxss}An0_U*YdCWF47ka?+S{zW?V-F;RJq|-d*hT~@0t;Y{ zeV`;GIv>=a1GACR%!&O_-5@>NpDqA3)?i{V{T&A(YQTCyZLZndJr*+yFv`LtU<$!b z0QFu#hHfui0&22>#imdE!YIlNa)s?OP}&1I9kkxjc)P+1<^WAwSSY|k<-}S@sK7!C zrPP3BK~PTu+_G7Fk=aJZ5;8c$0i%yX-MqgG*35;9z#Mzx7|1=Lmq4KcW+R14#|fxz zke=_oG=-J*C?$CP^nXv8#iqZx&8#Z34jKbcn&Vg(xWRtn96UUsBCzl{alFer zb$jg{aCm~)$l-Ysq8n_=^n+WNl(!e$WA0#-?SM+a4DmP(Q3x?i^Z_W~VPY^f9A_bF zzhULv0(1}{1jM38#PB5}e-}9VV6fCy=>T_lr z4i<3xe_|1%hzc|oU{wYzlwpM@q@MBpz-%Kk3)(${(j6C|p1TeTXK)1o6@mG{;}S>) zJVbl<6SM7fD<2k>?PVXCjTmLYQb@thaRq7^$O!PM)Z6cVVxG(>3zLAEdEzQWA=rTF z;L+NZUqGX^FbSB#4v@1zLn|PYK^IFd-u~koXha(<0U6x{nFTH-rU%?$=9qrq2lGXi zn$;*9ZNOacknNkFpdnk3=dtz7rpGlgM{Q5|$2^0D6+BG_8OJnYW{F~yf%nfOWFhUC z7xEC=Ljgi_82o|s&n7^QrS4e#651*upiQS3Dk7lX1)Bxga|#oJ z8PWk&0yYf1=TsIZ1XHpDssyYR+y|3|3Bi=W!WFD_x-J`wG%HwWy5KP;5g(|2SV6|h zEC)W=1Jp4Col**m3|P}ELlF`=F!kU-0(DYB{)IFlp(db)L3c2_Lssg4X0?LQk1r9K{4p4(o2dV<5qXWu^+XZqBsPP51 z13W+rRRPnn1ImZl1@k#1Siu9dP!%v85^4~C!0ZCY5!?>&a4S>=Ovedzhz^)tup|yi zXW+&&R0T}O4=soem|d{20*3%(bvIN6OoxUZLu9`0|{NI3YZQLeTWX2T`)T! zI>4P7s0x^l8&E#XF0lJS>%qaH3+~K7Rlsz>GCSNZXna6YDyTEV0xAw5O?sH|U zLC66Whj{`V*Pwn0$P@7N1!~hzo58FpGY8V7=YY~3_aGkfcmVPcxQc>`z&r$&0k!Bs zOCG_hKnIGkfK-8+^lKPdKt@5F(|>zm0;P-C<|sI zC76zzn0jYtB!PJ0l2c-p&dE5WWvVbl>2D=E{ zkp!8r{ir-B&4HW^Z_NMFn7+u1C5#nP*Me>UR)q!-N?wB%->`zeetKLei`aA@Zx&UV z253tjN}qTIacsxo*@oZ^$kw7TA(&e`-hjg6t~V$=z-*-O@OTH&4%V}MtuNTGP%)T( zjsuXzj$pmh|H`tMPdC`il(JnQfJJ~&7A6Z*ec~WQHP~d(*fnTRGgJ(w2JBc+u>dl8 z`r0by+1nQcvj{Mb0_D|qD)q>1z>o+XM=7T!e4ForaRB-|nN3~vZ65e%U{mOx5|j%&~+ z67mo>Of$SaVDbmzO5}FZ3y>gEJ4wPCVlr4Wq@4s4f|=t1RRY!uX(z#iU`i^WO2Aq{ z?IdYgm=H|K4LgWMV6C8rlC&&L2&RO?9-;)S71C0I3BiCLRv~NA()Z~2Z$+P zt&o-yObDg~7QA4s)9)s+NV9^4z(c&gFx9ZSL@lt5L$ba+7dFuP!`f`k&-4yX#4jtVFrW*5xo5FOxSJfJFII#xjWFuTB! z1e!qs`vW`&3{?TsaRbVS*#%ChpoTp-biqvws0x@4jzEadVRpg73LFC9V?1=ADquP+ zpnRBJFgw600WuB`RRPnnBM4##%r2N6P#vHxXHXR|9WS7Km|ftk0`dnat3y%=R0T{2 zEYrj60=pls0~CWSpke{iRDu}~b^u%vWD^dw(12Ba9;+aQ2rRwA+>R0#pwv2)&65CJsB;_5?&8b`uwb3%-d9tP*mvEy(GR zCRbKIi=8bj5MY7Au^JL6uo4y)7_dM`%?zM6*L3itxW`;bs|!YVoPq?6#~D!2fLmQq z5m?ZGWnir?uqtq?3#1Cv>H_UU0+|UKNWH@XYG8rp#B(65jcb`iL_lIljjjL?e{eRs zV1Wt?WN@_wig{=Xgyl1oya4LXfr{|ysbwrSG7mmM8eK5@93*%-u7ZLW+~|Uez=HS0 zc~HvZEeAC+z-*+H*KrZ58>DCZ-3m}6111L3?{OKT2CR4c(khS|m>5hA*mh8(3uNB* z+!}DB3+y6rqYGrhcGEggqYLD0aHDIwz#Jx#?K%xCHkz#9U;r%?5LShS5K6X%)dcW5 zWa&y48<{p}dkadRxCV9ST~J6sM(m+NFlTn$07)gTXOi2Vy^3WjqbyheDLg!GLCpYZ zoNl<0Nn*R{8kWh7vM>plNgQ_|3c&_U|G9~2_V$K#;6@iz0;cc;$TgrC2AK>QczO`X z0$NH5l7I}^fwVvxR05k=Zn7LfZA*c;+f_G%+EO5&VrxrnkK4}jnS}$oV!dQKBQuM^ z^v*pj;A7|H7#SEeX1@kq84=3p%?ntsQ;T28Oq%i_($2k{WciRJmJ+pq3r zVP;}$U}s>kVA+0eKg%(8UMC+{KNr`acvsgjSJ#P#;@eLgXQ^Q2JpnQq)CHRZvcdN( zOEhZ*s1V*R_=UxUar(n^EX!Fv_(3PzCQ35OPG5DN#eSj#D`>qS`}D8pSwyFE$})0K zcX-CiJ<&m7y2AyQ4%Ut@pjbM4fn|<}Jv54;bcaKYH~8#J>FqNvvIwxULj1LHCX@Vh zg9K)S=@X_fx=ddn#>f&lfti5;?3a25h8*Y_g&rx8B26O|LUY`J(6DlU224B+B3=Qd zUx4W8rZ-rec|G1kgXts4ji949RXLzr9Xde8PCWwy{AfX_u_r!(^55MXEG~>Z&=>+Q zyWXyQi^Z8Sv|>KwNJ|fKNR?vF2swukG!B&kI-MEn=oF|YIH3EFPCzeP1F!0XS_Psy z?t@%*_Xdmh^bfaL6j&kr#&0Y!EFc}*FWzUjVFWX$D>}03)Pn@;85qKu7{I4?!ZvVm zfHz_>FmOOOY{8rZ3p;e@Xox|akM10f$B+O6ISqtQocP}WTIvqMApZ1(dn^X5U{%vE z8gs<3fXvyRIDyNSk@;UiD#(r6^)SPUaU|#zDOkkD!om!?U8Z9mq;66K*^Goco}oJO ze@aRN$Ri*}axySXzyE+GQPtxiMA3;S5E`Z*6fzx*3=ClT>56_FF+3nYfU+0^DCPyf zurM-C_v2(U2K#Ng;6rvD7LXa!8^5tc^Jc&l%ODizorEb~c$-~^1?0Nv2dmkkfiv+x zCX1l!T*@dA{O=DuRlo*wXmMS>N=2Spj{3XqoV2bXZz zFhZgfl#xaJ03?1#G^3xaDWPxdIp9>n0ufbm}Y<$QG<8jfLy}>-(kt| z3hEwbRtOWEr9qZLvoweaP7slxyBT4|fD!~K8FN65hglCR+mc|`LwA7vK(ij=2nL1| zuc6j!Pd9kWBEbsbgL5pX;M%@%HYhYeOoSU?X2IP6wFBk`aJgE~z>o}c19Yq83LI|e zcnfkv?t2zzRtOUu8yX->w>JuN+Ay+!m|*)gL16$h2W~&qe31R%91AMUr*HhsVmLfF#-zp|K{!piYp z@Xi^~6#oJSl#ruUs<$S!A4D&{l=m! z3T8svwxF$P;96pO=rpq?xCc23v{PXf63F|YN(oj`!S?cTKsN<) zK)1+pKsS=YvM4B+7Vt1Ia6p>|6QI$g0OdP?XwZs4ZQd7RAHnBrpJ?#RPu>3V2TKZ% z2vn#Ks%wQf=#=C{R@P`)FteV40Vc&E0nrUMW%^B4)?itf5KKu1R0&w?bWb+cU|Ed3loAV>5zda0c)LJ2~q+Rf+^9EhbRGSo&FM}1SSMi(g9Th);c|slQmctCInOR z0;&Y8b^1w=5||K7iH8EjBCyu!mRum`LWN*TRzUe+t*$pCBbLA(#>kC5S~}t){ z4i$(gV6D?sAvOi2e!2}tYoNC8lKfeOKtynyn-TBn}`DS-*Wlz7~RSOhk0x}_i}y+DOvN>)Jm zV6D?vf|S67U`jadKuiIfHeFH(lwP1hFeMpKK3MDYPLL9q5KPGls1mSg(|>}Lz=U8* zH10wy0&AU~DGW+4P$8I-4k#b2b^1+^5||K7$qT3wuxZmhML_8VDg;yFaSvh3seZEgyTNM6tLFmGeJsVLNFy6P$gi~rgMsc(hF1wrsM>a z57s)p5~Kts1XH5%0Adl?wCOKFN?<}TB^^*DV6D?5#X;!>Dg;yV0?G$#oqiIe1SSMi z;_(n-5!kfpmJ*=!0u_QOSpnsPwN76NQUVi#DdBhoF$HYebV*52dVvbTlw?5pV6D?T zK}ujkFeN9TO2DQ~{|Qn86M`wxcnq-!taW;(6eztwg)IXfK8jODFaF`P$8HSj;9b)z*?uz1Sx?D z!IWe`m4Ho~&M6B@FHj+vk`quqSnKpkkP?^>Oo_%bh(%!2roRL!feFEsbU>AWwN8(e z1Em+J5KPGnC?BkK`bm%ym=H{f$8(59VAG~s%7fAiR0yVI1(XlgI(;Qb2}}s4gyRLo z6tHR2B^5yF1u6tnk^$v|wNCE@DS-*Wl$?Mn0h>1cCrAlQ2&P2iCB!1I*6Epwp!5P2 zf+^{M^1)iC-vlXv3Bi=SfGPo-Hr-PRlwP1hFeM(ZAQpkOPTvVq0uzEMSpii7Hf_45 zGAO-3g){j&~4Kz@|-?R0pLOs1Qs^29yuhI=vI51SSMiassLZY})jn zASEy%m=cZm5R1TCr)O$_(hF1wrlbSP2Wy>v6Ql$t1XJbWcrCdVvbTlz4oA zSOnHOeJ4l>ObDiA1yl*xwCS2!p!5P2f+^wn2r&h$b^1(@5||K7Nd{C2*tF@K+Mx6T z6@n=_0p)|WPOk(hfeFEsXncZL1U7B@OOO(n5KKu2R0&w?^hh00dVvbTl)QlQ!CI%E z1Sx?D!IXG>hFAnPZMvl{D7`?1U`kd%`CzTnSAvwlgkVZIzCcU?n>Jli50qY@LNFy6 zP(E1e^iGfxm=H|K38)gVY14m#l)!{wN;JMgECOqto~aK?FHj+vk`5>ztabWLkP?^> zOvwwV60m90JqTAy%MAZCInNW@dIKJ*tF>{K}ujkFeM#O zC19=7BaK1n1u6tn@&d{SYn^@)qy#1eQ{wRxViDN1>6Rv-^a2%vDOmyKgSAdy2~q+R zf+^wn1u+F|+H^@%P8*6BAvN?<}TB`=^#z@|<2GzX;@s1Qtv#~+AAV6D@4f|S67U`kd% zm4Ho~u4w^EFHj+v5{|zRQ@~oM&jcxf3Bi3EVN@4 z=7Fgy%1qCgp6JPBJ^i#DYanz&M$w)%nzaKo(gYgwQJ((Bo>dVt;0C%x4a8MoJ%Nxm zabQ(oeF5VePXBkG#TcSo(UDb~bp==kG;oR}2vH6i)aC?T(+8eNn%?NhYQX}U0Ghtn zku}-$1az9ELjv`hB@QV61av+HMoTOJ-HjgV#H!57F&8vP1-is(`UEFd3Emg;UW0d} zfN9WFSg>ga=q7dOc$)#}zC5UH522%aFk4`wc;GD&(`}tumFrjVc3r!E4#gxtK0SzlK4UvT~H_l{|22JO& zOrPV*TEhwnOIbJ8776HKhoE6Z2T)K#Bj)k+i4PgY9l>*XD8T``i@@jlZX)-ozh4{&D{UGWCdtl^+F-SX1|+nA(5 zlY<7l91@UuDliR7$kNj@JXj@JKr?foB;Y*#!w)u2uxvd8LloGpq7X|M7@UF_7$P_s zAg3Ho-}sE(bh?!%YZRjb+ydk2=L0xcSv|giCUXvcVc*QQeL(>00Y*`dACOrikT<|% z&ma}kA8z7|W<3E)DBCAGbJ;MmfSA)8w{SYMf;B*fcQrt6-Y$3oHYZkS%Av~)8VU!y zASsMBict~C1@&t<*jRpo91vK@zMF0Pg;>@FjI1Z-gRY_5SjjFd+VLCJEhj*Vr++Nx zh+&Zo%TL`NSOFSH1~I2^+{WR;0#Xj1*kS=Yq|px~4Ps88c$iZgYVyM_PT}c3vp8&~ zFG*&N$>sPDvEu~89Ps>*$6pA)g9*xKfzTXm5c&i=gzn&k&>q|n8Wi;)jC`~vhz|=# zuszc^?&gSrI1Vxh4t89l0hccG9K+P<8*^Z?kf}4UY+@aU4hzUp(?6c$iUrLzLT7Zq zvfz0)kW;5Gyvq(XTJba7-(bxkA534E3^N-tu?p7x(G+U)#RpKMA=4w0pczf@{2$1- z(*+;1$FP9JptBbs=5(;lpg@?;*aC`>e+8-AAt4Ty2HOk@o9T|vpk_n743=e-=0Zvt zpGsJx7?qGx#`ypaHWuDFhN;^F3)#1_ZI7y9-Nz_;f)5hZ@E`@LnBF)IWIHrDfTlXY z>EYlYV6rB25qZn1tLqP=Of`eb!J=wS0O=s0&6g?q|>H-ds3TOrey8x0wK}<*n1#6hz zCW=^<@Q63D?I4swL!4UWTX+aD}u-M}d7A&KgU z4v>oJiXYgcSvjPjabd&A0%Af!0i+%j3ea=}NrPZF6s|^g!=#n0QH*NnfglaCKT(ro zKihVejjUT3MNi0}+Rp(}0g8qgu$|CY@BrHnP6{CPka>G4P#8dxIfywOoEAWnzL2!A zYa446qdKYsSXn#d5H8T!2XcXj0;&tZDnKD1KAqGaVcd zAmxxU5@hN2ga1+T1Zaj0Vm;SI)+k0zRO?w;J5)jT2c~e|W}Ci1j;&xj$4yoZMo|xS zR7Zf7fzo6Qi!>rNfS8aZ304mYh77PXAVmX+2?++!;kOWX7~NxyV$?!)2OEnf$QcXk zIQ`kDbI3CCEO&Uu%E-#G5MFbf&_Z<(2S@{?r~tVF8ZRCoHY8X;>LEo1$PwEi5^@9zqbP?RBvfG) z23Q3sZ$z_pfTA9n48ZK^6Dv7fSU?&eMJ2=q;F=V~gd|JQS`mm7UU9NTG3p>W0o<6e z2f1LQGsgk8?XiMvn;Atr98q0x0;FPkqARF11$F@>dxDsdCJabDC}YI1fNX`Xm;f;$ z4gj6;3~_*vI9n8>E|LQv?Kx+V3n1;e3OP1Vd(IWr1s)(3kgO?#$eJJ~Bx`bj)I&;2 z8AM45VnSR1TGa({ft3nd6r&!J3&26(268}P3g=d~>8qx(a&2Fu&9;S6w8I0{6(>N- zrXPIG=`W}k|9{tm|MmNe694b=0J#GiD_}MxP(YeNffCKC0dfd5NrIRVH-VPgK-`pM z$QH$@kK`susCa=K1+KrQKUmD#vOUIk3XC{-_Q(0a5{SKnx4WPH0mb#Ds(c zNI4`NGQjpjN=*=RI=HFbk(LUvf0H*`6r&-M{g7Y?1UUc^4ATXUaLP~r|BhXE`j23? z2cjIosLt^KsRubHnw3Kqkyb!VNN|AELkdlh8=!?Ih&dhHzJojGRs>rVqY;vGz`+p$ zat);A?~%Z^fRWW>5xo5F2t#$s36Nq)`3j&Gx+4}sd&EO%jzkE3A_+owq(EqoG-#2n z%nCMYx?vngH0ueF)!QM(GKdLTO$V}K`oubp7#5HiG6Ew zxOfCPX!=J-XyFN2NCZ*`(F}4Xq~HaKK?`0G6H+dNTt7Y09jX~p@`7a*PeY4kaKQ@_ z+CI?}#a@s{r!#s(wL<&^QaAnJIjB}}=K>@I^%95)$(o?WWRNtORn8X0XpEEyz>WM2 zL?XCR2TBATi{XjjL?$GJVZ}EGNbz*RtsF5dpooVif({THQi+4qLy9grQ1C%2HV_k% z1|UYGrGYgqY%#7Lxe%K;@*#9bHiSM=0HHgIAhbsbgytxN&?m|vbVnsL4XChyOoGIr z2FPY;Sp{N3;sIm>MBW1=2(3RsOh}IkWHUrQ10=ZpVFD~J3Lim3J1_|v6_8j2DTC+* zxf0T30Et2K0EjvL;d7{7a4!)g1WlVDCd6SNFHJv~4mBFmKnKf$n+zb2P7j>T5yK)6 z3fhmEFjob>g_;cRB!VR&DHFtm^l;$iz^|!nQH&<2Nr08rqZ%a*EM#O^0!;!UBDIk4 zg{1(n(&>qjuoM8PJ;4b8Tz!L-L&|56?a;6VF(C=y1lZt-wd|tPwc3~kLF>E0Eja}b z9-iqrbGiAZhb?Ava_wk<*y_;)p-OA%nTkRc&CL=^>MLi$@E<&Y{0WIfcOASNh9=s*lcD-k}#va(FSaF8v+ z^~7X|WgSx?G{+)q%N~XF`6MI1#lZ-Av7fjGH$jJ*;c!Dtb!Qr zu?9k)SOK9q)mhW4~mT)4_=YBm_+yASNVb zfm{z6xCDto69XWxE?ja`RP)MFPUY+*?ctYZ4Y%N#K*peTm6 z)vL7<^_(7Q6fKl|sUR3)z zKq^3EUeT-^@`$nz#Dp}5KMzWk7Be!bpb1D$9|9# zz$38JHxw|lZ0}QG-^D2EaS+uVU}Ye8#IS(uh9-Lt5E~K@AoY+k7-TmziGY|OXXrA| z1&w@zrYOAB*rOP&QC-2tav0C`b$%!XPHZZg2>I>jRJ&)ZZW`C^6`;fVTTU(&Q}{_9#Xh z)YQPr>TwN}93a`^f)6NLaNK}|Ei7AtRY0;ODBhvj62ycQ!XV|KBoM;_vK1P#AST2C zpgW@=4wzTK&OV(ph&`Cm7ReRhYUw7(5rKv5(HyKNR>D(b$8A)XoB%06l2 zOi0xPQVyvO-XS6p#Dt_ph{<2$*jKx9+=rNa;sJ#AxC@~>9zkf2ClH$B8H7IZ971=z zgwP(Zq3KSU6>QY>jh|V(r$;2P3$SK{{K-!R?Ip2hgs`WtO=LG`1=|EE_ccIHf~Fx5 z6Ou?kE`Z2;fCQn52*iZMGstC-LK@$;(2}xrhe?SruNDP{Y zKuky)19=aUc|c;&L<0N7k~`ib0v5!C*bNR0aLoV`gZd1_groq_En)B!5XERW z9X2Too)ltZd5egAj@9tUKk*I{)Uag80a6BOn1Es&S`>MJ*pQ+Kq#jZ|fUJgwABYKx zeH|9C$rEeYSG#(Af|$(l1wwaxfY2wtLggy#4Sp-=pQ&>jDvk*~r6GHE(E z?!VNr3$V_B#l0;fJLFV^*y)VkjKb3s8rT(B!S+F-I0NJ^XdHr=kYEP610)~A0uqD9 zA&3cyB#`qUu@C^Noggh%5EG&sty2?QhtH5|l*BoL4vAqfN| z22CI!Cd6)#*C7c6BnC|&AST3aaEO2hEkI(>G62McqyW$!Lr4m+>SvE)w4aWW0$5o+ z80H$LZr|w4@s@46p8^sIU`YV13{){jvvz>u9hwHfY)DxI(f}y| z0uez3VnW;jx{nUxj-)y4QPU3yF(J=Tf=eP$?YSK?-g{y(`vFGL4pvl0oB*i+jrT^g zo&Y-n(q{%SK?A-nEFkru@-UiJ17tHaB0x-tBS4qnfgE8zy=NtR1fwHHV6cM%12T@c z;5<8M9B&OYSBQvkqB_O{q!v;l8X`(W5EBv}Amxxe0kR*OCqPV4p3r9X02^GpjeWIi z2M@$#4?YNef(t@(BtYmBi4eLY8A5xcLTHY32z??0-0T4L(Lp9n2XC&su$^6j)dS=l zNK|ox+4T$zvC}8IG73-k*~zZM3bqlH?4wyTKu&{Z3lI~M_CPKH$;YsO#Gok`#Dt_= zkOLtp7bFHvxgaJ)H^|+PlnWArrd$vcl5#=bfwT)iV$hTeVnT8a$d`~j7lcSqAST3a zkmn(J4kQMRY7i4*H#khd-9(TWH26VGNJ;=*e+WqlCMVb<7@el0Ws8n1^pw!C7Mc=- zMLlvL0T0U@V8xK88X~}1J3wqms}ZCgk}fkqPJjk8hzUsy5VI%NvP(~QxXM1k^+Z0z zf{sE6&5;M8J&GYTM=69pQ3jzqDj>8+6@=!f0i_5?XB}kJbZ|M@agAMo^#rV(v}S~` zr{BHKZq5p}38c(=`i1T60@G7&fYgF~0BLk^fS8EXbKxet4lCGIkkkS43N&?qn2-nr zITn&SKw{9;0b)WT5ab6)>HvvBQwN9%i9nFoAgKc+22C9xCM5BId<;n)!HCoWVnXZ& z1q38@fW)Aw1H^>b4Gtf0>HvvBQwN9%NgZEKdx2*k`Wc<4BN7I+*+OO#l) z2fYLJBRZhhcfwM{36L`Abb}G1bO13S?In(?3r!IqCd38*pe`_*&i{oylFGzpxi`h;lSTVjX6=2S^T5OnQK9gcJa*U^b|nbY=zXfOKO(RzhPA#Dv%m z+7CXRk&&aH(G|&Ju>V^?_A+{L9%kFVhJ#}Rqi9DPs_iF0Dj;6(K(ZaohWH(%0pj-+ zAS1H^>b4!T(sWV_Y$WIm2iMmHoUK>XeTa)Tg02gvVTsJ456qtzuYJk^oivVx??4T_E-(CBEUvL%5jhrprrwb2`Py|Hh`p~SyzAr zq4^cWgp{=)n<4TiK!VUL1!6*qYLJT{B{@h8n$|%~h<1=eAtiYzA~}MXkfIvoen?3U z5`!ic5EJ4!khdWHe~=h7K0!=~-5}pWx^5sbXh4IQ5WB&F03Q1Xi9vl1VnVV4=s1b# zjd>jX(+eCJk=v`_`M$M?6roZEN)a3fcnVUdgO_`rSO*DaSeeWLQVi)rfsz3WDpaSBy?E7Mo+9|7oNVSnq!8m$0msR99tlC#|8*}Vk?C1*bbpR zc0y>5-4Oc39thpB4;uX{EFhDh(Fd{)8hs!pBmzJ-Kt}UHV$kRVF(DxgvKXSBBMcFL zASNV&Kn{Y$A4m)ue;_7AJII}o_ydVS;}67yL=edNkoW_MLE{g^gt!glD@e}@BnFK? z5EEiI$g_|Z2uKVXrXVK7Zg3cY$8SJlP>+L{kk|)ZI6Ymkm!qH27pX9Slt2d%ald5> zDDFKDLgQXU~Z zM8txakf;G!4~bZi7&Kx*Oi0*+Tm^|(kQg*#K}<-@fgB5oSdbVrVnIxZZjc`!5epK7 zMl6U4i8+whAQ1}^gGMZf32_?8$B?EaNDLaWAST3aP(VNmB#;<1z(Gui-JtM+_&WmO zZx9obEI{{;PhYs2qo2_aJy~=p&ofNjzOasSH`{iX&7fq_aR{0$ghf46A>j^77huJZ z31CoKfV8t&Kuk!d0i+z1ETUO8K$b%T7{r963y9GR|8V+GZ}`o~FB( z=x6jtihpn$!3-4rNbRG9OW^jA1te@?5q|=t4AMU0Fhw*EKuk#U0Hhug^BEv(p+O5` zLRkwoiv^4Snu_2`qNIj%$ z0J0DoZy+Yb?g^mu(fEX;pD_^0TCneJLAF9>H+HYZ zq%)AkkYpHzNQNLLB$a~P14)J;F=#RbF(JA^&V*z?kQg)>f|!t03UWOp`+>xuX#~WC zI1S_}NcIDXL8B4GgxC%8DL1PcZghUU>Igr=`i9urz z#DwSuxe^k4ATem{ftZl!0XZHLdmu4r?17jNr-A$gNwpv`XzYQQ5W7KMg``@L7&KTx zOo-j!5CG3b#~}O-VnX762`GRTDsuKS2BXG3E2~EeDDshd$a2$J<+fkY|NAJt*>{Sv5eGLjxGZgt%iJ$Q>W8InAf(b4DVyAUTlLF)SeKpkuSUIVC4f6vA~clrYt&KyyWTvS(hfRsX(Pj`TY0C`ZCfC8WZ)#?)f3}Qn3 z4^j@P0zj5QQy+*4u@`ho;B?0@&VI&l4F4BFZABR)DTo87fD%+!c!1P`ToKL6VU9=v zAST5BAoURcuK-yNP39mb#2uic)TU1?;547UAel3QF#^dk;1DPUxg{_KoCL~I?LGmL zgA5aSfGmUtK9~&}Cvsr{X@Cq9fh>gPArKQ{_XAMsn^?fv&lrhhEhG(8g6!Ss%yFA- zx{U#c%=Ur`&KgEhj%rjVcz~3FQeiY}2a*%OY>59s8bJP!VFB3-&8HwH#0j8-{XpKg zp8lnlGlVe;$sJ(t*MOX{u#PjDgVp00ybSKBLv_XpkTOUa40Z)1Er6Jiv;a~L87zuL zlm;Lss0`MIn*6YfbG0i+6U5{b%@Eq70YZ1QLTHb62+h$6p-*%{=#Cx;?a>DcQ%JoF zG73_-f~mh|JNDP`VKun0!K%RmWt{^dJq=A?ayFq@1R4Q?Z-~=%t zc7uZeJe>;?gZdl9ghcrlPzZgr<}{mLKZi4tF&Zh#!IiJUe8bf3hI2tF{)FLt@E%ZD zdCLKkgCsW&3q)=MF{giQswEpaLHnpoQ5^tQ2F-FHTVYua#0F(KXI2l84p4%RX3YTE42?Jt6XFOCkQ>3? zKfjGLk}($5C2TC_Acr(=2c`IqMq#jcIfvkq6 z4-gZQ098?y!Q;C+s0~ha-gcaE8zvt`Pc!8-(ug0Qm^q+5njZ zNp&Ebps5bToPM#NOBWnF;Px0u2%6|XOh~E%Sqn*YATem712G|K666|4qKii)IuLVu z;bf@U;4}vkf~GkT6OtrBPKV?*kQg*!fS8c%0P+zeuYts%Q3hg8S6mJ?8$7-S5`qRL zhzW5w*!$ombs#aQr$J0ed<%g>2OQt=S2-gY<51(9mDR%w6ybu`K+lD*)P)fZ%KU<&6Uw(Y-P za&BZ4?eIsn`~*k^XiHEuD~BZ_vw@h9QWc~gl+t5ZKo&wH48(-ktp@UV;3H16>FeKf zMlvQKIRH|{1cF?U_yLsCPn>|JbP+yk9Y{pkqDtrB!RpH zUc?D92~zxmY=Wi<5EGK#Ko&p}>uQjjAWJPk%;}7qpa}}xH(vvig>2FWF{f`l3Y7(C z6Oa%zNvq4Nqgo93Yo(_(1dp@p6#zgc8???ef_(wjjVh&M{ zG)R!bQaV@;QnGh|;uaduU^ZkV38VoM&l(^rp-u-eA-1mqInGd;tDi9m)nYc543NE$ zS&u79TniXkIZi>7o3QAKOjL((fD}WT5@2^gni3!;q+A6lhd3hxWH&U3Kul0_(_sOd z3?Apq(cqfl>X8dEo+BSZcVt8869o{uqXfI2xi%}rVDK=GLJlLxbO(2?5Z8_dh#ekH5c)(N zgyv|0&?j0UbVoac_UMGr9NiH5L=VVK;KBxE5+rItc0!{T#DwH&kOh#a1&KkU7Q}=E zFvwm=fdLYO78oEVWXlT37I4fzL_{8l3DFF4BqZ`cV$jF~F(F%4K$^h?8Au2kcOWLj zVIUttk_|`<8hIclWXlRjGq_p>2|)uD#Dv%k_CB~;1&KjD4PruKejiA8U<6k`V+wlA zcl3c`KCqB|8{78x@mxz8Sv$@^V;;0$1rofls0S;C)Gwg;hL$@XAU34jnE za%kv+n2@-K7!A(wJ*iwXTu)4fnBOrKLUT-l&>qtvG{;N`ePR}b?wA9iJ?24Zjt?OF zz#Ry%QIMDe*$0g|5EGIsK{h~&`bUVU12G}_4rDPT>Of-9r~@$}kpprMB;SF=pm7Ic zLN=&?TmjB^AR%bfftZlU0XZI07J@| zkQ56NgT@_*39%dGS4fI|f(TO(6Jj?w2*8bakQmh8ASNW{K^GBBFPzHN&zOc3^WZ)s z>jKEpG~3v=^UnpvJjZ!>%%5O`gfJ}TIY5dbH9RP`p>1jq6H>#2ltTv2KvqM87sLcb zybcT4U~s&zSp=%!xge%<@IdGe4hVgM7eaUNLud~{2+bi3p-+fF=ngSxysNN)OoBul z$Tn!iftZk>2U!4#IFJ}L;y_GD*n;eZL>x#A8gU>dBxXR)fkYfg3>tADCPX*Lm5_)7 zi9sU{#Dv5Q$nlVfdy0rS5EJ4wke?t479<9ZI1m$JH^{4y1Pc;_hA4;$u^Su$;IalJ z2K6_H35oVQpbXErg{z-29W~lnSv@2W@jiby*D^+yOVDT+5s`v~FD%xgGL;P35gky;~^0T5`#t@hzW5T$WM?23lf7y9Eb_A z8{}0;f(3~|gA~Ms*bNQ=a0L$%gZdl9ghcx@P_$3H#MRH3fgbH0+K6b^zXgi+E6`{c z7WL4D1TZY#!D=D(J1DZD<-7-o4XNKj>LER7kloPm1u;Ppufqa18659t?t`j#1Bme* zMi81qA3}SWKxhs#2z|mFLU&j~Xb)=$&0!0QcS!XPG71uPAnTw}2Vz13A7le0>YgK_ z4#b3nF34g?;Df}Vfe&Ir;s)d%i0+2f@J2a^3DFI5CPcakAq`?e;s)e;h~XeHsNoyFq@1q$-dYG*y9^5WB%a0B-n!#GvT{#DqkA0w{zOKXUamW+FvA zxPrGs#QXjqpm@IukM|A-NC3m){RBuYq<#m*H8kEkKx|0;4pI+^_co9p6u~FUfS90o z*Jkwq8x3yL+wib*OkePiE5wz<1!BnwR|xIl1fe_JA+(1lgy!&u&?kH#bcY{=_6Pv^ z4IKMmqad;00kR*mzaPYe!~n#jeA-X}%gcLa-F=*BUF(DBIay`UpATemd1Ti5_19=MKv@V3xKun0;AiqKk2Z=!q z2QeXbgM$Fv`U8nU^Baf>iTx~42yNu&?q|$GihXb;AB2c~e{t?*j4apSv40{M62P$7 z=K!gN)bXGght}~RCZvuBDF^l9V^}~oLwyKhLL$EdY%(J94P?1PTs^`ec5p;O=#Eeb zeIg1%cf>$wk2na;u>nG#*a)FJHiNtd?#hEqf&_3kCXA7lX}d-Z^%A!9fo zCM1AC_CmrRBnHi1ASNVwK+b_A4UiZ#X@Hmz-5^&&vNlKznzcbpNc4al4~adH7&P`k zOo-D!euC6SATem{ftV1xL0*M;3?v2(R}d3oH#h{qoy}f^$3RR-+=Fgen(nB_-Oref z8uzTM9$OKSf8P`o`PZS5FCwxX627pw2P=it^fri^9>j#y^dRM+xQ}Ml09g$UKM)fV z`6s|8gCl>!5k`*b2due6Tsw9_Eb-U_p-=39&>Z_9^ojity5k^(_BafoIgUc;6URW2 z53cV)CPCr{WG6I!KukykfGmK-4@e9eKOiO~ghBQ~a&{jm2q6blfS8c@0XYW}KOiw^ z{D7Dc-5^&&QdU1mHzZ|&n2`7ZIUbU-Kw{940Wl#?1NjN!a*!C*|RF(Hv(2MVBzKHU9`Ip~q!aRL$f`5~alzX^?eVNs7$kN}3o zK3FZJz6V7)wA}Xqu_5(6NIfL_SAZ;srf?7w6#Y6ZV57mY4=(ouqPRm`Pn?BV(s3R_ zbDV+D9v2}r$7Kk8;tGWBxCWs;Za`>`TVT(1gU+1*83lF$R$WMg^B8UlzA&`3@xT(bhVmHXI5W_zq3F8fjq$@BmFu>%!p@%JNgo5vD&*4^< z1vBdz7+_KnAgOw&mgx&~xTR%bLNFyAP$gik({F;5z=U8*c0iSYwN4kz<(8I(3Bi=S zfGPoNo$d)z0uzEMkqCoq@&s$0-Uw0x6M`x6fGPoNoxT&K1SSMiQUO&0);j$oNC`{` zrsPC8#3HcP>6&@m(y}lin35GS5G7!((-T2TU_vk@H=s(uTBpwhDS-*WlyJmCOaW`1 zei5VuCInMr0aXIlI-N70TUr(-1XGd$RRY#J-4Ub&CInM51F8h9b$TU82}}s44hLAFd>+d45$*Y*6AxjN?<}TB{QH(z*?t2Eaa9} zfeFEsoPa8UX}xqIz<&AyUPcjFm<&wi52#A83DX0MxTR%bLNFy7rrep5U*IFd>){j!KAg!CI&91Sx?D!IW4)m4LNQ{|Hh76M`wpfGPoN zovvBREiDTZf+_K+gIEOCIz17j1SSMiQUO&0);fJANC`{`rsM`x30Uj&iy$R1A(#@5 zdWc0}t@0r~vDn{t{#eObDh#qYa`2Y}jQ(GF1p);c{Bqy#1eSJDMh z0yb^>M6eR55KPGpC?BkK`bm%ym=H_}M>oWj6(FV487n{`2Ni-Tv4HZyTBlorl)!{w zN;05Iz@|+v1Sx?D!IaE^DgkSqz7nJaCInM*0;&Y8b^1e)5||K7$q%R!u-564m7uZ% zDg;xa(F5@jSnKpakP?^>Oi2V(3D~shoggJJA()aKP$gik(+`4_z=U8*UO<(AwNC#D zQUVi#DUs-fxCN|rx?vT!v@A>rrep_|7Qm&!(lQol{26!!6r;^tmc-M zg$cowoPa6;Yn{Fmqy#1eQ}P3<1gv%XN01Vj5KM_iKg45TtOo_w)`J=|P$8HSjY$yag0)V!1Sx?D!IVTmm4Ho~UIOvwwV60p|kk`3I_vM?c-5{bzW=Yq9P4+JTJ3BiC zPVWRMfeFEsR6v!0wN5_>QUVi#DOmwk0@gbHCrAlQ2&Uu)R0&w?bi+n&X<3*MObN#n zh;zYOr)Pqcz=U8*ETBrjTBk1rDS-*Wlw?4afVED)2~q+Rf+?8+RRY#JU9bsMGC+l3 zN`653V6D?VK}ujkFeMRFA0qxF%1=hDUp~4aSK@M^hA&nm=H{f2UH2zwCOWJN?<}TB^6L5V6D?H zf|S67U`kd%m4LNQ=WOAYmW2tylytm-bd14Tr#pg_z=U8*c0iSYwN9@DDS-*Wl)Qi{ z0c)MUv4vY&1ttVjBJmbt5lri!U%%|8PpIS;k%h^?RC+*Ff=!sN*vc&}2NQxRsemeh zXq_(iibZUCLk>5KEKCBXa0OH$*nsI1TR|ZJ6@n?b0p)|WPCp4!0uzEM;ed`FfK8ju z*v2ib0uzEMv4ARpY5n)7#%}t9DsB;3m<&uMXwxYOgH4!T*v2i*3clPOpcFM?yy}UO?4>j0Iuv6;aSDr6d>_7+~@+ z^&BAc>KPbd=D_ZW0*#7*)WhUq>cRHc!_5(6fL#a$(*Ra5ePRc1_pm8 z28Ii)3=l2T4|Z_(GvXSFnvuY_e|DjpnK}4*R?T9O>daNy9A92Ii`Q8WoH5Tt%L2vZP0ih*rnSWW^hL^FbGx&=#^z3N zaDZhX!2!N&>tF}B>2#)f+)<205NqK9!t$7_Aa#4_eC`+)4sf6|FoaG2SkA0J{l#ML z7{+3-@`(;w(;c#zS$XWwo;hR7z;MEefx%<@>?PcL895>DWMFs&(KTTicgXZRySOB?c+?MQf5F*E?&p*Sh#qO{Ie3ANe!`0k6ATG;y1+?BDbQ_nT+=)Da~r5eENK7_M(%K)-3Kx~VmstgI0>mP zut^#VUZ;T%^5bNj=%55i_n-u+3U(t>0_0F$2;b$vz{tSB0e1P^^W4R(U^AzKFP=Ma zkUK*aY$jAID2Q%=#YA2Z^EaVe()(BzYJg zSsp9~)emBWF^CU}FOV}d7QE&H=THlfccwQ^VQijWaG0Be6&w@OYY%gmuz*4dJQBt^ zfq{Vm9B9);k8m#$fJOvJl!<|XL14P!Ggc|k(clG_xIH9qY=s0C*mocw+dc<}wiL*g zbXIU=fQ_wJU}Ru`sdi#yU;q_~3=9hP3=9nR44`mkNPx0I#WjfSV9&q+VuRGc*az$w z7+`E#5PFo+Tr;U9N#~n{D_4Y3y^Zzg!9~-5I2GI4_GxK|I~w3 zgJK30dJGH zW;lpE%v`9w)A=uQ2eNj60t%D~idn(F0EheZ1Deb%Q2yVG+%5vpkiwA-RzQOVwb1X}QWBz`FtzJD|%-?}O@) zi`|^^(+kR&*uV?@4!-5?XRHA0nCPIv3p0{qw%MH2=?mX+drx%WknMN}v4}$flI=MH z8o>n%mE~{6r>o3<53V&pad-h#jzRU!gqe%bpL3IY60^{p)ai`3xF54Z z-1bnI$wcG<52_JhErz$bMOZ+FO=tYfJr|^J`@+xM(u}@09wL;3d;)Vh%qJk%gD}j8 z99mGH=t1cZ4UoVA(bEI(a`$kk@q<0p1oD*FJ??as58qH-1T_NgDIIvAY`F*ZR3amf zGb_heP~%nb3(I9uiN^?Mg32n0ROJJ16&aB3dIko#X)uR@Y?;3E0mQe{7k=kYT zFQ{Z@nJ)31+mr=#f$8+X=iL2_mEiOZYMYpCH+sQs#3-AQ1u4K_G$?sxfHD_Ie0t+c z?iv=wg@&oq8DDYtGgg7MPjt|k9&?;UX!@&H+)b=67K1LMEqu)_%n4@JGcag_oUA&% zZZC@fsDUCp{pxG(1Qt-U0%VNo^t?CRQH<44vot_$JC^AJZ@FzmIUa%+yX9jY0gHow3PLCwApMEHw0oDjMbH+b}nV>iVOHHlh(UF0g0XH)VY9`3J zQxEchOaJMKj4&61&Dl$<0aP!ij=7H>){*VP~ULz}tc{7+%&C>vzw~>uUMFy%LZe9k| zJdi!pKe9p1o5+r0o&+1Jc^(M!p!(tFWkJmY*)yGy6KdW9d4Y0BP82_teI}e4>j&0KZ^4rcu>td0X7fpJg9!Sc}h_8K=w>`6oi`h zP!Pqu8N8_Gy+D`;)ekpM1!^A1p6P+YQ1iga?*}OPfm1Uds&O0;8Bl70YKI%A1~m?3 z&GbZ3sBz%b2i62h%>nnoxe`=uf>N^vSPC3`Q2lW8G@#~z?3rFD4mA&)`oNmN=0yae zn&$zQ0tX*dKioVmsCgiJrZ-AL%>#SauQV-nI@r7!L8#_&fTaSZc~oSe`r+p3K+OZ$ zGku~o)I4zG=ml68IQ)W9&4b7!%JQhlK=s4T(}S7^vS<22S*Uqn_xZ!!ClQKj9tT(o z>|dyUxOocD(jH{b^o{aR^T4^y;gJ{AzY$@m=4F7Tz~({q!_8BIng_CH`awmgdEnNi zh9lg-8R4h~LZl`t^Qg!`4S*Y{0yPk1(e#VTPy@lWpA*PDaQH=_8kYf<0kthhcSu_2iD%3b|b^~hy$FD>bs(B~CQXAEIRAiv~;pS;T%>&sp{i8b6JaFCd0;~&c zU_>;+Kv3NQkpk84GEf8H25LbK1X%=1fTGjow0Izu9N1J2XOOSKrp|~#H5DQSHWg|L z+*DZQ4zg{!q7Je%H4p|yB%m4ykpdaW0x|&73;`L9)<*Y07%?LeVFW1aLZlFlbWrPJ zx}gCNawGjl5<(BCkq&O0)iW@_8tKp$47|kxG6U460yoG&jdWH>lQz?cM}_4?AY_11 zdHRI&+^ig+fklwe_Jc+|A_5#gAdS&mkTFpnXPy|wT5ub8yTW=7dGH8tAn%GMPjH#+ z(dr56JbLh0vwAGLSdcp1(SxU&w_^!pkOEADyOz8ipfT!t28J1+nFVlHdYUH>3se)Q zCyxrt9ZXk>jMo@`wnqfV59<$Hl>=(Q4TvMpMDk>a!klysI*q{5404)h z6i>7)m|4%j0F%l9N!2qjfVE6N7{wDT3loAVIRRAy);irVnkQHmCInNW(EVtG$p004*cv1kAQ diff --git a/scenes/cube_on_plane.glb b/scenes/cube_on_plane.glb index ca0d9486569637e913abd58d81c4e50e8d9ba214..da2f0566ca0ce0a63381413316d92dc9b0409088 100644 GIT binary patch delta 59 zcmdlXvqXkBJtxGCiGhJZg^z*3WFzkrW+@$|%C!74B`X6xa|=^rOAA8_QzKJjLla}; P&9W@EY@1`a?l1!Yr>hQJ delta 80 zcmZ1?vqOeAJtxGCiGhK^f{%g0V, - direction: Vector3, + source: Vector3, + direction: Vector3, } pub trait Intersectable { @@ -18,10 +18,70 @@ pub trait Intersectable { impl Intersectable for Triangle { //perform muller trumbore intersection fn test_isec(&self, ray: &Ray) -> Option> { - todo!() + //TODO: implement correct intersection here + if ray.direction.x > 0.5 && + ray.direction.x < 0.6 && + ray.direction.y > 0.1 && + ray.direction.y < 0.6 { + return Some(Vector3::new(1.0, 1.0, 1.0)); + } + return None; } } -pub fn construct_rays(camera: &Camera) -> Vec { - todo!() +pub fn construct_primary_rays(camera: &Camera, + (width, height): (usize, usize), + (pixel_x_coord, pixel_y_coord): (usize, usize), +) -> Vec { + //only allow perspective rendering + //TODO: ignoring aspect ratio here + let fovy = match camera.projection { + Projection::Perspective { yfov, aspect_ratio: _aspect_ratio } => { yfov } + Projection::Orthographic { .. } => { panic!("Orthographic rendering not supported.") } + }; + + //ray origin in world space + let origin_world_space = camera.position(); + + //seems to be the distance from the camera origin to the view plane + let z: f32 = height as f32 / fovy.tan(); + + //obtain the inverse transformation Matrix + let inverse_transform = camera.transform.invert().unwrap_or_else(|| + panic!("Non invertible transform Matrix. giving up.") + ); + + //TODO: take ray multiplier per pixel into account here + let mut rays: Vec = Vec::with_capacity(height * width); + + //generate all rays for this pixel and add them to the rays vector + //TODO: use blue noise here to generate multiple rays per pixel + rays.push(generate_ray( + width, + height, + &inverse_transform, + z, + pixel_x_coord, + pixel_y_coord, + origin_world_space)); + + rays +} + +fn generate_ray(image_width: usize, + image_height: usize, + inverse_transform: &Matrix4, + focal_length: f32, + u: usize, + v: usize, + ray_origin: Vector3) -> Ray { + //calculate the ray direction and translate it to world space + let direction_view_space: Vector4 = + Vector4::new(u as f32 - (image_width as f32 / 2.0), + v as f32 - (image_height as f32 / 2.0), + -focal_length, + 0.0); + let direction_world_space = inverse_transform * direction_view_space; + + Ray { source: ray_origin, direction: direction_world_space.normalize().truncate() } } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 29b1d1b..741de35 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,31 +2,50 @@ mod renderer; mod geometry; use std::string::String; +use std::sync::{Arc, Mutex}; use clap::{Parser}; use easy_gltf::Scene; +use image::{DynamicImage}; use crate::renderer::render; #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] -struct Args { +pub struct Args { gltf_file_path: String, /// which scene to use in the gltf file - #[arg(short, long)] + #[arg(long)] scene_index: usize, /// which camera to render from - #[arg(short, long)] + #[arg(long)] camera_index: usize, + /// image width + #[arg(long)] + width: usize, + /// image height + #[arg(long)] + height: usize, } fn main() { //parse clargs - let args = Args::parse(); + let args: Args = Args::parse(); //load gltf scene let scenes: &Vec = &easy_gltf::load( &args.gltf_file_path) .expect(&*format!("Failed to load glTF file {}", &args.gltf_file_path)); - render(scenes, args.scene_index, args.camera_index) + //build an image + let output_image: Arc> = Arc::new(Mutex::new(DynamicImage::new_rgba8( + args.width as u32, args.height as u32, + ))); + + render(scenes, &args, &output_image); + match output_image.lock() { + Ok(image) => { + image.save("result_image.png").expect("Unable to save image!"); + } + Err(_) => { panic!("Error aquiring lock on image while saving!") } + }; } diff --git a/src/renderer.rs b/src/renderer.rs index 401d6b6..ee61fe5 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -1,26 +1,75 @@ +use std::sync::{Arc, Mutex}; use rayon::iter::{IntoParallelIterator, ParallelIterator}; use easy_gltf::model::{Mode}; -use easy_gltf::Scene; -use crate::geometry::{construct_rays, Intersectable, Ray}; +use easy_gltf::{Camera, Scene}; +use image::{DynamicImage, GenericImage, Rgba}; +use crate::Args; +use crate::geometry::{construct_primary_rays, Intersectable, Ray}; -pub fn render(scenes: &Vec, scene_idx: usize, camera_idx: usize) { - //construct all rays and cast them all - let rays: Vec = construct_rays(&scenes[scene_idx].cameras[camera_idx]); - rays.into_par_iter().for_each(|ray| { - //test intersection with all models in the scene - //TODO: Improve, to avoid iterating all models - scenes[scene_idx].models.iter().for_each(|model| { - match model.mode() { - Mode::Triangles => { - //in triangle mode there will always be a triangle vector - let triangles = model.triangles().unwrap(); - triangles.iter().for_each(|triangle| { - triangle.test_isec(&ray); - }); +pub fn render(scenes: &Vec, + cl_args: &Args, + output_image: &Arc>) { + let render_scene: &Scene = &scenes[cl_args.scene_index]; + let render_camera: &Camera = &scenes[cl_args.scene_index].cameras[cl_args.camera_index]; + + //iterate over all pixels in the image + (0..cl_args.width).into_par_iter().for_each(|px| { + (0..cl_args.height).into_par_iter().for_each(|py| { + //construct all rays + let rays: Vec = construct_primary_rays( + render_camera, + (cl_args.width, cl_args.height), + (px, py), + ); + + //let the initial pixel color be white and opaque + let mut pixel_color: Rgba = Rgba([0, 0, 0, 255]); + + //cast each ray and get the output color + //TODO: in the end we will want to average the colors out here + rays.iter().for_each(|ray| { + pixel_color = raytrace(ray, render_scene); + }); + + //save pixel to output image + match output_image.lock() { + Ok(mut image) => { + image.put_pixel(px as u32, py as u32, pixel_color); } - _ => { panic!("Unable to render model in mode {:?}", model.mode()) } + Err(_) => { panic!("Unable to obtain lock on image!") } } }); }); +} + + +fn raytrace(ray: &Ray, scene: &Scene) -> Rgba { + let mut pixel_color: Rgba = Rgba([0, 0, 0, 255]); + + //test intersection with all models in the scene + //TODO: Improve, to avoid iterating all models + scene.models.iter().for_each(|model| { + //get all triangles in the model + let triangles = match model.mode() { + Mode::Triangles => { + //in triangle mode there will always be a triangle vector + model.triangles().unwrap() + } + _ => { panic!("Unable to render model in mode {:?}", model.mode()) } + }; + + //iterate all triangles in a model + triangles.iter().for_each(|triangle| { + match triangle.test_isec(&ray) { + //boilerplate implementation to set pixel to red if any intersection happened + None => {} + Some(point) => { + pixel_color.0 = [255, 255, 255, 255]; + return + } + }; + }); + }); + pixel_color } \ No newline at end of file