From 219d5743b8aa34caabcdaef78947142721876f48 Mon Sep 17 00:00:00 2001 From: cirdan Date: Fri, 18 Jan 2008 13:00:18 +0000 Subject: [PATCH] implement star background --- engine/Material.h | 23 +++++++++++ engine/RenderDevice.cpp | 84 +++++++++++++++++++--------------------- engine/RenderDevice.h | 11 ++++-- engine/RenderQueue.cpp | 6 ++- engine/data/main.nut | 2 +- engine/data/nebular.zip | Bin 0 -> 28721 bytes engine/data/stars.zip | Bin 0 -> 10296 bytes engine/main.cpp | 28 +++++++++++--- 8 files changed, 99 insertions(+), 55 deletions(-) create mode 100644 engine/Material.h create mode 100644 engine/data/nebular.zip create mode 100644 engine/data/stars.zip diff --git a/engine/Material.h b/engine/Material.h new file mode 100644 index 0000000..8634c34 --- /dev/null +++ b/engine/Material.h @@ -0,0 +1,23 @@ +#ifndef BLUECORE_MATERIAL_H +#define BLUECORE_MATERIAL_H + +#include "ShaderManager.h" +#include "TextureManager.h" + +namespace BlueCore +{ + +class Material +{ + typedef ref_ptr TexturePtr; + typedef std::pair TextureUnit; + + std::vector _Textures; + ShaderProgram _ShaderProgram; + bool Tangents; + float Shininess; + float Specular[4]; +}; + +} +#endif /*MATERIAL_H_*/ diff --git a/engine/RenderDevice.cpp b/engine/RenderDevice.cpp index a198821..ba1c4af 100644 --- a/engine/RenderDevice.cpp +++ b/engine/RenderDevice.cpp @@ -17,7 +17,7 @@ void RenderDevice::WindowResizeSlot(int width, int height) } RenderDevice::RenderDevice(RenderWindow* renderWindow) : - _RenderWindow(renderWindow) + _RenderWindow(renderWindow), _ActiveTextures(0) { if (_RenderWindow.valid()) { @@ -32,7 +32,7 @@ RenderDevice::RenderDevice(RenderWindow* renderWindow) : glViewport( 0, 0, _ViewportWidth, _ViewportHeight); } - clog << ">>> RenderDevice constructed..."<< endlog; + clog << ">>> RenderDevice constructed..." << endlog; } RenderDevice::~RenderDevice() @@ -114,6 +114,10 @@ void RenderDevice::begin3D(Camera *camera) setupViewMatrix(); } +void RenderDevice::end3D() +{ +} + void RenderDevice::setupProjectionMatrix() { if (_Camera.valid()) @@ -132,55 +136,47 @@ void RenderDevice::setupProjectionMatrix() void RenderDevice::setupViewMatrix() { - // set the view matrix - glMatrixMode(GL_MODELVIEW); + if (_Camera.valid()) + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); Matrix4x4 m(_Camera->getRotation(), _Camera->getRotation().applyInversed(_Camera->getPosition() * -1.0) ); glMultMatrixd( ( GLdouble * ) &m.m ); - /* - // calculate frustum planes - Vector3 up = q.apply ( Vector3 ( 0.0, 1.0, 0.0 ) ); - Vector3 right = q.apply ( Vector3 ( 1.0, 0.0, 0.0 ) ); - Vector3 d = q.apply ( Vector3 ( 0.0, 0.0, -1.0 ) ); - - Vector3 fc = p + d * _far; - - Vector3 ftl = fc + ( up * _hFar ) - ( right * _wFar ); - Vector3 ftr = fc + ( up * _hFar ) + ( right * _wFar ); - Vector3 fbl = fc - ( up * _hFar ) - ( right * _wFar ); - Vector3 fbr = fc - ( up * _hFar ) + ( right * _wFar ); - - Vector3 nc = p + d * _near; - - Vector3 ntl = nc + ( up * _hNear ) - ( right * _wNear ); - Vector3 ntr = nc + ( up * _hNear ) + ( right * _wNear ); - Vector3 nbl = nc - ( up * _hNear ) - ( right * _wNear ); - Vector3 nbr = nc - ( up * _hNear ) + ( right * _wNear ); - - _frustumPlanes[RightPlane] = Plane ( nbr, fbr, ntr ); - _frustumPlanes[LeftPlane] = Plane ( ntl, fbl, nbl ); - _frustumPlanes[BottomPlane] = Plane ( nbl, fbr, nbr ); - _frustumPlanes[TopPlane] = Plane ( ntr, ftl, ntl ); - _frustumPlanes[FarPlane] = Plane ( ftl, ftr, fbl ); - _frustumPlanes[NearPlane] = Plane ( ntl, nbl, ntr ); - */ } -void RenderDevice::setTransformation (const Vector3& position, const Quaternion& orientation) +void RenderDevice::pushTransformation(const Vector3& position, + const Quaternion& orientation) { - glMatrixMode ( GL_MODELVIEW ); + glMatrixMode( GL_MODELVIEW); glPushMatrix(); - Matrix4x4 m ( orientation, position ); - glMultMatrixd ( ( GLdouble * ) &m.m ); + Matrix4x4 m(orientation, position); + glMultMatrixd( ( GLdouble * ) &m.m ); +} + +void RenderDevice::popTransformation() +{ + glMatrixMode( GL_MODELVIEW); + glPopMatrix(); +} + +void RenderDevice::setTexture(unsigned int unit, Texture* texture, bool last) +{ + glActiveTextureARB(GL_TEXTURE0_ARB + unit); + glBindTexture(GL_TEXTURE_2D, texture->getId()); + glEnable(GL_TEXTURE_2D); + + if (unit > _ActiveTextures) + _ActiveTextures = unit; + + if (last) + { + for (unsigned int i = unit + 1; i < _ActiveTextures; i++) + { + glActiveTextureARB(GL_TEXTURE0_ARB + i); + glDisable( GL_TEXTURE_2D); + } + + _ActiveTextures = unit; + } } -#if 0 -void RenderDevice::setu -// set the view matrix -glMatrixMode (GL_MODELVIEW ); -glLoadIdentity(); -Matrix4x4 m(_Rotation, _Rotation.applyInversed(_Position * -1.0) ); -glMultMatrixd ( ( GLdouble * ) &m.m ); } // namespace BlueCore -#endif -} \ No newline at end of file diff --git a/engine/RenderDevice.h b/engine/RenderDevice.h index 9e7f73d..fc7a151 100644 --- a/engine/RenderDevice.h +++ b/engine/RenderDevice.h @@ -22,6 +22,8 @@ private: ref_ptr _RenderWindow; ref_ptr _Camera; + unsigned int _ActiveTextures; + public: RenderDevice(RenderWindow* renderWindow); @@ -33,15 +35,18 @@ public: void begin2D(); void end2D(); + void begin3D(Camera *); + void end3D(); + void clear(); void swap(); void setAmbientLight(float r, float g, float b); void setMaterial(Material *); - void setTexture(unsigned int unit, unsigned int texture); - void begin3D(Camera *); - void setTransformation (const Vector3&, const Quaternion&); + void setTexture(unsigned int unit, Texture* texture, bool last = false); + void pushTransformation (const Vector3&, const Quaternion&); + void popTransformation (); void setupProjectionMatrix(); void setupViewMatrix(); diff --git a/engine/RenderQueue.cpp b/engine/RenderQueue.cpp index 7f241c3..433f505 100644 --- a/engine/RenderQueue.cpp +++ b/engine/RenderQueue.cpp @@ -37,14 +37,16 @@ void RenderQueue::render(RenderDevice *device) const for (i = _OpaqueItems.begin(); i != _OpaqueItems.end(); i++) { - device->setTransformation((*i).position, (*i).orientation); + device->pushTransformation((*i).position, (*i).orientation); (*i).item->render(device); + device->popTransformation(); } for (i = _TransparentItems.begin(); i != _TransparentItems.end(); i++) { - device->setTransformation((*i).position, (*i).orientation); + device->pushTransformation((*i).position, (*i).orientation); (*i).item->render(device); + device->popTransformation(); } } diff --git a/engine/data/main.nut b/engine/data/main.nut index 768f467..0b066fd 100644 --- a/engine/data/main.nut +++ b/engine/data/main.nut @@ -74,7 +74,7 @@ body <- null; function Initialize() { - ::font = Font ("DejaVuSans.ttf", 24, 1 ); + ::font = Font();//Font ("DejaVuSans.ttf", 24, 1 ); ::logo = Image ("image.png", 0.0, 0.0, 1.0, 1.0); ::body = RigidBody(); diff --git a/engine/data/nebular.zip b/engine/data/nebular.zip new file mode 100644 index 0000000000000000000000000000000000000000..2418ec15e92ff4cf623a86865ae8667b6caf1d0e GIT binary patch literal 28721 zcmV(rK<>X#O9KQH000080FR062vu06b~{01E&B0B&Vsb!=gBE^uyV?01Dz z+`kv?2No$_tU%G??!~pZyUPMai@UQ6d|RxzyGwD3I~0fF#i3X!?!Lh8>+k&=@7O!OI;A{ivSkmxu)9Bc^(eQF}3()ZLiSY4>@C(qear1Cz(H5%ABbWnttJfs4e?mdmZ$*WkfJ0jt?RdX+8x#M zM<~q&&i*TpTE)Yne44^;@s7kT9^@c-@q+yCp< z$KFyU3cR-SBk!#}d-p$p)dJ|F2sz`IBk6r^8MOEZK}S5=%TTAcE(Hk~k^cE&|BW0w zYhvC{i;`mebKO9iTLpN&iYTi8D*=YMzeN2ao(kXoU$2dnNaDeACEN1DNbSNz!~d#= z1=Yk+kmmUFu}c8f3`4G|CKk9}<$ucrasxfl9TPPw=8M3EcT&$ks=moS-~o-%bk7T9 zktpiv?i_e|_CGk9y~tLY(v!2HIkoU_$7-%Wo!*nYnRorm3t-SGF5!2_@Gt7M#s@J> z>9nhtUQbbw)Zw*RMi324`W)+@q^EtGbt;yBv2WQ)zsLG+IDe18!iL^H3ja1O@1)&- zbJP>*vDRf8*n9c~1%UGF=Lx<0(Zm*m1V|31J`Em+JaQ0qS*ix~_Tc|p0wzqrn&EH6 z1N8jIUKeC0pTOA;JM*a8Eekv;)q@z({|nckz90)#nh`ut3$lQRmfZNew@Bhy#}#kP zMsrDMesUTl`z_2!xnZY>ave$Kb`1jh!0f!zA86A}=h1`Ex2ivy_?~O0??MWXll}@$ z(wDLJMN}w-Y>9Xs3s7|ll#7p-eb=I5Ku$ewNBQ2{#(;cq6CP%+$XEWt}0S#wNL6{8L$D)uk2o2iI*FJK_IE1EX3fc;pO;AetmZ32rEeJ!Ec|qTF`xrF9^MM1KV)}38@l#2| zVWp?vLPTrz;Vq0UIIIdeNZiOj600Y$+&JEsom>%7*>{>0so%3HWt|v!h$V`rW7z~F znBr`@8n#Cx%B@CcWvJWe253|cA zeLYyhP_W(b(;Wq`B@|Rq%o*RS^V2}^%A8Uwp6j!VLg_6X4&oQo0_iKX)zOP(^enmY!*t6TF^{}`zgsZ zKNa@(g^8WC1TAm(^@bw>+?k^a&Z4Nat{X~Y7Y<>Kh-#_Yj@~ew*IpJQlIV*lIKNY@ z{!9re3!>GdY+0_~FLt|5BY}V|WZJi%ijKHMp1d9VZ{+Gzy!*;x&#aV?+4CpcPtUKbI4BnL((?6fQmz=3|V z9;B8e;x$FdNpk!%%GGiAz8LWIOG3KnD)wV11%Pym_rQ9U2i?kJqFZQjZOF<0C`edn_L>2I%wVJ89c*l>{{i60v5z&52$x&&qIJILPe?JH!a{9S#aASgyoqA_=X{=NpiZB-?y&L+i3>wbOU0@H};oRFfL5%`o zNL$cr!o6&2VJH^Qw<|Txu<*)WQ3b_sqGA*y<)HOy;RA*cj<)ukn_GOWp89?{3CqMwN5$_M~JW zYtI)p{jmUPyWSEiWdTlsC0iTItdZe1ApqlSo&f#gx2 zq$z{vqX>oL&<(4baD~Q2|0I?5nFZ8w76;nMTe=Dvaug4*gv{C@>8m3h8H{*yjqujLK%#7>S zVKO(P(AHgf$r8+E6N-N1K&wZ_qY`jcdyMS=jNX=J3ZglHyUK%TuA1w%&2^-<0>6B( z-jX__U5ZRM8(RXeW7pTF0Bu;Cd`+C{aNtKNYFnBsH*nMhk*|M)i~Gw6nI#H7(9vE; zK|BdK0Z=^B*t#LHF1LQ5c2Dy*|05tY&c<aMMX+o&_`b&#E?lDcUR4z(x>tz# zeo}HEq}Bn=0t7UPejS^RaQwIXv-H44RHT1Ld0f*6TyU^Vad2J1I<50p1+RCl68CBb zqK)4A(7!F8xNaQ!ASo`EqaB&n?lH92V9Z~CtXNzLzrV?V znxOuiqg1N{U45(Xc_p<|4p8v?7yTZ4;0qvS_ZjIK!;K1w)9!CMU~Ep&r(3m?Z6)Ji z#la?tJn!9ha~>u~e;`uD(xTZQX3;}NV~cWF13-!SmtW^dKqv6Sfm72)K_jfmq8Ymt zU;z!fiz>Yo7s9xw!IeX0IBHDKJ&#R#r}^t}!xnmOfkZ>1yH1ru37udWKfm|iYfM8i zG@ucJH@$JhiuY4l0pXW!Hk}AnFr!aG%Z6SD)wIPE0Y`>Dm~FrmY9FRh7@!sj;+MYF z@E6rg!`b2ns_Qs-PdR?vd*l@?S3lFr9r`MO-r54d&pnm*+g##K&>=;yQ_-|Xfljh5 zPFLf<2?6H=e3(4#U~LbsGnaUMw-+<(R)km zXT1V16qO(|4Nbp#rZZi5TOYVCng&O?hekI z`42D0^K*~%Im8Ii54fn@yym=+Jx4Z|@_Fgld?{^iq7QAQ0+Z$cRQSu&2#D~Q2V zeJ26R+kX1^~6gT(jcKhZ7X0mp+TO z*L5i-VrxdX)wcRKFGu3M_FvQJg>n^E7-0iCXY-$BpJ9m%LmW;R4_3H*&R^Fvpv?V= zt;u;hzcQ|Xya_Q-U!k2YVdggJ8%xST1H&VeFGWP?{*8WnHUG*J8Iao@@IAp}_{N<* zm|p4TB^&m}2<`P(;XyF@5jT^nn(Wt5i{FrBwO3z}pmjfrT@f65O~1o$H2WA0R(t{l zr6u}MR97Ky>gcxXv|x(@l@XYvFU1*q!J=>wqNwJr1S-`lC3oA))^I`qu`6*bWxzB>Ur8o2KdWwh*!J3UV9Y9iGR(&R;X&{~qa>t?lN z*9{jt7Nak}09%$pacB?~H6&wcgwU~!o$ac62EIikLRoyjO-JyB6<-TEXPL&)i{?eWx4X=?fnIHZ@hB)<(}D1WlBeK(Z| zo2pEGctsc_XIp|t%ys#-X)h%H$dcz?1Vx7cvfuixwymqssuT(MN$)4-7so z5t=k2^=D(2q5Ao*$bA@uEOFYK%e<3&M2rSivQWtK=u%rFw?rkUS(9$8yifqQ0|)PXf; z2u8zK90R~i49*i{UN@2UaN1Uks7}D1Ju?-BVgr9rt`{jFcPGWCZl2g06RieFVM=#{ zm5~U*D1Q#5VV&U;%x^o%c4`RvUM0yIa zQp72K6y8m1=h~dcw_Aq7GUJ^!$=jdQIwAP3B&ZbwrwQLrZ^;101$u@6O&%O(5VHVa z7$x-7=%F>pKO7Twqu=zDBcpb1;5`cdD^XyKS=a6j07pXTlK$6(_4tAn8c_;uK zpr1+S6iR}qUZR{JL51+^^2=*ofP?Xu&*!f&zZgljbon5Vb9lzATS)}=5EL$6_D4IP zHY^`4k0%{L{QXpITv5tFvrm>3;@HFJ)e0%!?F)@kLXuH;uGiVTMTbNh-wgxMaMQ{D zu2&DP!?0|}2|c0V{x3Md+jO>*;b;#6bBz#j!bNItc(ImMQ3rLtl?wRjTI7+W z=Z$ZGMss$r(K8ZDB}7!K^OlHG?xAqm;&p-14ZJfODN4e_F|&hV>a0vhTZ!^&H-@@; z0)rqK;`Pyj+2|SPLRb50pR#ezr{z|1rE0JCObu*c_tyC-oKgVbuY=`1SY;lebQSpg zR&PR-efwLshi=6t^LV5*oX-c(KYxt)QyISOsO(Ak=J>zCC#ztWkP{?7w4UbgiF=Sdjt->Phc7w8TvuVJ zLufSk2mWoIFq63rs>|0XdfzNLWCmu>M<|QV9F2Gzh`4*wsGvOKFOSf!RNL8HlI%ZFcDx-u#pj zGJ9W_67}cR`&~`q#DZ)J;&(K;M9EhwuVAy@?~)t85(JVPfoNb)Yhz8zu1jwzGzmiL z(YILF*)D_T)ie(`VNY;|U7;GA9nb9Pa@txu5f#`7S{t2_<7s$@-{3v<=CR`PL@Y5j zLKh|Lzl=|*xJE`l*i?~Qe=eD9l*<3`qta^5eT_$S;M!tO7rg3>EwqRt*lELif~d#7 z0|wnSs^j{5X*WYe*I;$E15|0>d|X(5r)*oylKq(S3Vwr97r*9Pt=2PJJ=LwfdWw;PTX~3u!K%+;$AP8@{-^F(kv}5#Qe~*#G}hLB zsVij$3yOFCCLu+PltC!8yX6OId17u>^a`_ zuiEh>sRX{&queZ}BFn8Pkk~rmX4WUQeTWOZtuL<9R|xDa86Z7)dfIRdqntoXk(*t7+CUbJPkNsq8!ncir#k(YspVybrT*{I1!H zkkPsTXk#wJlp!;*sob8FZ-G*~lD9mFy5wJeq?kf{c=bq}?;KZLWY0BpDPo%Jz%lwG zh>K;<0d|%t(o+4RRmu}3NT5}L_uf`t-rz|VhPU^-p6C35(?iyW8MVJ@C(N5H?28Kw z{LZ55VRQYGZ2sPc8%!6CKOnbxbQ*!7#?*!pS|bOx%}6Qcp?LSav_ z+epCYCP72my@oCV2Ktq$=InFHMO0I!fivmtKaimow<4nbxqnx?hM}&M^+|VhWqZ~& zXmRAAfX;d%mw2D?8=|k<3MnBh$QPSmZ^Oq3`mf6DuIi;A_Q(GrPiZ4WZ9yoP!t9N6 zXVU^@C3~`qctTl?EqZyu_L6-^UygXm*>D^E&(r2^(b5&5(-~bIG+i*vUhb*u}f z2)HrMPrS)NJ%;1;u4QJL3Jz4ghFZSAAJ;V!R~|j@A+6Lkb%wC@EpD_ghhM45pAMzC zYA_9zl#Z#RMc4=pCe=jrgT$+%Zi-cAe-L^$&~9Al@!W#BPWb#h)N+Lj<8R%+?z0F$ zr&|}Ublv8^IwY;jXT7+E2(Ez24rF`HMuxXJxf3(+6N=vHc20X`wt$|qkG*7JNA`Q+ zOHm0+=j3?QEvM6F)RK2eV7f=UH9_IkR~$iAzuE&mNeRqL@v^{QSN>ADda&b}zw0>|6_it@yoc3CKU zLzFHhNmoIQdGLy!=0YYdou3E2L-!CbK#%gpeaqfTotbXvuM)CHQv4pfaU>kR&tj6nUc?tD0j z%9l&4SN*w>Q)keR{EZ@yRVs3sM9N#BUGT1xm?yJCUJgXFL{MLbh7*HhqfZLLbv74P z=^5n67k|ywi@Z1@=1!o6Ibw%C{}#BXC-`L&NB%(lJre6Z95;?w47W}moJ!3Kdx<8D zJWi2x(DH=koJnZt!gl9Uc9peaHV^5C${dgW}$f^n;o#$0}@AbzJk~kkNj|m-!JKoH!mYF{}kwt(%yU&@=hfASoTrWVGPAt=FretF7yoi19US<8V$ zJ_MzGrB#!Zi=!yq&JWfK;LvH1d!-&(N|>M|?fW&>rBsX|X1V@8UJ_1SSeN+QFviGT z7RVAi!fAdE$+V>)j6nC6|F%e4=t;v8>?tPKKX|aUY{{A&@;Jq*5J3I?3hmem`Egsf z^FMZUjmGs-;&$z*F=O1&GuHXYa(`LvWw3E-wNw7~6;L`|qg_62%x&@F$*lIxDk)9z zkWQHIF9iia$xD|M{9_?H_+JVG4Ps?l1#tZ1BKwWlqLDHV# zziFK7)n*x1-N9hFk}{cW7vWo&t@UPfTdR#jXPrg!lmCNxI6VV($4@H+BGTbg(LaNGrV!qbd$@S@0XxJL+e@s!! zlQ6y*p_VbtrU%s8t>vF8YhY@NxW2box3gGA0)MKd!WQ=I6urTIIw^)79c-)I<1^TP5t{1>KT6cg>P*XH zqbU5q5o13P_14;3MDt=;(pg82oe^*i@*B96yUA7TJJp#8#}QJGZyW`>e9t-WdUS$1 zHXi<^sf71bXQXIKtvMhV8?5$kKl+*=b68+EofUklOsxVA=2)qcA93U0wQa4O3j039 z>P;vTSchnR&;2*WLtDF+IL~Tsc=S|e5f7g`2LqIZ=T5B+I$T6JT(>E8{_2gRvYIA% znG2CN;45hOMh9Uo*h)1TB1hRm=Nj}2kPg(i)YHz6u~17$u@h6Me7Q?F*$eKKCEqj* zIP!9Y^6dm;p$UhJlc@Zae>XhzPrD%#-TA{879Jc(n~^hLi~C^l4UxNw<#GZ?+ORAe zO=dmOYBEIP1pd9H><-9B)qE@^7weMX<2c>&zDLP6RV~+PZ$E#r^<7G5WOoRQA zECPqHVW`7zSNTTSlZ%W0+Eic{;$8h?vx0epI8j9LAu*G|$_@V&x}t(;gycJ2gR30- zEB%ZF^N82v7s}N<7DwfyRd(&(&$+2-yJWRBpZ!<$S`3jaqe`p}8{m*`_LC;>b63|E zIbYmrWXHVUw%#k;QD_>H*rB%JbT)=OtpWZ!+#3}njUII&rPklT^b;#$L}!tpL9SrfBq2`)L2PKsNx|sJafbW8DVAWzRXPE>o85`- zGB9AabI7Zvgu4_Xb|}d!SM~sx9K}JsnJ8iZRGI8VY{Qx$6!AB~3ScjSL0&^DQp#`Q zlo2Dh%DRLk4Jj$;A(Pp6=sI0~y&GEMii<%OdW+c`Ic_LOsu3(nw5)CB3|82tsWiG? z_V{Hhz@aqs@4{ito*EUbIwixR*sjxK5@Yj{m8j-+?z8ph^E*@z2GJv17TEP|!s#wv z1X6w5)lE!_W}oI%7Mc_c)k6rb7AUGWm{U>xS(NRykt%_yk1Yei4N>X@5g*Mgnj6I- zg>dOG)Q?x~+DeR2(Ef-QPk5>gBydXY5naz|#FsL@6dS^oWNlRebC{0F6EJLZd17o1(J5K%@xorvn_ zTqI*v-|SG?%QY`l>m!o{(C=560B25(Kie%9qmT^gD;c zS$d4_q^w>K1hZ<7Qa;}vCH_?Hc0GG%zKp}PUJu$2P@sXkT%ho6v4~OcA=m=?KV5i!)Q2sFW(#d`a)O>ER1tB^FJX|KJ zd#2-#9ffPC59$5PeInHOY|qku48s&v|F8qA9Cb$}tYy{D^LE2t*U$AR!6cX{W183gTmWk_qkMVaoGQvH@-!qtKw7n(GquRD(W0kuOz^yKC4h#c^}Z z@M9$>PQc?&$y_U+09jm%?|KQp*E{=8oj-b`&;&~>)q*SA)WoMnH~SM2zHB#QVhVH(Ysd-g2n|Nd%si5 zTdmpOCh4(UwZsr|f-+Wp#Wxd3#~_n-5A5^mu14M+hH_dP3V!c?HDCXl?33!4aDXkO z2#I@rkGV`2L!Q2p?hi?&$YuE$eOKc~xvW`UZ}8=KXcaaTkM(S80tcGX%-i!+OiNVH z#KSh5o=WxY;5c>Ke>ZLv53gTbygVoWjpoxANK4|;`76{mXJB(1{ac>#da>+IK>X1t zbeF!`7O&*tRaU_b*b(5LXtQJ8Wpg?@(hLz>D4#mv(b`XBpZpVbU$09Tv+H!=+6WWO zymhwPL?&slo+)}ToW1N4 z>9(gY{M?wVcE7q2UFY&RaB8Rb+eES}orq%h>+k4WW9Eg{Yh*^@0nXdcCN^kQzPN7r z%l?bkjV5Lkcr_^L`962@RL_~r#~64DTb7o-srk`y)m;Nm%7WZ~g>IuG(OD_AMz&Vk z1hBm3yo0P!EGSPU+af28_g1aZ6060Y3Lv9@&Il$@#I5^rh1etBgcz#&RPUVW?Eo)V z!H;ETF`DABsKIMd$LKrTZ@cvum$RvQ7YHw($Rif$I3J^5LC+5cLGdJ50a1-f0c3NXTzQXlldD~S-{_n2) z)zd~rNfCP}^9guop5rg6uZJiW851Ou;it~6?=_D3v@AFSCu5VXd0hRm5}iT>=_ZDv z7`59IS08bF9|>O6R<0BIjW+no4{rJ?Rw9|E-EDE*+4Lk7T$P!nT!(_G^oPZ_QFC$Q zK9f!A4SiBSAP_QDR2BCVlb1 zfl~h^Us;j>jFOXGl}vkoJ_A3vqV-KP|K@Gy54_p1?W-^H4y%sby=P->OBT;67%_1M zz%c_IgkNrnRbN$M(Rg$aG(Xx>3;d(dFdOYCI4fUB{AORXc0Nr3+Ug$n`R<lUM5`z=3=GV7jDIYvx zB-4RZKz*({rEL?osUN^X-x(e{;hc8Bn!xCL=Dt1m7L|5RlnuRvI-+ zEX>+(4GZ2b^pNBSnHNV7+)1_lcYOqOo>eo^(-&kRvB0#wrhY|xn0t((bY=&z`%S>Gp_7I^V>%x_ zC*$!HOY(Hthk zXI$@EuX?nD|Gj}%s@j0DN#M+rz2_3x#@)+d2j0OlRUxC^tvLf)JGeJ2#kI9Bt%(d5K$`x!ylUHP$+w9Ayvk0kpU~$y zS8&c^iLs$3j)>la;}@&A1OjGz`2{eZzXHX_-0t>A$#K(Ca!}l#oVe&Zq3)ZcT=+c+ zM@a>0Sry|E%sVUR8&h2M%}{2eOJRVtT$<9B%Ba(Kfqbg@86NS~0ai6qL)AH$$C*9A zp2TY&yZe3WZ~>*UFok>_yB$p`x+R@iOfK#{@$XLnb_@$|Dr=3X(y>3uW&0#grx#;V zVLy#Ava*yEKgdh8&|V4p{!w|BBaDSMj)CE@sI=W#2QH_9kXnRS-dcte9$`EwDZj^~{jPPTuPL0j&bcROOomF$D^ZAkvJEJif) zA9C5>Ji@huZY@?EhH5dJ_b#=?A(Ul+%SP0GG3Y#W$hrIhH;}=6J|t5ybjf7@owE$4{MizAa$HgWp%(J8E7g*07C|hE{?rqkVaa~im~yiscXCmds^R|2 z`>ao(16FsvefiUa%9x$2u*-16Yip90Ua)6%b(tXYe&5)8lBj$xzcaGtNo;VR;aL5k zH8pz`#=nCmRU~KFv_o&Oy4U)7EGFN~Pc++}QsJUZuobsHgy%Lo@bl>+Zncp-d$nc=&j?U%)g3$I+t6phepp8h^X;m7DdjV5eM ztfXkoQ%*y0x&mFN{X3|YO4C_p4mTew{!+nF{_lNL56Zhzy59^3uz+#X6_&J+we_25 zRayq*nSG>6M8u!T@8Tb13*#%`l-&?fPJ6eGUc|b(BSK$33ft@L`%EMm2J@5)5p5dP zki-D`E;My^oi#O7S106j0^YagU ztNNO*vIz-3nMH88ERDz%{ zYS{Q73!oIqxUKd7th?AbDAO_kK%6^#R;{EUJPs*Hc0I^M8!hh zhfk}!^~BJ_vgyGdtqM6eEMKHco~=Jx2z_Nk>(%p+l+<^y|E%T33yUqxqliGVFawhw zfxlE#KYU|BHR9^p*KECWKolKuwLP~MCt0Cvd3zAF5N@2!JJ!E&9<_y<37T`FYTfL$ z&d&VBO?6@7vv;|X!soSKmG$;POL>od9k?bLjmi1}^NI0BM$vs&7*|!9xa zX;@Fope&+53xA|$9b9n(mf#dNed=+S`pMgD`&xXOAaax7$SpS;xg>(pbI+j3oAHsI z?$Pd}>@7qA8|=~vS(~j5$!w)wt6gqk^LdSOAkj3U{G1uq^CEmpjf&pV>k6S{JqYIO zOZk+adY+L~SdtD|%1n88TaQs?;Qh8^el*K0;E{r2&?{E8vddh8RHw3S61S5+ZY<*H zv*?7qdi6=JS8s;QmUUoX?gimA(c3rX>!kIycbAzc5`kOwUjv6$4R~4-tI?o`iR$eH zM#_*9zFc{x77F%A-P3S9&G0OSE}47>r?lYoZ=(yTFO*e%Z)aLr(f{d(l=MFH z)Y+rV$Aa_D*#+3r*sFFww?5;g4&QzofTdmP<%&4;GiH!*Q?8kQVBgWkxgP^3o;HEov8&+*Y<_*y>Y(v#0s-S>M{52-MdTfx#&FP|=vQm|__xKq4t zv$Z$wzpnqNBNo79HeT-r^6)0k1zCHCj?}6o{;<2ukN>by(OO-=*nc;X-roMnTiN9* zzeu~{nQD=E%`7yf{XN6PXvAS$G%1=@4ThRE{!dy@Ctu&;jhVgSK9P6?xcmb@AR8|6 zVpUG$c3*?>G1>}5Ld&j((o*5B^xPjv+C0zRG?nLy@kH0sVt=PXyYsd7PhVF`H^O z@I8PpE!>D)Oa1ONIBwn8&S7|V>g4!nPK`KEeLOC=MeCYM@opt^Ygsxf+&n+6*kE)h zLuO*~cOt#160C{V2C8*M@d@=_M~Kg?>_u{zl2gp6;a^7HIaIjsbcD!SV7h~VQ^adu zUc(|aLrVXOHZ!`)USd0JJA0tS9^u`x`d^~r4aaTpDW#d1*3eQjV!%3YpsQf>vlDu+ z4=<;xV{pbQ?^7ltDOUjMU1TM*cP{A^cB5f$4XQ z^o43XUu}9u@go6ThG(Yoj zpY&09h<_*kKznaK9-KONuz>>w)60WAk_?kN3Kaexh-iY5+L6crX&@E3f* zEL(#g_%GoH&FOyka*t}V-Jow=?W#(93bjud-K&|7=o6zcKbWT0SUyK$F(EmD$>q@I z(M~9Li6WMgMy1OeV&@NKGbkUW*ttVH&^c&VPOZ&G(6}+c+v>}WiWD>|7PB>+zpLst zCwkdQ#O3fLxq+ZKM4@d$1^VE0T%?d8n*dbF#sC{I5ZiunmZUa@gURtY{#(qYd^)L> z8wDP&??aJhwa6k=y%8^X~=x(CK6XLis{92f|NM)*s zW&O>d=cH)8yeZE#&mnL*Q^|v)iJpo$ALC3u`zLBC5)c2C%-|upZa_8>>#m!fr_<|? zi%vzJrwF=hJI79AYK22Z_~Ul-lS(%IFg~>PwC*}7d^4h^qS}J6Nh(;`lm!a+~B#r?bh$5WiV}DF*m0myGyYD;$yn>fxC*r@XzPq)5-m3 zG}q<1_6TK9#_CL}9#+f<7GFD?JA>2eMfmp~b%79FGM}sWtU-R!s(B?uB-K}ekc`uV zOp*09_2|a{DlP%)(vKZ=4d9^-YVlVW1eFIHgmj?s;Q{#}%|1AlgxJp||5R;dHLQCr z6meKjxCps{=x&V!5#DEJ5A6>q$x)ji>6G$sp0jEj85R?_ayU#1w~?wWQcoQEd|OUW zS!jKhX+Ml=M=gzqe2R#3zbV_94AxS?g;;O1?;xf{U)t^<9=XI!n1dE(;k2qp-KvEkk^c z!-ha^w}HY8LY&1?jaz7Kxr1Touf7FgNK>!Z@or8|W31IDO(w*?><7s9x#iXLJ~)8r zHezW^z+YB~Q;hw>G5uEE)2`hsZZwyk@aOhn3S!wj>um`hma~_#T7zu&a`U@gFM?}3 zg1!4=*cAhXIL}^!;k?I9b)Ex;WZ-omr35YO**eBZ^)D`4oN&91i2fu;kJKYc&%vJO zw+=nC;gbK}+-YB9mRww;jkyns_K2)4y)#b5VbNIr`LZbsdZl^hvqZ&i!j^Gp%$JI zYB%w%v9+svmF2ewgUGEGlga0j8HnqK zkYQ-ssx#8w5)Lt{(Sogg0NECzf z#S4y5?@Tcpd#%?1@-gmYQAP92Nmju^e*;RZh!izVtemXZd=B zOtmx>NAC>ZIRH-7of2{O_P|XG)jP$XyaR8l-F z%!a%fg(dk#A>MoZ(Q9-JB!$dc{pA9Wl|OmVrdYF{rK6V%?hshMgF;gxr>rDDR!xr8 z^xO$M0{w*3@!|u}S=B$*s#YaW99ctNjxG^r=?Cx&8@znVfo3#l?F%(7PY2G{+V^xu zCw@{u!LGnp(zkef?$+PI+ncUXr&Nb+0*w^Dg3oX?q91JBw5)^uRJcbY@GdVWM-!NYUQtn7;Cgc(tB;xpBnCc6PtVPIenUmkg#~ z=kF9YbFxE|vM!77M7!0|9AA71wnd{@1?;k3xUmjK>+&4{FI>;A74Kl$v&Yt02Q;b1 zO+O=BD4halMug7IMbC*|mP5`Q_SeGK!7<;WBJjTg^hY}`T7L~O*9b|qOJXdioUdtqDzEc5l_8{M~#}7Dw@{whj>y9=aS2| z>0FF^sdWr|Ck51&WaC`+0-vT07vOmp;cBBQAeACBv_Z7}?fRF9SJ>p!erAq3Yr46O zXs_fn_OAge=U?c_7e2rC8)I|BoAZ8KBBbA`5ML|3!2*+0ycYahnRh?rB^TtY#SPs( zc>dY>(lfZwGRa(Wpz6YOzdQmVgxRW5Kb%hcf~34S@4N#X8yHQ5VYNiCT{(pzN%k4{ zKj%zQg&h!kCW`m7PryaKWJn|C7rVakx5 znP5W-x|#Gwzt(dhiNIAzf?lBm_acJ>GsGn}}5qckb&^uq&!&jzpDbwqqnsXGSw8vR{=NR&0EcmBHD zqyrFpPMcAt$-9z0tbM^{6dBr-FbGu^dSHA=uj*6qE_^yJ_u}k2rMVtuf!vAKM zi|Q~ZEHmYv#0CLQ(ug=OvAm4i2uM<9*;x4c||%F(e0vQ zuye_&4~7vqLzB>!ry9v0+0O}O+2~m6cb;8I$sD1Ioy0Z-@%Cy#B(v5ShT`8B4RyTR z7#Yf%a0f`-dwfh-ZAaUp(uQuwCV{AQi3p%RgyBue=6a zip#x4UBweqnQp6ln)P@xR;wCcrP$Nx!EA zp4gm6ja_cCo8RtA@1`Ts)Y7PXJ+onjt=Xp=T0{zU<{z#zW{xupG@-AWGz^?FL0qWG zIm!nerrv~-Jc|hmL>eX@hK&L8If0+O#>2>TC@c(p!7uDh@4d#TE6;O}B0k_^ zyes}gLZ=(Kb}`J)a$LuA$Ng!E@(HU>Os++GPm(yp%EW&!-C(r&rlG4o!(`E9$1HGY2)l9)+m2pfx6QOp@k8E_`kI7mUpJ zagqJ1a)k&QY|7K8Q+@FsLP9qaWIJ)m#y8r!-Q+AdOJ7haKF?1(%Xu2T9cIW-kE~c^ z(+eUj{f!uX@h@fyKxPTJ`-}!Ht`~amTXq|{i;z^>$u z{CE6Ovk1q{@aNi2sNb>7duIZVJ>*hiKO?x-8Htp3ugSGd6kMM+~IUfhtKO%UG2d1q@bo59Jfun02I;)l<`Qc)e5_SwZWWgbLV& z7-ia0t74Mg+K`uY4X<)D*Q~CQsGzzaT>EDUOhc0`Vif{DcV7mwxfP>|4QYtnTG%|H zm^~<4nsJ8Q8Fh8bXGQwX0hnKY+(t@|Hxk}Y=f14?zfPf%Dq@%+@zC$7yF`x-eMAbK zY>up{NIu+9%-N`lXGo03@6#F*vA^*RcG5L_qONZl=x6uSlso?Z(qHFZs(P$))R>Dc#Z?dsp6{TNY-8`#`=A47z`;dxv zZGOPoM#pY(Reej2ITc{FA51_{#Xbc?lS*>~>u$Dg=_lU7ytxr(E}iq0_VfoBsvKes z408=AxEq-=Hr*eIy_}#voR#yTEmhwoE8y>*FuShb>T38|fCq2}D2uIR7TnZ-#Lp!& z9xuW^yvolztuUcqu{_GS@tfz&&yl!9x@M;w#m79*6cjgjxTWjvPVYzyOvRgqDoJmi zZ^)AqZwDlZX~p+)@947nd>EnlvM5rEz5z)&@E44Hu>m4stxP{_<=qX0jxGP>(VXYGr(XeG|#VCZFJI z>#Ve-5eTWPlAzAy8YbxHPJ2Xmxny47w>Xg!jw1jqA>I+BS|@{JB)3?HBdP&;xmt-x zJ!tw~*jDis{e=7kHo%|-pn=Vk&PO}LRFROtkdf}9!AY%v^@By0IlIBmZ`Che&r3ZQ z%#+a2Z`H+q<@oJ;+-|C|I+^mjO;2X=nCWh^hItP3C({~@YA;5rbWpfC`6_3o1XMDO zl#J9y|BZ~9!R3+?MhAuSPES0JgD1F9pV}hI~t7oLg?}J^w(V95NfP%XFwy^VNI$M2X(fK7Yv)pp@ELDCTmKfc*s%u+p;X(N~76 ztC^N))N7j4K{X|7yhgT5k?GgVIZxT}QD*xN5{Fl=*`L>Jjy@z;#i-4S= zVN4Ey_Fi8Z@)t)DPYp+y+)Y9Xf z?dZ(&(h9WMGnx`A=2`4PQ~4%z`hvINzuF}Tx1X{MJ(Yy?oH%T`jox;cM$;{}uPIR5 ztzNzczSp<`h3jzJv%S%G#I+9Vk>1sOd&2nG;x_q08Ro{a!Qf>vj3=hM-8SK%NU0O+ zY9-OhzJCoYBB7%OC#!Ctfs1BU5|F&cBZY5Y?ktT(OQqILLbf%&3FD8OcsnXq znR2QzbbNNNi;$F@*nbkYa4M*m6A1B%{H+jWj2}7r-t(F@#!NSFPt$u;D%V8p=oOg; z6`8SFu{WD@tB{T(;nObc5RH;8f9=aD2+lA8Lg8usz<|tjZ&(g!pW_U(j%k zTvCZ5l$&E00DzsTF zb>*~AHoITc)%iFO3z<>(^rXx&X}iA|1y95BY3J{i$;|UyF~B{~y#X%tI6s|zKd{&0 zw)^rG(iZF_8yj-eKmc5ppmbba9wOc-am>I8nj?oah+cAm=iD0a9~C zwcp?$uX#t_BKf)G+sO|-2uB{27{a!u%B(h5;{No(Y5FdOfrZafL=isL?4_3pg`aa` zejMO;>2g=lFD(>75FRfb^5&6qY>o`dBC*)5CuD?@?O8_w>)z{`T*)Wtg0UETusHPewt*Wbn3+4 zsf*s!N=j%8vPfR}RJmMYb_!fQ>4)1A6{@iosx2O}4^Pp3pIcCp`Z_=CU4};C3TXJ7 zp~`Q|%@Hec2feh>915e?XlLM6j-GBxbwof8rOPon=TaCdqsMS8Kv7H(&wdbrHh)y= z_nI63Ks_RrB_#GI$Ft5lxY^$I$+27-bR8PdugfcjBIlVPUUhShQ$+omOdai--=Mk$gL8G20Bug=4c{as$;KBq+&gZ^IoC;WMk?NLT91d{*)AfnhZblD{^taDO2+pfbW6U#)_bs(%J>Y`)8Y z(TVz#&NqbO9q)7(92X!lb??tMdx2A#t3JG@D^g88Ul8%QuTC&V4R;zZkIDD*=~pz~ zQEqTwsY0B-UXmfpUfbFyZmx?POS@z|IrB1Hj9%K_>tJzzu8mU6NowSa- zL(c4wdl4kYpqyX5m+IPg{7^b7z%EP&UBJ39Eq51JY>_6vIomG;^{Y8XH&3pL)4Wv# zHvkhXeKasl^V>It&{CE8zI#wnUlsMQ??v8qouHa+?5?H17Y^U{oe-ccXl>OqVqXfU zE>JmkbEHC&vNi2A8{AlX*VT52CL|=?D=uKMJ!hWpf27eY7^&`lO`!rRXT6B`uDN(+IAntuv_5n7PBaMbLm4W*2 zE;Wr{$I$PRr&=|A1vpOY@2O1E1fWdkl~Y{^Kz-TM!Ju3j2jy8~H$gG=FH_MI*QBLT zs@D3g5**K>5AvK=iebUSIMbasDl)69{D>kVr`0fdO{VW{{Bm?XVJ_!SBFU69bX%;I4xM|5~ zt+C|sCNhCPRwRgQl)uxDO2l+r*>T<|d-eJr?W64?8I6eOoCH3&m*q+Jph)+J1ub*wD!*TXk`{iaLtah5&grpZZbl zPDeta>@n+}N9O_6prF2|REk2Z-&nbYhDltssEfJiacE4H6qs}%)UqdUUsFx2!gD0L z{ig$)t2nqmcU-{(v{Bj4Y8^{-(~|6WmjJo(wb4?6f*UT#{*GLD(h&~7JsOQxqs7q( zx;x1R86+6stZ$tw~ zd~rLfhDfOVfEa}oYO+pucX)O^R)c1fyuy#|OVNoyb9)%Z4(cfKmUb}?yLHC$0g2%vZV^R|R$MtvdICgY8cJtQW)k({kTUTci4M-Au zmsH|ub99s9jG6R@|H8M;%pAG?JTRsFQYsT*+3>BZYOxq^fpQ zJ2tfgw3^A`L+nosv*qG7MBHwj$-~Z#v8@~b6Kk5;uc#z7-sx{q<==wnxD1dT6vs9x z8ZCYr%Ygtp*oYnDXiBcDg4uHi2)Nl-ymi#hW9(wQ1=J?r!Lz5NL#?SrqS+zp#1zqp zIw%;f0#!UE6UmsyN$Q9AX)!I|N@UvcUyJvC-c^Pm_cCJj^l~)}iE%-r zI;+wFe#|%7!*j953J;;n&lXNB$|}jE0oR#j(}^p zVH5T)W)USLbBy4l{R4}~dZ$=b4+z~+S!-~HwgZ|4FHi~%N`~R5ud!PHbndJK%_$_7 zhbwpwBNymEw@rgc`*bL>IW{H<*GstJYwE|4 z2A0kb7q0i1`x~W@1T|PY>6VghFaO4DNwWE_Vvx0rjCOza`JYiROf$2kzAyHAaKU>9 zt`Tc<**8c6*~PgpKlrSrKY}R(J@tsoqkkSO6!Gli)HqT<;|SbAiEeZ6JHjM?;`FM#R)x^Jbs?8yG#*Rr zF#XW>dzvprKSK4-c;_ES@<3O!&j!db3Mv2572ieM)~_93Bxg4gbCU{Gr$kmP*3_0%}z1%X8P%v}CWpN;#+=jab2{GK60$ zd5Vj8O-CFmeA{TyKL?Al@st}^b8A!xwM8SSv?$m2nsG+y${))F$m3lxo$=&#mD;sv zkVHy9JJi4DYW#M08N(@%PX~DP;pVr6OHv$8hz>=Ga1bre6Y! z!pumhfSkina8{}tAbWv*l4ZakH}4p{kDb#2)q}Jz&S>GGbn-O|vBoss1f3G`3z0=_ zI{R@y$@y&-)dI-dny;%t)^W9bQNp2byjzDXLh1DvC}V6S0FLzZ&LF~rrw%T`^g>A7#?04DPi~oA$`Pd~*3AM;$ zc);$>g+^abNS;d8*OJg=HbH}twlW;Mb_H3K!xD+E4chRy9N@%YwX`Aw>o_$~m09Bn z7?;zqZl;^TrJPRfs{L~f#nfnuekv+nnFuc#$C@0vQ?~kDePO(0D>DC(S(!I+8JRwa zE8?OSB$vbE48U|%J=?gfKm;x%(uJ9~C?{Ussgi}uolO8VML*R~MP z|0vV6F~J*xmHztbsL-kjkRAa=`(2d?JKkOHWo`vKJZNlHA{jZloK33HAWQ7~Ntswt z#F$-=`caul#|jhBHc`r0_5&IKztc_zjl* zxz|GAH9BfH_@=}jem&Vx;52h=P*3cPBZO3=90DAMZrK7iy zT`jS$D1tYrCQ3ubo)z+iRDTm4&5Ubg;e|5)-I`c|uj(9kUkMLki5F!Mf!{dJH!Q!C ziGhmDzv*&0;Tt00p{#q3XDaGczpAh?JNoKD?gb?k!QtAbBvtO1OaXH_QI3;Q08L|T zXQ;kZkn=|Fc0(56EHQRPJQdo8@4iqB>nSmOR;>5oOEfW1DAD@fF4%0c1xfT4BgAuk z#|p?!nVgrSmvF9^$@IzDN@{ov3|`nDZBvY|Mbx);CZhyPh;1a9clvf#5-?-r3g%1^ z;@B2hL>OoJN1l_<=vd-YVr*CzL;(Fexs{bxBI*H9opBlJBUUtWZU1Y79nGqchv3bV ziY6>xJV84_9N7Pm`W>QK4>P+X+8qTnBGRkA`7${?q@qQOMjl-8gk7-Cu?h^s@ZS z=axf?h9e9Uubemwp*H{0Nqldk+ctMIl zlIZqL8qZzuA+Jv4pG0R3ms(uNs=C>#rMa zVMg4}4rWx4G#__yw9^Ujt&*v5He*x{{NY6YJ6tuy&5g9&>_Z%g#xm6~nmX3b#%D7u$cv-uI=R~g(>X7q+ZYXRA2%MppZh~uq+j#kO5rN z&*8l6bZ*gs`lkIlrG9p~AZJjaex9cZ9Asato?}qBlS`v4zNyHWf4pk*3taRr*lLUP zQ1<77<)3u;=$GKID_ct$8$w}k+chA1|6OIU?|5<7?#h9)%$VAY&_|EC2 z-H^XS`6m~Ulj}Nlhh9PjH0qa8H+xE6mQv!K_()hmBo&uk?*I$HZHJ%j#X>&y6_Rdd zu8*o#ad5_t+vb2+kPIByZubA7ItG%_aXYB0MZKcvwQA-}p_;-0toc9no zb~)nYKxXZ9Z@CYkKZvYR4E3at?C&~);Fc&*aOgAg&FI0gnC25Q;+bFEq_Gf=v6!nW z)QBObOr_?#9v<+2u&{hI_D}untOhE8bi^d0vBzGd>T}Ej6II;hP!*6aHE(F(A~}B> z5`X0h#dxBI-@vZ5aKL3yEf4X4dQ?vuzGfdFH4#yvNK*<0UEQ6T$%Ncw=5xp8yM4BQ z54(oc*q;DEc@KWYBpmJE2(=_3&c~*dQYD2la;5Z(^U)YR3o0Zp{G$u7L#J0Xfn;TCLJm%u&&9Vemv}K7{fgXnMhKu~RK2`r zel9U;HP5@1)QEc4!RbrvTqm3BubS%>vQWTilinNevUQ3|z^YKUbp^$pkYh#M2*MOR z*2do%Ii#Q}%sT1ZX746e<>b|}>4D878(C#85&-wsjp^1;o|Bxmw0Mk0v^<_X5$FB= zZ4c}lbO8=w=yVGC&pMQzyyBdZc0V_xSZ@r%Y`WrWxZPtd75y#Rkxf8*=*ka9p89_^+oj64o>+g$~ zT1WcBHr{!JzNEv9>75UEtLG=|HB^unR!?})N_c7?qPq4T4EB4I$-`{?Igw1)hKyrx z%0-EeJJIGU1D1pL(iyR`Wkj&>DKX4V0L24&)Tp7!eK~1c#z&K;|)F9ZF!U-!SB=Kypx3jd&CqY zY{_m@_O0BNY@v8b{v#fQ1i5*bfN|=sE%e? z6!D~j8U8bfI^n!SnvVCC5Fm9&PKV`)Zxe=kyB}-Z@*O!S*s}|mJt^gfH+aqiAg!o% zKYCvJ6&kH(OknW7QHo9T=x0)Gscy2W%9EEzHKOUT#@@UFt zy8cSK-z@)JTb3%PP}8C$=S0udjP9}DmSj`!KSN5pI+VJrSYy`*bL&Bke~TPiM#YzSUn0+bM?L3=_bhg>N;^-E?s__u7V zj*lP*s7Z|aI70#W%)pFr(fSU;yK(Huq}zU(nkmIEQ8G!_=?r+wlj{_SHhdK+xnIng zqb-e~B57Ksx!>*Mt{Ka@f$ujR0XP;M6^b~w1p<{Xoj*GqIUfV(rO_XuHT`nve*~K9 zH+GJfbzV-PtFIq%@!5kxfrCWaR{cpA0ZTsOki4<9y3nHd&UtYgNFQS(cl-<|?7z#` zXnuQ#U-`!p3P={xb}%|9It&ZZ6oSV^-L+%--TyXeD_MXQhn6MUe=mS38zULUEcp2H z1sz)6Z?z+>TPG}Odk7nM^P)kEYQQ}MCw&C6n_i+x$`v7IkRoB>tO4~!H+G#Y>D0)S=`McCkCOdIhL)!cscv>+8W*H2t$@*y;=Cj7n}3VG$=HBOE`ua&hk5JtAIUI(196RD zHfH)*$!37xR8s+@xw2lB+n^YCghtl0PM)uEK_t$?(o{@DZLn*JVfi|~+KHV8#eH== z1({!hk^o0XG!|sI=KKx^qT}Z-@Sc~s zgS+J@y(zA3=lS;%SZf$HmC)A`7kDX6$)76fx^$6Qu&yksrj}ic^>DwXv6a^ZBJ(B! zZ3w3}Uc@?eaZ#9!@OI`& zi+W&xr!hdcrY)j|SP}{-L8M1Xz@6uiNqV(zrto>yYJM$ffiy8OxfaE9a@MyHZIdsa z!d&IC3^8^4JJxbkwCgiDOsJB_3(b`e{hZL=fzW=HaNr+TlKD(r~xJ_nG^7b zA84@naiNx>xGq~tIwEz)Ql-Z`j2S+L+IO`q(#o(vn=s$=59Wb~Whwlp;H-})x#*&g z-Bp!aVWvuk)W}GVw+3z*hFyQlI?XfJUlT~DRA}4&=I`?|UELFGg@7&GpM{OfHjCU8 z6B6gdxdXnn|4OJnV48jm$*c$R>Q-T=$zL2S-K_q*X)z0%DjYMQC~ zumEYBbHwu`dLun)EMA#XsTt)Fun~pzK>n^*R|(*%RJB9k5o7FZZm2$x(s!vt@hQK) zxsMpwJ)B#JbWs|O51phy1g5~Mr0w$-qW*kAFU7LfFlbWFQYc&L3^gpWPjuE$F zhKZdcqMW9pl7n_<<4?N{#aM=vaNr0_#vi8AU9nZ#OxW&F+@Fe)h@p%uYyU#wTocrH zF?J2`eYE7{YyTb_6y?~F#pOZk8^zDL(p>{8?b^U{mQ~st*Ei{t>v(x$+kEyD7XI#V zVojamxvQdj54rycOYcGEoPh-@FRC*mPNajRi0JRwN<(ft4|X^agcM47;HbtpFjICm zt;Q>7zaq+F5^s0z`d$0k#18jZa^@}1t$Q4vMiDE*(dopO+_liS>(4g;jCee6-P2!t zU3heF&x$&jDH@KV8orzLQL9XxHa|3P#zdK~-e+k2Y0uS*6F?s>4|?|wUdyW1k1MS< zVt0Tf&P8yPk7{>q!!&;6gyj8os2ERnKg+MQj>#GO8DxABiLr0A*#yglf~Hn1HsR%} zH6X%(Bw49f@QEZcn4gGsCq}0(HM#8gN5NG{vb8K86Bh4`2Go&|XCt%ERAPKTy1O0U zYLObG+|(1@w?Y<{Y#-6-2;i!;<0C-IigdT2Q644aG5e6zP%V3vq+FacQyWNYD90q! zbuG|-WNMZ+Mg>y#I68O=GVVpRTG--ZSgmT@GCv@z)b#YQ!jLEoXm)r3-bK(8P^B_WKMwLP- zE)8aPP3OdFYCPA&S^hf`#AeeM-d1w#+ew~yjO!n^fWz2oFwDS4IE~L~lO;tNu6icB zz&!4$kITXG==i{lbDZgVaJ}{tT+n~4X5gkk@6{A>D8yH=;vDNOFc*$x>3-}+O$heu zmzWK^VxbqPS>Q;;T^nxS*3Xxa>K&*4P)%>{DWkTH;%4D=iUGVaVK&f zHb%G|_H(4dx{VM5cyOD@St>QkMPNX}#Vapljd~G*)7-?-smmd#s~@!n>}T_QfqGJJ zz?v4=&C0}vlo+JcP3WCA{L%5EQI|*`8`}(jTX3`uY-|pZ&GffqP(fh*wb@1Qb?H|6 z)0*J|=vuRbP}t27EHI`GHJ*{ro3%Ww-&Y=J->K&7Tqx2AZm}&=I#;7 zfcBgs^W#Jf(nH$VEvTDY0cFB1oewZHFF6k9zKubYwZu^4ro^_+136Lq#$N)}3Gg+b zIZiyF=z@U`bW8v`FVy3^>(^cMSnbty%<#hsLu%7caKF+gJ7<|bS1!j?u&X}z1b~2G zrr3Lk{A}83PDs2tKf8A-Ml+8%PL0g|vMbT`b|NhQQq_ReI|0LOBpCayPKS|>yR`Hq zgT9sK>QE3@bzo9&%NHVI~bMG_k8#w7AwaU>U9P z84_t!AcI|Z&oy~ez~d2KlbCr`YeaYjp~*9;ufSbD(nv$j>Y{&Y6>qj*rI|eitbGT9 z{WR<`_q0xZgD)luk*2>WWg^n~)zuk9J=*;kdF{yLeDqx@j6OkT+_@30b|{_U{ee0H z#P}SqJCdWI_Wiq`yQ0x0y3z+L&_^CwE8D#?@w}yV2J(HMP+T)H;a3*w34%Ji`5_0^ zHkuE0)J64F^`*6tFN4R2H3H`+{Y{L$kjrz+lamM>hvJrYEN}PQq;9#D>&}F=TcVnC zwI3E3Oom7k7C zCOq^Z@S((#A5S#*E&sQim#uL7`$v4IaNBn=^YVE1VDESC_ryukE;mT&ghdYHW&J~} zAK08irF{L%jez|BbGJnQbGMXPfc_YS1p!&1_^<93R%53tjnG_`Afs%y>~O z(7&SksHmuV8hea?f-tuu{9#}u*n?0Y7ZOtoO57A#1SNeaSh}zkucZtmY%_VOpTHe<@!wqcf*@3;} zeUGJAxA@9}crSMPx9 z=t=o9nO%$S0h%D6bt%iWaAoZ*2im9)))~)7!+Y>+Nxt-C(6b8BFbhT&t;(i~3ij!d zovMFYzEf7u%D~3+vyZb(skTv)AICNas9=2sX!(|lSpmKp z5Zrm?Q!V3;EWBCWvCfpH9o*3`rbl!s(#1X$AwG`!6t=Z8p1;#cNT(3j64eA2bzS$9h?5u;ZGguSZ--ggPK!dMM(Vg&06S&4Fr$cL96o zx}$Hi3eG2RUd$gd#aSTMS*sBHcqeZr%yn@m=!FgGm_Cp|e$>B{mdLIh*`C$varh2? z?kT%o#+2^e;1ZvqebZIeebUBP*qxg3mH15a%a?f83Y>56U2+jz30>L`$g!OMpULWP z5n0_tuR?qneNMdb0q=g=e~!@ht4rO5c!%S2?MWjZo!DoL;arznX@$17&Fk~>?M)>J zd%il|(mjcN{^!lI-Lo)q6SG zC%(fU*I~@?zBQvdWazrShFg9!W49IG++0&Vshwyg5fJrG5c8&qb!x^Pd1HJPlnHnq zqs$s+3Ew|EKtH#po^foLd$+s}1iDOd{yTTwDI$O{J@+hJ%c_2Hfc1RhfAHo6xaMPz zRcYku&xSpk^D&;G#XOLR)uVH!{PO_e=8WzIhBTn9>K{MqC=U)7N^- zu>X9c!z=MY>gx|g_lpX>A>W_5QThmaf#;3NMfVHV+y8aj`hw{D=L6g~b_ex4N?jasSx`l@n9CS3U^O0-ZhhnidKejI0CE85C{9 z(dg*Lh;)E;pkW+9Gem{dmc10i{ju*zKY%%ic`CS^qH2Vxing*ZRYh7e!mTa3>0db) zS;fGIK10F}Ju}=G*1D(4oBHC-i`4rsW+S&rZ=*3 zqq4tLp{CP&Us)Dy3GR^CF7}ApS~hjAxzFyBy)Lzx-%@!I-m!>iNp&mMEPh4#h5s$| zr4YL-5Y%TGr%4D0*)OwC&!%KUF|Cko z$^M*OdRze?4zHY=A=jzSpp1=*T`9dtwr^q?-kzi`pITWw*g#uO=8)bl!MuZ>&R5= zuvF_Qm+SDB8<3Xki99u6@$2GUwnyN02Bmf;@pi_~w})wWrr);5#NdeUqKR4E|Be?qC(2Yh5m~cfBx88+X+hPTdRoTdgYP^|0oGY^$oJG2FRb zz`vJp7tF%ed4KGQMwd@9JHNokdR{FxwzmqyuG9^{iWZ&wq&onJBTP>cf;8A3F{f32Fyz=Ze5~NN^`=hrzUNcc<`JS8`XJ07YZG&{+>Kxa z$i8sdTjfvn)dW1Q7y z^kWPE2(YrLYp{Lc)xQ!Ad~QLyd*>y2Id=jv%#8O|4_1P%nyLw|oUkN3L(VSfxz*@E> z+rc{TnuBJx``HTQ$lu%{PceHB5(u5%#UHm4wew@}WOOQ4r9%EJ0{}Xqi+LYr-uJGM zfud)`+BxQcWXV^Dxj;ieb|zo+cEf&#O39?TI1xSa4(C|%wX`n;Gx3si7hV;3WfpyKdbuw+4}xnB>(&Q uU&MX?f8c+&PW(R+{|W5;Xa4)Y#=n27MtNySsQ+|={kt9iwdHpI`TAcsa?l$9 literal 0 HcmV?d00001 diff --git a/engine/data/stars.zip b/engine/data/stars.zip new file mode 100644 index 0000000000000000000000000000000000000000..7210a9ed5eb1f1c31064a22eb70649c685669a45 GIT binary patch literal 10296 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 bU+CX|G>eKn9Q^-`p#MAe|GiB#|5N=xj4l%> literal 0 HcmV?d00001 diff --git a/engine/main.cpp b/engine/main.cpp index 2f66d22..b36b45b 100644 --- a/engine/main.cpp +++ b/engine/main.cpp @@ -89,10 +89,6 @@ int main(int argc, char **argv) ref_ptr camera = new Camera(); ref_ptr queue = new RenderQueue(); - /* - ShaderProgram prog = - shadermanager->loadShaderProgram("ambient_color_emissive"); - */ setupScriptSystem_Font(scriptsystem, fontmanager); setupScriptSystem_Image(scriptsystem, texturemanager, device); setupScriptSystem_Math(scriptsystem); @@ -107,6 +103,12 @@ int main(int argc, char **argv) glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); + ref_ptr starMesh = meshmanager->loadMesh("stars.3ds"); + ref_ptr starTexture = texturemanager->loadTexture("stars.png", 0); + + ref_ptr nebularMesh = meshmanager->loadMesh("nebular.3ds"); + ref_ptr nebularTexture = texturemanager->loadTexture("nebular.png"); + if (window.valid() && device.valid()) { scriptsystem->loadScript("main"); @@ -114,7 +116,7 @@ int main(int argc, char **argv) camera->setFoV(90.0); camera->setAspectRatio((double)width/(double)height); camera->setNearPlane(1.0); - camera->setFarPlane(100.0); + camera->setFarPlane(15000.0); camera->setPosition(Vector3(0.0, 0.0, 20.0)); device->setAmbientLight(1.0, 1.0, 1.0); @@ -142,6 +144,22 @@ int main(int argc, char **argv) queue->addOpaqueItem(model, Vector3(10.0, 0.0, 0.0), Quaternion(Vector3(0.0,1.0,0.0), fmod(time, 3))); queue->render(device); + + glMatrixMode ( GL_MODELVIEW ); + glPushMatrix(); + glLoadIdentity(); + glEnable ( GL_BLEND ); + glBlendFunc ( GL_ONE, GL_ONE ); + glEnable ( GL_DEPTH_TEST ); + glDepthMask ( GL_FALSE ); + glDisable ( GL_LIGHTING ); + glColor4d ( 1.0f, 1.0f, 1.0f, 1.0f ); + + device->setTexture(0, starTexture, true); + starMesh->render(); + glDisable ( GL_BLEND ); + + // device->useShader (program); // device->setTexture (stage, name, texture) // device->clearTextures (stage+1);