From 3f46e7dd82a67b0778beb1e669a0a02d191d30bb Mon Sep 17 00:00:00 2001 From: Brooke Vibber Date: Wed, 8 Apr 2026 20:43:13 -0700 Subject: [PATCH] Initial commit of 1992 raytracing code --- .gitignore | 1 + screenshots/.DS_Store | Bin 0 -> 6148 bytes screenshots/brion1.tga | Bin 0 -> 192018 bytes screenshots/brion10.tga | Bin 0 -> 192018 bytes screenshots/brion2.tga | Bin 0 -> 192018 bytes screenshots/brion4.tga | Bin 0 -> 192018 bytes screenshots/brion5.tga | Bin 0 -> 192018 bytes screenshots/brion6.tga | Bin 0 -> 192018 bytes screenshots/brion7.tga | Bin 0 -> 192018 bytes screenshots/brion8.tga | Bin 0 -> 192018 bytes screenshots/brion9.tga | Bin 0 -> 192018 bytes textures/earth2.pcx | Bin 0 -> 22981 bytes textures/mimas2.pcx | Bin 0 -> 20202 bytes textures/wood2.pcx | Bin 0 -> 38734 bytes turbo-pascal/ray.pas | 259 ++++++++++ turbo-pascal/ray10.pas | 271 +++++++++++ turbo-pascal/ray11.pas | 262 ++++++++++ turbo-pascal/ray12.pas | 291 +++++++++++ turbo-pascal/ray13.pas | 254 ++++++++++ turbo-pascal/ray2.pas | 204 ++++++++ turbo-pascal/ray3.pas | 205 ++++++++ turbo-pascal/ray4.pas | 269 +++++++++++ turbo-pascal/ray4b.pas | 268 +++++++++++ turbo-pascal/ray5.pas | 187 ++++++++ turbo-pascal/ray6.pas | 194 ++++++++ turbo-pascal/ray6b.pas | 194 ++++++++ turbo-pascal/ray6p.pas | 259 ++++++++++ turbo-pascal/ray7.pas | 265 +++++++++++ turbo-pascal/ray8.pas | 280 +++++++++++ turbo-pascal/ray9.pas | 451 ++++++++++++++++++ turbo-pascal/raypic.pas | 272 +++++++++++ turbo-pascal/rays.pas | 201 ++++++++ turbo-pascal/rayshade.pas | 535 +++++++++++++++++++++ turbo-pascal/rayt.pas | 203 ++++++++ turbo-pascal/rayt1.pas | 240 ++++++++++ turbo-pascal/rayt2.pas | 255 ++++++++++ turbo-pascal/rayt3.pas | 350 ++++++++++++++ turbo-pascal/rayt4.pas | 302 ++++++++++++ turbo-pascal/rayt5.pas | 413 ++++++++++++++++ turbo-pascal/raytr.pas | 980 ++++++++++++++++++++++++++++++++++++++ turbo-pascal/raytr2.pas | 183 +++++++ turbo-pascal/raytrace.pas | 435 +++++++++++++++++ 42 files changed, 8483 insertions(+) create mode 100644 .gitignore create mode 100644 screenshots/.DS_Store create mode 100644 screenshots/brion1.tga create mode 100644 screenshots/brion10.tga create mode 100644 screenshots/brion2.tga create mode 100644 screenshots/brion4.tga create mode 100644 screenshots/brion5.tga create mode 100644 screenshots/brion6.tga create mode 100644 screenshots/brion7.tga create mode 100644 screenshots/brion8.tga create mode 100644 screenshots/brion9.tga create mode 100644 textures/earth2.pcx create mode 100644 textures/mimas2.pcx create mode 100644 textures/wood2.pcx create mode 100644 turbo-pascal/ray.pas create mode 100644 turbo-pascal/ray10.pas create mode 100644 turbo-pascal/ray11.pas create mode 100644 turbo-pascal/ray12.pas create mode 100644 turbo-pascal/ray13.pas create mode 100644 turbo-pascal/ray2.pas create mode 100644 turbo-pascal/ray3.pas create mode 100644 turbo-pascal/ray4.pas create mode 100644 turbo-pascal/ray4b.pas create mode 100644 turbo-pascal/ray5.pas create mode 100644 turbo-pascal/ray6.pas create mode 100644 turbo-pascal/ray6b.pas create mode 100644 turbo-pascal/ray6p.pas create mode 100644 turbo-pascal/ray7.pas create mode 100644 turbo-pascal/ray8.pas create mode 100644 turbo-pascal/ray9.pas create mode 100644 turbo-pascal/raypic.pas create mode 100644 turbo-pascal/rays.pas create mode 100644 turbo-pascal/rayshade.pas create mode 100644 turbo-pascal/rayt.pas create mode 100644 turbo-pascal/rayt1.pas create mode 100644 turbo-pascal/rayt2.pas create mode 100644 turbo-pascal/rayt3.pas create mode 100644 turbo-pascal/rayt4.pas create mode 100644 turbo-pascal/rayt5.pas create mode 100644 turbo-pascal/raytr.pas create mode 100644 turbo-pascal/raytr2.pas create mode 100644 turbo-pascal/raytrace.pas diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/screenshots/.DS_Store b/screenshots/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0Hn(dd8^%$$22Jx&kpUP^d9f9DQLtE*j(@2mA1VbS~JLSkqd#rZK87s{u zk)Vv1PFrb?A)}2~&RAuNvL1p4F_u=uI`KQ}eBX{8asOpyRb>*yti8VVt-T}8UN_?0 z%<6gZ;=g^d{ki*Z{`JLw_wxPipSSn%Di6x%M2PJ%`R8Io;HI`yO-CHXZCa zbbe}cQ|!GH=B9Hxn3$B()aIsG8Yjb>wxhwsr<9JIuJzJ58D4vi(8Q#dj?7NgyX_ux z%5D|yIduMu=b1au@7shqV`$C9q?EpRp1A|%rcH(?-Ok9QnM_nlCk?-Nmix9heDeGG z4G(<~>^T%3{UIogli{J21rvu-`jm!c>b>E~B}umDQ23w9uqZ#@BG9hOTBT(WXl8(dxzx2Bum5IPG-v-_ue5hH=#Q09g?)n!LYZJ zbCaz0-U*Y96FhOq(!`;ZvTK4%*WPgAkfpu$!e`3_m#)chVv?naLzc2-g0p3UCk|Pf zIFwR$O>pVj8%`XuwAWtvY?pIlv*&Rl8gC-{uj(=O~MaXWLFzDwtole>D} z>g3%xv#OI;TH6!4J)zafg&p4ZC%^fh?ZQ6&%|E%vKK;VVt~j%R(y}-FV&yxqcYl&U zbFZYymOcE7x6*~5xyHTwQ}|ziRk?)xYCOTEYdD;=XKC15$kgxQ(y}+)YfpZ!xA57r zhfB+FxYt|wVQ(Qz%igeb4TpQZg&+17va}3`rDbn8>@DP8Z{bVVa9CP~!(n45hrNaD zT|=gH_2ICqlfAJsy{j|5t24c8$n?g}3>ypCyE;=^_J+N&Gkd+s_pZ*Qeu8^rXD02G zdRJ!<&p~hO%-q4%-qo2iKGO8Y&YZF8U7b1Ob8<Nh-39k08&V2Fd_avE5c7JlxJ^aZQqlxy`ko=eR-o_*k9ezePI{cwjeX;ri!`fA02Q z`Q3Z`D!`rsb(qhTy|T1^GLlb~-{KQf z%x})KZpiu6!)*ZhnBHgoOj+R&d|7tC1H&5y+4adF8-i4JJZypN`oi2iNq@Th`uWbX zhhYA_Y}f+%r8n;Yw`B-YImE**$YBd4vLQe=1j81{VGAU(AwV_+!xqS43na23KsE%! z7RV(s@dRA(Po3XiWQvC$4J04O5Fi_ZVGHE21rpg1AnRbLhwS=fkPSg9J07+`c6~C) zI!IZ^U7t+XCzHyKQ`vFX!|aAM!#j_5ujbEz^FGMy48<~?~7llt;JNmeOsLAy?o{>G^( z)x8q@s-J&G{q+Opvub2jLoiwDP!IXA#z~h-n0N3TjeVA6CNrk2V}3z&uCe zVSVvr0>uWyr7OC*J1|+dogb!eg1R(f^Wzrm4`9O zj7;KFO0q4DeV9{seO9ygkPoq5TK4uB?=v0jwTSOxm@i%23V|0ezdlcg zSx`&z!kElUmKFVB%gMP|L+U%ZF;DwLzC5yXxVKSLQ}CCT;TADqGkRX1JDIZ>7kvu$N<$tJhg(LU>3u)PJ^f_2?6s5~mBUZavNy#~ zdm*3as(#via*5&X*1g8reBa^XAq8lk@TF9`?660knXB|3wy@@|gn7^#_1?SjWc%H> z<*D?O_q3;);>%T+JMdID_U0MdH#3Yt?B{D#Aq9rw!l#dWv&*=*9Cq2N8y@mGJ7UON z!zcV1n@`fj!s-*JTYY0@*d>=VUS5 z+{&F~SnfPS1PQ1Xkeb9r#xOOB5fqS`#6`w1HHi@vkeb9r=3xpF55*!=llW(?zwhF& zyV|>V+m?g0vc1s=%t=*Kocc1IWw@2<9zXAzOqYf>DOQju3v)ZX*DKJy#M+tn(%(z` z#XN(b_+Gd1UgD>^=a=Z+ci(D1vvmdf_D-^h=cQ83US=_nGLQ4sVb`3*99daI408j3 z@B0&VsK>2<$BX4qJUtvbKZ#iWL-XM>_QX%JlHoG;ocC68uVvp$ytk5N^OtQ|hFvgc z)Xw%!W#P}4ydFGRUg0e`U&Sz2GAA)dR+zG+o&Sexdmr5JNB1Wd57!`axQt(?cz7#B z4)4bEiI>=V9}YJmRkk;q7N%=#HB_cJ9ePWzX0P>m&gn|;$?|PEG_VeVNk*p&2VV(eV)bVf07TCB8M3qil0OIWdYB02WAN^d$J6* zGbfBnY~56zK~}SL$PdMkWiH$-$m%T~=4JR~`Jya$;MaVYF8Rv6 zq@9*SW1VvcGDJLN4$0z~`d*q>t#zGDdkE! zxyR6DLAi+jbnrn@~@)~&>Jw+G9HRwnHU2IK;YW-?T}tGzwDa+XvUeqK7Pc0n#r z)h;mEONYEyUe*s;3~@{Sd5moWJONova|8xYBzyaANuHCN33VP_GEX+ixOil#w3}oC z^1p7ayo59B?;0^_vUe*^%DR=9KIwyHLo1W49Kf1WzLI(VSWSjm61FF#L7tfukX0I~0v;h-(zL!UJ6wK-3THwyn8sP{QO&CL zJenEar1;GGyG9Im0PtWL4hgzjR>5avLybxK01mN~o)^Quj57>A#jWtFGSR$b8B-@n zheMNWoXn1A>N|PJSb#|mhZxcz&zJzRN+VUkgJg*-#_WCa#{rrG=q-()7l;9)MiU<5P*m=r(>Kq&!LKvuz2U%z*DoFnp;k<60#OsH@w zC)J^edntJ(HNvbJ5R1QxsRAA>!y!R;%PRPcY^V`w6IajR(y}*{l|9pWk37jUm)BXk z%0y_+$c9U`!(M5~L-yHWie@;>sfSo3jR2+qPy$d&KoyWx@LFB+vVH?qjuax2nD~4` zC*ieovC3H-VF?^zov-(VH3PV`1XKZ81yco30#Hgo6_8ahRRARbr2;H42`*jmk_}5D zu`PmhPFY%=Wup}KCP_J zD5g*PU|F%k+=g6>WsvYizc=jqWa!!>3!i$G?pswmhub;B8^9Z6b+45CP!EZ+FvDRH zduXLFz!-7LuoWl*ccmZ=Q`|I5I@VuU5k@kV0W7%ZG($)9ugP!^6J1;0hAI@1!UEjQi3Ox6)VlcynrMNE<@bJ`#8g3A~B6g7JgnT)!w@|MOTW+ zBOA*sS)yf5c9|KvCc`WVy9LsKGll?407?m{00kfMtlO4tdNi zOXuz&jrFq#b7=`~FLSxQSp}bwb(OU~{{{FykICWtJGyc#=t3_7?tpNsYbN zOZC|T&RHt6bRW7(2|nFAdB|9RNe+h?(ttA#07?K#38(_1dI|5lB{xcn&je~=*FR=_ z-nixe&U0!*>robR&zUvQD4$D&*I%;jJ|jk#SvNKsfw&vHvaS)6CdLnz6)T(DEuH6B z)ofvCw;aMGDa>J?;+Eoca96hUYU#bNn1ywpz0#0}WC4dv5qRkK3GR1*838y0C?%i@ z*s9kj+WX5h&XH7hNDUxKM-p+#numL2$*=v3Iiz^cW#;lNczx9uzDAErOR!z$6Ue%i zn4HV_!Ln{8#%}3+2Is=k0mBp=l6&I9r%##GYwiNePKq%x*y}yy@##vKq8Sb?&czfg z0gYK=mM)MitKj0Z$uhi3hZE#T5*acG;~eGL8n>J8jQw%5%yWSmVg+MhejMR`joW43 z+>-~(xS0vMTUNnmWL+c14lW4;z+F>Xa)`LM7g;J(JmE{JboHudczuS<0>< zKPSsvxVbBTNXMrUV`h&g?kK{xI(*@zY9 z>e?eI<&PcVn@wJB2sa8)1RhcabQz@tPbf<(O_2)|_N0aEL)Mlh-0&GPhh*_geJ>qW zCCI}LdCuzGZLe#{&q*e=Y&hI2C7-i^aRX2SP)a}*px;@ou_e4phjW+tf^>Ft_8&Bv zJD1FC!pq+Q**OKwg%vFV=u;-_q0WN{b7=|kCKzWGd`8waVsHRFScZcD&Iu;Cl=g;p zRuw@qhh!0_UZwk1y^K8DgmaeWbJ1dujg;nOmldlV7I7(gB1psnxrUU@HBzQv#h37I ze`ln~kfSvvmxrvQBt}*LaaHGxo7*igzsav(qB~=y4by=sFl0IbkrH2D9=1#9*ErZw zqg!!S)^GmM?ZLAAjBrkHh~?nfvGR~c1al^3sVw}wRI0sKf^tZc$Ahcch~b>7&bxhn$DKSp^GtMkm*NU;oWV z&kgB!gHnPsvaS)6CdLnzrInp+m9}%NYPK-6TlUVGY)ob0&zH*7Y8)Pxaqb#Q0;RfF zf=_)X51AtH(4IpKNuxlnA$#W;HpbH z7coO8*Mgh(=gA}Z%pH5W8@t@+K4ZK8V_AMiZn2g5Gnm=2$}XxlFPc5_B%kJG(ms&| z{frV&H1Gl^OT!jOOb(eM@X+lOECG!IOb5tn`XDg4m0dHt{VmLui8yDh2$AALj)Z4v|TcnAz-j^|<_^ySvF`@<(pW`QCPT!%J-c$2R2F_-I;?uea`qH?o(rE*zK1a#9>+wWsK$nIXl1iHl&(c_LvClU@ zh_>IQ|1$HNA7aO1%11vOigYjfWDdz9PJNlqvzX*;GSA)cF`i6hz(mPI=0uPv3o{%R zF_QvviXz7Fq~=z3%`YJ($aC=SCPWSzF?5g#;}E1+7!8>fqd$9A;;)O}0$Wo2OUrNH z5B~I%=kv{y1RheIGecRD*=}dAfwM`@@CNVz@nFEbYf?Q^Vip1Pkb6uK42SM@Nf=<< zor?(qdJ&{m{^p9Pl465lF3_x1@@1g2{wQ~f;hMh-a4O*msl;IG%~(lEK#WTDm7uIp zYh!sUxPCOlyOH+_TyB?!lmK1xw6dJY7=KR?RV6U8_{zT^DF^F z%X~ITNDb_!^L4shL%|;A+E(T!dU+F!w_9;WlOJ?UYtu;Z=4HCmGzhDhCC!DhfEQ8==LFoERD=4Knajl@K(J>GP6*! zNePe{N%5LuQb|q~K;bfUHZ$o3OMml2BWIsumbA)l?g@7Qu-%G#%Wz20-LeWkBSWJu zVfUImgG!=c444KcRT z;0(YMKq z@(e!|L*^oJ8&*>}#CcH`5oa`cg_XNT>lB=>TPxiqHGY_g`hR|8bW66kcL$ zpEYp{F2k~(K08cz$iE2Y4gk1O38(_HYD_7?6UvwcpoxS%T_O9BRb|NzhfK;OE>><& zzUWKou$ltqGGH#iT#!{-%6f+UoGgoB7I$SeOP$YIgb@RZV5pIJl|5sANuNRH5o}O~ zJ$(c-m5>0c=^%0y3?4d@J2t#&_qnmx>4sL@{XdX-M#Nq)hE$8-sJgum&A?BFDrGhB;G^N5rc&4~kN~Vw;Od@6%C$7eFCk*{ z8)Pa=NyE7&tBF0AoiRbsR|4Y}8Yjc8^s~=zez<3_KHrov+&=o{hFCCXQkKfXpD(Gg z_h!3rIo!he!PRUWx^?o9u>j{B4lyKvUIX)aE`pE^^6U7JrfvUUm4zuo8UbA(CP{|b zVv>^e5*XyUkY%_jzvTBCioSE$Eo>DS0Z4%}d}%3Nc1TZSoF}C{4ZJ{U-zyDyNK6iy zBJeP;Xoy9olIh^F704=h70lw`AZ+`;=C{YhO7T84q&KY+qbZ~v3R&D-<(y(+_^s=@ z@wfwkyjNhV07?K#38(_H3Z@F61fV2f(#&}*B_`R0VG0h(J#pdFr%YNF<7&|)SxS5D z@CNCSr9&QZSHcv{aA>hhLo70@n8RZ$kX7(1xJIl*i3oWA6Ne7Afb7QBEkC|}tK<9i zF!=cPtq$Sg)avq47Le2JVH%^iZe#Al@Qw{{THaFQGyy-MEUoO%yntMP(M*PFceS@? zSI%;tPxIc@tGR~5YF|=mFAmoCt|31s%e8pO>{&g;rOW#48m?p{tB)#e{@C^dtmYQ*Fc9P521p#mS@ ze*E*hAK$;%@x!}!fB*17!%Kvf<+K$pwp7!652slFi?Z9rE`S>a$SRmBfD(XG0;+(l zf~f*10aOyUAi)He(%#U{sv=0{kSyZVvs#<`Y?5=9o-U#u^ztB9m$U!<`w!Cn z{lmK--Yq>pZuwP;S*Mqg=Pa%KO{UJ=vEfb2TWZ{`;>KPleXz{SU@hmvjA`dP)b1c_4WV5 z@AZ|KI2e%11di>NU&ZX*yC0OXCB+}~MR)s!^A_ZfAC@n_|Mo9`{rJxxet7@khYw4T z#eDza+mC;J`%(E_V}5-Qf4>CQ`E_`&5!Mr#6_&I%zJBz16O7|lT*YT(T_dKuJy?d7 z9Xvdbb1~T^9}iP-NbZRXpFW<&%g(d;JZH5#^eMV#;*h1iN#TcLNXyO)Q#r&U<>OMG zF$ZK7OjY^K2naJYAQ1*8dEl;K{f*R*%ad|V@%kYCczKd;`PEP%{rK+f$8X;)XJIAU zjKX_);I1iF%a3pW`fvZDw`E6IXFY;-Ebr3uS7;Wm)vgP!f#MDT;#OS6Q~_N^DZz8d z>~Cjb09Z`XOooVidv@h4sVw}wbXe_zT%M{vJZYXO4Fy@<>l*TNvdqOS?#k*JtS%e? zxq!4qkj|TU+3M?Vzn&QyWR`{f*j>*Kug-q{8t8TU-9LXH57TQxFUfUyKg44`wE#}t8wMeLzU0I(Pw0JH-rC7`;3>ob=K zBq(@$XI6^!z|H*TTl8Q5<=@`@`QuwsIRXC8>nAmD(RvgAe$DLn@8A8qerFx|Rgg(2 zYZKGR>;B|=^ClQmN^nNjHDc1l`0+AqZI!l(hcXFRfW>nLlawV{_)@xWwYSTmn{=6& zJlw_kzNMiavfG*|g5fZg!qy~7SC%X|En9Ye+5E}{(I}XgX9fAsKlrto=dYf^m)~W5 z`{VKm)_39ceYn0(XId3)((Nq&ef|2ZGcU}3`1;(JTGqd<{8XCqUV+P9)sPaPYo1Al zt!MNC_OPm1Vu;B}CS}=M`12(-_TJKN%^8^*^PtfnOJ#~I(KRQ#tT1KL91d}kIdxg; zePoyXdgpWAf^hSKEpkn+-=g2W|NFbY{8t?W`I2A7{Qdevz>icCN?Og3Ze->a-XGq+ z)meu$9+G+i7U?)M+}1ouoNh?DUBf$eQr4}8ZjY3?JwM7hX7QFWWNo>gJ&pOHG7a(U zKJJAFr01TdOfi(reM*(ti}R3&#N?1E0uOW91*d>nQiGvD5$wyZkKla3ZE?7XFt5=1 zp1bDvFaPKN_wKtN-u>tQ=knFq4@BixM~1H8%rbHQe*01^AiWL;+1OQyZKdV;$Vafg z_Ubb8CV>0hpp@W@tZRmoK2qj(uk8$$GG%*1X@=K3B=^LHXD%4#Ock91k?8zzMFa0%hu4ixt^{7Km&D3f@JqR|3WvKq&!Lz*=1raT|m|MoNVJ zEY3vxv8!*sQu_O^Q<)FY#IEX`QT33Lfs-qlKrU4ic~yj0m&2tc$eUoCRqz>E*NDLZ z@L-u8+%60#xD1&t+eLbac*rCAL~xFPEMZZCluaE*<=IEXi!QGbX)M8qWwG|HW&LxKc4TJG3{xqb z^U@ArA^@cXQ~_C4gfk%9qm5_W5+WUYSyS$^L}uNULzL1xt(-0Eycn-dX9GWo*Wpd> zxU>Yfm$~S(3O*z2nxWf+Wm=4Ty{a>~v@pztu^!tFHA!Y~;m?;m7gGbw56@@-MFwwh zzM746&B-n+jE9)yaEOznOTc`dvkFeZ$ZCm3NrzLc^DtQsS|&83Cp;f2w)9$TJ#%Sj zOj=owm#Y8Hm#Z`A*C?iFG<>kETMgYFEMv7^p?&7Kv@m30xfok@jrpN6#dvlf_re3x zb5CN$Xb;IKnJ8MpvLnp>Vo}LCo^32eI zO$P@SMgm8*C08#7_4CptaA^s)OS|f`3O*z2n&G4mlX)fXy)VvXq=S4|3|D$crdx^& zUrN2&1w)NwK2$9SCBR&eRayiNdBj}_Q#8Y&#V!poZUB4$loC({WEK26{_CWY8pW#Q zt7LhYM>M2Tz}dGRfl1FIQp2)ED=<`N|$T(ahDI*%oulxV@kB}EmDfzD2Du0ePuub((;25@N!r~cIW8>>)$7KSOvB$*l$0Hp*}0a*o81+1m|TDv9dh9|`aIulhtVc`uF*r895*I2P0 z0BZ(NN<%aQ~_B9Qw2~m5Dz$si)?QwTa`GN7ly`MfUAg$NoncTE*NS& z3+J59m=d69-~~>WhAoho95O}VVJ>@!@y{w&0!8qovO(hZpPP%AYNYZ?Qf*nTSCJQ( zH!3f-Yle5@!LpnS+}$W8n9E$X{=QgUn5TnC7J%T8Ot%ylzLa{k3x*oW@{pz+Sv8&u zvYNez{7?+(_A|p&4sotT7*9YEqzM{<2g~$#OqsjH8PW`Ii|3xhaygG!*r~gbHv!xy zr3C02F;oE$kh#~5U_j1NG?Ss)UG44Jm9wO>@bl7PwF~TD&XSd*2sE4vvYNez{7?+( z_A(S{CaXjI)%P!6ethAxfDX%Wz*&G&f)wPWsX6I(YjsUx32(`7k8lWXQc#xU;q9c0 zzRSAiX=QyzF@4he%HG|*@bUij0(7>6ojYbyCQ2pMyml5z%TShNwz~@xgS0A*y|)XB z8^dDT8;gKOgRJhAk{{|JQ5I%6w3v_zl-N>omMtixOfXNtN&r~}Qw2~0P)e{>uP@m7 zTsGbUezU?fG2X21E$dcdy4!ykA{M~BXP8_$ zjY;No7GP_TU8S-2c0qAtSZsS^5zuIm)ib4`9ukMblwrvr!vw;6LqCx%;LH>TtOQU5 z=Vdq~=x$jBpOJNq7#sjyMk&D)%DUB=g^|;eRubxv=Fm*?s`{{rFVO4ZVp-n37>Q{t zmy`VYQm!o>SQVgno@`9d?l7rlDc1ns$vNZP<-;_SXntkB{`yB9uU~)9(X)K_>W9nm z`bUGyE4P=&N&qZ70aZX&_pBs-LRq&G!+HQ+Mk&D)%DUBLVWf}f^@OfWe5$Y4&-v?X zRNZ0+C)Z~)I_Cmdo-d!_L^DyUG<4`K>F;XkwGSo0!y0o{-MLhmt1M~ALt?VW$LtZP2~ z!ia6g4ZP+~fmKd>Y|UIFoLz|tuYh@9c=>d=KY3f`q^d)4;rm_9E@LJF3^hZN7K1}g z3MRc-8n!@oC5$w@;*!?=2s@s4cOP|Rc#~I8mA)8CYXNn&DN+!_)}tDeNFG5q5b0@b^0%uYX)3oRVt4>#sk4t=EgYkKf$=+t+{i+n-*2{QC8Bh}ZGz&2j{O`_=35 z&mU$?E37XuphOKvrEQ0Q!>_hN$Ac`hHI!T@T&T1 zJ0sf`G@+-X#ze2x${r6X||NZWb-sgT?*26jtSS_FkG^CW^KC&gMZ|;8h$5%Qlm|EQO zz5SbS40P5D1ZVLcUbDO*uh18ZZK2S9Sds zm@oMH2rfS&JZU-Sr^9N8>z|XV(r$phmvU0eN^cinlD6Q(_9CFsU{cKzU2_uIFtbB) z4RVIGV{HP5)WCwosxnm7$MO{Z`s4Bl)*R&E+aQz8l2fOWU|KdjqY-d;^@tNtgx~z*-6zVUoHzv&(6JaoS|SW@K(E~t;Xl1vBdh?Gr!cDpa3KIn38=1M z`NsN(OKcThy#VV)m$)g0L+rq+00CC|t83uBRI3EkB}G&fSp-YQ=Ay39dy3=b=I5Z;k!J76=6Mv zwL-0#^#k%kj4379WS8GH`77$HYix<6F2LAf%sejFwpJ0ls-a76p~}zzD+!kTD!e{c zeBF?_Z1A@JnM@kO%RBSsN9@;n1S@O00AdIhAgYPUwMg?~1RPsqogel59bO=$KwkJ6 zzO<-4yLz}1GsML@n8Nr!ah5s5(^lc zw}}{JOVz)T)>#qO!BaTbZ=9DryjPpdFUiU;*>S8gT*eMy^15IReJmG09rpZMUwFA) z^XoW&wLXjcHHtZNnSRW@(@Vhih4=ffdF(p2KKC&C+FV^OZ#^u76wqO%1c2SI!1>rs zoR`DJ<^|44SBLsuk_@+DwF`=@w3n)v(KWfeK1Eiu_mCfoMV9>b*ov{{PE+RIa@NlZ|JCrTKgEl*|6VCCK{zkjxCr#06MnV)UC$-9>vvBFN@t?F?#<;f znk2&#J-4fB0dDTalXeS+Q>e5oY|HPGXr;Ja!trGi-oGuc&42v&Kl*o8e(dT@Dl?mo zq0SDet|u9%6}_t-TJJ{T>u;g^@2vb~{Au%BKJ;?C?p2kzw0nrjyt*fYHz+1qJyRO$ zAqnp=wj@`w6+3Ht8RSXo%vzSD_%gIINp%t7yMOu{Z_#=#FF!`|lDP^%R2_%w`Q;^X zj$WpcaH(YM(2-CLeNY_^P1;|$+hV8^GJ)%}c#W`z=P#2d;PT|vKT!RD|7V9+$?`$y zGJ}wp3tN}&U@o_5&GJw~3BY?hE4g{8Ce%)`KA`?#btYx1#>aYXch{s;8jELdx0U(5 z>KT)C5Y83$_N-K?+M4yp)=#CI*hKOamiwl{ZNT^ckxQ#zZbr| zMf)#>xvqXI;$GE6tiPes#?+?P3IN7B!Z9Tbx7d)5J1-T+$F;K*RbV z&IsoxXq-1;4agE+-NnDl>+b*fx8?b($8J7(6*tFo^a)%a!9<=cTkm$0sS&!X$sEl=K! zarzuLofD8y149`L?(k~>~IlM1DABB9kH0KW@GjW>#!2u zZk%u48NB%QN6^hq_6O(7-@>xIFt1PEyC3eBL&Lu<-+7%%r!28c$!l?rr%4aZxKWHs z%Qb8O<@Nn}`(bkMAkIrDpCkKIfGsL;hA%Cp%MR&joX$hdq2SC!#Uz)Jr9-}pZ!^Mk z_VVy`mG|fN%V*;0ND|w1w_elAP{2w9xBE=#`rL03zAn!flGl6p_Ok!A^JDWHlRJlq z$aLUviFekDVBNpV8@P`$G?|UK(UL$)33N8ePn#?7wY*&aTiU!>U%vDEZh2?+@jw0F z|C@jROoE(2hwifIbuuxOGNIDs&@wB1w!mjIH}B79BJ2xcEB5OuA1=zmt8r2~tad^7 zA8JIFqbx(ixge|Ad&qZj$*-SoJ`>()ew|sTj|}#Z5^a@wc+p>;xhx~s;AODjxJ%>5 z?)LCi)d6u{gbkdXf;E(Y+zI#)?~>d55T)m`gJn9W3D^^1dyTDE9_#l7UU!AA-AQ@3 zyecox+~uA5&8xrtNl#wFYYkDo+y$@i_7$3JN`u~{h9(QY+>Z5)`ZAr?lkd#iyTJ|V zHG7w`6^EO4NX93AxfPfgWS8)~+68A!hMI15ekFU0Og`P|d`b=I(5WxX_b$N6;yd=>HPQEPKr~LQA#Wg(OVY19wL3@uvD|;i4fQjhm37m%uRS%zkdGQ;&=b_yJh!o4_|@h z+wSu4UH;j|CA_Xic%2}pvYdULdXhSi8XD)&Bqg_4pz~!?@_QKJvZdLa>`Vbjfj$0w z$qwmhoX&fiGRvNJu>5v`GqIT8_=fa37a_MDZYevjl#02iLHAz96WYC z`!?hChfJ<;#qa*ppWgmv`zKYm`+Rx+dhc3AQ_RzF1xlRXdkq}JjAZ7N>axo1_s87cv#bGe*F4Os`!Iz-sqU4AJfuuYP6N2tSi&r z6q$h{j1Cu#*5HuC!*G zBg61Ix#V}%Ys)*Q0)FiJ?2wiSr_$K@9i)=E3ecotlKkp>J$9GyuEDH(9ulx_dq437XrshDI=t*5zb-C5)U=*wZ8?+g?N!Vv+NGGsv^9+ND~c`;((Y>QVgXH5KMs6 z>X3?LC}5H^rJKNd7G`GwW|C(U3b12`$rx|!DI~yV!CV6H@(99{;RJqZ_eKNoD0}CyaVDSIx>#W zx-plRWF4-WNq!I8M^(3XnHeTUFW$2=Y5ftzvI}7N>gD^dzj~`*XE`H|BzY;oRfo$Z znDzHs&hPr+Twkr7P(NoKTPK?2dU$#G+MF|Uu@W&pJT;r}UfWe&d-_t6j42GV(YOfq zWZi10>~3YoBFJi%4*3*25e^Gy=V%Md^@VoJl%KO1Skh{+rs49>s4P=#Rk}Rx(_fyf zff=`nYSK6Hhu?p*#XDYSWjEe zo9l5E4V!SdU5BJvk{8Cr;9k|fI&C>yi{+9rfY6_t<6gZ$TzR+I>!<&t%O* zSB2rl6uj==N=l=yG|5KuKBK%wbz9_3qSv%uelF!@uD{4Czsq{@XT4az`Re`GFTQR6 zEcqzHB-F7b!bIBu*)_io=i!Xnv$!)-Yv)snn0CcRXuX9PoyXUvJfWif{{(r8fH zvzjINA?c9j+2JLy1`JoF@<>jV&~>*idp3EKX8eS``>mcB@3p-+3y8eF9?P8RUcX;s z`auz1@~cComme=r-ru%|FV7}}X%L*dOy9El^}lN%Sqj%sATq_)LzaNs1ZRO1*#9P& z^Tn&mWjfTamDKeqyvF3^U;gy+{Wqe1uT+2drbc*+(%rYZsmr0?AaEAxH({r8xgFah zI2lMkrd7Ir2lq3Vv%xlLmGx~2BQV^ng_mZprIaj7PvdOg)6jKBTr~6!r<+u>gy)dV zRwitrjc!gs&fp0JT$KYVrm-JiZ&KB@I7 zJbrU#R~t;jt4EsyRl=n-5w1*}Q?_pB%YV3J#_jIX89`zu8qQ_q@~Azt?9@cd^(|UY z-VbjSVdZ!45q$UOmxNa@F@zV)TQ~6(;Bb(2cDjAOeyb(9%B=7tzbf@@2_rDvs}sJI z)Shm}>1ljML)RJcp(X`5_r+vs*aG>W{N~$i#U=hOHH@_5*?ETH@@ z4`PQ`OM3P0@`PC5pI`pdcREB~{=&!)U+?GK)i9lGiB@(vyh90~fk|lq9ou0jn0qqy zLy}8)eVMPnTJG;`{kMI@GcK#y+!}|`Y$?^T;*3$^<#JW60%_j*+W&Y&q_Z% z$)i&_JX@3JFZor=b**S;_s=@4j2Y zyB?SP%Hj3$wO0{du2+xUb+vDQ`}Oh{MhdU?t+%ev?B^EJ-E^FI1S^0_SqZgscapRN z=~kBwb$03cC08rI&*HC-Y~O)3!f#)HwY)GZusXh7?y-WLuh7fGcg?SptIX!1*!nPe z`~W4znc2i=@_V>Z%bwrUYlmd1boFW%tb44Qq^AXW&Z==%hlWLv4p}_eEXYM z-@W+5hZo(}Dw`BG~`=1y(P|B1e=9CFLWmFRw>zpJ}HJSc)!_cLhA1@EOgiDau zZ^62!FFq_UuD|*2)ysc={kuQETEe^i7VGu5zgKww_y6mEeDl|rZ~pSTCClr#;N_vb zK9?_G9V)`(zm_7i2{N;ZGr#8PV*3p@>X3BH$&zGD(Hm`21bZ@OJfrU#+J}>7HG2!`Z4)ba+_u`|`Cuh0F2XZ(b?COL*Dm9pvM< zV=+mt?Zi-l684#t8JMJMfPPrT7JwdRa3Nk^S!b>}ak>08!r#66&5Q3}_;~s4UC-|l z-uFw8Zw}|zBys-p`WCI+`5<})lwf)Y>0Y0+k?l9!s6$dM$qQp*aIb1_ADX0RnQl*C zWa-c+&FZ9)QrF)rzlbOKb&E8wC5ImwR2nB@Fw`7PFm*T3Zv zd@Y^Q#kybegE6L_rLw)`+rc11#Tj|J%Y#4%NQCvpKA@4dnl}j^1C(B3bixKdHr^*urEIWWaXA&ax=Ch_Y>roEj^4$ zscM)z-}sECbe(BA)TChIpQT|7WX6#EI<_hq`0RY)Oxz0Kz1K>rGzvfpBwt$eKQi$j zUS0Cb4)@;Hxqve}KfA(EDI=!>gbv_5A}jf|EYnIOaklMs%`y9x^cCIrLbxdZUD7}P z=7pmdQGKxn_Hs7gtMG`$kYB2Rl!^S3-(_RRTfK4F-bIkrEFJQQC;5$s;PODkQ=u!R zVICoi*h8uS?Yg)1c=r#lmtR|zhc7#p6r9=fh-nwt8Z&W@Cy7>xDnTZ#0L$nC(7WW6 z8Mk?_Zvx58v8pM+Q;%Rp_z%DBxA7*?1W?)R2h|c!^F=QbSt&WrlkdN5CjoY&0DO|k z7kw!mR=dCxG4CEI>*@0jor_yB$!eAkdBmAtqLd)5z$rM7)h_XS{j44xExa$@zPN-} z`Sp%v>jJ!cUERZo6R_>qUI#P7NB{w<3ZEPjTbyfny=I?t82x#n+?v;{H zH}n7H#S0((DLDyd7vrYtGgw?{eNMD=uU zuI$YSY`@DQdJ1OZ406Y*1Yg7J_1{i+eW`#St}V%q#XzpF(7XB7r^6@J!IOS=HT!)! zwqovENP#{6e8~>!X`Ie`n%-6B-D@o7#pirA8|gAR`J_}DzI~Z|j>i4zmTjqrZ@xUU z&jD=R+{OhLv0KV{Yw^RB0G0@gFUdVrUZ1>WMy(3Q0LCE6J9ayl!>>NeDBKC$bKnq4DkA zi?_dD^UJRG9@aTGGaER`J!~si^9(QY<@G<{&1~jN@(}l=t9@B22TS#IoD1;6I=RQA zv_P-W-@MS>nK`Rh1@hO)5Q8@6n{*gv%p1H$40N%=Rwgvd`_n`PPuM3X})y;gH@Xp0~F3 zTFUH2U)JyY&<)LV*28!G(YJhXM>l!*!+mh$VKf{FucH|bXe^IyQTjGm#K%n zT~iE;Agft2|4iw7ba(woGT;vGvwnvU%cGe_ko}zU@1ieV!#@_} z^8KXad9=Gendj@3^E%Nbym}SX;m!FZo1A@)n;85>!WT>Yw?BXITf-}{AGn1L$ z*q`t-jj5OXuHWOXk6`a%_Nur2$&F1$Xva+@tcKM>rWL(7l&X7i7*-*RiMqrjxrg!h z!*{)J*GT>xKJM#kbE6IelKX!i4JnI2!)zb=yJgsWvb{`E)-bQ;W@gjw?ds$aC+LD+mBup80ErK)HcVT0aoz)-#nm}x4gAC_`PIkwsXn!F3?Dgr z?*IAbFI5e**Z7P^%3-hh;_!ee(t-B*T~c-aRY=vj!z0@d7Z9^wUY`9l;Vj^t%#J;? zy?a1t??7VoWiAhUwY1QM5+t3Soqv3B^KZJ~=k3qEdD!H+ z^LxZfwF~5PMq?S1COFf6s3`*ZbD#IX{QmEC!OzNJ! z{7Ja7WL(-k>@qPb?eWE=%Zi{|r66B!hxj%cgWEFfO7giKa;_C$qRNK!7WL2%n!b%Q zBZ;N7IDrLu#xP0Y`H(KA7`E6XH3c&)AR9Y&RDE0W7KvGhgSXlFN7+7z>M(Ct^%FSc z<}caFQcsOjSu{hLmBrk{-rgO$rdV0<3GUV5=k+`v+4X6gnN6(y>0PP~?>*nQx0obR zk`Y%^LrapW&lWHMB|s$~Vv;PFp#g>lNeXlAx&!`cmUqUt&{%l%OPH5Zgp+) zvgb>cfLNCLEKxn#jvk;!A54)YZ~?3#=hZc4TFEJQCaYiXKMEiEiQGI}A8+z_hx?{x zn7(e3vR*C0^zcxYg2M|x{GRgouPSF8w9dnoOt0mdP@$9*mr^T(SUI!G|xAxo8L z^kh*2oY6>(jK&010a-PsWMJ~}S|m8UCqFBbYlOXr^X&bsE$xGnd7ZtR6BU~c>NM#*j`6tsK)bG8q*cJt6J z3YW76$mo?)x}_C7^QtP$M4ro}c+2e2&+g(Jg3FyheS2r0)RUNevRzjqqald{oY6>( zjK&010a-PsBye~e55sci9%`1)%I9`5H`(-d^(NG%{T;P5NV znXmu$e=4g_=yMI-wv(?+W+!o1im{-VoRmGj<>)&5UgO?GtRa^=5wA;n@dv4dQi~tV7UZ&C? zjBSDkPhk_x1KezkU&IG@b49t;&s<&V_b{;%AZviEf~gw7Cny>XUENzo@@FpX6DLl~ zJF}|1iV1$S)lHlghls!~c8cf9Vbaex&dpuDUG47n_T78*jk@}OhE`{mB+X{-cIhd7rr+RnbNg49QJl{uf6cSambXez2UI8lY8xj z?~OyIbnOi%*(BgY&2Z9AKH>Lwn?J4L=j^8I{hXKgv}^lvvBUe>12tsIBRG?5oPwdl zkQ^?llf&Ll_QpM?_YRr8_QDT)hh%Bo8xDIrx!2zL-aBM^J|Bzy0W8TNK^ z*gGV9?~obxc5>J|Bzy0W8TNK^*xSiWXwNT?;NCc7`ZD&IVS6X{+B@HShfHrAGQ-{> zIc)Fbuy;uI-XSyW9g@TLP7ZsAWbYj^!`>k|Z13c-cS!c$Av5gl>ZNB z_D(v*!~Ayf9y44(C->Sr-+PBlZ`@;s?L%_Uq42}rAz2#thQr<=x#!UNVS6Wg;~vv{ z_n1A0!tb?rzBKL)d*dFn=g|2*hr;*9J*G774fonRU-G;6-MRDKYLDr?d(56g;rH4* zUm7RF-n++4OtQ4s-udjB74kXe{o;A%4wMgK zGCbpkX5v#yv>bxcI2j&VA()ty5-o?IG){(xRtP30r9{giD2)#r9?p`2^HXHk9RIYQ znti^!tp2o1&6OPDpUYCuuk+XWNzFg#y)W9GpZjFB_fD8>oa2c}FU_s8+I#ny>^j7I zCY?XDLeP6B3|)s{Vp2+nRw*dGlVNtv@x-K;=2ltly%Q!I=XhdLN^_rKwK&X&Lx&+b z_bJt(!;mbE^Wo58NX~sqb?7i8OXGYvbQqFzpHdw<49U_s9}XRc-PIsRri^mp1GGx@ICiA^XuRBa_#P!sqgzv)v2m;T4ZTSUu~CqRMu{u z{;TreiUlebs92z4frTVmrIu`^f>8CIccVJy-K>yl9M@ROSh|~+cnai<67x)o%Fa~ zdfp(XaNH=T-Xy2qEWK{gqxavW_pQ?BHtBP_^yRoi`rRr0=16~zxia7`8F04@yho4I z?v+9J$)I_1I>-HT#shN3gEIIbiR1sWg-WO0t-yZKw_&yo)iKAZkx zADB% zVLtpv1!w_9pbON2Mo%`gkEjxDqEMGAnnk%y zwyt^0y^yzQQ4Yurw8Shm91+wm2FP5Il&f*B`4AnZC?6=T>9g$bCkT7jtr^56KQ93 zT~Kt8bE%fi4h1cj6|xP3Zdfe*+l1a}2|r;eT+QlN#XC<~o#+?wX7!6B3;M;uA>Lc1 zm+3bVujv=@qAYchLBHk1+q6w0)h1h};w_Od=QQKkDml8D7cNK`{bnUxqYEzh-@9aB zR=@6o8N1y7nhVbAci3Yx>~R_XgbaUDMsWOHMn3g_gY3B<3#2NmT=llW;kvKM$u{u0 z*vZcLF5}=*fv8e43d)Q0C%M#)%YKrg<6m;w;vB_y^S98S#Y05)gB2+{$T^K13a&Z* z?n&TLEM$*T+<=KYE>|i=;@;T>4WdU?Zi#psx6Y_I=Y}6GfW~_9(jG zf-@m>LBAn{PW9^{^aAxe@@X0Mj2@$(mC?`1nCJBv`+|&pamfIE_6Ks#hkBg*k&-7U zcUp=s2s!VLZ5Yg{7@PaB=|F&pLjy)jMAUEw<~W7m5{z)>-rsS`W<8XRq?(c<6e|;FUk0q^_cLA zOn6l$zNW{d*JaWhGWktC&U{PGd|Qtx@5q#QamBx-==ephShS<~K7MokSv)=z`FB%v zPR`Y8IpdTILiTBLsXNZ7ILwO^728;<5;he(SfJ+cfg@;wDabm+VC|rTJ{)i|zzVqG zB!Mk(#>t}+HvPgYBwUkz37#L3!4^NOetq&A{BIC%R=?FaUm|Bzvkr%g$dy}zc+IyK z#muJMniFG*7tX}eiHg&=OWvK&U@C60y>PVT*ufH6p2f<{f`fi_3Y><}A%%ryf(u?m z{UY9=U&I^qi+D}HwH2=g%mugW`Iau z%_3bQ|5t^ak+7%;x+$U5O3;y zRlM({p4XjkSM!emRY?gOCfMwY%f2ic?=4BI+RuQZ>|WR)Rxe!Y zg7Lqv%J{5)LkL}+|0Vrm^WUL1|1Bi1$_3Awc{b0>%y-?L657Lm7eb<3B%He4C8E3k z<(u%mTJ4-3yHw+X(-d@Y!6AR;`t|v5A%4#2x8QuU!E<%a7x9{YvvXdbbE)U8PP`@a z+*0Kx8J?_ii@j|jKrPX1k%DTJ>Q%8UsiV5lpj6a_v86=INgz=y$lAOw|6i|2q^4sj ziI$b9jzlX;w329AzI+I6`DYRfqb!9*wqfD)o6dZbX|FloM7)->DoR+Tb6$4=?s=1# zITdf>cC+(b%ftrd7OFh1T=P@a$u_6iQZ?0}(^;`B&QZgiOFu@=K_^t_E~UI2whA4TJp;CSGnYK>U?3TauvqH zTi9D8z5lDFT=Q2;{%^5-pzg{;FF4OWMjZ zSEXqyb-p2I73xH3ZMP_F4&wD0Tq@q8d2XrC%__Ip+ZJS75)7Bhs%DYSj%8twnr~S8 z0djKAYPqbCgF6l?4!$@<)T-i46G*o4ql_1>ZX%pZWD!E!aJ^vtTJn?pRU!YJO+FJm zQ#pDZ9x5B*B+P`L3!`5r`G2E|Yb9RBu4?tWs@iSc#?b~XqN)v|%{NU-z{wPt`ccLO z=jXq<)m%IACiC1)Z^}Bj z2Ln~Vt1gay(ZYY-YZ3Lkiu>QXQR7vk=IFOcv_Z?LYQt#r&7wA2McZy4?a;QG5ZdcU znf!Ahe^s4+iJUXRv(J2!-YN^*lE~TWL`A9QV$WNMnLTxriZ|q@l0>fMf)bxwtlX?X za`Gvwxa#D&n13((Ub)Yc{is~FfKEA0V&c)KH7cR_&&Ft!h(|*e& zinbU@CF~Vp3!#gqz}4tCmwztQe?#&2Y1pM4gK6*$*1YcA9tZ1O}9x5*ng`UPB zUZ<|R-C8I&CzG6%suSilu`K>k-OY2KA@>P`kZV?PNLFh&T_WKmkWMpNUWUs@(ODOq zmXj8sU(Y|MC8UYj`q9hUD&WQ6Oyw6wDX(DHwmX#Qcdd$kt98dAey(dHoBH2nqqXtB z4Wj02MXj1f8?GB|vQgA}^JuHBqwRJy{q7n4sa>>Z`{*wRBwbiK3(l30ibLp7{4LCX zGx2lMu))Bd)30Swv^q)f92%>#&NqnH^}8_Q4gAmQA}5(rW!0?KYh$U+QS(ho-!%8B zvL85ni=g6CM_gXQX-3N>oQCYvRCd8JmLVMd)HvgPS)haq87-S=cobd61&3TT zBc~0aMfxp{pOX?22@T6Xhc2w#Dfm`fU|$x^c8c>uBq3qV0EzcHS-8b+2gmeWE{ijQ)C1wD)1rzDLwb!sT7C z#n0LNb7B6QiJ!~pH&ly4!nxS_hB3BQ4fiR1)9gpe ze$?>!!#64~VH?W4c9xBz3+d=kQS#M@8T}^nUz-Al`EL?Dr~WrL`7L$6)roiCBa}a| z2rj`Wcm=!Q7)*n2ux`Uv>Om6y)~op65Ka_+Db?@l#LxAjCaal#n?)O;->PVfEuyWr zjke!8+WAk>AO8~VzHhYG{!zPwqkRsK_Ujbw+esxn*48rMg|){u+ePUu(8XCShU?Jz z92P973%2}oQRTNde$M(|O~Md4mkXX%znN)oAamG%!sNHe`C9+8w?GHy8)m*q zqU$oZ&QM*HMzES(5qWz9c%1McYLoV7EGGr53Vf{j;e==7B zE^@)?GW^5^Q~9;zmFBNto#|I4Oh8!bf9X>8M&(Sl*?Asl&o4m^S&d}nQ!1_n>X8$! zFFtB>N$DG9KSuWBh0mP*BL3A1`t@#1@4!sgM3nm9!uMxK32jZ^7Z#px^qUmJx!Q2EO-#R9Jc@SFf1X#36pkt`|pU%ZdHq3ZP;gupLBAX(LvYN|RV<^)^wKdZY*>Dy&LO!$P^j~ygj zR=+j)-^BS^UuBZNVtBORxsbea=bKr`fPO>eH$=`07H_^)QpF2%;7>9IZm+z8U2trh z?Uiq^PW9Vdc?cWfB+P`Lu(XoD3M$U}-y;1sj9N5O>utP#wArT7mTj~!w_{sP@@w+B zgHBuaIZQ{<4o62FI_t8pTwin{owXn@T%X?~POkDBBIh7pZ=0m;xhCF9tc-$JUP4Mrz@}dqh<;&XS^o=rgD0x-m;bl*qnv(M zP2=aFUu~YW<|_(wUOXaIsL3lPznydl-T&CA zq;0pWTp(T63;z}*j2>$iZ1}%rmCGOhZ^T=J=k>5TEf@vQtKv;p3zp3`7wWv34oP#n zwzr1viUVhqIq(M-=@gh07Aa^iA?=v9aBL9e^b0?;@pDDL<@H-XYPx#V@(maS9@%N*#j$!^dQy0emfIZ{U) z`Z_`^9hy2qI%~mm;cP9bc7b&8U%{hg-CWlF<;2B5tCQg({Jr$%*|*Mqr0_YzCwI@g z=wWj;bKZQl=tJ8h#g;0BrM`%_kZOKSm-m7%)rV|{RkATox-cPGRrDB~QRcuOLTIMI zn!+Lly_a%KOTb$vEtD`29>T_`zRrIu`ptzIrTSfCd9{`6R~IjAXw6q%{I%i{sX}V* zOj}4nFoYg(0zf1iSNfKB*~Lo0S0gczP6rhiIpVaPvSvq| zOGk&8GiV{GBP*G#l=!_=Ym27kviHfoSN3Cs&lWyy`25+JneV7!b1var95Z{h$X5=A zY;z%Iww2fU39l))tlKT*nRCkZ#^zMHup(KE|0rxx@xmPV1B>7ijPew;mXN%KV{>bP z&gd6rR`gpN{Wfy_viPW_HBWl;#?G4F_vEuCuMXD~1f%GICvp@o9L_B{EZ#3GmzvIo z(@BqXX=y2|VwN_Pwq|`}TOxZ=DLW%xq@q$#3cq9(loMBVS}rTh8va;%+w7ZWKTJ-! z1)p1+Qc=2oKct$2a&t{qdF6gkSfQ^wsHA&qgx*NpZnnG|x|%g$4m(NuHX5p2-vHKW zqx^wIa7j~Go`T-pO2FQNwUIKgWn=XwaI&J`oOt;s{&zX+CiVOk;~Q3Lv~tvJ4O={D z`qk#EZIj~fZtbE!lYF-16_Xc+(1W^gB>Uj$#=Pk!(jHOQ;ETsIFV5t(Jfg-IFOG`6 zI_xXss`JJ41AA(#=G3%{B`cq-toXfDcZ>X&+?}&;8Z^rTjB+#U5t5a>IiH*Eev|B;q5IA`ZInMc1@;tHhX{6g30PY=XrVOy>Jq{=l#@CA z!rRLHwEc<(@9&>-mo}B$XNY#HST?SZ`l0vp&F>khwIW%L~7DK_?=Hg^*MXPyP z*-{Ab9%gJ#rJhMmlAbC}EEm;t7wB+xcuyW{qI;@4ZInN-2rg*~>i}gJ9Me_6)`CR~ zB}*7e^$S-k`px-YY{KS3=y%OJy4?_)9PtZ~H zupZH&-J@k}63yNSG?{ZbJ*#B?iGNi4>9xD>o1YyQ#nlU$sjg1Qq+h6gq_@^o~jf4x+*fe{rYR%@5vw|%SkD2V3 zakaS~s^XNgZ=DfVA7tx6dD)Visxhma)`Rr--H~Fr}t4sjRq?0*ai2&l@4*GBaCcuZBe&Gzvfj_W_J7@~aQqb^3 zOTgB`;Vsa}6;w4thgS^4`XD;{;w1z#i_sN5Yy z@Z3E*{1iP3{&zXuZH%5b*Kg6arhSdQk5b5(_z*kM`@y*FLe}zeCey{N%6G}j&XLQe ztZ5`D>SnY-Al z|EV3wmSxJ`#BZxVGdfMAT5gxfykN6SbaR?5w?)+g`lgEKwrSI&q7$AbMh!PbP|@@< zZYTr67B~a?iGCX?D`>z7{?};(e_#<@(iGOg+67I4GF%Jy@F4IIHmZJCP<~eQyI}pU zs*5gJy5-H!G{aC**Wxe5qmG&?1T3BWc2&=NL@zyDzhuC`h~38MnIZGQ_^H=g;h669 zLg9(RF^wO`YwW~N(BJ3qOa(cU?DFRx=Camh^If@yE}H5~d%B7i8vCP2EwI$(#_4te z_^*PG&hFcjmA2)?G-^%zMhY@V>3+Bj!_V;d>@U9R)_+h zpw{9R$7D~r(q5@_RvX%-D7*7mqHM=hW>1@Jqq02*FntI@sNNFpf?7ZjG;zV938X&4!{KX04v}I4DtBcX#;;?5%+;no`UuglD2Trg5^sXYzZ*(ujn_cT>rgH{Jesi zTJ>v-k7#~oKa)g*d#A}~l2o;~pj`7YZ=ULP4*otAC)+Wfv-9%E-7{SXpgdG8#0tm1C0mV3ymQS@VscRzZ|S4D zc4?;zlYLID?ZIi5EKz!@cNJX?ho2UH+I{?PdS~Qm3e~~HpZe!I&1}}H3->~OHeE-M zRjcQXa~{^yP(@C*Xv<|wAmeA#UW=gFba;R$SU+Q1)J#5mw7EZ7CdT>G#N?!iF(NJYP;p0_&x%SQLQ`4tJ|b&}?1ZN8#; zgW@m6qXTv9C3XTk@`sF~NA=UApx-*W+M1j{u{ZW-F9j_;WfRv{cv9%Q>e%Z=e4yWb zAL(lkOw>Bm+)N!R^PI%N{+w}tLR0FR!<4xo=j!&BPusmT4;E5kChA%~(^hk~E^vDQ zP+{i~e}qK35xtgXsyo7&NYYiA-pX%Y%TMBo;(}DO@o?&1X;mde2@Q?DlmIK`9#9gV z4yNsM>2o=Y%C$TfY_8S^?Lqb`G4Mik0YM*xy%RE|k-;7G;Q&m453pj5Iy%C;ew{Y( z2NrQTjDlBO3&&s@e1mnW-wl|MvakQK*D`(_PV*r#ZePB~)+DsIk=D}ccE!9!oX}G!MU`FXvY+J&tC76;! z7e(4p`oEID*d28JyUkDi&egqjE&pCnYw6>3GmisHXR<|YQ9P2;AAy||YUir`K>;j4 zgh#`JPOn>3V&H}70)n6krmDeC+FMJJLet29RP@dsY?E;XvuT6`fX$d+>NYx(wa9|+oi=LOFk1j;W`O^7)6gBs0R;|Vq7IR zNRf`+63F=z`OpGK5s*>>GbT@bC5db6+CscuI|e?W-(x@Nah>$MUQW3|PPr-nL~{C!{$@$u!=8vM*pYFj^KTdoej>+uTmp-*zH!JYN{us_leo1fQJraKN z+JBf@o~aYqv=vI-Yv!@_Sg#=1f`=^#mM6k9sPeRH5CIp^>2aM(47@-sAP5gHDzfM~!l{n8AR_)v;Ro_sz*`)4}!iaPg?jv1s!LBA{LY7uh&jGUD3Dddrk z@Z^#D81fEya9f)6E0$TWw!53ZBo zhf(y{)Ah*dm)aBBr+lx4r#*DWq+OS3;*0T?%NcmJh+r8EhTlJTloKwM6EBl4S4fvD z<)oR3oKK#u%;{dEqH9UrC32dVv~;HtKbTIk_gD6?z?I^4nIm(W&O>b~8g9j%m&hlq z419;D*bO?f=38tEc z3e#9iLxDaVfC=ycR=|zmf1Nh)2NuC47^Nv_^W88_TR6OZYh&dhY*hbi`h}&H{>dQW zpkEqeRKH8>gJzhjXaSeSM^#Z9^lQx<8UvdT1taD@jJ*UujG`wD)gz~0a$j6a37*0e z=?G>_N!QkKdaXL&UOMoC9Y47h&@*WB7Ra19ifBs1Gb=71*|(tR<1bM<)smLK-f7Gk zb>1D0c{&Hr9;Y)UFFCR&B)_M3@OkL3_knA9XO-$DL9JTiaczQy$G4yZMj!=VpjJSz zmtqRC#ML?lJ~&B3X$g31WdeN2>DOrke_#=};#zn`ga*fW3yr;L-?H{gZ~uUkFcW^l zQn<<_y0ZQV6_?d-Q}o+7X`oUc8e(889_ieNC8b8JSL`KdLR(xdpQaJO2j?AJUE3#*;6wwoRMg93l?_!e})2&BME(Mb^m zO$J*{L#3SBT4g7&caEWW-RZ>DqV{f>Zv~RHmM@7HI zGv8ePs^EX?sjb-bfVP>?0O`eFfb+t=Ca-#H@O=D`sLKdFf_@n!=~gA@z_r@Ev1^ii zCavK`2gm?k3jF|`KJydw8R2!%-dAO=xlN1D`8xs!Up>d7Ea-9jPtn}?e^13duGbun z9wc+fq**eJ+>Rb3dC01T<7Um%*7iuR@|z?#Nx}z#mwogEKDP zQ_u|KY3!Y}U$TVI^;@sve~XGo<^3=EU0nzb!F$1Cuq5eHBPH}?D z+@dVJz#TtFcmHboWv-n}w>^huX*A}8WnN2(EF-e4$nuuwVM^|^a+2o@Jje^#!L@n^ z?!(a1g|Ca?Ng@H{-~I$Dpce(82&&O+lHB|H)lI%6X6 zrt8B4Z-m)biNV~5@JVMt1N4SEXm`*EN^_g$-(dv|;RGPY7cfeb<(TuI=-wr&-_FzJ zXpZysAc4lQaId8-&qk^(dyw`iJ+dd*?`36M!@K*(^N-4B=94cuEn`)+Ef&VkSR0#T zdF&4g!9Riy7=aXcfm%RNW!^WHIbm=oMI78g9}d6-_y8-i`gPizI9xdZm$)Ikf?aS7 zrjawz7A$Llru`CclG87Yt;~Oe|E)>C76XSlEYT5TtParwqT>fgT}DPHkJTgSmwocr zi8S`6`Hk{Di3q|W0&mYsF>W(&f)db!3?$(bKOqS>BzHm3MGrjVu=@A3IHifoGxQw( z!nEtIIJ$2M>G!b7a`>5Y_!K>kII9NTEZ~22K2N3OhYkfb9^p)`TI3g>);~6%pKq}w zRE$;CwpbWDV{L4X56`HZa4hX^H)K?4VO_PlPaWPCfmSFNnL?EENQ#} zDPSdq$SB%vydJJ!wnyOd7Lm5B)BHvWfL?S>J|Ci4DF)aeOz5E*$YJ^uk}$$EXcJ~5 zbM^11=$H&E0GAVxIp^>frd{{M(fy09-vdU;0i)$Wjxl;H=1T{G>|p~!qOaWV+0)Kk z%(qQGJl}%v!Z%tx6=PMkEf!YGpRP7n%Ol}I<{wWn|9F&Q1XAF|IRQb?3^E5kum*7r zgZEGlzy$aJE8qqUfo!nFX#;<_3D?3Xh7P9Ka15rww`}_~Y=o0s4nG+Ih!rdTw`}}e zR=+e~QBv39@8L<~4e&8_CHOgcOw?nd9tHi@*J``!cMDBi6A1Z?DalF&VGhyDNn&^e z#RyMkjGznX!I5MLA)ITR6OcJWJ)<=8Cxm-o@$|dz8L}V8U_IIoSzHlueHaIPG^p** z(M#a1`TYJx_(puM#gH&oRoh}=?2NUsxmtdxq5u{k0xqBfMj!=V{5>G318geukm>R; z7!JS$)o&wxEQ{MX?IIrov!NZHZJNpDe5^{^~(;@pwpuuI3GzG?>xE}r5uJH&bji!n z^`DY>SqSR>rLS=OwVxhKmi^>wnMqdCmZiWh$m2!dvixmJQKg$3@Q4+mfZe1H{j z1BSp8*aBx@4*cPbaOI@1m|KzhfMYNXzG?e3EtD*OpnbZTZb4b`zd7;p&#Zp2t@_{k zYOD3Eftit07a*iLDDd^kDey5w1A6xf(J5y}r%cJ{cV$J2mUW8nq#y`{7)}eqx4D%< zKf)4UWArEJGr}|XA?N~n&25t0COjj#JyK8LjUW;uJhLPM>_=kt`$J|%XU&T)do{Y@ z3r)Pt)3~~}Lf*Z*?A}B6=&?iuB!5ju1D8^5fA(E6@6Na2yYP)_Azqa&R>D?T47*`H zY=|YXCsxI_SQtBFZEUWVAE_vS1&DwP=;&1FXvGWEIH9W{2%0W){Bl8t`z!iz04Bf( z)$hs${lXcT1AllUxCEn;DYk`Sp8HCcKWwOMRQ=Xhe!|j9{2YW_R=oF-h^(;Ny|FS$2jHuReEyZ^){(8j4h13^-2{HgZsFA^7 z_~j?VI3qlD2NIi%z??=h1WaAyoWL7#4kJ8X0P;K*>xDySMN=P)E`KAs=_^gV5dJ-= zw5$z{^_;dR=&?jzIvQjT7gX7w+0(i&kvC7iNG-(6w^rF=C2WPoup8FHhFB7NVpVL5 zg|Rc%#^!4I(TW0CfC#vN4j6$HcyUfZPzP9-IWn|vScZCVCk%!IFabWm3b+A7-2Xal z;16#EmtYjUf+TRvJ9)GPi@7t)m(Xu>ZU3m~H^?^plGpFD8st!_(*|Z1Aov0z79d#F zUUN{Ed?w)lUcko?+WTxhNalkJ=&;Wi*+QyN}o5mpld} zLDX=AxsQ(zo*YXwPJV2hp2G;w@JNgO6 z@l~|T@zQqT53XALSNImS`$c7om9P~S!){m)8)8Z9iB+*J7RJt48=C_S5Q75x0uk32 z7=aXc={bfVID%#(bCaQ0g1{a0;Q&m453mAmxPD=a(+2+V7I2CCfEa02Xd zlyTprIG&94k0Y*)&V4kx>fPvX|J2$gw0u-)xzPFz%wJ?RZQn^2?O5b@44-)+e^J?D zC2WPoup8FHhFB7NVpVL5g?(hk=4yFH*N|fBrRabWNP!oKaDpQUnl5vlDSM{NW<#J4 z2VeqxfE93~!BRTT!xpCv{NXL&lBcjVMP?Uz3rASK1RE>*4L&#f3;JE&vhi$eqVr$; z@5*W`)o;3hD4RnjJK?!U@B+SGQ=`7;>EZfaZ7JPn45VmzrE!jlGeA($BjP&5I_@-h zCTnfb`^1?%2Iw=w!wrHi5cK;Kp5X$NA)e?kl!>w!{GW>Tk0Y;-&U-wX^?r2Qk2;}) zmUs|o`N(2OI4g(Ri)*U`Wzmk>zeVp3sOpA+>vKk9$J>X%hrw70QO!g|fL<(0-8 zLLh+fh>Pq5V>{zEDG`UB84&RC69j>tx&vW0GUv48Eri1bWEld=4DSTkbj3rPQ8z}@ z{~lfaq2^?m&_PQ)2()A#_evbS7e^n)(Ldtor8v6o(?xg6WyMl6#+&ae)g3ioSoXaZ z^^bgO{q9%*J75iLf@QD|R>D?T47*`HY=|YXCsxI_SlCDAFuH<*PhP+UbifFtzzfs@ zg1`i(APc^n2G%|s0)03D6X3&o&6FE31fIYaI0JLw57+Ab?LtkFQ9`m#JXisC3XTqPmZaNw&a*=Tu~mQsZj=h zQX>3u%+1jSPe<2&tT`DbbkGtH0xh42qt}eLpBQ!F?G2yH`fX+XUG-R0IsDgL=wEaF zwtQ>VEaJrus2H1I8SI0VuoV`=ZdeZ+VoB_YRk1A=#?DwfXcH8`0^q;}bifFtz>9Oh z4goTg1x+voSxy6GohdULvSv#-02AN?bJ(nY;S9`yKd>mdKPfU3zFtTR2l{3Ck}W@k zjTQX{&1Qco)h|hgb?oUUjG4LsaM!d3WD_5ip(U>vZ-Kbq^l0G4(P=XZ`emIp(GG2I zBo7I^DIR&mMFRk1JL5L-m_yGDh#-oe+z06420@qCAN92H8khx!fHD^nWf8)W5`i;g zZ;dW|R=o^486rby`Ha!>?{V~o@%Ga=`q+4T(^t}Bdp%n2kU4ggb$2ZI!~Z&6hmX#; zXvvZJYW8I{y^LnD0Cqsd*aXWUTdahwuo!m3de{(4Vo$7!ZLu(R#@d=+ve6Y3zyd^o z4|Ko?q`(W*0)jpWbD^IG);=2oeK-IU-~+6H8^Qm=8JGiqxR2i7Qdo)b>BO_z6WoJ= zx_qgnauQ}%{BKsg{GQh@Pd`~jTivi2b|dqE4XFaKWIK_eHNI-{YJx)C|AJ`HCDEWu z6a7-2Ytm4o9a>&VK2ZMSLXEgA>&4`VnG_c~^k7E>#ZS;@1g7pl?Bw-FhIbFolp)ii zKGW1ea3OIuAsi_Y{yzTp=;9aD%aD^HGK7}T87-fVqqmH=pBr`GjH8>s31t8M{KB`6 z`0j`oJD_50f@P2`R>D?T47*`HY=|YXCsxI_SQtBFZEUWVx6u_WK*a0sU<6X&1!@67 zKaC5)7nI3xf;hN?J{*7v@Bvo94H)9_Gn|1r@CO#@g`}{o4c>*%gqq zRr~B3O7Z~+C?aUY#jLh(I%}S!(BpZ*jtGjM+=nEjkG)=h^bihYIn6b$6QxNyN;CMA z65;O??u;&ZNxcj?86rby`GV1sJG^7O{nDuWwkBGCKe7$qRMX3Rcf^YwP%$>aGRPJy zVJj?#-LM`u#FE$(t72O$jGeKzYm>i&f=^y>&D_DKLf{2z0YOev7fdnNXR>`2ac~EH zH~LBDVY=D;8B!-X(Pg^%MV4RVz74c5UuT|Uec9M)Bz;`)W9mHBV*!sYeb zC|v-!oes-h!=*6Cpz6tCU?QvnHKHK8?*?C~`lTy|^fl|eK#HL|_NPh}rbPn;WF`l=Q&$;l8ILQB#$ z(2_flu7S7T7<>47Zx!fw8RS8KT5ne1+Kh{8k+jJSw` zhFqnG>zC;X>qHnWDZ3MRb0M_=QjyG?bk;mPiOm%Hi;}?GgD4P$8zeT#Ug82ggyS@_ z9FT;QAsFw-D2*{65$q*Sr%U6t+IC>6v`&}G;9Y^oSW0~9j{$9}? z|Khu=1+W9waI+v=tc0zw7&pmrRV54Y0g z5B>zhivJDbh(W=U(2fBcl8qn_PwldUVwUmr4HUs+8F43r)5tyH#4}w~rI9aooxPZcGGn65m z%zF{Y5mz(#lM;biXWkoK@uqqiax%{vElJmqnc)+1z}xTRsyOZ#|6cVw=a=XM6Yuw? zVmAx+!AeLNi(xmchYhhL_Qa~#77Jr%tc}gp@-tMYgwr4bE}#QOAO&8a77*m*aGFNK z)~QZ43iROsOn?ut0&XxtbN#{@m;--!FSrDw;1wUz)0kR2_T|Go!C`Z~7EZ!UE_eOH z*h>AkRKNQ4G1u>Ure7A|+X7y?UNv#iLlMM{lF-n}@5RyJnbGiTw1Ed>f(z!QPnE@D zl_Z|N zTVXNmhV`%^mc*V|729HA?CbzxdF;>c9^!%v=%6p|174s8c8cIko5`l9fihTwIJkp8 z9DoV%0am~b*Dq{=Gcbp1xj$TjQSb_O!7-Qy-{}2-d(@s(zdQlW^b0>L`mMqLCQlE< z|Aqzldlq^yh_67993u%0FeQAV^?k&3+Q8%b<#KwrSS&`_4#!RL*ITNHi>M634I(j( zx(#}+9X4C<08iiycV_-Y5`$)158+^lPp4;x}h?1@#eEf&Vk zSUXrA6nydmE}#QOAO&8a77#?pTmrJ-3(8>4t(eJzJ{*7v@Bvo94H&{W4_n|2%;64P z2$x_KyyDJqEcAX*JJux(w)|i9Yfm7p=y$>TZLHST#YeUPKk31+oy|bdlUHDh4+Kk&wsT_KD+&Tzfshr`?V8_r+DCHp> z_h)Gv5HrYg2@x7m9JeB+N!&%_{p=64h)GW7D-jGeJIHdo7=Z}rIwxPT5AffRUwT0oF9 zxddc2(l$@Zt-u}h;Q&m453mAmzz}!>Ti^`Lfj^)Ompp~VotbJ8czf@M){brYzb+q6 zpFmpCZ(04aF+RQJn3qwGrCzRIDtFkBW*9a;O2XhX68{LMAV?HM_s*DGQvKF3{cfmf zLoTF>M=pYh2=Y)sbgxaQ=215z@W>mIL72N~(A7(aZVk?-X++2UeR7SP=65Dspp0)N zrO7{Oyuaon-8GS%%&W2HT1l~znPKt;4T!`JKc(t~ejNvo88iKy-=qI!&d4erR_vlU ztbt9i4EDiF*b0kbH>`&Zu_X4ys@N6_V`u(}&3%f>?_dEU-~u{e1XAFIW;OJ>K|QHQ z!kp%w6s$oU+(91>zy$cfGC!RV;>U%*CP-dYD^(_8LwTMY7l?ffWR=NaViIoE!Q1OUfRVViEIArYaRln=$ z6jEDaY_l>q3--ZE*b0kbH>`&Zu_X4ys@N6_V`u(}&DHYP=t^+&9tnf2CX=Tq)*#Nf0s3$NCcp<+0XJZX`(HQ%bKnp6=WZ|xUcoNz57XeAwqS+r zJ2p^G!c6=NUIwmK^jluP>C?9vEm=Ic!!FiCMe_zL3oP*nc1)2-I4~_@hz2{lcP8AC z>URar^V4un+JX5L!@P`pwC%+^%ZESbw$No(bWE=*47y>t#rZEYkd5;i|h>rX7 zzed>z?|~L5Lkubl_~q$OM%RC)MNCquOz6n9eq^-dy^d#3OWjhb>cjyZhm0F@{<*(P z|7-fi{-lzy1~$Pm$QCPMD=dcHupTzVlGqcgVp}YX46!y|70Y9PPyh=M0T<8#Bai|w z{ukJRAUOIUte*5DOD5ClI#_Y%-QfUCfDf<&Ztw^~*DsubIq--3!zCC6uV5GVhiTfo zb)a4d1L2`A|4*L)UeRxL@$+iL&!%6NdSNkghC8$^^iUP1v6D1R0%c?ff)nRNljf>^ z85Maz6?q00K9F|Ut(_KsnalWyov7Z%cDTWXz&HL5_1&NkL*NF9O@?lAAR5Av*}gV2 z!e6Ty6;OtUR2CTIX}rJjOD$rON@YR^Ek7|@GKO<1eahGQ*TBFpE!r!Ef@$7VI!PW|63<{ z1YyPhmiphUeu;Ll83dAUNr+X!1Q7{WjKyRRV9~G0J~Q zOGX+M``8XQxDfd0{GoXd5XqCk4en1J-)j@Z*e-L1cclk`)=Wj2AsSl3B^vK<{#uKe zq*C9DHP`xSd|Djq2~-jZ7mw^))#bE~Lnr)x^-JPW$IrfM4QzsCknN{tD=dcHupTzV zlGqcgasn2{&R83pCziin=R3GaZ~+}K0x8bn1h4}^a0E^Dq@IjQBW*k>=)(b+03Tol zIjEptI0JLI5R~B(jAH7|$iV%5;tcEH9t?zsu(6`wtlJI0FKx*{Ml-x8`el03q@iy2 zhsDVGYxDEo8Uitq@xlSvF-0Qb0D_FbL_t*lr`(t7x30!HJTHT=hvW%+HF!&gcJ)lr zs|c}(yC4S8)AkcUBz}V%Bv?pt2IsCazg35Krw8YNGD9@`d&8xRpO60bofa`krT!z{ zB91%6re99rz?B@;uj-^h9fzUcX}`z#nG6PrM{+^v2y3`m-nCvz^3u$Lu^ZOIhFB7N zVpYz;!r0jdShf7E`g?GZpaVuA#W{fDLpL~rCYXY3l8l<7MSPNGpbrON0(^iKaDzvf z!8H6YoPjy;2NuC4Phr6>O?0%1nm&_Xy=s=? z1u=jg1gFe15bxAbnU;9m1W8V+2^zwg%n8rn1}H-hSj6;-AsSi|q=ERYKWGt?RO*Kr z{n94HLAcnte^uAhI}DpR=7Qh8ejA9aBC?XmiXzLEe;m?6jzL>zmdE}sOb`JV&;cWm0xxjUp?jX<2%2CDvfvBK zU=8Bn4*GBaCcp<+0XJX>>VqwC2IjyYSOk~!s;QcSCe$bK#l#ub!95rV4|V$;o&fIp zUAm&*!V;t+|BHTCP%Ew1OtTHXffdst_CsJAMLL3{geITQ(VDxWe5?AEzMjRj?fT*lsWABmJIoFrDF0E8SH$tE(-W@>H$V;0 zL6B?Den`4(^~22VeqxfE929hA_^fUpT|H@CO#bB~4*XQ+9C`Ok>)vz0;ZP zv*0Amtmro=*MC_$JO6e6Yx*VIK+T=bH_{rqEhNQXdLW1C*b6#Lb3mCP7vQEnt_27X z0TBq9Tt)HWQeA+fG+^?xwc?|oXlq#{o+Ij-ni8MRm~CefKh+771>&3V>==JTlN3d3Nn#*E212)8x*prj7Ef&VkIm@eyyjF1m9c~3u;00=6rwBf-Xo3;Q zx~B$fEfx<`^x*(ZfDf<&ZUp_p87_oBu!yT*l&XG`atx-yH&_SvxDXz~#)^J(%B?}a zY;~gg-CjH22!1H06NZrn0XxQCS0aUbA}B^+HbA2QfqvOoEUK^Dq_Eh83n|vuX>AKMZ+!7bK&_DAMGJCWT)_7wTENW0?GTy8|OM7GUE z@YIN%^V{0_``F2xgA%tDVJjX6fj^4uZnyfY2q)|(%XEVyj1d_rGE8K!$Y~<|L{1gyCc+N$oOY;42a&z(Ew&U{zxZ>O z|Cj0)2$+GAal#sI7G(QV9Q}~4jK+G{5KCfDtcq>1Fm}e;D9dLzpa2#i0xqBfMj*vs z6#6F(!M`h-U<$H?(21vJG^SYGS2@7PfDf<&Zom+D0$bn=1mGrI1(z7xwZv>oyfty1 z_D*vlJcNy0Tk*f85-#<>EYei{vH>0XWdpj7nt~t=4LSVeg{%N!ijJ|v*XUF>OQQ)h$*8ltULV`%vg64;XZ#dUGsnU z*1Ij$QI2xEi~It z&kPNyJWPrd1jD!&{)nKME|G8mDI#0Kr;DDCX1tiuZ%a)W(lST>kWrN2jgg17qa7^nLvve3&H~oO(OO(Y=545N-GDLG{7{Z9nKWWHk zbGC0)zwP7L^vgp5?3oV74X)}jyu-+|YSb@It)qz%M^p~vC{B( zS>r@mvx}^Cl0;oik6g%Yd1yFEHu|*B5}712&Qv@^WS~ed5zcf8GstlAHpNOU|1Zt? zv^!WAFC1r^{bCcUKO~?36G#8HDKK`!de{(4Vo$7!ZTY8Tl(oD&R&W6wFajy?0yT#o z96=LI9V1W%YY+!_(1!!u89u-Yw%`c*b?D&_EP_ig3SPl3R1eeO8?1wSFc2QXMmPyG z;U_GGtCjwZZ2ZiYVp;t%PLl1XX9lw~EutBQVcZLU#7<0?h^CnA5ML1h&v+@i^p$7@ zi=Wxygk@_azF5pc{(;FCG3#oc0DY1?PEbK@);pA(Zow&jAK2(9Q3iKDO@udrziOdkW(1bkIRE#ek zZjQLOjVDN$L57pt>IYxY%k+DQ)?&yAVGTD6nJYpRB+M)ryJ0ihh7(3@I z4;CN-E&(I(0yVG$L2v|3Fy$)n1!b@Xao!R1;Q&m453mAmz!3Z|Y~d=H!&R^dE@^yz znMUTQ9;U%JSO@oDAUuSPa5Af37)ucu@00UK)%#3G-GBIla2W{KP= z%inGey1NLPYA&*#NR>Hdl!#wGP?kAFmOorpJW}c%Eh`@@tDYdMb&=J(%9`C|?HjJlGqcgVp}YXTCp}ZN1@oCIGI!xh;TCKfDuT67pQ?9 z2!bPMf+@&?Z%{gCf<7F83Ge|{zzuzbis_fDU=CLicr#*E!8iZB)EQAy2Y@`97@-)PzD;TBPy{I84t!-(i-5!z{@l2cnp^7 zm%Te!_|Jre$~*HHP#~R1-+Q9UJ2lGzC5WAX@5;Az^9QbF7-#4vgd=|Ar-s>cby&vp z`W#uqGYhnsh4nf2?8jfxj$AwiXVU3MPUc@3{X!cK!n_lPRrMUzVbs|*>X$GWUEm5& zwfW{Cks;=DM_Uk!d=T#?rmUN!&YewJJCWvM$vZWXy% z(%n|cp7*CKebKy?*b_-Up>Gv?L+5-XBaI=uPa{V#|#%@>-8)8Z9 zNxql#6c+YrQLsEHfCY$fX21x%Kn?5^!M7DnFa=rg#hJR&!JW5;126$TzzVnlLtMXH z3v=KPEP_kwwPz~3;22DUZ?F#T!9d@B7EZ#!*^!? zLm#2VFb;@hL7D#W6ABTAaV9Q+);@^APkx6RV{SR=k&n-Q;#G~%@D!ZM0sa1+)i2LW znygdc6NguwGP=X)vqxWq5UP7I)y0$cx0xmyaXsR5&lDkuMLxu|xW${L&RnVgfHZtu zqGzS)E7I~UOB!<~UJ{>ps4RPg)HzD(9wYUSmsPsRYA4GY-DRy)Bz64oc5?$_N$g3Lf%Fua2OVRJEe{qT!pQ+6@B%fk z13_>EO?Rf8>CP0y!5#GB08D@numWztkOoUBTi^`Lfj_VaF2N|BUsHIZgv2W2-pSgf z-P$GF&%()yeskjGpLzY()lE*Y71efnR%w1F2J2-=lgb_O4~0B036Z*l7zAdxQHETCEe>jtDWC*i; za?Mb$f!4$A?*8PYN9Rv{;&n||;tsec<2Lk*Gy3I2GV&8Hb{SE1>X;6r(rr`QB@ zsD;XC#Px{Joo-W6%nwd^mZ-@|qB5hB7G z*aXWUTh}i?u^ZOIhFB7N;w721((sIL#o9WzwJ9pUqgD_B7tjGCkOD7I13M4|N6-XQ zkOf~*=ANAC#U?la6W{}^fEzFbp1>Bag*osC7QrP?VZkmwBuooymtY_~gpI1-wX}WO z^H-Jl*|l7x-(}T4s^3hGqD`s1C%J zzS{KiSK8eCk9PNddeUQ`O?~nW9Yb&jFp2}up4Bfk2tFsJkS-%tzhlm=QNIIhf;m=X zyj5^eE_%f0l1(C~gnVw6}viUc%)em;&6|!t+sdKE< zJwaCPDh;|z!&7949XVmnCI zctuu!QC53iR()Dlep2c^A}c%~%iS%)T>B<-#C#YeJlQ@fp#oleHIaHXcV}tMgs*v$=yC9x;@UfdrI&rEm;cv8zN3Sa?tAP72&(QL&F)W8k|!4WjU z6l66_O3ws$(1!ys0Y1PAxB)|GfJDDs3v=KPEP_igN~7*e6g!wk2^iMFJs8LmLe+1p zRKLq=uC=1y8uZK7D|E}~2F|tttoOjs)GBSymK*+=CA6Gb<&@>bpIz7>Br{dUq03V_2JZk8Zk ze!*^TKrD$pX>`Q>p(A`K&NsEZhPb#$5CIp^0V9wCFHi$J5Clii1XC_?F>)s7XtH{| zasVd42Ur0&V2JD2hi>=-i{O$*-8bkw3y$%DQN6D{gn_<&G@MNQZ$-bEtb5M?vOI)M zipVpt=>a|GG@z2!@E%$k@Q8>=64EV0j6_<4@fOqo0uXr~D}fE@koLsjWd3P^qY%J! zhU68Y8WSkOutf47E9h+gf6I5e{*(~_l5h^=KSZK=kNhW0!1JaVlBP4?YIEx+?e71o z%adPCed;YenHdw#g18I%4ZFHfKY{=pgkh@RaUI4?8+}m?`o#${$t6L}IYg>gSsoa# zNBDZXEHy_~d`KEREzv8|{9Rf96WQcz+44u(HkO@Z`C}|~ZjySpNxiPJa(8KPs;u5e z*6J^fPLn2QNb@1mVz{h3Qq~_W8;+HY$4k{j*>tjOex|gZB3qm#TQa{UDxM@QKa+Jn zk!BxCllN7~YrigQyd({tk@}Cz3J=OMciD$wJmKRJ9*nanx}`{Ck%l$6V6B;w_{EVS z2dv>{3Hn8e*bVFH3M2Nhxn84OkU~cqBfVP4E`kDBfC#vN4j6GVc!3(&fgm`7CXX^q z#Q3;k%{iW|h66AGKEMjN0Yl&kY=JW{2mZh!xCEo%73_jzFb&niI=BY|;UR2z~1vR4zybIEN#=>Fk60)SzhTX7EKKN(S)_izCy9nVXU#@yQirP%#80~oacak!>=jmmkAmN@7r~BRqyc~#-2B-CjBz0 zL`S$bBuv;$%#2b<0^cHXo5-EA+=Ej8DOuxXY5b0~{8%>pN;dmJ+WbehHwiCuqtv-o zmOW1DbdkCzOZ^_QYAyMQU#>++%WaEia zh5zN4D9t{VCLc@V4<&j})_O};e@z;^DD|I~6(5sj9}t;qABJ?+B{tNIu~geS=7Jm4 zGjtH#bW(oSmKVmmGAeO|Q zAUJ}iixGT58LT-6+<9L(02AN?tbiLZ#P!Q1FbDo{E4bu6@URPx!8G^=>-hXI5dG@* z?-l)K+-}hCGMV}>&$dwi8)=@9Za3D9u%?@|hBj}cZ5Td3rJ%r=OxBUz&lrJ0Q1!d4 zW(b*fv1*B|7cDd-5;diKg-V`j5yXHDWIOC(c2ei^_ym<69armFV@)$hfWQ>%NC z-MvDVnk`FRBTL^X%iS(3+$Af{le!N{y+>uGCuH@PRJrTUmyN%bEq+cs@1J7XE0%p? zS?zvV^HEu~x2)bz);diZogqzzO7juYar?rpRVfrS&I-$pP2ZR3O?AYpAmoQ-8K%PwDa^;2 zo)hr55!pm!U7HA(|7zOv0Cse}(!7B++$=%AOg53NE)txpmc*XSQb{k1~25Zg%chH9eFabWm3b+A7;0bI|)qkh_;Z|@7 zM)7%IS7`izb$osp2oGT+oP?S16P5=53wr~TYy73Wjef&_t>yQM^7^fp=$FkmFgR%k z(i*ykcd+I#!%UVk0b?>HfE&I@ln5dimKh4PVcUF~0qEQ#5dm$eO~4S!^m@s=I#4ri z13D{T*ngO(Nb^rpk;HP0{{(fa^k5_pH_1M?$iBBq``e}C9kTzOa=;u} zAnOAI3XFHQp^ zkOD7I13M4|N6_S-Aj^fI4A$Hn+<8Yh02AN?tbiLZ1fIYaS3UfJMO*@-0MuvAFb%#X zYlk~34}JT0)o;B;({Bp6{)hmA0Eq<+7{8}b`EnCfNxpJ@NOI~$KUJI>X zy4uwL){9!;e>X@Tpx|qGDZw9aE9+^zVcZ6EX0nXQWH4_2I#HtPcR8J*&?-aEIhjvN z@XWkC-N7JFe=L{G{y+z6#%(~q$M!G1+m?{yWXYT`VlxP9n(KKT$+-@N?H>K9%d4vYWb zwX)ZG_F8}a^<|T1WvjPkn-65$k7fHWWaod%u0P9eCZat|P3>bjG?t@Ht*6A&KbFC< zjErS`EK_3H-{ic{tBTNGT>bq z^uC<&feiUbhJ7N#=gY1?%C0}iuvmu1GQ{qDdMu~eyYz{Lx9b+miLo3L%Mr00Xfog9 z7uoU4Oi{RR$BrHMx7Ps&9B`n$4zia5(Y~`zBnd~c1~$Pmu3r|*6EN!lc#ql;OJYy* zy(kXjD@-I96U!?KU;!fhFVF!akOD721iO0;N6^$b>MO;U%fXs^B1X`M126$TzzRMR z41p)G#Z?b~xIdS`D0l_Cv<=U83D6cSTRY4WLe=jE%1qZUT=o2Ot^My#JMFaNjyvvP zukE+re!K0q+tyy&Y_rYQ_S$Nzt=iaY%PqIu!d|Ugx8B@do7rpAO*h@dUR7098{2E6 zjW$Bu#d5D#JQ(P|a>GS-Bw3~SwQAq_s7wF z_7o4;f+L^{Xu=(uDq%n-8A3e9B#Ye04WBo?;nOzveBbV|pSwKw)6{4Gp+w?*=2^_w z2m(jn)cTw`?XS2`*Dokh?Wwih##i;7)M4ED_+M}XK3?Fs^Ugc(vdb=Q+qT_x*IlLE zcXB{12b&BJkL4&6%kicf-0R7)^fg(HF||&Q<&s!t#d3Wtx5hFzmNQ}*5lg>!WDu(S zL`HrgW51D!Kgg7y<(ybJ|DsqfjpYiv>KeQ7rda+K%k8n;8OuOZ>piiA<8Hg{96N!x zxY;hbI+iPAnPE3%(BQ+g`AAy7CsnUWi^ngyuD<%}Yp=cb z`s=S(u@F0H;=-P1;by@;gwyy?0%q)n^{^q9#GYiCr~+erkj43?mRA%!F~$D^9Wdg2 z@B&1z13_>EP5ue8;0wxN4dUPq`fvayzz0|XH(&@nfh}+b=D;6V#5=+$E`eQejA$Re z!8*7H1K}ZTgp+JPtNOJ^crT=WF%gEk_~MH%yzs&cF1TR&^y$;4O*`kDbEZz6I%Ud~ z$&)8foH%j9gbCxujTh@F^|X z3FbJ^09N=Vfc~KEf5;Z5+<`a>A~F4eRHRB6kV#unm0(EcIr2As)%2z>+T8nNyC;6> z^8C+JpZh>VIN+vlhY!QJJ?56y=gw_^#k>LVlQExzbWQgORedLS7>|B0-h1!8_t|Hk zefQmWzy0=W-@bi^4jtTW2~zDI%c-&SGO6PGkR%QfRgQ{fY%Eh_xiFTQrXxgmZ!8bT z@>DD@#PWJ97n?Sb>S-^@kk@78J2LhInKWOfej&HTf(#Mn1F<|3%eArG5X&twe_v)! zT<7k%?%Q@P!u%wb`Nao+`6!kTVtGH7cVc-XmRIZ@d0%eDXJBAqc;Ukz5x@NM%dfrm z+M92_`OZ7Jy3%7=aXcfg0GcgC#hECjSIk@C9YC262W6(1!ys0Y1PA zxB)}p32cEgehDmsOE8KL1H0fDOoMO9+W!NUhp>^_@nYyVUJ|dLfByN$AAkJryYIgK z`s**g_yRkpn$!O#x{IPlnOAmllg?}!H%VVjGp}aptGT@j3awelHRzY6TQrc9*3dSp zk;(yYj$$4}G{sB@&q(?LAiz=eTSqteB~?hXI+4%O1GH@bIEc-t9x|&UDkEOH)5dLZ zf7FhLEe1oR+?JvSV>_u524o^MNJ5s9A^PTTn%?qtn|VLCdou3w!Y@;w|4?H;Si~h9 z1c77!)_U4q?XSFlz>W9n8aEDRUg)>qOH5$a=u9nZ;Nv8i{;T+o-rvQy$@sgdn{+haxP*| zWqa0_GVMFL@F%(CKk6~Zzbcd8l&SBkv%WK4`tEr7`{KF}#`PbG8$1!Oju?3tE@vG0 zIX(Ur3&&5f{1D4OWBE3guVVQumXA%#Z^rVHjUK1PG9Z>dD&)7{ejC|-_~D12eDcX> zpMCb_mtTJS?YG~5|GnxL6e!=IU##I~p`t`M?HNVv<_5%)*pn`f8EBn9%vlr*);1yG7J5 z+nZov>g=o*Vd+-8gSGh1_(=_d*^_3XZr6E`itz&lmk$06-Vmv#R^J2Nc94n#nW#%_;GnbbYFTbO{7fpS5 z=g}X?g!yvjmvYW`GW|yx^0bV2UdFs46W)+B-#w^n*2ng#eoxoLBi3-U5XT~CK%q|(ySV|eB=)3ULwSf&4&D|` zAzmzx{XqdNKm=U41dKq6zk?dsIf$SMrXb7TIT@@$9Nc*$H~Fa(~!7C6Ht z@CO#bB^bqRxde{EH24PV;2sQwhp-V&axMH^r1-g1dQ0Rl=rUDgi&T;N-=Ip*w`8*} zq+Uq8_-ljowPE^VPVKM7*6;SZbj$b9VEiQLA^>B4#6S%+)c2Vd0TvS<#$Iq#{jQ)7 znPQnXHFuJktO6qt@{pKO9Rd(s@lbdlx51swmv{uvlXi#O|E0HO#uOs$>pxXw$%=5v zZ9g`>{rff##_gVtySyAvec@w`{TQx6oN=DGYy9o4&%3w%%m-D!%(*z2?)8{d)o)7s z2^WrBqpSe}pNu2>$7$@KYh;pZ~rD+1u9 z?vIz{KDciVTq*~n0S9k^!~Md1E>Scg^t%>6^Ip6o?|XkNcf@k6P1O&JrG0$I9e2!` zGiUDHxp&`v_r3StJ8#~+2OfCfp@$wa{T{0*-~q9Qn}v!Da;D6RQm`A=!-iNAds5{g z;-&iIX-R@%ERX#`0W3mP3`QUYUf>RPAPA12>2Va7fHGKvxCh&CfX@IQUGQScEK^22H#+v@7)0p*+SHFqpe%9^l^OPF4HyDTHQ`)jZRbe_NSoDqOKP>JBS@P}4*l2^C@!Zwhl%0Ob| zj-Q*}`BR&R<95%+U0#W&zW9j-a`+C44wNd8{DeDNPrtAIRSylgX`b$2%mHJ2POj>o z=r@GTsMv)}@QfE$=Zk`-ns}#~cxRZ~CHlQ8mf4m;LbDH9w2UKWKFjZD`8f-uxdi(d&Dw!zkhV`%^mc*XaYnT*M{6$Su-~u{e1XADyYKRvE!4WjU)cq+a6AyzpxPv|%fC=ycR=^Dy0#9HIlIITa2NuC4 z7{zU27ni`aZsV18a1RE;L$=^xJD{xpg|V#vt#$r+iFn)6n*@dOOU)v!PN$@`{pDG1 zetOb-QS?h^w1_zrgZ4n0qb!q5h(*nv5DO52%snajKyYD$UqT(K z#$3fJ5(ZLtsopM2NXB@}K+U)f?l0QGQ+W6%sSIule{cu%=HUXM0fWC+80Y+_>70MJ zc{FbKT-@bV^gCa@M$^yIT`w*jCe&xzb<3nk_qq18NI9cB4HS@@*oBzun89ET}b+KG-g`~Y=t#fVr6&cjC&pw+}>bd8hOHTE?^Uj+- zefs(5pKtm-&h}5R=Q+Ar$Ri-dIO7B80|ZQf53mAmzz}!>Tik2IA0UQHFpAsqF}Q?} z3g2KISHVEnFPwy#@DrBeYknL0Ep?_@o#IuqE;UuE{x_#q*DMt)e^I|$bo~gZHg8_&@1`xof`mL)Q{33jE{sd#BAc)x*uAv9nOH!KX zk@1#+nr#ok{gpW45db`qmSLP!1{n-G`k)gHx6Gjk+emIOrQ%)giksf`pEi%h?Ouqx zycVDJ(x;ld!gr7?rEbXmC(dns{{8J|Ju=|t`?Y|`K^xC0XI2eR{f?Y5!)v2n7)8rL z&RWJLY{rc;?L~=1&ZuLidERT%$uEjV$TwNVhb-13=8Fk*U$qOFL3jF_9DRozf0uN* zPr5xIJs*}{k4xXb%fM&k^yg*pOET)$>fMb1i8`%B z_*B0`wD}opxLL?Z^G|Y61h+Z>vV||ZzuMMwRB5RqffNBS;c;qtMFA{yR?9N&#}p%w z0xwVlI}ilN|7q_|;AJVQ`+=9lJ!())%!~RoCN3yJpP*531qGC+KHPWQd5@sRUBrkB z5@QqvMU068F8EjD7DeO6zVG`Ek6jSi6a+-*|F=%v>D#xbXYS0M`(Q}YpZeTe)6+d& zUFY|!bL!NoD$*oVk|keKCTqXr_emcHAORkr0yZE7PM`&5AP0WP7nUFjuAmFXwzta1 zr!(qc4+7y38etML7s_8gfpgD2m#>eP{`@#DxZnbQzl$!q=;Amy0J-ijje{qUZ`pDA z<(G2_I{5QBoE_YQSI5Bx?HHG>wR&w47H!L*bNOowdZGNiXRal2sunFV^-=(NSp$dA zXM&@`zSY1otMp`vjQK=-Bw}ptVGqt#&1c9M6NOF?nsh>E9kIc*w8k1ryG`h4M*;w% zJgC~u(1uQ#K?(zi#w`3kV_SRfDf?DS_pLTOs#<A{}tK&{?oU+PUXv{`XM699A`X zX}a%)3mT)DtUrp8S(=fSWb5jy@;GfDaTl-pQF`rvr#JjOZM|RG=D_rpL(Jb;s%e4M!3^60D z#~l>L_C7u3tEt%}0<@m+$MmSnwvWRArD00P2S5119pcD?HT<`1R~{s_QL2SUizrJ! zNWG~&b*LuQr}0)sHImYXINPiFECsS45pr=o8PU=7CaIBK5#s5gi%FJzNtvukJd-_Q zVj%$@paM1^1Wup@W*`TC$k*>fRI$(LcSuvnH^d^-v{QpvSA#D;fk$t@S6};0eE@PAtra%%9IC^$gE*Ve1*Rj`E(<%m&V*Uh2aBn zbP&S(QS|j;(NNnti`-XNOU|qE?g^(<@2-Nsj5>o9OsT8_Zp1~IncN~@8 zeQbK~3F-YOr++#%?Qll=@L6fcbJ9+$)5p(GpSUpn>%}wt)i@j$$`^krU#gb!rERqs z8W8M8YG-~}B_;u5;PX{_MwMqTKJMnU?qvcA-Wi9W0*B}V$9vxMo*DjT*~Na!rq-e` z{`$y=ti!9`)Sfz2lj_rWD=##Xk`&JNYCcPWEJ%c0NQaELm+4IeBs&r$N75uyDwuqW zJ|%HKPWmta3Ge_FumK^3zc2$i@B>A)%GRX77^K0QlEWSZ!l4^8e;>GD{(d_Sku46+ z0f!J5$M@p+{`bHCgE;;xjvvPHqd4}7Q8;i@811IR9^|TKOJp z^Zyb9HZgzK&oySv6Yfeium55>Ux7E;-mFZ|%HxASyE*$08BqjxR`8c?W0Am(o|b(M zz@Q6b_<)_pm0?U!8w(OgMnipO$o<0D2>!h4HC2zlg6?#Jcs~RW6cs?Yn)(B(r3X|S z9$PIxy;^l{wd?6u=Dr(UAkIfpq|fZT>`RAi`K=?j`{BVkfJb7sy<^w)-v7BRKeY$_ zD|n;CZwTQiQ5+cUmMjWODW{e^@UjlFvB2$Jx0C z6Ze_@mVN2aEx&ctc0a=3y>gn%-{o)V_^zs*@JB(ax zS2ivE$d$x%C6CLxt3K{j#Vi&KeN-$nyEL{zd1Q~gkM2>}nTN*KCr^$mA8v>+_kU@5 zPsHLv;i7^y4jj}Tsu`hkSp}X*9oPDIhQC#M_?2&Z)0^JhJGSl}D_5=z{%)ODkV9Ct zQL2SU+JH{>L++RBtyG|zRG()0tA8ZLKAa^iHLw0jfh=+t^};M2*U+u>CY^gxYz2Nv zNRv!SmVDhv)+A2uqz?m-01r?B8xR5~&;m1%13yp%OArNDN&;hUfj6jwy}WkTii}2> zgiQEckpD_}q+{neL`#JHZA0q zwk?`>h|X=Q-9lc$*kkk8s(@-{hQF}^D2G3DOUo$)-2g-hjv{d)=Fr$L8e2vb!Cesi zb+1KE%+?g-W7-OPQRO1gqY+4%#jp4N-L~90>)+?Z zu|?x3jGkdA3z_D{4pgFcxp}F-|A-zjQlprUtYzBvxagTOap_7P<0P5sZyvn~x%m6o zSX}){v8%#eW0fikRY~$siR~NyKCW@4>)rMGl=jcfMPV^TtWBWSJquwyRAHP{28^zq z&#Z!ti~U@gZ&+ecgrk&*6hSGDH@x8udCt30SAoO`yWN+1{C!iN$S=&815mxGJ$0xi z)hCLnewOP}#5qQANLNA0Q3hpbqvR5DuRl+mF`#h1D_r&w`oDA+Wg|{C?%&{VN9_ zU^#dK%TfG+{&ESHgJZB9f~6fT+K$59mciUlUKCy^fA2EGU!m`sN;@BEu7$CQc;^7g zM%RA11SMym4WI-b2LOO0VyMf+hIbR-I311l* z7$8~lC1ux>IJuKP40s|uKm}|-h%Fef&-IYQ2!|q%gDALC7#M>zc!N6FgFrZhMwp!8 z?_Kf=v}5wu>;p&f_4)gO#u0A68P^~0UpaQ@9Utl)<}%dBM|ww-zeUfs{nyDF4F65|M@L<-t%L7?73Ovz~%bL5t0~+ zHE2TFAumsnJ|@0k3cc+7Ps3W~2QF5$-spX*v_Uw5pKA%7lR~}TBen~~)<2K^&X_-z zsJeeI$vbnu_|`RR$5!2x@`qFURZ6F&v|nbihJwM2q$unu8jV^7D~YBC$F(*LgH6MQ z^~5Tz_s4oH%;aLeXfTb_<cfPi`q-{_l%}Bk zt@+!cZKusVB6%m%zxT=`bVA?Nn908{-a3m_#H`Unf)J>a`E_~j5NV(JE6$B=IIgIc z+|%X@`1^=FTZEIuumumW;RB6)G0AGaYj}T?<=(+x&9(6hu1*dUeD?^!A-Y;eR!fhp zHaxXjzPeg7lP73_4S^hpNj!owtIGq_<)GqEI zFRPX9>LhcT+p1Q+hlbmVLiFuJ!guuSD!m}$p#IEyJNS6tpeLSMmP!}+L9sgnBe|pp z#~J5+>l#FMy}MqX?s#xYSEY1bN=N3Ti9k}8xhLvkD-W|-8=^2;72hfn+rZPQ;3rq< z(N#SbRwn=YTZXywWC8KR#rLQ-O10pxuBB-{Xh`jMeF^VhM7((hv{78E8^lCAm32q$;ahXF`{2dIDz2!Ru5ftgDKKTzZm z5CvDzr3{d!z)%N!5D15vzsoW*7s}t_+4HwJ_sZY5H4c*j>*MW>gL}Vu)a^iN3JQNm zByT5w7gPTVELT5jN$9&pOKjT;04yK=L*7e*Fyg={`hLtE(=zi{oFBH+)xqBfteq!$ znJoe&x?OBGzC=B&(xj6S<4UKA)Lj4jF8;FO_%`dvE{^~qTKni~=~2~&r&Y_(t5#i9 z?RxgL+4sWs(_Die_3^obm+g7fitilzKK!)^jI{k86iuyvpV>PKk?X(NG%d`fWD9xO z$;F&5O4)g;5TU5TbYWVzN>8g2wfo{Ky)uH3|H3j^_=uGc49-3zc0{tW4R6)MdP&|H zi_ZBLmt9#{{Kj<86VhD{PifzjE)GMQHveR{1Uyj}TXUh&P(r<6_JG1D)mNebn}rwp zu~iuetN)g{{Ql1H*F-!DS8bGPK?idgjIpALdQ*GqP)({&g4PR0qF+WIwpa661yjfP zMJ}X6MkX2IDFPzzA7VpN88RhV@+IZW$D6aCkMK~q zf-V??Gt7DNa;%zrY|}W3C%^t%T>ACjx&4Yf^$fjlaMQtK}EiX?=`uMsA~&< z@129pMVqU0&O;(Fd;lS$TS-TIZoGikLPPEPKXmbz7RbMUO?H^j*KXm@i z;ThHP^Q)B?Fkx^5~&7!{6Q6&pYn1=O%NH9-E(; zl`mpqE@Ks0PzF<+EaOLrqqlolxUJHe>5*ZzK0nm%t7E4B)>V4o{-ISVT--!boP9)W z7R=$?OzXyZ-@3+?uBVINlJ0wU`m>YM-Hu9k@H>~JbV5of{Lws0bwqT!6+j7^ zv@`QyMU}P)1OD+<83;49-8wRViEoy_Q7t@LX7^Yo(If<(xLbjXNp%fg)IfD7ebMe`H1)yg?o8c?CFxMwk@)LBG`eh1-$ipWit5;IwZZJ^%g8|DG3r z_J5E4?M9$e^E!#Dod<2(c@(#E^Y5hm)m7QzWqD4wo{JHGqj(1H^_VybiSNJ=?%C1g zvYl=S{#sh!o|U3it>j?-mj>SqQ$e%ZZPI}R{z;uC4X^8O>Ef?gK4TMHk)+R!Nvy|* zOY^vD>9N&@XI9HEs8(K5?Rw62*)U`K`Eec<>SMPp`ucBi+Bg4l;5U!C?9ZPH{ilw<`X(Y|gx*=SM8J#y@;C309hhci zmf#9bLR}jT@`+(AF@e}lf2{etUXFHi7w3aXYJ8O}B624kV9;n^7IJreHOt>uNBqX; zAR%{_V_`JXXM<4z?((4HtEIi&{?$==2EiAdt49%cX+YzniJTV(Fs+0Ky)^r7n*mgSoq=} zs`QUldY2KLb%Gzw>4&e24wA zm7bl_zsz$9j|uIsc~K+{i(a{ceYeVM=)Evh@KdWY5aw?^v|TcJvTfGCF?KKbs+c8| zpa}&zjxIK$QhU0bw4|Cx7Tn}FJ|Mcin5*X1KPiv}iQpIMxKdyEq981h)rm|ontVyw zT_jHKqz?m-01r?B8^V|ie_anb@UuD|1W|AWU95UYgEy#yJ$Jz&G{Pig!smkYZ_7nr zy!FLV-~4M_9UhH{9((!Quup# zZn`CiZSdD>SFNMaIg_+7my$)^VoNhwi$>NLrUdU?rN_tOkS{S+A;`OJEH3w+SiovM z-eW4Yke8}0v^5aC!QA8wI{Vf&g~IN#y88|3A=jh_UKSKSCEfMNlzx%YIng8j>CDVQ zhJhk638-L>aW(_%{iR_=Z(JD#YYc18X50KN)q>IZYw|u*S-q7CRFmp6^Y^H1#G)RZ zi@a)H{Zo!)K_cWrI%LGbMQ=tUJj-7gAX)OIn%zj^%4sQKl7-B7Moo3r*w;ScCM+G+|?_Bv`0fes`*DxI`dpd6Unu(5f_2TK=5kiP zn0tIE*;9J9G}?0i(!4ZsIy^lpoW1lN*1Rd!o_f1A>tgc44pn*#t|2eQO2cAkVXpO= zA2&BSgVBY>u5`V-Y|0>p>c&iATKF%{P4_w}-TBaz{yU|UQ~FLyZ=0F6&x)pbxu&UL zjm+z-^s2C;H?11O+BsVfZO`!6+#e2SwK2$C zf-Z%DGbgghrU0RMq|C9l^*54N8%g37a3*+x76rO;; z56PnEDirXh&N)D|*hb;Y;HWTYd_EMmnB?BTDpY_03rU#ldGjCR~xLZmj9~9UsjgBo8b)bWB%=a#Imm* zx8i$k{yyphUsw_L^HY0Alg08``7)0&_tcngizb-MadcGJt~By}W3)(T^A+K++9otF z@_ry@9_=UynYl}!*5obBeSAb{{C(rEGZ^jLn!@hdB`q_Ci^4agzrH&6g}JltaeP|q zfLP=ik$;d2rWhI%?zNwU3f3LoI`T(qhR%Lb~6+F-6qf7>*TMlu6k2@>QGIp zPeVLd%t&U+(z%$c=G8wbkOfkgs7NxRi?5uO;~W-~FDdH+yM^3I9|j-+9-sm?AOubd ze<25cnB1^Li^`KibQ`5YaX%qfs zFB`(&;VO7Ig_+ai@s~eAofQ2m!dzWh?bFmtbGn7G8NU;;!(*vC!wE@z~~+Ai!(=fxl+JQ(XIm->2Mi(aGMw4Z1AOCuP6{OQdZLPZ5=$u-WWR!dK*HaM?Z zerdJx*VQhoZ_Iepcgy@ea{zz$g4>$EW!cysiD&<3na51DmpB`7uQ21fjrw3n| zmRy+beR^2YKabrOzMs-|xp~nMW<_Hz70kBZHq3a&{EDg`({6;QHFaQbg z02QzSAx-`=q3i463c6qn(%=p1U=IS}5E@|;GIReo_zSV)=-+zASv}BJXX+8RR;G*Y z`COCf!}&W2g(u>#<+8c@1*{4nH+fU^tc_wBLfre>XHBs-SvTkEh6hrMYHJKmLesQG z!fW$6IrU|zWmua;j{t-QSO_xQ|T zvW7qw*X~D#{yp)1KR#jxsKWK%y?c|tDBL>GICn5H_fwHR9ai!CL$`h~mdCkA>~mzW z#!xTI`7PnFazRbrPtwj;^pr32n1(Hy7jvIDH#t*N*p)18D*N9#kTZoJQ>91UlK%GE zwDi~69evLeW9OqEq;zmfd*_8Xl#?-!xl}LNQ6Em9WugYdbX3lI>n?68zfHd zqz?m-01r?B8xR5~wf?;&P*kpmE9inTNP{=1gFOg@LuiD_3HaL@Tx)(r?arencz>p5 z`jGM8n%Y$D@T1eCwNU=9z2p&plh+yJ>R+){ZZoYUw!LZi`(#6id%rlNm{k`==cN{+ zEop3xLGN2KS|qJO3LwEOEh=&MU*BmzyWaTYFT$Il0jB~$h%t70we+-VgA1zVzphsP zrrPDaKV+mav|vw~;qUP)zBiD+W%2g%x5?tX2Hmc){*}MG#e7~}+K=?sf3`K!<~Qe1 z4a#>_u;zWeHQQ-kkeXabM{UdBFo3`Cpi2uIBu?(6?|Mjp2dIDz2!Ru5 zsgYA(uZe&z7=tu;+kTIXJqUzDXoN|~y#Lw@)4yd*t@XDIop=6i61Ij80zgRT=!|OV>D2}oHu-x(@b~QC@2Lhp zmVK?s-@S908~V4&-)255-`!*JoG(;)Em_R{SZr|c3C8obu?69Ga&PpFp?u#Rs@XOF z+#~O24GLcu%CuI#wdSpvTQWr*`?groMFoF#W+wg{w7rL3DFDY!uoM8 z$vM$U*DI%je;lqeg<%hDRn3h|$)8djJ^t>L9YI&vy{o2#L1oX{Wv6eC{(}(gtYj3 zePGG;9syn1#eGc1n=->51i~RS!eq@~SRK=Tt_RoZ;quN*i{Q-Lgq{a zgAMIDara-}$zQTI=&#@87A72-o*lDV&a9T6QEhNhwZ-Mt$}8yKn=;<4I4Ybk>tFmm zs>xsYEj!%|`CC{#v&G4mV|D=MR*jS=7knwDebSu|OZPr4o2=Uf$6fZXRbp%-FYa%0 zV;6r5XE%z8{QlMyZt?dUIgI(~;Uar{SkdeLF;wuy`H7zE>A4Iao>MT6=nn^l-rwJn zrsj2Lrjz6KN$f8CT`Vo!RKyG6uZ02Ck6N-$pc*svlFefSZtb>}88|LB3p8Rv!v zvMEFo`RgUw$a&r?^GKrMSEB%5U!9#ET#M!Uo9762u0pv{~?r_@2j_^=U<(k`phE$4g>X?&mcZ|3h$Gk?_^a?RoI$yr`1pY@A?YF_=50$DgoE~G<705FKW&XY3l zw0p_jufYH$zynmk286&#lfSq0uJ^OQj4n2$!5h@U9t6T6G{R)zFO-hY-$A3~^>}%U z*Zm(m2|gBoM=_*pMZ7@%KA^{6L+vJvuz4(=AQ;9%3Yu%?6DJ{Sio>DhfwZKj?P)ZU zyoE+0%vLiBVE9j`N$;uu`cD1Jol=6UHN{LgDgX?mv#X_N_4s>bwafW`%$6P?StlF< z=knLqa-IBbo_twVJ-@0pYZ12f(L4gva)l-HCT(As3Uj~On`77@ z$avWoU7ucXZCY_ndhQizi(h97`+ZOGEKl@YPge#dX_c+|`HwFCo|9`* zeHyIMS2a&TDko=msDF^QLSw8m-^5n>*?S3{`d&|?LP{6J!PA! zdTmvW#@}7jV-HS`KPo-xg!I%?XUL0Uh=#dei)n`6h-n4$^Jc&mFa2YB@r~()*QFJ| zP0zb>4uw6@b3I)d(yqh!tG`JWs`q!ph+N{$=JNNntbDbBv-~|Z_mAjJeO{VZ&7&|W zkOhg5O9_c2&?fu(^9lnYE+c&yfCPAe3fO>){HzU<}gW4eDSI0^txEVbagSOUUGfC{U6ChziD|doieMN`C~{fZ z?BHmeIj?S*D@6RYJibciZP1cyJdFYvE+ll)7uMdozNdfZ@E4ry$$mgUsF-jdbY4bL z=I^hnEv~FqUNu+$j>cb%{!p|Mg}*NyMgKnL!1TBy(i4wMPdOz$TWhRrBf}f5`%=$%S-OIHL7)ws}T*NSxeB9|j-+9-sm? zAOucY`q%XkMd?Eqj6oW_K^^QtARIy?OhV=if7cq@jN4Eq^>Psyw@Q9ZL}p>J(4F--qROwuQQxtD?_h zx~S#OG@%COxc4~~HON==NsvS=ukA+OLc{JFPk}ewl?L@VKz`HVvFzY4!HNH=`OAa@ zA!&8B^xSHLOKbgmvu)FxM~k-o9~Z)3l-cNn^t98{Cg-NjF3c{bta*dHFTE+pF1{*O z#`wWV9nVe@=`OTWbp5=+2>*>lcn7qE4q0%kkI6|DFj;|ZLR5{X;ZyA3@ zYY^G$UgeX5wzTk*sc66o$n82H z=I^{*ULb!9aW=gmJ?GNwVq)T=7^1Ozk#4I9LjKX%Oqu2K8{!xIj$iYeGZg-9ewHVC z?oj5IZ`)L&j-(U9lOY^FEjVCFP1&NSL=I`oE%ud=iPm(yflRgYU0z5zk zY(NN{Kuhytd5D55=z=jwgEy#yJqUzDXq=3{t>BgxojX5vGP-qg2!F?=a7z&{oWE8W zQ^^(`GIiRRzL9s!HJF)VV6HUIWU7umEjy!Bsm<7pItxur!V7Y@eO^_~3P z8-K5#<*yq-sOIlw)fV`Bb@iF^yZM_#h12`;r1*jf1Z*7XPiN?+8 zQ67;Y#$>IDh-wx^jc7CN(OehQD@7;6#sHGyvng{cL#$ zw`k`LJ)9l@fS(IP|E{h!Xz=&(y@Te>vv|^{Q`$L?v!qX?^zoE7PU-2f|`oJ$tv={rWu*iI2PmRI(`R#S|ZMKHE- z5jF6Xs10?Z5>$l>c}_}Oq_lOjFu~t5GJjQm;jfx6{3Qz~$%S;th(_*{X8R0@lRN3V z1rp!^DqsUb;G|#wLexcpE*OI}c!N6FgFraMUznWX@7>bQ>XQbtORHm8{>nPA3PwO{9KDVSuF`>{yu2QMo-VZ6~pct zPtFjFj%rcCfK#P)eV_jQtP3)KZ^%x_!r#?_AGe=hE$!oPO5ez_{W-kht0{dYr9D%6 zWnR%Sy)>m4r}VJp4>Q!AIn;%jODx{!bI|_Yt{~6l!k4 z1j`ng`YnFdtP_rigTj?@S-47C5;XnrVGqjdY+K>Mu)7r=4D<`XF(`j=xJFyoSJlH~ z{pWi8sGGkqAl3Z6y4o7EzQ|<#SxP^RdG0?692RT&tvzIx%s-^GDy5Yvy*Z^f#%2ev zO=)>3AeyL7n|4t3`aZt&)2cqxkVftCmT8RBD52dw)cfY1gmukyfat$z!DRenEz zDb_w|w$I!cawmNlfCPAe3fO=UIDwYdFWek1YmPD)gEV-9I@p6iID|%+wDxSapBJKk z%kX!TyrblY)7iJ3{2d_d@lG$Czv~5m^B$mY%WL3^oDs~X3FV03PSh0trb~R8zYosR z5ux{vU2^=n$f%!(Mf9tV!6V`u#$R$TE>QSkR`vLsL-*6Md3m>VbV_FEd_1L{@+vfG z$CN&j7oqRNE z>|fHIPDyt;J*DHL4*w-3>8C0EM1bgw{fxhAzVMeUNTk-kzG|_r|05q7xeMWd0Z4!c zsDO>k-v@W_*Dt^obio*;!5h@U9t6T6G~zF0PR8HX8fg6=MJm?@p&B_no$ zt-xs>wAmc`6k0ZGi)H>kJx>*}d!uE?M9v6i6QaWraacI{uj&$?kW_Mc%EsB-V6wId zTLTSz5iFukecj1l0|z4B;bbmHdfj1&{ZK%c(t%_~Bkf!#W~B7)ls*uRfV&Qh_Mt-{g{QN$>aoxHj;lvG z)%%6n-|XF04Db4HoZcf|QwcRzN~_GJ@b$aM^i1NSUTd~ms3*Bm&3rc9?cDUI=cjvJ zlUc=}?QtIF@>5!35aX(>OXNo>0eHefQcz_DnfDkx=me%z?!WGXL zj6oW_K^^QtARIy?OhP7nE=d12<5)_*pS<&)X)?Fud*WL7|4tW{lMCVRUl#tZo41Q9 zd-(Dh3L_VPt_jum5yYc)Nz7>`Bos`sGROz2wkk&%#A4K}EzS7N{ z$V#~%0R3mkU8DyLKmt5K1#CbFoOJRRuAmFXAPwH24)!3>!aL9ilh%I6Unm{lf7Q?5 z;b-RMa=Bno6?LBPH@0i?_Fq34f1i=3dRh8_&rsx>Eon5N2G+R~^?k1E5?|r(Q=gf= z4Z>y^KN{-&qQBf}Z+G#xxqfDyPY4509?HB7b9+J{Q@p0dnu=C$B?e6;l z%Wnrz_YMaaodU_!G*nA6(ihU5&dLh?9=}TWxhmc7hV;PLm`qs3>$@r3U)76pW-xR8 z{8?e>9vXY4{U}JMjiNCTSt>75zm#|Mre6u?-ZxWH1K+jUa<0R_j?G{4`j$V7iqa;i zF?G0q)aQZe-oH<4Ul)~ma4h}dZ^x1Kaz9)9&yc(REDS&bJU|6(K*%8e!c}ouLmIq6 z9qd6M96}?*djkH}(P*vAa25~xwq|!n?Zl~msy5FIx~qA9Z2qqEC%I+I_Vc>g$WddK zK6u;CIr7aCphRF`y*QI^=n|hMkz6u=-d#XP@%2G2` zY*KJy>{bBVXT%m@r=;Y}@nHlOM&o!eddW?hn16n4TIZUy_7yYf-dCo3UzIs4QSM9r zkd_8>9~lc$ZCj;xb;r zNh#BkC{wC)pK$K|JlDYAn3EXmd*qD{{lW?1JvcVDYbhVq+evxF%Li4t60~6H)VXQS z8)t`PKU@3Hkh}gY3_t=rKm}~f@OQ0_Uw|u`9mXIH-pazW5D16R2$MB`VRg*;`z_jz z_;C<_>+_{vI(P0agq>4y<9t{+f9-Igu1wXm^nqnRZN_T;2odPW=$4XQ|KJhXW&S=S zuanQ)Anffk`{kV|53H7OeRTGh=i_hQnzJ+geU(Zw;eF%S(B$c{ndXzL^rV;qZy}oX zgZOB^uB9CVy)aDsz~=)3pCAgTk~5O89v02QviR|*#DcLOigh;r5}4P>(PZwx2YCAZ zt8~9u26JsC!D8(dx*gdwIra}aW3-lvK9!uIH_`m4-1?~s6{2#|1+g-`UpObF)hV6V zICF9AzH~{xUZrWl(xrWAwv2h8r=P9;XULuOVE_`~0V-evLf`~i`mcv8=z=jwgEy#y zJqUzDXoN|~EcWyG{C({@o=rTSpV;CgblWdC^V_j=g=CB|FA4&K3gI zkvTD(id+-@l}{p;7n|Yl7joytEeAy;Kv(dUUwC-m_|dG*yh&{C^UUB;^KUutFXnC; z3z$DYHuG8@>#O4(pl%dI#(gw@Tx|4-l`w2-d|@) z+Ba|XM7La=?s#3g5k=n9|iLU6a!9Qo1%J*7EODx<1|EhMd;AG2f!z*7`%D z_v_@N)H_DyFS(x?<3W%B50=0x{DqTF{=yZPHH<-;TZBNv9t6T6H0n670sao4^~~u` z+BQ%2s$}v1PsCr_y_srl=@Jt#t;8!B)w0YCAv40v6X_?fGc)|%G0_t&Z;v0Th{-<;)InYtq78qzx7F(*GA0YYa((uPvHsvKD$br$F4w|2JtcR z8CBjc5G#=yk|7hSB^f|1@OGZ!b{X_y?ma`@>j8g@FhWNy7i*`F5cI@-aY*`GxXlEVevXulI~ljyH@FLRl0km zKdsU|B6({`t5sS{nLq0#`I4g0T;iE!ofv4HBzMw>0Z4!csDKSSp$y`$+o21_APwH2 z4)!1r4xteyC*W^$(ZZ4+&fIywEi4{Mj-y@F>>$gJ$6xDt=Kk-WX8Yvt9+f*O&wou` zx`fZ)O1!qb5z=-*#K8`5Mg@QWX35j>_w7sG`^D^huw6UZo!u2I9fBUj-yF%0l0(v4 zW9hbSV-3|+u?*vzV~OS$$Cd;yjGcK=9?hQ{Y80b+;gZ~Sr&}^lkrYE86mO(Ck_v_Yyh?u&X8HZ9^p}yARAv<9cdwgD`My-fvqt5w zkY>_{0Z4!csDKR!u?$_O{)GzY5^D`<@CJ3T2Z3-1jW7wB*?#`hj8%voXZ`1X{th`a zFL~<=77B{gVr%nb`OQiBYpDdgC-WJa24en~kT%Bf;LhwE{#qeC^Y^km7Jp86@N>(4 zuJv!84p679W21rA-wy<#-XDSb?~4_i-yJImbc7Gct`a{DB;GvSn^I?5SgSl-E zBN>&yLZC?>1|R_*pkiMBmM$}-!CPMV{RbI=a0rc)@wZ-dbO>!n`Ko4a$&4u0CO!M} zojv zUHX^toY#0PiSM^gG+>=R5zEIR)IV2gr-<9%u}W`?^wut={HCDx>%tPo!J=ZQ6%=?t zFFi0kTJT($yFr-Kn1V9Tk9FO5tI{@A(n^eQv}o(&2siaz@}4SromEkIeT0`s6Qun? zWV%&3m9`Yyt4Ug|(r|e-@96D(`{20jiP3l1C^Yy}dR_h|qaPDGeOY+j{aqPp>u?A> zw((a}Sz1fi3+?CsTKHtL?kCmdSvLP4SUSpG??NVWPYP;3 zxkqj6megBmEuR`*eSfu(AMK@baqnfikx;{f+{fiFbio*;!J8=zum^!~2#uM)_8whR z{2jz==lf|}pD8ubWNUxES6k!#pNzkoF4^*RdBI*j2h+F&lUumV^4hBh1aA;olfR~Y zefHqI*lf|igZbNB@HVSd>En_9CG@Pn6mFfq9;?QEH3+p=ECT7`a@S5hT?}a-3H$>d zG}1eO$^`_v6f1?|uY{`36g)pZQ0+=O7ju_K_xa^PnUyie@Vl{V$<9??EV}QggT(4g z-z8(7_;Qsz%d2@2tAwtqsv4;z7i^x0lnk=nWc@b|^Uah>Nliu39zbK6Gm&AUf z&j`Q$CSi&{D_$16rOkUBM{~a{eJ~WgkDu-(MJkt-TN>{)kj1n7y*%RqD(2O{Zh`<=$OlHcqk41OkB#P$3p{pB4(mUp$qZDR|yEE^y^@gSjsYW1GrDnRmy2VLz+VK{4rR?^*uV zY^^i>B3R%Vy8hqe)e4KXNZ7PpXh!PT>;GpgApg%nMujggQeLWlM<>1YYh$O;H^eFd zZ;TgIKRN{~!W-~{c;6THy3d&Y;$Ca1<&^(oBl%Wxu~cpx@Ora!UI2fEaKIR(!5h@U z9t6T6G{WTK@wY|i`s3*2Emz|2fNGfZ^kn?qEH71L=`ej3k>@6Zl$rPf*E@qZs##!n zmb;U)&6DX%RZdjT9=)_@XxQ?1uPW^qdszQ6HURoXY=&E|bPIhXy(+veuLvXarJ*sE zYLo=e5^&PFTZNAMhfsMa^WoSL_|VwF6M6qDm!T$Xo#}k#1)e-2wnzC!ygT}QE_5+A zF=7vnO89x~|GRsXS+PfXLD!rZ`qvAppI1g*l}dX}yt22(^pZ+z>ABvwr1~qDNp6wc zKG`u#^V;5)fi4(3I%fSt9qd6M973b6*_!8XP2^T)5U(ezgJE|soWGC$yIfZmy?@gV z+2#>>ZZe38Csr`KXwC+LO%e1LrAg1>`MehE|BK~VzZomCQb6DCCAvmBIyU4zGWOtu z@WZRTZ!eZ@Gctf-c&zlnFvvd@>+JylS+g^64Nn*5_P_EXoH@D5TZ;cM-Wq*0Us!y4 zOw}K&{G(s24%K8y+xFVbi^9}l@HivY7r0nj6=~%}6mEiNHvh-K7^J}))WIGE!XY%m zBxEkM|69-Gl4)^sl8=iZ@y1UyJzWdr@6vU0E!i$vjamBd{a;$L^Uw2oyh6&4ixm=X z?)G1mQq=P)h7-2+ZHBA#qe%P2vKT)OHT08Eqy7T$X^~DHlZK>ep4jy8-96vnyTZ*iK|RcJwyA%iOK>Kn!5h@U9t6T6 zG{Pig!smj08{KWiyV_y2t0wyBQt+8BI(ij|gQ!}@fX;HQF zBcn7Ypxr;x0kO-Tzci6_acomEGQY;tvt#|NHsr#Il+OI(z9Mw}QMWp6`|Cl!Tlz>N z=}kxorQq`@21 z!5##{AvD6|qt{=s{oI;fU4I-z&k@h}OS?(W{(S%SgU(FE-;E1@KbrSYHgm-K3BQcM z@9&0djiLwt_@=s}e}!FfKh=`uD3)kYB$dF>Htp|3oUzc6MB z1H3^U>_MQ7iSZXE*8qQOA~!Q5lGkPB?fZFJpIK=2jI;jp-BOMQFY_0&|7!gu8$Ty6 z)vMktAhzoPOTKZz%t|;mxoFtT&3sMFu`>DXz8OB}Z%?1yI0(SbFX}Nn4mIS7)Akj4 z@pO^hf(~;!n&6p}hp|&)3L(_N9t6T6G{R(yzi?~yw$avkYtnOJ`A$;TJZ)wcR3+`3 zMtrYa11!|IukXr=Z2{%;!99_#9rIIq$IW5A}TK zlDVB#0;w4?Ai?pEVf=+LNP{=1gFOg@!@^(4Z2F&XUH*2mzR-633Yh$aDMA>=zTeOb=P8{_QStaXSwu%M^aw{W4>mZ83LdOlk_>ba;{Wi-ChN-aB7f zCR7drQeLga6he4|I@p6iIDGNeS^rMJ-{xv3b-t65W1SrH)yKGeQvTYs(bD%8@D#af z{S#BFPw(2ctVicT`gfiZb2|@5$P|7%&nwOIbvJYCo2Kx6hZl(i$2{iY@729kv!D+4 zAP^3raSiadCUP@#yXEg4mn^x*lBM@u@|Z_2*<_2n)kWd2WyEZuZb~)&4w^hT*M1&D zp2M**o!^e}dUGzFhq>k2>3rqkrJD1W^L!}e9cDkn7^J}))WO~ie^+KqLMD7d={k4J z9-DFO=O#nP%@1MpJa4)(FS{S0G}mic>0#vTOP7?C!)?fBct_d@Cs-gwkYnjWyl zQp50tBqurElPu+@9Un$k(Eq8QN7{wE`=VGPpfiy8jzowqQXSpU{`dn+>udEHyT z+US`kNn82mk4(y6Tg9oj4;B7in(MQRzs)BuFh5mL>@UoM-fB|jHXqtwq^Ua7Eb7pF zO4GY^7qoLJ0K7ap>Z<%xkcOIA4ey3^F@Z_TRd%k9CX*>@%OO2exN1AEKJnU zzk{B;kn>Xo$WoYvyhgrfF`3&c!|lA5YW}uft9+bgF^oYPyg}V=hutRp?PvEOMt8nT zIl2D&>oN8W~K+63w^6K$lPX;Zl4uZV$2GKn{U&~ zXBH3S@A66f&;68~@JwNJtNb|II%?XsuAKMdBJuYdxeW~cJMR-0;ey)=oRbw@EcdNM z-c~tpKh-rGBied}0UsOs_ZvO?dAj&p=&$%K!nQsRc)yWOk3`|w_{rw@(Tx5b=`m~K zqFVu(i&5-)7Dk;x>8jv+$GW=V9?& z{!ae534ft8j%yJHQzk4{*X=cD>rB^Gx52qG+&n#%HVJwAt8c9Mjr#T$fBQeylpHHl z^S6G`|JqC^bDf;R3aJTOXQro+41i|1$TSpearwL8H|po?kTWB)c)^AFA9G{9en`nQ zSv-aBSQECHnVxdCy5ZAMu$sIww{3ZbuyvHLIvIW2zR_*?^cHQKA8*4_4S95vuyuaO z^|$_4Q%GKwQ1kcJuaMRgM-SthL z_UEVeb(-C9`9j_)ENzRqK2A>|Yx2rWL#b*@zGTMY>7a|J;l0*S8T#2;pIJjsT$G<} zF}MD>C_lcqKQhha^`_ItUqxzBxb<-mNr#+YT!Bu*uhk^&&rCz{hL@pcYcn(amfPyv z|0C}LYQ9C-;U9<4w*G1XWth%e`q|n%Go58_ma0kEI^Vots`AC2Z&G-wil;DBsC<=b zIAMo>TXVLVnYL9QML8)cJT@d*;KX7{FImf zc0pcsSPXkCp0@fNSHsSG{j|N{kn*&s+WI);#;N+M$<}6mstVaznA;b53xzvhZ zPh6wF*<@}rzeXRrSU-OIBCofea^KGNf#E;iBxz@U`0dmAZIi9d{B)LfP^s!3dd=cNS5D9QCVAzj zr(pdh8Ih->T-N{NYx+#RVvo%K7}~0|CR&)W*{u=tVCV$t^BNppt zMv@tXe+ D4sLY4 literal 0 HcmV?d00001 diff --git a/screenshots/brion2.tga b/screenshots/brion2.tga new file mode 100644 index 0000000000000000000000000000000000000000..ec6c81b2128716915dc39d0860fcfad28096a33d GIT binary patch literal 192018 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≈N-K`U;GHLBqv+L0GjA(Tqa&yKeIxQ`ILLN3qm=(ww37vzGK zcqxJ`9|17aDiZnXwm?;Qf>p>M28N&~2IC6LxoTdH?|dT)!?@^<^DvUelZGf!ceIVS zU1>{^8Vijx@!;TI%L@O(ieGN%7E5ohZNyfWftQcwcj_#C zA>M`cnw$XFg>&dZo=PE^_zgN*=ui#*k4M2>JAs9TK$Z2SQmfXtt~Wk%iQrKib%aqg zAj!(I&=Q_V-rU8`An52?4MSeOjZ8nGQU-u$5KUXFGP%@~Dc_+xtNi9?Qga{urNCROkPRw@2NHM8raVN~JlO{g`D>F8Q zux6D-31OB)D-x66#9^D|s9H^*m!QEta1{?Tad&o%%Gc3?_0aoi0OsT61tQe8=i6pRs+MLnS1NI$HK5RAMuBzS>QV)4-hv>8}b z8Bc8**bt1Dmsbcl9HUbQ0KJ0`ft!X@E|35C@fZHPrK=CNPmf3!R#%?+`tpUR^=m7? z+Y&u<~Z3i0x*w^~>(4$nZ%={g^t5rgr3e)hQOo5R}PVqB-tF*ND-ugjYL85REZbVsd43 z7=UtV!zTk?ddVHhm_)br(}hM6s_11vj85(R5dm?It`@~q8{uv;X?s;xm14081qbRI zh9(2l0%_m0qD8<;!G!D}hyQQX= z_38&Owe)=V$5>de!^dN}L2QG}Jc(5xY4u}1ty3%84hU=VLmQ{!c*E6iu5^)=4$nZX z-({^H9G)RMf8^=hwQqr;sDz#P%Lu|G-(m&S&Ejo^ zbsmI?ypT&SisKB-J8YYN&kTk>HfL0kY16fpd3P-4Tn)Ag;+(ykRn~&()#S5+0jwsx z7pFpx1!eiD0gZ_mWI+*-aI5%B4Faqnl>@~=A_C}?1~&6vAr-#l3}6+Khu{sqP~}$Y zB96PVN5-fg1Lz2ahT8DT9t>EMa-PzVgz+W3b|hrnBUa_)j@(zA+b7^j!46-eyy^iG zs^AO7Wgs@fKnih2xI_Lv2oF4Js?`OlMqQ-eim>q~&j^hWG*R<- zu@(LiYLRq}1<(NCmPZfr820&>mlSqiJxhA%)#bCB|NXbWxqRWz&iutUS3nqkIXn}B zzw^)j$$0tHcxiO?{Q0ZPr`DI3DeNpQU48V?tEZMrc)?l6<8+W7ryn`%`y+m}#m&{z zPqT2W8cTpn3lmPfaZaY5X%|iLp3BT@r67n%tu0qkRb;~%VIwOodHmO9oiybDj zn)Og9`K4SUtQ9=+#>#{zM@?ma+cX>#F=^4`!7YLhTO?7MtC`8NyWLZg& zD}FgM$KL{GIw&i}g|iRO4!IX}8Rck0dgrF{w~&)JIDn4U-A64o%EiYYeg13z%g)M*XnpiiNCe(- zqrXeIerjNO%)j^^bazby;Q77S7tS2BDd@tA-)Y3Fik3`1-?Iuh7HcODZzswVvs#7t z$ih*Odk2*)2l84_R0Y}=V7ZY|t3b~|Q=0d*^avX?)j(n^z@^GY#ZywI*a(w%ah0St=^(9%z0W~<3Smqlu>(Y(Qjz(kU?tA)hcJ^yV)mT0 zF2@~=q1cngLXbR@7WUq#6^xlQ<`!f2v~~r;h%q{?VC);5itEwv)5=4y!z+`jnJnm6 zTl;g%x2k3zgn_qOxjp;DJs+MS3v$I;@okZ#EtMc?oORZXGjsk3wia_dHN2?uv6-jZ z8Gt%|#%y7pT7bT&DWfyZ7yG3L|NW`OJtFUjwD`(sk>LBYGvE2f|NPAV_7%uo|C29Y z{OXsxCm!j}KXP&9k&V-judgg`Jbrq8bpGP$(%F6ok%6NJC;uBBsbUorSbQ78> zccX@-brf#H%^;VVm#Z+7_%@T@cMbl~Dwkuo%2iIx;+hb_+ELF!XkBm_HJngMnN^m2 z&}|t$Y6V&J1RbrUAz0Ji9=zZ@R3c`qP)_f(H9^#)+(Zvfau{B;$!yGvNRidrn87o{ z>)eHVK^ScsNOY(1hWFB``yDI~kJU&c0@lRhMrc3;bpWWEs)wCp5$-0Fw(pHqcNk$5 z(wu}0scCx>E8=AC$lGX)u>WL)DbTeOUF77xoM$C2loVsU>}S#fVe(47_nw3XdzgP_ zhV?xXST&8Y8CsaBBiU@0iG*5YNX#M0Q;I@slQXp1is_W3D9m3Ij{7U(@7$v|MQ(G0 zyc+ET?A*%Tx#in)qg#BO8>u||>OY^``_|ll_=dwVOhFb=m4GPFd@mh`WMCvZJ3#BO zt-I?u1_z;{FKQf-0pFpP7%hcykVYGc8ukJ048^t8;`OHPM-TpoN5S^9KRwOc?nAGf zCGrCA#ig%yUwJ}2{;&VjbCCPBGfo%JpMCDDXD^;TyCF``gD{1$2whn}KN7{~M;m9) zQm?j;KW@wk!62-ADt>s$UjZJCSSimr6Uf90H@%#;tPB3Hrz~7hIU=^QUXx%mBCHzX zldMrt%u~Syj1g6#Lu~^Gi=kGY(2GZ@V(liaDWi#eCWTJwB^hnQk|FX+e<+btu>*uE z1O{zIP_|mcG^kLX^~+abwvRmAQuZH)7oDVqa6ED+8fviNnWm;?_`r}5ZVHOKL>zQD z3U`wU@+1-S2@r0W{D{SwJ|j$?Ag(jT^>GN(+zBJI5*JE@RgR%CjZT^?HuK=olcV{G zx$@qq#q9?+HBm=mtClGtjB+LrAMlc~YNMphG8tjrXz80@{c{}iD-*@sKy~)7EJdh(U8gRNp>Tw6gI=m|i+zDb8?pP40= z!1NsyIM3Z$uK331_DZ$ioV;~v{>JF!-SaB!FY##Z?)kYlPnmAxOcOSZFT8Qy@GibQ zdhiu>_t2|n|L8yd)5X`$0B_ecg7M7Pl+Jy%`|7#pzINuhCzeV7*ZJj(UpoiI>rb2| z;DV~+?`d%=S|j*UAPVycu8GA6aM=SYHXV$3|?GD%O`)0k2kBYA4bku$w#d=wpHx8EH=N(#qT|L|eH~G{;rs z1Bcowo~j>V7fRj!G*h_rh2_9H@cE zIw;E&Q`uDbH>-DWmIh%{j68{_`dqd7APth>PwI*&+yuht*DetZ>VG1A48pd`9nm%? zo1H-(6ooqGqzTG2WLBJ6WgQd3%*-%L1;R*@s#par>-`ZPdBs`E5MycNC-G)2*NQNW z3~NN9(}vAC{;?hS6|?6RZ9(|N={wHnPTzUppMEfN?j!QKv-f6R{a15uJar<+;_Isf zUjP6O}%@Y*?UjJa{*+zXY@Er0FenXf+g z_}S;aw*1`rGndYuCXLT2-&j6<>D=}^z@nfwAi|NTWD%*6tE8}Ncx8#5C&7zh$Qv2!QK#WQSV)gDfWuh8 zYxl5bl*=W;e~{F8V~cP{3`E*uulN{vH7#L)docyHazX>CPJt40V6ZL_Hh0t?Mc5Q~ z5sS?uZAo1qOy0CT3FV}qRnKez1J^ z{E7F@&fa@s?$*leoyTW?bNa-c)70>h!rcD(+4s&$!~T+pzI&b>0EAV3>yb~tH5{8i z`-^j*d;Rp{&(3*wVnmDu-{5tX6EeZH=? zddj1KLaPvBYLbI>2+*C{CU{LBVrELJqOH2?g&U8o1Q+5d1{huhNc1=;JPuxLu=60P z;T(Y%h4vQb8c}Q-3p5Oub}QRpGcZ0Un%g9-l3~nbz$F+H!d)%&s5dN7+y$Os#UoM` zU}uVraHhB^5Jub-TbSI`lUL~v{pLg$IYn3Q5Wi}3!Z4ENImS!Q*fsnD;U;!DM(tM2 zxfVUMj;6?7G3KeOM|LW?6e5v9m6w^0Pn>WXX&%|s&gMz z%O6!|j!QrLS0{e{=i>K`r+6<0VNtxlB2FhOime=vZwpCKt@c;o6hi0jj^=JJ&+RV@ zVK}|DeBw8cBSt}DwHMxQ?1Z%>4IykO z$<4-C3Eer_fyvQ8d^A%{r7KIYDG_F-yZa+dTaqcZSaTf0NSR`vz{wNA`rkTH-1dD= zwK^VB=GTQ`q*xkhn1?j9VWct7mS-uQyby8*d@1CQMOeNOE2626@M@i`JIM&sHT_zZ z)*5eYCtCg3z_r}5I-23=2n{^tfL)FFH)d~F-F~$*nOlF8K+GHQ+$&F$&)#?(%7iV@ z-FpJ=1nmBDbz2`5Snmi`U=+eUx_ur(;TL!fti!QjNB;J*Kk|qsl!?FfFCO{BUo3y_ zKmLg<@7X+COl6pu$GC-muV^tM$s-2K1QRp$jGr zYa>}6%SrU;PTjA^Wgph;-5*{zr!NghYtgIs7%Vw@NFdA~Xlg2`7!W4d!6y$*XxsNB zo>oN^Hp0j#-T!qsBMiuyV)yvFA}pth@#Y~6BZ|>6z+sXLgqeJ1n8ehPh6M`w5@D;S*8&4?a5s9_GAHqR))kG8~ucM_^-49`H9Q+B*>FB&7B(!&19Hrv&r+I z7#B(Imk{=RY6(0#oEC41Ig~#zAtB7ll9)!%B$H|7maN*I;_4Uw$Lue^Dq16|5{Sj-{`t9kz&o0~eRlSv zb2A?;lUI=_S9h1I56{egct&L^@13PQ2go0sJ^{S%3ElZP}e#wC{{MH16Yq6mhf69GS(ooW6@=5_?2_C$=U*5|a)IKT*B=wd&ok&fF2Rvv)o0kr*SB zhTqB);ykQj2EvSpGTb%Y4q+7Zmd9JCH?|(Taz){FWAhNIM?$clit#H~PH&ITT)spg z=74>QoQS*&K|S-28CnSN*~1JLi2A5(JI(o;sMIoLt^-fnGRX+Y$dJ*TLrq}9Ko|la zHI{^-T^;@Ev{gfmJ%T1}Gr7pyNqCB8Izkl!QWeR@c+n9^^EM5yyFeI)*6Ce^9%-WS zM!ay2{@ewF(!iq?xt-A6k<+6)wUUMKaB__+Qnu49kQ)u#vk+TB+l!!@32a*sF3-|6 zZeR5z9HJ^HW`>-qmg za`HrZ_B@%IReUUFDXSgkGa+mP-1Yo;e_{9be0PJRGKFgEuHl^-e^hM(@4Xr2#~q%j z+!VQyKAPG1@PSJo&RkZS>+Ujsw4M0dKNH9wo>Mvo*lC1;moqj~!HBYvo)AVSSC22h zc*;k{$N&kKzFlLPOF!}jLpV}$IhQixhY zIV__YkJ8M8XWMIT+ew9MwRj_T3Q{2uglc6mHQ1z{<&d@Uh;`AR;;GR<*zCl31q&n6 z@=YX0FRG7-i7NYyGN6gI-SIW{;Qn9AD4Addd|PGMd7)i=R;VX{{3@65fqK6mTt$v3Z_xN~v#&c=y*+k9NO zy<1IosGOhd%3~dK<-;1U?1z-tnmlj@LWo@Ic42Ka9uq4eZq#+W&yF^>AKTbIed+S@ z#wDMhLD(rp+s%BmR{eNm`O>AwE?*YH5xY-cyofe}@6vcjEN^Ym#nOcfns96g7@0$@ zPTKZnu)ZuxY~To>gwe_EL*@{Di8~e@d6c8UO|+*0 zZ}3GfuZROJPf7Gr20?X)WPp=ZSsMxmlOn`htui)y-#AUulY7-lTaMa;hw@+40ei$(Gz5>!qepwAW+T1cGFUrdHo&uCFSQNM?Zf0& z>pa6t!4_tOO>uo3!Z1#9z^sacbT^r_eNP%fX?<|^{uqSWD`@D{w7o4S_sn~in*I6Iu2nieeAs+yJrJy_zsAG=(kn^d_Ap0XZkE$yl%tWfTKN!*#@k^T9yz>CDd*jZD^>=4q`^n7PKbd*!rJ1*`RqtM@ z?p&!p-26Cl6VWsGHb`@KHs|ha%->r7^gH8E{rU zi}3aE_DiSNw;y|67>eKRjnS1MfiQ`W5dGMdF|WotGjDH`JLYm=KE1U)+S2)%5UdD3 z9_}EwMn7r>va? zSX`FFGEx=rQfUyZ%07>);I!y;6S{UQ!)14(3)0{)hBw@a9#N9@$m>$Dv+&>&30~wG z4rbdeWvcfgpCvplhSncCGuvk1rJ)l_oER6$1`OpCd9x)H?7f~Pw0WUz8@auA@Zs=h z>~x$ZTvqWNZc`1f!;Zp6xCtR6Ox_h|Y2b0H(&JBvF!Ss=*JQ^0Xo_0xbTC9 zu{uVW+$+KmNGzpRGluL*@U&>fLpjrENe>@vxn3sn&RxAl@a2fRFup+z^(S6V)Ff+eF?#5$RHX&CxRGV>ljyTKrN|4K)l^^Nw4A)!T<9wqu z-cj)77Awxr9MttXOs8?KesX-l^fAdSDD$sXfWhMYJUoi0qgX5iygK$tEnnMd^&?ob z*61+>Jd)c7ZY(R0?9418k66>(P`w9MZk{#JBVtn0M;_GByPd=ilXY6HHOpa=TMo7z zf!7VQ;|)%GA9yt_acc62?EJ$#BzsD$JehWEa{H}wEX)ZzNdW2-FBE5l0W(uY;B@ABb<-Z)=5tA&B<+t3D3I_UrB@|Ot@2tFk@j|v@}6IGvIVTgpu^j;7BFH zbWssCx_y16%Z1fgw^cql`|zy#t-FL^ecSuOdy2Lkp)bA9`z#=HCFO7|mM^^z%hap# z%DY2)?Z?7aZ}pK#pS?GRUn2~~C*FO2 z;hoJ-y>sd0FE>yA^3uYMZtmt*Grsnv%^!W~%1@S_|NheR|L)=MZ9VdX7asX{fAi(5 z&!66UesrZs<1JzM22atK+qIdAz>dtt z5GMXQ=#wiVU%mR|?ykAh8U-oLJoAsI@zL<&=OQIwWZ@9NQK`%_79*TllBKsQ?a~Qe z`!h}Kx>nBOB7j$r+}t!7e`K;AtIFCiKqke8V>+^0YsMrykGm*)aYq?m^_bq^G{#8o z+P&LXF~CWtrfr0&AQ@ZdwkjKja*}N$&%<|3?j_p{YYxOUgw~=mBTOtd#i}J8hcMNq z*a(y7ouQ?UU;}-}T!d49lW;`yN4=oG*sBmD1G~Uk~wHj;;5qD}OI?FTYoP|JT*e zMDEPnoR)t)^Y)J(_|*@q+uiJ)tp`5XoV`m7-Kaji6#T;G5Md+EZaUfq$nl8y`;nT= z-X;ESl7QFz&j0=M3%}m@)H@p|-@bJ6tasHwTJe;`=yN+A9?=jBQIY3;!mzT zd~M@PKfHYErR_()|Gd-b%j=I_eqpq|KH6H>*F${C%iZ$!wm{z6;HG*6q}{q=?s#40 z@z!#;1+YFj>sl-j=KSoF^YH!D`c?meYiT@Yu~^lS8jU%?_q*)l1zeb~bioUH1Yw58*5q_7!VGGDd_%|Pt()XNIfE*P zXWcJR$tk+iDcWagK0>hq@%BC4A#;1YeoG*4->U!|Y`5Q={r;~=Ggk+4IW5n;eT^Hc z*&8p-{PKs@yO(G0Za?t;WiG5t@eCj z2InChce^gEvR-(m!x=0Dm0k#3nvYuF5XdreY~F4nSc{8@Vm=Ss=aI+BS#&qC_wq>o z>0?z0xEFG3pu4QZdJGP#NcN?{h7{Kf1;QDGtl#Fjt-6R4g8MT5bmv5;?sstDFl^QwMH<~&lgcQZc|?X}e#!5LFccHJ zX{FVSbTGg)WLuR-aWF3S_JlAK>qE#egfz@4gz3U!RjX(Vo8yrN60*PH(xqWt1!v%B@hA76f$ zi2UNkFaO`qogT;Wc)VqD4J@>Z#CXruJvMLF>CM*&>*mT(r|T@_%j+yHlLJJYc!gE? zw&3+z$6GCxc%U$htr#C>$t-FAXT36U=wt)O6LKp(4eDu5TYB+|BQpwevy!Zb-pz}( zS)p}Wt?j`inv|P^yKpZWPV_~7;F&Q%lk0xX5qi)@I`Hk}?Y1P_W8Zd=aycuENFjlM6Y)^7>h?v%MQ3gHO|lA%$u)H(K|Xt`#9~7Lc<2vfiCry~9;|Ka6_uWdKG<1bPF;>N?@yZG=AUdS-|w^jLstm~;bBN*T7_Xqc);iQd1t?ZLUr&I7+ z)qz(Rme_L5MoO6Eq#=Z6a(c-rV@shVm$EyO+38GTF7gn}FFE~!aHbdmM`3cY8X+|! zTr<5D>-2F5dm!X_o`-3qU8Dp1)1W-$Y?4jIa#D$~h948IQ&}(lx}k!;b-nf~p6*UK zKMPMTpZT@q`YnBP6lZCjqWwiudKZRkLk;QZsrZWwFTDf5)oVZD-IGwut1gM)J9pz+ zHQAl#_ZV*t{LbGMq$CAgz~ns4n{3c3q6xBhwp5eq9c@K@K`!Ol-&~x#y-t4e#@46b z*t7<3O}>>+IPPA(gq0slNZNe+gwu)ykGp$rb6%!UO2TI zKWrZJO%UkqGIhFAPWM#eHxSl4Z@l(q89ow}9j0}W6{l!lM~mh0n6I>0qhaA#m+)KG zf)yDBq`0)4Ef}YgofcsXU@56*rF=luqkxx3*<;-h>gfWvF;MOcF}ne|^;lKj3TToU zu_gAg!Q~RU7)Ek{uz%W-91(1-4MqvcJI1l_V!%{7aQH-Sw#tJYbbc~;8D^PmIr#uZ zdTn=o?%IVKTw~5N#ZfU_GS?A>$w9cJn73djj?g5p0t)FOTXL{iM-cW*+JI?m17X%K z&%hys*Y*rAhi4Vy{A@^})#2EW^fZpsJ~J!lyq#qLoNtGLclXT){`SZ7H+JUkUW3`W zHx+Pa|H}_Ze67Rprj+mRLY#so=tUp~Rh^3ODVPf3V3zPov>gI2vH1NV5L-+Q_t$3$ z<+sM1#{b~Iya2qve{<{8Z*82MY<)^s&_ejrH#Z2%pW!+yPSFp&^4$mj?k}64Y?8Rk zdU$sOa+_;ggxyou_-Umsql_dm)I1VK^Ghxf)9@vRRVQ6(i*eB`|;T(vK@UawoqH-_Uq=Sh~2z&SQWReeNB%6nY zYjt}-@+5eP)uh#zM2fQn#6Sz6vLo$V7xUJiSNB2P9yj#&T>`7v6&#tw?)CJ zTJ1;MTVoG5I-2#Vf777mwBI#8Hq%*Yc$|S(*s9h-;?I@Os5@7(5?=?Aw_mD?!gF zfur6-n-$tCEN=%xGpY3dOs@G-N5z@homvAqz>@5H9}llBA@}e<3B1|P%x{K*LMEj& zUK1Ysn@5r1^3>%#8{>k=iZ^8=obRUK_gI7#wn_fid(vL#uGM=w64+YJQhEzG7GbO! zhLGa#6vFctUe=wnet3LvZI$n=c>jgdd^|3X(_rqSHDTHXo|3A)ow-+b`B@`BQ6}g7 ztRE^9h=W$((hnVP=y#8LdP_-V$i3SUiv{w&f-+QA`(pyDe)jwu{lco+SE%(PLN@g< zt0p&*++lMdpd%AM!5ULZ%^&>d4UW@LyfD$Pvw-*0Hw87MbC>nUuYUIr|DS*JC4HT= z&Effx?`8&t#9`N%IJZtlactzZ^3q6~I+bTeDA@9xm*i5;lg6|- zmBvsuQ#sEF`*{5E2y=qgavX=S=O+&*&tC4xW_a?+?}sq6v^aj5FMM?d=G9d{MZU=i z+3^$@;o6+)=N$1BQh997-zB-gBNF^74ibEC6HKoXVTTYLKU9V<>Z=K~UK84!t|L+K zBO&>l4Or$%3O4z6*k^1#y}K2WdP@l3*ik^gdriHt4-m(rM#u8oLfBA4w0dEeVE1_Q zs`|p7+q--u1pm?B{+q=&{_4Tkzw_{mTU=X-U+$Cn-6J>5aek(3Y*mQ&TqDVgaE`Ek zWYQI3rUE@YI-v3Nw}^qY-wA=8u#jFD7Q>>q5@ijqn` zOAjHq?hceEiajA(krYooB5Nk6FZb@v?O?{z1~@EJ%*_0=*B9D7{)U2&&3cWEBedhJ zf2UENqIo)eZIo`LpBr56z6dE z1dJJAk25pMNp3}+{m}Nv)zhgjcZb>Zp55}mQPWGDwV~FYY2yc9P0>7CWy8pw?Bvex z3vZ6>;p&XKOurRgy3Pr!GPAjmhnx$J!XV6_D!xaq6T*HS)^Orop0Q_R4rb;s!dknq z!E-{MCyGfUX~&N5o`!jdU2bvrwnA|Foup$fSIv6=P2c?bTO|EOhT_Ovaym^}F@n+JkSb@zW0ABEkyHZZ~eO6zo7!JjNX|1!Qy* zj_-f-OEDj5<>)+h3ytvby)a?@+BJ^NOV2*rwERs&!uP=|tyVcW!uhp80ZxY3-hwga z9XHTY_5<~_1zwtykjcKyS|dra9{Er5$*eGk@(eGUa~g0ve3djf*m3aEwK`45b%mHj zkX6}+?3M>!n!xcWoZB{XkINog4v_8+Mc%@4hLF2<;dg?UF?xzJx!ylrne%KC6bHcv z6gvu&OI5mz((sdEM-gV2PM%>m%yY$Z=L3e9*u5+Mu1&bVf%yPp6dIixWWQ?(uvoA za48L77zbl+8?L zFFCkz40Zt3aW`Iphcj>hnBy!m4#CFRw^%+xmj`SIYX@$H-Ce$iY6-qj%v&%a*p9)% z$z2bhhaKtg7QYB*cyWUqxmaZ{x>qy1wBfbWdjH20?2RZSAundzAzUJ#d-u*@;@sB3 zJ?|3M;IM1k>`_*Ni`qG}uUeJ7H?GSLEGcf!@<2SC3~#nD572$(kq%yc7~X>(WBdA@ z;PvQ!Yi@hWyhPZs7=H7ROOre^!z{%rc)T7v`4qyVG`hTBc@h?Zcc=ILRn_$zgB^DD z^-!FOp;8x95nee(n`l3x9-K*zyuz7ltAGVgeL7WqB-BoH|E%zr-g9|Mxjar!l`UX$ zMPgtpo%}E|!mi{Ko|$exbp$uj>NFjpbrQgmc=?6>Fidyj9G>gzYoGo3UqAHvcR-H- z>hKzeUd3O+fZ7WNigRPwt~)XYeUnC-At5${*28;v?N5X`;=$+0PM~r|LSk0xFT`@J!@= z=+*C1fMP|=_-8b99_9*bC*U2&SvpS9yxR_(=AT#PUw0J0rR1dTa15mSw`aRG4$tw+ z4IQ2d#N1+0U__GoP>F#g$^!QN(79d7uxWuc>ynCD8Xr!`+X|*0X%RD zUhfI+-3A;C}iKuK5T3~1nePUp~pg=-Pq$gaPOD|ca$CY zXynb^xuBW6f0`nfkG7}GGrYMlg>5;X*;*IiSAY6mgFTEeQ?1!fgUSu_@RYfQg!#6JlXDOn@0D?2 z7IX@EIzp4oCcr9y#%r%gFTO&8K5AS^E^+}J&>~`@Eyr1DNGEE_`6I&GF5;b6{l-V0 zYNJSBEm>Gk`Fe|^I7YsC^`W2tHRN)UMdCc{gR$T>j}& zzFicDwELlxhJ$xSG+&4&H1wG{yO|pfUXO@3m`!H14&O z^N&Br_rk+_ZZMuNsm!mA$Anin4OEG<9Gms>+qTpbi>X%>=7(58Zibf~*o=sdAOak4 zIXta|7guqFVkzwmK6tar*;nxaJ7k6z-=m@ZO8q9@)qAha!DeK5(LgWc*;nnoB|i2g zYb(jkm{=|OQFyajQ;?%i2}1VpJkmT~7o2DJ{&;u?gc(=5F>}EaRpy!5T*&0+0w$HF z=JEl&Y?6L$N%7bGl4s-d0BP=F*#X7<9%Izo?Mb`++GuCuy5-$FaW zf+`>NU6TF@JKb^VyI}u|I(#F{Pc`5-Vi~w8!0~1ZAaR7|qi{R!6zzy?x)o~UERDRH z#77ClFSs011wNaAzrzjs=tX^{2n&pvPfq#afhE^@pl$DQFC~Xe<5c8+`o#9*I~z8p_&3N;gx_3s%W5oHSVv7!XQi~ zufq^+$Ht3TG9!t57+zfQ0Nw3D2thK=zUMtMxs+VFQsCCMo@9qvhrW0l!DLs-h1qQ(baqh0m zJX4TohM{S6>CGaWE*h2DbeBK)u z62d%E%#9yk0qi`4wiDtnFU5pop2k00r{lCQsT7g@ujoX9(=`E_Kz!n-FD~A=K>QUB zpci3R=UcGS88!Z8x#LdJA}cPUEtbPE1^9x#fKlJ_pwj_Y^6BL4sH!lXz7969+AiW2 zTKCKmwXuX&M0Ox-+{F<3{I z-p(MeU#- z;`O$SwoThQ+9I`alD*(g)?{0wh~BKPh>X4VA{t<19-nc{y4yj~RYl3za3BlD2cfwgH| z8DTG$7tXdZUAbYNWUnBa`OPzI#xFN+aDSzDVcu$^z=@iIPSg}4Ko7Z2(Y-F8dGqDk zYW+=JTV3B>y#DO`jWHDHaLds*!mi-;Wpa=!UgCvUVX=5G7J6~OCfZK%E^XX>ajr&y z^DvUSxYk`X)N6l;w_qR@@=-RtqZ zI7pnjwg#KcZ^TpFbrg|>_08_b(zA{kUS#kM7LEjf*%Me|yCvMYNro4fFbFj9x({v;vB2b# z<0mBhOc{2u&CRimBnL}g=N*9D3d=mZoYj(-T(}qVkAW9!NuHD3BZZHF*PUiFekXWs zk~X?{*T}i2aVqzOOyxGX%=1c(QpC^GaxisiG8tN?*xg~n!R#gc^XOPg`hr&QB(@TT z%`bsCe#@a6-g7xcEBLNW^mZKY$d&$4JAGfwPcAh@{MCk6_;P0#ash#Yf?#l}18RIj z#K$t!I>_oZ)+gr_puv;2W?w-w4&mg6TD<$x33B7t7t%x9xN6RjqGUK2$1z*@$LU(Y zMmUZGdHiaN`d(odTG@QC@C$GJ)ncz7a_BDW=YP#5mEv#QJhQ%#NRS0j7*y!o(O*E& z1ysb}16qN)I7K67eu=_DyIs?nnO4ydNpyOlSwROBR+)+QqSNoNnh}ib9$tOmHGRli z815hZ0_YYWM(vm`geg4&$2=A$^!*KdUvo7F|~ z@RHo4kvDhhLbk^R&rg|quw`CCYJ!T@Om+{`isP$dfURLpXJ6|tCU0c`>_`N>z-310eF)B80}(fmIq z7(GZdq2!QAsbqWxk|Tpv7C7m#d{YP_xS$k89*j+T?}8kH1F1_%r=7%<quU2Y{ZF*?9)|QSylO+%&OC}IZ`ID*1W*_a2we+JVee=%V&7KxUL`QsO(nu3a_<&$_yN2VxqP%4 zlU2S+nZZUdn^VcOPj|3+eZ|^I@Pv=@l75f&tX}DAGHa4G+hZ4;dE1W3WN6N~GBZk# zKY!0r6@gfXR~2x*3s%e}i@rKIKqK%i*gk=1Dg*WY>X*NNAo6baA3*?+Rqpk+$YIye zDg4!zR+LrptY}!+Dj;&KR4N98f#Yw2_)LKmjzmC`XAtkCtCT!n>L|S_(E zr(^b*&m~zJ$6s!>xzzbH7^2xbUxil=rfL^#uANBxzB6h!@oVBIH~dkp@=qv0P+3u! zeI=nyVYha^3Yz=@(Ky9Y(py_y=ge>ih7by{0(=Bn>Nv0#{tC_ds_Hld)1-qeJ+%c^ zkgYInW_=%2^^oD5P2sGv1)>`d1V4Q0KG<>*f}dWCHNkaxF4nxIBeb z{UQqus#C9(p^}@rQ}2R}r$L5veXA(1<1F=Cn_NF+utyXt{XV(B*((rZHu*FBvI_=b zFm!$kcO<>qz_MvAsCA@V$+L24MQ5?hNt8pjzO9=I(2v}I$^U()U;(E~G-Po@;%>xH z+*sTVc(auDKywEI6TIN&hP3T`rFr0$dlbCph|<1fd@v)4YkVfu99?lly@`w73mtX; zkH=0zu(gm*5hm}A89#sFbE-b+l) z!p)OFPQp((F78xT*fq0axel`UNY1<=>EbwxH%j&K$*8IG>I07jodQ*KTlT*K0a6aS z3CO@gfEH!2nO}5xdrO7-`6AzvS1Y5gjF+&;MYPpTQssJ?t8ff`m32dCcEJkS^~ZpU z>BTQ?d5kCrI4C{doCe%7RS3(@aen1o8f<}A2;VF}v2aRE32{Q0{F&feKgn=(236<| z&eZuazplUVd#Scso zl-OhKEf2y=@2KjLH^^AwRL0rD1&$H9yCnwa>fYPo?c{cN?ZC0*C*k!oDi$Kdum}M* zf~RyU8Ay!pf(NoLS%~y|oUxWar^$&nda37X+Ol@OJOf!8!CQyVfz-@`aG1@$*m<@7 z*#DyvZ`%IyjkhzRz`!cB0W5n=z^OniE(&DV3B_P&2D#(V>CLQztfFwG+_0$_O70Es z6`BRO6KQt1oM??d;{|phKbWOEGWqOqSrqSlsld$*JB#~|;+G(PP)(VAcg5xxcsacK z^Fcp-RCpDwI>JIw6h2qbeH8dpbA_pR?N@<;xR!GSMrz=kv zCgMoJ=qTOUX3DrOLi$BWrxp@)5VpgO*Y?;Ltm>C3=w*QILadFj8)3H#F)~B2&O@PV01hX;1lIjI*(?M>uJ)&O&?Gzw&}O!N_b9-}`IYiyzm}qM zz0#$=<8n3EduJ4Gcxn~1bVn}^!O*H_%Q&HuF$%Aum8XsPEri7{yZHS(?SFX@{N*pi zS$JgjjIB5&8LpkLaK6x+qnC9gWgZE~K57Qu@N2F++NG`DBB83%*WiPz7+w~LrB~#w zybBuwuPIoTc;H6;G_;4%us26TcULQ+jQd%zf5ttIkNP_Gn&34i@vh!QC_vDl#)HDW zP!fBf|62kTO3t<*Kk#$`h^zi@4kFV+#aJ?Cl7T}4Y10J{RWv=y4oGr zZ?1^%6=zK)4HZ4PSs|YJr)$1KC;igtLThEwbj<_A(H0vp#s*N6`>ss<)hncLf8+d0 z!4yc@1@j|~`sb>A+6;hDxtvbdd9uT?zHP6HbSPbEHq-}g$7^_(w_hp(8eY4E8T1-; z`fvdFRe1`6TV*Llae>xd+I-nvMbl7%s>%H(ZDA)a7q!8}4%W#<|AQ2`uc^mQu00w1 zGn^P;0Wm1lK`Z zpQ1Iw9_BLG@i_HdRh~SbKaU@8j8wU@=lI*8JEhm9VEgasj`yi3fV>aJHF*3y{PToh0r6se%GHqp~?bKOWUB8 zuBij6+<8)Q86`5K_@xycp>P8lQu2;1utMSs0 z@&sj_aaB_7xIFQT26(3$j@02@)}jGu7qy#F+VNOrT!pgZhKJiFx-;Xq(GXw7InfhW zvDY14XdG;Y9h{9zZZ=L})_|Z8{k{SM9pzd~t!?j*{Jgnk4EQm;9$-w05N0EI_Ihda zVz7nS+y&b|l^xO_42o*No6Ga*DfN=E?p^bC91e7ZGp^$*w7Jq&m-JXajMQ-!Pk!zs z<~|=sSUv34D<@TE{|gr|B3`twJck_zTwpQFhMGE?ThZ;xP^ORd;z5g1>=X}i1?a3+W z*EUR+bbD+Sr7ekJ2(c{!vo~Gc!dTvKM(*}U?(jxtbdgVlN}tvUYdGV98O;dWhVXF+ z=gYo+mj`K!-2ki2Y~{&0o+2)jOK&RXvfCwdc1CTwl~{qd|0{8=6#7;vw7jlZ zjtnx2eE?YT7clv_#M8Y3C{PQliiXb->R1T@VEIZ}aY2U+fY!rJ!>DIP<;-XJj<(J}!n@Ao_Asp}4}yT+K95h39Fr>9Z)IMt6JY*YKVJpYutLb&&Zd4yCVEL&OvE`b$V;na|3N6dZb zhGKnN8{sE=<*tgniLHb-lGUP50gN00`e zBv;-`1-S}G&FDdM{o)I4^{l8kUR3gtwz3M+2de9vva^)Pyu-zduYY;IztG_o|3#6H zs!H&=v4bgb7OuGzpgG8@6K2Cpg!NZSyy3L=xrUdoRR2o5>G*Jm7l#ZWtR4I^O#6~n zr+BwZbk^+HcIGr^(Y^XKj}l}%AxdI^fpK6UT( zju1#K;PCxUjET^VL3YB~Z+a4X8B@CeyuSKPTfQzI8;IdenQDwHS&$L-pu(>vd?1WK zk2a&5ok4ktcjPDatmp`D_``(y+l1NwFQqbG#s0$DGQ_{3u+L6?I;g|L1i2LE% zk=m)XVt0jR_|<)%Wt9)JvVjGkWQ`1n7cSgsL5n!MgdH9q=xuv*=_#_hHzL~=<5ykV znjQ47F#!-eQg^NN(h=xx-+P?A&SS}l?AR{t>OnZhScpGIFuX3;Mm{(p3nl~JPI0$C zavw;SGpMz&46vTYP`nsFa+?Pc#*E{XjwdAcdr)ZDjr_THXL}S?`S-7Q67oldbqej5 zMAQUf!Z8W9lWM*d$d|W*+Rk5DuGv)Bg=G@jLRch5hLK9DMOj7X4UgGd{bZWTioeRD z2a*M^kgOD!hScF(dIU^q*lW+rP1~TaDk$@jxcvN-Q*2w`mqN1rdmV$L(|@@DXk@>z zmh&hFS;Ol{n&9hd)I5XGu_=BKUg;!o4|wCQEDEb*I#{VJ9|F$f`YZuLT-}b{ojI=C zebvq|d7#%l+RzzGObs8c*@oG30*LkZUa&LHkC5(Se1;I0>%DgaY>CZC8Dsi*ZPjF3 zjNH~S-Gip~>Fs7mb`b2Nme9`%_i{?lq?IbgAR&ehdMwf9_s)KS>#qo z1ujQb)qzc7B}(e#84bc8Bng-3@q?l=YCcj~;hPFYtCSSZg8lTgSr!uUAG+`6sN&d} z&9745I&@0f97vrWL!!60j;E=-{5)g)B8$*WUTw6g58ceR7POGTKjV;gJQmsu#|kc~ zRKe~waw}Hcj-9q<9}RKZD2bkUV3wPuk0sHG=3|%`FCU|S-9_)n?$@3FF+Zp4^qxUs zgRfv~!O3S_w`2PQc$tdKMrPI4rnJFRiT$~Pa34sQGns3_V{{ptGYW)^S3>JF_QXyJ zwS&&mSkJMGu_fsU6N|BmXzQGrxD3L}zPL8O?1FXV1p;yC&4(b(zNT+E?+n$Q7#XXIC@{yv(^5E~J=_ zZTXv*j1}~P<_YhWN<+70HM;|M4d}5ObUkQ`n{|b#H7QXW&94GTCM$ZC)=Qgg1!J0sn{A(Q$;@*tPtnH_#)r8) z36xy}y|{S{J0i@V2Df)fQ0%j4(qlf?%`CCfaTe&pEOitmNqR|T3u*uq zcOW_L@DUir6mNJ9SHOD1k?sph{g-w53xSFpjFEaGXDLQ#)m=sz~jxav#m~ zSoWXu`wjSgRU2M!ZxeZqr}nVpoe^QzXH$ITxJ*(_D=u$}iM+teO)eam*_IO)FD%5< zN~;{ya5-G1Q^2~|=V{d&hO#v88ahyR!mMxC7KJtjolzUZCO`s(qY@ph`0$i^X0l?bsgf=v~J?PYXlHgbTSgv?$5Sr00YCNDALnl3F+d-4Q8s#(9w z-n9+0+2*$+Y>JsQu4ssbMi@eM_^kg|<(eS7slPPT9dC{6ENcnP?1lNuK^&4GsO@BB z&bS1WkqJ9hE<%N5ogRzOgyz~KV_rZ;i6UmPspmlD%&3Jy8ghSA#KAt*993z{M>pYH z_?0o^{5kw~u2CrSDmhoU=jHF$-_AZ?zP`MC`^O&yP{_^ElZggH$5y`bx61~3yz>q6 z&Zrf^fB&5s_R6wwqN8$DT#>7z$MUgiDl5TeapMnO@$T4Z-ZkK;R$@I-WdouO&2b^? zv`Hq#nr)lW2o4A#BA%bV=&tvePU+Vd{pN}R2-|v~#gcB!WRh*09xQ7kZE#GrU>3UB zk!|@@dKFTJjtpllWOS2Y3$;>%Vh$>Mo%GUeu)!|Z2s2B}o3AvtksdFTzz$dGaet%a zcSe2lTjyHT6dI(puv5(HV}(>ca-Wa~P-2ZZSfP0XJ{60p$$c{`(7+a8O?|179@VTf zE*%l;*qJ(LmNqudV@pdN^r(LAbE%_VMo^Y*WbcJ`?sId|c60t;|MS--7LT@Pi9fqp8 zT%v?YiQS;9!r7t|g}$V16?q@j-+Q62MSq>#c9)AIA-KCZd3yJVVuMF#GbUpmgx6CS zA}nMwBX~llGQf7B+aI|Pq{|u3TId6uTDsHBoDLxsNLD>zPonBfq%*?QDNI zyZlW4OjLdI;lrEv@B4X_*-Y4VMWSl(wgru_{pHPJ}pc7nW%`eOuJ+kK6~+|xX}#*fOSv5gOBhig&6hdhZ;tA{lHzRM9KrRtlxDLpt_|rDXO-nv zBHdyxw89P*90$c(ajKYGVVWkcBXY&N{y`o+4JzP*q1YcgU+CKulJu)q6^@}>QNHSP z6V2un(v528nwzS>KY#Ym4{yJG7s?wz)Qt81{5=!wgr%9kAm zZN5UsqISgeDEFef3*2eI@Pai!@?3Dc@dF~;&BdllLI7zl|WGp+MHt>34q;Low;k<;(aMISj zV*rWthG%~L8(Dy?y)eJGtT)2TzF2WhIDn7XgdL(PP*=)sXJE=`LhUHJsq(KE}`^nxFmS{jZ0^>;3-C zw{LI1eLK6pasK?KKz=#?uoo)1z*f6jenvH35;-Chb9M9c=WW5u!kIxW7W>>HmsMa^ zgC6d|YzJPNu=-{#)U!;qO>@>l%W*CxUhAw^^k6_BvNl^XA!D`HjD>QrQr^3um$(7K z)R%kgPM&`4#_8Q3ZNOxP9r9?*@K2kRvfI`z?DxB=kz;cgu)KeaJdGtEZU6tN?1Mdy z;t_=NGJZ(o*^+(ZHN%CfFa)Fd988u#E(rK#)OT}fl z_I++r^TogaczXNs>~Kf$h2pngzi^%1?9VQ*e!aRXkUzsF*URz4W*<^V zr1CUUvUZ**PnzeDQu8@}NoC*AY}e#_xjVdGCOft@(0qFeFG}otUb`5u8_~Zj#H6hI zk(aT)X!hlYLw`i5-;tOh#7}JeV@@7;5$L-6bIh3FwN;+9UdFZv-ALcW$o19DjvV`Q z2O*=F1kdDyr3d)nSADR^Cu3;{Gc72Ih6gG3qAyERk6CNW9B#{hTuwtH&Df3H8zE+7 zIXI)HQ+CIMWcq-U=R@6Z>eG$hM%InRMx~rtxTV}&ceKe~HC*i>Rk55l;FVAjnxOUgKXV-@} zUzI|$5r$)PcH$+A8z<>pV5hI{=jjf?#%ti? zw2FRx*|%M~cS;X4jyD-&cx_TV4PiSTED^eqmNP$H=w?Um_FMk{z?)%a;0PXOFBw!H zkp@*OvP{UBG}=xGXQaomH-vi^+d**#*w5%Nz!zP6+S4|cyKB;ErP&0;(-%qNoSEl%IM$$5J>j$-GBd#J0WUM-b>Xmr314RH z6yCt@CX}8@8md);H*;>EG)gS!BD5z!P|Bi6Po10Do;Z&gp^S0_>)(#Zo-R&0s`wk< zNRQa>A?$_|#-+OfHUsm12434{o3U!T;?fapXD1gqz;>bA9~t}oB%I2OXe~@*^ha0A z5_F-DC~I+2Vay&%f-vLC7!mqBpd?coJ==zGMjeW6gO+~mP|}c2J@(9`xElzAj99DR zV-Sl0P{h?i7L+M~R^|-OT>eOXWJTM0^+Q|kqel_BIPLIqQz3pFPZ?f%mjTsWycg{L zikr{xuehH5>(lP`{_Okrm-{^k1M=?n`t|j-WAW>IeN{v&AbR$2j1DgYXA+n6>~2CUHLpjp8=`@0S?)@H?3U4B!LyAL>#>mKu)>tq8MPhW?(=B2x44Vm z5#2G0I6Q)T?EUV_11HCh4Hjg>a2^CK>6b^HQVgEL+nqUbw-#BgTB;wp8{g#&Dzgg!`Z}QiM#1AN8Kqu7u$%zR@Nj2xqpl3T~TLw597;xc%MT zi+{ZrDS*SVQf1B{NfHZdFsLwkcd-!{y3lN*ea9V9htNrrq|L&=I5mlCLKof|*Y22_ zuI#VOHK7(WXo7Ox`F_cP)yw@YM#3+g?)LZCyu05!7Vq}g4#a!~&P=%HExw^))@(C; zrXuiCO%v-ws{N64<^*`%gt^jmRj{V5mmt*B*RI(2oSQGNrty!PMGvZwmxZWD0Xnn3 zDD-8uy|nV)1s-zZIThmR(S6zNEvM|xvvy{WjxuIwfGcuY?rs=zY}*cmyBk~Xrbd>v e&2=qzV7r`AMDXb3h#-zY7l#*yV92{=cF`TaORsliy^KflLm6vlwZgAi92oY@YB(#$+#yI`kfS+8 z#P4#7Z(?-r`&L(Xz3S@f?&|mY^}Lx^j~}gHRaaM6eY-yWtL`^?Wmykd@yGtmmi6dN zoHG9!1&jhl0i%FXz$jo8FbWt2i~>dhqkvJsC}0#Y3K#{90!9I&fKk9GU=%P47zK<1 zMggOMQNSo*6fg=H1&jhl0i%FXz$jo8FbWt2i~>dhqkvJsC}0#Y3K#{90!9I&fKk9G zU=%P47zK<1MggOMQNSo*6fg=H1&jhl0i%FXz$jo8FbWt2i~>dhqkvJsC}0#Y3K#{9 z0!9I&fKk9GU=%P47zK<1MggOMQNSo*6fg=H1&jhl0i%FXz$jo8FbWt2i~>dhqkvJs zC}0#Y3K#{90!9I&fKk9GU=%P47zK<1MggOMQNSo*6fg=H1&jhl0i%FXz$jo8FbWt2 zi~>dhqkvJsC}0#Y3K#{90!9I&fKk9GU=%P47zK<1MggOMQNSo*6fg=H1*%kF#tM$5 z%(j9o6AM?_4pWy=z$l=h000!(Y*@kY#wye}xhY~4FbWK!01)GxHm!i$k`+{9yh5C1 zkoK8li~>f1lmeg$WJ!b)E6B2z6_he%J^Xa3=9mnlfKfn80S1xCml90Z3Mw?|6zuF; z%{7G%uL4B-b9gn-?HRCT)NqtUJUdoUXr2}5TYhc))M$)u2TZv`p@25Bc?A!J5+ynT zOgJ(USvg2#EOwj|VKpu@l>^p!;lxs53;J}Iy<$&p1!ALEAYSu8c zvs~Xy>9JQ}2sBF^I`%RQ(m>$AffbQSv)Qu(O$)3*-*oB}8^aojHV@KUbIh12Py)Y- zijJ88Lp28!FdR4_X_^EQdx4c>eqar6IrS&*9<0Gbb>1AjuL@Lz+zzY}S3n|eRXkn_TU4a3qtMstiJ6+icK`usq2rOqI&5IIDFR=E- z(v9H_Mi&glm5q&2S5zs26;w9r{#IUpj4dDka5x>F2A-Y3s^792##`=JE|jUTas?{j zZ3I!SiQ}gf&jDWn#svN#|HPjHs zSw7m~h#+KflusWCtdUyQ+0(6Meer6L(VSuc1u7$LWEBn2sX7mdC&p}?OXFX{WH2O` z0;>`$dv@M<)~QaNs+x1@C@?bSDy~?kFZ)s^47HqDKHzgm$tSTHST$Q#d(vG%@7#S6 z*_>3VK*fxWxH@GQ_BS(pdS%Q?qdg6U4wa3-+84`j8}AG2V{3mkH)rPxj2O7;tLH5r z2Pb@e#IfarT**Qfm3Cl_p`}|Zc4}!H#5ZlIo~~MI9G?ppKa+}MTN?TLY#s}&aj^Ub z^WHVb=PFEQOKL%FR3{mSOBO$+@*$ly^0TO%39K=A1}mYp1Kyi z>Nv^1T)r^ca%Q!G9T>nFD;SZLZBhpB`*IZ~`J{EAHTrV|WPko&Oy)yq4i1_C9!vdJ zd;K~2O-=VPgnE)`s=x1}XRD4g1f*BLbU0(guQZaC!@ewicJkNT_a&**X0fxO4*PN; zCiA3qpjFE`0^;L5HDAR3b0{CfSp$9m`WnK|xbK&**=(`bGc{j?i9TH|Y}Ij+fNTfE zt@&EgM^SO;=8X0M0Bj0NFYK4E*=(uf<~?*>1F;UYYB@(hynwXol8v4xB3B%`S)*Nt zzNOUC3uBm*(-E=ncAeK@qR&+eTXmcS!8fRP{!Et^69;X2Y?lI%gg@rKh&mgDR=Yqe zXPHB7r=W^tgIBv`-Dp`2(l>dzmso^}hN{NS*MU|o=K#FHd3vVW#G`z%;Tm#EW-Vrv z>oBJjCSX=+dkv@DDo3sUsz?&HQnGBdH^{U|uH;9ZWgW-1skjca#NwvdZL-QMPzzgi zoFs5buvs6!e5Emtt>gr=)B1oY$rUq$bHZv3u7byZ_Bw*7?+F#N) zJ{T{ODUNO0;l+$IfC6=(Rm(YoEfQ=K55sim52{F;R4W^(60=e=n4QW4q!TT}Aaa`H z2j_)l8{%X83pt26n_BQPqSZBswRPk;)IWbBlT9wIQE*mQ|y_k&hS9 zTds$oqWwvYtjs}#N&{;a-xl$YlGb!4J85&cgJ$1L#3K3@E`D$Oj*@fsE^!29Io3_t*mui)2f*+5k? z%5N(~BRncv&Ozz-tl(CHUoTk50-5rQ^2&O`%o{!H#x5my)sGNvd3FK6+hKn_>!NR6 z+@T0V*@jn4u|-T2jz*XMKS>C3Q==nsn404zpAWwP*6es$c-hFJFPs;mGo<;wzvzf8 z1KxZ8=1BDX%K!l>Df3>P>7xpAmzrDO1FE)UUWXP7ZYXMy>%@=DBK~g8P-Zt) zd5*Oc^NWF+;#U!fJK#5l0$3?cioa=ck#qir`dDR!$OLpEr&)g1;ZpuN`tv{wBBx59 z_mn#T{|P;Q)#Ngw4ZpefBn7`Z@KOe~!>+Pqg%k()@4s$tFB3Z{!XdedZ3e$?GmOa2 zbjPs}g4>pdy4Vm+#$SQoi)YBPLoQl77qwOpBsZowwr)6=?!Ir68*}8wS=jOotxCLj z)d%Ld9O0lrf)lR>_G^KCK8Rv5Cbv@g{A3h@eWwweYXm30=gW`4>~INu!uSmuv$vet zU=e}%tGz}#90T5C|8p)A;l!mg355a)gmvIm@;E?dRR{-r`0GhU$1<{%{JQgq#q#8t z<}5knghQOEP0BA}{9>T85i28naf!U@5WLG$k=scwgCr%%jYdTAx`+ZQiD{6jO zc|?SzV+%Q5iWgIvC`Xh=wm*WDnK#@a-1Lks}JU2B^5Y_^Xe>wbKvz|7becx%XY#V^doWF zpzmgDHM_cX3P;g$=wm(=DL}@A+%)eAmKnt!oxL-Q$jz8DGkASFQO5v*n5i>>)D;qR z_^KK}Pjg600a8FNh|(xhLzzB=F~vFXM&u&+hF@EW@poW;A%izFW0mA*O=KAwD=*pE^P8@_X%Uv3eX{POggI3cI+a8HM|6AZ6h&Vfo2%X;K;rXbjr}7Xr_C6%dZos>m`xmqOeYYo`n6S-NWqk~ z<;c3r>BLG%jpV{e6O)uhG3i1DNHM<}MaG$2-ZqCU*u?6GV1eIJcM)_Je4>?*n(>lI z6X_IaWOhpmkja6UQS6YZ2;myxh01uxj9<pTj@d0KKs4aBdGI=-Jep)V1&HC7#&myf|M;CNcg42jb;}sb6>gP$>0}Pv zhH^bOrPB%!!!PAG48A}(dWB`jPO&=d=pnXFGksNxbG+0lL7eOHcUa?#J84Q3DnJTG zXwm*525!NbYp&T&&!0hYEp05kNa_L|Vdbzi&f}b;?vKeGKmk%PLW}m-G{i^W492hR z#*r8B!V1)>rhqlf$IV#POr(1peBRDsI%|%V6(9v8v}k`dBX~T{!VpeOp$pUrdvDwH z&!`8mxN`ZLlueUxk)&3}@@5>IeR0HAmF<@)U#tL$2T_KTk$sr3<$bZ;85n5_HUO1n z4=KJzdL@f**S+K`r)7UxrR1UBg z@1LdlbJ>~jpyfw+o$ZWe$vEAWIO17G*cnr`QUQ`cm|@Ge$({94JOF@0AF@CEDz8c9 znKP+%l|<+U_K(HYR^DJ!p{@cX;+HckI`Pix$sHQEf{AhY`V%j&1`VcVUqtI(r3%YU zSG3Yng-tS54XywgA;0Azs+>yA3KPM%E_ea^;McACBk|ChW!0a|)L5MYc=ijQcGFvu zm|W*Y;e&&!lIT9a^}xGynw+J-zg68uG&N1E0t4}Tz=4%0j`*zy-X?y3`V?8v{NMW% zJ1kAdwG~K5UYNgHwS?g@KR5$;PmrbwzI6=i;&Y^Nt30Q;5ml7n0atQJ7=I5by#Iu*RC2=Fb11)< z)-E-u!C{6#S+%(i_+6^vf|)u(1uDm_@(OFZP`M%akn&6C&%r#MJYS!U;AIGlAXkTQ zcM0$|%*21&9NFMR+$LLCbXBr5;4A}3?6WC}F?w+!j z5qy^p`^DRvf&E*mB>o)Ch z=6qJ6`Iu*o0|E!S4K-h1kzDQ{#`*IT6y8&f_AF_J&%80V-#sgY;3^)3yLNM(KK7oe z`AX)U?m!c9uo|Ct8Ah{@W6K?K*rw1ky~d;AnksP?Jr+G;Vvz;7v|iC?b>R~e?i@~8=Xob?}QBXL)p!mh)tg+^+x)z zAbk90_~y#9m*6iZf{J&jY{8RVrchDZGt_Y%$SU z2)pz4D&V#4w6ckuLpf+or?>)%i(Pwy$6q+)FwCNld-GqVGv^bWTsSKyUuw-Qww`=x z<;g!;J^3^RR%CV|1uw@rESW~Q`#gQyOs^Kdj>efx1?V8y?+>T=fQR5?o^$-C_H+R1 z*dJUqDaFq@*iwE^yxji1XWu;aM+tcU@Y&VV-)KMkbbEfj&9UW9>f7P2{XBi(McAFp z;c9vig?E0wKZSnb8}8{B(lvA! z4Y|bJxDpDC3BSA<0Qo>g;Tg|{q0Ps=#_=L}Ig%7%aSAO2T;%g&+-bisA>@WXbh#W@ z%%oUjl4%7vIAi4;1cWKM+YM&Ny`|%~DaGQwk<&M@2tXSs(_f@|`%V~wvO4<3q z;^roQPd+`ECopHMuoW9K#t2h#1$coiD3;(AK^u%;v4#Wd$H0n^DmewYoKrXwsw~+K zEN&fPg_q61f=wX2=<+y!Mu)I(TZNW7dxWh(F2iQQxS&qo5 z4ys^Qq!m5`mTkS{YHM481)Cg}$C+QWEd|lwIZ9xA4NEeqSlECxxwALtqnL{VlQUX! zdMeSX18F*{rcuqO74R}(*>*c#|8ys?VEzPvJm&ne=7kVdL#{+?PLhGlrpjy^KJ7k! zYu><{xMeX^8H_nwuqhhAlx#CMumV+>l2(Q-W0qm-hw!rP?xCjmK=3FkUvoX2PA?*IsyC;6@$4}8`UPf-Xjb`tq z+Ic7oOH@ipj-=8lFpfKC^(g7uv2Bgm!2yP0jpPsGFMN zrsb*3Z$vMg(}9@f`1Y6llYsQMfAq}E*23feVv zo1!T>l~B#070gm#mCSgJiL|MsmT|M0Ep_s>kf_wpBi^vX14UtpH`b@pXE&jkR}VDcO#o-9)&l=)el7NXjV z11nHf)5?QvGSpIdlh}gXU^}#}1CQ{K{EpRl6VXdkyt8E8Ivd&c(iH6G*@*O?d^?QV z0=Z+=ul;QdxXU7xA(`IhK&r#3gla@9@RW>knx<6*mXQl!nK5j!-3raK0@&sOrdXff z{T)REoL$7Z@2euLiL+Vq=98GS7js?7K&8@vr)csVm@}J0YYwo$R$^8pH-s1b2AzY7 zaGKw&OKI{aO#u!dhU5a?plt>2 zK}C4dhNbDRjsiI_rgx?BEQS=cf=$sRNLi9Y${h(+Bsr~cwvq-^xq()09U5~fw#;10 zZ*blqY!o;Q3LrRUA(;R({mOSQ_bIiP_!6fes`}x3C*Ua=Amt{}iX^8M4yTnl0G64A zZAdQQ4O&*Pd>AgD&i&bxIjjoMn7F5BD5Jtgz9#J}In_aRD~YNXCd&dV zG7ES`Y?mpyp-o}y`v>(39@em8`ck6Fg>F8d8?i5m1HSPML@*^Rs|$3BW3tWdWCAi?GWg zFW`mEa)fyZ=3)2t9qaxbnO{&$3v5K@tr(n*0`)1-r%a?T$Iqft%+Dee`4Xf`PC;%O zRpdytA_-2pfm6{4AWa*Owj5i`nHjkZ-eZ*Cn{@un3^zTm{aDa`G-!VTw-g?TBPYg| z^UECrvNB$n%nB8tG>NQv*+CP##FF_ws!bcHRGO=z6>O%BqY6hv6}|#hp2?V%qAjpZ zlM8sC2#Af^IJ|^>HE4e&v|~a0%OS!K2Uo1#-&-IQwDvx*?tNed|JV<~2H^^asHrMP z0SZ(aG>Of00cDPoO`fTQlx3zlMGgoR4TMUj1+2&{n1-L+d+)JeWja`~U>w-AW1?`*@H4xHQGfu-}4a~wAwj#N9K;{C{2*?5u7PSS!H`~Xz+s7HaUi;|JHjV`= zU#9T7YV#1pSEz~g7~d#Rl>+? zG>N#C@_7wuM@gtwJhehj*_J`dw^_6T+nJOxV6o-Q!jZ7G1#%l<wZ@qf>~&mWH(8p!0-x0fG815lgM(Eg|jkgpe$<~QszjgvLra=Hj@o(A+vT8 zTanymKo$dXE(_sMeB14Bqd=G&;<5n>IMKm=`ssaFn4!nIboL#a)R6)v& z$^a3!V?}Y+PR^6TEW>so47km3yBLtA(44&lcSk&O#CH?cYvGJ&RmATezFkVrpFu9O zNgZbDIgC+bXa%NYf~*lBEV0RxIH}UWreuIZX&hDN03XqwP|b~Pf!Vnb*oF$*W*Bpq zLUPXq#DT^9J|2)GLHo$P?vV%GBf)9{VG!++nVaOd1M-MZEdtg{IzwMC1AC{(hOl`|6R~-6MN|_l@5Tk|CHyWQo>v((rqz6|f1R=DKQQd&?_eyS`{5zl;$E z5!))E)65j>k$iTd{4FPxI})l$K9MwA8`wt7>_RrSOCh%B!kA0R?NN9gpPUF{ex;dn zI+Vx7fo;a2b}^2&OB`E?+z?)8hw_WF z<2|!HXIAlh#81wd8NWqWY77UbX;PK~b}qJkJX3+ValvhD{PjZDoueSP?d~=Ea+j7@ z4G)`mePCG#ZU=K+Z=vfoyWUIR_t88IOU{nS6#N_vrCrj2=_Ege(m@*}Q*z2O=i+g^BcRm3*!zu;bZVck95 zbx%-=uh<(A#kRW@8EJ#lX6rV!zxauB-E%fQXTx*WBYr^vFp(gVKpP+_RhW~MAZ1Ck zDs6?d0$wGsfcIQ%s1|Rc0O=F{g%q~^Sp3g||A4Rya;bUb8J|3Jn>@2qfGtOOfZ<^d z8CwN($Ysnn+HKLEyVP#H-NvpLE@r&ZiYM5O%{C_0;nVRoyWOQ{L=qHZj*Tr4CO2s~ zCZ4kr+N%-281sx2k)s^k%I*@Y75y}xJV)XbNiZ zGNar9d<@(tAvzgqMgiM z4qJ=LaqN;{=i&$pM+7!{jf^+RJ=#J* zPX%nf33J1ZWA579PygW3e7imW)*28_^Q(jK$xQ@YAiQc{3lVm^=elj@I-Ny}CMpIl zL~tagSTY|*wpV$elqsGl%jc*vheHbV?4WJ`v}@n(+Q01DLD%+O81iLc_rljuA+z)g zpx9n~K&c0qeN^|_eV@nW5MEjg2)BvjM*K3-l-MFul+^eKT>(1}-j4lN*M9qlb8ct; zjkU&wxBIAGUi-%7wZ?i(G!M$*6ETmoh0fO*#Vlm6cAa+KPcxkhqZp?q3#$tA`ME@g zb1FG#9*Wt)YcZ|v3lAu^^Z$=-xgjpoSI4lJ*2uw|sMub-PhkHFQMlJ)c+T}Y%*omU zUZ-W)oGb;h;q9DgUwd+G({69ht!_N^#?_PVJB`(KY5v^DIh;1ry^O?xx1Da2xLLPE zI>QVnpAtACT*LUyI|Q}_6Q;XqADl`?qiUFGgI@vFEFXtcW@B0-2k(%%ZIc&o)2KS< zhf!FFvr2xQ^AuiZd9p@t);O7v{7iV;6kFJdHN0ZloO^R)?#(Oz;=;zW?_6)JU1+SY zKD|!2)IwnSwlLZj7oe}RHlt$Q^;2DPuA3N>G;D!lSQ4T%W%@bxomcHG#K*3^-L?NQ zv^%SFcgV|k5}YzfqqDO%h}&Kmd^O+&)bqVo|9hXE_}iat`UP(ECV7jzc#FK~Eh}kF zXBv3-iCNFWmz%C%VDt-6SYjj(nJj>J?cFEeqVR?kUwLxvhjW*&HQu@Q^xtkg_3qmI zW@o;Q7g<9`TVD%e)M-L`-A2A4`j5Z zSjm&%@%cN1k}KH!9rxKg{Tzhj1hC%56zONU2mx)8D4LKyt;d%;a0GmT}6)b1M>vlqBuhZ@2kl#yxW54x|?RLI? zrG2thVTb(+8?2e({ve_@&`lNX?gf}KMVmTujVasSuGD}}3Gjr)%W!Q_}s)#Lofm|SL;2n(0 z!lNq2_Q=~G9(8;D`F44Vv*Bg&w1a3HTbQ%4PRR}J#I?1^XZ(&9Vbc7o?*n1yI&n6L zvmQy^Ty5#{>t~~Pi!}efCC1#jtxiLjNV8qdomO*8c&#MT3ZGAanRBZIymbDY#Vp7T znWfwFv9+Q%R7q?>?lRzYvS0e)j%REj1u7<&Gkf$+|FNz=)%AH!_;l>)G}1#!HF1Tn#mB>uS&lpYh;%+5rRoLm{*Cj8jZumV=n^k_00ypHI5@M zoaSb0{=Js-K5^d5Lyz){5FAJ0=9T}91N%g?U2Q`7#oa?h6*)@Fh_lKlOy|bnlp6?^)eXDaaau z7%WiJ=LjV^zt`Jedw0zSDI8(!Dpi$cVb;iSyTJG*uZiDmQhu2+W>-57e~}gDHvz@v z5IO`nfF`2H{r5@pN(gVCQ#Zmn&JmM+V7>nPrNnb9^22zlq*cn4=EjLQD>1taP9;OY zWigkLYv8SRf}sg-&uZ^U_W8?u*4x2n-)1;xQ;a{MVJ7`}k(A`c;1Fs<@yoGg&WPXz z zn9ai$vt>?h+eBVAwyW4`k_#|Jcpq46pFY%n@bKCv4~Ilgt=^vspKzyLpPLr262DS1 z#CZm9L|b^gEfYF<2d&uN9jfrZ0pWm_VJS|oY21-3G|4%u|*yepxPNe-mIVDN?^_|hj2UHUbP#T4Gv z`;WN4I`UUPx3)VJTM5IG$!Y(>^zNl;e@(0h6jP8(QCv@9A^6&aJRS0zz8pFTQ(i!p z$Xd$JVV3Wr@TLi6Ih<3`5jo|431At*S=eH>Ok-|n2HvV}T>9{a!8Z|qg;})Qd*s6Z z{=$WiGqK&>w01Wi-rfBCN1N71e+%FG=pD=NFgB-sm)dSyGPd{V9rx&`?icWr`|%xs zQhf9EF`_sLFZey_l4hsX{I23M3#ur!?v-#M1A-UTI-ZGpjhtL4Hg@_QNMk( z=RO*^4^fJ*U?~j*VoI?zqwch9W}}`tXOPSI#Wssye)+JSv0*w9es*#B|RPobj!ij@y z1TUU&cSF0sZeh)fq&>XXe)y9%F#L^=LyGU?5jZsVIGlbWj?akcGy?H&QiNgGth?RW zn=AC8_|}TO@%rz-^Pf&#`;Sll-JhSpUo|kRFdXZV8}Y06el`3v21GFi3&%%AaVB@A z3iDHNN8*$v(IjqwRJ3+7&Ze35Vr;ir%thFBNN=*atK=3`1-zN>mH~CjdRTwijmZ7v zvh~U3&wR4}xd)d%`w8G(gK?;*dM*rigXncu%1PWPu(wB_h{L(`RV*t>`3(`C+gOQ= zPoza>;8-dQj$Z;9FbG*r-ALnadtDFA$uXSTj4x; zJH&P;#C8|tI%LnlJG25``FB>ySX}mtAxz7kkL%ZXs8UwZ|0o2|Fx{lmy%xzXP#t*OWhxY!k^uH+uFOr z8W2sSx8t|aBDUOT{0gjz+*RcR!=j6#069d1@xlm7lf|Labka45IU=WNR5`6+c3ZF= z;lUQnCa`r#z{qVHcq@b#f3a5TB^56`0K9-plV4U0TY<+xeB27+8nh4|F}%15IOO^O u{Nj)h4Zy;}oF{}oiM7F!Vug~=&d9fEV1cbK*sd6DS-=IkizGNS!2p;5 literal 0 HcmV?d00001 diff --git a/screenshots/brion5.tga b/screenshots/brion5.tga new file mode 100644 index 0000000000000000000000000000000000000000..352770a213e0babd54bf8ab4ef88581747670492 GIT binary patch literal 192018 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%0AM~fTBWALzV>V|4tO_wUvLLwdzJgl#^O{Da^*_ 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 BJB9!N literal 0 HcmV?d00001 diff --git a/screenshots/brion8.tga b/screenshots/brion8.tga new file mode 100644 index 0000000000000000000000000000000000000000..1fffa830416b504c991a8762442c3171f75adcbd GIT binary patch literal 192018 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

V5>lIUn2PD*fEg7XEqSb(cV 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 USFc~c{`cR1-@JMA-+%x855li9x&QzG literal 0 HcmV?d00001 diff --git a/textures/mimas2.pcx b/textures/mimas2.pcx new file mode 100644 index 0000000000000000000000000000000000000000..c1e7cd292ffbf8986908382abadf5338c912f3d9 GIT binary patch literal 20202 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 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: Universe; st: String); +var + x,y: Integer; + c: LongInt; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.Height-1 do + for x := 0 to u.Width-1 do begin + c := u.TracePoint(x,y); + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x,u.Height-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + pplane = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + ColorSphere = object(Sphere) + rc,gc,bc: Byte; + constructor Init(x,y,z,r: Real; cr,cg,cb: Byte); + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +constructor ColorSphere.Init(x,y,z,r: Real; cr,cg,cb: Byte); +begin + Sphere.Init(x,y,z,r); + rc := cr; gc := cg; bc := cb; +end; + +function ColorSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + rc; + cc.g := Integer(cc.g) div 2 + gc; + cc.b := Integer(cc.b) div 2 + bc; + GetColor := c; +end; + +function pplane.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +procedure TraceIt; +var + u: Universe; + p: Pplane; + pp,p1: Plane; + r,g,b,w: ColorSphere; +begin + u.Init(320,200); + p.Init (-8.0, 0.0, 0.0, 0.0, 1.0, 0.001); + pp.Init (8.0, 0.0, 0.0, 1.0, 1.0, 0.001); + p1.Init (8.0, 30.0, 0.0, -1.0, 1.0, 0.001); + r.Init(-15,-3,50,5, 128,0,0); + g.Init(-10,-3,45,5, 0,128,0); + b.Init(-5,-3,50,5, 0,0,128); + w.Init(-10,2,47.5,5, 128,128,128); + u.Insert(@p); + u.Insert(@pp); + u.Insert(@p1); + u.Insert(@r); + u.Insert(@g); + u.Insert(@b); + u.Insert(@w); + {Save(u,'brion2.tga');} + Beep; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray10.pas b/turbo-pascal/ray10.pas new file mode 100644 index 0000000..94dd53b --- /dev/null +++ b/turbo-pascal/ray10.pas @@ -0,0 +1,271 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayTrace; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of Byte; + tff: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(tff,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: Universe; st: String); +var + x,y: Integer; + c: LongInt; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.Height-1 do + for x := 0 to u.Width-1 do begin + c := u.TracePoint(x,y); + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x,u.Height-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + PlanePnt = object(Obj3d) + nx,ny,nz,xb,yb,zb,xc,yc,zc: Real; + constructor Init(x1,y1,z1,x2,y2,z2,x3,y3,z3: Real); + function Intersect(aray: Ray): Real; virtual; + procedure SurfNormal(aray: Ray; time: Real; var oray: Ray); virtual; + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +constructor PlanePnt.Init(x1,y1,z1,x2,y2,z2,x3,y3,z3: Real); +var + a,b,c,d: Real; +begin + a := y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2); + b := z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2); + c := x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2); + d := -x1*(y2*z3-y3*z2)-x2*(y3*z1-y1*z3)-x3*(y1*z2-y2*z1); + Obj3d.Init(x1,y1,z1); + xb := x2; yb := y2; zb := z2; + xc := x3; yc := y3; zc := z3; + nx := a; ny := b; nz := c; +end; + +function PlanePnt.Intersect(aray: Ray): Real; +var + p1, p2, p3: real; +begin + p1 := xp * nx + yp * ny + zp * nz; + p2 := aray.ox * nx + aray.oy * ny + aray.oz * nz; + p3 := aray.dx * nx + aray.dy * ny + aray.dz * nz; + if p3 = 0 then p3 := 0.001; + Intersect := (p1-p2)/p3; +end; + +procedure PlanePnt.SurfNormal(aray: Ray; time: Real; var oray: Ray); +begin + oray.dx := nx; oray.dy := ny; oray.dz := nz; +end; + +function PlanePnt.GetColor(aray: Ray; time: Real): LongInt; +var + d: Real; + c: Integer; +begin + d := Sqrt( + Sqr(time * aray.dx + aray.ox - xp) + + Sqr(time * aray.dy + aray.oy - yp) + + Sqr(time * aray.dz + aray.oz - zp)); + if d > 255.0 then d := 255.0; + c := 255-Round(d); + if c < 96 then c := 96; + GetColor := GetRgb(c,c,c); +end; + +procedure TraceIt; +const + MaxS = 7; MaxP = 3; +var + u: Universe; + i: Integer; + s: array[1..MaxS] of Sphere; + p: array[1..MaxP] of PlanePnt; +begin + u.Init(320,200); + s[1].Init(-5,-5,50,1); + s[2].Init(-6,-5,45,1); + s[3].Init(5,-8,50,1); + s[4].Init(-7,0,50,1); + s[5].Init(20,0,50,1); + s[6].Init(18,0,55,1); + s[7].Init(18,10,55,1); + p[1].Init(-5,-5,50, -6,-5,45, 5,-8,50); + p[2].Init(-5,-5,50, -6,-5,45, -7,0,50); + p[3].Init(20,0,50, 18,0,55, 18,10,55); + for i := 1 to MaxS do + u.Insert(@s[i]); + for i := 1 to MaxP do + u.Insert(@p[i]); + Draw(u); + Beep; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray11.pas b/turbo-pascal/ray11.pas new file mode 100644 index 0000000..9475e19 --- /dev/null +++ b/turbo-pascal/ray11.pas @@ -0,0 +1,262 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayTrace; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of Byte; + tff: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(tff,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: Universe; st: String); +var + x,y: Integer; + c: LongInt; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.Height-1 do + for x := 0 to u.Width-1 do begin + c := u.TracePoint(x,y); + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x,u.Height-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + pplane = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + BlankSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +const + AmbientInt = 10; + PointInt = 100; + LightX = 15; + LightY = 5; + LightZ = 100; + CoeffReflect = 0.85; + +function pplane.GetColor(aray: Ray; time: Real): LongInt; +var + costheta,d,x,y,z,I: Real; + N,L: Ray; + c: Integer; +begin + SurfNormal(aray,time,N); + d := Sqrt(Sqr(n.dx)+Sqr(n.dy)+Sqr(n.dz)); + if d <> 0 then begin + n.dx := n.dx / d; + n.dy := n.dy / d; + n.dz := n.dz / d; + end; + x := LightX - (time * aray.dx + aray.ox); + y := LightY - (time * aray.dy + aray.oy); + z := LightZ - (time * aray.dz + aray.oz); + d := Sqrt(Sqr(x)+Sqr(y)+Sqr(z)); + if d <> 0 then begin + x := x / d; + y := y / d; + z := z / d; + end; + costheta := + (n.dx*x+n.dx*y+n.dx*z+ + n.dy*x+n.dy*y+n.dy*z+ + n.dz*x+n.dz*y+n.dz*z); + if costheta < 0 then costheta := 0; + I := (CoeffReflect * AmbientInt) + + ((CoeffReflect * PointInt) / (d + 0.001)) * costheta; + c := Round(I*15); + GetColor := GetRgb(c,c,c); +end; + +function BlankSphere.GetColor(aray: Ray; time: Real): LongInt; +begin + GetColor := $ffffff; +end; + +procedure TraceIt; +var + u: Universe; + p,p2,p3: Pplane; + s: BlankSphere; +begin + u.Init(320,200); + s.Init(LightX,LightY,LightZ,1); {15,5,100} + p.Init(0,-8,0, 0.25,1,0); + p2.Init(0,0,150, 0,0,-1); + p3.Init(-20,0,0, 1,0,0); + u.Insert(@p); + u.Insert(@p2); + u.Insert(@p3); + u.Insert(@s); + Zoom(u); + Beep; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray12.pas b/turbo-pascal/ray12.pas new file mode 100644 index 0000000..4c2a78a --- /dev/null +++ b/turbo-pascal/ray12.pas @@ -0,0 +1,291 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayShade; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of Byte; + tff: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(tff,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: Universe; st: String); +var + x,y: Integer; + c: LongInt; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.Height-1 do + for x := 0 to u.Width-1 do begin + c := u.TracePoint(x,y); + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x,u.Height-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + Plane1 = object(Plane) + cr,cg,cb: Integer; + constructor Init(x, y, z, vx, vy, vz: real; r,g,b: Integer); + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + Sphere1 = object(Sphere) + cr,cg,cb: Integer; + constructor Init(x, y, z, r: real; rr,g,b: Integer); + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + Sphere2 = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + + +function Sphere2.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c,c2: LongInt; + cc: record b,g,r: Byte end absolute c; + cc2: record b,g,r: Byte end absolute c2; +begin + ReflectRay(aray,time,r); + c := Owner^.RayColor(r); + c2 := Shade(aray,time,GetRgb(64,64,64)); + GetColor := GetRgb(cc.r-64+cc2.r,cc.g-64+cc2.g,cc.b-64+cc2.b); +end; + +constructor Sphere1.Init(x, y, z, r: real; rr,g,b: Integer); +begin + Sphere.Init(x,y,z,r); + cr := rr; cg := g; cb := b; +end; + +function Sphere1.GetColor(aray: Ray; time: Real): LongInt; +begin + GetColor := Shade(aray,time,GetRgb(cr,cg,cb)); +end; + +constructor Plane1.Init(x, y, z, vx, vy, vz: real; r,g,b: Integer); +begin + Plane.Init(x,y,z,vx,vy,vz); + cr := r; cg := g; cb := b; +end; + +function Plane1.GetColor(aray: Ray; time: Real): LongInt; +begin + GetColor := Shade(aray,time,GetRgb(cr,cg,cb)); +end; + +procedure TraceIt; +var + u: Universe; + l1,l2,l3,l4,l5,l6: LightSource; + p1,p2,p3,p4,p5,p6: Plane1; + s1,s2,s3,s4,s5,s6: Sphere1; + ss1,ss2: Sphere2; +begin + u.Init(320,200, 32,32,32); + l1.Init(14.9,7.9,49.9, 1024,1024,1024); + l2.Init(-14.9,7.9,49.9, 1024,1024,1024); + l3.Init(0,7.9,49.9, 1024,1024,1024); + l4.Init(-14.9,7.9,35, 1024,1024,1024); + l5.Init(14.9,7.9,35, 1024,1024,1024); + l6.Init(0,7.9,35, 1024,1024,1024); + p1.Init(0,-8,0, 0,1,0, 192,192,192); + p2.Init(0,8,0, 0,-1,0, 192,192,192); + p3.Init(0,0,50, 0,0,-1, 192,0,0); + p4.Init(0,0,-10, 0,0,1, 192,0,0); + p5.Init(-15,0,0, 1,0,0, 0,192,0); + p6.Init(15,0,0, -1,0,0, 0,192,0); + s1.Init(-8,-6,40,2, 192,0,0); + s2.Init(-4,-6,40,2, 0,192,0); + s3.Init(-6,-6,36.4,2, 0,0,192); + s4.Init(-6,-2.8,38.8,2, 192,192,192); + ss1.Init(-15,-8,50,5); + ss2.Init(15,-8,50,5); + u.Insert(@ss1); + u.Insert(@ss2); + u.Insert(@s1); + u.Insert(@s2); + u.Insert(@s3); + u.Insert(@s4); + u.Insert(@p1); + u.Insert(@p2); + u.Insert(@p3); + u.Insert(@p4); + u.Insert(@p5); + u.Insert(@p6); + u.InsertLight(@l1); + u.InsertLight(@l2); + u.InsertLight(@l3); + u.InsertLight(@l4); + u.InsertLight(@l5); + u.InsertLight(@l6); + {Zoom(u);} + Save(u,'brion6.tga'); + Beep; + u.DeleteAll; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray13.pas b/turbo-pascal/ray13.pas new file mode 100644 index 0000000..80c8bf8 --- /dev/null +++ b/turbo-pascal/ray13.pas @@ -0,0 +1,254 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayShade; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of Byte; + tff: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(tff,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: Universe; st: String); +var + x,y: Integer; + c: LongInt; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.Height-1 do + for x := 0 to u.Width-1 do begin + c := u.TracePoint(x,y); + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x,u.Height-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + Sky = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + Sea = object(Plane) + constructor Init(x,y,z,vx,vy,vz: Real); + procedure SurfNormal(aray: Ray; time: Real; var oray: Ray); virtual; + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +function Sky.GetColor(aray: Ray; time: Real): LongInt; +begin + GetColor := GetRgb(64,128,192); +end; + +constructor Sea.Init(x,y,z,vx,vy,vz: Real); +begin + Plane.Init(x,y,z,vx,vy,vz); + Refl := 1; +end; + +procedure Sea.SurfNormal(aray: Ray; time: Real; var oray: Ray); +const + Waves = 3; + WavePnt: array[1..Waves] of record x,y: Real end = ( + (x: 10; y: 30), + (x: -15; y: 21), + (x: 3; y: 89)); +var + x,y,d,s: Real; + i: Integer; +begin + x := aray.dx*time+aray.ox; + y := aray.dz*time+aray.oz; + d := 0; + for i := 1 to Waves do + d := d + Sqrt(Sqr(WavePnt[i].x-x)+Sqr(WavePnt[i].y-y)); + s := sin(d); + oray.dx := s; oray.dy := ny; oray.dz := s; +end; + +function Sea.GetColor(aray: Ray; time: Real): LongInt; +begin + GetColor := Shade(aray,time,GetRgb(0,128,255)); +end; + +procedure TraceIt; +var + u: Universe; + TheSun: LightSource; + TheSea: Sea; + TheSky: Sky; +begin + u.Init(320,200, 32,32,32); + TheSun.Init(100,500,-1000, 30000,30000,30000); + TheSea.Init(0,-10,0, 0,1,0); + TheSky.Init(0,501,0, 0,-1,0); + u.InsertLight(@TheSun); + u.Insert(@TheSea); + u.Insert(@TheSky); + Zoom(u); + Beep; + u.DeleteAll; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray2.pas b/turbo-pascal/ray2.pas new file mode 100644 index 0000000..8476f8b --- /dev/null +++ b/turbo-pascal/ray2.pas @@ -0,0 +1,204 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Modex,RayTrace; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +type + GreenSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + RedSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + WhiteSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +function GreenSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +function RedSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +function WhiteSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2 + 128; + GetColor := c; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < 320) and (not KeyPressed) do begin + for y := 0 to 239 do begin + c := u.TracePoint(x,239-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Quick(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < 160) and (not KeyPressed) do begin + for y := 0 to 119 do begin + c := u.TracePoint(x*2,239-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < 80) and (not KeyPressed) do begin + for y := 0 to 59 do begin + c := u.TracePoint(x*4,239-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +procedure TraceIt; +var + u: Universe; + p: Plane; + s: Sphere; + rs: RedSphere; + gs: GreenSphere; + ws: WhiteSphere; +begin + u.Init(320,240); + p.Init (0.0, -8.0, 0.0, 0.0, 1.0, 0.0); + {rs.Init(-2,0,6, 1); + gs.Init(0,-0.5,5, 1); + s.Init(2,0,6, 1);} + s.Init(0,-8,30, 5); + rs.Init(-10,-8,40, 5); + gs.Init(10,-8,40, 5); + ws.Init(-3,2,50, 6); + u.Insert(@p); + u.Insert(@s); + u.Insert(@rs); + u.Insert(@gs); + u.Insert(@ws); + Zoom(u); + Beep; + u.Done; +end; + +begin + SetModeX; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray3.pas b/turbo-pascal/ray3.pas new file mode 100644 index 0000000..32f6ad3 --- /dev/null +++ b/turbo-pascal/ray3.pas @@ -0,0 +1,205 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Modex,RayTrace; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +type + GreenSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + RedSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + WhiteSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +function GreenSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +function RedSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +function WhiteSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2 + 128; + GetColor := c; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < 320) and (not KeyPressed) do begin + for y := 0 to 239 do begin + c := u.TracePoint(x,239-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Quick(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < 160) and (not KeyPressed) do begin + for y := 0 to 119 do begin + c := u.TracePoint(x*2,239-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < 80) and (not KeyPressed) do begin + for y := 0 to 59 do begin + c := u.TracePoint(x*4,239-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +procedure TraceIt; +var + u: Universe; + p: {Plane}WhiteSphere; + s: Sphere; + rs: RedSphere; + gs: GreenSphere; + ws: WhiteSphere; +begin + u.Init(320,240); + {p.Init (-8.0, 0.0, 0.0, 0.0, 1.0, 0.001);} + p.Init(0,-1008,0, 1000); + {rs.Init(-2,0,6, 1); + gs.Init(0,-0.5,5, 1); + s.Init(2,0,6, 1);} + s.Init(0,-8,30, 5); + rs.Init(-10,-8,40, 5); + gs.Init(10,-8,40, 5); + ws.Init(-3,2,50, 6); + u.Insert(@p); + u.Insert(@s); + u.Insert(@rs); + u.Insert(@gs); + u.Insert(@ws); + Draw(u); + Beep; + u.Done; +end; + +begin + SetModeX; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray4.pas b/turbo-pascal/ray4.pas new file mode 100644 index 0000000..0a91633 --- /dev/null +++ b/turbo-pascal/ray4.pas @@ -0,0 +1,269 @@ +(* Update! *) +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Modex,RayTrace; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +type + GreenSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + RedSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + WhiteSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + Floor = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + WallA = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + WallB = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + Ceiling = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +function Floor.GetColor(aray: RAY; time: real): LongInt; +var + x,y: Word; +begin + x := Word(Round(time * aray.dz + aray.oz)); + y := Word(Round(time * aray.dx + aray.ox)); + GetColor := GetRgb(0,128+((x mod 2)+(y mod 2))*42,0); +end; + +function Ceiling.GetColor(aray: RAY; time: real): LongInt; +var + x,y: Word; + c: Byte; +begin + x := Word(Round(time * aray.dz + aray.oz)); + y := Word(Round(time * aray.dx + aray.ox)); + c := 128+((x mod 2)+(y mod 2))*42; + GetColor := GetRgb(c,c,c); +end; + +function WallA.GetColor(aray: RAY; time: real): LongInt; +var + y: Word; + c: Byte; +begin + y := Word(Round(time * aray.dx + aray.ox)); + c := 128+(y mod 2)*42; + GetColor := GetRgb(c,c div 2,0); +end; + +function WallB.GetColor(aray: RAY; time: real): LongInt; +var + x: Word; + c: Byte; +begin + x := Word(Round(time * aray.dz + aray.oz)); + c := 128+(x mod 2)*42; + GetColor := GetRgb(c,c div 2,0); +end; + +function GreenSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +function RedSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +function WhiteSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2 + 128; + GetColor := c; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,239-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,239-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,239-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +procedure TraceIt; +var + u: Universe; + s: Sphere; + rs: RedSphere; + gs: GreenSphere; + ws: WhiteSphere; + fl: Floor; + cl: Ceiling; + w1,w4: WallA; + w2,w3: WallB; +begin + u.Init(320,240); + + s.Init(0,-8,30, 5); + rs.Init(-10,-8,40, 5); + gs.Init(10,-8,40, 5); + ws.Init(-3,2,50, 6); + + fl.Init(-8,0,0, 0,1,0.001); + cl.Init(8,0,0, 0,-1,0.001); + w1.Init(0,0,50, 0,0,-1); + w4.Init(0,0,-5, 0,0,1); + w2.Init(0,-100,0, 2,0.25,0.001); + w3.Init(0,-100,0, 2,-0.25,0.001); + u.Insert(@fl); + u.Insert(@cl); + u.Insert(@w1); + u.Insert(@w2); + u.Insert(@w3); + u.Insert(@w4); + u.Insert(@s); + u.Insert(@rs); + u.Insert(@gs); + u.Insert(@ws); + Zoom(u); + Beep; + u.Done; +end; + +begin + SetModeX; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray4b.pas b/turbo-pascal/ray4b.pas new file mode 100644 index 0000000..7883131 --- /dev/null +++ b/turbo-pascal/ray4b.pas @@ -0,0 +1,268 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayTrace; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +type + GreenSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + RedSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + WhiteSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + Floor = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + WallA = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + WallB = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + Ceiling = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +function Floor.GetColor(aray: RAY; time: real): LongInt; +var + x,y: Word; +begin + x := Word(Round(time * aray.dz + aray.oz)); + y := Word(Round(time * aray.dx + aray.ox)); + GetColor := GetRgb(0,128+((x mod 2)+(y mod 2))*42,0); +end; + +function Ceiling.GetColor(aray: RAY; time: real): LongInt; +var + x,y: Word; + c: Byte; +begin + x := Word(Round(time * aray.dz + aray.oz)); + y := Word(Round(time * aray.dx + aray.ox)); + c := 128+((x mod 2)+(y mod 2))*42; + GetColor := GetRgb(c,c,c); +end; + +function WallA.GetColor(aray: RAY; time: real): LongInt; +var + y: Word; + c: Byte; +begin + y := Word(Round(time * aray.dx + aray.ox)); + c := 128+(y mod 2)*42; + GetColor := GetRgb(c,c div 2,0); +end; + +function WallB.GetColor(aray: RAY; time: real): LongInt; +var + x: Word; + c: Byte; +begin + x := Word(Round(time * aray.dz + aray.oz)); + c := 128+(x mod 2)*42; + GetColor := GetRgb(c,c div 2,0); +end; + +function GreenSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +function RedSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +function WhiteSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2 + 128; + GetColor := c; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +procedure TraceIt; +var + u: Universe; + s: Sphere; + rs: RedSphere; + gs: GreenSphere; + ws: WhiteSphere; + fl: Floor; + cl: Ceiling; + w1,w4: WallA; + w2,w3: WallB; +begin + u.Init(320,200); + + s.Init(0,-8,30, 5); + rs.Init(-10,-8,40, 5); + gs.Init(10,-8,40, 5); + ws.Init(-3,2,50, 6); + + fl.Init(-8,0,0, 0,1,0.001); + cl.Init(8,0,0, 0,-1,0.001); + w1.Init(0,0,50, 0,0,-1); + w4.Init(0,0,-5, 0,0,1); + w2.Init(0,-100,0, 2,0.25,0.001); + w3.Init(0,-100,0, 2,-0.25,0.001); + u.Insert(@fl); + u.Insert(@cl); + u.Insert(@w1); + u.Insert(@w2); + u.Insert(@w3); + u.Insert(@w4); + u.Insert(@s); + u.Insert(@rs); + u.Insert(@gs); + u.Insert(@ws); + Draw(u); + Beep; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray5.pas b/turbo-pascal/ray5.pas new file mode 100644 index 0000000..8b05319 --- /dev/null +++ b/turbo-pascal/ray5.pas @@ -0,0 +1,187 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayTrace; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +type + ColorSphere = object(Sphere) + rc,gc,bc: Byte; + constructor Init(x,y,z,r: Real; cr,cg,cb: Byte); + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + Sky = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +function Sky.GetColor(aray: Ray; time: Real): LongInt; +var + x,y: Real; + r,g,b: Integer; +begin + x := (time * aray.dz + aray.oz); + y := (time * aray.dx + aray.ox); + + GetColor := GetRgb(r,g,b); +end; + +constructor ColorSphere.Init(x,y,z,r: Real; cr,cg,cb: Byte); +begin + Sphere.Init(x,y,z,r); + rc := cr; gc := cg; bc := cb; +end; + +function ColorSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + rc; + cc.g := Integer(cc.g) div 2 + gc; + cc.b := Integer(cc.b) div 2 + bc; + GetColor := c; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +procedure TraceIt; +var + u: Universe; + cs: array[0..7] of ColorSphere; + s: Sky; + i,j,k: Integer; +begin + u.Init(320,200); + s.Init(0,8,0, 0,1,0); + u.Insert(@s); + for i := 0 to 1 do + for j := 0 to 3 do begin + k := i*4+j; + cs[k].Init(j*2-3,i*2-1,10,1, + (k and 1) * 128,((k and 2) shr 1) * 128, + ((k and 4) shr 2) * 128); + u.Insert(@cs[k]); + end; + Zoom(u); + Beep; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray6.pas b/turbo-pascal/ray6.pas new file mode 100644 index 0000000..d84d1b7 --- /dev/null +++ b/turbo-pascal/ray6.pas @@ -0,0 +1,194 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Modex,RayTrace; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +type + pplane = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + ColorSphere = object(Sphere) + rc,gc,bc: Byte; + constructor Init(x,y,z,r: Real; cr,cg,cb: Byte); + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +constructor ColorSphere.Init(x,y,z,r: Real; cr,cg,cb: Byte); +begin + Sphere.Init(x,y,z,r); + rc := cr; gc := cg; bc := cb; +end; + +function ColorSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + rc; + cc.g := Integer(cc.g) div 2 + gc; + cc.b := Integer(cc.b) div 2 + bc; + GetColor := c; +end; + +function pplane.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < 320) and (not KeyPressed) do begin + for y := 0 to 239 do begin + c := u.TracePoint(x,239-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Quick(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < 160) and (not KeyPressed) do begin + for y := 0 to 119 do begin + c := u.TracePoint(x*2,239-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < 80) and (not KeyPressed) do begin + for y := 0 to 59 do begin + c := u.TracePoint(x*4,239-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +procedure TraceIt; +var + u: Universe; + p: Pplane; + pp,p1: Plane; + r,g,b,w: ColorSphere; +begin + u.Init(320,240); + p.Init (0.0, -8.0, 0.0, 0.0, 1.0, 0.0); + pp.Init (8.0, 0.0, 0.0, 1.0, 1.0, 0.0); + p1.Init (8.0, 30.0, 0.0, -1.0, 1.0, 0.0); + r.Init(-15,-3,50,5, 128,0,0); + g.Init(-10,-3,45,5, 0,128,0); + b.Init(-5,-3,50,5, 0,0,128); + w.Init(-10,2,47.5,5, 128,128,128); + u.Insert(@p); + u.Insert(@pp); + u.Insert(@p1); + u.Insert(@r); + u.Insert(@g); + u.Insert(@b); + u.Insert(@w); + Zoom(u); + Beep; + u.Done; +end; + +begin + SetModeX; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray6b.pas b/turbo-pascal/ray6b.pas new file mode 100644 index 0000000..ddffaa4 --- /dev/null +++ b/turbo-pascal/ray6b.pas @@ -0,0 +1,194 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayTrace; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +type + pplane = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + ColorSphere = object(Sphere) + rc,gc,bc: Byte; + constructor Init(x,y,z,r: Real; cr,cg,cb: Byte); + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +constructor ColorSphere.Init(x,y,z,r: Real; cr,cg,cb: Byte); +begin + Sphere.Init(x,y,z,r); + rc := cr; gc := cg; bc := cb; +end; + +function ColorSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + rc; + cc.g := Integer(cc.g) div 2 + gc; + cc.b := Integer(cc.b) div 2 + bc; + GetColor := c; +end; + +function pplane.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +procedure TraceIt; +var + u: Universe; + p: Pplane; + pp,p1: Plane; + r,g,b,w: ColorSphere; +begin + u.Init(320,200); + p.Init (-8.0, 0.0, 0.0, 0.0, 1.0, 0.001); + pp.Init (8.0, 0.0, 0.0, 1.0, 1.0, 0.001); + p1.Init (8.0, 30.0, 0.0, -1.0, 1.0, 0.001); + r.Init(-15,-3,50,5, 128,0,0); + g.Init(-10,-3,45,5, 0,128,0); + b.Init(-5,-3,50,5, 0,0,128); + w.Init(-10,2,47.5,5, 128,128,128); + u.Insert(@p); + u.Insert(@pp); + u.Insert(@p1); + u.Insert(@r); + u.Insert(@g); + u.Insert(@b); + u.Insert(@w); + Zoom(u); + Beep; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray6p.pas b/turbo-pascal/ray6p.pas new file mode 100644 index 0000000..5fc9240 --- /dev/null +++ b/turbo-pascal/ray6p.pas @@ -0,0 +1,259 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayTrace; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of Byte; + tff: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(tff,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: Universe; st: String); +var + x,y: Integer; + c: LongInt; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.Height-1 do + for x := 0 to u.Width-1 do begin + c := u.TracePoint(x,y); + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x,u.Height-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + pplane = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + ColorSphere = object(Sphere) + rc,gc,bc: Byte; + constructor Init(x,y,z,r: Real; cr,cg,cb: Byte); + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +constructor ColorSphere.Init(x,y,z,r: Real; cr,cg,cb: Byte); +begin + Sphere.Init(x,y,z,r); + rc := cr; gc := cg; bc := cb; +end; + +function ColorSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + rc; + cc.g := Integer(cc.g) div 2 + gc; + cc.b := Integer(cc.b) div 2 + bc; + GetColor := c; +end; + +function pplane.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +procedure TraceIt; +var + u: Universe; + p: Pplane; + pp,p1: Plane; + r,g,b,w: ColorSphere; +begin + u.Init(320,200); + p.Init (-8.0, 0.0, 0.0, 0.0, 1.0, 0.001); + pp.Init (8.0, 0.0, 0.0, 1.0, 1.0, 0.001); + p1.Init (8.0, 30.0, 0.0, -1.0, 1.0, 0.001); + r.Init(-15,-3,50,5, 128,0,0); + g.Init(-10,-3,45,5, 0,128,0); + b.Init(-5,-3,50,5, 0,0,128); + w.Init(-10,2,47.5,5, 128,128,128); + u.Insert(@p); + u.Insert(@pp); + u.Insert(@p1); + u.Insert(@r); + u.Insert(@g); + u.Insert(@b); + u.Insert(@w); + Save(u,'brion2.tga'); + Beep; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray7.pas b/turbo-pascal/ray7.pas new file mode 100644 index 0000000..81204fb --- /dev/null +++ b/turbo-pascal/ray7.pas @@ -0,0 +1,265 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayTrace; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of Byte; + tff: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(tff,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: Universe; st: String); +var + x,y: Integer; + c: LongInt; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.Height-1 do + for x := 0 to u.Width-1 do begin + c := u.TracePoint(x,y); + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x,u.Height-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + ColorSphere = object(Sphere) + rc,gc,bc: Byte; + constructor Init(x,y,z,r: Real; cr,cg,cb: Byte); + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + Mandel = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +function Mandel.GetColor(aray: Ray; time: Real): LongInt; +const + k = 200; +var + x,y,cRe,cIm: Real; + zRe,zIm,zx: Real; + Zsize: Real; + Count: integer; +begin + y := (time * aray.dz + aray.oz)-50; + x := (time * aray.dx + aray.ox); + cRe := x/10; cIm := y/10; + zRe := 0; zIm := 0; zSize := 0; + Count := 0; + while (Count < k) and (Zsize < 2.0) do begin + zx := zRe * zRe - zIm * zIm; + zIm := zRe * zIm - zIm * zRe; + zRe := zx; + zRe := zRe + cRe; + zIm := zIm + cIm; + Zsize := sqr(ZRe) + sqr(ZIm); + Inc(Count); + end; + if Count = k then + GetColor := $404040 + else begin + Count := LongInt(Count)*360 div (k div 2); + GetColor := GetHsv(Count,100,100); + end; +end; + +constructor ColorSphere.Init(x,y,z,r: Real; cr,cg,cb: Byte); +begin + Sphere.Init(x,y,z,r); + rc := cr; gc := cg; bc := cb; +end; + +function ColorSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + rc; + cc.g := Integer(cc.g) div 2 + gc; + cc.b := Integer(cc.b) div 2 + bc; + GetColor := c; +end; + +procedure TraceIt; +var + u: Universe; + m: Mandel; + p: Plane; +begin + u.Init(320,200); + m.Init(0,-8,0, 0,1,0); + p.Init(0,-8,0, 0,1,0); + u.Insert(@m); + {Save(u,'brion3.tga');} + Qwik(u); + Beep; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray8.pas b/turbo-pascal/ray8.pas new file mode 100644 index 0000000..c9ff01e --- /dev/null +++ b/turbo-pascal/ray8.pas @@ -0,0 +1,280 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayTrace; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of Byte; + tff: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(tff,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: Universe; st: String); +var + x,y: Integer; + c: LongInt; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.Height-1 do + for x := 0 to u.Width-1 do begin + c := u.TracePoint(x,y); + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x,u.Height-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + pplane = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + ColorSphere = object(Sphere) + rc,gc,bc: Byte; + constructor Init(x,y,z,r: Real; cr,cg,cb: Byte); + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + WeirdSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +constructor ColorSphere.Init(x,y,z,r: Real; cr,cg,cb: Byte); +begin + Sphere.Init(x,y,z,r); + rc := cr; gc := cg; bc := cb; +end; + +function ColorSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + rc; + cc.g := Integer(cc.g) div 2 + gc; + cc.b := Integer(cc.b) div 2 + bc; + GetColor := c; +end; + +function WeirdSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; +begin + r.ox := (aray.dx * time + aray.ox - xp - ra) / (ra*2); + r.oy := (aray.dy * time + aray.oy - yp - ra) / (ra*2); + r.oz := (aray.dz * time + aray.oz - zp - ra) / (ra*2); + (*GetColor := GetHsv(Round(r.oy*359),Round(r.ox*100),100{Round(r.oz*100)});*) + GetColor := GetHsv(Round(r.oy*359),100,100); +end; + +function pplane.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +procedure TraceIt; +var + u: Universe; + p: ColorSphere; + r,g,b,w: ColorSphere; + ws: WeirdSphere; + ss: array[0..17] of ColorSphere; + i,j,k,l,m: Integer; +begin + u.Init(320,200); + p.Init(100,-1004,0, 1000, 128,128,0); + r.Init(-15,-3,50,5, 128,0,0); + g.Init(-10,-3,41,5, 0,128,0); + b.Init(-5,-3,50,5, 0,0,128); + w.Init(-10,4,47,5, 128,128,128); + ws.Init(15,6,100, 15); + for i := 0 to 17 do begin + Hsv2Rgb(i*20,100,100,j,k,l); + ss[i].Init(15+(sin(i*pi/9)*20),6,100+(cos(i*pi/9)*20),2, j div 2,k div 2,l div 2); + end; + u.Insert(@ws); + u.Insert(@p); + u.Insert(@r); + u.Insert(@g); + u.Insert(@b); + u.Insert(@w); + for i := 0 to 17 do + u.Insert(@ss[i]); + Save(u,'brion4.tga'); + {Zoom(u);} + Beep; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/ray9.pas b/turbo-pascal/ray9.pas new file mode 100644 index 0000000..d50e3e3 --- /dev/null +++ b/turbo-pascal/ray9.pas @@ -0,0 +1,451 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayTrace,Dos; +{$I BufrFile.Inc} + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of Byte; + tff: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(tff,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: Universe; st: String); +var + x,y: Integer; + c: LongInt; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.Height-1 do + for x := 0 to u.Width-1 do begin + c := u.TracePoint(x,y); + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x,u.Height-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + { Definition of the PCX file header } + PCX_header = record + pcx_id : byte; { Always $0A for PCX files } + version : byte; { Version of the PCX format } + encoding : byte; { 1 = RLE (RLL) compression } + bpp : byte; { Number of bits per pixel } + upleftx, uplefty : word; { position of upper left corner } + lorightx, lorighty : word; { lower right corner (inclusive) } + display_xres, display_yres : word; { resolution in dpi of display } + palette : array [0..47] of byte; { palette data if it fits } + reserved : byte; + nplanes : byte; { number of bit planes of data } + bytesperline : word; { # bytes in an uncompressed line } + palletteinfo : word; + reserved2 : array [0..57] of byte; + end; + pplane = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + ColorSphere = object(Sphere) + rc,gc,bc: Byte; + constructor Init(x,y,z,r: Real; cr,cg,cb: Byte); + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + arr_byte = array[0..65520] of byte; + parr_byte = ^arr_byte; + WoodSphere = object(Sphere) + IsLoaded: Boolean; + Width,Height: Integer; + Buf: parr_byte; + function GetPixel(x,y: Integer): Byte; + constructor Init(x,y,z,r: Real; s: String); + destructor Done; virtual; + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + GraySphere = object(WoodSphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +const + { These two definitions are used to decompress data in the PCX file. + (The compressed count byte has the top two bits set). } + + PCX_COMPRESSED = $C0; + PCX_MASK = $3F; + + Bits : array [0..7] of byte = (1, 2, 4, 8, 16, 32, 64, 128); + +{ Read header of indicated PCX file. Returns TRUE if OK, FALSE if error } + +function pcx_read_header (var hdr : PCX_header; var f : buffered_file) : boolean; +var + count : word; + hdr_array : array [0..1] of char absolute hdr; +begin + count := 0; + while count < SizeOf(PCX_header) do + begin + hdr_array [count] := NextCharRead (f); + Inc (count) + end; + pcx_read_header := (f.more_data) and (hdr.pcx_id = $0A); +end {pcx_read_header}; + +{ Read next line from PCX file into indicated array, up to indicated limit. + Returns TRUE if data acquired, FALSE if error occurred. + Note: call pcx_read_header () first to begin reading file. } + +function pcx_next_line (var hdr : PCX_header; var f : buffered_file; + var line1; linesize : integer; var count : word) : boolean; +var + line : array [0..1] of byte absolute line1; + c : byte; + len, len1 : integer; + i, linebytes, b : word; +begin + { initialize return value } + pcx_next_line := FALSE; + { determine number of bytes to acquire } + linebytes := hdr.nplanes * hdr.bytesperline; + { point to start of return data } + count := 0; + i := 0; + while i < linebytes do + begin + { acquire next block of data } + c := Ord (NextCharRead (f)); + if Not f.more_data + then Exit; + if (c AND PCX_COMPRESSED) = PCX_COMPRESSED + then { acquire run-length encoded data } + begin + len := c AND PCX_MASK; + c := Ord (NextCharRead (f)); + if Not f.more_data + then Exit; + end + else { acquire single byte } + len := 1; + { store block of data in array } + len1 := len; + if count + len1 > linesize + then len1 := linesize - count; + if count < linesize + then begin + FillChar (line [count], len1, c); + Inc (count, len1); + end; + Inc (i, len); + end; + pcx_next_line := TRUE; +end {pcx_next_line}; + +constructor WoodSphere.Init(x,y,z,r: Real; s: String); +var + PCXFile : buffered_file; + PCXBuf : DiskFileBuffer; + PCXLine : array [0..2048] of byte; + PCXHdr : PCX_header; + PCXWidth : word; + pixel_width: word; + I, J : integer; + X1, Y1 : integer; + found : boolean; + line_count : integer; + clr : byte; + numlines: integer; +begin + Sphere.Init(x,y,z,r); + + IsLoaded := False; + if length(s) = 0 then Exit; + { attempt to open file } + AssignBufferedFile(PCXFile, s, @PCXBuf); + OpenForBufferedRead(PCXFile, I); + if I <> 0 then Exit; + { read descriptive header } + found := pcx_read_header (PCXHdr, PCXFile); + if Not found then begin + CloseForBufferedRead (PCXFile, I); + Exit; + end; + IsLoaded := True; + { display data } + numlines := PCXHdr.lorighty - PCXHdr.uplefty + 1; + pixel_width := PCXHdr.lorightx - PCXHdr.upleftx + 1; + Width := pixel_width; + Height := numlines; + GetMem(Buf,Width*Height); + line_count := 0; + repeat + found := pcx_next_line (PCXHdr, PCXFile, + PCXLine, SizeOf(PCXLine), PCXWidth); + if found then begin + for X1 := 0 to PCXWidth-1 do + Buf^[(Height-1-line_count)*Width+X1] := PCXLine[X1]; + Inc (line_count); + end; + until (Not found) or (line_count = numlines); + CloseForBufferedRead (PCXFile, I); +end; + +destructor WoodSphere.Done; +begin + if IsLoaded then + FreeMem(Buf,Width*Height); + Sphere.Done; +end; + +function WoodSphere.GetPixel(x,y: Integer): Byte; +begin + if IsLoaded and (x > 0) and (y > 0) and + (x < Width) and (y < Height) then + GetPixel := Buf^[y*Width+x] + else + GetPixel := 0; +end; + +function WoodSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: Integer; +begin + r.ox := (aray.dx * time + aray.ox - xp + ra) / (ra*2); + r.oy := (aray.dy * time + aray.oy - yp + ra) / (ra*2); + r.oz := (aray.dz * time + aray.oz - zp + ra) / (ra*2); + c := GetPixel(Round(r.ox*(Width-1)),Round(r.oy*(Height-1))); + GetColor := GetRgb(c,c * 5 div 8,0); +end; + +function GraySphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: Byte; +begin + r.ox := (aray.dx * time + aray.ox - xp + ra) / (ra*2); + r.oy := (aray.dy * time + aray.oy - yp + ra) / (ra*2); + r.oz := (aray.dz * time + aray.oz - zp + ra) / (ra*2); + c := GetPixel(Round(r.ox*(Width-1)),Round(r.oy*(Height-1))); + GetColor := GetRgb(c,c,c); +end; + +constructor ColorSphere.Init(x,y,z,r: Real; cr,cg,cb: Byte); +begin + Sphere.Init(x,y,z,r); + rc := cr; gc := cg; bc := cb; +end; + +function ColorSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + rc; + cc.g := Integer(cc.g) div 2 + gc; + cc.b := Integer(cc.b) div 2 + bc; + GetColor := c; +end; + +function pplane.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2 + 128; + GetColor := c; +end; + +procedure TraceIt; +var + u: Universe; + p: Pplane; + wood: WoodSphere; + mimas,earth: GraySphere; +begin + u.Init(320,200); + p.Init (0,-8,0, 0,1,0); + wood.Init(-16,0,54,8, 'c:\brion\vga\wood2.pcx'); + mimas.Init(0,0,50,8, 'c:\brion\vga\mimas2.pcx'); + Earth.Init(16,0,54,8, 'c:\brion\vga\earth2.pcx'); + u.Insert(@wood); + u.Insert(@mimas); + u.Insert(@Earth); + u.Insert(@p); + Save(u,'brion5.tga'); + {Zoom(u);} + Beep; + wood.Done; + Mimas.Done; + Earth.Done; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/raypic.pas b/turbo-pascal/raypic.pas new file mode 100644 index 0000000..a43323c --- /dev/null +++ b/turbo-pascal/raypic.pas @@ -0,0 +1,272 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayTrace; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of Byte; + tff: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(tff,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +type + GreenSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + RedSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + WhiteSphere = object(Sphere) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + Floor = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + WallA = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + WallB = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + Ceiling = object(Plane) + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + +function Floor.GetColor(aray: RAY; time: real): LongInt; +var + x,y: Word; +begin + x := Word(Round(time * aray.dz + aray.oz)); + y := Word(Round(time * aray.dx + aray.ox)); + GetColor := GetRgb(0,128+((x mod 2)+(y mod 2))*42,0); +end; + +function Ceiling.GetColor(aray: RAY; time: real): LongInt; +var + x,y: Word; + c: Byte; +begin + x := Word(Round(time * aray.dz + aray.oz)); + y := Word(Round(time * aray.dx + aray.ox)); + c := 128+((x mod 2)+(y mod 2))*42; + GetColor := GetRgb(c,c,c); +end; + +function WallA.GetColor(aray: RAY; time: real): LongInt; +var + y: Word; + c: Byte; +begin + y := Word(Round(time * aray.dx + aray.ox)); + c := 128+(y mod 2)*42; + GetColor := GetRgb(c,c div 2,0); +end; + +function WallB.GetColor(aray: RAY; time: real): LongInt; +var + x: Word; + c: Byte; +begin + x := Word(Round(time * aray.dz + aray.oz)); + c := 128+(x mod 2)*42; + GetColor := GetRgb(c,c div 2,0); +end; + +function GreenSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +function RedSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2; + cc.b := Integer(cc.b) div 2; + GetColor := c; +end; + +function WhiteSphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2 + 128; + cc.g := Integer(cc.g) div 2 + 128; + cc.b := Integer(cc.b) div 2 + 128; + GetColor := c; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Integer; +begin + x := 0; + for y := 0 to u.Height-1 do + for x := 0 to u.Width-1 do begin + c := u.TracePoint(x,y); + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x,u.Height-1-y,r,g,b); + TgaDot(r,g,b); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +procedure TraceIt; +var + u: Universe; + s: Sphere; + rs: RedSphere; + gs: GreenSphere; + ws: WhiteSphere; + fl: Floor; + cl: Ceiling; + w1,w4: WallA; + w2,w3: WallB; +begin + u.Init(320,200); + + s.Init(0,-8,30, 5); + rs.Init(-10,-8,40, 5); + gs.Init(10,-8,40, 5); + ws.Init(-3,2,50, 6); + + fl.Init(-8,0,0, 0,1,0.001); + cl.Init(8,0,0, 0,-1,0.001); + w1.Init(0,0,50, 0,0,-1); + w4.Init(0,0,-5, 0,0,1); + w2.Init(0,-100,0, 2,0.25,0.001); + w3.Init(0,-100,0, 2,-0.25,0.001); + u.Insert(@fl); + u.Insert(@cl); + u.Insert(@w1); + u.Insert(@w2); + u.Insert(@w3); + u.Insert(@w4); + u.Insert(@s); + u.Insert(@rs); + u.Insert(@gs); + u.Insert(@ws); + Draw(u); + Beep; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + StartTga('brion1.tga'); + TraceIt; + EndTga; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/rays.pas b/turbo-pascal/rays.pas new file mode 100644 index 0000000..95344fe --- /dev/null +++ b/turbo-pascal/rays.pas @@ -0,0 +1,201 @@ +program mmmmmmmmmmmmm; +{$X+} +uses Crt,Vga13h,RayShade; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of Byte; + tff: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(tff,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: Universe; st: String); +var + x,y: Integer; + c: LongInt; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.Height-1 do + for x := 0 to u.Width-1 do begin + c := u.TracePoint(x,y); + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x,u.Height-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: Universe); +var + x,y: Integer; + c: LongInt; +begin + x := 0; + while (x < u.Width) and (not KeyPressed) do begin + for y := 0 to u.Height-1 do begin + c := u.TracePoint(x,u.Height-1-y); + if c <> 0 then + RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: Universe); +var + x,y: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 2)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 2)-1 do begin + c := u.TracePoint(x*2,u.Height-1-(y*2)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Zoom(var u: Universe); +var + x,y,i,j: Integer; + c: LongInt; + r,g,b: Byte; +begin + x := 0; + while (x < (u.Width div 4)) and (not KeyPressed) do begin + for y := 0 to (u.Height div 4)-1 do begin + c := u.TracePoint(x*4,u.Height-1-(y*4)); + if c <> 0 then begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + + + +procedure TraceIt; +var + u: Universe; +begin + u.Init(320,200, 32,32,32); + Zoom(u); + Beep; + u.DeleteAll; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/rayshade.pas b/turbo-pascal/rayshade.pas new file mode 100644 index 0000000..9d08f49 --- /dev/null +++ b/turbo-pascal/rayshade.pas @@ -0,0 +1,535 @@ +{ RAYTRACE.PAS } +{ Ray-tracing unit, generic. (with shading) } + +unit RayShade; + +interface +uses Objects; +{ Base objects on Turbo Vision's TObject to make them useable on + Turbo Vision streams. } + +type + VECTOR = object + dx, dy, dz: real; { Three dimensional vector } + end; + RAY = object + dx, dy, dz: real; { Direction vector } + ox, oy, oz: real; { Origin } + constructor Init (x, y, z, vx, vy, vz: real); + end; + + PObj3d = ^Obj3d; + PLightSource = ^LightSource; + PUniverse = ^Universe; + + LightSource = object(TObject) + Owner: PUniverse; + xp,yp,zp: Real; + br,bg,bb: Real; + constructor Init(x,y,z,r,g,b: Real); + end; + + Obj3d = object(TObject) + Owner: PUniverse; + xp,yp,zp: Real; + refl: Real; + constructor Init(x,y,z,r: Real); + function Intersect(aray: RAY): Real; virtual; + procedure SurfNormal(aray: Ray; time: Real; var oray: Ray); virtual; + procedure ReflectRay(aray: Ray; time: Real; var oray: Ray); virtual; + function GetColor(aray: Ray; time: Real): LongInt; virtual; + function Shade(aray: Ray; time: Real; c: LongInt): LongInt; virtual; + end; + PLANE = object(Obj3d) + nx, ny, nz: real; { Vector normal (perpendicular) to plane } + constructor Init(x, y, z, vx, vy, vz: real); + function Intersect(aray: RAY): real; virtual; + procedure SurfNormal(aray: Ray; time: Real; var oray: Ray); virtual; + function GetColor(aray: RAY; time: Real): LongInt; virtual; + end; + SPHERE = object(Obj3d) + ra,r2: real; { Radius squared } + constructor Init(x, y, z, r: real); + function Intersect(aray: RAY): real; virtual; + procedure SurfNormal(aray: Ray; time: Real; var oray: Ray); virtual; + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + + Cylinder = object(Obj3d) + { xp,yp,zp = center of bottom circle + x2,y2,z2 = center of top circle + ra = radius } + x2,y2,z2,ra,r2: Real; + constructor Init(x,y,z,xb,yb,zb,r: Real); + function Intersect(aray: RAY): real; virtual; + procedure SurfNormal(aray: Ray; time: Real; var oray: Ray); virtual; + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + + PlanePnt = object(Plane) + xb,yb,zb,xc,yc,zc: Real; + constructor Init(x1,y1,z1,x2,y2,z2,x3,y3,z3: Real); + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + + Universe = object(TObject) + Width,Height: Integer; + ar,ag,ab: Real; { Ambient lighting } + Items,Lights: TCollection; + constructor Init(aWidth,aHeight: Integer; r,g,b: Real); + destructor Done; virtual; + procedure Insert(o: PObj3d); + procedure Delete(o: PObj3d); + procedure InsertLight(l: PLightSource); + procedure DeleteLight(l: PLightSource); + procedure DeleteAll; + function RayColor(aray: Ray): LongInt; + function TraceRay(aray: Ray; var ob: PObj3d): Real; + function TracePoint(x,y: Integer): LongInt; + end; + + +{ LongInt: $00rrggbb } +procedure SepLong(c: LongInt; var r,g,b: Integer); +function GetRgb(r,g,b: Integer): LongInt; +function GetHsv(h,s,v: Integer): LongInt; +procedure Hsv2Rgb(h,s,v: Integer; var r,g,b: Integer); + +implementation + +procedure SepLong(c: LongInt; var r,g,b: Integer); +begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; +end; + +procedure Hsv2Rgb(h,s,v: Integer; var r,g,b: Integer); +var + rr,gg,bb,f,p1,p2,p3: Integer; +begin + while h > 359 do Dec(h,360); + while h < 0 do Inc(h,360); + if s < 0 then s := 0; + if s > 100 then s := 100; + if v < 0 then v := 0; + if v > 100 then v := 100; + + f := (h mod 60) * 5 div 3; + h := h div 60; + p1 := v*(100-s) div 625 * 16; + p2 := v*(100-(s*f div 100)) div 625 * 16; + p3 := v*(100-(s*(100-f) div 100)) div 625 * 16; + v := v * 64 div 25; + case h of + 0: begin r := v; g := p3; b := p1; end; + 1: begin r := p2; g := v; b := p1; end; + 2: begin r := p1; g := v; b := p3; end; + 3: begin r := p1; g := p2; b := v; end; + 4: begin r := p3; g := p1; b := v; end; + 5: begin r := v; g := p1; b := p2; end; + end; +end; + +function GetHsv(h,s,v: Integer): LongInt; +var r,g,b: Integer; +begin + Hsv2Rgb(h,s,v,r,g,b); + asm + mov al,byte ptr [b] + mov byte ptr [@Result],al + mov al,byte ptr [g] + mov byte ptr [@Result+1],al + mov al,byte ptr [r] + mov byte ptr [@Result+2],al + mov byte ptr [@Result+3],0 + end; +end; + +function GetRgb(r,g,b: Integer): LongInt; +begin + if r > 255 then r := 255; + if r < 0 then r := 0; + if g > 255 then g := 255; + if g < 0 then g := 0; + if b > 255 then b := 255; + if b < 0 then b := 0; + asm + mov al,byte ptr [b] + mov byte ptr [@Result],al + mov al,byte ptr [g] + mov byte ptr [@Result+1],al + mov al,byte ptr [r] + mov byte ptr [@Result+2],al + mov byte ptr [@Result+3],0 + end; +end; + +constructor LightSource.Init(x,y,z,r,g,b: Real); +begin + TObject.Init; + xp := x; yp := y; zp := z; + br := r; bg := g; bb := b; +end; + +constructor Obj3d.Init(x,y,z,r: Real); +begin + TObject.Init; + xp := x; yp := y; zp := z; refl := r; +end; + +function Obj3d.Intersect(aray: RAY): Real; +begin + { 0 or neg = no intersect } + Intersect := 0; +end; + +procedure Obj3d.SurfNormal(aray: Ray; time: Real; var oray: Ray); +begin + { No intersect, will never get called here } +end; + +procedure Obj3d.ReflectRay(aray: RAY; time: real; var oray: RAY); +var + normal: Ray; { Used for readability } + ndotn: real; { Used for readability } + idotn: real; { Used for readability } + idotn_div_ndotn_x2: real; { Used for optimization } +begin + oray.ox := aray.dx * time + aray.ox; { Find the point of } + oray.oy := aray.dy * time + aray.oy; { intersection between } + oray.oz := aray.dz * time + aray.oz; { iray and sphere. } + SurfNormal(aray,time,normal); + + ndotn := (normal.dx * normal.dx + + normal.dy * normal.dy + + normal.dz * normal.dz); + idotn := (normal.dx * aray.dx + + normal.dy * aray.dy + + normal.dz * aray.dz); + idotn_div_ndotn_x2 := (2.0 * (idotn) / ndotn); + + oray.dx := aray.dx - idotn_div_ndotn_x2 * normal.dx; + oray.dy := aray.dy - idotn_div_ndotn_x2 * normal.dy; + oray.dz := aray.dz - idotn_div_ndotn_x2 * normal.dz; +end; + +function Obj3d.GetColor(aray: Ray; time: Real): LongInt; +begin + { See SurfNormal } +end; + +function Obj3d.Shade(aray: Ray; time: Real; c: LongInt): LongInt; +var + pl: PLightSource; + ob: PObj3d; + costheta,t,d,Ir,Ig,Ib: Real; + l,n: Ray; + i: Integer; + cc: record b,g,r: Byte end absolute c; +begin + l.ox := aray.dx*time+aray.ox; + l.oy := aray.dy*time+aray.oy; + l.oz := aray.dz*time+aray.oz; + SurfNormal(aray,time,n); + d := Sqrt(Sqr(n.dx)+Sqr(n.dy)+Sqr(n.dz)); + if d <> 0 then begin + n.dx := n.dx / d; + n.dy := n.dy / d; + n.dz := n.dz / d; + end; + Ir := refl * Owner^.ar; + Ig := refl * Owner^.ag; + Ib := refl * Owner^.ab; + for i := 0 to Owner^.Lights.Count-1 do begin + pl := PLightSource(Owner^.Lights.At(i)); + l.dx := pl^.xp-(time*aray.dx+aray.ox); + l.dy := pl^.yp-(time*aray.dy+aray.oy); + l.dz := pl^.zp-(time*aray.dz+aray.oz); + d := Sqrt(Sqr(l.dx)+Sqr(l.dy)+Sqr(l.dz)); + if d <> 0 then begin + l.dx := l.dx / d; + l.dy := l.dy / d; + l.dz := l.dz / d; + end; + costheta := (n.dx*l.dx + n.dy*l.dy + n.dz*l.dz); + t := Owner^.TraceRay(l,ob); + if (costheta > 0) and ((t >= d) or (t < 0.001)) then begin + Ir := Ir + ((refl * pl^.br) / (d + 0.001)) * costheta; + Ig := Ig + ((refl * pl^.bg) / (d + 0.001)) * costheta; + Ib := Ib + ((refl * pl^.bb) / (d + 0.001)) * costheta; + end; + end; + Shade := GetRgb( + Integer(cc.r)-128+Round(Ir), + Integer(cc.g)-128+Round(Ig), + Integer(cc.b)-128+Round(Ib)); +end; + + +constructor RAY.Init(x, y, z, vx, vy, vz: real); +begin + ox := x; + oy := y; + oz := z; + dx := vx; + dy := vy; + dz := vz; +end; { ----- End: RAY::RAY() ----- } + +constructor SPHERE.Init(x, y, z, r: real); +begin + Obj3d.Init(x,y,z,1); + ra := r; + r2 := r * r; +end; { ----- End: SPHERE::SPHERE() ----- } + +function SPHERE.Intersect(aray: RAY): real; +var + a, b, c, t1, t2, t3, close, farther: real; +begin + a := aray.dx * aray.dx + aray.dy * aray.dy + aray.dz * aray.dz; + close := -1.0; + farther := -1.0; + if a <> 0 then + begin + b := 2.0 * ((aray.ox - xp) * aray.dx + + (aray.oy - yp) * aray.dy + + (aray.oz - zp) * aray.dz); + c := (aray.ox - xp) * (aray.ox - xp) + + (aray.oy - yp) * (aray.oy - yp) + + (aray.oz - zp) * (aray.oz - zp) - r2; + t1 := b * b - 4.0 * a * c; + if t1 > 0 then + begin + t2 := sqrt(t1); + t3 := 2.0 * a; + close := -(b + t2) / t3; + farther := -(b - t2) / t3; + end; + end; + if close < farther then Intersect := close else Intersect := farther; +{ Intersect := (double)((close < farther) ? close : farther);} +end; { ---- End: SPHERE::Intersect() ----- } + +procedure Sphere.SurfNormal(aray: Ray; time: Real; var oray: Ray); +begin + oray.ox := aray.dx * time + aray.ox; { Find the point of } + oray.oy := aray.dy * time + aray.oy; { intersection between } + oray.oz := aray.dz * time + aray.oz; { aray and sphere. } + oray.dx := oray.ox - xp; { Find the ray normal } + oray.dy := oray.oy - yp; { to the sphere at the } + oray.dz := oray.oz - zp; { intersection point. } +end; + +function Sphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c,c2: LongInt; + cc: record b,g,r: Byte end absolute c; + cc2: record b,g,r: Byte end absolute c2; +begin + ReflectRay(aray,time,r); + c := Owner^.RayColor(r); + c2 := Shade(aray,time,GetRgb(0,0,128)); + cc.r := cc.r div 2 + cc2.r; + cc.g := cc.g div 2 + cc2.g; + cc.b := cc.b div 2 + cc2.b; + GetColor := c; +end; + +constructor PLANE.Init(x, y, z, vx, vy, vz: real); +begin + Obj3d.Init(x,y,z,0.9); + nx := vx; + ny := vy; + nz := vz; +end; { ----- End: PLANE::PLANE() ----- } + +function PlanePattern(x, y: word): LongInt; +var + r,g,b: Integer; +begin + r := (((x+y) mod 8))*32; + g := ((x mod 8) xor (y mod 8))*32; + b := (((x * x + y * y) mod 8))*32; + PlanePattern := GetRgb(r,g,b); +end; { ----- End: PlanePattern() ----- } + + +function PLANE.GetColor(aray: RAY; time: real): LongInt; +begin + GetColor := Shade(aray,time, + PlanePattern(Round(time * aray.dz + aray.oz), + Round(time * aray.dx + aray.ox))); +end; { ----- End: PLANE::Pattern() ----- } + +function PLANE.Intersect(aray: RAY): real; +var + p1, p2, p3: real; +begin + p1 := xp * nx + yp * ny + zp * nz; + p2 := aray.ox * nx + aray.oy * ny + aray.oz * nz; + p3 := aray.dx * nx + aray.dy * ny + aray.dz * nz; + if p3 = 0 then p3 := 0.001; + Intersect := (p1-p2)/p3; +end; { ----- End: PLANE::Intersect() ----- } + +procedure Plane.SurfNormal(aray: Ray; time: Real; var oray: Ray); +begin + oray.dx := nx; oray.dy := ny; oray.dz := nz; +end; + +constructor Cylinder.Init(x,y,z,xb,yb,zb,r: Real); +begin + Obj3d.Init(x,y,z,0.9); + x2 := xb; y2 := yb; z2 := zb; + ra := r; r2 := Sqr(r); +end; + +function Cylinder.Intersect(aray: RAY): real; +begin + Intersect := 0; +end; + +procedure Cylinder.SurfNormal(aray: Ray; time: Real; var oray: Ray); +begin +end; + +function Cylinder.GetColor(aray: Ray; time: Real): LongInt; +begin + GetColor := Shade(aray,time,$c0c0c0); +end; + +constructor PlanePnt.Init(x1,y1,z1,x2,y2,z2,x3,y3,z3: Real); +var + a,b,c,d: Real; +begin + a := y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2); + b := z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2); + c := x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2); + d := -x1*(y2*z3-y3*z2)-x2*(y3*z1-y1*z3)-x3*(y1*z2-y2*z1); + Plane.Init(x1,y1,z1,a,b,c); + xb := x2; yb := y2; zb := z2; + xc := x3; yc := y3; zc := z3; +end; + +function PlanePnt.GetColor(aray: Ray; time: Real): LongInt; +var + d: Real; + c: Integer; +begin + {d := Sqrt( + Sqr(time * aray.dx + aray.ox - xp) + + Sqr(time * aray.dy + aray.oy - yp) + + Sqr(time * aray.dz + aray.oz - zp)); + if d > 255.0 then d := 255.0; + c := 255-Round(d); + if c < 96 then c := 96;} + GetColor := Shade(aray,time,$c0c0c0);{GetRgb(c,c,c)}; +end; + + +constructor Universe.Init(aWidth,aHeight: Integer; r,g,b: Real); +begin + TObject.Init; + Width := aWidth; Height := aHeight; + ar := r; ag := g; ab := b; + Items.Init(5,5); + Lights.Init(3,3); +end; + +destructor Universe.Done; +begin + Items.Done; + Lights.Done; + TObject.Done; +end; + +procedure Universe.Insert(o: PObj3d); +begin + Items.Insert(o); + o^.Owner := @Self; +end; + +procedure Universe.Delete(o: PObj3d); +begin + Items.Delete(o); + o^.Owner := nil; +end; + +procedure Universe.InsertLight(l: PLightSource); +begin + Lights.Insert(l); + l^.Owner := @Self; +end; + +procedure Universe.DeleteLight(l: PLightSource); +begin + Lights.Delete(l); + l^.Owner := nil; +end; + +procedure Universe.DeleteAll; +begin + Items.DeleteAll; + Lights.DeleteAll; +end; + +function Universe.RayColor(aray: Ray): LongInt; +var + t: Real; + o: PObj3d; +begin + t := TraceRay(aray,o); + if o = nil then + RayColor := 0 + else + RayColor := o^.GetColor(aray,t); +end; + +function Universe.TraceRay(aray: Ray; var ob: PObj3d): Real; +type + arr = array[0..1000] of Real; + parr = ^arr; +var + times: parr; + i,j: Integer; + max: Real; + procedure TraceOne(o: PObj3d); far; + begin + times^[i] := o^.Intersect(aray); + Inc(i); + end; +begin + GetMem(times,Items.Count*SizeOf(Real)); + i := 0; + Items.ForEach(@TraceOne); + max := 1.7e38; { darn big } + j := -1; + for i := 0 to Items.Count-1 do + if (times^[i] < max) and (times^[i] > 0.001) then begin + max := times^[i]; j := i; + end; + if j <> -1 then begin + ob := Items.At(j); + TraceRay := max; + end else begin + ob := nil; + TraceRay := 0; + end; + FreeMem(Times,Items.Count*SizeOf(Real)); +end; + +function Universe.TracePoint(x,y: Integer): LongInt; +var + r: Ray; +begin + r.ox := 0; r.oy := 0; r.oz := 0; + r.dx := (x - (Width / 2)) / Width; + r.dy := (y - (Height / 2)) / Height * 0.75; + r.dz := 1; + TracePoint := RayColor(r); +end; + +end. \ No newline at end of file diff --git a/turbo-pascal/rayt.pas b/turbo-pascal/rayt.pas new file mode 100644 index 0000000..756be22 --- /dev/null +++ b/turbo-pascal/rayt.pas @@ -0,0 +1,203 @@ +program RayTracingWithUltraRayTr; +{$X+} +uses Crt,Vga13h,RayTr; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of byte; + ttf: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(ttf,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: TUniverse; st: String); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.ScrHeight-1 do + for x := 0 to u.ScrWidth-1 do begin + u.TracePoint(x,y,c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x,u.ScrHeight-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: TUniverse); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < u.ScrWidth) and (not KeyPressed) do begin + for y := 0 to u.ScrHeight-1 do begin + u.TracePoint(x,u.ScrHeight-1-y,c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x,y,r,g,b); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: TUniverse); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < (u.ScrWidth div 2)) and (not KeyPressed) do begin + for y := 0 to (u.ScrHeight div 2)-1 do begin + u.TracePoint(x*2,u.ScrHeight-1-(y*2),c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + Inc(x); + end; +end; + +procedure Zoom(var u: TUniverse); +var + x,y,i,j: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < (u.ScrWidth div 4)) and (not KeyPressed) do begin + for y := 0 to (u.ScrHeight div 4)-1 do begin + u.TracePoint(x*4,u.ScrHeight-1-(y*4),c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + + + +procedure TraceIt; +var + u: TUniverse; +begin + u.Init(320,200,10, 0,0,0, 0,0,1, 0,1,0, 1, 40,30, 0.2,0.2,0.2, 0,0,0); + + Zoom(u); + Beep; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/rayt1.pas b/turbo-pascal/rayt1.pas new file mode 100644 index 0000000..98f0106 --- /dev/null +++ b/turbo-pascal/rayt1.pas @@ -0,0 +1,240 @@ +program RayTracingWithUltraRayTr; +{$X+,N+} +uses Crt,Vga13h,RayTr; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of byte; + ttf: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(ttf,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: TUniverse; st: String); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.ScrHeight-1 do + for x := 0 to u.ScrWidth-1 do begin + u.TracePoint(x,y,c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x,u.ScrHeight-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: TUniverse); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < u.ScrWidth) and (not KeyPressed) do begin + for y := 0 to u.ScrHeight-1 do begin + u.TracePoint(x,u.ScrHeight-1-y,c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x,y,r,g,b); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: TUniverse); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < (u.ScrWidth div 2)) and (not KeyPressed) do begin + for y := 0 to (u.ScrHeight div 2)-1 do begin + u.TracePoint(x*2,u.ScrHeight-1-(y*2),c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + Inc(x); + end; +end; + +procedure Zoom(var u: TUniverse); +var + x,y,i,j: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < (u.ScrWidth div 4)) and (not KeyPressed) do begin + for y := 0 to (u.ScrHeight div 4)-1 do begin + u.TracePoint(x*4,u.ScrHeight-1-(y*4),c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + TSphere2 = object(TSphere) + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + +procedure TSphere2.GetInfo(Ray: TRay; var Inf: TRayInfo); +begin + TSphere.GetInfo(Ray,Inf); + MakeTrip(0.5,0.5,0.5,Inf.Opacity); + if not Inf.GoingIn then + MakeTrip(0,0,0,Inf.Reflectivity) + else + MakeTrip(0.05,0.05,0.05,Inf.Reflectivity); +end; + +procedure TraceIt; +var + u: TUniverse; + l1,l2,l3,l4: TLightSource; + s1,s3: TSphere; + s2: TSphere2; + p1: TPlane; +begin + u.Init(320,200,10, 0,0,0, 0,0,1, 0,1,0, 1, 40,30, 0.2,0.2,0.2, 0,0,0); + u.Specular := False; + u.ScaleBase := True; + + l1.Init(20,20,-200, 100,100,100); + l2.Init(-20,10,-150, 100,100,100); + l3.Init(3,100,60, 100,100,100); + u.InsertLight(@l1); + u.InsertLight(@l2); + u.InsertLight(@l3); + + s1.Init(-5,3,20,5); + s2.Init(5,1,25,4); + s3.Init(9.5,1.5,30,3); + p1.Init(0,-8,0, 0,1,0); + u.Insert(@s1); + u.Insert(@s2); + u.Insert(@s3); + u.Insert(@p1); + + {Save(u,'brion7.tga');} + Zoom(u); + Beep; + u.DeleteAll; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/rayt2.pas b/turbo-pascal/rayt2.pas new file mode 100644 index 0000000..b94a2df --- /dev/null +++ b/turbo-pascal/rayt2.pas @@ -0,0 +1,255 @@ +program RayTracingWithUltraRayTr; +{$X+} +uses Crt,Vga13h,RayTr; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of byte; + ttf: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(ttf,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: TUniverse; st: String); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.ScrHeight-1 do + for x := 0 to u.ScrWidth-1 do begin + u.TracePoint(x,y,c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x,u.ScrHeight-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: TUniverse); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < u.ScrWidth) and (not KeyPressed) do begin + for y := 0 to u.ScrHeight-1 do begin + u.TracePoint(x,u.ScrHeight-1-y,c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x,y,r,g,b); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: TUniverse); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < (u.ScrWidth div 2)) and (not KeyPressed) do begin + for y := 0 to (u.ScrHeight div 2)-1 do begin + u.TracePoint(x*2,u.ScrHeight-1-(y*2),c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + Inc(x); + end; +end; + +procedure Zoom(var u: TUniverse); +var + x,y,i,j: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < (u.ScrWidth div 4)) and (not KeyPressed) do begin + for y := 0 to (u.ScrHeight div 4)-1 do begin + u.TracePoint(x*4,u.ScrHeight-1-(y*4),c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + TPlane1 = object(TPlane) + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + + TransSphere = object(TSphere) + Col: RgbTriple; + constructor Init(x,y,z,rr,cr,cg,cb: Real); + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + +procedure TPlane1.GetInfo(Ray: TRay; var Inf: TRayInfo); +begin + TPlane.GetInfo(Ray,Inf); + MakeTrip(0,0,0,Inf.Reflectivity); +end; + +constructor TransSphere.Init(x,y,z,rr,cr,cg,cb: Real); +begin + TSphere.Init(x,y,z,rr); + MakeTrip(cr,cg,cb,Col); +end; + +procedure TransSphere.GetInfo(Ray: TRay; var Inf: TRayInfo); +begin + TSphere.GetInfo(Ray,Inf); + MakeTrip(0,0,0,Inf.Reflectivity); + MakeTrip(1-Col.r,1-Col.g,1-Col.b,Inf.Opacity); + Inf.Color := Col; +end; + +procedure TraceIt; +var + u: TUniverse; + p1,p2: TPlane1; + l1,l2,l3: TLightSource; + s1,s2,s3: TransSphere; +begin + u.Init(320,200,10, 0,0,0, 0,0,1, 0,1,0, 1, 40,30, 0.5,0.5,0.5, 0,0,0); + + l1.Init(-8.5,3,50, 20,20,20); + l2.Init(0,3,65, 20,20,20); + l3.Init(8.5,3,50, 20,20,20); + u.InsertLight(@l1); + u.InsertLight(@l2); + u.InsertLight(@l3); + + s1.Init(-8.5,3,50,2, 1,0,0); + s2.Init(0,3,65,2, 0,1,0); + s3.Init(8.5,3,50,2, 0,0,1); + p1.Init(0,-8,0, 0,1,0); + p2.Init(0,15,0, 0,-1,0); + u.Insert(@p1); + u.Insert(@p2); + u.Insert(@s1); + u.Insert(@s2); + u.Insert(@s3); + + Save(u,'brion8.tga'); + {Zoom(u);} + Beep; + u.DeleteAll; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/rayt3.pas b/turbo-pascal/rayt3.pas new file mode 100644 index 0000000..96b2378 --- /dev/null +++ b/turbo-pascal/rayt3.pas @@ -0,0 +1,350 @@ +program RayTracingWithUltraRayTr; +{$X+} +uses Crt,Vga13h,RayTr; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of byte; + ttf: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(ttf,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: TUniverse; st: String); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.ScrHeight-1 do + for x := 0 to u.ScrWidth-1 do begin + u.TracePoint(x,y,c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x,u.ScrHeight-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: TUniverse); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < u.ScrWidth) and (not KeyPressed) do begin + for y := 0 to u.ScrHeight-1 do begin + u.TracePoint(x,u.ScrHeight-1-y,c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x,y,r,g,b); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: TUniverse); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < (u.ScrWidth div 2)) and (not KeyPressed) do begin + for y := 0 to (u.ScrHeight div 2)-1 do begin + u.TracePoint(x*2,u.ScrHeight-1-(y*2),c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + Inc(x); + end; +end; + +procedure Zoom(var u: TUniverse); +var + x,y,i,j: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < (u.ScrWidth div 4)) and (not KeyPressed) do begin + for y := 0 to (u.ScrHeight div 4)-1 do begin + u.TracePoint(x*4,u.ScrHeight-1-(y*4),c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + TStraw = object(TCylinder) + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + TOrange = object(TSphere) + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + TJuiceBox = object(TObject3d) + Pos,Normal,Size: TPoint3d; + constructor Init(xa,ya,za,vx,vy,vz,sx,sy,sz: Real); + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + +constructor TJuiceBox.Init(xa,ya,za,vx,vy,vz,sx,sy,sz: Real); +begin + TObject3d.Init; + Pos.SetTo(xa,ya,za); + Normal.SetTo(vx,vy,vz); + Normal.MakeUnit; + Size.SetTo(sx,sy,sz); +end; + +procedure TJuiceBox.GetInfo(Ray: TRay; var Inf: TRayInfo); +var + r1: TRay; + times: array[1..8] of Real; { 6 more later } + ps: array[1..8] of TPoint3d; + p1,p2,p3: Real; + i,j: Integer; +begin + r1 := Ray; + r1.o.Sub(Pos); + r1.o.RotateFrom(Normal); + r1.d.RotateFrom(Normal); + { + p1 := Pos.x * Normal.x + Pos.y * Normal.y + Pos.z * Normal.z; + p2 := ray.o.x * Normal.x + ray.o.y * Normal.y + ray.o.z * Normal.z; + p3 := ray.d.x * Normal.x + ray.d.y * Normal.y + ray.d.z * Normal.z; + if p3 = 0 then p3 := 0.001; + Inf.Time := (p1-p2)/p3; + } + if r1.d.x = 0 then r1.d.x := 0.001; + times[1] := -r1.o.x/r1.d.x; + times[2] := -r1.o.y/r1.d.y; + times[3] := (Size.x-r1.o.x)/r1.d.x; + times[4] := (Size.y-r1.o.y)/r1.d.y; + times[5] := -r1.o.z/r1.d.z; + times[6] := -1; + times[7] := -1; + times[8] := ((Size.x/2)-r1.o.x)/r1.d.x; + for i := 1 to 8 do + ps[i].SetTo( + r1.o.x+r1.d.x*times[i], + r1.o.y+r1.d.y*times[i], + r1.o.z+r1.d.z*times[i]); + if (ps[1].y < 0) or (ps[1].y > Size.y) or + (ps[1].z < 0) or (ps[1].z > Size.z) then times[1] := -1; + if (ps[2].x < 0) or (ps[2].x > Size.x) or + (ps[2].z < 0) or (ps[2].z > Size.z) then times[2] := -1; + if (ps[3].y < 0) or (ps[1].y > Size.y) or + (ps[3].z < 0) or (ps[3].z > Size.z) then times[3] := -1; + if (ps[4].x < 0) or (ps[4].y > Size.x) or + (ps[4].z < 0) or (ps[4].z > Size.z) then times[4] := -1; + if (ps[5].x < 0) or (ps[5].x > Size.x) or + (ps[5].y < 0) or (ps[5].y > Size.y) then times[5] := -1; + if (ps[8].y < 0) or (ps[8].y > Size.y) or + (ps[8].z < (Size.z*0.95)) or (ps[8].z > Size.z) then times[8] := -1; + Inf.Time := MaxReal; + j := -1; + for i := 1 to 8 do + if (times[i] < Inf.Time) and (times[i] > 0.001) then begin + Inf.Time := times[i]; + j := i; + end; + Inf.Hit := (j <> -1); + if not Inf.Hit then Exit; + Inf.Pos.SetTo( + Ray.o.x+Ray.d.x*Inf.Time, + Ray.o.y+Ray.d.y*Inf.Time, + Ray.o.z+Ray.d.z*Inf.Time); + case j of + 1: Inf.Normal.SetTo(-1,0,0); + 2: Inf.Normal.SetTo(0,-1,0); + 3: Inf.Normal.SetTo(1,0,0); + 4: Inf.Normal.SetTo(0,1,0); + 5: Inf.Normal.SetTo(0,0,-1); + 6: ; + 7: ; + 8: if r1.d.x > 0 then + Inf.Normal.SetTo(-1,0,0) + else + Inf.Normal.SetTo(1,0,0); + end; + Inf.Normal.RotateTo(Normal); + MakeTrip(0.6,0.6,0.6,Inf.Color); + MakeTrip(1,1,1,Inf.Opacity); + MakeTrip(0,0,0,Inf.Reflectivity); + Inf.SpecularN := 50; + Inf.Brightness := 1; + Inf.GoingIn := True; + Inf.IndexRefraction := 0.95; +end; + +procedure TStraw.GetInfo(Ray: TRay; var Inf: TRayInfo); +begin + TCylinder.GetInfo(Ray,Inf); + if not Inf.Hit then Exit; + MakeTrip(0.9,0.9,0.9,Inf.Color); +end; + +procedure TOrange.GetInfo(Ray: TRay; var Inf: TRayInfo); +var + p1: TPoint3d; +begin + TSphere.GetInfo(Ray,Inf); + if not Inf.Hit then Exit; + MakeTrip(0,0,0,Inf.Reflectivity); + MakeTrip(0.9,0.6,0,Inf.Color); + p1 := Inf.Pos; p1.Sub(Pos); + RandSeed := + (Word(Round(ArcTan(p1.x/p1.y)*255/pi)) shl 8) or + Round(ArcTan(p1.z/p1.y)*255/pi); + with Inf.Normal do begin + x := x + ((Random(200)-100)/100000); + y := y + ((Random(200)-100)/100000); + z := z + ((Random(200)-100)/100000); + end; +end; + +procedure TraceIt; +var + u: TUniverse; + l1: TLightSource; + p1: TPlane; + c1: TStraw; + s1: TOrange; + b1: TJuiceBox; +begin + u.Init(320,200,10, 0,0,0, 0,0,1, 0,1,0, 1, 40,30, 0.5,0.5,0.5, 0,0,0); + u.Reflection := False; + u.Shading := False; + + l1.Init(20,20,-50, 50,50,50); + u.InsertLight(@l1); + + p1.Init(0,-8,0, 0,1,0); + s1.Init(4,-1,30, 7); + c1.Init(4,-1,30, 0.75,1,-1.25, 0.75,12,0); + b1.Init(-20,-8,40, 0,1,0, 10,10,20); + u.Insert(@p1); + u.Insert(@s1); + u.Insert(@c1); + u.Insert(@b1); + + Zoom(u); + Beep; + u.DeleteAll; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/rayt4.pas b/turbo-pascal/rayt4.pas new file mode 100644 index 0000000..a94974d --- /dev/null +++ b/turbo-pascal/rayt4.pas @@ -0,0 +1,302 @@ +program RayTracingWithUltraRayTr; +{$X+} +uses Crt,Vga13h,RayTr; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of byte; + ttf: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(ttf,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: TUniverse; st: String); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.ScrHeight-1 do + for x := 0 to u.ScrWidth-1 do begin + u.TracePoint(x,y,c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x,u.ScrHeight-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: TUniverse); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < u.ScrWidth) and (not KeyPressed) do begin + for y := 0 to u.ScrHeight-1 do begin + u.TracePoint(x,u.ScrHeight-1-y,c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x,y,r,g,b); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: TUniverse); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < (u.ScrWidth div 2)) and (not KeyPressed) do begin + for y := 0 to (u.ScrHeight div 2)-1 do begin + u.TracePoint(x*2,u.ScrHeight-1-(y*2),c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + Inc(x); + end; +end; + +procedure Zoom(var u: TUniverse); +var + x,y,i,j: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < (u.ScrWidth div 4)) and (not KeyPressed) do begin + for y := 0 to (u.ScrHeight div 4)-1 do begin + u.TracePoint(x*4,u.ScrHeight-1-(y*4),c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +type + TSphere2 = object(TSphere) + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + TPlane2 = object(TPlane) + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + +procedure TSphere2.GetInfo(Ray: TRay; var Inf: TRayInfo); +var + a, b, c, t1, t2, t3, close, farther: real; + p1,p2: TPoint3d; +begin + a := ray.d.x * ray.d.x + ray.d.y * ray.d.y + ray.d.z * ray.d.z; + close := -1.0; + farther := -1.0; + if a <> 0 then begin + b := 2.0 * ((ray.o.x - Pos.x) * ray.d.x + + (ray.o.y - Pos.y) * ray.d.y + + (ray.o.z - Pos.z) * ray.d.z); + c := (ray.o.x - Pos.x) * (ray.o.x - Pos.x) + + (ray.o.y - Pos.y) * (ray.o.y - Pos.y) + + (ray.o.z - Pos.z) * (ray.o.z - Pos.z) - r2; + t1 := b * b - 4.0 * a * c; + if t1 > 0 then begin + t2 := sqrt(t1); + t3 := 2.0 * a; + close := -(b + t2) / t3; + farther := -(b - t2) / t3; + end; + end; + p1.SetTo( + ray.o.x+ray.d.x*close, + ray.o.y+ray.d.y*close, + ray.o.z+ray.d.z*close); + p2.SetTo( + ray.o.x+ray.d.x*farther, + ray.o.y+ray.d.y*farther, + ray.o.z+ray.d.z*farther); + if (p1.z-Pos.z) < -(r * 0.85) then close := -1; + if (p2.z-Pos.z) < -(r * 0.85) then farther := -1; + if (close <= 0.001) and (farther > 0.001) then begin + Inf.Time := farther; Inf.GoingIn := False; + end else + if (close > 0.001) and (farther <= 0.001) then begin + Inf.Time := close; Inf.GoingIn := False; + end else begin + Inf.GoingIn := True; + if close < farther then + Inf.Time := close + else + Inf.Time := farther; + end; + Inf.Hit := (Inf.Time > 0.001); + if not Inf.Hit then Exit; + Inf.Pos.SetTo( + ray.o.x+ray.d.x*Inf.Time, + ray.o.y+ray.d.y*Inf.Time, + ray.o.z+ray.d.z*Inf.Time); + Inf.Normal := Inf.Pos; + Inf.Normal.Sub(Pos); + if not Inf.GoingIn then Inf.Normal.Scale(-1); + Inf.Brightness := 1; + Inf.IndexRefraction := 0.95; + MakeTrip(1,1,1,Inf.Opacity); + MakeTrip(0,0,0,Inf.Reflectivity); + Inf.SpecularN := 200; + MakeTrip(0.8,0.8,0.8,Inf.Color); +end; + +procedure TPlane2.GetInfo(Ray: TRay; var Inf: TRayInfo); +begin + TPlane.GetInfo(Ray,Inf); + MakeTrip(0,0,0,Inf.Reflectivity); + Inf.SpecularN := 1; + MakeTrip(0.9,0.9,0.9,Inf.Color); +end; + +procedure TraceIt; +var + u: TUniverse; + l1,l2: TLightSource; + p1: TPlane2; + s1: TSphere2; + s2,s3,s4: TSphere; +begin + u.Init(320,200,10, 0,1,0, 0,0,1, 0,1,0, 1, 40,30, 0.2,0.2,0.2, 0,0,0); + u.Specular := False; + + l1.Init(0,-1.7,25, 500,500,500); + l2.Init(20,60,20, 30,30,30); + u.InsertLight(@l1); + u.InsertLight(@l2); + + p1.Init(0,-2,0, 0,1,0); + s1.Init(0,2,25,10); + s2.Init(0,-1,15,1); + s3.Init(-2.25,-1,15.5,1); + s4.Init(2.25,-1,15.5,1); + u.Insert(@p1); + u.Insert(@s1); + u.Insert(@s2); + u.Insert(@s3); + u.Insert(@s4); + + {Zoom(u);} + Save(u,'brion9.tga'); + Beep; + u.DeleteAll; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); +end. \ No newline at end of file diff --git a/turbo-pascal/rayt5.pas b/turbo-pascal/rayt5.pas new file mode 100644 index 0000000..01594ee --- /dev/null +++ b/turbo-pascal/rayt5.pas @@ -0,0 +1,413 @@ +program RayTracingWithUltraRayTr; +{$X+} +uses Crt,Vga13h,RayTr,Dos; + +type + TgaHeader = record { 18 bytes total } + who_knows: array[1..12] of Byte; + Width: Word; + Height: Word; + BitsPerPixel: Byte; + who_knows2: Byte; + end; + +const + DefaultHeader: TgaHeader = ( + who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Width: 320; + Height: 200; + BitsPerPixel: 24; + who_knows2: 32 + ); + +var + tf: File of byte; + ttf: File absolute tf; + +procedure StartTga(s: String); +begin + Assign(tf,s); + Rewrite(tf); + BlockWrite(ttf,DefaultHeader,18); +end; + +procedure EndTga; +begin + Close(tf); +end; + +procedure TgaDot(r,g,b: Integer); +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Write(tf,Byte(b),Byte(g),Byte(r)); +end; + +{ r,g,b:0-255 } +function Rgb(r,g,b: Integer): Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0); +end; + +procedure RgbDot(x,y,r,g,b: Integer); +var + r1,g1,b1,r2,g2,b2,c1,c2: Integer; +begin + if r > 255 then r := 255; + if g > 255 then g := 255; + if b > 255 then b := 255; + if r < 0 then r := 0; + if g < 0 then g := 0; + if b < 0 then b := 0; + r1 := r and $e0; g1 := g and $e0; b1 := b and $c0; + r2 := r1 + (r mod 32)+16; + g2 := g1 + (g mod 32)+16; + b2 := b1 + (b mod 64)+32; + c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2); + if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2); +end; + +procedure SetUpRgb; +var + Clrs: array[0..255,0..2] of Byte; + i: Integer; +begin + for i := 0 to 255 do begin + Clrs[i,0] := (i and $e0) shr 2; + Clrs[i,1] := (i and $1c) shl 1; + Clrs[i,2] := (i and 3) shl 4; + case Clrs[i,2] of + 15..31: Inc(Clrs[i,2],4); + 32..63: Inc(Clrs[i,2],8); + end; + end; + SetColorBlock(0,256,Clrs); +end; + +procedure Save(var u: TUniverse; st: String); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + StartTga(st); + x := 0; + for y := 0 to u.ScrHeight-1 do + for x := 0 to u.ScrWidth-1 do begin + u.TracePoint(x,y,c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x,u.ScrHeight-1-y,r,g,b); + TgaDot(r,g,b); + end; + EndTga; +end; + +procedure Draw(var u: TUniverse); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < u.ScrWidth) and (not KeyPressed) do begin + for y := 0 to u.ScrHeight-1 do begin + u.TracePoint(x,u.ScrHeight-1-y,c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x,y,r,g,b); + end; + Inc(x); + end; +end; + +procedure Qwik(var u: TUniverse); +var + x,y: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < (u.ScrWidth div 2)) and (not KeyPressed) do begin + for y := 0 to (u.ScrHeight div 2)-1 do begin + u.TracePoint(x*2,u.ScrHeight-1-(y*2),c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b); + RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b); + end; + Inc(x); + end; +end; + +procedure Zoom(var u: TUniverse); +var + x,y,i,j: Integer; + c: RgbTriple; + r,g,b: Integer; +begin + x := 0; + while (x < (u.ScrWidth div 4)) and (not KeyPressed) do begin + for y := 0 to (u.ScrHeight div 4)-1 do begin + u.TracePoint(x*4,u.ScrHeight-1-(y*4),c); + r := Trunc(c.r*255); + g := Trunc(c.g*255); + b := Trunc(c.b*255); + for i := 0 to 3 do + for j := 0 to 3 do + RgbDot(x*4+i,y*4+j,r,g,b); + end; + Inc(x); + end; +end; + +procedure Beep; +begin + Sound(220); { Beep } + Delay(200); { For 200 ms } + NoSound; { Relief! } +end; + +var + Hour1,Minute1,Second1,Sec1001, + Hour2,Minute2,Second2,Sec1002: Word; + +procedure StartTime; +begin + GetTime(Hour1, Minute1, Second1, Sec1001); +end; + +procedure EndTime; +begin + GetTime(Hour2, Minute2, Second2, Sec1002); +end; + +function LeadingZero(w : Word) : String; +var + s : String; +begin + Str(w:0,s); + if Length(s) = 1 then + s := '0' + s; + LeadingZero := s; +end; + +procedure ShowTime; +var + time1,time2,time3: Word; +begin + Writeln('Starting time: ',Hour1,':',LeadingZero(Minute1)); + Writeln('Ending time: ',Hour2,':',LeadingZero(Minute2)); + time1 := Hour1*60+Minute1; + time2 := Hour2*60+Minute2; + time3 := time2-time1; + Writeln('Total time: ',time3 div 60,':',LeadingZero(time3 mod 60)); +end; + +type + PPillar = ^TCylinder; + PFloor = ^TFloor; + PCeiling = ^TCeiling; + PMirrorSphere = ^TMirrorSphere; + PPitInside = ^TPitInside; + PBonfire = ^TBonfire; + PFireCyl = ^TFireCyl; + + TPitInside = object(TCylinder) + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + TFloor = object(TPlane) + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + TCeiling = object(TPlane) + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + TMirrorSphere = object(TObject3d) + Pos: TPoint3d; + r: Float; + constructor Init(x,y,z,ra: Float); + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + TBonfire = object(TSphere) + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + TFireCyl = object(TCylinder) + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + +procedure TFloor.GetInfo(Ray: TRay; var Inf: TRayInfo); +var + d1,d2,d3: Float; +begin + TPlane.GetInfo(Ray,Inf); + if not Inf.Hit then Exit; + d1 := Sqrt(Sqr(Inf.Pos.x)+Sqr(Inf.Pos.y)+Sqr(Inf.Pos.z-4)); + d2 := Sqrt(Sqr(Inf.Pos.x-3)+Sqr(Inf.Pos.y)+Sqr(Inf.Pos.z+7)); + d3 := Sqrt(Sqr(Inf.Pos.x+3)+Sqr(Inf.Pos.y)+Sqr(Inf.Pos.z+7)); + if ((d1 > 3) and (d1 < 5) and + ((Inf.Pos.z > 4) or ((Inf.Pos.x < -1) or (Inf.Pos.x > 1)))) or + (d2 < 2) or (d3 < 2) then + Inf.Hit := False; + MakeTrip(0,0,0,Inf.Reflectivity); +end; + +procedure TCeiling.GetInfo(Ray: TRay; var Inf: TRayInfo); +begin + TPlane.GetInfo(Ray,Inf); + MakeTrip(0,0,0,Inf.Reflectivity); + if (Inf.Pos.x < -9) or (Inf.Pos.x > 9) or + (Inf.Pos.z < -10) or (Inf.Pos.z > 10) then + Inf.Hit := False; +end; + +constructor TMirrorSphere.Init(x,y,z,ra: Float); +begin + TObject3d.Init; + Pos.SetTo(x,y,z); + r := ra; +end; + +procedure TMirrorSphere.GetInfo(Ray: TRay; var Inf: TRayInfo); +var + c,f: Float; + p1,p2: TPoint3d; +begin + GetSphereInfo(Ray,Pos,r,c,f); + p1.SetTo( + Ray.o.x+Ray.d.x*c, + Ray.o.y+Ray.d.y*c, + Ray.o.z+Ray.d.z*c); + p2.SetTo( + Ray.o.x+Ray.d.x*f, + Ray.o.y+Ray.d.y*f, + Ray.o.z+Ray.d.z*f); + if (p1.z < Pos.z) or (p1.y < Pos.y) then c := -1; + if (p2.z < Pos.z) or (p2.y < Pos.y) then f := -1; + Inf.Hit := (c > 0.001) or (f > 0.001); + if not Inf.Hit then Exit; + Inf.Time := MaxReal; + if c > 0.001 then Inf.Time := c; + if (f < Inf.Time) and (f > 0.001) then Inf.Time := f; + if Inf.Time = c then Inf.Pos := p1 else Inf.Pos := p2; + Inf.Normal := Inf.Pos; + Inf.Normal.Sub(Pos); + Inf.GoingIn := (Inf.Normal.Dot(Ray.d)) < 0; + if not Inf.GoingIn then begin + Inf.Normal.Scale(-1); + MakeTrip(0.75,0.75,0.75,Inf.Reflectivity); + MakeTrip(0.25,0.25,0.25,Inf.Color); + Inf.SpecularN := 200; + end else begin + MakeTrip(0,0,0,Inf.Reflectivity); + MakeTrip(0.5,0.5,0.5,Inf.Color); + Inf.SpecularN := 1; + end; + Inf.Brightness := 1; + MakeTrip(1,1,1,Inf.Opacity); +end; + +procedure TBonfire.GetInfo(Ray: TRay; var Inf: TRayInfo); +var + z: Float; +begin + TSphere.GetInfo(Ray,Inf); + if not Inf.Hit then Exit; + MakeTrip(0,0,0,Inf.Reflectivity); + Inf.SpecularN := 50; + if Inf.Pos.y < Pos.y then begin + MakeTrip(1,1,1,Inf.Opacity); + MakeTrip(0.8,0.8,0.8,Inf.Color); + Inf.Brightness := 1; + end else begin + MakeTrip(0,0,0,Inf.Opacity); + z := 1-((Inf.Pos.y-Pos.y)/r); + MakeTrip(z,z*0.667,0,Inf.Color); + Inf.Brightness := 0.3; + end; + Inf.IndexRefraction := 1; +end; + +procedure TFireCyl.GetInfo(Ray: TRay; var Inf: TRayInfo); +var + t,z: Float; + r1: TRay; +begin + TCylinder.GetInfo(Ray,Inf); + if not Inf.Hit then Exit; + Inf.Hit := ((Inf.Pos.z > 4) or ((Inf.Pos.x < -1) or (Inf.Pos.x > 1))); + if not Inf.Hit then begin + r1.o := Inf.Pos; + r1.d := Ray.d; + t := Inf.Time; + GetInfo(r1,Inf); + Inf.Time := Inf.Time + t; + end else begin + MakeTrip(0,0,0,Inf.Opacity); + z := 1-((Inf.Pos.y-Pos.y)/h); + MakeTrip(z,z*0.667,0,Inf.Color); + Inf.Brightness := 0.5; + Inf.IndexRefraction := 1; + end; +end; + +procedure TPitInside.GetInfo(Ray: TRay; var Inf: TRayInfo); +begin + TCylinder.GetInfo(Ray,Inf); + MakeTrip(0.8,0.8,0.8,Inf.Opacity); +end; + +procedure TraceIt; +var + u: TUniverse; + l: PLightSource; + o: PObject3d; + i,j: Integer; +begin + u.Init(320,200,10, 0,5,-20, 0,0,1, 0,1,0, 1, 40,30, 0.2,0.2,0.2, 0,0,0); + u.Specular := False; + + u.InsertLight(New(PLightSource,Init(-3,0,-7, 6,4,0))); + u.InsertLight(New(PLightSource,Init(3,0,-7, 6,4,0))); + u.InsertLight(New(PLightSource,Init(75,50,100, 100,100,100))); + u.InsertLight(New(PLightSource,Init(0,-20,4, 600,400,0))); + u.Insert(New(PFloor,Init(0,0,0, 0,1,0))); + u.Insert(New(PCeiling,Init(0,10,0, 0,1,0))); + u.Insert(New(PMirrorSphere,Init(0,0,4, 3))); + u.Insert(New(PBonfire,Init(-3,0,-7, 2))); + u.Insert(New(PBonfire,Init(3,0,-7, 2))); + u.Insert(New(PPitInside,Init(0,0,4, 0,-1,0, 3,10,0))); + u.Insert(New(PPitInside,Init(0,0,4, 0,-1,0, 5,10,0))); + u.Insert(New(PFireCyl,Init(0,-2,4, 0,1,0, 4,12,0))); + for i := -2 to 2 do begin + u.Insert(New(PPillar,Init(-7,0,i*4, 0,1,0, 1,10,0))); + u.Insert(New(PPillar,Init(7,0,i*4, 0,1,0, 1,10,0))); + end; + Draw(u); + {StartTime; + Save(u,'brion10.tga'); + EndTime;} + Beep; + u.Done; +end; + +begin + Set13h; + SetUpRgb; + TraceIt; + ReadKey; + BiosMode(3); + ShowTime; +end. \ No newline at end of file diff --git a/turbo-pascal/raytr.pas b/turbo-pascal/raytr.pas new file mode 100644 index 0000000..538e617 --- /dev/null +++ b/turbo-pascal/raytr.pas @@ -0,0 +1,980 @@ +unit RayTr; +{ Everything-independent super ultra ray-tracing + by Brion Vibber, 12-13-92, based on lots of stuff + last revised 12-25-92, unless I forget to change this line. + 12-25-92: set for Floats +} +interface + +{$N+} + +uses Objects; { For TCollection, a super-useful thingy } + +type + Float = Double; +const + MinReal = 5.0e-324; + MaxReal = 1.7e308; + +type + PUniverse = ^TUniverse; + PObject3d = ^TObject3d; + PLightSource = ^TLightSource; + PPoint3d = ^TPoint3d; + PRayInfo = ^TRayInfo; + {PPolygon3d = ^TPolygon3d;} + {PPolygonList = ^TPolygonList;} + + TPoint3d = object + x,y,z: Float; + procedure SetTo(ax,ay,az: Float); + procedure MakeUnit; + procedure Cross(v: TPoint3d); + function Dot(v: TPoint3d): Float; + procedure Add(v: TPoint3d); + procedure Sub(v: TPoint3d); + procedure Scale(s: Float); + function Length: Float; + procedure RotateFrom(v: TPoint3d); + procedure RotateTo(v: TPoint3d); + end; + TRay = record + case Integer of + 0: (Origin, Direction: TPoint3d); + 1: (o,d: TPoint3d); { Shorthand versions } + 2: (a,b: TPoint3d); { " " " " } + end; + RgbTriple = record + r,g,b: Float; { 0 - 1 } + end; + TRayInfo = record + Hit: Boolean; + Time: Float; + GoingIn: Boolean; + Pos,Normal: TPoint3d; + Reflectivity,Opacity,Color: RgbTriple; + Brightness: Float; { 0 - 1 } + SpecularN,IndexRefraction: Float; + end; + + TObject3d = object(TObject) + Owner: PUniverse; + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + function SpecularW(Angle: Float): Float; virtual; + end; + TLightSource = object(TObject) + Pos: TPoint3d; + Color: RgbTriple; + constructor Init(x,y,z,r,g,b: Float); + end; + + TUniverse = object(TObject) + Shading,Shadows,Specular,Transparency,Reflection,ScaleBase: Boolean; + ScrWidth,ScrHeight: Integer; + Eye,Gaze,Up,vX,vY,vU,vV,vH,vM: TPoint3d; + DistScreen,AngleHoriz,AngleVert: Float; { Use degrees } + BackColor,Ambient: RgbTriple; + ReflectCount,MaxReflect: Integer; + Items,Lights: TCollection; + constructor Init(aScrWidth,aScrHeight,aMaxReflect: Integer; + anEyeX,anEyeY,anEyeZ, + aGazeX,aGazeY,aGazeZ,anUpX,anUpY,anUpZ,aDistScreen, + anAngleHoriz,anAngleVert,anAmbientR,anAmbientG,anAmbientB, + aBackR,aBackG,aBackB: Float); + destructor Done; virtual; + procedure TraceRay(Ray: TRay; var Col: RgbTriple); + procedure TracePoint(x,y: Integer; var Col: RgbTriple); + procedure Insert(Item: PObject3d); + procedure Delete(Item: PObject3d); + procedure InsertLight(Item: PLightSource); + procedure DeleteLight(Item: PLightSource); + procedure DeleteAllObjects; + procedure DeleteAllLights; + procedure DeleteAll; + procedure FreeAllObjects; + procedure FreeAllLights; + procedure FreeAll; + end; + + PSphere = ^TSphere; + PPlane = ^TPlane; + PPlanePts = ^TPlanePts; + PCylinder = ^TCylinder; + PCone = ^TCone; + + TSphere = object(TObject3d) + Pos: TPoint3d; + r,r2: Float; + constructor Init(xa,ya,za,ra: Float); + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + TPlane = object(TObject3d) + Pos,Normal: TPoint3d; + constructor Init(xa,ya,za,vx,vy,vz: Float); + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + TPlanePts = object(TPlane) + constructor Init(x1,y1,z1,x2,y2,z2,x3,y3,z3: Float); + end; + TCylinder = object(TObject3d) + Pos,Normal: TPoint3d; + r,r2,h: Float; + Ends: ShortInt; { 0 = no, 1 = bottom, 2 = top, 3 = both } + constructor Init(xa,ya,za,vx,vy,vz,ra,ha: Float; aends: ShortInt); + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + TCone = object(TObject3d) + Pos,Normal: TPoint3d; + ra,rb,ra2,rb2,h,th: Float; + Ends: ShortInt; { 0 = no, 1 = bottom, 2 = top, 3 = both } + constructor Init(xa,ya,za,vx,vy,vz,ra1,rb1,ha: Float; aends: ShortInt); + procedure GetInfo(Ray: TRay; var Inf: TRayInfo); virtual; + end; + +procedure GetSphereInfo(Ray: TRay; Pos: TPoint3d; r: Float; var close,farther: Float); +procedure GetCylinderInfo(Ray: TRay; Pos,Normal: TPoint3d; r,h: Float; ends: ShortInt; + var close,farther,end1,end2: Float); +procedure GetConeInfo(Ray: TRay; Pos,Normal: TPoint3d; ra,rb,h: Float; ends: ShortInt; + var close,farther,end1,end2: Float); +procedure GetPlaneInfo(Ray: TRay; Pos,Normal: TPoint3d; var time: Float); + +procedure MakeTrip(r,g,b: Float; var c: RgbTriple); +function Power(x,y: Float): Float; +function Log(x,y: Float): Float; +function ArcSin(x: Float): Float; +function ArcCos(x: Float): Float; +function Tan(x: Float): Float; + +implementation + +procedure MakeTrip(r,g,b: Float; var c: RgbTriple); +begin + c.r := r; c.g := g; c.b := b; +end; + +function Power(x,y: Float): Float; +var + i: Integer; + x1: Float; +begin + {Power := Exp(y * Ln(x));} + x1 := x; + for i := 1 to Trunc(y)-1 do + x1 := x1 * x; + Power := x; +end; + +function Log(x,y: Float): Float; +begin + Log := Ln(x) / Ln(y); +end; + +function ArcSin(x: Float): Float; +begin + ArcSin := ArcTan(x / Sqrt(1 - (x*x))); +end; + +function ArcCos(x: Float): Float; +begin + ArcCos := ArcTan(Sqrt(1 - Sqr(x)) / x); +end; + +function Tan(x: Float): Float; +begin + Tan := Sin(x) / Cos(x); +end; + +procedure TPoint3d.SetTo(ax,ay,az: Float); +begin + x := ax; y := ay; z := az; +end; + +procedure TPoint3d.MakeUnit; +var + d: Float; +begin + d := Sqrt(Sqr(x)+Sqr(y)+Sqr(z)); + if d <> 0 then begin + x := x / d; + y := y / d; + z := z / d; + end; +end; + +procedure TPoint3d.Cross(v: TPoint3d); +var + xa,ya: Float; +begin + xa := y*v.z - z*v.y; + ya := z*v.x - x*v.z; + z := x*v.y - y*v.x; + x := xa; y := ya; +end; + +function TPoint3d.Dot(v: TPoint3d): Float; +begin + Dot := x*v.x + y*v.y + z*v.z; +end; + +procedure TPoint3d.Add(v: TPoint3d); +begin + x := x + v.x; + y := y + v.y; + z := z + v.z; +end; + +procedure TPoint3d.Sub(v: TPoint3d); +begin + x := x - v.x; + y := y - v.y; + z := z - v.z; +end; + +procedure TPoint3d.Scale(s: Float); +begin + x := x * s; + y := y * s; + z := z * s; +end; + +function TPoint3d.Length: Float; +begin + Length := Sqrt(Sqr(x)+Sqr(y)+Sqr(z)); +end; + +procedure TPoint3d.RotateFrom(v: TPoint3d); +var + d,xa,ya,za,cos1,sin1: Float; +begin + v.MakeUnit; + d := Sqrt(Sqr(v.y)+Sqr(v.z)); + cos1 := v.z/d; sin1 := v.y/d; + ya := y*cos1-z*sin1; z := y*sin1+z*cos1; y := ya; + cos1 := d; sin1 := -v.x; + za := z*cos1-x*sin1; x := z*sin1+x*cos1; z := za; +end; + +procedure TPoint3d.RotateTo(v: TPoint3d); +var + d,xa,ya,za,cos1,sin1: Float; +begin + v.MakeUnit; + d := Sqrt(Sqr(v.y)+Sqr(v.z)); + cos1 := -v.z/d; sin1 := -v.y/d; + ya := y*cos1-z*sin1; z := y*sin1+z*cos1; y := ya; + cos1 := -d; sin1 := v.x; + za := z*cos1-x*sin1; x := z*sin1+x*cos1; z := za; +end; + + +procedure TObject3d.GetInfo(Ray: TRay; var Inf: TRayInfo); +begin + Inf.Hit := False; +end; + +function TObject3d.SpecularW(Angle: Float): Float; +begin + SpecularW := Angle / 90; +end; + + +constructor TLightSource.Init(x,y,z,r,g,b: Float); +begin + TObject.Init; + Pos.x := x; Pos.y := y; Pos.z := z; + Color.r := r; Color.g := g; Color.b := b; +end; + +constructor TUniverse.Init(aScrWidth,aScrHeight,aMaxReflect: Integer; + anEyeX,anEyeY,anEyeZ, + aGazeX,aGazeY,aGazeZ,anUpX,anUpY,anUpZ,aDistScreen, + anAngleHoriz,anAngleVert,anAmbientR,anAmbientG,anAmbientB, + aBackR,aBackG,aBackB: Float); +begin + TObject.Init; + Items.Init(5,5); + Lights.Init(5,5); + Shading := True; Shadows := True; Specular := True; + Transparency := True; Reflection := True; ScaleBase := False; + ScrWidth := aScrWidth; ScrHeight := aScrHeight; + MaxReflect := aMaxReflect; + Eye.x := anEyeX; Eye.y := anEyeY; Eye.z := anEyeZ; + Gaze.x := aGazeX; Gaze.y := aGazeY; Gaze.z := aGazeZ; + Up.x := anUpX; Up.y := anUpY; Up.z := anUpZ; + DistScreen := aDistScreen; + AngleHoriz := anAngleHoriz; AngleVert := anAngleVert; + Ambient.r := anAmbientR; Ambient.g := anAmbientG; Ambient.b := anAmbientB; + MakeTrip(aBackR,aBackG,aBackB,BackColor); + Gaze.MakeUnit; + Up.MakeUnit; + vX := Gaze; vX.Cross(Up); vX.MakeUnit; + vY := vX; vY.Cross(Gaze); vY.MakeUnit; + vM := Gaze; vM.Scale(DistScreen); vM.Add(Eye); + vH := vX; vH.Scale(DistScreen*Tan(AngleHoriz*pi/180)); + vV := vY; vV.Scale(DistScreen*Tan(AngleVert*pi/180)); +end; + +destructor TUniverse.Done; +begin + Items.Done; + Lights.Done; + TObject.Done; +end; + +procedure TUniverse.TraceRay(Ray: TRay; var Col: RgbTriple); +type + InfAr = array[0..(65520 div SizeOf(TRayInfo))-1] of TRayInfo; +var + Inf: ^InfAr; + Info: TRayInfo; + i,j,k,l: Integer; + c,lc: RgbTriple; + ra,Min,cosTheta,ir,ig,ib,d: Float; + ndotn, idotn, idotn_div_ndotn_x2: Float; + li,v1,v2: TPoint3d; + r: TRay; +begin + GetMem(Inf,Items.Count * SizeOf(TRayInfo)); + Ray.d.MakeUnit; + for i := 0 to Items.Count-1 do + PObject3d(Items.At(i))^.GetInfo(Ray,Inf^[i]); + Min := MaxReal; j := -1; + for i := 0 to Items.Count-1 do + with Inf^[i] do + if Hit and (Time < Min) and (Time > 0.001) then begin + Min := Time; j := i; + end; + if j = -1 then begin + Col := BackColor + end else begin + Info := Inf^[j]; + with Info do begin + Normal.MakeUnit; + c := Color; + if Shading then begin + ir := Brightness * Ambient.r; + ig := Brightness * Ambient.g; + ib := Brightness * Ambient.b; + for i := 0 to Lights.Count-1 do begin + li := PLightSource(Lights.At(i))^.Pos; + lc := PLightSource(Lights.At(i))^.Color; + Li.Sub(Pos); + with li do + d := Sqrt(Sqr(x)+Sqr(y)+Sqr(z)); + li.MakeUnit; + costheta := (Normal.x*Li.x + Normal.y*Li.y + Normal.z*Li.z); + if Shadows then begin + r.Origin := Pos; + r.Direction := li; + repeat + for k := 0 to Items.Count-1 do + PObject3d(Items.At(k))^.GetInfo(r,Inf^[k]); + Min := MaxReal; l := -1; + for k := 0 to Items.Count-1 do + with Inf^[k] do + if Hit and (Time < Min) and (Time < d) and + (Time > 0.001) and ((Opacity.r+Opacity.g+Opacity.b) > 0) + then begin + Min := Time; l := k; + end; + if l <> -1 then + with Inf^[l] do begin + lc.r := lc.r * (1-Opacity.r); + lc.g := lc.g * (1-Opacity.g); + lc.b := lc.b * (1-Opacity.b); + r.o := Pos; + end; + until l = -1; + end; + if Specular and (costheta > 0) then begin + { Don't bother if light is behind } + v1 := Ray.d; + ndotn := (normal.x * normal.x + + normal.y * normal.y + + normal.z * normal.z); + idotn := (normal.x * li.x + + normal.y * li.y + + normal.z * li.z); + idotn_div_ndotn_x2 := (2.0 * (idotn) / ndotn); + v2.x := li.x - idotn_div_ndotn_x2 * Normal.x; + v2.y := li.y - idotn_div_ndotn_x2 * Normal.y; + v2.z := li.z - idotn_div_ndotn_x2 * Normal.z; + v2.MakeUnit; + ra := v1.Dot(v2); + if ra > 0 then costheta := costheta + ( + PObject3d(Items.At(j))^.SpecularW(ArcCos(costheta)*180/pi) * + Power(ra,SpecularN)); + end; + if (costheta < 0) then begin + costheta := -costheta; + lc.r := lc.r * (1-Opacity.r); + lc.g := lc.g * (1-Opacity.g); + lc.b := lc.b * (1-Opacity.b); + end; + Ir := Ir + ((Brightness * lc.r) / (d + 0.001)) * costheta; + Ig := Ig + ((Brightness * lc.g) / (d + 0.001)) * costheta; + Ib := Ib + ((Brightness * lc.b) / (d + 0.001)) * costheta; + end; + c.r := c.r - 1 + Ir; + c.g := c.g - 1 + Ig; + c.b := c.b - 1 + Ib; + end; + if Reflection and (ReflectCount < MaxReflect) and + ((Reflectivity.r+Reflectivity.g+Reflectivity.b) > 0) then begin + ndotn := (normal.x * normal.x + + normal.y * normal.y + + normal.z * normal.z); + idotn := (normal.x * ray.d.x + + normal.y * ray.d.y + + normal.z * ray.d.z); + idotn_div_ndotn_x2 := (2.0 * (idotn) / ndotn); + r.Origin := Pos; + r.d.x := Ray.d.x - idotn_div_ndotn_x2 * Normal.x; + r.d.y := Ray.d.y - idotn_div_ndotn_x2 * Normal.y; + r.d.z := Ray.d.z - idotn_div_ndotn_x2 * Normal.z; + Inc(ReflectCount); + TraceRay(r,lc); + Dec(ReflectCount); + if ScaleBase then begin + c.r := (c.r*(1-Reflectivity.r)) + (Reflectivity.r * lc.r); + c.g := (c.g*(1-Reflectivity.g)) + (Reflectivity.g * lc.g); + c.b := (c.b*(1-Reflectivity.b)) + (Reflectivity.b * lc.b); + end else begin + c.r := c.r + (Reflectivity.r * lc.r); + c.g := c.g + (Reflectivity.g * lc.g); + c.b := c.b + (Reflectivity.b * lc.b); + end; + end; + if Transparency and (ReflectCount < MaxReflect) and + (Opacity.r < 1) and (Opacity.g < 1) and (Opacity.b < 1) then begin + if GoingIn then + ra := 1 / IndexRefraction + else + ra := IndexRefraction; + idotn := -(Normal.x*Ray.d.x + + Normal.y*Ray.d.y + + Normal.z*Ray.d.z); + d := 1 + Sqr(ra)*(Sqr(idotn)-1); + r.o := Pos; + if d >= 0 then begin + Min := ra*idotn - Sqrt(d); + r.d.x := Ray.d.x*ra + Normal.x*Min; + r.d.y := Ray.d.y*ra + Normal.y*Min; + r.d.z := Ray.d.z*ra + Normal.z*Min; + end else begin + ndotn := (normal.x * normal.x + + normal.y * normal.y + + normal.z * normal.z); + idotn := (normal.x * ray.d.x + + normal.y * ray.d.y + + normal.z * ray.d.z); + idotn_div_ndotn_x2 := (2.0 * (idotn) / ndotn); + r.d.x := Ray.d.x - idotn_div_ndotn_x2 * Normal.x; + r.d.y := Ray.d.y - idotn_div_ndotn_x2 * Normal.y; + r.d.z := Ray.d.z - idotn_div_ndotn_x2 * Normal.z; + end; + Inc(ReflectCount); + TraceRay(r,lc); + Dec(ReflectCount); + if ScaleBase then begin + c.r := (c.r*Opacity.r) + ((1-Opacity.r) * lc.r); + c.g := (c.g*Opacity.g) + ((1-Opacity.g) * lc.g); + c.b := (c.b*Opacity.b) + ((1-Opacity.b) * lc.b); + end else begin + c.r := c.r + ((1-Opacity.r) * lc.r); + c.g := c.g + ((1-Opacity.g) * lc.g); + c.b := c.b + ((1-Opacity.b) * lc.b); + end; + end; + Col := c; + end; + end; + FreeMem(Inf,Items.Count * SizeOf(TRayInfo)); +end; + +procedure TUniverse.TracePoint(x,y: Integer; var Col: RgbTriple); +var + Ray: TRay; + v,h: TPoint3d; +begin + Ray.Origin := Eye; + Ray.d := vM; Ray.d.Sub(Eye); + h := vH; v := vV; + h.Scale(-(2*(x/ScrWidth)-1)); + v.Scale(2*(y/ScrHeight)-1); + Ray.d.Add(h); + Ray.d.Add(v); + TraceRay(Ray,Col); +end; + +procedure TUniverse.Insert(Item: PObject3d); +begin + Items.Insert(Item); + Item^.Owner := @Self; +end; + +procedure TUniverse.Delete(Item: PObject3d); +begin + Items.Delete(Item); + Item^.Owner := nil; +end; + +procedure TUniverse.InsertLight(Item: PLightSource); +begin + Lights.Insert(Item); +end; + +procedure TUniverse.DeleteLight(Item: PLightSource); +begin + Lights.Delete(Item); +end; + +procedure TUniverse.DeleteAllObjects; +var i: Integer; +begin + Items.DeleteAll; +end; + +procedure TUniverse.DeleteAllLights; +begin + Lights.DeleteAll; +end; + +procedure TUniverse.DeleteAll; +begin + Items.DeleteAll; + Lights.DeleteAll; +end; + +procedure TUniverse.FreeAllObjects; +begin + Items.FreeAll; +end; + +procedure TUniverse.FreeAllLights; +begin + Lights.FreeAll; +end; + +procedure TUniverse.FreeAll; +begin + Items.FreeAll; + Lights.FreeAll; +end; + +constructor TSphere.Init(xa,ya,za,ra: Float); +begin + TObject3d.Init; + Pos.SetTo(xa,ya,za); + r := ra; r2 := Sqr(ra); +end; + +procedure TSphere.GetInfo(Ray: TRay; var Inf: TRayInfo); +var + a, b, c, t1, t2, t3, close, farther: Float; +begin + a := ray.d.x * ray.d.x + ray.d.y * ray.d.y + ray.d.z * ray.d.z; + close := -1.0; + farther := -1.0; + if a <> 0 then begin + b := 2.0 * ((ray.o.x - Pos.x) * ray.d.x + + (ray.o.y - Pos.y) * ray.d.y + + (ray.o.z - Pos.z) * ray.d.z); + c := (ray.o.x - Pos.x) * (ray.o.x - Pos.x) + + (ray.o.y - Pos.y) * (ray.o.y - Pos.y) + + (ray.o.z - Pos.z) * (ray.o.z - Pos.z) - r2; + t1 := b * b - 4.0 * a * c; + if t1 > 0 then begin + t2 := sqrt(t1); + t3 := 2.0 * a; + close := -(b + t2) / t3; + farther := -(b - t2) / t3; + end; + end; + if (close <= 0.001) and (farther > 0.001) then begin + Inf.Time := farther; Inf.GoingIn := False; + end else + if (close > 0.001) and (farther <= 0.001) then begin + Inf.Time := close; Inf.GoingIn := False; + end else begin + Inf.GoingIn := True; + if close < farther then + Inf.Time := close + else + Inf.Time := farther; + end; + Inf.Hit := (Inf.Time > 0.001); + if not Inf.Hit then Exit; + Inf.Pos.SetTo( + ray.o.x+ray.d.x*Inf.Time, + ray.o.y+ray.d.y*Inf.Time, + ray.o.z+ray.d.z*Inf.Time); + Inf.Normal := Inf.Pos; + Inf.Normal.Sub(Pos); + if not Inf.GoingIn then Inf.Normal.Scale(-1); + MakeTrip(0.9,0.8,0.7,Inf.Color); + Inf.Brightness := 1; + MakeTrip(0.3,0.3,0.3,Inf.Reflectivity); + MakeTrip(1,1,1,Inf.Opacity); + Inf.SpecularN := 100; + Inf.IndexRefraction := 0.95; +end; + +constructor TPlane.Init(xa,ya,za,vx,vy,vz: Float); +begin + TObject3d.Init; + Pos.SetTo(xa,ya,za); + Normal.SetTo(vx,vy,vz); + Normal.MakeUnit; +end; + +procedure TPlane.GetInfo(Ray: TRay; var Inf: TRayInfo); +var + p1, p2, p3: Float; +begin + p1 := Pos.x * Normal.x + Pos.y * Normal.y + Pos.z * Normal.z; + p2 := ray.o.x * Normal.x + ray.o.y * Normal.y + ray.o.z * Normal.z; + p3 := ray.d.x * Normal.x + ray.d.y * Normal.y + ray.d.z * Normal.z; + if p3 = 0 then p3 := 0.001; + Inf.Time := (p1-p2)/p3; + Inf.Hit := (Inf.Time > 0.001); + if not Inf.Hit then Exit; + Inf.Normal := Normal; + if Ray.d.Dot(Inf.Normal) > 0 then Inf.Normal.Scale(-1); + Inf.Pos.SetTo( + ray.o.x+ray.d.x*Inf.Time, + ray.o.y+ray.d.y*Inf.Time, + ray.o.z+ray.d.z*Inf.Time); + MakeTrip(0.75,0.75,0.75,Inf.Color); + Inf.GoingIn := True; + Inf.Brightness := 1; + MakeTrip(0.1,0.1,0.1,Inf.Reflectivity); + MakeTrip(1,1,1,Inf.Opacity); + Inf.SpecularN := 50; + Inf.IndexRefraction := 0.99; +end; + +constructor TPlanePts.Init(x1,y1,z1,x2,y2,z2,x3,y3,z3: Float); +begin + TPlane.Init(x1,y1,z1, + y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2), + z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2), + x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2)); +end; + +constructor TCylinder.Init(xa,ya,za,vx,vy,vz,ra,ha: Float; aends: ShortInt); +begin + TObject3d.Init; + Pos.SetTo(xa,ya,za); + Normal.SetTo(vx,vy,vz); + Normal.MakeUnit; + r := ra; r2 := Sqr(ra); + h := ha; + ends := aends; +end; + +procedure TCylinder.GetInfo(Ray: TRay; var Inf: TRayInfo); +var + r1: TRay; + a,b,c,t1,t2,t3,close1,farther1,close,farther,end1,end2: Float; + p1,p2: TPoint3d; +begin + Inf.Hit := False; + r1 := Ray; + r1.o.Sub(Pos); + r1.o.RotateFrom(Normal); + r1.d.RotateFrom(Normal); + if (ends and 1) <> 0 then begin + t3 := r1.d.z; + if t3 = 0 then t3 := 0.001; + end1 := (-r1.o.z)/t3; + if (Sqr(r1.o.x+r1.d.x*end1)+ + Sqr(r1.o.y+r1.d.y*end1)+ + Sqr(r1.o.z+r1.d.z*end1)) > r2 then end1 := -1; + end else + end1 := -1; + if (ends and 2) <> 0 then begin + t3 := r1.d.z; + if t3 = 0 then t3 := 0.001; + end2 := (h-r1.o.z)/t3; + if (Sqr(r1.o.x+r1.d.x*end2)+ + Sqr(r1.o.y+r1.d.y*end2)+ + Sqr(r1.o.z+r1.d.z*end2-h)) > r2 then end2 := -1; + end else + end2 := -1; + a := r1.d.x * r1.d.x + r1.d.y * r1.d.y; + close := -1.0; + farther := -1.0; + if a <> 0 then begin + b := 2.0 * (r1.o.x * r1.d.x + + r1.o.y * r1.d.y); + c := r1.o.x * r1.o.x + + r1.o.y * r1.o.y - r2; + t1 := b * b - 4.0 * a * c; + if t1 > 0 then begin + t2 := sqrt(t1); + t3 := 2.0 * a; + close1 := -(b + t2) / t3; + farther1 := -(b - t2) / t3; + if close1 > 0 then begin + p1 := r1.d; + p1.Scale(close1); + close := p1.Length; + p1.Add(r1.o); + if (p1.z < 0) or (p1.z > h) then close := -1; + end; + if farther1 > 0 then begin + p2 := r1.d; + p2.Scale(farther1); + farther := p2.Length; + p2.Add(r1.o); + if (p2.z < 0) or (p2.z > h) then farther := -1; + end; + end; + end; + Inf.Time := MaxReal; + if (close < Inf.Time) and (close > 0.001) then Inf.Time := close; + if (farther < Inf.Time) and (farther > 0.001) then Inf.Time := farther; + if (end1 < Inf.Time) and (end1 > 0.001) then Inf.Time := end1; + if (end2 < Inf.Time) and (end2 > 0.001) then Inf.Time := end2; + Inf.Hit := Inf.Time < MaxReal; + if not Inf.Hit then Exit; + Inf.Pos := Ray.d; + Inf.Pos.Scale(Inf.Time); + Inf.Pos.Add(Ray.o); + Inf.Normal := Normal; + if (Inf.Time = close) or (Inf.Time = farther) then begin + if Inf.Time = close then + Inf.Normal.Scale(p1.z) + else + Inf.Normal.Scale(p2.z); + Inf.Normal.Add(Pos); + Inf.Normal.Sub(Inf.Pos); + end else begin + if Inf.Time = end2 then Inf.Normal.Scale(-1); + end; + Inf.GoingIn := Ray.d.Dot(Inf.Normal) > 0; + if Inf.GoingIn then Inf.Normal.Scale(-1); + MakeTrip(0.7,0.8,0.9,Inf.Color); + Inf.Brightness := 1; + MakeTrip(0,0,0,Inf.Reflectivity); + MakeTrip(1,1,1,Inf.Opacity); + Inf.SpecularN := 100; + Inf.IndexRefraction := 0.95; +end; + +constructor TCone.Init(xa,ya,za,vx,vy,vz,ra1,rb1,ha: Float; aends: ShortInt); +begin + TObject3d.Init; + Pos.SetTo(xa,ya,za); + Normal.SetTo(vx,vy,vz); + Normal.MakeUnit; + ra := ra1; ra2 := Sqr(ra); + rb := rb1; rb2 := Sqr(rb); + h := ha; + th := h+((rb*h)/(ra-rb)); + ends := aends; +end; + +procedure TCone.GetInfo(Ray: TRay; var Inf: TRayInfo); +var + r1: TRay; + v1,v2,a,b,c,t1,t2,t3,close1,farther1,close,farther,end1,end2: Float; + p1,p2: TPoint3d; +begin + Inf.Hit := False; + r1 := Ray; + r1.o.Sub(Pos); + r1.o.RotateFrom(Normal); + r1.d.RotateFrom(Normal); + if (ends and 1) <> 0 then begin + t3 := r1.d.z; + if t3 = 0 then t3 := 0.001; + end1 := (-r1.o.z)/t3; + if (Sqr(r1.o.x+r1.d.x*end1)+ + Sqr(r1.o.y+r1.d.y*end1)+ + Sqr(r1.o.z+r1.d.z*end1)) > ra2 then end1 := -1; + end else + end1 := -1; + if (ends and 2) <> 0 then begin + t3 := r1.d.z; + if t3 = 0 then t3 := 0.001; + end2 := (h-r1.o.z)/t3; + if (Sqr(r1.o.x+r1.d.x*end2)+ + Sqr(r1.o.y+r1.d.y*end2)+ + Sqr(r1.o.z+r1.d.z*end2-h)) > rb2 then end2 := -1; + end else + end2 := -1; + a := r1.d.x * r1.d.x + r1.d.y * r1.d.y; + (* + xý+yý=(1-(z/th))rý + take (1-(z/th))*ra2 and use as r2 in cyl stuff + *) + { get p1.z, p2.z } + v1 := (1-(p1.z/th))*ra2; + v2 := (1-(p2.z/th))*ra2; + a := r1.d.x * r1.d.x + r1.d.y * r1.d.y; + close := -1.0; + farther := -1.0; + if a <> 0 then begin + b := 2.0 * (r1.o.x * r1.d.x + + r1.o.y * r1.d.y); + c := r1.o.x * r1.o.x + + r1.o.y * r1.o.y - ra2; + t1 := b * b - 4.0 * a * c; + if t1 > 0 then begin + t2 := sqrt(t1); + t3 := 2.0 * a; + close1 := -(b + t2) / t3; + farther1 := -(b - t2) / t3; + if close1 > 0 then begin + p1 := r1.d; + p1.Scale(close1); + close := p1.Length; + p1.Add(r1.o); + if (p1.z < 0) or (p1.z > h) then close := -1; + end; + if farther1 > 0 then begin + p2 := r1.d; + p2.Scale(farther1); + farther := p2.Length; + p2.Add(r1.o); + if (p2.z < 0) or (p2.z > h) then farther := -1; + end; + end; + end; + Inf.Time := MaxReal; + if (close < Inf.Time) and (close > 0.001) then Inf.Time := close; + if (farther < Inf.Time) and (farther > 0.001) then Inf.Time := farther; + if (end1 < Inf.Time) and (end1 > 0.001) then Inf.Time := end1; + if (end2 < Inf.Time) and (end2 > 0.001) then Inf.Time := end2; + Inf.Hit := Inf.Time < MaxReal; + if not Inf.Hit then Exit; + Inf.Pos := Ray.d; + Inf.Pos.Scale(Inf.Time); + Inf.Pos.Add(Ray.o); + Inf.Normal := Normal; + if (Inf.Time = close) or (Inf.Time = farther) then begin + if Inf.Time = close then + Inf.Normal.Scale(p1.z) + else + Inf.Normal.Scale(p2.z); + Inf.Normal.Add(Pos); + Inf.Normal.Sub(Inf.Pos); + end else begin + if Inf.Time = end2 then Inf.Normal.Scale(-1); + end; + Inf.GoingIn := Ray.d.Dot(Inf.Normal) > 0; + if Inf.GoingIn then Inf.Normal.Scale(-1); + MakeTrip(0.7,0.8,0.9,Inf.Color); + Inf.Brightness := 1; + MakeTrip(0,0,0,Inf.Reflectivity); + MakeTrip(1,1,1,Inf.Opacity); + Inf.SpecularN := 100; + Inf.IndexRefraction := 0.95; +end; + +procedure GetSphereInfo(Ray: TRay; Pos: TPoint3d; r: Float; var close,farther: Float); +var + r2, a, b, c, t1, t2, t3: Float; +begin + r2 := Sqr(r); + a := ray.d.x * ray.d.x + ray.d.y * ray.d.y + ray.d.z * ray.d.z; + close := -1.0; + farther := -1.0; + if a <> 0 then begin + b := 2.0 * ((ray.o.x - Pos.x) * ray.d.x + + (ray.o.y - Pos.y) * ray.d.y + + (ray.o.z - Pos.z) * ray.d.z); + c := (ray.o.x - Pos.x) * (ray.o.x - Pos.x) + + (ray.o.y - Pos.y) * (ray.o.y - Pos.y) + + (ray.o.z - Pos.z) * (ray.o.z - Pos.z) - r2; + t1 := b * b - 4.0 * a * c; + if t1 > 0 then begin + t2 := sqrt(t1); + t3 := 2.0 * a; + close := -(b + t2) / t3; + farther := -(b - t2) / t3; + end; + end; +end; + +procedure GetCylinderInfo(Ray: TRay; Pos,Normal: TPoint3d; r,h: Float; ends: ShortInt; + var close,farther,end1,end2: Float); +var + r1: TRay; + r2,a,b,c,t1,t2,t3,close1,farther1: Float; + p1,p2: TPoint3d; +begin + r2 := Sqr(r); + r1 := Ray; + r1.o.Sub(Pos); + r1.o.RotateFrom(Normal); + r1.d.RotateFrom(Normal); + if (ends and 1) <> 0 then begin + t3 := r1.d.z; + if t3 = 0 then t3 := 0.001; + end1 := (-r1.o.z)/t3; + if (Sqr(r1.o.x+r1.d.x*end1)+ + Sqr(r1.o.y+r1.d.y*end1)+ + Sqr(r1.o.z+r1.d.z*end1)) > r2 then end1 := -1; + end else + end1 := -1; + if (ends and 2) <> 0 then begin + t3 := r1.d.z; + if t3 = 0 then t3 := 0.001; + end2 := (h-r1.o.z)/t3; + if (Sqr(r1.o.x+r1.d.x*end2)+ + Sqr(r1.o.y+r1.d.y*end2)+ + Sqr(r1.o.z+r1.d.z*end2-h)) > r2 then end2 := -1; + end else + end2 := -1; + a := r1.d.x * r1.d.x + r1.d.y * r1.d.y; + close := -1.0; + farther := -1.0; + if a <> 0 then begin + b := 2.0 * (r1.o.x * r1.d.x + + r1.o.y * r1.d.y); + c := r1.o.x * r1.o.x + + r1.o.y * r1.o.y - r2; + t1 := b * b - 4.0 * a * c; + if t1 > 0 then begin + t2 := sqrt(t1); + t3 := 2.0 * a; + close1 := -(b + t2) / t3; + farther1 := -(b - t2) / t3; + if close1 > 0 then begin + p1 := r1.d; + p1.Scale(close1); + close := p1.Length; + p1.Add(r1.o); + if (p1.z < 0) or (p1.z > h) then close := -1; + end; + if farther1 > 0 then begin + p2 := r1.d; + p2.Scale(farther1); + farther := p2.Length; + p2.Add(r1.o); + if (p2.z < 0) or (p2.z > h) then farther := -1; + end; + end; + end; +end; + +procedure GetConeInfo(Ray: TRay; Pos,Normal: TPoint3d; ra,rb,h: Float; ends: ShortInt; + var close,farther,end1,end2: Float); +begin +end; + +procedure GetPlaneInfo(Ray: TRay; Pos,Normal: TPoint3d; var time: Float); +var + p1, p2, p3: Float; +begin + p1 := Pos.x * Normal.x + Pos.y * Normal.y + Pos.z * Normal.z; + p2 := ray.o.x * Normal.x + ray.o.y * Normal.y + ray.o.z * Normal.z; + p3 := ray.d.x * Normal.x + ray.d.y * Normal.y + ray.d.z * Normal.z; + if p3 = 0 then p3 := 0.001; + Time := (p1-p2)/p3; +end; + +end. \ No newline at end of file diff --git a/turbo-pascal/raytr2.pas b/turbo-pascal/raytr2.pas new file mode 100644 index 0000000..c6c3217 --- /dev/null +++ b/turbo-pascal/raytr2.pas @@ -0,0 +1,183 @@ +unit RayTr; +{ Everything-independent super ultra ray-tracing + by Brion Vibber, 12-13-92, based on lots of stuff + last revised 12-31-92, unless I forget to change this line. + 12-25-92: set for Doubles + 12-31-92: Totally changed to compete with POV-Ray +} +interface + +{$N+,E-,G+,X+} { Heck, I'm only going to use it here } + +uses Objects; { For TCollection, a super-useful thingy } + +const + MinReal = 5.0e-324; + MaxReal = 1.7e308; + DarnSmall = 0.0001; + +type + PUniverse = ^TUniverse; + PObject3d = ^TObject3d; + PLightSource = ^TLightSource; + PPoint3d = ^TPoint3d; + PRayInfo = ^TRayInfo; + PTexture = ^TTexture; + {PPolygon3d = ^TPolygon3d; + PPolygonList = ^TPolygonList;} + + TPoint3d = object + x,y,z: Double; + procedure SetTo(ax,ay,az: Double); + procedure MakeUnit; + procedure Cross(v: TPoint3d); + function Dot(v: TPoint3d): Double; + procedure Add(v: TPoint3d); + procedure Sub(v: TPoint3d); + procedure Scale(s: Double); + function Length: Double; + procedure RotateFrom(v: TPoint3d); + procedure RotateTo(v: TPoint3d); + procedure RotateX(d: Double); + procedure RotateY(d: Double); + procedure RotateZ(d: Double); + procedure Rotate(x,y,z: Double); + end; + TRay = object + o,d: TPoint3d; + end; + TColor = object + r,g,b,a: Double; { 0 - 1 } { a[lpha] is transparency } + end; + TTexture = object(TObject) + + end; + +function Power(x,y: Double): Double; +function Log(x,y: Double): Double; +function ArcSin(x: Double): Double; +function ArcCos(x: Double): Double; +function Tan(x: Double): Double; + +implementation + +procedure MakeTrip(r,g,b: Double; var c: RgbTriple); +begin + c.r := r; c.g := g; c.b := b; +end; + +function Power(x,y: Double): Double; +var + i: Integer; + x1: Double; +begin + {Power := Exp(y * Ln(x));} + x1 := x; + for i := 1 to Trunc(y)-1 do + x1 := x1 * x; + Power := x; +end; + +function Log(x,y: Double): Double; +begin + Log := Ln(x) / Ln(y); +end; + +function ArcSin(x: Double): Double; +begin + ArcSin := ArcTan(x / Sqrt(1 - (x*x))); +end; + +function ArcCos(x: Double): Double; +begin + ArcCos := ArcTan(Sqrt(1 - Sqr(x)) / x); +end; + +function Tan(x: Double): Double; +begin + Tan := Sin(x) / Cos(x); +end; + +procedure TPoint3d.SetTo(ax,ay,az: Double); +begin + x := ax; y := ay; z := az; +end; + +procedure TPoint3d.MakeUnit; +var + d: Double; +begin + d := Sqrt(Sqr(x)+Sqr(y)+Sqr(z)); + if d <> 0 then begin + x := x / d; + y := y / d; + z := z / d; + end; +end; + +procedure TPoint3d.Cross(v: TPoint3d); +var + xa,ya: Double; +begin + xa := y*v.z - z*v.y; + ya := z*v.x - x*v.z; + z := x*v.y - y*v.x; + x := xa; y := ya; +end; + +function TPoint3d.Dot(v: TPoint3d): Double; +begin + Dot := x*v.x + y*v.y + z*v.z; +end; + +procedure TPoint3d.Add(v: TPoint3d); +begin + x := x + v.x; + y := y + v.y; + z := z + v.z; +end; + +procedure TPoint3d.Sub(v: TPoint3d); +begin + x := x - v.x; + y := y - v.y; + z := z - v.z; +end; + +procedure TPoint3d.Scale(s: Double); +begin + x := x * s; + y := y * s; + z := z * s; +end; + +function TPoint3d.Length: Double; +begin + Length := Sqrt(Sqr(x)+Sqr(y)+Sqr(z)); +end; + +procedure TPoint3d.RotateFrom(v: TPoint3d); +var + d,xa,ya,za,cos1,sin1: Double; +begin + v.MakeUnit; + d := Sqrt(Sqr(v.y)+Sqr(v.z)); + cos1 := v.z/d; sin1 := v.y/d; + ya := y*cos1-z*sin1; z := y*sin1+z*cos1; y := ya; + cos1 := d; sin1 := -v.x; + za := z*cos1-x*sin1; x := z*sin1+x*cos1; z := za; +end; + +procedure TPoint3d.RotateTo(v: TPoint3d); +var + d,xa,ya,za,cos1,sin1: Double; +begin + v.MakeUnit; + d := Sqrt(Sqr(v.y)+Sqr(v.z)); + cos1 := -v.z/d; sin1 := -v.y/d; + ya := y*cos1-z*sin1; z := y*sin1+z*cos1; y := ya; + cos1 := -d; sin1 := v.x; + za := z*cos1-x*sin1; x := z*sin1+x*cos1; z := za; +end; + +end. \ No newline at end of file diff --git a/turbo-pascal/raytrace.pas b/turbo-pascal/raytrace.pas new file mode 100644 index 0000000..eac3f30 --- /dev/null +++ b/turbo-pascal/raytrace.pas @@ -0,0 +1,435 @@ +{ RAYTRACE.PAS } +{ Ray-tracing unit, generic. } + +unit RayTrace; + +interface +uses Objects; +{ Base objects on Turbo Vision's TObject to make them useable on + Turbo Vision streams. } + +type + VECTOR = object + dx, dy, dz: real; { Three dimensional vector } + end; + RAY = object + dx, dy, dz: real; { Direction vector } + ox, oy, oz: real; { Origin } + constructor Init (x, y, z, vx, vy, vz: real); + end; + + PObj3d = ^Obj3d; + PUniverse = ^Universe; + + Obj3d = object(TObject) + Owner: PUniverse; + xp,yp,zp: Real; + constructor Init(x,y,z: Real); + function Intersect(aray: RAY): Real; virtual; + procedure SurfNormal(aray: Ray; time: Real; var oray: Ray); virtual; + procedure ReflectRay(aray: Ray; time: Real; var oray: Ray); virtual; + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + PLANE = object(Obj3d) + nx, ny, nz: real; { Vector normal (perpendicular) to plane } + constructor Init(x, y, z, vx, vy, vz: real); + function Intersect(aray: RAY): real; virtual; + procedure SurfNormal(aray: Ray; time: Real; var oray: Ray); virtual; + function GetColor(aray: RAY; time: Real): LongInt; virtual; + end; + SPHERE = object(Obj3d) + ra,r2: real; { Radius squared } + constructor Init(x, y, z, r: real); + function Intersect(aray: RAY): real; virtual; + procedure SurfNormal(aray: Ray; time: Real; var oray: Ray); virtual; + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + + Cylinder = object(Obj3d) + { xp,yp,zp = center of bottom circle + x2,y2,z2 = center of top circle + ra = radius } + x2,y2,z2,ra,r2: Real; + constructor Init(x,y,z,xb,yb,zb,r: Real); + function Intersect(aray: RAY): real; virtual; + procedure SurfNormal(aray: Ray; time: Real; var oray: Ray); virtual; + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + + PlanePnt = object(Plane) + xb,yb,zb,xc,yc,zc: Real; + constructor Init(x1,y1,z1,x2,y2,z2,x3,y3,z3: Real); + function GetColor(aray: Ray; time: Real): LongInt; virtual; + end; + + Obj3dCollection = object(TCollection) + destructor Done; virtual; + end; + + Universe = object(TObject) + Width,Height: Integer; + Items: Obj3dCollection; + constructor Init(aWidth,aHeight: Integer); + destructor Done; virtual; + procedure Insert(o: PObj3d); + procedure Delete(o: PObj3d); + function TraceRay(aray: Ray): LongInt; + function TracePoint(x,y: Integer): LongInt; + end; + + +{ LongInt: $00rrggbb } +procedure SepLong(c: LongInt; var r,g,b: Integer); +function GetRgb(r,g,b: Integer): LongInt; +function GetHsv(h,s,v: Integer): LongInt; +procedure Hsv2Rgb(h,s,v: Integer; var r,g,b: Integer); + +implementation + +procedure SepLong(c: LongInt; var r,g,b: Integer); +begin + r := (c and $ff0000) shr 16; + g := (c and $ff00) shr 8; + b := c and $ff; +end; + +procedure Hsv2Rgb(h,s,v: Integer; var r,g,b: Integer); +var + rr,gg,bb,f,p1,p2,p3: Integer; +begin + while h > 359 do Dec(h,360); + while h < 0 do Inc(h,360); + if s < 0 then s := 0; + if s > 100 then s := 100; + if v < 0 then v := 0; + if v > 100 then v := 100; + + f := (h mod 60) * 5 div 3; + h := h div 60; + p1 := v*(100-s) div 625 * 16; + p2 := v*(100-(s*f div 100)) div 625 * 16; + p3 := v*(100-(s*(100-f) div 100)) div 625 * 16; + v := v * 64 div 25; + case h of + 0: begin r := v; g := p3; b := p1; end; + 1: begin r := p2; g := v; b := p1; end; + 2: begin r := p1; g := v; b := p3; end; + 3: begin r := p1; g := p2; b := v; end; + 4: begin r := p3; g := p1; b := v; end; + 5: begin r := v; g := p1; b := p2; end; + end; +end; + +function GetHsv(h,s,v: Integer): LongInt; +var r,g,b: Integer; +begin + Hsv2Rgb(h,s,v,r,g,b); + asm + mov al,byte ptr [b] + mov byte ptr [@Result],al + mov al,byte ptr [g] + mov byte ptr [@Result+1],al + mov al,byte ptr [r] + mov byte ptr [@Result+2],al + mov byte ptr [@Result+3],0 + end; +end; + +function GetRgb(r,g,b: Integer): LongInt; +begin + if r > 255 then r := 255; + if r < 0 then r := 0; + if g > 255 then g := 255; + if g < 0 then g := 0; + if b > 255 then b := 255; + if b < 0 then b := 0; + asm + mov al,byte ptr [b] + mov byte ptr [@Result],al + mov al,byte ptr [g] + mov byte ptr [@Result+1],al + mov al,byte ptr [r] + mov byte ptr [@Result+2],al + mov byte ptr [@Result+3],0 + end; +end; + +constructor Obj3d.Init(x,y,z: Real); +begin + TObject.Init; + xp := x; yp := y; zp := z; +end; + +function Obj3d.Intersect(aray: RAY): Real; +begin + { 0 or neg = no intersect } + Intersect := 0; +end; + +procedure Obj3d.SurfNormal(aray: Ray; time: Real; var oray: Ray); +begin + { No intersect, will never get called here } +end; + +procedure Obj3d.ReflectRay(aray: RAY; time: real; var oray: RAY); +var + normal: Ray; { Used for readability } + ndotn: real; { Used for readability } + idotn: real; { Used for readability } + idotn_div_ndotn_x2: real; { Used for optimization } +begin + oray.ox := aray.dx * time + aray.ox; { Find the point of } + oray.oy := aray.dy * time + aray.oy; { intersection between } + oray.oz := aray.dz * time + aray.oz; { iray and sphere. } + SurfNormal(aray,time,normal); + + ndotn := (normal.dx * normal.dx + + normal.dy * normal.dy + + normal.dz * normal.dz); + idotn := (normal.dx * aray.dx + + normal.dy * aray.dy + + normal.dz * aray.dz); + idotn_div_ndotn_x2 := (2.0 * (idotn) / ndotn); + + oray.dx := aray.dx - idotn_div_ndotn_x2 * normal.dx; + oray.dy := aray.dy - idotn_div_ndotn_x2 * normal.dy; + oray.dz := aray.dz - idotn_div_ndotn_x2 * normal.dz; +end; + +function Obj3d.GetColor(aray: Ray; time: Real): LongInt; +begin + { See SurfNormal } +end; + + +constructor RAY.Init(x, y, z, vx, vy, vz: real); +begin + ox := x; + oy := y; + oz := z; + dx := vx; + dy := vy; + dz := vz; +end; { ----- End: RAY::RAY() ----- } + +constructor SPHERE.Init(x, y, z, r: real); +begin + Obj3d.Init(x,y,z); + ra := r; + r2 := r * r; +end; { ----- End: SPHERE::SPHERE() ----- } + +function SPHERE.Intersect(aray: RAY): real; +var + a, b, c, t1, t2, t3, close, farther: real; +begin + a := aray.dx * aray.dx + aray.dy * aray.dy + aray.dz * aray.dz; + close := -1.0; + farther := -1.0; + if a <> 0 then + begin + b := 2.0 * ((aray.ox - xp) * aray.dx + + (aray.oy - yp) * aray.dy + + (aray.oz - zp) * aray.dz); + c := (aray.ox - xp) * (aray.ox - xp) + + (aray.oy - yp) * (aray.oy - yp) + + (aray.oz - zp) * (aray.oz - zp) - r2; + t1 := b * b - 4.0 * a * c; + if t1 > 0 then + begin + t2 := sqrt(t1); + t3 := 2.0 * a; + close := -(b + t2) / t3; + farther := -(b - t2) / t3; + end; + end; + if close < farther then Intersect := close else Intersect := farther; +{ Intersect := (double)((close < farther) ? close : farther);} +end; { ---- End: SPHERE::Intersect() ----- } + +procedure Sphere.SurfNormal(aray: Ray; time: Real; var oray: Ray); +begin + oray.ox := aray.dx * time + aray.ox; { Find the point of } + oray.oy := aray.dy * time + aray.oy; { intersection between } + oray.oz := aray.dz * time + aray.oz; { aray and sphere. } + oray.dx := oray.ox - xp; { Find the ray normal } + oray.dy := oray.oy - yp; { to the sphere at the } + oray.dz := oray.oz - zp; { intersection point. } +end; + +function Sphere.GetColor(aray: Ray; time: Real): LongInt; +var + r: Ray; + c: LongInt; + cc: record b,g,r: Byte end absolute c; +begin + ReflectRay(aray,time,r); + c := Owner^.TraceRay(r); + cc.r := Integer(cc.r) div 2; + cc.g := Integer(cc.g) div 2; + cc.b := Integer(cc.b) div 2 + 128; + GetColor := c; +end; + +constructor PLANE.Init(x, y, z, vx, vy, vz: real); +begin + Obj3d.Init(x,y,z); + nx := vx; + ny := vy; + nz := vz; +end; { ----- End: PLANE::PLANE() ----- } + +function PlanePattern(x, y: word): LongInt; +var + r,g,b: Integer; +begin + r := (((x+y) mod 8))*32; + g := ((x mod 8) xor (y mod 8))*32; + b := (((x * x + y * y) mod 8))*32; + PlanePattern := GetRgb(r,g,b); +end; { ----- End: PlanePattern() ----- } + + +function PLANE.GetColor(aray: RAY; time: real): LongInt; +begin + GetColor := PlanePattern(Round(time * aray.dz + aray.oz), + Round(time * aray.dx + aray.ox)); +end; { ----- End: PLANE::Pattern() ----- } + +function PLANE.Intersect(aray: RAY): real; +var + p1, p2, p3: real; +begin + p1 := xp * nx + yp * ny + zp * nz; + p2 := aray.ox * nx + aray.oy * ny + aray.oz * nz; + p3 := aray.dx * nx + aray.dy * ny + aray.dz * nz; + if p3 = 0 then p3 := 0.001; + Intersect := (p1-p2)/p3; +end; { ----- End: PLANE::Intersect() ----- } + +procedure Plane.SurfNormal(aray: Ray; time: Real; var oray: Ray); +begin + oray.dx := nx; oray.dy := ny; oray.dz := nz; +end; + +constructor Cylinder.Init(x,y,z,xb,yb,zb,r: Real); +begin + Obj3d.Init(x,y,z); + x2 := xb; y2 := yb; z2 := zb; + ra := r; r2 := Sqr(r); +end; + +function Cylinder.Intersect(aray: RAY): real; +begin + Intersect := 0; +end; + +procedure Cylinder.SurfNormal(aray: Ray; time: Real; var oray: Ray); +begin +end; + +function Cylinder.GetColor(aray: Ray; time: Real): LongInt; +begin + GetColor := $c0c0c0; +end; + +constructor PlanePnt.Init(x1,y1,z1,x2,y2,z2,x3,y3,z3: Real); +var + a,b,c,d: Real; +begin + a := y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2); + b := z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2); + c := x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2); + d := -x1*(y2*z3-y3*z2)-x2*(y3*z1-y1*z3)-x3*(y1*z2-y2*z1); + Plane.Init(x1,y1,z1,a,b,c); + xb := x2; yb := y2; zb := z2; + xc := x3; yc := y3; zc := z3; +end; + +function PlanePnt.GetColor(aray: Ray; time: Real): LongInt; +var + d: Real; + c: Integer; +begin + d := Sqrt( + Sqr(time * aray.dx + aray.ox - xp) + + Sqr(time * aray.dy + aray.oy - yp) + + Sqr(time * aray.dz + aray.oz - zp)); + if d > 255.0 then d := 255.0; + c := 255-Round(d); + if c < 96 then c := 96; + GetColor := GetRgb(c,c,c); +end; + + +constructor Universe.Init(aWidth,aHeight: Integer); +begin + TObject.Init; + Width := aWidth; Height := aHeight; + Items.Init(5,5); +end; + +destructor Universe.Done; +begin + Items.Done; +end; + +procedure Universe.Insert(o: PObj3d); +begin + Items.Insert(o); + o^.Owner := @Self; +end; + +procedure Universe.Delete(o: PObj3d); +begin + Items.Delete(o); + o^.Owner := nil; +end; + +function Universe.TraceRay(aray: Ray): LongInt; +type + arr = array[0..1000] of Real; + parr = ^arr; +var + times: parr; + i,j: Integer; + max: Real; + procedure TraceOne(o: PObj3d); far; + begin + times^[i] := o^.Intersect(aray); + Inc(i); + end; +begin + GetMem(times,Items.Count*SizeOf(Real)); + i := 0; + Items.ForEach(@TraceOne); + max := 1.7e38; { darn big } + j := -1; + for i := 0 to Items.Count-1 do + if (times^[i] < max) and (times^[i] > 0.001) then begin + max := times^[i]; j := i; + end; + if j <> -1 then + TraceRay := PObj3d(Items.At(j))^.GetColor(aray,max) + else + TraceRay := 0; + FreeMem(Times,Items.Count*SizeOf(Real)); +end; + +function Universe.TracePoint(x,y: Integer): LongInt; +var + r: Ray; +begin + r.ox := 0; r.oy := 0; r.oz := 0; + r.dx := (x - (Width / 2)) / Width; + r.dy := (y - (Height / 2)) / Height * 0.75; + r.dz := 1; + TracePoint := TraceRay(r); +end; + +destructor Obj3dCollection.Done; +begin + TObject.Done; +end; + +end. \ No newline at end of file