From 2aee7077a9ae4e3ce30af9f484ad5710a7c97d46 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Fri, 15 May 2020 00:07:38 +0200 Subject: [PATCH] [DEV] so many things --- res/dirt.png | Bin 167851 -> 124563 bytes src/entities/Camera.java | 2 + src/objConverter/OBJFileLoader.java | 2 +- src/org/atriaSoft/etk/math/Matrix4f.java | 2 +- src/org/atriaSoft/etk/math/Transform3D.java | 76 +- src/org/atriaSoft/gale/Application.java | 23 +- src/org/atriaSoft/gale/context/Context.java | 52 +- .../gale/context/LWJGL/ContextLWJGL.java | 211 ++-- src/org/atriaSoft/gale/event/EventEntry.java | 50 + src/org/atriaSoft/gale/event/EventInput.java | 57 ++ src/org/atriaSoft/gale/event/EventTime.java | 51 + .../key/{Keyboard.java => KeyKeyboard.java} | 2 +- .../key/{Special.java => KeySpecial.java} | 8 +- .../gale/key/{Status.java => KeyStatus.java} | 2 +- .../gale/key/{Type.java => KeyType.java} | 2 +- src/org/atriaSoft/gale/resource/Resource.java | 4 +- .../gale/resource/ResourceProgram.java | 376 ++----- .../gale/resource/ResourceTexture.java | 4 +- .../resource/ResourceVirtualArrayObject.java | 10 +- ...plication.java => Sample1Application.java} | 23 +- .../atriaSoft/gale/test/sample1/basic.frag | 7 +- .../atriaSoft/gale/test/sample1/basic.vert | 16 +- .../atriaSoft/gale/test/sample1/sample_1.java | 2 +- ...plication.java => Sample2Application.java} | 21 +- .../atriaSoft/gale/test/sample2/basic.frag | 6 +- .../atriaSoft/gale/test/sample2/basic.vert | 16 +- .../atriaSoft/gale/test/sample2/sample_2.java | 2 +- .../gameEngine/ControlCameraSimple.java | 125 +++ .../gameEngine/ControlInterface.java | 16 + src/org/atriaSoft/gameEngine/Entity.java | 15 +- .../atriaSoft/gameEngine/Environement.java | 92 +- src/org/atriaSoft/gameEngine/Light.java | 38 + src/org/atriaSoft/gameEngine/Material.java | 51 + .../atriaSoft/gameEngine/camera/Camera.java | 54 +- .../gameEngine/components/ComponentAI.java | 7 +- .../gameEngine/components/ComponentLight.java | 41 + .../components/ComponentLightSun.java | 20 + .../components/ComponentMaterial.java | 30 + .../components/ComponentParticle.java | 3 +- .../components/ComponentRender.java | 14 +- .../ComponentRenderColoredStaticMesh.java | 63 ++ ...nentRenderTexturedMaterialsStaticMesh.java | 118 +++ .../ComponentRenderTexturedStaticMesh.java | 64 ++ .../components/ComponentStaticMesh.java | 49 + .../components/ComponentTexture.java | 32 + .../components/ComponentTexturePack.java | 13 + .../components/CoponentPhysics.java | 2 +- .../atriaSoft/gameEngine/data/wireColor.frag | 16 + .../atriaSoft/gameEngine/data/wireColor.vert | 21 + .../gameEngine/engines/EngineAI.java | 39 +- .../gameEngine/engines/EngineLight.java | 82 ++ .../gameEngine/engines/EngineParticle.java | 3 +- .../gameEngine/engines/EnginePhysics.java | 3 +- .../gameEngine/engines/EngineRender.java | 148 ++- .../atriaSoft/gameEngine/resource/Mesh.java | 5 - .../gameEngine/resource/ResourceMesh.java | 962 ++++++++++++++++++ .../resource/ResourceStaticColoredMesh.java | 49 + .../resource/ResourceStaticMesh.java | 58 ++ .../resource/ResourceStaticMeshObj.java | 59 ++ .../resource/ResourceStaticTexturedMesh.java | 48 + .../gameEngine/sample/lowPoly/Log.java | 29 + .../sample/lowPoly/LowPolyApplication.java | 169 +++ .../gameEngine/sample/lowPoly/basic.frag | 17 + .../gameEngine/sample/lowPoly/basic.vert | 21 + .../sample/lowPoly/basicMaterial.frag | 80 ++ .../sample/lowPoly/basicMaterial.vert | 59 ++ .../sample/lowPoly/sample_lowPoly.java | 10 +- .../sample/s1_texturedCube/Log.java | 29 + .../sample/s1_texturedCube/S1Application.java | 140 +++ .../s1_texturedCube/Sample1TexturedCube.java | 13 + .../sample/s1_texturedCube/basic.frag | 17 + .../sample/s1_texturedCube/basic.vert | 21 + .../gameEngine/sample/todo_sample.md | 13 + .../gameEngine/tools/MeshGenerator.java | 467 +++++++++ src/shaders/static.frag | 24 +- src/shaders/static.vert | 23 +- 76 files changed, 3868 insertions(+), 631 deletions(-) create mode 100644 src/org/atriaSoft/gale/event/EventEntry.java create mode 100644 src/org/atriaSoft/gale/event/EventInput.java create mode 100644 src/org/atriaSoft/gale/event/EventTime.java rename src/org/atriaSoft/gale/key/{Keyboard.java => KeyKeyboard.java} (98%) rename src/org/atriaSoft/gale/key/{Special.java => KeySpecial.java} (98%) rename src/org/atriaSoft/gale/key/{Status.java => KeyStatus.java} (96%) rename src/org/atriaSoft/gale/key/{Type.java => KeyType.java} (87%) rename src/org/atriaSoft/gale/test/sample1/{MainApplication.java => Sample1Application.java} (88%) rename src/org/atriaSoft/gale/test/sample2/{MainApplication.java => Sample2Application.java} (93%) create mode 100644 src/org/atriaSoft/gameEngine/ControlCameraSimple.java create mode 100644 src/org/atriaSoft/gameEngine/ControlInterface.java create mode 100644 src/org/atriaSoft/gameEngine/Light.java create mode 100644 src/org/atriaSoft/gameEngine/Material.java create mode 100644 src/org/atriaSoft/gameEngine/components/ComponentLight.java create mode 100644 src/org/atriaSoft/gameEngine/components/ComponentLightSun.java create mode 100644 src/org/atriaSoft/gameEngine/components/ComponentMaterial.java create mode 100644 src/org/atriaSoft/gameEngine/components/ComponentRenderColoredStaticMesh.java create mode 100644 src/org/atriaSoft/gameEngine/components/ComponentRenderTexturedMaterialsStaticMesh.java create mode 100644 src/org/atriaSoft/gameEngine/components/ComponentRenderTexturedStaticMesh.java create mode 100644 src/org/atriaSoft/gameEngine/components/ComponentStaticMesh.java create mode 100644 src/org/atriaSoft/gameEngine/components/ComponentTexture.java create mode 100644 src/org/atriaSoft/gameEngine/components/ComponentTexturePack.java create mode 100644 src/org/atriaSoft/gameEngine/data/wireColor.frag create mode 100644 src/org/atriaSoft/gameEngine/data/wireColor.vert create mode 100644 src/org/atriaSoft/gameEngine/engines/EngineLight.java delete mode 100644 src/org/atriaSoft/gameEngine/resource/Mesh.java create mode 100644 src/org/atriaSoft/gameEngine/resource/ResourceMesh.java create mode 100644 src/org/atriaSoft/gameEngine/resource/ResourceStaticColoredMesh.java create mode 100644 src/org/atriaSoft/gameEngine/resource/ResourceStaticMesh.java create mode 100644 src/org/atriaSoft/gameEngine/resource/ResourceStaticMeshObj.java create mode 100644 src/org/atriaSoft/gameEngine/resource/ResourceStaticTexturedMesh.java create mode 100644 src/org/atriaSoft/gameEngine/sample/lowPoly/Log.java create mode 100644 src/org/atriaSoft/gameEngine/sample/lowPoly/LowPolyApplication.java create mode 100644 src/org/atriaSoft/gameEngine/sample/lowPoly/basic.frag create mode 100644 src/org/atriaSoft/gameEngine/sample/lowPoly/basic.vert create mode 100644 src/org/atriaSoft/gameEngine/sample/lowPoly/basicMaterial.frag create mode 100644 src/org/atriaSoft/gameEngine/sample/lowPoly/basicMaterial.vert create mode 100644 src/org/atriaSoft/gameEngine/sample/s1_texturedCube/Log.java create mode 100644 src/org/atriaSoft/gameEngine/sample/s1_texturedCube/S1Application.java create mode 100644 src/org/atriaSoft/gameEngine/sample/s1_texturedCube/Sample1TexturedCube.java create mode 100644 src/org/atriaSoft/gameEngine/sample/s1_texturedCube/basic.frag create mode 100644 src/org/atriaSoft/gameEngine/sample/s1_texturedCube/basic.vert create mode 100644 src/org/atriaSoft/gameEngine/sample/todo_sample.md create mode 100644 src/org/atriaSoft/gameEngine/tools/MeshGenerator.java diff --git a/res/dirt.png b/res/dirt.png index 4e139aec8009d36b6de6e7986ae6bceee5da77be..77251a83ecf5a049bb03899b077bdb09d37d15d7 100644 GIT binary patch literal 124563 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

    j1L@<+4PqQSh7KUw(F($rNm0fJE*aLP zod3sLP_>ZoOFffsdfMr`g3X?rsQ-Ev$Dl;%hiH)mgH^7|IZ*T#pJeytB&49+mUQqb z2#ru4?572qv+P~-HuN93HFlQs!og|%T={THQ5Xk`k zTRpi^R!|TTynN)p+V-H>Q{yLNN6ad6>FEG6iT-O01lWi>2Ubc?zoCq{z1wHfaeZkw%!W4^|tdo&ACUC&PR)Uz_CvO=55M8GX~{ zKc7}M^c7NvdUknajEb%O7oY)}Qa{$+d=AyeQ-JR6+tQB_{f#XasXw0|hw~Hs@g<}p zvXE^k?O`ETc4mF#t@^=gnbN3~^PqH1(@}aknGP2+v`c`Wh5kq@Ve6m|rgy}*xRHrX z2a;rib2Zm*J>*#Y%xO%tI&@VS^L@;#mPa6GSiJ7cIh-e*a>z*nZ_cIZ2k(CmJtN5F zY=&mIdmY|nP@9FM%9Y%KHji=mRa1x5jhv&9`ca6msDw$heq`|O9eshncv_f#=&>X? z-~SQ6{o=J!{-37NqE-2YmL7=d2dDu$s9dGd2x*D8VR02=%NcGr3&7G-$pCYVZvsDJeIq|qknm@NB% zEwaqRkSiel9v)zke45>MgVFUx+~4#|6^iRr)e(&7s68puy>Ys8Tg$Wl}^9ULMF?U6?UW zRW!~(2UOm*SH{He!>BpiJd3TkU=hUn19v?I@Pt1X=YQN+nc2;0m1&8tgv${9P}{iX zAxq_8cyf~SwMvDp=-p*Q%{-RQb0@vs-y8F_8*cxZ)&?{gvi@Gqy=sal#ZNd3iDDbq z_yXO(wQ;t7CJwQdI*A6Q$CB4pZyhc0mZa?UyY}|iQLL1HLi>Vk{?~_XiN2i7(X*TW zdRboE1{2r_mL6g`XY5U?e7=s2P#lFgT+vjf1`+k3_3|Tssq3Z;nK_Gh=ZTdWhMr2k z{--q%?teVaP$kjrGHj2rMV0(z#BwW}C;5Dc5@Gry)YUt>pg7SzsLR=R9bIS|tQq2@ z5yk-!Hc2F>az%}Kl1Kf+FfZak8zZI0^oAFMW3e^Qk-Opd|6J;+$CR&Z#^G>zH=t+~ zP`Nodn*J!omzUr(hLF>1OL0XLfoo?W$%41b#TC47qpSeEz4w!%ve=^O^5?=JPnAl6 zfBFxB0T*toH>OqUqicLdq>)`ik$F&g2ae#C>lE%z9)f=rPRg=N4m1Cq&r>fTl7cvf zF?!ImL51d0dqCh@r{3ic!4I+krAKj!r@eF^ZDT0S?oT^@_a9ru3>EZbQ^nIj&V$wn zCfG5;`wZt>oCC7p=T1lyHlX^L`=(v4Ah$B9KH|vkZ*o3RtF{8My?D+;O~@$vmx3@z z77B{PO^L^&7Bn}Qc}V|^#ZOA;u<<~_o35UW1o10^HTU-xNPt}ca&W^T7fVsuC$dRl zU%U9M2Vn5s;Nldq9PWT$%?hKE$8P6Ah6to;NS;E%Jtk-7UnIpqiKlN4`b0YHJ9}F^ z5PywrSohn1wW^tEc>OiFge{ScyqK~4>z>4lIDz626i`*(SON5tY$H)9MYzt$# zlsj^^e^m~PpVBy(tXl3yaDjx%#M&@i4Xv{tG^vp(kf*Sf*DUc{oN}JL&U>5T@`&wk zl5$fKOy#h+n+J6t8-D@()wQI&t|~QI!E8Zom1kzry0+<1O}W8aU+z4ikGS&Rjynez zPB;6BI+^xdz<+Wn7ncKRG>x@s6n(wB@-0;`9Y(SG$&NV45}0#%H*9fgW7M?~6i}o6($boK{2U2uUaPG6PBFJ9*nrBgf?4s=Y_Rh|4 zqF#R>xGkPVbdq&O?oHC!G`M_x4XEADF%@XupjuZ(*SgGBM{iB#djjX62 zI05`{@9zpqP)2*&q+!pR}1pdD^d^0;)FyjSAAPE!0@F^^}Z#jZe6y0uR)oMK>w=9pnY?SR3|M9E; z?h_Z^puKr;T1cc9ee3=oa&N1arPQGWh<~g++cqZ(= z#Z^864OH@S__%7V)pi-Rb!GsWE}B6;i`R{IvpHw-D)+m^(b*n#q12Y}--?Qh1s_Q) zt-<$YHBIV0*~T!zB>Foiq0~M}N^!YV-|p{$`oy?3_;EeyF!SclC;cV0PFZUtw_pyrv;si+m_sILeRG5M5I{G=V#Qdwppq23J{PiTYt) zN+~X>A_;uPU~E^|8qYmQ%~h9S=#D@q)bX=I#&7#>T|}nvC*d641^^I2O`E3!Y5y&C z`{Z)R(mH>Q^Nv!z@D5c+*pdAFp!%-wPcMR#mszJYEKsgWT^r@cvtMfNy_mQgzs2Zi zZvcbZC$hMnxI%oGx%wVw(0(25%g#8JMyCtW?kJ^U;3M-m@1eG3j&o3Y8rQ~0Z(l|8vNz;PG)^UBP{R7e_64lBSswUq+_#SL^@W*q)7 zou>Vu02OO!?If0>jY<#JLpJyxV8JVo{exCH1=Xfo$&JujB7QD`c2;}f2xa%AN=VXG z)Ob&{?q2JPn`K%oB>M?WQY2o4xL>Gtv~rSV7^q?!_T~BBWQ|UDu{Vokb}wgmsOMW) zf=;PjH9jI}KFAZd<|c)NwUo^6?oj#S-lz26mLlRh>bv+|^G$&O&-^)^e)9{dNjim0 zm%=w*k^136&pl?KUGYK`T@Uc+Vv53)W52j6n0!!Js2xX9tX|V+#TD(>8TI*O{@+Y# z3UEwpMSAWJ5xH7M3&y=?H(#_90h=DV%>!vZm(>l%6gPLYR0+( zn2#rP!<$aBi!ruNRZ4iRGrs#-hXqi%jRaEY0T2HRSUyx%7C;UdvFagXl62JDzxH;@<_`zjenTWL!@^OgnYwn+gO z@{wm`{hnWa)aDqwFtAbm+6({w&#}eu$F!2XnO34FuG9j>07%dr+>_y!l~S4iQ1ip$ zS#HU6B13+ZCt3J%Plm|N;KFml1l^x1J%h)e>{%|!KxSzYZ62ndLlPP$edDWC9A=}rI@kyUAPm*D*{BDZ-`w;e- z`kJs6YN*gnlOO$qjlUU=Jf-H0SRUXU60oac-Xb}ri?>Pj4W6v|d?60*E%Ag8H7WS+ zvQM^Xx#&_&1aSp;vqIsJKv&~VPP0aK*y{C#HdEs^nU4~c;ulP31D~`?eLl|*t~4wq zxFKZ_xVWnFrUZ}f_+Hwd&!_w%zPvvfkh$?s)4&^mNv}7Vq5=Y+=Nb;&o@gArke_-z zaVK*n#unRkp$h0 zy-fd$A7Aq(YGpL3V;`Cs3kt@7RSQqSU?QUW{fA#G4Jz!-u=?X@I-b>kK0f2;Mw6<1 z)L)|EQ9|!8Qkl}Rt3T|E%Q~!neu^)gj}%AD$9rN!f;ii)be%tmTesQ`_6aMJ>SA{` zUYFYNFqmRl8@azaLFNaYj{F^LRgZr2_wJ~KK@7v?&t3TK2INvZCV~0yy|~dnPxL~{ zxgbVBX);-PWGu_B)TWoe5=fFtHu=@OpptK2y=TAWsdCb1S9WI9pGan<|H<;b9MA_S z7DehQ$-g10U+PC3ojSy8pc5QOu$rIE_+fFILC>{#y)WY9P;c@6XQjy`Gj5AS07{19 zTkaT8-gF@autg&>yTCWm{MGP{?QPu$Ug>9pC`V|_mGjpvP<&87649oC5J8=H=100y zZqb;AY2++wuyD$tpp_u3c7N^=MI&j%kT$50`f*>5nt7Db>b|MQL&rN6v`yid*2+G` z4ns2KaJeI@Pd{&NU+??$Td@GH3!nZ~ZySP?8_c;VYBR{_A!)#(QDk|tVUwMuNQ%II zOKxM7d7Z^GduZFJX;|-kBSu3Rh^fBi|^*y5TV(~L*&qq*7K9#CQ*t@ZCCj#i%eW7gxz@DgCX|81VhX3;5U$4p)kc)<-cb$Adj>pi9LRYGCzmJ858?g*+ z!)mcl)GV7wm;4qmm?MH#cq5yZ$z@Iq9k7EcR*{sB)vV;%)%E-1ZwgH^B2*ARhC&Lb zdi`%r*!}^s?agT4ksrHlrWutwGk=J!eZ$lMv21_bO`)sST|3)UnOArJ?O-sdMYCr| zvo9E5Np&zQP2opSPv~iO7Eh_4@URI;zic6TfcING!99p3D_HS^7{!Nsl-hK3 zBsz1D`IkOOm{dG*!aGU;x5;=27^Ezx>!*3UfiT)b!5UlPMY6x^2=w6rl>HuWpC|pq zdj5St7`KfN&!WR_hnqRC+S#aObT-Q*dy#}I414kpsO~9q+We$LKAW@_kGPE>!T>}? zhew`QKTciHEC_q6PxgAp?&eJG-k$>oMj|EP@NvwX;v>jQyKr2}kcAwaD4uhxg4D9W zf3?!f+hDMz_Ga0&X|Q81kd)MxSsj#;=T4<-BNEQ(bGI8KWXnLVG8qkPd9he`uN=7p z*=bAZ!vzD1a`dDq-u4Gl7Vu}^aTmcS_d8aGryZGFs~YjSFPrvd&@^Ay^a@6+ja@v);>ZyU^64osL8vk+i#c!C?vb?F< z!B`q!c`U26^xwqJa6UgoJ1EnxFS@B!XqR02Us{*QakWt^Q*&C+Tem;?mBRrSEx(2} z;a4ymM}hN#LHz*+&R(|hMWkEnZHne~G+onRrw(_ZCQa|Ccq*HJPWy`Ve#vZo>NNOJ zhWlSRF&if2Q!@JJdO#5Z6<^aY!Q2o5(6G+rO3D zvT`+*f?*Gj?9D2{`PwG2W18XlPM)^C`~Xs#hfVMNcq`W)+_DNkD09TfL{P_7%QoOHhe z5Go`i`$i=REW;<9xB-iQ8SL@9qYuG10gst~W<{OV*A5Eo-Y12*cVgNWpYHwToXI7#Ky8tgfEI+Ubnl zOw_&o#pRTeY)f9r7{@=*M7g&t_e;w{>~TBR*pRu!^O&tIXVIBAibwVxhCzvJ?d>*} zRvEah{@ty)C+&gMAQkqUk_PmF6AG1SXCV}ZGPST*v8J8dl?ei{xs34h>M0*jb`ZK% zb34zV|sCKZ!Vkb&X0(`pH;nT)PeS3HFz`$}%)N6`Y}35FZ??4A%o<@(v#t zusdLZ@~Elgg?mipoPr6SzoKs85>TQs;i=N~dq7DK5$IY}1|-mLti%|p*h|?VapvlNH(iwCFIvKXHz2H0e(b){ln|D&=p0z^k(T^3EMlH|CqfSt!IhizyWT-skiN2%V)dk9n?iN!Gijt<6Q7r zZnIFh3?kEEOj0sK5`SoxUzAK<3$Wj1c6hXfQ6egvhLzE=%r%9ci3y{VmJ20tZXe}{ z!yj=ajWR(K!iX=C(if7o%1h7=!uhGB2n?PKs8ztXmE?PA0n**j0Q}0>LvkceP#__( z`Fb)D>gMgK*bjNG*kBe}E;IZ8xI3rrenc#*+-c!5vX1AYnpkuGT zAQ?Ug&QBhdh^~FW3q@Ogan@Zi2-T2o< zwB4Nx=eWUTj+RsrQP%ki$Ol3Vm2lKS8tGCXRrlcwAZu{*AEuO>w7!_tkU1%+v8Qux z92w6X_BoK=AoCd-KfbE)fn}a4eHF-L;ik%I&t%@f%Zti3UxL@4bR@c?>`YN#Diso9 zTEdTC5ut5uvzhbv{I#_C7#Z&FZxv5ah=Ea&;Mi*eQ35(DmD(T4%vFdlNo{An?EvJce!u7gY#DD};8+S;Bp|Fx zP}Ldq0a@M@2#i}pgXqwjrb}k09#@P(^KwUhEzgW@PV8(}o>}MTfFHTE9ZYe#vch77 z=Q=%jkZTO#E{k{j@9&G7&;U0NmPa8PqGl1}>ESZ-lySRA`2SUOE{;s^{~sR_mE%&< z$aT)CR_?cQ7juaalfzu1MObsc4MUV9m!sJ5b;&(4gwY(APzX(KTN%S~*;q68#aw>- zeg1{d`}6+1->=v6^?1CJ=lx9Ia~Bi6m#(9(CmHA2+kS~BPH)t?#_4kDwX)8gYN*!P z{GZpSxjxbaq4kG?@_AwBsGelFnmfCkL`+f|&wG(N)xPVCzw)VEng&)gCT;$R83vzA zCAG4v1Wki`8*}wu1ka8~F3o3<`GhK*!WCkY6Tvsd#Gd*TKg-|WRP0MmAxR2;mD~+Y zyLP?^F(N+%++94{!#3DkfP*4-bYc+V>aRfZe3d)8Fu0Z&iP*Eo!6di!8dzSHm)~l- z3rUrCtL4T(DWU7=Labkgh11#-jTtyHmaT(2}Xbi z&BADSi_dKo?+gUa6(`WF-LHqPut*d4=Zk~!p4u6MH(q;~PGCu9JJvuqEWl!tMftkb zTOA`6bn<{DYZiv~V7uSom7hlm!y7@Baw@1#q<=|iki8t(rSk@kKeLi5I-)vXjTg9z z*9bHf@`r-4VBQTZ%{8xt7`72$A>T3QB#~B8sI!qdn)g4O}6+j2Hn4__gKR zXKhyPtM`v$CWc(#dc#2UnN1CW$Ki`16-&5_j$FT6wyYb@?^|RJl_JUuf&9r=K9wyT zloREfe~6yD6D(LUo-`HKn6~7fnGj8y35MR3hmo|HfEO_-FZ+h^`R$%SFS*z-jv zN6f`GGIlgV;4S#{BZ~^rCqatXT70C%vQ7($#mEjopj(dZHB9~g5bH8fuGIO{F?FO# z?uGe1KCUQiP*)$djdCj)4O>^t6`HC0K>TmM3LmFCdcra`3b1chugP_4QlIvZn%p|t z{R;~_eQIIbf8YHkPCM0cs6r>lk@ttd8)rfB^msj6k?x1e$Zx1&?OSXbc^hpHzR6>5 zz5D{3BFJrxCH*&+Q%3iwiP+lXZvEoDONXfZ09*t1%QbTdsEIj%31d8IS?gSeJ=f<| z$iAYjYXecZWx7Qrk>viWQ^c0He2qom)z=I-a@|yJMK!Klj?4rKRYpF>wH4e8RjCMH zO*W5_dscCgTPp8hf^SX0Y~|# z?3~9zMOVD{oWT_lqp{WnPPEcgM~3A?-|tc#VHJN2Cbv|>SoSu*I~q=@rL4BfiD>`m z^W3<0=4_b22Mac}bL`|eXs)wVkv!*VZ}7XdQa43;w_Lk=YWsZ0l=??in!kAjiaODCb8q9$(+T(Yp$(CgZ;_kZBrBofC93?`Qaxy`qe-@Ea}i!|hg6y?XVGJJ(m zYY9garjRTV(4SuMuri08$baprvXw}1(F$QlEN%v2TLVG3LU>#r*Ev5Z!OqRqn?%p1 zk*tALK&{tp6(P~KDf8`*O=^=J__$SeBi3J0m~H8~z$lj4V~5ld$|ivc0T~G9j#rVk znEOxg$IM}Vl+xJcj4a5bi#pTpEPbwcWMz7E;#WHAL6mR%3Jmtj=!tIDQ=#A3AXO!I zH)G`m_5+p(@R|I}d$kt7eu-!?>0=;@ZdPwsWxu7V|!%Z>ZZX~^2vIF$w(7c?2f zeW8;LGkU6Z@2ZE(ilm_H@l7K=G@Zh+>aVA)aEt9%#jGmXJ^clSxjt#UUfjiyJh(57 zbB?Vih&;EBUUJU%Nw3efs07?gq|LM3#$l`)JQ4d>9pR-{z^tE#zymh?rMJx&;2X+@ zT~?2ki<@yMK{f(_;W_KTmvj@B-MnWI%eFs$s|1~a$|`|#6=Zmhx$Xc$rDNwVGJVmi zASYd{2;Gge@E7BP0xi1?|BhF}b>J;-*XzRAi$@2c#Vd5V#st$Yxi5aX)(EqfD!Mz< z&}G)V&;b;;w1t{G$x1kBqh#kPu!ZF-vnIrYV%N|H>m|sI2#Ou_kXvlE1T75u*na`$ zh8`Vv2;D{~fdE!2_m4&&z-ieqx1Qrh;O7Wyuz|B&Q25Y!XxGAgo>;cKc2OzoA~qqD-181gf8O^E2Snk>kmzlqo{x#}@z!^3T;*t6Ow zU}Ar}ae{6Gr8uCdoU^%Eli^_9U>T#8#~KLHRo&+S`zgEh!EcoZG3>5cya5^5mS%lm z?Q_U9#i&ZZGzGrLMIO-EQ1k5G!XdT(xWIvObVDu?e|CIXD}<5tzx#|uErH7W^|Qc; ziu0ZN*7>rz(VxID6Tjplw)15%2fj|WZoiIKKAO1|^6zCF{!00zSD;ctye_f^G|25P zvi4DDrA2$my0zvbp4TR&(C=$oQG(FX9M4FFHA;H zGKbsvLyz*C)ZITjb{&*6{#vtj`+LP2omhY>04y0i=dPtEasl~N6M%_fQFURMoL7b^ z0D%K2hyf(c%0*Z^=a0^h1dY;2QlhBx2N>P9_g^i2Md*7ZmMTpQXb_T z#)7=feTeCfGc?wdaOQrc@Eztg0KHC1h>~q@GgyhhtC<)|9q__l-m$b$Sxl0-uOQ+&{XDsRuBPlO;vZ2_X5rT;K;Z}?t zzS_xiR8zs-_d#qBGMdJBYk6p-yZ(j(tUObLq17I2>n4!?-a$I-pio6?Io^onWy)oUm%(GEO$0RE;`t`TMzG zdQFS+r3Ud&UMrT+=RSNavCU--8VpCGu8mt>Hzc>p#;WWyCRY7l65kzJ5#PkaI#Wr-pk( z;c^|TGKGaeac9@ZnlAQtYKw;0sk6hz9&vY-BLjPD2Bq~f zPA-w7n8jSsEjB#A;l&Mncz{Evf#t2tMp6s$*^ij3=79g|OwA#av2IDwLDk`39XR|g zxXWk1i5NLvs&0^yJccB}GWo6bg^IZT0_14rR$r|fkVEoGi&X9N)6A1wu7wtgmPS}4 z&Us?M?G%S+Jh>VbE=%pzZIs*3*oGq6K3iCDi&0>#?5UNnV*in=eH!ofh&>%2x>gim zXvrR+<%%1A(}}r}xJJ>Eg=RZRy-gi#tsJ}j+L~aeaJ>29dZoZ{d$l72tS4&#IX>J) zjoO;P5GDb^syKxW@IkqB4`F_Wb9B92ADJ}9@oaOnxx; zp3FvXEXe=@%$wVI6RqdSi;<5&LwIvq#~5ruyiN^Etk`W}bT;qw2!4bZr-+uCYFWq; zJ_ET!8MAC76Mx)AbrI2*-c6(?K?RLhq}tuh?RH5VAXl3dd$M?xW<`huNGTyV&bwc~ zk6`|x3zxgdeDP@%7*X5-dWW1(Za?J$+a>0ZGIWG~NB|2|>f^eK|h9 zploUgcnVNWcSI%=n$@iQWkkt_>h~^vWPNdiw+tcU+*#D00%nR>?(dys_%f9(d`}b% z%(Y=9C*#NR)qle~FFUS1Ao2lNB^<^?_?)nBtM%Wq#9M$GGr+=P7m~6U4pXt&DJaxN zre{&q&0qAA=n-=n2i4Bn%kGu}*@iT)BAq=e0zT675amh=Pn}OVj3K{kAsPJ8&yXLB z#hi3kYErWQw5-48?>jSNh#9F{TU{erCGr_sZHp!CoXE*{p3yYK)hlai#4Y&xPMS^L z6jl2^7&eOc6}n{Q17Yp;0wmIPx$u>mg8GNbAn)MytOosmz_@R(_N$H2(h}B>WpudC zq`?C5WXV3^|8-zXpJDQ4Kv5qAYm>hV%WP{!Xx=0%dtuk(cFyBZy}x7sN~|9KT&E{=u(6A_H%eDe(Pk98 zk;UVX8GxkbUa8K@0qbt&($Kryn07Ed^wPO||3;T7lR0B~5qElEh!HOdlaC{JoWwpf z|Ei1uIiqz|!J@Akh2Xy^4v<`PEYOKxEOT167YU-oKB)S77%UHD-Giux`Qa=rvD+QA z(0mYx1cRq4O}i?O7r5{+Q>0d1b zl6pS{sVQOJLNcn{*ykXN{|k{GB{!e)^6fbN^|`Up=v-HW(KyOF7IAVwdq5@i@e-kb zhRdl8@3%bRgcMJ-*VA-M%f-12ldXfjP(u+hnZ@=IJgMACvtQgmEYbneC;}&apX-)B zIaWc&n?LaYxwr>7)DfeN^bfqM4 zrwTaVJ3J4j|6bYF&Ia zs+V_qDI7ur1kW<|wG`$Jp2PlUrqmg0sY-^XZ4OT93rKt-I1+U7Ut1;>RQ3GwP)!S#H zfnGA|zqglS$@IS1dV3p#s|opL!FkgBETe85+2#oKboD~b62+l4o#8(b?~7iVyzs>AP~>jBHF_|bW%;#q+O;6m zpV!JZh2Mmal^P*Uh@28n6%A#^)(9&^U&kr@qn>;}i3=PVD!5!iYr)DUzeg`kv)zed zbxMRuZy^v&vtJF&*V4)k{1ihgD+ljKj0V)HV+8BesoDI8oVGURy9|DSXpfY3KZZD5 z2*b{A7+lqyblJ{}fXWMCp1U!)q1es+!|*h>)vpr{KY-i83mr_PDmrtl^lRk@AzxXE zt{{G;Tb5oKbiX>KKA5I}YAtjNtE>J>TM;W|*u}EVk$HXfJok!eiK{Kw#7<+EzK*p~ zX7!uQg4hw(MqlVMXw*?=ckyYqL=tCbtA*yPd|vDy{mRCbgYDt{$T@(*t%uqD8s==I z2Mb}OtSJ`ZEAo-HZUEC9?2UPJKZM8tx`FvV7s2yXXxnX+qfouoL<$V@S?Ik+=5*`$ z+hwuVwd&qmvM=gFn-G`8Z8<2*WKN{o!qu@BC8 z3vV)Fmipa@Vd=OC$@9stsNGc3{46Kl-F}mH54C-aEdFNG3$efLed9I<} z*g`Uwa^oA!BIVUry^=cTQK3aeSVCl~nt+-H3fUg7x&4Ze`lEe=Z`tuDds1<~gAFhA zlG}0x189!c)@RZ^R#r;`{sfs)+=4)EOfEDjh|S5la@f!v*F-v9;r$IuS<4nmJWKAc z%rPX3kO`4B9$9gRtNYv+V*=8bVzkprulFn2fGU*bzW&?$-}i(BRbu{9;fHzjtpL`D z$@*@q@qtF3rO+cB>IrXmT%1Lt?NU>PYS8oYTJu2JrW0bFAT+2ZWf{TuM7Z}U)%$;+-Z=ibO z^?!xE<=uN6^o9GD>(`K~7rz&;Km=KCKSPy4V-CULMt|9R0TPaWPu_3qoL%Q=*tRiE z8VQl-KKfj-ydJ2u`rCRu_lG@uUm3ZFs{=oPqf#*4-APXC5iC{wp^ z5fzo4Oc@*SG^&(`-)a_E~afbpqJD7fTkrYJj>P2S^9mW zD=u(jXCZtnEfb?={Ghuf$}fPkH}Nt8q$f#*+}>=ApDM) z7*;e~=+GZy^5~BgAdEbp{7&keoC?%ihSY@{5I<6!Xkq#&ql&A>Q4PGL4g-%ll5NVF z)ao2-R>u85Ty8+EGJHmT@~^;gTrZ80{g{Fz;xkaw;%twu6iHMJ)-1Cd0?Mc)#W)!S z%%;t(Pw7T0U0mt|R)xDd@-|woQwg2UW%mLuWCyV%Q{-Z!e|^CEGF^|id-gbnBL{v40FgzsO1RRaSahkB;y^|Fs{ z*+K)GWG|-Yzy3RW#}BnhRhaTj5|IF8OTFi0*IjMwd+O>aDuWAwhgcOit`wB17A0IW zG##w028Ob@rnE_vyja-<%(Tm+yU^M?N^v>6ddZdZOQuKdy0KwNzy&VjEe7z9dLL}U z#r5N^k!3gJWOo<$3YIwiLo6`%uih7&sm#q`doogW>_Srh!(gwXFz(^QF)wrGbRsYr zkhK})gh6Ql@Fa#$h+uyn$DvAGHEfGmlR1Cn5SumzyrCE9wyKo*T`H^?iZr}+c*Nj{ z&u;rWX6qV`+n7L#_|M#5@}9f>RvSB^brS>rUHD2d<}<@_Lw!DGiGK8YTy3SP!nmuu zs}PGFCQPQCYz7&ZVDrKROzl$z6D#!grr9$cZ0OnAs^(Ow(2o_-`dgmUsN#y@Vv5F> z(v(jtRM#nhUij%mZd}c7_`l@X`D-k<`1V4UE|yf@SDKa>MA?kX$EiOP6!fqNc5#c< zQyn?@EuUT-ZnfckXQE*Eb(QXE$*Kq=YQA%km>8b(`e8wGH;y7s*BEd|Tyh>8;`PFP80i?_bIn9$-4OEMj+#jA4aWVnat{%fy*r#u8)W~>FGt)@Iw49(}v5sc!EL1tgX zs*=P=0S7(WU&haAT_@~XzVc`2Rnt2;q5A!zh(BPQR^(`P{=j!0PWIg1Q7i3*Go6e* km$w<`8Au_yoqKj70ymGX?+Vpt0JzT`b2~`AsaMkf0m&O+<^TWy literal 167851 zcmXtXW_r_aPsa>i;>|H?+t2Jt`sN$=nMeWhrd#k-;RPDy7M$yKsTD5{uBM3E8 zHG)vJ_o{z>FaEERSGjUs&vWi`&V7GQ($gn8ba&YA+_-UrPES|UFi@EnBR_W1U=h~#fhSA zZNBH(Q_*0Wf_`_@T6_tf-Ad}Yf%Tq6_!dO;jxpmwI&A!rN879m2Y`5L182=aO7veT z!@Lk(R+^6MCEdqC~*n<`g>!!p<0LIXoj1QX; zJz3FJ8{TfW?f-1xa|GaL#2r;B+Gv4BYRd#u**)&xBd2{MMGPm{Y^%5rEK$U_&Z51QP;+<__c$JF@FB>tFd9HmtFFK8~~0vW7B7B>?y?X(J&R_&cA)- z>K20nR<{$urp?8WEKEW)LCUekYi65%W~m6p4Nkb5ZTI(4#KBhRT$Sc}RG??g8G+%& zc5%SvQDo5Vp5;w~OyudA*x;XJ16eO6OI=`MPa=|Aq>$eJFKk4EZ-HFML3Mv^L>4{f z+X@tUp-|-eM{nYgymVsNDvt0VTO3fBERrgMWcqSD*`V7q^2#6}f!vmH?3iCmW_NY( zjpyrFK{h;mERd~n?Leb{;qsUcMaY^C{Vm}%1MfN}Q(5qoic4!0&vrB}7i|zId-dwa zZ-kTYlGCi!+++x6ezz5NJj$XCeQd=xDop4X|^aIKwf_;ig`k=fB)pMLwQx zEJa}}ijY(7e@*uwHk*l6CBeco2AxYf1ATD%Th%$i12t>TDscMH2(&9yAOI_M~k}m@Q{fI zhXt*jztZql1RIe-rFhHB*f{J|mmG_I^=0;331J?C4MpCcgHMj*BlPq8m?AIdJ9qzG zg+}~4y{8fKpP^2HS!`*-Ynu26&R;F0(+VPDTc>oH{UUAMq}Oaycg`o>!OlSJYMZ1wT)_4GSkP{^JVdD`>?sW;Kk-|)VzpdExNB;`<^+o4m zO~e(PPuV7)Uw_U*2>J$mtCYAj%Zhq^FmmDP(wbA}Nu|tS|HsQcu2dHJv(aBmwm|9q z%e)Z{1cDn3V!-buqBGD#GDBmS2HLrCn_~GQ2}Lwmx>317z=2)oN4-#<7BD$FfWWUH0ip(4g4_FD z?_>c=KeH+3Cp*4r)=B)L9en_d@czc%@7Cp zg-bHYT{fLhLu4P_EOjz_xdImK@OM>HUD`6s{;U_?6cj{knwZPZe(cU-g>U+fig|c? zoSsBpDM#IxPEm%p3FjQJefuU4&AYtZxH)9<7cTs}^E>aZfV z9?`>1EOO$$xWyaW>(St{06je?z_mIf=@i9c(?+@V0#;0YUVLUf3LG~$^YxJM_%|I8 zmn8zvA8~5V=`v>>(i-+rvHxoQ0Tb2a0UNek26v4qOJZ2?{%oxUv(o)XAl3t_FC1Ax z-2^le@(kHR`sv|OToq19**$5Q zQSer9$lBU@0m|J~IEEld?7SM{KJAnDthFlSNoJd4iq*tQu3grr$X6 z7@hqp!OoTc9JQw>f%H0;U;*Wq>v&cJst|Xd>%$(!k!}-~t=^r;AfCjq+c&OM;9KwIz;XReg6`Af$Fha1MOB|`zrS&ncKO4O&!Xrsz(c46*^b^g zhWgD99B;&KiTxM-CX~9tb$9ZpXDS zo@bY>BC2(3;2>JM4V*$=Ur%YeceE6>xp`0fB@SK?03JwAJ`0PdjHiaM+vff1EK0Pz zZO)$8-@E6xJaolRm>GYjEHD3Bn=S2lU7Cv z-9sA#5a{I}e4yJiDb>rhYMj`hdRiT0M+63~ce#L??zfqq}0lkq@J zXQ+{tqkwT@ugzz%um$@`n>Mbt3eIVB16E_rd{#hCc`@`!u+9`cEwd&<2k{joZ@|ck zw~x1_?zipjDt8Zslt}HxWHh=dd{hiH7X#sX{VfsS9(9BVCO8)4sb}QMQbpa5Z-zT4 z9#DrTL;#uMo!B3-HsrzX+Hwea12Tr~kfr6-K66ONF`kcF=8oX6r2k@@w_>LC{GH{< z{TY2eXiV#9K8DwS-si`IA64JT8qvGT+g8hY)S_c2el})tFh{Nuh6S;eL zNG3Ry|Lo&OkLTs}3J7{Pl(~YbHjB33hqVnsq6s}kluov0P*a>O6!Kkd;ads@Xm;f)V4yFOUu{Vb=XK!YNZiy9cGF=!V&f(yWonDtDB zBnh&()A&!@~LK#RL>I<{?h9Sx$#2&-r6 z0Un}_g9DoLsqIC+5$8Twkly+QqBUQnZQpFdu1@)H9p`OPs2c{k^Sl+=|CoQwEr+_= zG1gw}#&UjoDcw1;o00VcZ%~k;Nu#pfy0k2tiRho!ZeNzBFD`|5unl|dnLMcq)_3xt z`|Tfp7HGdnom(u#-#dUsSL!s{+F9Ing(*xp0U;OjT$q4Fer^L;qm>cNpGC{y`SdX1 z4N5|9D2Gs4AwroIWb-}o)4z6yPLFgKo6Oi)Z}s_~ej#?fWo#utDDC{gykU=Yeciiq zm*?;b8Fs^*XAa7T7Qd`KKW&mJ(}uN1A}e2j980s~PK*B?b7D-B?)R=ZYE99G&31To z8hD2@h(de1RwLRf9^3&r9-wobS!Ie>?c#q@zC;8-j(Tx>T_Z>0A=#H38=1jHPvyuj z8rNJSg=oo;b%cO?aFaNW>iO&KZIo1=NPUsWuENd^Y}ombY7SNU`IVb|Z__=vI9pp1 zNYdu7R9r7uoRZFLet!w4YgOA&=V-iurKw@<&2DN;H9JfoM_d)-^*{z|YmBPFou{(p<)lx-EafzwNVRbJ%9 zzT@C01r@~m^<_&_ih-vQk8uz%n?=(Q?tsQ!b?@jO6P9Ky&%rT@_;9AlA*VM8WsvhO z?CLTJw(Nbf#<9)abonROlL^_4F?#7`c^hjQ1Sg}@*Pl?rKx|cBlGF%7nR~!AeU!M& zb_L!eBp97`B)As%xyNYRJ(Bw&r(h|e>ncOb--bp6F@2zYTQN^9yem>2Kjyoao#aD) zTp`oY6?|3AneLY-vN{o<>~7VNCma?WRQ4*g4D66=rW7911%|X4^eebX1jji7K=)}{ zZTYB`s+2SyN_1>8hTh?&J5;cvR>RAIo{4EgpR_4^{%n{AZWJxG-hAu2w|m)hWH<8Z z_IB};;aqA*v+=;110Hc2cYs^E&cC(komzLTXADJEnYKk1!V;;R4Fdg>vf&?QIb|ZQ zBKi)l_@9er`{WD7)VwUN9HKWbxcqY^Tj%-KYP1<;=C&H=zacE|RKpV?>#*WFWz zD}|-oa+ySvY*~L8|G$HmZZ30CSffXOBFeU{W73e^!C`Yaf6nPbK{#fVI@!k%-8_6-K}9gD zUQa5|lMelCCcTDVgGARch${A4tHIbLu3LJGd|wdluV4Z){oX4Xxhz|n_$EKIZuxKK zz<^MwW9CP?CyQD4=}6;-VZp&ib&KRig}wQ}owMnMYh7UfFZXBvX~DNnn-O+xkGz$( zTRJ-IfRt+uv0eUk?pnA2K#qX;i$+@?r3!(;)K>Q~!ed4XmJK!?zzn=EqLY6=e61m4 zBqS~44hB-EX=D~?k(2h59Li~Bl@WXM;vzIwy3VS&{(RHS}cw6PJ`i%Sw zDs_Fd7L}IGiu}0VnuO$_Qc6c{e%efqnA8=l93q>3M-qIs2Zg@Iwbl|r4N1-T;kvja zFfCH8!5X`#WOz5og31l=L{U|5N73rNTv3zWYdhei7*kon0Wr~i0@G$Z&HEm;_53hA z!7+a(C(YL4%^H#6B{d&|C~u?toZ7+JQryY3LByF5ZxXPv^mK#39KmuoIBS)!_p7$t zG)L@H=={Lg)MsZY(qt%*lman?isy}4cVEbA}saS zXWl4#{(pO_|KbCr&svqojVLcPw5MJFR1rKHdcP@`vkz1uK!&gp`})sa6VX?D>c$S2 zJJ*|$+8N`A%*3Jm6HnIIj*%(8Y+2qsB84oj4K_ zM|{WxrdQVz3K%w9&X)86&dOQL+NvAo?EnEt#PKD(ehFtHcLP$T?b%V<^?(z zJf-7{N&lpJ_eMFF0!rIEKzw%*1j-Npus+8={fw61MzoRl=|s<0Xltv(B$!<&(46L3 zL*fcH_W|wO2Q|$wj6ze)R*;B6DP5W%2xs15kGp^A#XO{)Lw+EDYj$ChV-Wv0bxQl)tR?f$#>oe_KRQamxsrD5rKEuIjN0J#?dB#5NAy5!TQ zNfo%vo62&U;q33Ig(w<7qpMym8VIa=SN0`T=!;a`qMwpo2^B`atX?vO%5~U}|GZ^5jXUJ*k!C_J)`oU_Tg^puL2gkU94RFyS8?i+-PU2J z)kxW#vvFxkAgYR)zAYWpQ@^dO23v`(OZ(q&u<8e@jT@@_1dd(#wo`L<9HRXfR-Q{U z@3433({tnoub^3VSPtSco63-7HeuI&ZS%e80|l@ks^;Xy&!O0ANA>9(B}<`)P~@OZ z^C?6$yV$sxod_Iv$`;KX9V(0aieAsEL;FpJ^xj<1t51u5Az9~MZhC3T` z$$B&aZ8X)vi8~LnrSszGJA-`F?neI&vx($N(n!Gj>$(^el$HE_m_bHUE8e}Ab>OM0 z%p89+iFlXd=1Fl!87Qt)C;2aQdPUQ?_g@eXTnSi8P0pQ4&0DgwXtLIfGJ;J}`Pw0R zix?hF_{RIWH6?Inio!-UlwK}{%H`ssyrWT(bhPgp8RL^o?tYOqG`1-Kv$Ga+TkGOz zP#=@XxfhErk2V*}q_c4H69E#csMT-C>@(KZC&FL><>d zf47GljT;RhZCWhr^02$gg=4v(+}Ha}!paP8KdHG@BbQ%xMD} z^c#1WpL@zqupgm!ujnoX({rO4ljYDF!vvFLYUo|@N#bf>I}Sk7S8b$z>f3$?X;#+CE&Y5yDdwlM|} zt1lGYbpnJk|7g91a{%g~YFJ|thSN{}GARC_YXSN|wJouIjLA*_k+yiH>KRX(WdZG! zo7!(NL}%c%V}a0q6|#zhH7Z70xcupg)`)^D6j!$W&`;i0I~$Q$`?_m37rvG3>N#} z(SQ$=%*&Zys5QV5QqCFJG5HV_iC^+;+lV=2_~`j z_gHe+S<37!a~w@_y*dN=6~*=O1;a1PFKqo$l5H}3K6-ycLHvcQQ$>R;mwQIs#!WGD zpn8L-9mT`=u6k(1>80*nEz+y^bMilQEb#&oJo0S^Rr}7N9vZ?NJ?3mvj$3?@rFYWa zf@nAtG+xZO&xyrE1@5f*O+8MDViY3vu?yBx;d-CmtmLMR)2oWxWLSQLVA$z?{w6*! z>~de%DmMu6SW%*az&0J&9I3e5_^8$r`|{>H^@hB-ScIL3$?soowIB6D^qD4*+@v8t z3G9`bQ?e~Ap_T4RON$;Tm+g5*5tT0J{)4sS`n2atg@A6d4OFn@Q0~0y;~WZpY;BgO zppYZ5&w^0hCk^iMAmuc9c(2Esr&+$wCyc!GWw;Q&LK+PgS{8YyKkO%V&j`#{D_)@2 z$F4fhC!x=AfdxdX?Z>$Om5pGGkH-hYx1j3$#_n>uWT#%R z?Yd7+13;tj??n6#H$!`S`|iB_v|moS3#9V`eH&Rv>fHf=4SzINn{{Wp zDgTTJ_~pL&j#^%Ma7?8V;>7vfyQ_rgBx9c+M1e}Pjn2plzAH@=7N#SW5+;|D0b8%j z6K7Pfebipt(y~^8H3A=9_I>lD%I*mi_*N)etrd+3nL{DBWl@`@<#y{2SqFAzX|h^p2S_Y0ANwgk~& zW8+`={(WiwDESCPDb!^2$Vo48r^R9dx%mQ2TNO~kDSHH7*5$z6u%!l5sOM3k9e}*z z>`!2NcY`7ReH%f`Z9BiczakDi2nQa_d-H7^y<-`@65cLS#b>>xXi@y$_BJ~%yX4;6 zpStF?s>M|3JcAJ4B>s5RN}H!=%N%H+nq?vVsfo{5{X8r`t?k}!^Xi88Mb#wmKE8?i z>ZZoG&oy%YS?K{Nm6Vlz6c8d+?5b2jiooUtq?-}jJfu$by=y@{H95`)Ae_--*EVnB zB)ahXi?@GFRDb531v86@GFQqukL9ojb)eg{H0XlIROhaC0O5(xHlaTNbbSXBA2#$o zoR}JBK92gh;q5Q>2SQr-_U>(*4G@lFiLEsySS6u-_vNwf31ycNCq+Wg4B-|No_K#* zq$|L()z*&boZ?40l)>fE+GeS()JbM*>COx5(R-r`UJcKmu5hZYFt=pYOR(vr5fn%= z9}&3X)X*;to$!s?Y?%E{RP)ExyKmqd@hX2sq|v_4>+H%Mu_@A>#fO`E!)m zrkUYzQma{KpVU$_Tb(pC$QBS8TK0P~SVbv#&m?a^HFTm3wBfG<#LyCYuXhHplkw;8Oy zsQW_+?Gu*mIOfMZu{VY+LB05S5X;vFe)Sf)O+_B%nh&u;EA8d?Nw8Cer+0{nG-Qj= z8kJW0NPx|h+yBZ zUC)I4jd|SCTeoVVY72pW{`g$gE%q4Xveu^l=AEj+PWc)I3) zn}Mp||GHjeeg@Tn^kCDZQ3QNkbCfRX(iUYa4SuHseAwLNfS>?`lt@UEVQwhD;dMDr zLRTU;@4+3JAH1EZ-Q_P-+Bv)8R;{xT&btFOT{^4zq6IiRg<~ObKzuju;3ob!^Mg>b z)o8{2xt~0UzTvEC0Tn8;C%M@to}Sbn0BM709F1|FjUI>NBU=8$7@;rPTnHoGX~$3n z>6gQ7n4}8~XM*n_?tqE+hG`b@USVIV0Gx_Eoe+^=3!8M0$*56GXXGhgELx?->8b+4 z&iAALqc@XXypYIYjO{>gJy2`p)LSNm-VCqVL%$jLX8fZkAiNbt4AO0BdA_8pz#aHG z*SBBD@vG(HgCs!;avSMP0jc;}1%zbSbrCOJ%E(lFu0c03H&sg{FF_@Tg%-JZ^^2d% zGP(4&DM763sS9mEQ=IGau~XcRC{)89Kxt+c<7iJt$_duC=$1P#MmXVL@{mcnXf|j{ z>qbz}Z}017qHW+(?l&pV9gp>dOvq5CNAEO|9Ao-pWbKZ*K0G&dONw9;FoP;{=ZH6M z2p_Z<4$sLn1z%vS4rOj<<~3GzTtBb<*$TQRNY$UL4zrzU9080bsen#^L^?)(AtS=gr;Z` zQL+3;to0F%J6T{E=a&Z`R41GONxfD@`i}>ao z^t>6AMYkWtug9mZDnQFAk*gfF^VZ4-Y@?X&Wtng@C6|!t8hhjefBiy4aHd$gJUjJm zH*V;r&MY8)amhQS7F5+LL={%v7#uQ}CBQo&4LHwCs8DuS<$Xtou1=GQQ(K(tjlyh% z@nZE`QGI5t-izb1_Yg#%hgNy1=77(f5N;LK#aq1U&!J`ZnKKGL4(rF3Pn=OTp1T_9 zHAXK`C{G38s6vyG*|Xs+wqn)JT8rU*yC>G|aV&=1RUVqn~Pp`j5ReSFNd3~9tUQ#2JmYh~Y23p{; zJ|3@~o<+(NNG^-v3w{)z){9QE`&y6clvge5WqS65gOoBs#Nlx2_`&M~?7{)zDnIgK zFKUp{@}*Vg`zOutG*@;P+T^O9oajoi*<5A#elw7}dEU|%FY!TY@ANctHEi$`9UMcG zG8HY2WkPD1Gw9-bPn2kJC4YsUz>HvlA_jbhF{oFy6>mI&Qt!X>!UDNB`(w%w}(O{qwT@`uyp$d-9u# zQPp1VTEH_}D}%*bEB;A4h1o<-RHM{6t*DNYs#9;5uQHf2Y$1XAJi-oe`*2bUDx?|_ z<}k_W>49Q9r(gF5#zigqwc0$-^0j`ub`RS|9(jEdi7Ae_WOK!n%nn9Ycyz#Zh$VG?(dm5yTt z2?@+i+};v*{;kzS#2~a=k^ESbOOfT(pyeR~f8i0kC~f05pcP&wA_Y|gVyGINxz0gZ z8J9l)uDMIn?1$#3qBk9fL0+&?JEy30ahoDY+vgR+bd7>XmjhMoY6*sV{wp}uB1aRv z*jken{ylj&EMfjkUD@Sa&rUZkI~rLt`|?5kXbB+1W16Osam7pn=jRu00Gvsz?5?wd zU(l$n*iv!uLPuTuW7Y6YMey6%o4D68FKaA;n@18uNIpF~`U=wa%>#Xl_wU)ZEJ>xt zq_~83GjL-?#=*QUb2+WU0|#*GKJ-CU#8~Q_!}t9+QLTligp-#{rH#SAw=9O8CpYpH z?(DYTz%^2-7axHZJO2$aT+Y9|E*J=?<-9%l`rAyC?2o$Oxng6u!EB=f9KB~UW+xM9 zxGg6&1XGvkPK*;LHHc)7b%iN5JSoyq{7`vk0#d;(6sB6jExXVjI^@IkHkPZyo#~8A z3n6XDPr@qv6l(JX!!CEJO&=iA72)-#Yawy3#rA&)P$`r0@sIbB-epyH{*>|UbFvPK zz1*%&dfA>&Xpt-K2j?Xw~rGO2gXd8Cf=LPL8&q;Y21GkFIosD&1a?646Q9X-%xu3|5&Enc?z@IBDbd zzDgu+amiCv7UW!D$mOSBOXRZ9sv)L=I#RfUNc}sO($p&`cx_~aR3S1AB0cM`U%6)y zl}{w^%caB;iT8_mv^kQuS~NK*qbh=CoIy%7Bf5Y%UFLm0XO+Tnxue%+4gfa>ow=&V zg;}a$bM?w=fJF0q#t_TooP!pd0_`efx3?u=>1>Y_C5!%`M1#jaXp?9Z8XR~Q;iHb# z(vSK82^>l^$l-;i%rJ}*PW1)ZDRT(Yyz9cJyMBDToK1LfwY=I#$Q8%5kHGVduibmf zg&@hwD!4*Ya76IR$X2}BUGTB2>g8ped^MFg%ZK=m8Y=$uGPW}`Mmzx|3@5j43f&I8 zZ@o{6sms@rfQ|3&L|&@@e6!k|czwEg?}rIwq{~M}CpojqL$R2Fgl1W2a>3<-eIMBa zIXYCfH-wpeV^@{>r77hOsD^^KQ19N1NZWFCoEs?9r7{;CB`uDFwI`!>FrhsySw!8uAt%mVRR$KK_8I3YtrrKYlzSVNJsxRI{QDz7=CS# zV}s>wOH*SVmNJb);_Jt@Z1KPsB$j&Y@(&-33p~o7F81z8K0`E?iIZ%B;$oN+2j1_eq;gwer8&&3kM@@ z9ApbRM(mX=xn)7`&bBn)R)CzPN_Y4SYdH(S2q`E#)>z>OQi7xP*})Pq)D2s~MN3~1 zJzxg1W5D_=yfk6Vl03oY#jg}SYYb1{31#sgQQ2WbQtLcdQc{*lc{%&fAcw!NI%}M; zxhYS2(9ohycG{TPux=ynZ^Jnp^av&>BJ9a{RCdj*E}fqOo>t;a{5fi&5fr&AO=Uh|iizj{=zXl%xB z%mQYkWY@)IIkDuKeCKO3@ot@Tp=)wCmFG|L+*=EQ3)77;fA~p-EC2KWh{dq58sdFA zSg4NXC}^*Gc}jF?e$4TBK7V%bMkJMqJ-W-bAY>wB#XGS4k8E)0%w*I?kA_Ll->ZeW-pr#7H|58+G zo8<@;4FbJQ;y|p{CLAK3*pq=0?_voHo>@}h(lV}J*qP-Hpfd1Ldao-fXn4>n9#=VT zit%YF+0i-1q}FriORfzQncyEk)hFj(#ihK~A{-N22Vo$fIwpqUm<0IjU}49Hd2122o-oBA6RYLBNN z*@i<00a%}wvP~U?wY8clk4+Kfj}B)hMa_=ENx25c=MP9bCr~(`jal9N&?<#E3mkP0 z@uL;2Y)HKs)8$)Illenn#GsWa87VCKLdDIf7hzB==f-+-dh=Gt?UR#l3OUOmU%MKH zXA2(QanrEfmeSL@AQ35LU~%m zN+5W5!_uohGpc9iDh4umjzRQr{yg_;^hn_{&n?48d$#1&oSp=!*nYTS@!C-kPTCa!nrQ6_0WFk72Ai+hpsBM%JAk_k8}AuFV^6d z4>HXWX@r7C{~tSC9*pjW3r8*m%R#Nfh~RPDVf0qr+JS8xqCW4i53PdrGHHT{}&nTBMMx)WDiSm<(&rIR~H>!Ieqe$tu%+ zpoLh~?1*7h?$~^~B51b`1KGzSmuBgM3rb-UCUi3|-`fW(k0gA0omGD810-=c)ART5 zy~ESYrfS!av3G+ZOeLBLJ0UMM!2C!#+x&+ZLZ)v{Y5q-;%}&yuM?&14N)7vde~`oq z%#~Zfguny@7B5E_tG5_tPZiQ;jBer{s896NYkjPj*1^F@w%>}} zalU7%M}v`mnl*cOD`dSDE+L4|6>lQ=DiVKnhUfXxx$5WK|7_k+IbfDGCPQUKWAy+k zYX`_``fL#-VP?MX^%ZfHX#6yQzimGM$R|pL?lUWIFzkaK$(R(-GANktMfA;2Wg(%N z>~3=A|M?p%7?EOdH;k5Pvi)3%p4!6w=B6lD*uj5~T*DNRjR1n3h2N196l!YKV%ttcg5%Ga-aB=UuK=cpAvB1@l(2sjvU=nr$Sf(L`iZN*Fm+c@98>%sbV@tGxSGA^@n=L{L8v{ z_lwRvb8{W;HN)drc;e|xsr&WpTT)?~H*?%~!)B!D`H`zn1EQ@=yuVxSo}R{SiLUPa zJB240CgxEVpd3FLZiU=X(kU&jb8ET@^-88SiY)I z)|<7tleAM{@oHJFv8BV>r=7*}PK@m**TS5g?PtHfpd z$e|p)8uH~uJ}?4WmxCVSUXL|0Uy10Zu;a#z@3sak`smfUCD^hXV75lK7=>f9wKGp9hBiaRg0Ghq2UZT&$K=ftHCac;JS6>w8Y7!=K5#XX<^NYIRryGvZrAWf zeJRQyz7!p3<>$Ctqk0uTsm+CYMtX=GaC=+4PzOttv!GiTpIgKZ%$4_^k&(fJiYU?fT~q?${+hDVO9l5O!O`yJ^Tq zVQEC2gCE|ZJbGdgk>8dJFT^^6ePj5A!wf10Mgc!~ubN9ug7O%h~}+oUY+zaApQwR>41qPUb{r3nm$Se^OO9xpugLYw(ffYu}@WZ z7JNkt5e!BbitiNZ4&2?>+dW>o&XM6JEi_f&ADJY{T2YRG+vg}Xs-WQCzLAkeIfB0y zP}ItW@(kZZ9G}W6=L!f9IpYrqIGNyan@1`+Ds@TDZwz5hv;}sdP&UY>sx()MNUuK- zDoCnkQjirC$Nk3wrG^h&*Oz`0&AkwL)6wKBxlzI$(>sR}&Mj1GxS)`^{rPz^{F{ng z{%QHmS+}QO8x0fe^V{1N#-81`98#O6_*Qt!1PbCSb_Ckw->Kw)+O1R+FW@G{15eD? z^_hZhb`TpDwn!Z`8O7mJAOJ@z*5X)$5JNsKdBWtlGVW5;otzXw^J>8k&+)Iykr)4z zPZ$^kHf~|+MSqZ0idA`(Y?lt3vJMGi8dqdDXEf!kOiAYqdOl9T=g^PMD~f1^iCo#O zu?AJ4bssw>ZA)=GsFic51VD(+XgWW3Wjg(3$K4=5&4vB7C3vAo>}5~kH&5#OQd+RO z=b+4j(IqbmQR=W<&xPNMd1M+e-(lbN7Hi2m!F7|8!~6-q(62pmf>E13Gh4Nmx$Pog zx)@jX@$51-;Q+lT_xx0T3gbi}|KE|pf_l<cu^3?B_ZJhA4BYW%UZO z%sJo6?R$M+e)Y905L%wcSfDA-VrVsf!jBOU7UOuLH_GP+_NNmSgu#6Dr33K7s2vZH zssht-K7UR_=1D_CoZRPUVysaHHig+*@XcmOxK05ph3%U$ipVe$*EyG1C%miFUi0dD za}(iR;POWiS>(v(kGGwpC*9PHphu>^KXMDa|1%|{t6{u1mN>e%+3H?L`?j>w8$^SQ zib5Rur~%?3{+OYI%!`ZHWnF#sPF=dNmByG7H_9i$2F5I)90TAqKP{PuC#u=%>=YTl zIeTh6OiGk#3?)et%!h@Ya+%pJ(X6 zZ@)f=_0HI|&}*pjyc6)FlQ_#XmLYYCMn8shni~SQl|2U=NjL?FSmJ5 zZLzEa-rSmmH0W z#nEA#^0n2Bzg?dGBhMLYDZgdguKt#idqLGCmy>*#bju;iorx>zc;w8MvTFBRCG6f= zYKJgD`j?BMeSW#7M*aL&KIFZDwU5gC;EQ8Ksr#7U`|0_=yEHLxnyPL_p|Fd_g11b_ z(NA3_7K7XPQ;ACd{?+QRvA(npoSg5PG&+qk%0fa6N6PWdsFVp=x9PPk0Zjzv6;sBP zvTDcm@aA#X!4O=*dd!Hl#7u5=B}nR6A5+Imh#X`S=cyrSkeb#ZHnK`P?!Nia+TZBr_fc1Z&0U^Ri#MLW&a(j~ z9yH4tG*=uP7O~uUNsQEl3AxT6gbZ%9(ti|Sj_wN?*^(CUqlJF-Z55!^z>J*)p@x>c zR+gONR01rJdVteJ*WRaDu78{m(STj0biSe44lXM64SW+5?I}t&vV}IzgbXXU%gG@{ zm+jcCa0vKO_8{~z?;D6AI2-N=X!JK+Z2e^^-rVwhpOCH!e)W*pzO)c|KCtbzl{&0rZsMXPtraW}OPd#9Jt#JF`6UI;ZBSQzj=m|Ybi2^Xts72o90LRCp> zP5~|jOz5%kc*N>HdnE^pmPY1UwqZ;ui~A#=@ULC|v=d6gcdXn@b-*^S=2Imngq5)9 zdU0CxGHC?-Z?&C`$`Zm!iy>@yt*m;LR}21NERw7N^)N0lj2oti&<=KF!VDF)AZ*-h4C1Qe_GfqNS zXcYeSnI+C}##q`1qqI~Tzt zddF}4ZXA>2yf4(}SqhaXWqnmeAqC9p;P9~5iPQ8y!3q%it2hv+o|vSO+)zONu(}>Lc0XX$mMaS|Dh4^&qz~KR?}wq_Wp0|C&$3gqFO*;h$xNYy9Q$gDz?RWNFNp;T%$nnfaSMM?uK(J>gs$ z6cN{`+-BONC^o}s0>rGX`lmSRC;N`tZQ(YXH zsSqt+YURblcS5rr`_8iJtZPJv?oKlVD+7(;SW!JNsIdK&LXiZZwTC7go*;g`VYG0! zS%LtmU)Tx`2`R05MK&!UISOKB3eG8|q0&gdS{eY4gs9;ds0{7$`oju?x#qzoh4gw; zOV26Wrp;qBfKTq1*AG<16X(TTA7ydf-DXY3t?E9@ZuoxYSGpCF%~pTMJ_pq^Ng-); zyR~%bI6w_1f2n#+xbHE|+p!}>C(iKAyeOc??_gtKXfsYDi>EJ^pfG7TL?mHU;TPfw zE4>QpbI0q*B;tiYaR27^JJhBZkOSv8Q#{&WqevfHsx!p^#f6QrI>vpO)usEv=ghAE zd%ngi+wNnlq47)S-Se~AM3PKi?x>9@{JdCd08-)ui}1I#Gof^1x2d= z_FnWV1VWqPNn;Qa>oIjhev?s@Lh^zJ@38IM47d8Xy3^S`byQv`&Wl9bf4>m8BJ{rj^cJVSYr9hCVw(_Bdc7?(+ypI9OBZvoNoS8= zvYGxm z|IY#x-ILK91njxR)JsS~3yHXVTb5I}9xzw|+3U@Ma<(s!F~7^BT%qgk;QQ4_x0vg9!Q(>VWTv-$6FsE`n?th3p6&3&+F^cWh#qE%q4n{=5F z$kE!gI)sxM>dPWsJX)=R%%xyCb_H_q&50v&{It2{v^|?nZ`0_=QSyT7=az+D=!c$0 zielBsrR`%n+yfAu-YcLn)Dx7U>S3_xFeAKVaLv|n>IC;d?z77PkEWcQAvxMKU{pez` z9Nc}{dDDO6{j%2bV0)eEQDL){xICN|0(aU7E$YiTEl^EEvpB$LwIy@EN3CZ%WyF(e zPRVl`+r#u|5WtZv+&wtSy$eLU)}H(6(m%4-MvhUo+LR1PduDQ5EIeiun#v`*;f%~SsG#cIyS$wyAEed(xk@33dzp6;&q zH_9Y3T0AHVI&IECp!IkbG<825^DLjZ#$loMo7r4@wWSCz-J5;9SDa-$L{Gt*TzNr9 zj@}~F#x?Yj$Ja^9{)iIH3${5vlm@tmPXtr_-z0L>HLe0QgzkCFx*}hba67C`N0*d6 z_pJkA^3c>!XmH=VI}nWIv8#vC#i~LH5|RsNwzqMRJ@$eQPDyZd>xlec>gGbc+^O6d zHqJ&6)y9i*8>i&OHP|wf{F=9xHmaE~*o!*%_$$)fX*Ev8JK@hVE&)yJk~X2eu*oW5 z)zBm`i_HD#TgLKpU?sr#0Gh(IebvJZ}XSF0=wl4C5Al+le?(%YGW zpmC@Znnrp#R2mJg7LGV;SRuH5t#uy6FbY|K92ON1Bd4h8w#RTk`r6f7;B;-W8DirC zl##uU`C;>m=8C8aZnQ$E1k{#aWlrpJimvIDI^984?KI+CcM4_cm62eWu%a6=Xx=B5 zK!mQK(HzcgbK7dPYf}1XFxYk}^6OVsu(?hZTjH@4AGz`bxKGL-B;>gJZQ%>-$s|zU z_)T-ReCb%ac-6zLK=3EZ@U3CblmL;!?<-IOZ{ZFr8{X+hWFj{)`oYYuaRbzV?JlSo z#U=$pPXJFKQzvS{@VF zb5GABozH&VG|#><7Y97s7aTxeb}kWheJr~*O9hu}W;1G5?>$LAINy(JIz7$O$L(82 zjg?jSX861j6~F=$xzFdr3lX*~I;7kit+$3DFfHyzo76If+FkEyk3r;ZNmNOhG{V8V z{ZAbH!*Ac-I`$lr7BqjVm@U^^jjRLD2t~vHy zxT(FF_-^^Qjy!p&w*fRHTn1J$oLgRVO)NCn!mMSbU+r8=v!AmyeXvMQ<&3x_>+#(K zQ8T|VuFdCcq(=(&$xxv_-OaqOLHfF`(d>jvz4|}N5ZB~9~+KSPu z2z)@Y#@MM!$F9kDl}pq9(&*N|%&{np%iu68ff7)78YlJ{lz+N=i+(r?14_G3T>)Sa z`;S7L<2}hlpx0FoYo|!~E{~tdaH@up%rE=vZ3-l| zZ-uC!yLx#NLT1WHh4$ET3%6S=#C_a}aE*`AMfbaW;NLd0vD-6WI2=Qr7K#k-&OOuZ z>GDxlp6jPjMxvK?U!S5D=E3G~Rokw8(Eok*^BLd)g@nu;#;O4hzuESVzhph{JSWe* z{$1)638JU&($-#aWuM9i>iTxlOFLpR&;l9paa2ND; z@6VZ<1ZC{Adsvr`{(YI5(slrOL^x~V5WSpfj8CBZckA+K*_36 z07+|$B%nU`oCVmj2pE$5^3?FmP}Mg1M*P5o z$o88LpBaApct z{Bt2?T{M7TqePX%ubWEOSU6q9SjCgMvn@St8;AI~{c5&Dz}Udki?KPQ8}iNjMFj|1 z*DayK;rSf2^3KM*#07cPdE?#V+wzFKd$U1+RHYwKP7Nb2j|~6J{`~cGak_pYHy zO)8PMvCw9QaoynC#TtU@tn=T(Kfqv|09T))+{lS`*oHuRTt9O`O~J!D1phj)(}u98 zCpIgY6uSTKI;r!e1tT7>^biQBI)&-b;v@q;+`Gf!Amcsci*nIadN>zk>G5o%$SH>p zE+=)Y0vk_dP=Qik`t_fx{TuSktWmN$JDDe{lwVuu{6_(QVN;RPmh0Bwi;+)1Ibcu+ixzdxzn_QZKhs*Vl>icRq^PMO?bDLX}>!P+>hH`CIZ%Kr25B zKlZ-aZXp$Nxr|fBOM0Zu3oUu;&lIecE_mB;3qp@*e$n2_E zGNDUIz=Ib^5XQA6pjC%4&jBB1P!j^InA-QS&uMvYk3Zq$b(92YY8KQyP^IQ zMw@po_a_6ir;H~(lDHpa*wnRlJQ@h$v0;OW*{0iY1-wm9waF^OI1YH|CZ!?43t_;1fS$utc?4{+?d+uw~X$(j!-y9@*v=)*YRIXNI3lyHK zj0#G;*M8m@i~>wweCJ&c#P=YHa;L!A(EWw74~d&(2!V}<&2Lv{>?fph7P<t1SC%1XrlR!_Y) zTJzB!<-<{cT>pfeU!5LdnVQhE^kzLYVMR;Lu)W&8kISv!gYRwOUgpOWjZrQ zjY>Rg9{N2xkL21L?>xDa?f`w(6pS^t@b4W@T~Ph9C{IF|uC+o0W8*6LX3jO(F0L-N zbu96P>?8>F*jl?R$GJKzh=Wtj?{%mF8_8ryoI`eVMDOVZ3owQI^30c?LdrG^*=+c8rn9kE-QlpW6=1@<81=D)(YOdbRnF zk&yP>gfXkfRQ)>**%bUqK>X5M%ZWTi<61)syx-#?Ef)SA!Hw}f%h+Sv?(JcwAC=6* z$s4vWTi#{UwEsJMi`{)Z^pY8PX^OVio+O}mLVj_K_g$flQ`z9ct%1*ateeD{(W71k zP349BR$6}8FFVtJPrxf1Y9lXqUthnc#xtG7O6$|b&<`v z`O_2dOry7IpnX!Pv$G}MG})CpH5HEv9m=_rEJ$1_A3#eXXW%?< zf|B+1^}ck5ru#QXxLt4ev>wmcWb)l@yd*q{(DIUQ z+8nLVSjIMPPw!Hn<@W@(6|+3rYQ_1$8BHLBNJ!*Lvu^3i#i164qB}XS zxdrLCl|(gfZhN2n0ZD&t@pfpd=klv1JCP4XU|6+WLeB5aiSZu{1`CU$$59xpBs8{z zGr3h=PMvV96`8a?Esuf{5&?f7Jm9Iv@I;e@XcE?)G%6X*)c&u%lv6+~lcK}UPB1Yr z>rLeLF;Zer{(~6Uqua6mA^8XV?rXaZx0uPbz(4Kwd5$2kH3B&PTt^ zqS1N>RYm!C0_5t*+{5sF$+QmNltb{TfXQ%3SzDUTa-n!fST+2Y?cG~#hml;~3T#wY zH>aJvLXTn~n8;V;H0IPfv*e=3L;qjZ0U=Y4*FeEN=o08X^DI z!vvu9>7C|%|8`X#Q0Q68Zs8zfl-lzrKdUtB>iU}~8*2LlDB0%FE*5oQ01>ccY~I>G z9n{|bcc01N*OxCmD0fJONfWWQ>e87QYG?oGoEU#v!%kQDY8Kts$cDU%;uO~t6XgUF za-sE(?6D=K_AMZnoQwuRfJ@hmiXY<#Pj!zm*kV3%hRkp@ceeD@=E3f%Hu(qioqKoH zSq@c|GVwlf@edys`$Pkc+_lIXM$`$`_?wH_dCJwtgOBFVVRss!iRr1eZet}zCUP-A zLGJQ9z+fY*T-B-8GWD5EL8mevPGSAr&^kW|Y#C=`;V%9_E|;M?Hg#07ztKa?Wpst` z7AV{zo$Odsf7fX0CO?tn797sNRFSf2Kl^PtkzU9-P)Xa9w^WKK95}p92plU#OvoTQ zmTpeSO{dB$Q9R<#bGPAJ0G)3#;8Ddr@%4pLSMq1^S(V4+4tlfddv&AdJ1cbPQWHjo zkQ{&^*7`(Qb$4T2!BQ9`>C*-);!AhYHe<>{B+~fRCvl#EJO*>ODO21E-B{5(z)%Qx zm{MxzQ%`k|@NQ-L&?eN#c_>5Oxx`E-=RLr+aeLvX_HnFyn*TZ-TMkOw!7QAffxX zy~R_pgwa|1 zykBU2_h;}#-D(ekY&ftyC#r2OIpB}4kbcb40pZdq;;QNND)Zk8`}0cTSa_6+0w`xO z{Q*dZ-Yn6H0R|GCb)b_NjBtzy!MOUzROmZ)95*Hm~cEKP(kJYsi^YRkII(hgZ0w_iSPpT>@2iqYR1*xT$zHy zY;-C+Vk!BG0HSk)tX9@h>(B! z@FvSoVahnZ;rrOBc-T7gqan22YvJ>yDeJS7T%~?}pQ@qi{CEEq>h+uO8c1p2ze>=< zOn4y!+v!{&1wP_5th_Zj|0qAX`)vc9lpz&ts1T5KQ0Tv~SlLLocTR`hviDw%vLCkluR#u-aG`m^>3bAx!Uz1FB)F8GVShuY&Xu zp=#}iOe!Ma&v;^u(tAsIb?~p9f!rv&XQr9FhRE6qp&<(Dsrv^jBLB_{Za6gca~iej zqME3uuKq6Nd=`*=ZlD-C3RgWU=Ap- z>JuDhK|Nh#L4vLwAg{F#aY|jFb~rER zMQWLAv*80y!?Jr@rbW2k5Iu5X;kS5BNMyY<)mSigZnb58gwoS~(qQj_7ZTa?$Q+aP zF?>sZd#<*Hk40BTPC(qTTWpWLNIrjjfiBOOtkS#jM2v@XZqf%He@`8jcy+R*@$C84 zw)N|!ow>Wutb3en!S9F)4mUv>1qGe@PC5OspCZ0T6}+T82%Dmco7Y9Z>CJ1TFJT#Fwo-y(q`4q;u88kSZRM>d9Ks%{(S6cOy# z*XN7yn!D4HC~WbK(G(-4Ev<4hR}jHcSfDw2eT`sZ@^jY&EH)W-(jP9&(S~7QAtb_% z%`|W<;Ch+{?3@3WQx_#O9P+N@zam@^7(B;c?V4l7qsTw-#2Efvd0~M^M0i>4`fq9- zreDR`s@RPj$qx+E<04ISY+7g!L*CfUK%hGC6ZaJ-G##h5%o)&k7qo|j=q;FK{g`qK zrsy77zv6k>GSTv?#kONFBp~3MEn|)Hi@nvQ{Ns~{W{K^7YNQ*j8FkKaR66K1p$<+7 zU2?U57x|lzmyC+?8T~@lExN8*?E5~NCv#ki;Su+N$D%!& zzkFF)KFDhn^A=^tPqw_av{Mq>{dJ98x%*R1g*N6Etthtmv8<@eOoA@~&1X!-H&06T z;hcoRxbHIrfqrz`aag*pP9s$bQut&_W-c5gIQ>Hx8Am0Vzmoc#{L=K>`Y~#>!p=I7 zPcO!y0urFIMyRAW6QmCz)>v9Um2-AY0uS25hTLTf1*Ly=M7*_2QvMHDd#`R}iG~0X zO^d^aEic2Q2FOEZeC6%4kO`~iTz9DP_YaC3Htwe$Y31a~VJwL8OgV1=DRM7cS zgjRz+EwsZ!V&8CLC6Lc_id`{eA(|}4`^r!sgGc+@P1MF3poH@F?@-UgH z^3ASQCs(!Gvv{Gjv7SKiQ^`eh{-dbIOw!wTp@j0B6qCnO43+f?8N4en5~$jk%)AQ<$Hje$*z+lUs1hBx-c`I_@$V*(3GZjAZEwzzs3h`F6 z-fX}A_dLgF`FM_kuW)Z0cmLbBXY>x=uH4n-Kl+1ir>XEF@aLG;P120+Br=h6VNbj5%(#w zg)iaV+f33OA(v4YA&IB&VT%A(&w*eI^pC>R0y_RZivYV9<9T)*IQpiSdZ9xbNWS?c z5HV>du51`a)8GN1%s)ecN-aHYljnx;==0tlS;)yHV12H!_;hx5qoVmjf{f_qNL-C~ zIP8l_OF0q*A6}gy6^=tjo)&m2FtDfc`wdZB-noS?9Ft{7KJLdi6qB{MhUTc-vNk_; z=nIp*%R=%>d5T+=&3TSWn;=-9fZZPZysz`zj3u?I_7`VMM|ctNywCm4;&1RZPH|{H z8F=aKL7{z*-a*eas2QtrahD+*g9U6w$Ql1g7u0Klac9J%ar%RHEolfp9Vh(zV}|TM z=|EqV>E!n;o(9gqj4;Y~iitE{Xwt&PtW+$m*%*KKA3&mZnkD?RT89Gb(dD6h+L|U$ zm2q14fHY~cBZKia?{4*OmNPWk_s!F zF;Unp2@uyQpNs5r!*FVdgvN6t*x;J?$4rQ_LGg}Kqe%=FBUlGufCmoD|44zOH=Y9T z`jcGK_r$m=t|KCQnB#`JT)#*BPqX%R3n?-WM4b%{d8=?u!aV_1MJ|-CFW!Bbi;|L7 zO5>i^AepwwID~STCK&x_N+zr|q_+XS3|U|Ej9+hMMrwW6w*;f7Q9Wam?++Ih~izn5NTH?d6(0EEHm%Kv(#f=#r}B`1Y}QteCI zN(8(niyUyAMs72^2e}n#8s!7|P-C?L=hmL2e+MFHn;JN$d?`x~HpPL=K^pV^61$qa z`zrzNp{McPAKAX#dA-A%E59Dm#y`tJYMD5ENak|%#zVe0WrVug=?sP1o`oDwdp8); zO&#jSlTX!6_X&{n*~;z@Cfy53IXnt00^g5umjX!~f-nT;(MihO%1Vk1Q))BQK_m*e zgWt+kSDSw;V=Kyv^Qy@+J|`?hEFZ5vAPmyKnZL*eioAuUd-*%NCF zouQYvHA$D{iv%rVXq0z(=sgmMLJ|Eu{z5~j8ULvD5Rgi`cHHAGzi`<(6&x5>E6O&v zM58T;)F(XsvjUp;_wk^ZliX*^ZFL(nd(X9}vzDI>Q&UNGV98%!k(bSp{bfHvh&vpn zz^v&mkRz|&Rcwy%)49XdGeg0qnp^i9+eqgiAt3?ho!CVU+t>0RofXZbPwpOI1Qb4B zUEQQqO^{vHs<+O#CnKo1lQ4$`zrq1Ex8tWu(R~tjDQ&ZqJaQ5}?fQqNd?1gQpQPUx zhv!F~$u*XC3shgSh-uI7U#vdxKi>EX@lakUb5UHDcTgSAHWmN{bbog>TFlX{(-Ltb zg>t^mLhGBzl(&+F<2~Deo&!^duF|(RD>e1Mjq9DHHym~hi9liW+0x$C361$DHo9ex zt_!xl{J5GP03yoD`D(+t)WQLxb(rDSip9uIXBamqJ$^=6*3K=iQ{nNxQ68;fjB?oq zeff&t?M!}7$y7<4??8JYHv72VSft#b_xmLCbGKOLxdurv5#iZ5B(Cf5G2boUSdRqF z=17~L)UQ7<9BHhCDfE2?VbxxvokQ!uOTG&E@+c?2Q*UDlnD^!0z@g)$dx15a=a>ko z9QLU~cmu5u%K&Mp3zF;k_EKp4-Q6_@qXE#zUi+^)<+k2acceRBPF(E#CReT*1)U2# zi;$pd$|E5JvRojno}5*y-Mok9-8-YgDp*}ZD{z5q%EK?)=6x?4ikJZCr$<7y5$$Xdcfe z#aZQ&#d14$kmys^AVkt`}DBx#-|{MF5laAtq+hq6Lo8c zWz^H257VFWxv0+vG+W1+p@o+eNmRHX_q7AcD|3e99{>@OcMUl8utem*{eKqR=I{ldT!LUMZ_Vfsb*?1Gv2^aa zEJ{=M7b5s7|E#2L&r#xI>2W^Z@Vn5d=C%$;I`$jr@h4YBZ5V)D#Gsd&xlgI@cZ463 zLrrQx6u5oe<%G6lX{SiN4Ml%AzHII;A8c=laQCZ(mI@iOz_?NuMSk@+Xd(9>#?ARjn6389Js)~)3*kB*6MNbmy9o#bR#@^F zY&g8^tvpWg!I=8KXTgcRUf+nHy!8iedzOmo6tgtVywrT7vu^WNA2z3_^}BXpsNKsh zA1Hs?8?0f9S+xA1q+v9sY79bb#&YZsJ|%s`KDWczGf@MLc0Ns5nKt}NV>SSR_Th4s zTCHl5=q@~&H|sT4dv!A-T%sNCHqhMI2l4M`Nu>dOG0e%Acp6zK zToUjV0+ReJSysSi{1n=A?u+8LpT!n?x?-OhWYqtMlM+NCbK8J0W>mwU3QS~p-p3b= zP%|2fsMr5;FCQKU7`_0C;NQtQNek}HHb1x|` zos+Ql+e3piB_zF}?=jEMUf&G=`~7`e#2?P9aIA$(zucj^V8#8|cPG-^BvX!s44?ZR z8irLpG#dlGZy!-uW$|HKI_E&!Jnp|+BrmXixA)(Ek{6BC01*V9_*myS-6qM|6PBUi zsA7^s$E4zL_fo!C%s{pMpN7EZn1O$|&V1va)4PW7ON*aA)4O)5rV10zd~rOLX9ufP z|3q?)r9tg4zsf55{@aW3P&k6?WH{Mt4@wSZy_J>j3c!Hg&e-^M&U ziyu?BDiSfmY|BI%f?Ba`Fc2wBQwD-9I0<{DC{fNDE6?xm0S;%Qedh2eTi^`a#|7bN zA{(%~FM$^xYW*GZ#et3?tUcr<<12S#GHoSqjN+CRKgtx;!-WKbz1oY+D|A&ZgD6Ra zjYM{E7DA7{pgHtcu`6rtx+vD}C9@*J^J=bDQV|US*qhJk-^bT0OpHy)PzDe_3JX(H z1C+7WmmC(;85$d*&H2$T7R~w67J;%alFhani_0xYU~4yjIiO~el$1RXT_c5PzQg9Y z$4}F`Bz-*6u)@w;sRWZ#ZrNX|X zedOe7L-??yn{M50s2oruj0VcR;){~Z3Y0u0yWY3iZ&#AgWks#fkZ@?|ZfH2ro*5ER ztARRBU=U!abk{!4C#X6x_Ql4fAoAn(eg2NoF}XZ(r=y9iPo$m8tp)i7f?JHHL4rB? zC7(895!lLckNDV~NZ|TuTuEjU2vh5w1VF3`vA?^*7>aaN0#rKC3aCL}Myc#?LUnX# z9)NNGiAgsId%#hNGvZkJ0{sCIR#3z-+6t)7P3(b{m?4h zf0VjOvn~^q+VuPfW4SAg!1B^Z?lhO+ zvYv|r!{F$~EtfV_XZTf&r~Gd{Et6BWG&TZrk5IlHO5VK-!md>ydHwG#SC1}n>KkiS z)%}%)>dgo5A#n<&lK+m3JJ-WLzdUSMyNOWJ=f242Q8;MxvN~AvMe*sUg0-3W9Rz$% z+u0A--jwPeg~vl01d;s<5jVtew}E=pv7(J4#b#;b&XR7sQmuJ2GrCI>gn>9NpZ_T) zf~rketq@X}GMz|WN%U4Sjg3K1jHiNhQx~%`_{uW2%Mv)czpqC1g*}oR(DM04IC)nw zu+fSvav94o49~54A3V#ZP$C2SK6WDYZxvTCqoq(?EmmV0{bMEQ0MGD^um^u`H{Tjc+zkUD)-qM&3O?dw#G6hNv-)Ojn zSzNwK_(Sjaj^b%g>Gs{Bs~8$uvlKtS>)v4|gDt65b4I>ccAG^W5!EV67fi$nf7#^<*_ye0o@}LH=NznIl z;)TCd^bSMwVs=uL=O@0AVkA~@!xkX6xx3JA?^w|u5&qUo*v`S65d6!t!c{%P39ysi z2a58kr(rnYY*@jo%t;hG_*YuR;32fOUOi$AH3k1J+xnZ7p{1uS)115yZnQp>dPXMT$B&#(`rMODLR4r=D52X4QR z8+)IlwE*m6cL4(|}zFfZrudwd|su;-K%k#+mtlb{Yb*%uT$p9%{4xIK+P zi1B@6;x@I`*&;63ZF(wLj$AxmO=ul#4z;v1=f8nym9v^jC;z5wt11%|j<`M|*4#R~ z*)d4f>=mk(N6YMbHQ7O6TY|GWjnA3sKL7@@+$b1L^7?~1nvEP(r9Lx455@>Q%|#Vp z0XkW{$5EPdjP?OKCa0k2UTz`zeAg|k_SDPG`(gi2*F0mvBFvaxRb-6^-IQ!{Y!1_~P%GbxJV&dechKbjv#(Xiiq;DRm6W83BmGbQzwH9Rv`C{fFU@(U04Fh}Nz{xIeU1 zM5p~sLh$Ir*L6HK8%oH#%6;D4vpjK(jWRi*2;}uq)&?PiLravuyK3oI$P%sL^qFem#eWh-O zZ_O{5`2e&)k>|T*=G{u#Ss#zDU1bAC&DdxfDFSR@IFrech%#+7RT72c<$mU9?N{-QyJG+MB9wf3tUNj+;#okv6TBf zbA;&b@FdLZhkMWq#(0+0=3?l8nT7um=%Zn~=$p&=-hHiP8z+MvkT~LnnbSszQ@=Qgjfrpuvg->{WQLG% zOJXX`=t7LHCT_lm9qBniO{+OKe#($p`JfSNo68#hqJFMV9y{#My4O?55Z{FcCkCw%Ed{MX%w_p2p!PndvyP&@jb3SN`6%LkPR0o7@sf}fNS+rt5GR& z&M}np7d&`V<-+B!fxpR#76L>N6K#X+Kyaq2y0a+*t;RiOjMjV3^P?Jd0(->8F$s(y zw4H$)<$zC_$VB&4boqqGxXfjt$yCB#y(@ne=`|paGMG=?&h<#&YgeNUW{l-4)xb5V z6!8^fT){mb2aI)f{p-GQi|8duQn&G{FA_deHd%YZM9T#IoAdEPUh=unko^l}kLvQ} zRHon)d@uFJ9OBBK%{YR4BL`9R2VhMabmrkDWZtgqzbmZNx@7M>UlPSS)my0%PGk_+ z{hQ3wjn>;zTI08%DUvdY7+0Y>`td14v}&F08;R!guu;A}mRH{3x0jdVhEX)yrstQJ zFH(I!ZaYMrd&kEp8#xm03_}Dl$TMcUt=sk=+N)e%ogFSzhX9GlAkozJem{6b#OvrW zXewlV(*NpUGotF1B7drIv-ybmDF0Z(&Pbz|I;lNWQwD@Vmu%j_t(40d8w((LaCPv& z@kqI9t0e`h4}53-ry~_rowOOgxADN_5dvSu12?fFjvm}~vEKmgbn^HgzpC4Wj>yu32zDBZMyGSUu+ z3Ti&*rBne@V2Q#{*XrL4@_pQV^6H2E1Y74+&6+S+|V+TK>21eKXJN zo@&le{q&>@ycA`MXUX>%;#FA+ls2cRF|4n3q`Zuie=c;%s=}1i7uuhjY%e)urkM=gQ-(uJKI}LNjg;m z^?clTFr-|D^%Z+Ag8b9lo=@_=A5N|CU1M2+7K;muSc_E zih{*?W|KOABEm1~?ARTq5igh9#>_^XRO8PRlq+fUiNfQzNqS@NXx?M~A?!Q)B%i8U zbx1(t$58{-*BzQ0irO;CjzHHJS|qPy0-dn?Hsc#7{CnIey5F(Qt~Lws5NxWVGrOcH z8BIB--h5Y%QLl-YJZ+U(suG-JAziPw(>bt9Q-J zuwc-|&Wgs=Za3FK;vp@2$p{p9-j5L>-)h9l*=%71iz)8qQuv!<_5nDe6GnE)cMisi zb!qj+lVxaA`3`+$`X(qi6!wiOApCRf6>wEI# z@fEmJFKdZ?(I0I@@Hs$YDU)B$GIMWq1Dn<)nnrXe_(}!=tKxDmMR8Tv7fBN)atyHX z_(x%J!FLpfcx zG`dfG#ku?eKDHcU|25C>heaswZLVdj`#B#VDy69_gmhQvGzKiiG{iFLtiCC;&1umR zjXt0ATD0&FH@1ZEmC?m-vgtkP|APRP9SyiMzGNo%N#_}kQXlxU5@n6uo%zdqGk@x} z&%P}}Kl$>y-D$%<2i+e4KbgCuC%Z?KHYW2}CebvT`*GHY#%u?Bgq%iNXc4NIH=DMqLt5JjMN{Vuqe8j2rTuHZ z=O3Bh)6rR5+E{OE`O+8YZuLdJ=krs*Is_hbtaBR`D>x2hRikbtAj!|&9*oa*fFnv9!K#1qbU{ys>Yi=~vJ)lLC2t-weD z)MN8Sg{D=k(1Rcc`~2J1{zUu$UFrD$Iju6ab zNr@`b3CKfLTu?0>Zww*lVpXsX2XoJzf*X+@Lw}YNjLcw0P%A?s3%xZLcDoIJCZ~GI zs^_2ooRDE$e1)a9tkiW?o&!S<+{3Gz)x6a<~3XAd*j z$->^pUW&HbNPPs7&uwQA*(LkP$4~hSW5EF%7-VVEA3yCa_0(GS*gEzz@6MH_rId=@ zI&%Qzon-y`{0-+Bp95~xZ)pDH?0aQK;?yo7PBX0Q35bE?|irP9u~W#%uVLK>}wE!(mRmzj!n16d^d@)BumAI>dP>Ip^r7FvXxycI99vIxBd7Evd={wtK>!4et0kOTwSl)mkDO z+Pu)uSBAR2$)EAp&&%t7nS@Sa_$h3MNovA#k#=DEHJyEjc)ER5A|n39RYmnku1}pd zDXV&9f4hw=T3avhgjwZ{^WEpSkLJ=C;0n~!k?u%nGEk5fWkMc4=U7{LwX8{cAt8v@>9T=+KQOcguCtikKL zP@+@~`W==xhu_(Hq?}2}GzFRKVz5I1j$!^Z3#pZA?_NX;f1mu|ZPm{C@davU?P2At zpwwAL6tiLu`hmCsDwcWp@x6(xmHlw0;m3MLk|7kvm+9A%I6n`7qumhT*pWE-S+EXy zw($D3w#l=fYF_45--L4WJ8!Ou035kn3AQ)jI^`QL-?uex)F;9*Wm}obdL=_h>Qb=j ziJso8gy739WQUlfVOkM!#pwBbP&MqEh9@UymXTvjMAx~itkJ`Ia=i?_`Y7CS#^HAs z7hkSnk&B3~$pF<~zX;T{NyhjUC7bbO7;PQ+9W@#CY0}l+&I=H{Sdb#({Fpt>J8HL$ zuPkq#dx@D-C>M1J*SPE7^JY~(7)>5NJQ+k&*DGn{GK(xpdq>FWy!OTYlr#S(&^u10 z_hec?;P#8|TDFW~1q^m9kTM6ef7Y&@!RLsML04K@=G!^b_POAERr_QqXVuqkY~pvp z14cUhtqC;3#+ST}iW#p!aBWr#P|qSW6CW<2D`+zZq&*4Q>H7YixX~e%pUeY(FCyHy zT1l`C)m0mEy+sU#r^=`R>oJA((zU<2%RWHK+J8`XBzl@yxHAwB>XE&N(Vux*#mM2} z`>>n@gYj0@y4t&z8|k6JH6|nSTd{+Od94-ZqUcFjl!LP~e7N_yq$uUwK27S^%3+0V z++C~A2&k!<*7gfSQvqOYKxQ=%nz|GRX&Mu#i+fB28=|#LKI_)?Tfe^1vikh{3!=)E z%}58B#+&i(t>0QdBtujH`?pedI}}#trivN=o}a%f&S`H}EGt)1omZ__VtX8u;I-YZ zP_XAJW5ZBB@-0KzBVV178I1xPl;?Dx#~aMvx;e^pE81~nYkn^?%2jJX4#vF!1D=O|*k>iLS_Gw{K67+8Vq zRvyb3M_#|7m7GbZ6JYc0q=3h2Cy>;yUnXd zzO43dU*`4296sz{?rYpA03MXTMn-x9j;z1tTzbMu+d5!)-(&#CsoQPw#r=@Psuz|E zyMqS_^{aVvb4pg0R$L{K4T9%M|Mpav{0gp5;x_GX5smQkYj6aI{p6+(0mu9n!YK26 zE$z@01Vnkij;vx3(eU{lsHsA)z^oO^=U+Y3<%%yxW|Thx2!coDv`m!@h3hsjejLQ< zi%J)lq`yq{vsJHAL%b6l#viu%pr3C6c%A8$G(yS~3uf8iHii%$NQA zskWp9Ku%uXCpo1~;)TiLLw>S1cZ9C_4`mx^(3?F_WRvH+S3j75Hf;_?F_#B_$vIqG zeURhg=hLAj$8Koqq(Jd7^?bPP{<6I0seK~s|GfYv_Os}RTcHP-_2Hh38ULYk-=RL& z?t<4BO2WeW*84cMFnn$%uZ*rBt2W`uZ{mOyn_Pgld$@Nsay~;p*ARTVM6s(H-YxOe zkN}kP=B*lLnOb`4&p!VQi+K5vP97wUdL0L$R#TV19`Wxmk z`G;O^I)xjSUZ}h+R9(5Z2i@?Pf}=vA9OE1Sl|~m9RoeNE*Lygo{Rb_V$Mz6bL~*8x zXU3f{pMU@qhPC}N7++EKxCD`DeeR9fsnc6(t0caDT%Tp!Vre-3lsHCzKFGO9yVU7( z*8as7F~ZY3=yYKBb@TG-OblALww=s_`pI)t+GWozJ!uwXx&*1Yn%dq$A8|OmPUSc0 zcP>36LxE!9;W|TlZkufWfQwZ>IcO!%irl{Ru1^s0zUAVn*@J)fV8Z>oB>UXIkrL48dta@|Da zkJU>0r?tB1w0Y(q*vhPjDXgb6JPnAR4C-xT*Z2ui^W)wC{)gS$PY4JpVgdqavvx{?f#FZ^A4x_fB*QW zL3 zf4Qz)#_>M)>wZ0-kH^PisiN@kybSTMzZJLo8ia~6TqrV4C_*O9-v~PNboPQREGX6$ zRuAZkLVs=nO{3745=A5ze1b!YS=5Xn{di%t@l!B4G=2f2^?I#HckU%0{%-|m?f9|} zJ1vd^&iDG^dUwTEIdt&mTiTl%k74NnN-TV3+(TbVOG8Hlcw*Nct4fxhucOP}qZ`R& z4;i%vC8=D8=v-5pQwRe;`#yrv4{lqJ-=$uwl?Fg5>di9)f|w-UBo{*muvOycK3Sdu zQMpzArOf$yQ%HgoVJ|xW>>CLqmHpy%#OOh&&KsruQ8(T7>3%c)uyoTa3TCc~bRR(3p`i;X#61N^u zyusFozliJy!_f7l*5ep41d3;fGUjrbyTFhH*hTwlbK4TBVXqRAx7QQ3;Y?Pj!GS`8 z(l=|-rYq0!Dum*U4a8aR>Se<*uTh==)XsQ85AJC&$9&2C@8aKJQrOz968v(XH00g09|CF%&S+{u zhWwnF0u*$blh*?BsnvIB9XKt*QJ@UpAVYeZKvH``lvIDXk%5!vO>_3nZY2-b&2@GD zhm;&s10fudS`CW*ntF-AOG0Vj*e(*%_l+u5h(CitVU(lZ7xH>XKAj|qcy?=Erhp&- zM3hi9!hiB4?mmQL1>ZB-5g)UdPRY0tm#q}cioar%vCw4&nsN{6d-9?JJb7TK2hY0M-`6^A#rlA1OS3mq;SM8~zZxEg0H^1M1zT5L_?~3pc ze#L9{q-pMMedtukm*(P}Gpc!+uOYivu|luVS(U=R7jM`W`J>iX>QEsj>~+5 zj5)WK|7B9psAboMrp#NMza&bH){;k2}mCiMm)d4lU&T= zaiEs{H$x9;H1=~AS;!of7-W{mm~xC@QeBjHbe>?wN<+|P2JI`a=4265GChRj%T4m! zqRubb=1=5MY}l7up;~e@J!2A21j=zhcj5ry|Eq`n2|7b>-r_#2B#i%{CJ9IcD*Qc& z!)$-~lWN51j1Whg&Ik(IORT?~0}1HU!$pBVfHGkK95a40!~IO48MNqmdgHl`a`Wup z0Q;n>r01xLtQnZP`HBU^$jnk{=h?7Bm9{A(lfJDBh3Pp@i83WeCD_`ZMyZRV5k_sm zPOdPF=D{1hz*_T8A_icF>(}LPasjoH62L}ZW4@Je5*R-UL9WBGPLDdI7yEm0Y%@Q(}&z0(1eZq92 zrUo&vUk>(51?)q6z2XW>NiIJ4B_b{}D*S@%2R%N!u4Kw01a~$wROU1xQ!hSNjY!Na z?Jg_Z!~19YEO9`REIoLLdyIrT>o&R>U&o~%MWQPH!+vVpZ! z0}=`7=*m^6vthz!GOxK3>Nh1_@1}l^%-O|P@kdmcK2(63nY#-gKy^(B_|*it*X=P; zC@&ieHz5tq3bl0y|mHE2(1GK6oB zC!-pFaI|&DxVFwYO)SX?sBabC;tG2d)}KTUPMFI7AaoEnBzJ$80|s53W^TP};Ly{J zMAQ8I^=lV6Aebn<=K{c!o(#MeZm0YwQGOq|K~!mLqj_m*<|r5LcWB-H^t9TkpT6`j z&NnO_-Wo=P$h!TW)wTZ=Y8OviCIsYVQjtN)G;&XH<6cqog5C?P?^@J7-oh>~H%WXg zn^YJ9)G)+MD2+qQY*#5MdnYgu+bhkVioP$V_e3xpC8OjBMB|Tdsr3#;CGzt>a@@|s z;Bh9cFm7btwf!1s1&PEkp;obO0 zEarAofS#xS-CXY1IZVwlEGMr01a@|!gZr$4udjAg)hOnytZdI>$CkiM(mTc}X0?BGy zj?CxoL^=rNPOko4p6nAFQK}rHunvSE=Du{(!RR67@oR?J^VBN$2|Twt0nLSDv$Q2daF%= zhl7L~_{@fj4$PH4^4BVCbA`PEc3@xNaa)To-8wFhS4yy4qJtSLv{n3QR5pqN*Yr*# z*lvpdp;sz}%xioO1z8f&1Y6+1SiR^3XKTp%_BI znGZ6&e1jw*fN`ONOMTK>e2U}b-t~4zYw_Fk#@A{+ALaj6|HvTr4u;xM!esSQXgLLQ zUN(9xwu|Sf4u()^PPqtC9`fgmyR2FlAk^1?+-6!)N zY_50D=f&v?Z^hT*o~sqX;X1%NJ~F71S3mAX$5Q3t;~-mHlHSk)98j!v_;KKOTV#If zA7CRoH@bO2;KbM<+0L&a)jmi@4J$BW%qxt8EE_sf)J$5whOA+)T|s;m`V9?Z1uvx< zJJ}p=WuY!tmi>#nBm1@vN}%@xd{SCM;7zOiKbj-;zM#1Xn1FW~&_WIxMMg-~_CjEO zu*!k(e({_*8DkSz;Ls$Hc=Qq0vhmBhExBO<(w5%_Ly3i63~ zy};Tx&Usv3|B0)qWe`+^O{qP)h2f`re^Xx{9{bB+P`VTk4AQ9GWx_)xhK#+~uduO2 zR%cd$F60E|Tig+shG*2pHk|ONRTrmY1{rjucvO`Z?BGB%U841*>gPX<3+Omt3(%X& zyK_R#UrspB$`(ZryLYVYbay#%c}_pk5F#mDg|`3Rk5Y4Vy%kI7+b`U6RY!0}_&gWa zxCp$QeX!S&>&p&j9j=D;@DZO>V(pX#X(z{&-b@2(4 zC3U$`4{vr`f?%(#*B5N#=ATMfy!!;Jl%}w6s^lZwK5_VZSeGG;5|HEK)vln0|pf10NQ{iF&m97mVV_?aRpD7@JuEOq_~Tk)aJmHNnIQh&ja=!FXE7_E&d@YeaKakR>r$pAFMD-b?ANN(6rRGvv zroAL)8+d-M&0&jRYbGb*z?aceCb~ZnVSlo9Tis+5{(EJr$8E1IWmi+peyS43%L$J; zo8sPZ`{Mq*SJueY7U>md11T2^G#UcQBcH3p)-)E-yqw&UU7D-?pS8T16N~8uiA6#J zk`3%|{j|zUS5ev;8Bm2o&ZvL+j=M^wqxi)6=(eSp>x;Xc3fzm~0ubtxliS}n8Oy_p z-x{+4opa>SKV<&bEK+qBihLPNwS%$xGanIj*Jt?WfX)6=t{u6{6|uQ~Ny zUkLIKoSl@|RD&*VK9FDh;;iD>@Ir-l$5tTJB%32;Kkf|HzX9&OJJ@f1GxayLeZVwC zl!z2%SDLRt+tPHX8B1{|b*dBrchu+1A8U4f?p$^AS38)bS@2MsDGZ+zxZA;-!!t00bNGx#>Fu1M>vYY;T$MW-k=Hoar&OtfPOrN&P{>1UT}vTaE1bd^+1SVE?#weSHUO3e*->Oc>p8u1mpRn6CGiJ!Elk zq4yC{*2F_5tbiv|LuDfRh&9h>=IAms+C-9_M=ZrdeO^|V*biqf=MRL%y67W1`DSqO z_43n^6LH-2mK>>hB^h&}8s9&|WZ#XFzI6{0HRygGHauVtHJ~8hw#3RfJ6! zym0~yC-$NRWCF{NAFQ8kmR=jaSu+&4vF2f(itd#J|3JB%1(+Z_ZFTN8`;FiX1?zO8SCDQb$k3B{M$|6HeXjmYeU~oqHIIq#pM}G)3a*n zlH#`&h2j<2nVapp#Ff?1q0u=?dnVCUh74SC_hzF{De})LKC@@HwN!N}LZyCFLqe!_ zwHDQZvholAwFXNam=2NDG^mAH)oXnPgWc5TryMop=J*7I8 zkFoE|HsIKeENpD~J=Yb}@IP1pmm$aD;)CPSqeo*0B*jwE&d;YS4i_$HSUiG_*BI<< zgQBkzzIvvQ8`k@Cfebk{@-4LbK(A~5&}dCsiRa7J8!>Wjn1U)3#w`%QWNEVm)_KE@ z5Eee?`jHNG+S_{M-`3vc!ANsEvM}cT><`(4GuQtL-T5Q(#@~=Of8bln-YoN0NE8{D zc@0hhXxu9YT=u$St5p_(8GhkE=an0xemTjJnKe}j-^+jww(dAqh={~oFLLE(=y{qk zQN)}PO9S7(EIP{jcU;AN*0IyARjs@k633F!Zau$$kk1=kC`oBI7(1}CL1oUuu}sgy zm*>1tz^s>t+=LsO-DZE9EmdUn_1);f@fV&S)QqbbH*k?l60ZVe#h?4bkavQdSm7yi z;)Eo3L^?_4-WT3OQ6Jl7_cJQ;n>SGFXR}p`OO>w2Avq61)N&b>wxowUe`oFx*lx>4 z{2H%Oh@RhTig0Cd%MH=7U9AhdZCu4u?m`<$^6e?i?e(~`l6YZ8Rm(f|T9~LiLuI|Q zr-E;lQ#+4a#e}d(L}9s*2oAhBWkLX4S_1;m2U)8CK_J=4d}onfWEX9&MInq@qoY^wv;zir$DLtf;7e~kJDjW3z2IaiV-u4G z-=sd!VBp&i97?aTUbO1(2n>>ZU6Miy2}vP_M9gWd&gA#Qx9W&IATY(te@KlmB{M1Z zraR|CP*$@`bdU?*2CZEejDy8Ql+!lIXK8`JFbe$*lCa$NQlEITj)>h-aD|Kog*=|* z-}Ke2T_^W_Z1FI4VZ{x2;55!`&2UODfl)j6N}k>Ys<&+1XUj?dd!nR3J*Ow`!;CDv zM1_TcN6(8ccLi?Zca2d6Dmx_t@2FH$C$dhlq{LBZpMExEx9{ash!Fmdw~Av~k-${x zPQ=wJlci-G*H*_VirQ1vPGrxulNT1mr^VU=Q#F%$Lgvz&TQ zD+*~Gw*gh~=QE#p4>sM81Hp!e-MqE;{J5W5dEuWaXm8jWLXkC;_Jz)9O3eE#52l^& z?!fg4O(wEOCz%|Zc~vW9;GF!n-;04mXG*^(qteB1&Dwun-Y;zRaG^4CBB%8ooy7w= zcb?4Pe7!l<%}pXJ}Z4^+nD~fn-P(rgu(& ztfI!@RfjpulsTNGOT(BKh8VE#O1qP?%FSU28S_N8u&6 zJ}&=-X~U^y3pUqy|DEFeZ>zcH2ECBtNs;}jA{rRYJs&79z|?U?g9|eIk)dEB&vm=d zIeSeG^XeUiF$;sJFqu+bxic$$91O6+)EXYnAmsG?+*MdA*Ggl@|^VEZ#nt-CLaV z25#)V|E%APUpIriLDxVP6IQ%NL3(G4Ynh(dPk`ZJiZR|j@Od;LT!FN2F<+vU+^FGK z9f+E#PqMwcOJfQQhG=LFz{wD(i4ZY$s@ir`ecA1rdse8FdJ3+co!AnjSN8dCd$tD< zx`VRjMhxw-Qd_)Rleut-UnUh&Hw~kF|6rP1dcVnu@w^41#@Z%?)}IxQk0s#o?23%V zrNs*h;@E})qrqb1n;bVvpxN)_Gf%=g+m&2E_eioPfl?1WCs5=zAPVQ&;}6^kK8=sR z^7S|Xgcyd^1Caf!^Nawh=Iay%T0jUvronQHmt|D4dY0=Qv`tP?%La~x)}$3T{SE(j zo;&A$J9P|4I2mENgRbvy6!n3cT9QsZ^42C&Of&&OU0|xp%HBa%Q$i6FkHo5~?r6Jk z&*ymlaJoF|4!yL*%jB;K+Bu9AzK&w%%^VNOO8j(yrx7*;-%wj^-O86*K~+TLj1~#$IvCJRngq;LaRgafEf+mf>P%h z3Z~MS2%}cd_f#(n?Hjg2$l~}0j&6z)wJ#5n%q!pJR2O47d*qv76%gRW%JP2_g~bm6-F6R-gq8xBMGMxV-Mz zseZ2ZTHiY4n=c+O`#F$$zsaLV@fm_W(QhGBT|0*YU*+-Q^z8g$a?^vcCqInKy@L$# zi^M7uLl$YQ0|2<@sxeSdz=QtBV>;D5IB@5+){Q1G|gX#U0R zVf6B!rCat>l7=bz1Q=tG?!)c8d+7S4k`ER$FHu6_&m-ig-{5Xk^y;w0DG{s<)xkH6 z%=galB+EnbP0(uFgpMkY7zU=HovzNmB?~$f_bom~4U>^ljGu9J7g+6yxx!3r@ z0cc=-6)kPzaH`)tD#Lrt!c{vve((Dv`g;qh^XffOpLb@AEFKZ`j2@CBZ>-crP*#k8 z3cFoXg*13^xx!$~`V8Snw+|U5II5UG)o2$W*AO8E0=CjIm)o4(59tuY`wxsv9*y0sl?s zy&eZ6T|STIKmXO)-Y;npj}8iy0?<#XN{iQiLqHa>+uOyu&&RoAzKo4#(|7RMQsbOY zfuW!VqRC+6ZFi*(X_Ot{fHjm80Z`1CTW3{AxCiA&&(cqQeQ? zzZ{>{Qm0a?w@MzWK}st51Ix3RWuOjCGdh1Uil(G`@UIlFv{}iGXn~BRoS?xSQNnUy z*QZ>1T%ei4mnIHk6X4(Y+L}CdkafkQPN&el`2hT8X4>Pg;{SFNr;F4KQ-gb8WZROn zeW1_rEdbWVRxr^oDf8#SK(oDo3pcKjthWk?yJSD5#zOa&C3^PfueWp@LIG9M<9TG! zD?iZyQMl+bEhm7=6jEJ?cQR(;|lr`OcpC;-Fm=|FBOekTwNZaj5S^Fpd_4lq7#k3&iI}f4)S1f3law>XA1PzsqUwt`1OKwx!j5W znNy0&e*uXJ&(!6gcE5%qEZp#OeF)#D!L0^?9BC_&qddcHj+{WnydEG&^COT;1@N?H zwmi4-Bbhw6WvsxC<6B7@Hu1^ICLkhD%1bdxr)n^q%epw7M%$1pfVGRPG)3Rftc8 ztG%OZK+=%LZ17J+pAZ$aBX4W_CF)=1%Qq9p@fmus>HXs)`SLm1bDroAUoq76f(554 zRScz%SgLN7;FgK0SYPWNA31Bo0Q*eQ_ovr*hDRrNTdY5U&}SzmcR41CE9=O@l3Gj| z-=J=5nF*(*ib{aq89Nzhm#4YS>h?Kx%+P2$<5sSrLy;_jx&_54t^c0|2ofc#^9{T- z$7m8}rhkLM6w3GBCG{TM4s`#u*QvU@;%CALF~q3=m6KX|4s&EUVPz&a=d5@XkKj{A zQWjy@TE_9dW0Ch35eohv#@ew;%RZn1MozT&*V&Thh-5dB={(#vZMG%<=4c*RxR8`& zq-jiga9KD}ygkO|pi^%K4;BGUzD_dAjqp01-y{ep1Nh7%`5f_Jw}%}fIru@y+h;sYJ%nR zV7|-kS>7pc<}6MzO4X@7b=)E;5I~KIcr;VYj^1&Q(sw7Xn(94uV|65pYrFjO#V4qNU3?;np_W_*sxAub?pIx>w%j`vL&Nubkqc6M-A zlExZz-FB;L=I za?I4V_P}eH3D?3Z^)Q6uZ3cJzPnE8K=RF=uh4;l05|f(;NGGxwwT?<}ps*wsB%_iM zkv5G4MT@yIbkX8Jls=G~{}RSZdV^9qHH*=R&~tspfIrH9*^^Ny_3=P*_|8YXlII1?yfawWQ*OTRXCnH^wyxqP*1^-q7Q zOv3a>FKR*hPXlDR4@PH&=Q|w&=rhQ*W$iymA;!jyN=GpZto~{n;VS(AoM^UIdNqxr zTBMviYf72LJl}fVze25Uww{(Nnh{`sx90F$2o5xAovv|?EhB>MG@Lo&|H?}EG*ixhteGI6Kheu! zoj<7oN<3zg;8>4)7QV)iyO9UjYBS& z?fq*uGtjj)wa(pT26|I>Z<-L^c&hWK1o`EgqzkAR%?Adb^mqWce%0Lz3!rUJqlXR&z$;81Hy_FB&vj%FS05? zzD^LA3*rCvPj*bPydTC)DE`u(mo!yde<%f11?%CzvsRVfhvgb2p}dnFoK^Nf7r^Q* zod?|Xz=MTzW4x`~8qN>6Q@?Do?@LK<1_lDz*NLV+5vJ%SqYsfe5mOv>Ec-o^P;f#$hgX4_<3$EdLO)d)h_L6UopcwvOk(QAHISfrr?3Hw= z{`KeX^%-j&za#n#o(6+LtqoD>IxcXz^5Hv!fC>Ss^z%LFU9Y6z<)xd!)Cu1ONy)M# z_t}V`%aTjK>Wi?Ui&}HLn&9beIYnij7Je;wQAeQfsmO5~lFZPe_2@n^jmUzg}#X2nsA;_x(~e<|}~Ne z_Yn`SZ*(5bY+uW@c|GV9>bAMYsS`AwHazsgZmVW3F_pL=p=55VV>)tH*kLm z7Tp?YuG_8=aXZ$@((`5Y>?Mwv5f5oYjkTiI{9Dewvcgtd(!YvHZ)FS=9k4Z<>E^9< z*75%8jy8ekUWQ&7&Q99REA8cTzi?GyE4N@uoiLRVljz_r(ui|j|M}C7cudKy>e&2a zi#7A+M3eRpW)nRB&M!M>TQZgd3gDD$z(kas@pq|gA-~F!dN{K~GafRXK{#0Lb^R-~ zFLo?purCVy*_YDUylUaM&Mr$y%(4FB_3?9K5(Sz&qw$@l`NGxglt$6R6nRC(DyR*B zPvXgV7Df0ZEB1pXm3iBdzB0?uH^t5RFOoM;>?;*X-}tnS4vaY12nNzPU-pZ)u9KH- zV5tjJMS=>G3&bkL!2`Nljd-+>on7&L>IAu=K&5=7P=uXtc+AJ%BSUy+xtBiTfi|!v zHL4JzZ)##~yO^<*UBymq-8v#+jja z08i?$1>W$C?3-pg%c|orTQfVDzmEu_V}zl7xMNJT>lq`cbR;{`_}`?Qk1n;*qm&Br z`R{Z_pPsoMEFQ_b5GvEd7$amjiro^R?9-UnX!Or{)pAO}HLC|47ecMXEpNppZ5FgZ zV!3Yte7wm|ksa^Go|QbJMhVx{%H%YTa(ACGzpIT1KBL5e^x(<}_eNEBtL>rSaOvyBDD>MAjp@%3K1 zL{8+u$_;`UMO0C98Us6+CZg|3VJU*40?mF9U%;PhV2Zk@;bkr@ZSg&AB?a^+$T&oE-w>c4RImEt;6`rxSB6sHPc z2bt4I37ec5%Ds}g7_F^`+dF=Rh62^f(|OwKHq{V($0HUy`;s6-bJrak1GVt1e73|Ih5?;n?0q9?1&B_8xL&POwMfLA z8ALflMyNz%-nltqP}1nf(|7OnwVhwy?AIF!4SQ@OFgr?C?p2LW1@mpLaavFAe~39N z5%Mm;#%+9AJl;+uHZ#E9X_1ErU0BGMxMWvRET6^I3GGGQHOjx--4u-6I5;?h9}E;= z4O5mA9lJ$S_Vd~}c0JHY_?ocC0VpY-zYA&VeG{J*4w!$dEkbmx!+;;#Ox!rE^7;++ zeG4zp;Z#RAI|dB>{MS3#OH#tJIyG_Y?C)|h@OuXcg80JEpoYkKp;0l>M=N5bw*qvM*VQlR6IbXS^acao*LT(KD_l##xyE{ z$KulLf7o_e+XZX!Jj%p+K&AKCCb!P*KKGbj3!U)=DW+HAq^W(`ryxWB>|h3ZI-}ubyYt69Sf~@zV|A5QZhmIbHUTV z=#z-yB3G^GeV6V+tMC>bI3k56^Qj@OP`pJ3A8=&5%f~7vTP-!|#6Qh+Db(zswzOm^ z!016%{z28Z(vr-rHc~@qKZ=mDmZI_~^Svp%up7FH>wZ+a_aGAQhMrk@STo7L;sfBS?O!ZXHz7fUW|B6`^_voxF{ ztzjmHCSx<5K4dIK(m)|Ds=d8RhyMqz4g*4fYw+o3;KwauT_W;))U$1_9~F^Lc#Sxx zzPEQ;EhOE5@RHjN9r+V<@BBe~G-rNEb#K^lCq?B}>czS1?%R}Cy0k|vM5$=8E2tBJ zrz0+(L?S8P1#b576=&;4~xK0Vz%j}uXrRFoGK z9#$LKB(-oG9i8LEa(sh2&^FAt%Q@P=L4iRbuOGZ_!&*5ZUWJue${@HZfh%81=nQfL zE~+Q@HlqfSmo%ACcOwvVr@%<3Q^8S^i&Q8&?Z=eWb+XIkUc(2F*1&OAK&TWsmrC^Y zoAFX!qaq;%CqPuLr#q1volEOMkt%X_cAghqjAW(hXc1t2J!HFk=^BV;B2rFvlb9T?>5wg|HA#8|4>t#cQ7FQsK*}oe4_^O-(X63R}dSI%-inG2I?WX zT_GYT)Y`nI;fGIw$xZDNy+UsJLK6`9?HmuUp7~|3h9?;!*Au<4y8U9^DihZqp*1I* zj^m|bYQb_8Bta8JM7g*gy^7|Co-Vd34iXvmJC_`<=X>^>=7U4dC{G^RuSGBfO5Jm* zmcjCPCXA_wjfcF!q!uQ`b*?w~+?j;~oQo$GqNOy4;NNjYBq;C>l7K{S9crh`1PH6LgdK6#`pVKyKzJmdS_$5A$XtgWbOYg{Y)3V++73p*GlmiS^}ZcR+D zZtwgfVf5qOxXOp}< zu52Z(I!z9h-ino$=J#f0+b^OXttMp(+NiB8p0Op~(0EgxwDN55esaIoD6#zai>?YU zo=g`NReyO+8EfnEFZ96HM>$p0sesJPhWK$jUzi2|U(M^&WndIX(`y0|+^p)sx^Ae{ zkx!IHAFaamp?k_2D{I~uz?`LCt^CpB$B2)1Vk9>$le!DnfUMeyzTjSsEBlzI^;~P zhksM{B`&Rtn3&+-mEP?;{x{1jOZXl@KaqP#`z97WqMMc&bGc<{49UEYFE+jn z?(2ux+Rd&7(Jd7yKsi9v$`}bkTgh$YXa6t>z+zI6D4Xa8cjp)3#q|hz4?kTXUNM_- z-LdZ*&p}aa27l`3RBH{gJUE`DbgTZ#$Yh-js7J`7lX{!2jk@UWT<5pmfh(;rR%-lyR4vYlAES z>Upr?Z16p^yQ!vv=Y$iucR&dAT<=SVT_oP+E(JRZxaWZ+R}BnfVcJouR_fN#PD%3pxF)J%t^u#E{TpYkIfbAJhZJ} z%i7{{vyGDMEpqt85YGaV$LgjO#U=9MoqJm!<+IWQz=Y74&vylLBRf5j+imJ ztg~YU7UgK{XU!})kyNm(0n$X@r8efcx~!PVpWI_?i2^PNGNe$$9CrgpzLJ>r*iBR{ z9`juyqD@v2cpm!r; z7LK+k&x`&2R@<;r?6!G4m>RQh%4==B8Tyf$R5-pN6W1zUAu=uNMO*r`ajjg< z9LQA1dF2OQ0vK^nSV*O~TMiY>-T=Z3gR8T~>)y=O8idi8>Cr#9f5^Eyr5jknpA6SG zo3zT)n>|)i@n?&V1xUp(v3ejQ(D+X14i&M#Nz_oIYMV#@&MmV~N70&r3wvh?EuL08 zG}EZjuqlIF8dtUcFnjg+`{ZI4bCp83`<SfnE#H^WvpejK1dY}Of_IW zAk}*sq)Q1V_JgPp=&DWU9!1Hw#%KF0ToSubY;4CGCz>xvVNJ>ZL8?s|3!g(MT~E{t zGPB;VnxgioQ5R9%g8(r(3dj9~^Q5Wv#|K(5D(bUHD@}F&+P#7Ed`X3bfSqdW(J9 z=9#N?!ePwi89OmlHx+@c&sq-;k#}aEPBt0}^LN}!@~>~C4y^o*5YQ@7n_3{{@-=T( z#YJ_-xGI$HFCMUbpOub7nj?`EyK_gmT290enbIBZvm<<-@i<*#EEb)7O!)cJ0Z2e5 z5mWk{2_`);t4BqTzNG4#Pbs~31iIcsFyrhga`hx%cA+L+Grp0k;3hsdDGJ>ja!7W# zlIA!|C$>w?QU=Y(L#||K>(TXmarK-`?`!pN`VPR3iDb4fbg8EAc7az32mabUncvQ` zcpD54khxQEL6&hHQvLn&+8Xb{_{xWvsDY~v$1?K`zLcj=&URr=_aHx2eRh@ZY27sY z`m#}wJVcW#SEuSSYUPFuOsNL>Rt2OO>6EB zpSAjw44AX?Z}9aVUirQ0{$(2q?fvVggEM+Rxj2us-rt`sF_sV(W@juoa`Ub=dlpkd z5>5x~{J7Pyr1iGAWw5IrN)*uJ@n!I$oO_Q0$jnv(^a~``G_6N7cXryXjSJgX3pBSx ze!U3B`>Y;pZ9e2MfA`+&bAY-TBY-}1t_Bd%-L+}=W*&1}9S8>;xww6x!;B|ggz4v2{!|4R1RhlCx4$r2$8Y{9&Vg%8G^@Tl zM5cPr3Z;Gy4SU84SQ>e-Kg~n0s>2__exQ-t&k@eIe!{x?uLDp!Hhfy;_2z%-)#0vo zvucyzr54n^UMW{TJpmP*sDL=bRIjNPKr~@K&n6Kfw=gnD8c`WGqs}?l@9t?w?oh(n(M|mIl()!G zB?ElqbXo~0Ur#K(+4lyj9IOa%h-(9inw3RsIS)^38 zjk=4S@Je9659R^>iJzZ%yNw|mB6sS81MeYc)fUC1{+9x*rlp7I8pBP1 z=B1_d9IWGEJs>}H)+A5A#@{i@t_5inOGEp$Kex#Vtg_j3WuZ0Hg5mnSv&ga3Mw@VyLsV~>MT@um%@HN z$NkK5_+z^Gp`jhO8ALaUqkM{-gS7D#>OE_Js@zab5t$Z*)~!&Yh#c4xMUo**%Yh)O zU(<_Ul5eq8ufE{%3{$l)CtWQPKb+|7V-`nOio0uua^Sruy2FX{TqnhVcQbZC$<+zC zncq$F?@^;Pd;<)Vy^f`>VgZr7`~!ZWMOsjDvId6u!RUkGUe+ zI@pVSWy}^;abg#+pIwlnLD$`<1p2DJchMp|2A_q*8aP}hKg()m>`@rCp6#EJ&Ig4@ zvq|oWqSRh4Pg~U+Sqo4tJubGi%1iXNs3JK0e-?mkWbMw6Zk@c!?AW~g_>xy^*nUXn zJMV99p8z*ih6`(*I|Gcku;JF1Wa4NgYT1&UeyNkM-Gvb_<}g3sER!{ax^h?qfEQ8bymnFi22niVxi))>U| zf}hrsq6Nym6gH#Nna;_@{yKa&6l?| +5#wHDa!uUgfo{mi7+?hBDy)7cj(*A2Ea zzMx7){CDVyQfTtSz(RW5uQ@ItYETopGj?JJ-^Y;Z90(H$u`ZA!TajNMh!ci)*GCMN^wn5ELMn4^G$Fr-KlKc{eZB4 zat{2%sZ9yUWMMp_Dv8BUT%v)qNa*3|);2|UUdoy&GpVnwvm!Ibcki&RFVN7?<(5iu z1tT7OcD7cU6;f3F*Ua^e#EI<>5f7Q8@i(y;1}p!t(~^OzyQKwKGK|cF_Ntu!wCJ-E zV*MTFo!HqS)(vy0TxbeXznH*T)v_G$gTay$C-h00no5g*movVcL~}oMA-^hFh<)ZZ zWNxuQ01ZZt;FxUkri3HEW8rk@1MDMk(UBUs^WO;MsB zZOT5omf4;dgC&z`0@vKW5F$v^wpC_!G#NP|R)`YK<|`aseGF&jy*qyr(3L$@wkZ(1 zBmE!u&Nk4uXrL-g*?9nx+*7_u`26ubsLk!1F+>NFv5;%M-fZ6kB(l~zmvSLro)IP= zXwoq;Le$Cx6_fytRbEZbZ&H(4>Gwi`(>_A%a+(weHTcN~3zL&n8m%cbx6yUIZ>PW6 zYap0zU8f6WY>;JdEo$1dE{8Y?)fBPgB{zy_rY26;b}W-2DY}GbD&^c{`=U50*f4ld z%Hn#z>JeYW5V89)qw623wPI9wi3Y2JW)*KD`iZ-+HDcLtwLfBD@ZbM+ zNZwk7DBRMsKg+gc9o5J>k+_ZYCeAG8j4zWxDlcSi#a>iVYgOH67x+J#&ij$d|NY}- zMcHJptdPC;-W(E&a+K}Z;~aZr9W&d(u}5Z+L&pqR2gg3V4@vgU3L(_@{`~O$3moU% z<9c1!^Ljk?Z}ShFu~S7&P~tcQzV!*Y)@H7$yD^SSffE8RHl2L6_q^2eo{2Aff1&Fo zsI9w;%gFqjMlTwyZNUAG&P!A@?~0?mRI=bI+j>Cl-=>lcW`hauxcRnHz^bEf>u;*J zmze%c^tdeFBy0D-^+3|I*lyEBDrL1J0Ip3=Xl-^1HD2J5vcYlHE0Gv%ep&{sD3y?j z&B6OxS-X1yH(EIqYB$G(nY=#pjlnjYZEamcffUB=7^*O3Zwt{{6e%pxvsS=9t&Djd z4eV>TrS?k*4zp%V&5~*rEX?Xvx$K0RR5MM (U9 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 diff --git a/src/entities/Camera.java b/src/entities/Camera.java index d171751..e50a1d2 100644 --- a/src/entities/Camera.java +++ b/src/entities/Camera.java @@ -1,5 +1,6 @@ package entities; +import org.atriaSoft.etk.math.Matrix4f; import org.atriaSoft.etk.math.Vector3f; import renderEngine.DisplayManager; @@ -39,6 +40,7 @@ public class Camera { } + private float calculateHorizontalDistance() { return (float) (distanceFromPlayer * Math.cos(pitch)); } diff --git a/src/objConverter/OBJFileLoader.java b/src/objConverter/OBJFileLoader.java index b9271f7..8462df0 100644 --- a/src/objConverter/OBJFileLoader.java +++ b/src/objConverter/OBJFileLoader.java @@ -18,7 +18,7 @@ public class OBJFileLoader { public static ModelData loadOBJ(String objFileName) { FileReader isr = null; - File objFile = new File(RES_LOC + objFileName + ".obj"); + File objFile = new File(objFileName); try { isr = new FileReader(objFile); } catch (FileNotFoundException e) { diff --git a/src/org/atriaSoft/etk/math/Matrix4f.java b/src/org/atriaSoft/etk/math/Matrix4f.java index fc1d02d..7db2c8b 100644 --- a/src/org/atriaSoft/etk/math/Matrix4f.java +++ b/src/org/atriaSoft/etk/math/Matrix4f.java @@ -3,7 +3,7 @@ package org.atriaSoft.etk.math; import java.nio.FloatBuffer; public class Matrix4f { - private float[] mat = new float[4*4]; //!< matrix data + public float[] mat = new float[4*4]; //!< matrix data /** * @brief configure identity of the matrix */ diff --git a/src/org/atriaSoft/etk/math/Transform3D.java b/src/org/atriaSoft/etk/math/Transform3D.java index baf3462..bf540c4 100644 --- a/src/org/atriaSoft/etk/math/Transform3D.java +++ b/src/org/atriaSoft/etk/math/Transform3D.java @@ -2,11 +2,27 @@ package org.atriaSoft.etk.math; public class Transform3D { protected Vector3f position; //! Position + public Vector3f getPosition() { + return position; + } + public void setPosition(Vector3f position) { + this.position = position; + } + public Quaternion getOrientation() { + return orientation; + } + public void setOrientation(Quaternion orientation) { + this.orientation = orientation; + } protected Quaternion orientation; //!< Orientation public Transform3D() { this.position = Vector3f.zero(); this.orientation = Quaternion.identity(); } + public Transform3D(Vector3f position) { + this.position = position.clone(); + this.orientation = Quaternion.identity(); + } public Transform3D(Vector3f position, Matrix3f orientation) { this.position = position.clone(); this.orientation = new Quaternion(orientation); @@ -39,24 +55,43 @@ public class Transform3D { this.position.setValue(matrix[12], matrix[13], matrix[14]); } /// Get the OpenGL matrix of the transform - public void getOpenGLMatrix(float[] matrix) { + public Matrix4f getOpenGLMatrix() { + Matrix4f out = new Matrix4f(); Matrix3f tmpMatrix = this.orientation.getMatrix(); - matrix[0] = tmpMatrix.mat[0]; - matrix[1] = tmpMatrix.mat[3]; - matrix[2] = tmpMatrix.mat[6]; - matrix[3] = 0.0f; - matrix[4] = tmpMatrix.mat[1]; - matrix[5] = tmpMatrix.mat[4]; - matrix[6] = tmpMatrix.mat[7]; - matrix[7] = 0.0f; - matrix[8] = tmpMatrix.mat[2]; - matrix[9] = tmpMatrix.mat[5]; - matrix[10] = tmpMatrix.mat[8]; - matrix[11] = 0.0f; - matrix[12] = this.position.x; - matrix[13] = this.position.y; - matrix[14] = this.position.z; - matrix[15] = 1.0f; + // version transposer... +// out.mat[0] = tmpMatrix.mat[0]; +// out.mat[1] = tmpMatrix.mat[3]; +// out.mat[2] = tmpMatrix.mat[6]; +// out.mat[3] = 0.0f; +// out.mat[4] = tmpMatrix.mat[1]; +// out.mat[5] = tmpMatrix.mat[4]; +// out.mat[6] = tmpMatrix.mat[7]; +// out.mat[7] = 0.0f; +// out.mat[8] = tmpMatrix.mat[2]; +// out.mat[9] = tmpMatrix.mat[5]; +// out.mat[10] = tmpMatrix.mat[8]; +// out.mat[11] = 0.0f; +// out.mat[12] = this.position.x; +// out.mat[13] = this.position.y; +// out.mat[14] = this.position.z; +// out.mat[15] = 1.0f; + out.mat[0] = tmpMatrix.mat[0]; + out.mat[1] = tmpMatrix.mat[1]; + out.mat[2] = tmpMatrix.mat[2]; + out.mat[3] = this.position.x; + out.mat[4] = tmpMatrix.mat[3]; + out.mat[5] = tmpMatrix.mat[4]; + out.mat[6] = tmpMatrix.mat[5]; + out.mat[7] = this.position.y; + out.mat[8] = tmpMatrix.mat[6]; + out.mat[9] = tmpMatrix.mat[7]; + out.mat[10] = tmpMatrix.mat[8]; + out.mat[11] = this.position.z; + out.mat[12] = 0.0f; + out.mat[13] = 0.0f; + out.mat[14] = 0.0f; + out.mat[15] = 1.0f; + return out; } /// Return the inverse of the transform public Transform3D inverse_new() { @@ -66,8 +101,8 @@ public class Transform3D { } /// Return an interpolated transform public Transform3D interpolateTransforms(Transform3D old, - Transform3D newOne, - float interpolationFactor) { + Transform3D newOne, + float interpolationFactor) { Vector3f interPosition = old.position.multiply_new(1.0f - interpolationFactor) .add(newOne.position.multiply_new(interpolationFactor)); Quaternion interOrientation = Quaternion.slerp(old.orientation, @@ -108,4 +143,7 @@ public class Transform3D { public String toString() { return "Transform3D(" + this.position + " & " + this.orientation + ")"; } + public void applyRotation(Quaternion rotation) { + this.orientation = this.orientation.multiply(rotation); + } } diff --git a/src/org/atriaSoft/gale/Application.java b/src/org/atriaSoft/gale/Application.java index 976fac6..4f4112c 100644 --- a/src/org/atriaSoft/gale/Application.java +++ b/src/org/atriaSoft/gale/Application.java @@ -5,10 +5,10 @@ import org.atriaSoft.etk.math.Vector2f; import org.atriaSoft.gale.context.ClipboardList; import org.atriaSoft.gale.context.Context; import org.atriaSoft.gale.context.Cursor; -import org.atriaSoft.gale.key.Keyboard; -import org.atriaSoft.gale.key.Special; -import org.atriaSoft.gale.key.Status; -import org.atriaSoft.gale.key.Type; +import org.atriaSoft.gale.key.KeyKeyboard; +import org.atriaSoft.gale.key.KeySpecial; +import org.atriaSoft.gale.key.KeyStatus; +import org.atriaSoft.gale.key.KeyType; public class Application { public boolean canDraw = false; @@ -113,10 +113,11 @@ public class Application { * @param[in] pos Position of the event (can be <0 if out of window). * @param[in] state Key state (up/down/move) */ - public void onPointer(Type type, - int pointerID, - Vector2f pos, - Status state) { + public void onPointer(KeySpecial special, + KeyType type, + int pointerID, + Vector2f pos, + KeyStatus state) { } /** @@ -126,10 +127,10 @@ public class Application { * @param[in] value Unicode value of the char pushed (viable only if type==gale::key::keyboard::character). * @param[in] state State of the key (up/down/upRepeate/downRepeate) */ - public void onKeyboard(Special special, - Keyboard type, + public void onKeyboard(KeySpecial special, + KeyKeyboard type, Character value, - Status state) { + KeyStatus state) { } /** diff --git a/src/org/atriaSoft/gale/context/Context.java b/src/org/atriaSoft/gale/context/Context.java index bc4eb07..962985f 100644 --- a/src/org/atriaSoft/gale/context/Context.java +++ b/src/org/atriaSoft/gale/context/Context.java @@ -12,10 +12,10 @@ import org.atriaSoft.gale.Log; import org.atriaSoft.gale.Orientation; import org.atriaSoft.gale.backend3d.OpenGL; import org.atriaSoft.gale.resource.ResourceManager; -import org.atriaSoft.gale.key.Keyboard; -import org.atriaSoft.gale.key.Special; -import org.atriaSoft.gale.key.Status; -import org.atriaSoft.gale.key.Type; +import org.atriaSoft.gale.key.KeyKeyboard; +import org.atriaSoft.gale.key.KeySpecial; +import org.atriaSoft.gale.key.KeyStatus; +import org.atriaSoft.gale.key.KeyType; interface ActionToDoInAsyncLoop { public void run(Context context); @@ -250,45 +250,47 @@ public abstract class Context { // } // } - public void OS_SetInput( Type type, - Status status, - int pointerID, - Vector2f pos){ + public void OS_SetInput(KeySpecial special, + KeyType type, + KeyStatus status, + int pointerID, + Vector2f pos){ postAction((context)->{ Application appl = context.getApplication(); if (appl == null) { return; } - appl.onPointer(type, - pointerID, - pos, - status); + appl.onPointer(special, + type, + pointerID, + pos, + status); }); } - public void OS_setKeyboard( Special special, - Keyboard type, - Status state, + public void OS_setKeyboard( KeySpecial special, + KeyKeyboard type, + KeyStatus state, boolean isARepeateKey) { OS_setKeyboard(special, type, state, isARepeateKey, (char)0); } - public void OS_setKeyboard( Special special, - Keyboard type, - Status state, + public void OS_setKeyboard( KeySpecial special, + KeyKeyboard type, + KeyStatus state, boolean isARepeateKey, Character charValue) { - Status tmpState = state; + KeyStatus tmpState = state; if (isARepeateKey == true) { - if (tmpState == Status.down) { - tmpState = Status.downRepeate; + if (tmpState == KeyStatus.down) { + tmpState = KeyStatus.downRepeate; } else { - tmpState = Status.upRepeate; + tmpState = KeyStatus.upRepeate; } } OS_setKeyboard2(special, type, state, charValue); } - public void OS_setKeyboard2( Special special, - Keyboard type, - Status state, + public void OS_setKeyboard2( KeySpecial special, + KeyKeyboard type, + KeyStatus state, Character charValue){ postAction((context)->{ Application appl = context.getApplication(); diff --git a/src/org/atriaSoft/gale/context/LWJGL/ContextLWJGL.java b/src/org/atriaSoft/gale/context/LWJGL/ContextLWJGL.java index ec9ac1a..358904e 100644 --- a/src/org/atriaSoft/gale/context/LWJGL/ContextLWJGL.java +++ b/src/org/atriaSoft/gale/context/LWJGL/ContextLWJGL.java @@ -17,10 +17,10 @@ import org.atriaSoft.etk.math.Vector2f; import org.atriaSoft.gale.Application; import org.atriaSoft.gale.Fps; import org.atriaSoft.gale.context.Context; -import org.atriaSoft.gale.key.Keyboard; -import org.atriaSoft.gale.key.Special; -import org.atriaSoft.gale.key.Status; -import org.atriaSoft.gale.key.Type; +import org.atriaSoft.gale.key.KeyKeyboard; +import org.atriaSoft.gale.key.KeySpecial; +import org.atriaSoft.gale.key.KeyStatus; +import org.atriaSoft.gale.key.KeyType; import org.atriaSoft.gameEngine.Log; import org.lwjgl.Version; import org.lwjgl.glfw.GLFWErrorCallback; @@ -55,7 +55,7 @@ public class ContextLWJGL extends Context { // The window handle private long window = 0; - private Special guiKeyBoardMode = new Special(); + private KeySpecial guiKeyBoardMode = new KeySpecial(); public ContextLWJGL(Application application, String[] args) { super(application, args); @@ -94,37 +94,6 @@ public class ContextLWJGL extends Context { glfwTerminate(); glfwSetErrorCallback(null).free(); } - private static boolean valueS = false; - private static boolean valueZ = false; - private static boolean valueQ = false; - private static boolean valueD = false; - private static boolean valueA = false; - private static boolean valueW = false; - private static boolean valueSPACE = false; - public static boolean isKeyDown(char value) { - if (value == 's') { - return valueS; - } - if (value == 'z') { - return valueZ; - } - if (value == 'q') { - return valueQ; - } - if (value == 'd') { - return valueD; - } - if (value == 'w') { - return valueW; - } - if (value == 'a') { - return valueA; - } - if (value == ' ') { - return valueSPACE; - } - return false; - } private void initWindows() { // Setup an error callback. The default implementation @@ -212,30 +181,30 @@ public class ContextLWJGL extends Context { private void keyCallback(long window, int key, int scancode, int action, int mods) { boolean find = true; boolean thisIsAReapeateKey = false; // TODO detect this ... - Keyboard keyInput = Keyboard.unknow; + KeyKeyboard keyInput = KeyKeyboard.unknow; Log.error("keyboard input " + key + " " + scancode); switch (key) { - //case 80: // keypad - case GLFW_KEY_UP: keyInput = Keyboard.up; break; - //case 83: // keypad - case GLFW_KEY_LEFT: keyInput = Keyboard.left; break; - //case 85: // keypad - case GLFW_KEY_RIGHT: keyInput = Keyboard.right; break; - //case 88: // keypad - case GLFW_KEY_DOWN: keyInput = Keyboard.down; break; - //case 81: // keypad - case GLFW_KEY_PAGE_UP: keyInput = Keyboard.pageUp; break; - //case 89: // keypad - case GLFW_KEY_PAGE_DOWN: keyInput = Keyboard.pageDown; break; - //case 79: // keypad - case GLFW_KEY_HOME: keyInput = Keyboard.start; break; - //case 87: // keypad - case GLFW_KEY_END: keyInput = Keyboard.end; break; - case GLFW_KEY_PRINT_SCREEN: keyInput = Keyboard.stopDefil; break; - case GLFW_KEY_PAUSE: keyInput = Keyboard.wait; break; - //case 90: // keypad + //case 328: // keypad + case GLFW_KEY_UP: keyInput = KeyKeyboard.up; break; + //case 324: // keypad + case GLFW_KEY_LEFT: keyInput = KeyKeyboard.left; break; + //case 326: // keypad + case GLFW_KEY_RIGHT: keyInput = KeyKeyboard.right; break; + //case 323: // keypad + case GLFW_KEY_DOWN: keyInput = KeyKeyboard.down; break; + case 329: // keypad + case GLFW_KEY_PAGE_UP: keyInput = KeyKeyboard.pageUp; break; + case 323: // keypad + case GLFW_KEY_PAGE_DOWN: keyInput = KeyKeyboard.pageDown; break; + case 327: // keypad + case GLFW_KEY_HOME: keyInput = KeyKeyboard.start; break; + case 321: // keypad + case GLFW_KEY_END: keyInput = KeyKeyboard.end; break; + case GLFW_KEY_PRINT_SCREEN: keyInput = KeyKeyboard.stopDefil; break; + case GLFW_KEY_PAUSE: keyInput = KeyKeyboard.wait; break; + case 320: // keypad case GLFW_KEY_INSERT: - keyInput = Keyboard.insert; + keyInput = KeyKeyboard.insert; if(action == GLFW_RELEASE) { if (guiKeyBoardMode.getInsert() == true) { guiKeyBoardMode.setInsert(false); @@ -245,54 +214,54 @@ public class ContextLWJGL extends Context { } break; //case 84: keyInput = KeyboardCenter; break; // Keypad - case GLFW_KEY_F1: keyInput = Keyboard.f1; break; - case GLFW_KEY_F2: keyInput = Keyboard.f2; break; - case GLFW_KEY_F3: keyInput = Keyboard.f3; break; - case GLFW_KEY_F4: keyInput = Keyboard.f4; break; - case GLFW_KEY_F5: keyInput = Keyboard.f5; break; - case GLFW_KEY_F6: keyInput = Keyboard.f6; break; - case GLFW_KEY_F7: keyInput = Keyboard.f7; break; - case GLFW_KEY_F8: keyInput = Keyboard.f8; break; - case GLFW_KEY_F9: keyInput = Keyboard.f9; break; - case GLFW_KEY_F10: keyInput = Keyboard.f10; break; - case GLFW_KEY_F11: keyInput = Keyboard.f11; break; - case GLFW_KEY_F12: keyInput = Keyboard.f12; break; - case GLFW_KEY_CAPS_LOCK: keyInput = Keyboard.capLock; guiKeyBoardMode.setCapsLock (action == GLFW_PRESS); break; - case GLFW_KEY_LEFT_SHIFT: keyInput = Keyboard.shiftLeft; guiKeyBoardMode.setShiftLeft (action == GLFW_PRESS); break; - case GLFW_KEY_RIGHT_SHIFT: keyInput = Keyboard.shiftRight; guiKeyBoardMode.setShiftRight(action == GLFW_PRESS); break; - case GLFW_KEY_LEFT_CONTROL: keyInput = Keyboard.ctrlLeft; guiKeyBoardMode.setCtrlLeft (action == GLFW_PRESS); break; - case GLFW_KEY_RIGHT_CONTROL: keyInput = Keyboard.ctrlRight; guiKeyBoardMode.setCtrlRight (action == GLFW_PRESS); break; - case GLFW_KEY_LEFT_SUPER: keyInput = Keyboard.metaLeft; guiKeyBoardMode.setMetaLeft (action == GLFW_PRESS); break; - case GLFW_KEY_RIGHT_SUPER: keyInput = Keyboard.metaRight; guiKeyBoardMode.setMetaRight (action == GLFW_PRESS); break; - case GLFW_KEY_LEFT_ALT: keyInput = Keyboard.altLeft; guiKeyBoardMode.setAltLeft (action == GLFW_PRESS); break; - case GLFW_KEY_RIGHT_ALT: keyInput = Keyboard.altRight; guiKeyBoardMode.setAltRight (action == GLFW_PRESS); break; - case GLFW_KEY_MENU: keyInput = Keyboard.contextMenu; break; - case GLFW_KEY_NUM_LOCK: keyInput = Keyboard.numLock; guiKeyBoardMode.setNumLock (action == GLFW_PRESS); break; + case GLFW_KEY_F1: keyInput = KeyKeyboard.f1; break; + case GLFW_KEY_F2: keyInput = KeyKeyboard.f2; break; + case GLFW_KEY_F3: keyInput = KeyKeyboard.f3; break; + case GLFW_KEY_F4: keyInput = KeyKeyboard.f4; break; + case GLFW_KEY_F5: keyInput = KeyKeyboard.f5; break; + case GLFW_KEY_F6: keyInput = KeyKeyboard.f6; break; + case GLFW_KEY_F7: keyInput = KeyKeyboard.f7; break; + case GLFW_KEY_F8: keyInput = KeyKeyboard.f8; break; + case GLFW_KEY_F9: keyInput = KeyKeyboard.f9; break; + case GLFW_KEY_F10: keyInput = KeyKeyboard.f10; break; + case GLFW_KEY_F11: keyInput = KeyKeyboard.f11; break; + case GLFW_KEY_F12: keyInput = KeyKeyboard.f12; break; + case GLFW_KEY_CAPS_LOCK: keyInput = KeyKeyboard.capLock; guiKeyBoardMode.setCapsLock (action == GLFW_PRESS); break; + case GLFW_KEY_LEFT_SHIFT: keyInput = KeyKeyboard.shiftLeft; guiKeyBoardMode.setShiftLeft (action == GLFW_PRESS); break; + case GLFW_KEY_RIGHT_SHIFT: keyInput = KeyKeyboard.shiftRight; guiKeyBoardMode.setShiftRight(action == GLFW_PRESS); break; + case GLFW_KEY_LEFT_CONTROL: keyInput = KeyKeyboard.ctrlLeft; guiKeyBoardMode.setCtrlLeft (action == GLFW_PRESS); break; + case GLFW_KEY_RIGHT_CONTROL: keyInput = KeyKeyboard.ctrlRight; guiKeyBoardMode.setCtrlRight (action == GLFW_PRESS); break; + case GLFW_KEY_LEFT_SUPER: keyInput = KeyKeyboard.metaLeft; guiKeyBoardMode.setMetaLeft (action == GLFW_PRESS); break; + case GLFW_KEY_RIGHT_SUPER: keyInput = KeyKeyboard.metaRight; guiKeyBoardMode.setMetaRight (action == GLFW_PRESS); break; + case GLFW_KEY_LEFT_ALT: keyInput = KeyKeyboard.altLeft; guiKeyBoardMode.setAltLeft (action == GLFW_PRESS); break; + case GLFW_KEY_RIGHT_ALT: keyInput = KeyKeyboard.altRight; guiKeyBoardMode.setAltRight (action == GLFW_PRESS); break; + case GLFW_KEY_MENU: keyInput = KeyKeyboard.contextMenu; break; + case GLFW_KEY_NUM_LOCK: keyInput = KeyKeyboard.numLock; guiKeyBoardMode.setNumLock (action == GLFW_PRESS); break; case GLFW_KEY_DELETE: // Suppr on keypad find = false; if(guiKeyBoardMode.getNumLock() == true){ OS_setKeyboard(guiKeyBoardMode, - Keyboard.character, - (action == GLFW_PRESS?Status.down:Status.up), + KeyKeyboard.character, + (action == GLFW_PRESS?KeyStatus.down:KeyStatus.up), thisIsAReapeateKey, '.'); if (thisIsAReapeateKey == true) { OS_setKeyboard(guiKeyBoardMode, - Keyboard.character, - (action != GLFW_PRESS?Status.down:Status.up), + KeyKeyboard.character, + (action != GLFW_PRESS?KeyStatus.down:KeyStatus.up), thisIsAReapeateKey, '.'); } } else { OS_setKeyboard(guiKeyBoardMode, - Keyboard.character, - (action == GLFW_PRESS?Status.down:Status.up), + KeyKeyboard.character, + (action == GLFW_PRESS?KeyStatus.down:KeyStatus.up), thisIsAReapeateKey, (char)0x7F); if (thisIsAReapeateKey == true) { OS_setKeyboard(guiKeyBoardMode, - Keyboard.character, - (action != GLFW_PRESS?Status.down:Status.up), + KeyKeyboard.character, + (action != GLFW_PRESS?KeyStatus.down:KeyStatus.up), thisIsAReapeateKey, (char)0x7F); } @@ -301,14 +270,14 @@ public class ContextLWJGL extends Context { case GLFW_KEY_TAB: // special case for TAB find = false; OS_setKeyboard(guiKeyBoardMode, - Keyboard.character, - (action == GLFW_PRESS?Status.down:Status.up), + KeyKeyboard.character, + (action == GLFW_PRESS?KeyStatus.down:KeyStatus.up), thisIsAReapeateKey, (char)0x09); if (thisIsAReapeateKey == true) { OS_setKeyboard(guiKeyBoardMode, - Keyboard.character, - (action!=GLFW_PRESS?Status.down:Status.up), + KeyKeyboard.character, + (action!=GLFW_PRESS?KeyStatus.down:KeyStatus.up), thisIsAReapeateKey, (char)0x09); } @@ -346,14 +315,14 @@ public class ContextLWJGL extends Context { tmpKey += (int)'A' - (int)'a'; } OS_setKeyboard(guiKeyBoardMode, - Keyboard.character, - (action==GLFW_PRESS?Status.down:Status.up), + KeyKeyboard.character, + (action==GLFW_PRESS?KeyStatus.down:KeyStatus.up), thisIsAReapeateKey, (char)tmpKey); if (thisIsAReapeateKey == true) { OS_setKeyboard(guiKeyBoardMode, - Keyboard.character, - (action!=GLFW_PRESS?Status.down:Status.up), + KeyKeyboard.character, + (action!=GLFW_PRESS?KeyStatus.down:KeyStatus.up), thisIsAReapeateKey, (char)tmpKey); } @@ -376,14 +345,14 @@ public class ContextLWJGL extends Context { // tmpKey += (int)'A' - (int)'a'; // } OS_setKeyboard(guiKeyBoardMode, - Keyboard.character, - (action==GLFW_PRESS?Status.down:Status.up), + KeyKeyboard.character, + (action==GLFW_PRESS?KeyStatus.down:KeyStatus.up), thisIsAReapeateKey, (char)tmpKey); if (thisIsAReapeateKey == true) { OS_setKeyboard(guiKeyBoardMode, - Keyboard.character, - (action!=GLFW_PRESS?Status.down:Status.up), + KeyKeyboard.character, + (action!=GLFW_PRESS?KeyStatus.down:KeyStatus.up), thisIsAReapeateKey, (char)tmpKey); } @@ -438,12 +407,12 @@ public class ContextLWJGL extends Context { if (find == true) { OS_setKeyboard(guiKeyBoardMode, keyInput, - (action == GLFW_PRESS?Status.down:Status.up), + (action == GLFW_PRESS?KeyStatus.down:KeyStatus.up), thisIsAReapeateKey); if (thisIsAReapeateKey == true) { OS_setKeyboard(guiKeyBoardMode, keyInput, - (action!=GLFW_PRESS?Status.down:Status.up), + (action!=GLFW_PRESS?KeyStatus.down:KeyStatus.up), thisIsAReapeateKey); } } @@ -459,8 +428,9 @@ public class ContextLWJGL extends Context { for (int iii=0; iii0) { inputIsPressed[4] = true; - OS_SetInput(Type.mouse, - Status.down, + OS_SetInput(guiKeyBoardMode,KeyType.mouse, + KeyStatus.down, 4, cursorPos); inputIsPressed[4] = false; - OS_SetInput(Type.mouse, - Status.up, + OS_SetInput(guiKeyBoardMode,KeyType.mouse, + KeyStatus.up, 4, cursorPos); } } private void mouseCallback(long window, int button, int action, int mods) { if (action == GLFW_PRESS) { +// Log.info("mouse value: GLFW_PRESS " + action + " bt=" + button); if (button < MAX_MANAGE_INPUT) { inputIsPressed[button] = true; } - OS_SetInput(Type.mouse, - Status.down, + OS_SetInput(guiKeyBoardMode,KeyType.mouse, + KeyStatus.down, button, cursorPos); } else if (action == GLFW_RELEASE) { +// Log.info("mouse value: GLFW_RELEASE" + action + " bt=" + button); leftButtonStateDown = false; if (button < MAX_MANAGE_INPUT) { inputIsPressed[button] = false; } - OS_SetInput(Type.mouse, - Status.up, + OS_SetInput(guiKeyBoardMode,KeyType.mouse, + KeyStatus.up, button, cursorPos); +// } else { +// Log.info("mouse value: ???" + action + " bt=" + button); } } public static float getFrameTimeSecconds() { diff --git a/src/org/atriaSoft/gale/event/EventEntry.java b/src/org/atriaSoft/gale/event/EventEntry.java new file mode 100644 index 0000000..7fceb6d --- /dev/null +++ b/src/org/atriaSoft/gale/event/EventEntry.java @@ -0,0 +1,50 @@ +package org.atriaSoft.gale.event; + +import org.atriaSoft.gale.key.KeyKeyboard; +import org.atriaSoft.gale.key.KeyStatus; +import org.atriaSoft.gale.key.KeySpecial; + +public class EventEntry { + private KeySpecial specialKey; //!< input key status (prevent change in time..) + private KeyKeyboard type; //!< type of hardware event + private KeyStatus status; //!< status of hardware event + private Character unicodeData; //!< Unicode data (in some case) + public EventEntry(KeySpecial specialKey, + KeyKeyboard type, + KeyStatus status, + Character charValue) { + this.type = type; + this.status = status; + this.specialKey = specialKey; + this.unicodeData = charValue; + } + public void setType(KeyKeyboard type) { + this.type = type; + } + public KeyKeyboard getType() { + return this.type; + } + public void setStatus(KeyStatus status) { + this.status = status; + } + public KeyStatus getStatus() { + return this.status; + }; + public void setSpecialKey(KeySpecial specialKey) { + this.specialKey = specialKey; + } + public KeySpecial getSpecialKey() { + return this.specialKey; + } + public void setChar(Character charValue) { + this.unicodeData = charValue; + } + public Character getChar() { + return this.unicodeData; + } + @Override + public String toString() { + return "EventEntry [type=" + type + ", status=" + status + ", unicodeData=" + + unicodeData + ", specialKey=" + specialKey + "]"; + } +} diff --git a/src/org/atriaSoft/gale/event/EventInput.java b/src/org/atriaSoft/gale/event/EventInput.java new file mode 100644 index 0000000..1e089b5 --- /dev/null +++ b/src/org/atriaSoft/gale/event/EventInput.java @@ -0,0 +1,57 @@ +package org.atriaSoft.gale.event; + +import org.atriaSoft.gale.key.KeyType; +import org.atriaSoft.gale.key.KeyStatus; +import org.atriaSoft.etk.math.Vector2f; +import org.atriaSoft.gale.key.KeySpecial; + +public class EventInput { + private KeyType type; + private KeyStatus status; + private int inputId; + private Vector2f position; + private KeySpecial specialKey; //!< input key status (prevent change in time..) + public EventInput(KeyType type, KeyStatus status, int inputId, Vector2f position, KeySpecial specialKey) { + this.type = type; + this.status = status; + this.inputId = inputId; + this.position = position; + this.specialKey = specialKey; + } + public KeyType getType() { + return type; + } + public void setType(KeyType type) { + this.type = type; + } + public KeyStatus getStatus() { + return status; + } + public void setStatus(KeyStatus status) { + this.status = status; + } + public int getInputId() { + return inputId; + } + public void setInputId(int inputId) { + this.inputId = inputId; + } + public Vector2f getPosition() { + return position; + } + public void setPosition(Vector2f position) { + this.position = position; + } + public KeySpecial getSpecialKey() { + return specialKey; + } + public void setSpecialKey(KeySpecial specialKey) { + this.specialKey = specialKey; + } + @Override + public String toString() { + return "EventInput [type=" + type + ", status=" + status + ", inputId=" + inputId + ", position=" + position + + ", specialKey=" + specialKey + "]"; + } + +} diff --git a/src/org/atriaSoft/gale/event/EventTime.java b/src/org/atriaSoft/gale/event/EventTime.java new file mode 100644 index 0000000..a1e94eb --- /dev/null +++ b/src/org/atriaSoft/gale/event/EventTime.java @@ -0,0 +1,51 @@ +package org.atriaSoft.gale.event; + +public class EventTime { + private long timeSystem; //!< Current system time (micro-second) + private long timeUpAppl; //!< Current application wake up-time (micro-second) + private long timeDelta; //!< Time from the last cycle call of the system (main appl tick) (micro-second) + private long timeDeltaCall; //!< Time from the last call (when we can manage periodic call with specifying periode) (micro-second) + public EventTime(long timeSystem, long timeUpAppl, long timeDelta, long timeDeltaCall) { + super(); + this.timeSystem = timeSystem; + this.timeUpAppl = timeUpAppl; + this.timeDelta = timeDelta; + this.timeDeltaCall = timeDeltaCall; + } + public long getTimeSystem() { + return timeSystem; + } + public void setTimeSystem(long timeSystem) { + this.timeSystem = timeSystem; + } + public long getTimeUpAppl() { + return timeUpAppl; + } + public void setTimeUpAppl(long timeUpAppl) { + this.timeUpAppl = timeUpAppl; + } + public long getTimeDelta() { + return timeDelta; + } + public float getTimeDeltaSecond() { + return (float)timeDelta*0.0000001f; + } + public void setTimeDelta(long timeDelta) { + this.timeDelta = timeDelta; + } + public long getTimeDeltaCall() { + return timeDeltaCall; + } + public float getTimeDeltaCallSecond() { + return (float)timeDeltaCall*0.0000001f; + } + public void setTimeDeltaCall(long timeDeltaCall) { + this.timeDeltaCall = timeDeltaCall; + } + @Override + public String toString() { + return "EventTime [timeSystem=" + timeSystem + "us, timeUpAppl=" + timeUpAppl + "us, timeDelta=" + timeDelta + + "us, timeDeltaCall=" + timeDeltaCall + "us]"; + } + +} diff --git a/src/org/atriaSoft/gale/key/Keyboard.java b/src/org/atriaSoft/gale/key/KeyKeyboard.java similarity index 98% rename from src/org/atriaSoft/gale/key/Keyboard.java rename to src/org/atriaSoft/gale/key/KeyKeyboard.java index d41a4d8..df21655 100644 --- a/src/org/atriaSoft/gale/key/Keyboard.java +++ b/src/org/atriaSoft/gale/key/KeyKeyboard.java @@ -1,6 +1,6 @@ package org.atriaSoft.gale.key; -public enum Keyboard { +public enum KeyKeyboard { unknow, //!< Unknown keyboard key character, //!< Char input is arrived ... left, //!< Left key <-- diff --git a/src/org/atriaSoft/gale/key/Special.java b/src/org/atriaSoft/gale/key/KeySpecial.java similarity index 98% rename from src/org/atriaSoft/gale/key/Special.java rename to src/org/atriaSoft/gale/key/KeySpecial.java index ab3ea88..e15a2ab 100644 --- a/src/org/atriaSoft/gale/key/Special.java +++ b/src/org/atriaSoft/gale/key/KeySpecial.java @@ -1,6 +1,6 @@ package org.atriaSoft.gale.key; -public class Special { +public class KeySpecial { private boolean valueCapLock = false; private boolean valueShiftLeft = false; private boolean valueShiftRight = false; @@ -15,7 +15,7 @@ public class Special { /** * @brief Main ructor */ - public Special() { + public KeySpecial() { } /** @@ -219,7 +219,7 @@ public class Special { * @param[in] move Moving key. * @param[in] isDown The key is pressed or not. */ - public void update(Keyboard move, boolean isDown) { + public void update(KeyKeyboard move, boolean isDown) { switch (move) { case insert: setInsert(isDown); @@ -264,7 +264,7 @@ public class Special { * @return true The key is pressed. * @return false The key is released. */ - public boolean get(Keyboard move) { + public boolean get(KeyKeyboard move) { switch (move) { case insert: return getInsert(); diff --git a/src/org/atriaSoft/gale/key/Status.java b/src/org/atriaSoft/gale/key/KeyStatus.java similarity index 96% rename from src/org/atriaSoft/gale/key/Status.java rename to src/org/atriaSoft/gale/key/KeyStatus.java index b810709..a08b9ab 100644 --- a/src/org/atriaSoft/gale/key/Status.java +++ b/src/org/atriaSoft/gale/key/KeyStatus.java @@ -1,6 +1,6 @@ package org.atriaSoft.gale.key; -public enum Status { +public enum KeyStatus { unknow, down, // availlable on Keyboard too downRepeate, // availlable on Keyboard too: the down event us in repeate cycle diff --git a/src/org/atriaSoft/gale/key/Type.java b/src/org/atriaSoft/gale/key/KeyType.java similarity index 87% rename from src/org/atriaSoft/gale/key/Type.java rename to src/org/atriaSoft/gale/key/KeyType.java index a5630b8..5a403f8 100644 --- a/src/org/atriaSoft/gale/key/Type.java +++ b/src/org/atriaSoft/gale/key/KeyType.java @@ -1,6 +1,6 @@ package org.atriaSoft.gale.key; -public enum Type { +public enum KeyType { unknow, //!< Unknow input Type mouse, //!< Mouse type finger, //!< Finger type diff --git a/src/org/atriaSoft/gale/resource/Resource.java b/src/org/atriaSoft/gale/resource/Resource.java index df4124c..e783431 100644 --- a/src/org/atriaSoft/gale/resource/Resource.java +++ b/src/org/atriaSoft/gale/resource/Resource.java @@ -9,8 +9,8 @@ import org.atriaSoft.gale.context.Context; public abstract class Resource { protected static int MAXRESOURCELEVEL = 5; - private static int idGenerated = 0; - protected long uid = 0; //!< unique ID definition + private static int idGenerated = 10; + protected long uid = -1; //!< unique ID definition protected int count = 1; protected int resourceLevel = MAXRESOURCELEVEL-1; //!< Level of the resource ==> for update priority [0..5] 0 must be update first. protected String name; //!< name of the resource ... diff --git a/src/org/atriaSoft/gale/resource/ResourceProgram.java b/src/org/atriaSoft/gale/resource/ResourceProgram.java index 74ab03f..bb7fd1a 100644 --- a/src/org/atriaSoft/gale/resource/ResourceProgram.java +++ b/src/org/atriaSoft/gale/resource/ResourceProgram.java @@ -15,6 +15,7 @@ import org.atriaSoft.etk.math.Vector3i; import org.atriaSoft.gale.Log; import org.atriaSoft.gale.backend3d.OpenGL; import org.atriaSoft.gale.backend3d.OpenGL.Usage; +import org.atriaSoft.gameEngine.Material; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; @@ -356,7 +357,7 @@ public class ResourceProgram extends Resource { */ OpenGL.programLoadUniformMatrix(this.elementList.get(idElem).elementId, matrix, transpose); } - + public void uniformColor(int idElem, Color value) { if (this.exist == false) { return; @@ -370,13 +371,65 @@ public class ResourceProgram extends Resource { } OpenGL.programLoadUniformColor(this.elementList.get(idElem).elementId, value); } + public void uniformVector(int idElem, Vector2f value) { + if (this.exist == false) { + return; + } + if (idElem<0 || (long)idElem>this.elementList.size()) { + Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); + return; + } + if (false == this.elementList.get(idElem).isLinked) { + return; + } + OpenGL.programLoadUniformVector(this.elementList.get(idElem).elementId, value); + } + public void uniformVector(int idElem, Vector2i value) { + if (this.exist == false) { + return; + } + if (idElem<0 || (long)idElem>this.elementList.size()) { + Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); + return; + } + if (false == this.elementList.get(idElem).isLinked) { + return; + } + OpenGL.programLoadUniformVector(this.elementList.get(idElem).elementId, value); + } + public void uniformVector(int idElem, Vector3f value) { + if (this.exist == false) { + return; + } + if (idElem<0 || (long)idElem>this.elementList.size()) { + Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); + return; + } + if (false == this.elementList.get(idElem).isLinked) { + return; + } + OpenGL.programLoadUniformVector(this.elementList.get(idElem).elementId, value); + } + public void uniformVector(int idElem, Vector3i value) { + if (this.exist == false) { + return; + } + if (idElem<0 || (long)idElem>this.elementList.size()) { + Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); + return; + } + if (false == this.elementList.get(idElem).isLinked) { + return; + } + OpenGL.programLoadUniformVector(this.elementList.get(idElem).elementId, value); + } /** * @brief Send 1 float uniform element to the spefified ID (not send if does not really exist in the openGL program) * @param[in] idElem Id of the uniform that might be sended. * @param[in] value1 Value to send at the Uniform */ - public void uniform1f(int idElem, float value1){ + public void uniformFloat(int idElem, float value1){ if (this.exist == false) { return; } @@ -395,7 +448,7 @@ public class ResourceProgram extends Resource { * @param[in] value1 Value to send at the Uniform * @param[in] value2 Value to send at the Uniform */ - public void uniform2f(int idElem, float value1, float value2) { + public void uniformFloat(int idElem, float value1, float value2) { if (this.exist == false) { return; @@ -416,7 +469,7 @@ public class ResourceProgram extends Resource { * @param[in] value2 Value to send at the Uniform * @param[in] value3 Value to send at the Uniform */ - public void uniform3f(int idElem, float value1, float value2, float value3){ + public void uniformFloat(int idElem, float value1, float value2, float value3){ if (this.exist == false) { return; @@ -438,7 +491,7 @@ public class ResourceProgram extends Resource { * @param[in] value3 Value to send at the Uniform * @param[in] value4 Value to send at the Uniform */ - public void uniform4f(int idElem, float value1, float value2, float value3, float value4) { + public void uniformFloat(int idElem, float value1, float value2, float value3, float value4) { if (this.exist == false) { return; @@ -458,7 +511,7 @@ public class ResourceProgram extends Resource { * @param[in] idElem Id of the uniform that might be sended. * @param[in] value1 Value to send at the Uniform */ - public void uniform1i(int idElem, int value1){ + public void uniformInt(int idElem, int value1){ if (this.exist == false) { return; @@ -478,7 +531,7 @@ public class ResourceProgram extends Resource { * @param[in] value1 Value to send at the Uniform * @param[in] value2 Value to send at the Uniform */ - public void uniform2i(int idElem, int value1, int value2) { + public void uniformInt(int idElem, int value1, int value2) { if (this.exist == false) { return; @@ -499,7 +552,7 @@ public class ResourceProgram extends Resource { * @param[in] value2 Value to send at the Uniform * @param[in] value3 Value to send at the Uniform */ - public void uniform3i(int idElem, int value1, int value2, int value3){ + public void uniformInt(int idElem, int value1, int value2, int value3){ if (this.exist == false) { return; @@ -521,7 +574,7 @@ public class ResourceProgram extends Resource { * @param[in] value3 Value to send at the Uniform * @param[in] value4 Value to send at the Uniform */ - public void uniform4i(int idElem, int value1, int value2, int value3, int value4){ + public void uniformInt(int idElem, int value1, int value2, int value3, int value4){ if (this.exist == false) { return; @@ -536,302 +589,6 @@ public class ResourceProgram extends Resource { OpenGL.programLoadUniformInt(this.elementList.get(idElem).elementId, value1, value2, value3, value4); } - /** - * @brief Send "vec1" uniform element to the spefified ID (not send if does not really exist in the openGL program) - * @param[in] idElem Id of the uniform that might be sended. - * @param[in] nbElement Number of element sended - * @param[in] value Pointer on the data - */ -// public void uniform1fv(int idElem, int nbElement, float *value){ -// -// if (this.exist == false) { -// return; -// } -// if ( idElem < 0 -// || (long)idElem > this.elementList.size()) { -// Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); -// return; -// } -// if (this.elementList.get(idElem).isLinked == false) { -// return; -// } -// if (nbElement == 0) { -// Log.error("No element to send at open GL ..."); -// return; -// } -// if (value == null) { -// Log.error("null Input pointer to send at open GL ..."); -// return; -// } -// glUniform1fv(this.elementList.get(idElem).elementId, nbElement, value); -// checkGlError("glUniform1fv", LINE, idElem); -// } - /** - * @brief Send "Vector2f" uniform element to the spefified ID (not send if does not really exist in the openGL program) - * @param[in] idElem Id of the uniform that might be sended. - * @param[in] nbElement Number of element sended - * @param[in] value Pointer on the data - */ -// public void uniform2fv(int idElem, int nbElement, float *value){ -// -// if (this.exist == false) { -// return; -// } -// if ( idElem < 0 -// || (long)idElem > this.elementList.size()) { -// Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); -// return; -// } -// if (this.elementList.get(idElem).isLinked == false) { -// return; -// } -// if (nbElement == 0) { -// Log.error("No element to send at open GL ..."); -// return; -// } -// if (value == null) { -// Log.error("null Input pointer to send at open GL ..."); -// return; -// } -// glUniform2fv(this.elementList.get(idElem).elementId, nbElement, value); -// checkGlError("glUniform2fv", LINE, idElem); -// } - /** - * @brief Send "Vector3f" uniform element to the spefified ID (not send if does not really exist in the openGL program) - * @param[in] idElem Id of the uniform that might be sended. - * @param[in] nbElement Number of element sended - * @param[in] value Pointer on the data - */ -// public void uniform3fv(int idElem, int nbElement, float *value){ -// -// if (this.exist == false) { -// return; -// } -// if ( idElem < 0 -// || (long)idElem > this.elementList.size()) { -// Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); -// return; -// } -// if (this.elementList.get(idElem).isLinked == false) { -// return; -// } -// if (nbElement == 0) { -// Log.error("No element to send at open GL ..."); -// return; -// } -// if (value == null) { -// Log.error("null Input pointer to send at open GL ..."); -// return; -// } -// Log.verbose("[" + this.elementList.get(idElem).name + "] send " + nbElement + " Vector3f"); -// glUniform3fv(this.elementList.get(idElem).elementId, nbElement, value); -// checkGlError("glUniform3fv", LINE, idElem); -// } - /** - * @brief Send "Vector4f" uniform element to the spefified ID (not send if does not really exist in the openGL program) - * @param[in] idElem Id of the uniform that might be sended. - * @param[in] nbElement Number of element sended - * @param[in] value Pointer on the data - */ -// public void uniform4fv(int idElem, int nbElement, float *value){ -// -// if (this.exist == false) { -// return; -// } -// if ( idElem < 0 -// || (long)idElem > this.elementList.size()) { -// Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); -// return; -// } -// if (this.elementList.get(idElem).isLinked == false) { -// return; -// } -// if (nbElement == 0) { -// Log.error("No element to send at open GL ..."); -// return; -// } -// if (value == null) { -// Log.error("null Input pointer to send at open GL ..."); -// return; -// } -// Log.verbose("[" + this.elementList.get(idElem).name + "] send " + nbElement + " Vector4f"); -// glUniform4fv(this.elementList.get(idElem).elementId, nbElement, value); -// checkGlError("glUniform4fv", LINE, idElem); -// } - - /** - * @brief Send "ivec1" uniform element to the spefified ID (not send if does not really exist in the openGL program) - * @param[in] idElem Id of the uniform that might be sended. - * @param[in] nbElement Number of element sended - * @param[in] value Pointer on the data - */ -// public void uniform1iv(int idElem, int nbElement, int *value){ -// -// if (this.exist == false) { -// return; -// } -// if ( idElem < 0 -// || (long)idElem > this.elementList.size()) { -// Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); -// return; -// } -// if (this.elementList.get(idElem).isLinked == false) { -// return; -// } -// if (nbElement == 0) { -// Log.error("No element to send at open GL ..."); -// return; -// } -// if (value == null) { -// Log.error("null Input pointer to send at open GL ..."); -// return; -// } -// glUniform1iv(this.elementList.get(idElem).elementId, nbElement, value); -// checkGlError("glUniform1iv", LINE, idElem); -// } - /** - * @brief Send "Vector2i" uniform element to the spefified ID (not send if does not really exist in the openGL program) - * @param[in] idElem Id of the Attribute that might be sended. - * @param[in] nbElement Number of element sended - * @param[in] value Pointer on the data - */ -// public void uniform2iv(int idElem, int nbElement, int *value){ -// -// if (this.exist == false) { -// return; -// } -// if ( idElem < 0 -// || (long)idElem > this.elementList.size()) { -// Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); -// return; -// } -// if (this.elementList.get(idElem).isLinked == false) { -// return; -// } -// if (nbElement == 0) { -// Log.error("No element to send at open GL ..."); -// return; -// } -// if (value == null) { -// Log.error("null Input pointer to send at open GL ..."); -// return; -// } -// glUniform2iv(this.elementList.get(idElem).elementId, nbElement, value); -// checkGlError("glUniform2iv", LINE, idElem); -// } - /** - * @brief Send "Vector3i" uniform element to the spefified ID (not send if does not really exist in the openGL program) - * @param[in] idElem Id of the uniform that might be sended. - * @param[in] nbElement Number of element sended - * @param[in] value Pointer on the data - */ -// public void uniform3iv(int idElem, int nbElement, int *value){ -// -// if (this.exist == false) { -// return; -// } -// if ( idElem < 0 -// || (long)idElem > this.elementList.size()) { -// Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); -// return; -// } -// if (this.elementList.get(idElem).isLinked == false) { -// return; -// } -// if (nbElement == 0) { -// Log.error("No element to send at open GL ..."); -// return; -// } -// if (value == null) { -// Log.error("null Input pointer to send at open GL ..."); -// return; -// } -// glUniform3iv(this.elementList.get(idElem).elementId, nbElement, value); -// checkGlError("glUniform3iv", LINE, idElem); -// } - /** - * @brief Send "Vector4i" uniform element to the spefified ID (not send if does not really exist in the openGL program) - * @param[in] idElem Id of the uniform that might be sended. - * @param[in] nbElement Number of element sended - * @param[in] value Pointer on the data - */ -// public void uniform4iv(int idElem, int nbElement, int *value){ -// -// if (this.exist == false) { -// return; -// } -// if ( idElem < 0 -// || (long)idElem > this.elementList.size()) { -// Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); -// return; -// } -// if (this.elementList.get(idElem).isLinked == false) { -// return; -// } -// if (nbElement == 0) { -// Log.error("No element to send at open GL ..."); -// return; -// } -// if (value == null) { -// Log.error("null Input pointer to send at open GL ..."); -// return; -// } -// glUniform4iv(this.elementList.get(idElem).elementId, nbElement, value); -// checkGlError("glUniform4iv", LINE, idElem); -// } - public void uniform2(int idElem, Vector2f value) { - if (this.exist == false) { - return; - } - if (idElem<0 || (long)idElem>this.elementList.size()) { - Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); - return; - } - if (false == this.elementList.get(idElem).isLinked) { - return; - } - OpenGL.programLoadUniformVector(this.elementList.get(idElem).elementId, value); - }; - public void uniform3(int idElem, Vector3f value) { - if (this.exist == false) { - return; - } - if (idElem<0 || (long)idElem>this.elementList.size()) { - Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); - return; - } - if (false == this.elementList.get(idElem).isLinked) { - return; - } - OpenGL.programLoadUniformVector(this.elementList.get(idElem).elementId, value); - }; - public void uniform2(int idElem, Vector2i value) { - if (this.exist == false) { - return; - } - if (idElem<0 || (long)idElem>this.elementList.size()) { - Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); - return; - } - if (false == this.elementList.get(idElem).isLinked) { - return; - } - OpenGL.programLoadUniformVector(this.elementList.get(idElem).elementId, value); - }; - public void uniform3(int idElem, Vector3i value) { - if (this.exist == false) { - return; - } - if (idElem<0 || (long)idElem>this.elementList.size()) { - Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1) + "]"); - return; - } - if (false == this.elementList.get(idElem).isLinked) { - return; - } - OpenGL.programLoadUniformVector(this.elementList.get(idElem).elementId, value); - }; - /** * @brief Request the processing of this program */ @@ -921,10 +678,10 @@ public class ResourceProgram extends Resource { OpenGL.programAttach(this.program, this.shaderFragment.getGLID()); } - OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_POSITIONS, "position"); - OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_TEXTURE_COORDINATES, "textureCoords"); - OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_NORMALS, "normal"); - OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_COLORS, "colors"); + OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_POSITIONS, "in_position"); + OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_TEXTURE_COORDINATES, "tin_extureCoords"); + OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_NORMALS, "in_normal"); + OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_COLORS, "in_colors"); if (OpenGL.programCompile(this.program) == false) { Log.error("Could not compile'PROGRAM':'" + this.name + "'"); @@ -1048,4 +805,5 @@ public class ResourceProgram extends Resource { getManager().localAdd(resource); return resource; } + } diff --git a/src/org/atriaSoft/gale/resource/ResourceTexture.java b/src/org/atriaSoft/gale/resource/ResourceTexture.java index a16c70f..551c586 100644 --- a/src/org/atriaSoft/gale/resource/ResourceTexture.java +++ b/src/org/atriaSoft/gale/resource/ResourceTexture.java @@ -102,7 +102,7 @@ public class ResourceTexture extends Resource { @Override public boolean updateContext() { if (this.loaded == true) { - return true; + return true; } // Request a new texture at openGl : texId = GL11.glGenTextures(); @@ -222,7 +222,7 @@ public class ResourceTexture extends Resource { Log.critical("resource Is not correctly init : ResourceProgram" ); return null; } - getManager().localAdd(resource); + resource.flush(); return resource; } diff --git a/src/org/atriaSoft/gale/resource/ResourceVirtualArrayObject.java b/src/org/atriaSoft/gale/resource/ResourceVirtualArrayObject.java index a5617f3..002fca6 100644 --- a/src/org/atriaSoft/gale/resource/ResourceVirtualArrayObject.java +++ b/src/org/atriaSoft/gale/resource/ResourceVirtualArrayObject.java @@ -194,7 +194,7 @@ public class ResourceVirtualArrayObject extends Resource { * @brief This load/reload the data in the opengl context, needed when removed previously. */ public boolean updateContext() { - //Log.verbose(" Start: [" + getId() + "] '" + getName() + "' (size=" + this.buffer.get(0).length + ")"); + //Log.verbose(" Start: [" + getId() + "] '" + getName() + "' (size=" + this.indices.length + ") ********************************"); if (this.exist == false) { Log.debug(" ==> ALLOCATE new handle"); // Allocate and assign a Vertex Array Object to our handle @@ -233,6 +233,14 @@ public class ResourceVirtualArrayObject extends Resource { updateContext(); } + public static ResourceVirtualArrayObject create(float[] positions, float[] colors, float[] textureCoordinates, float[] normals, int[] indices) { + ResourceVirtualArrayObject resource = new ResourceVirtualArrayObject(positions, colors, textureCoordinates, normals, indices, indices.length); + if (resource.resourceHasBeenCorectlyInit() == false) { + Log.critical("resource Is not correctly init: ResourceVirtualBufferObject"); + } + getManager().localAdd(resource); + return resource; + } public static ResourceVirtualArrayObject create(float[] positions, float[] colors, int[] indices) { ResourceVirtualArrayObject resource = new ResourceVirtualArrayObject(positions, colors, null, null, indices, indices.length); if (resource.resourceHasBeenCorectlyInit() == false) { diff --git a/src/org/atriaSoft/gale/test/sample1/MainApplication.java b/src/org/atriaSoft/gale/test/sample1/Sample1Application.java similarity index 88% rename from src/org/atriaSoft/gale/test/sample1/MainApplication.java rename to src/org/atriaSoft/gale/test/sample1/Sample1Application.java index 8a0c6cc..fc6218a 100644 --- a/src/org/atriaSoft/gale/test/sample1/MainApplication.java +++ b/src/org/atriaSoft/gale/test/sample1/Sample1Application.java @@ -10,12 +10,12 @@ import org.atriaSoft.gale.backend3d.OpenGL; import org.atriaSoft.gale.context.Context; import org.atriaSoft.gale.resource.ResourceProgram; import org.atriaSoft.gale.resource.ResourceVirtualArrayObject; -import org.atriaSoft.gale.key.Keyboard; -import org.atriaSoft.gale.key.Special; -import org.atriaSoft.gale.key.Status; -import org.atriaSoft.gale.key.Type; +import org.atriaSoft.gale.key.KeyKeyboard; +import org.atriaSoft.gale.key.KeySpecial; +import org.atriaSoft.gale.key.KeyStatus; +import org.atriaSoft.gale.key.KeyType; -public class MainApplication extends Application { +public class Sample1Application extends Application { private ResourceProgram GLprogram; private int GLMatrixTransformation; private int GLMatrixProjection; @@ -78,7 +78,7 @@ public class MainApplication extends Application { // create a local matrix environnement. OpenGL.push(); - Matrix4f tmpProjection = Matrix4f.createMatrixOrtho(-1, 1, -1, 1, -2, 2); + Matrix4f tmpProjection = Matrix4f.createMatrixOrtho(-getAspectRatio(), getAspectRatio(), -1, 1, -50, 50); // set internal matrix system: OpenGL.setMatrix(tmpProjection); if (this.GLprogram == null) { @@ -110,20 +110,21 @@ public class MainApplication extends Application { this.markDrawingIsNeeded(); } @Override - public void onPointer(Type type, + public void onPointer(KeySpecial special, + KeyType type, int pointerID, Vector2f pos, - Status state) { + KeyStatus state) { // Log.info("input event: type=" + type); // Log.info(" id=" + pointerID); // Log.info(" pos=" + pos); // Log.info(" state=" + state); } @Override - public void onKeyboard( Special special, - Keyboard type, + public void onKeyboard( KeySpecial special, + KeyKeyboard type, Character value, - Status state) { + KeyStatus state) { Log.info("Keyboard event: special=" + special); Log.info(" type=" + type); Log.info(" value='" + value + "'"); diff --git a/src/org/atriaSoft/gale/test/sample1/basic.frag b/src/org/atriaSoft/gale/test/sample1/basic.frag index 58f5960..d290abb 100644 --- a/src/org/atriaSoft/gale/test/sample1/basic.frag +++ b/src/org/atriaSoft/gale/test/sample1/basic.frag @@ -5,9 +5,12 @@ precision mediump float; precision mediump int; #endif +// input: +in vec4 io_color; + // output: -varying vec4 f_color; +out vec4 out_Color; void main(void) { - gl_FragColor = f_color; + out_Color = io_color; } diff --git a/src/org/atriaSoft/gale/test/sample1/basic.vert b/src/org/atriaSoft/gale/test/sample1/basic.vert index 31c4de6..00c9732 100644 --- a/src/org/atriaSoft/gale/test/sample1/basic.vert +++ b/src/org/atriaSoft/gale/test/sample1/basic.vert @@ -6,16 +6,16 @@ precision mediump int; #endif // Input: -attribute vec3 position; -attribute vec4 colors; -uniform mat4 matrixTransformation; -uniform mat4 matrixProjection; -uniform mat4 matrixView; +in vec3 in_position; +in vec4 in_colors; +uniform mat4 in_matrixTransformation; +uniform mat4 in_matrixProjection; +uniform mat4 in_matrixView; // output: -varying vec4 f_color; +out vec4 io_color; void main(void) { - gl_Position = matrixProjection * matrixView * matrixTransformation * vec4(position, 1.0); - f_color = colors; + gl_Position = in_matrixProjection * in_matrixView * in_matrixTransformation * vec4(in_position, 1.0); + f_color = in_colors; } diff --git a/src/org/atriaSoft/gale/test/sample1/sample_1.java b/src/org/atriaSoft/gale/test/sample1/sample_1.java index a12afec..35bc930 100644 --- a/src/org/atriaSoft/gale/test/sample1/sample_1.java +++ b/src/org/atriaSoft/gale/test/sample1/sample_1.java @@ -6,6 +6,6 @@ import org.atriaSoft.gale.Gale; public class sample_1 { public static void main(String[] args) { Uri.setGroup("DATA", "src/org/atriaSoft/gale/test/sample1/"); - Gale.run(new MainApplication(), args); + Gale.run(new Sample1Application(), args); } } diff --git a/src/org/atriaSoft/gale/test/sample2/MainApplication.java b/src/org/atriaSoft/gale/test/sample2/Sample2Application.java similarity index 93% rename from src/org/atriaSoft/gale/test/sample2/MainApplication.java rename to src/org/atriaSoft/gale/test/sample2/Sample2Application.java index 3698ce3..a209b00 100644 --- a/src/org/atriaSoft/gale/test/sample2/MainApplication.java +++ b/src/org/atriaSoft/gale/test/sample2/Sample2Application.java @@ -13,12 +13,12 @@ import org.atriaSoft.gale.resource.ResourceTexture; import org.atriaSoft.gale.resource.ResourceVirtualArrayObject; import org.atriaSoft.gale.tools.ImageLoader; import org.atriaSoft.gale.tools.ImageRawData; -import org.atriaSoft.gale.key.Keyboard; -import org.atriaSoft.gale.key.Special; -import org.atriaSoft.gale.key.Status; -import org.atriaSoft.gale.key.Type; +import org.atriaSoft.gale.key.KeyKeyboard; +import org.atriaSoft.gale.key.KeySpecial; +import org.atriaSoft.gale.key.KeyStatus; +import org.atriaSoft.gale.key.KeyType; -public class MainApplication extends Application { +public class Sample2Application extends Application { private ResourceProgram GLprogram; private int GLMatrixTransformation; private int GLMatrixProjection; @@ -171,20 +171,21 @@ public class MainApplication extends Application { this.markDrawingIsNeeded(); } @Override - public void onPointer(Type type, + public void onPointer(KeySpecial special, + KeyType type, int pointerID, Vector2f pos, - Status state) { + KeyStatus state) { // Log.info("input event: type=" + type); // Log.info(" id=" + pointerID); // Log.info(" pos=" + pos); // Log.info(" state=" + state); } @Override - public void onKeyboard( Special special, - Keyboard type, + public void onKeyboard( KeySpecial special, + KeyKeyboard type, Character value, - Status state) { + KeyStatus state) { Log.info("Keyboard event: special=" + special); Log.info(" type=" + type); Log.info(" value='" + value + "'"); diff --git a/src/org/atriaSoft/gale/test/sample2/basic.frag b/src/org/atriaSoft/gale/test/sample2/basic.frag index a347c03..13d2aa8 100644 --- a/src/org/atriaSoft/gale/test/sample2/basic.frag +++ b/src/org/atriaSoft/gale/test/sample2/basic.frag @@ -5,13 +5,13 @@ precision mediump float; precision mediump int; #endif -in vec2 out_textureCoords; +in vec2 io_textureCoords; -uniform sampler2D textureBase; +uniform sampler2D in_textureBase; // output: out vec4 out_Color; void main(void) { - out_Color = texture(textureBase, out_textureCoords); + out_Color = texture(in_textureBase, io_textureCoords); } diff --git a/src/org/atriaSoft/gale/test/sample2/basic.vert b/src/org/atriaSoft/gale/test/sample2/basic.vert index 439636f..c0dcaa7 100644 --- a/src/org/atriaSoft/gale/test/sample2/basic.vert +++ b/src/org/atriaSoft/gale/test/sample2/basic.vert @@ -6,16 +6,16 @@ precision mediump int; #endif // Input: -in vec3 position; -in vec2 textureCoords; -uniform mat4 matrixTransformation; -uniform mat4 matrixProjection; -uniform mat4 matrixView; +in vec3 in_position; +in vec2 in_textureCoords; +uniform mat4 in_matrixTransformation; +uniform mat4 in_matrixProjection; +uniform mat4 in_matrixView; // output: -out vec2 out_textureCoords; +out vec2 io_textureCoords; void main(void) { - gl_Position = matrixProjection * matrixView * matrixTransformation * vec4(position, 1.0); - out_textureCoords = textureCoords; + gl_Position = in_matrixProjection * in_matrixView * in_matrixTransformation * vec4(in_position, 1.0); + io_textureCoords = in_textureCoords; } diff --git a/src/org/atriaSoft/gale/test/sample2/sample_2.java b/src/org/atriaSoft/gale/test/sample2/sample_2.java index c84632b..87fe7ca 100644 --- a/src/org/atriaSoft/gale/test/sample2/sample_2.java +++ b/src/org/atriaSoft/gale/test/sample2/sample_2.java @@ -6,6 +6,6 @@ import org.atriaSoft.gale.Gale; public class sample_2 { public static void main(String[] args) { Uri.setGroup("DATA", "src/org/atriaSoft/gale/test/sample2/"); - Gale.run(new MainApplication(), args); + Gale.run(new Sample2Application(), args); } } diff --git a/src/org/atriaSoft/gameEngine/ControlCameraSimple.java b/src/org/atriaSoft/gameEngine/ControlCameraSimple.java new file mode 100644 index 0000000..3808143 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/ControlCameraSimple.java @@ -0,0 +1,125 @@ +package org.atriaSoft.gameEngine; + +import org.atriaSoft.etk.math.Vector2f; +import org.atriaSoft.gale.event.EventEntry; +import org.atriaSoft.gale.event.EventInput; +import org.atriaSoft.gale.event.EventTime; +import org.atriaSoft.gale.key.KeyKeyboard; +import org.atriaSoft.gale.key.KeyStatus; +import org.atriaSoft.gameEngine.camera.Camera; + + +public class ControlCameraSimple implements ControlInterface { + private Camera camera; + private float distanceFromCenter = 20; + private float angleZ = 0; + private float pitch = 0; + private Vector2f lastMousePosition = null; + private boolean moveUp = false; + private boolean moveLeft = false; + private boolean moveRight = false; + private boolean moveDown = false; + private boolean ctrlIsSet = false; + + public ControlCameraSimple(Camera camera) { + this.camera = camera; + } + private boolean getState(KeyStatus state, boolean previousState) { + if (state == KeyStatus.down) { + return true; + } + if (state == KeyStatus.up) { + return false; + } + return previousState; + } + @Override + public boolean onEventEntry(EventEntry event) { + if(event.getType() == KeyKeyboard.up) { + moveUp = getState(event.getStatus(), moveUp); + } + if(event.getType() == KeyKeyboard.left) { + moveLeft = getState(event.getStatus(), moveLeft); + } + if(event.getSpecialKey().getCtrl() == false + && event.getType() == KeyKeyboard.right) { + moveRight = getState(event.getStatus(), moveRight); + } + if(event.getSpecialKey().getCtrl() == false + && event.getType() == KeyKeyboard.down) { + moveDown = getState(event.getStatus(), moveDown); + } + ctrlIsSet = event.getSpecialKey().getCtrl(); + return false; + } + + @Override + public boolean onEventInput(EventInput event, Vector2f relativePosition) { + Log.info("" + event); + // TODO Auto-generated method stub + if (event.getInputId() == 4) { + if (event.getStatus() == KeyStatus.down) { + distanceFromCenter -= 1; + } + } else if (event.getInputId() == 5) { + if (event.getStatus() == KeyStatus.down) { + distanceFromCenter += 1; + } + } else if (event.getInputId() == 2) { + if (event.getStatus() == KeyStatus.down) { + lastMousePosition = event.getPosition(); + } else if (event.getStatus() == KeyStatus.move) { + Vector2f delta = event.getPosition().clone(); + delta.less(lastMousePosition); + lastMousePosition = event.getPosition().clone(); + //angleZ += delta.x; + //this.camera.setYaw(this.camera.getYaw() + (float)Math.toRadians(delta.x)); + this.camera.setPitch(this.camera.getPitch() - (float)Math.toRadians(delta.y)); + if (this.camera.getPitch()>0) { + this.camera.setPitch(0); + } + if (this.camera.getPitch()<-Math.PI) { + this.camera.setPitch((float)-Math.PI); + } + this.camera.setRoll(this.camera.getRoll() + (float)Math.toRadians(delta.x)); + Log.info("Change camera: " + this.camera.getYaw() + " " + this.camera.getPitch()); + if (this.camera.getRoll()>Math.PI) { + this.camera.setRoll(this.camera.getRoll()-(float)Math.PI*2.0f); + } + if (this.camera.getRoll()<-Math.PI) { + this.camera.setRoll(this.camera.getRoll()+(float)Math.PI*2.0f); + } + } + } + return false; + } + + @Override + public void periodicCall(EventTime event) { + if (moveLeft != moveRight) { + if (moveRight) { + camera.getPosition().x += 0.1; + } else { + camera.getPosition().x -= 0.1; + } + } + if (ctrlIsSet == false) { + if (moveUp != moveDown) { + if (moveUp) { + camera.getPosition().y += 0.1; + } else { + camera.getPosition().y -= 0.1; + } + } + } else { + if (moveUp != moveDown) { + if (moveUp) { + camera.getPosition().z += 0.1; + } else { + camera.getPosition().z -= 0.1; + } + } + } + } + +} diff --git a/src/org/atriaSoft/gameEngine/ControlInterface.java b/src/org/atriaSoft/gameEngine/ControlInterface.java new file mode 100644 index 0000000..5dc5da9 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/ControlInterface.java @@ -0,0 +1,16 @@ +package org.atriaSoft.gameEngine; + +import org.atriaSoft.etk.math.Vector2f; +import org.atriaSoft.gale.event.EventEntry; +import org.atriaSoft.gale.event.EventInput; +import org.atriaSoft.gale.event.EventTime; + +public interface ControlInterface { + public boolean onEventEntry(EventEntry event); + public boolean onEventInput(EventInput event, Vector2f relativePosition); + /** + * @brief Periodic call to update grapgic display + * @param[in] event Time generic event + */ + public void periodicCall(EventTime event); +} diff --git a/src/org/atriaSoft/gameEngine/Entity.java b/src/org/atriaSoft/gameEngine/Entity.java index 4b4c53b..ad9d4c0 100644 --- a/src/org/atriaSoft/gameEngine/Entity.java +++ b/src/org/atriaSoft/gameEngine/Entity.java @@ -4,14 +4,13 @@ import java.util.ArrayList; import java.util.List; import org.atriaSoft.etk.math.Vector3f; -import org.atriaSoft.gameEngine.camera.Camera; -public abstract class Entity { - protected Environement env; +public class Entity { + protected Environement env = null; protected List component = new ArrayList(); /** * @brief Constructor (when ructer is called just add Entity that did not change. - * The objest will be stored in a pool of Entity and keep a second time if needed == > redure memory allocation, + * The objest will be stored in a pool of Entity and keep a second time if needed == > reduce memory allocation, * when needed, the system will call the init and un-init function... */ public Entity(Environement env) { @@ -29,6 +28,7 @@ public abstract class Entity { component.add(ref); env.engineComponentAdd(ref); for (Component it : component) { + ref.addFriendComponent(it); it.addFriendComponent(ref); } Log.print("Entity: Add New component ... [END]"); @@ -81,11 +81,6 @@ public abstract class Entity { return null; } - /** - * @brief get the Entity Type description string. - * @return A reference on the descriptive string. - */ - abstract public String getType(); /** * @brief init the Entity with the defined properties * @param[in] property Type of the next Entity @@ -151,7 +146,7 @@ public abstract class Entity { life += power; life = Math.min(Math.max(0.0f, life), lifeMax); if (life <= 0) { - Log.debug("[" + getUID() + "] Entity is killed ..." + getType()); + Log.debug("[" + getUID() + "] Entity is killed ..."); } if (life != previousLife) { onLifeChange(); diff --git a/src/org/atriaSoft/gameEngine/Environement.java b/src/org/atriaSoft/gameEngine/Environement.java index 9282d1d..474b78f 100644 --- a/src/org/atriaSoft/gameEngine/Environement.java +++ b/src/org/atriaSoft/gameEngine/Environement.java @@ -5,12 +5,22 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.atriaSoft.etk.math.Vector2f; +import org.atriaSoft.gale.backend3d.OpenGL; +import org.atriaSoft.gale.event.EventEntry; +import org.atriaSoft.gale.event.EventInput; +import org.atriaSoft.gale.event.EventTime; +import org.atriaSoft.gale.key.KeyKeyboard; +import org.atriaSoft.gale.key.KeySpecial; +import org.atriaSoft.gale.key.KeyStatus; +import org.atriaSoft.gale.key.KeyType; import org.atriaSoft.gameEngine.camera.Camera; import org.atriaSoft.gameEngine.engines.EngineRender; import org.atriaSoft.gameEngine.engines.EngineAI; +import org.atriaSoft.gameEngine.engines.EngineLight; import org.atriaSoft.gameEngine.engines.EngineParticle; import org.atriaSoft.gameEngine.engines.EnginePhysics; -import org.atriaSoft.gameEngine.resource.Mesh; +//import org.atriaSoft.gameEngine.resource.Mesh; public class Environement { public Signal signalPlayTimeChange = new Signal(); @@ -19,11 +29,14 @@ public class Environement { protected List engine = new ArrayList(); // !< EGE sub engine interface (like physique, rendering, // audio, ...). private List listEntity = new ArrayList(); // !< List of all entity added in the Game - + List controls = new ArrayList(); + long lastCallTime = 0; + // ! list of all camera in the world protected Map listCamera = new HashMap(); protected long gameTime = 0; // !< time of the game running - protected List listMeshToDrawFirst = new ArrayList(); + private long startTime; + //protected List listMeshToDrawFirst = new ArrayList(); public Environement() { // we add the 4 classical engines (the order is used to the global rendering cycle ... @@ -31,8 +44,37 @@ public class Environement { addEngine(new EngineAI(this)); addEngine(new EngineRender(this)); addEngine(new EngineParticle(this)); + addEngine(new EngineLight(this)); } + public void addControlInterface(ControlInterface ref) { + controls.add(ref); + } + public void removeControlInterface(ControlInterface ref) { + controls.remove(ref); + } + + public void onPointer(KeySpecial special, + KeyType type, + int pointerID, + Vector2f pos, + KeyStatus state) { + EventInput event = new EventInput(type, state, pointerID, pos, special); + for (ControlInterface elem : controls) { + elem.onEventInput(event, pos); + } + } + public void onKeyboard( KeySpecial special, + KeyKeyboard type, + Character value, + KeyStatus state) { + EventEntry event = new EventEntry(special, type, state, value); + for (ControlInterface elem : controls) { + elem.onEventEntry(event); + } + } + + public void addEngine(Engine ref) { if (ref == null) { Log.error("try to add an empty Engine"); @@ -97,17 +139,18 @@ public class Environement { Log.error("Render: Can not get camera named: '" + cameraName + "'"); return; } + OpenGL.setCameraMatrix(camera.getConvertionMatrix()); for (Engine it: engine) { - Log.verbose(" render: " + it.getType()); + //Log.verbose(" render: " + it.getType()); it.render(deltaMilli, camera); } - for (Engine it: engine) { - if(it == null) { - continue; - } - Log.verbose(" render: " + it.getType()); - it.renderDebug(deltaMilli, camera); - } +// for (Engine it: engine) { +// if(it == null) { +// continue; +// } +// Log.verbose(" render: " + it.getType()); +// it.renderDebug(deltaMilli, camera); +// } } @@ -331,13 +374,13 @@ public class Environement { // */ // } - public void addStaticMeshToDraw(Mesh mesh) { - listMeshToDrawFirst.add(mesh); - } - - public List getStaticMeshToDraw() { - return listMeshToDrawFirst; - } +// public void addStaticMeshToDraw(Mesh mesh) { +// listMeshToDrawFirst.add(mesh); +// } +// +// public List getStaticMeshToDraw() { +// return listMeshToDrawFirst; +// } public GameStatus getPropertyStatus() { return propertyStatus; @@ -354,6 +397,19 @@ public class Environement { // mperiodicCallConnection.disconnect(); // } } + + public void periodicCall() { + if (lastCallTime == 0 ) { + startTime = System.nanoTime()/1000; + lastCallTime = startTime; + } + long lastUpdate = lastCallTime; + lastCallTime = System.nanoTime()/1000; + EventTime event = new EventTime(lastCallTime, lastCallTime-startTime, lastCallTime-lastUpdate, lastCallTime-lastUpdate); + for (ControlInterface elem : controls) { + elem.periodicCall(event); + } + } } /* diff --git a/src/org/atriaSoft/gameEngine/Light.java b/src/org/atriaSoft/gameEngine/Light.java new file mode 100644 index 0000000..4742cc3 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/Light.java @@ -0,0 +1,38 @@ +package org.atriaSoft.gameEngine; + +import org.atriaSoft.etk.math.Vector3f; + +public class Light { + private Vector3f color; + // A light is linked with an entity, then the entity position the object and the light have a relative position with the entity + private Vector3f positionDelta; + private Vector3f attenuation; + public Light(Vector3f color, Vector3f positionDelta, Vector3f attenuation) { + this.color = color; + this.positionDelta = positionDelta; + this.attenuation = attenuation; + } + public Light() { + this.color = new Vector3f(1.0f,1.0f,1.0f); + this.positionDelta = new Vector3f(0.0f,0.0f,0.0f); + this.attenuation = new Vector3f(0.0f,0.0f,0.0f);; + } + public Vector3f getColor() { + return color; + } + public void setColor(Vector3f color) { + this.color = color; + } + public Vector3f getPositionDelta() { + return positionDelta; + } + public void setPositionDelta(Vector3f positionDelta) { + this.positionDelta = positionDelta; + } + public Vector3f getAttenuation() { + return attenuation; + } + public void setAttenuation(Vector3f attenuation) { + this.attenuation = attenuation; + } +} diff --git a/src/org/atriaSoft/gameEngine/Material.java b/src/org/atriaSoft/gameEngine/Material.java new file mode 100644 index 0000000..194ab5a --- /dev/null +++ b/src/org/atriaSoft/gameEngine/Material.java @@ -0,0 +1,51 @@ +package org.atriaSoft.gameEngine; + +import org.atriaSoft.etk.math.Vector3f; + +public class Material { + // Minimum of the ambient value of the material (default minimum color of the element) + private Vector3f ambientFactor; + // Material diffuse his own color (for lights...) + private Vector3f diffuseFactor; + // Reflection of the lights + private Vector3f specularFactor; + // Distance of witch the camera must to be to receive the the reflection + private float shininess; + public Material(Vector3f ambientFactor, Vector3f diffuseFactor, Vector3f specularFactor, float shininess) { + this.ambientFactor = ambientFactor; + this.diffuseFactor = diffuseFactor; + this.specularFactor = specularFactor; + this.shininess = shininess; + } + public Material() { + this.ambientFactor = new Vector3f(1,1,1); + this.diffuseFactor = new Vector3f(0,0,0); + this.specularFactor = new Vector3f(0,0,0); + this.shininess = 1.0f; + } + public Vector3f getAmbientFactor() { + return ambientFactor; + } + public void setAmbientFactor(Vector3f ambientFactor) { + this.ambientFactor = ambientFactor; + } + public Vector3f getDiffuseFactor() { + return diffuseFactor; + } + public void setDiffuseFactor(Vector3f diffuseFactor) { + this.diffuseFactor = diffuseFactor; + } + public Vector3f getSpecularFactor() { + return specularFactor; + } + public void setSpecularFactor(Vector3f specularFactor) { + this.specularFactor = specularFactor; + } + public float getShininess() { + return shininess; + } + public void setShininess(float shininess) { + this.shininess = shininess; + } + +} diff --git a/src/org/atriaSoft/gameEngine/camera/Camera.java b/src/org/atriaSoft/gameEngine/camera/Camera.java index a3bd260..4840322 100644 --- a/src/org/atriaSoft/gameEngine/camera/Camera.java +++ b/src/org/atriaSoft/gameEngine/camera/Camera.java @@ -1,5 +1,57 @@ package org.atriaSoft.gameEngine.camera; -public class Camera { +import org.atriaSoft.etk.math.Matrix4f; +import org.atriaSoft.etk.math.Vector3f; +//import entities.Player; +//import renderEngine.DisplayManager; + +public class Camera { + private Vector3f position = new Vector3f(0,0,2); + private float pitch = 0; + private float yaw = 0; + private float roll = 0; + + public Camera() { + + } + + public Matrix4f getConvertionMatrix() { + Matrix4f matrix = new Matrix4f(); + matrix.setIdentity(); + matrix.rotate(new Vector3f(1,0,0), getPitch()); + matrix.rotate(new Vector3f(0,1,0), getYaw()); + matrix.rotate(new Vector3f(0,0,1), getRoll()); + matrix.translate(new Vector3f(-position.x,-position.y,-position.z)); + return matrix; + } + public Vector3f getPosition() { + return position; + } + public void setPosition(Vector3f position) { + this.position = position; + } + + public float getPitch() { + return pitch; + } + + public void setPitch(float pitch) { + this.pitch = pitch; + } + + public float getYaw() { + return yaw; + } + public void setYaw(float yaw) { + this.yaw = yaw; + } + + public float getRoll() { + return roll; + } + public void setRoll(float roll) { + this.roll = roll; + } + } diff --git a/src/org/atriaSoft/gameEngine/components/ComponentAI.java b/src/org/atriaSoft/gameEngine/components/ComponentAI.java index 5c9b2bf..c20d0a4 100644 --- a/src/org/atriaSoft/gameEngine/components/ComponentAI.java +++ b/src/org/atriaSoft/gameEngine/components/ComponentAI.java @@ -1,12 +1,15 @@ package org.atriaSoft.gameEngine.components; import org.atriaSoft.gameEngine.Component; +import org.atriaSoft.gameEngine.engines.EngineAI; -public class ComponentAI extends Component { +public abstract class ComponentAI extends Component { @Override public String getType() { // TODO Auto-generated method stub - return null; + return EngineAI.ENGINE_NAME; } + + public abstract void update(float timeStep); } diff --git a/src/org/atriaSoft/gameEngine/components/ComponentLight.java b/src/org/atriaSoft/gameEngine/components/ComponentLight.java new file mode 100644 index 0000000..71bde8b --- /dev/null +++ b/src/org/atriaSoft/gameEngine/components/ComponentLight.java @@ -0,0 +1,41 @@ +package org.atriaSoft.gameEngine.components; + +import org.atriaSoft.etk.math.Vector3f; +import org.atriaSoft.gameEngine.Component; +import org.atriaSoft.gameEngine.Light; + +public class ComponentLight extends Component { + // the material is not a resource, it can change in time... with AI or selection... + private Light light; + private ComponentPosition position; + + public ComponentLight(Light light) { + super(); + this.light = light; + } + public void addFriendComponent(Component component) { + if (component.getType().contentEquals("position")) { + this.position = (ComponentPosition)component; + } + } + + public ComponentLight() { + super(); + this.light = new Light(); + } + @Override + public String getType() { + return "light"; + } + public Light getLight() { + return light; + } + public void setLight(Light light) { + this.light = light; + } + + public Vector3f getPosition() { + return position.getTransform().getPosition().clone().add(light.getPositionDelta()); + } + +} diff --git a/src/org/atriaSoft/gameEngine/components/ComponentLightSun.java b/src/org/atriaSoft/gameEngine/components/ComponentLightSun.java new file mode 100644 index 0000000..30af9ed --- /dev/null +++ b/src/org/atriaSoft/gameEngine/components/ComponentLightSun.java @@ -0,0 +1,20 @@ +package org.atriaSoft.gameEngine.components; + +import org.atriaSoft.gameEngine.Light; + +public class ComponentLightSun extends ComponentLight{ + + public ComponentLightSun() { + super(); + } + + public ComponentLightSun(Light light) { + super(light); + } + +// @Override +// public String getType() { +// return "sun"; +// } + +} diff --git a/src/org/atriaSoft/gameEngine/components/ComponentMaterial.java b/src/org/atriaSoft/gameEngine/components/ComponentMaterial.java new file mode 100644 index 0000000..e07ab37 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/components/ComponentMaterial.java @@ -0,0 +1,30 @@ +package org.atriaSoft.gameEngine.components; + +import org.atriaSoft.gameEngine.Component; +import org.atriaSoft.gameEngine.Material; + +public class ComponentMaterial extends Component { + // the material is not a resource, it can change in time... with AI or selection... + private Material material; + + public ComponentMaterial(Material material) { + super(); + this.material = material; + } + + public ComponentMaterial() { + super(); + this.material = new Material(); + } + @Override + public String getType() { + return "material"; + } + public Material getMaterial() { + return material; + } + public void setMaterial(Material material) { + this.material = material; + } + +} diff --git a/src/org/atriaSoft/gameEngine/components/ComponentParticle.java b/src/org/atriaSoft/gameEngine/components/ComponentParticle.java index 82ccab6..9beb2d1 100644 --- a/src/org/atriaSoft/gameEngine/components/ComponentParticle.java +++ b/src/org/atriaSoft/gameEngine/components/ComponentParticle.java @@ -1,12 +1,13 @@ package org.atriaSoft.gameEngine.components; import org.atriaSoft.gameEngine.Component; +import org.atriaSoft.gameEngine.engines.EngineParticle; public class ComponentParticle extends Component { @Override public String getType() { // TODO Auto-generated method stub - return null; + return EngineParticle.ENGINE_NAME; } } diff --git a/src/org/atriaSoft/gameEngine/components/ComponentRender.java b/src/org/atriaSoft/gameEngine/components/ComponentRender.java index 0be9bc3..fb17489 100644 --- a/src/org/atriaSoft/gameEngine/components/ComponentRender.java +++ b/src/org/atriaSoft/gameEngine/components/ComponentRender.java @@ -1,13 +1,21 @@ package org.atriaSoft.gameEngine.components; import org.atriaSoft.gameEngine.Component; +import org.atriaSoft.gameEngine.engines.EngineRender; -public class ComponentRender extends Component { +public abstract class ComponentRender extends Component { + private boolean propertyDebugNormal = false; @Override public String getType() { // TODO Auto-generated method stub - return null; + return EngineRender.ENGINE_NAME; } - + public void setPropertyDebugNormal(boolean value) { + this.propertyDebugNormal = value; + } + public boolean getPropertyDebugNormal() { + return this.propertyDebugNormal; + } + public abstract void render(); } diff --git a/src/org/atriaSoft/gameEngine/components/ComponentRenderColoredStaticMesh.java b/src/org/atriaSoft/gameEngine/components/ComponentRenderColoredStaticMesh.java new file mode 100644 index 0000000..c6c974d --- /dev/null +++ b/src/org/atriaSoft/gameEngine/components/ComponentRenderColoredStaticMesh.java @@ -0,0 +1,63 @@ + + +package org.atriaSoft.gameEngine.components; + +import org.atriaSoft.etk.Uri; +import org.atriaSoft.etk.math.Matrix4f; +import org.atriaSoft.gale.backend3d.OpenGL; +import org.atriaSoft.gale.resource.ResourceProgram; +import org.atriaSoft.gameEngine.Component; + +public class ComponentRenderColoredStaticMesh extends ComponentRender { + ComponentStaticMesh mesh = null; + ComponentPosition position = null; + ResourceProgram program = null; + private int GLMatrixTransformation; + private int GLMatrixProjection; + private int GLMatrixView; + + public ComponentRenderColoredStaticMesh(Uri vertexShader, Uri fragmentShader) { + this.program = ResourceProgram.create(vertexShader, fragmentShader); + if (this.program != null) { + this.GLMatrixTransformation = this.program.getUniform("in_matrixTransformation"); + this.GLMatrixProjection = this.program.getUniform("in_matrixProjection"); + this.GLMatrixView = this.program.getUniform("in_matrixView"); + } + + } + @Override + public void addFriendComponent(Component component) { + if (component.getType().contentEquals("static-mesh")) { + mesh = (ComponentStaticMesh)component; + } + if (component.getType().contentEquals("position")) { + position = (ComponentPosition)component; + } + } + @Override + public void removeFriendComponent(Component component) { + // nothing to do. + } + @Override + public void render() { + this.program.use(); + + Matrix4f projectionMatrix = OpenGL.getMatrix(); + Matrix4f viewMatrix = OpenGL.getCameraMatrix(); + Matrix4f transformationMatrix = position.getTransform().getOpenGLMatrix(); + this.mesh.bindForRendering(); + + this.program.uniformMatrix(this.GLMatrixView, viewMatrix); + this.program.uniformMatrix(this.GLMatrixProjection, projectionMatrix); + // Change the position for each element with the same pipeline you need to render ... + this.program.uniformMatrix(this.GLMatrixTransformation, transformationMatrix); + // update of flags is done asyncronously ==> need update befor drawing... + OpenGL.updateAllFlags(); + // Request the draw od the elements: + this.mesh.render(); + + this.mesh.unBindForRendering(); + + this.program.unUse(); + } +} diff --git a/src/org/atriaSoft/gameEngine/components/ComponentRenderTexturedMaterialsStaticMesh.java b/src/org/atriaSoft/gameEngine/components/ComponentRenderTexturedMaterialsStaticMesh.java new file mode 100644 index 0000000..f4d4b8b --- /dev/null +++ b/src/org/atriaSoft/gameEngine/components/ComponentRenderTexturedMaterialsStaticMesh.java @@ -0,0 +1,118 @@ +package org.atriaSoft.gameEngine.components; + +import org.atriaSoft.etk.Uri; +import org.atriaSoft.etk.math.Matrix4f; +import org.atriaSoft.etk.math.Vector3f; +import org.atriaSoft.gale.backend3d.OpenGL; +import org.atriaSoft.gale.resource.ResourceProgram; +import org.atriaSoft.gameEngine.Component; +import org.atriaSoft.gameEngine.Light; +import org.atriaSoft.gameEngine.Material; +import org.atriaSoft.gameEngine.engines.EngineLight; +class GlLightIndex { + int GLcolor; + int GLposition; + int GLattenuation; + public GlLightIndex(int gLcolor, int gLposition, int gLattenuation) { + GLcolor = gLcolor; + GLposition = gLposition; + GLattenuation = gLattenuation; + } +} +public class ComponentRenderTexturedMaterialsStaticMesh extends ComponentRender { + private static final int numberOfLight = 8; + ComponentStaticMesh mesh = null; + ComponentTexture texture = null; + ComponentMaterial material = null; + ComponentPosition position = null; + ResourceProgram program = null; + EngineLight lightEngine; + private int GLMatrixTransformation; + private int GLMatrixProjection; + private int GLMatrixView; + private int GLambientFactor; + private int GLdiffuseFactor; + private int GLspecularFactor; + private int GLshininess; + private GlLightIndex[] GLlights; + + public ComponentRenderTexturedMaterialsStaticMesh(Uri vertexShader, Uri fragmentShader, EngineLight lightEngine) { + this.lightEngine = lightEngine; + this.program = ResourceProgram.create(vertexShader, fragmentShader); + if (this.program != null) { + this.GLMatrixTransformation = this.program.getUniform("in_matrixTransformation"); + this.GLMatrixProjection = this.program.getUniform("in_matrixProjection"); + this.GLMatrixView = this.program.getUniform("in_matrixView"); + this.GLambientFactor = this.program.getUniform("in_material.ambientFactor"); + this.GLdiffuseFactor = this.program.getUniform("in_material.diffuseFactor"); + this.GLspecularFactor = this.program.getUniform("in_material.specularFactor"); + this.GLshininess = this.program.getUniform("in_material.shininess"); + this.GLlights = new GlLightIndex[numberOfLight]; + for (int iii=0; iii need update before drawing... + OpenGL.updateAllFlags(); + // Request the draw all the elements: + this.mesh.render(); + this.texture.unBindForRendering(); + this.mesh.unBindForRendering(); + this.program.unUse(); + } +} + diff --git a/src/org/atriaSoft/gameEngine/components/ComponentRenderTexturedStaticMesh.java b/src/org/atriaSoft/gameEngine/components/ComponentRenderTexturedStaticMesh.java new file mode 100644 index 0000000..f1183f2 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/components/ComponentRenderTexturedStaticMesh.java @@ -0,0 +1,64 @@ +package org.atriaSoft.gameEngine.components; + +import org.atriaSoft.etk.Uri; +import org.atriaSoft.etk.math.Matrix4f; +import org.atriaSoft.gale.backend3d.OpenGL; +import org.atriaSoft.gale.resource.ResourceProgram; +import org.atriaSoft.gameEngine.Component; + +public class ComponentRenderTexturedStaticMesh extends ComponentRender { + ComponentStaticMesh mesh = null; + ComponentTexture texture = null; + ComponentPosition position = null; + ResourceProgram program = null; + private int GLMatrixTransformation; + private int GLMatrixProjection; + private int GLMatrixView; + + public ComponentRenderTexturedStaticMesh(Uri vertexShader, Uri fragmentShader) { + this.program = ResourceProgram.create(vertexShader, fragmentShader); + if (this.program != null) { + this.GLMatrixTransformation = this.program.getUniform("in_matrixTransformation"); + this.GLMatrixProjection = this.program.getUniform("in_matrixProjection"); + this.GLMatrixView = this.program.getUniform("in_matrixView"); + } + + } + @Override + public void addFriendComponent(Component component) { + if (component.getType().contentEquals("static-mesh")) { + mesh = (ComponentStaticMesh)component; + } + if (component.getType().contentEquals("texture")) { + texture = (ComponentTexture)component; + } + if (component.getType().contentEquals("position")) { + position = (ComponentPosition)component; + } + } + @Override + public void removeFriendComponent(Component component) { + // nothing to do. + } + @Override + public void render() { + this.program.use(); + Matrix4f projectionMatrix = OpenGL.getMatrix(); + Matrix4f viewMatrix = OpenGL.getCameraMatrix(); + Matrix4f transformationMatrix = position.getTransform().getOpenGLMatrix(); + this.mesh.bindForRendering(); + this.texture.bindForRendering(); + this.program.uniformMatrix(this.GLMatrixView, viewMatrix); + this.program.uniformMatrix(this.GLMatrixProjection, projectionMatrix); + // Change the position for each element with the same pipeline you need to render ... + this.program.uniformMatrix(this.GLMatrixTransformation, transformationMatrix); + // update of flags is done asynchronously ==> need update before drawing... + OpenGL.updateAllFlags(); + // Request the draw all the elements: + this.mesh.render(); + this.texture.unBindForRendering(); + this.mesh.unBindForRendering(); + this.program.unUse(); + } +} + diff --git a/src/org/atriaSoft/gameEngine/components/ComponentStaticMesh.java b/src/org/atriaSoft/gameEngine/components/ComponentStaticMesh.java new file mode 100644 index 0000000..4103b55 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/components/ComponentStaticMesh.java @@ -0,0 +1,49 @@ +package org.atriaSoft.gameEngine.components; + +import org.atriaSoft.etk.Uri; +import org.atriaSoft.gameEngine.Component; +import org.atriaSoft.gameEngine.resource.ResourceStaticMesh; +import org.atriaSoft.gameEngine.resource.ResourceStaticMeshObj; + +public class ComponentStaticMesh extends Component { + private ResourceStaticMesh mesh = null; + + @Override + public String getType() { + // TODO Auto-generated method stub + return "static-mesh"; + } + + public ComponentStaticMesh(Uri objectFileName) { + // TODO: check if it is OBJ ... + mesh = ResourceStaticMeshObj.create(objectFileName); + } + public ComponentStaticMesh(ResourceStaticMesh mesh) { + this.mesh = mesh; + } + + public ResourceStaticMesh getMesh() { + return mesh; + } + + public void bindForRendering() { + if (mesh == null) { + return; + } + mesh.bindForRendering(); + } + + public void unBindForRendering() { + if (mesh == null) { + return; + } + mesh.unBindForRendering(); + } + + public void render() { + if (mesh == null) { + return; + } + mesh.render(); + } +} diff --git a/src/org/atriaSoft/gameEngine/components/ComponentTexture.java b/src/org/atriaSoft/gameEngine/components/ComponentTexture.java new file mode 100644 index 0000000..22fb5ec --- /dev/null +++ b/src/org/atriaSoft/gameEngine/components/ComponentTexture.java @@ -0,0 +1,32 @@ +package org.atriaSoft.gameEngine.components; + +import org.atriaSoft.etk.Uri; +import org.atriaSoft.gale.resource.ResourceTexture; +import org.atriaSoft.gale.test.sample2.Log; +import org.atriaSoft.gameEngine.Component; + +public class ComponentTexture extends Component { + + private ResourceTexture texture; + @Override + public String getType() { + // TODO Auto-generated method stub + return "texture"; + } + public ComponentTexture(Uri textureName) { + this.texture = ResourceTexture.createFromPng(textureName); + if (this.texture == null) { + Log.error("can not instanciate Texture ..."); + return; + } + + } + public void bindForRendering() { + this.texture.bindForRendering(0); + + } + public void unBindForRendering() { + this.texture.unBindForRendering(); + } + +} diff --git a/src/org/atriaSoft/gameEngine/components/ComponentTexturePack.java b/src/org/atriaSoft/gameEngine/components/ComponentTexturePack.java new file mode 100644 index 0000000..06246b0 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/components/ComponentTexturePack.java @@ -0,0 +1,13 @@ +package org.atriaSoft.gameEngine.components; + +import org.atriaSoft.gameEngine.Component; + +public class ComponentTexturePack extends Component { + + @Override + public String getType() { + // TODO Auto-generated method stub + return "texture-pack"; + } + +} diff --git a/src/org/atriaSoft/gameEngine/components/CoponentPhysics.java b/src/org/atriaSoft/gameEngine/components/CoponentPhysics.java index 356b534..91b6bd9 100644 --- a/src/org/atriaSoft/gameEngine/components/CoponentPhysics.java +++ b/src/org/atriaSoft/gameEngine/components/CoponentPhysics.java @@ -7,6 +7,6 @@ public class CoponentPhysics extends Component { @Override public String getType() { // TODO Auto-generated method stub - return null; + return "physics"; } } diff --git a/src/org/atriaSoft/gameEngine/data/wireColor.frag b/src/org/atriaSoft/gameEngine/data/wireColor.frag new file mode 100644 index 0000000..2a8ac6b --- /dev/null +++ b/src/org/atriaSoft/gameEngine/data/wireColor.frag @@ -0,0 +1,16 @@ +#version 400 core + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +in vec4 io_color; + +// output: +out vec4 out_Color; + +void main(void) { + out_Color = vec4(1.0,0.0,0.0,1.0); + // io_color; +} diff --git a/src/org/atriaSoft/gameEngine/data/wireColor.vert b/src/org/atriaSoft/gameEngine/data/wireColor.vert new file mode 100644 index 0000000..e674f99 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/data/wireColor.vert @@ -0,0 +1,21 @@ +#version 400 core + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +// Input: +in vec3 in_position; +in vec4 in_colors; +uniform mat4 in_matrixTransformation; +uniform mat4 in_matrixProjection; +uniform mat4 in_matrixView; + +// output: +out vec4 io_color; + +void main(void) { + gl_Position = in_matrixProjection * in_matrixView * in_matrixTransformation * vec4(in_position, 1.0); + io_color = in_colors; +} diff --git a/src/org/atriaSoft/gameEngine/engines/EngineAI.java b/src/org/atriaSoft/gameEngine/engines/EngineAI.java index b94b070..fa60cb4 100644 --- a/src/org/atriaSoft/gameEngine/engines/EngineAI.java +++ b/src/org/atriaSoft/gameEngine/engines/EngineAI.java @@ -1,12 +1,19 @@ package org.atriaSoft.gameEngine.engines; +import java.util.Vector; + import org.atriaSoft.gameEngine.Component; import org.atriaSoft.gameEngine.Engine; import org.atriaSoft.gameEngine.Environement; +import org.atriaSoft.gameEngine.Log; import org.atriaSoft.gameEngine.camera.Camera; +import org.atriaSoft.gameEngine.components.ComponentAI; public class EngineAI extends Engine { - + public static final String ENGINE_NAME = "ia"; + private float accumulator = 0; + private static float TIME_STEP = 5.0f; + private Vector components; public EngineAI(Environement env) { super(env); // TODO Auto-generated constructor stub @@ -14,38 +21,48 @@ public class EngineAI extends Engine { @Override public void componentRemove(Component ref) { - // TODO Auto-generated method stub - + components.remove(ref); } @Override public void componentAdd(Component ref) { - // TODO Auto-generated method stub - + if (ref instanceof ComponentAI == false) { + return; + } + components.add((ComponentAI)ref); } @Override public void update(long deltaMili) { - // TODO Auto-generated method stub + // Add the time difference in the accumulator + accumulator += (float)deltaMili*0.0001f; + // While there is enough accumulated time to take one or several physics steps + while (accumulator >= TIME_STEP) { + Log.warning("Generate for " + accumulator + " / " + TIME_STEP + " for:" + components.size()); + // call every object to usdate their constant forces applyed + for (ComponentAI it: components) { + it.update(TIME_STEP); + } + // Decrease the accumulated time + accumulator -= TIME_STEP; + } } @Override public void render(long deltaMili, Camera camera) { - // TODO Auto-generated method stub - + // nothing to do ... } @Override public void renderDebug(long deltaMili, Camera camera) { - // TODO Auto-generated method stub - + // nothing to do ... } @Override public String getType() { // TODO Auto-generated method stub - return null; + return ENGINE_NAME; } } diff --git a/src/org/atriaSoft/gameEngine/engines/EngineLight.java b/src/org/atriaSoft/gameEngine/engines/EngineLight.java new file mode 100644 index 0000000..6775408 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/engines/EngineLight.java @@ -0,0 +1,82 @@ +package org.atriaSoft.gameEngine.engines; + +import java.util.Vector; + +import org.atriaSoft.etk.math.Vector3f; +import org.atriaSoft.gameEngine.Component; +import org.atriaSoft.gameEngine.Engine; +import org.atriaSoft.gameEngine.Environement; +import org.atriaSoft.gameEngine.Light; +import org.atriaSoft.gameEngine.Log; +import org.atriaSoft.gameEngine.camera.Camera; +import org.atriaSoft.gameEngine.components.ComponentAI; +import org.atriaSoft.gameEngine.components.ComponentLight; +import org.atriaSoft.gameEngine.components.ComponentLightSun; + +public class EngineLight extends Engine { + public static final String ENGINE_NAME = "light"; + private Vector componentLights = new Vector(); + private Vector componentSuns = new Vector(); + public EngineLight(Environement env) { + super(env); + // TODO Auto-generated constructor stub + } + + @Override + public void componentRemove(Component ref) { + componentLights.remove(ref); + componentSuns.remove(ref); + } + + @Override + public void componentAdd(Component ref) { + if (ref instanceof ComponentLightSun == true) { + componentSuns.add((ComponentLightSun)ref); + return; + } + if (ref instanceof ComponentLight == true) { + componentLights.add((ComponentLight)ref); + return; + } + } + + @Override + public void update(long deltaMili) { + // nothing to do ... + } + + @Override + public void render(long deltaMili, Camera camera) { + // nothing to do ... + } + + @Override + public void renderDebug(long deltaMili, Camera camera) { + // nothing to do ... + } + + @Override + public String getType() { + // TODO Auto-generated method stub + return ENGINE_NAME; + } + + public Light[] getNearest(Vector3f position) { + Light[] out = new Light[8]; + int count = 0; + for (ComponentLightSun elem: componentSuns) { + out[count] = new Light(elem.getLight().getColor(), elem.getPosition(), elem.getLight().getAttenuation()); + count++; + } + float maxDistance = 50*50; + for (ComponentLight elem: componentLights) { + Vector3f pos = elem.getPosition(); + if (pos.distance2(position) < maxDistance) { + out[count] = new Light(elem.getLight().getColor(), pos, elem.getLight().getAttenuation()); + count++; + } + } + return out; + } + +} diff --git a/src/org/atriaSoft/gameEngine/engines/EngineParticle.java b/src/org/atriaSoft/gameEngine/engines/EngineParticle.java index 33ffe90..364ce00 100644 --- a/src/org/atriaSoft/gameEngine/engines/EngineParticle.java +++ b/src/org/atriaSoft/gameEngine/engines/EngineParticle.java @@ -6,6 +6,7 @@ import org.atriaSoft.gameEngine.Environement; import org.atriaSoft.gameEngine.camera.Camera; public class EngineParticle extends Engine { + public static final String ENGINE_NAME = "particle"; public EngineParticle(Environement env) { super(env); @@ -45,7 +46,7 @@ public class EngineParticle extends Engine { @Override public String getType() { // TODO Auto-generated method stub - return null; + return ENGINE_NAME; } diff --git a/src/org/atriaSoft/gameEngine/engines/EnginePhysics.java b/src/org/atriaSoft/gameEngine/engines/EnginePhysics.java index ac381d0..266f572 100644 --- a/src/org/atriaSoft/gameEngine/engines/EnginePhysics.java +++ b/src/org/atriaSoft/gameEngine/engines/EnginePhysics.java @@ -6,6 +6,7 @@ import org.atriaSoft.gameEngine.Environement; import org.atriaSoft.gameEngine.camera.Camera; public class EnginePhysics extends Engine { + public static final String ENGINE_NAME = "physics"; public EnginePhysics(Environement env) { super(env); @@ -45,7 +46,7 @@ public class EnginePhysics extends Engine { @Override public String getType() { // TODO Auto-generated method stub - return null; + return ENGINE_NAME; } } diff --git a/src/org/atriaSoft/gameEngine/engines/EngineRender.java b/src/org/atriaSoft/gameEngine/engines/EngineRender.java index 5e54d83..14e7aaa 100644 --- a/src/org/atriaSoft/gameEngine/engines/EngineRender.java +++ b/src/org/atriaSoft/gameEngine/engines/EngineRender.java @@ -1,12 +1,24 @@ package org.atriaSoft.gameEngine.engines; +import java.util.Vector; + +import org.atriaSoft.gale.test.sample2.Log; import org.atriaSoft.gameEngine.Component; import org.atriaSoft.gameEngine.Engine; import org.atriaSoft.gameEngine.Environement; import org.atriaSoft.gameEngine.camera.Camera; +import org.atriaSoft.gameEngine.components.ComponentRender; + +class ResultNearestElement { + public ComponentRender element; + public float dist; +}; public class EngineRender extends Engine { - + public static final String ENGINE_NAME = "render"; + private Vector components = new Vector(); + private Vector displayElementOrdered = new Vector(); + //private ResourceColored3DObject debugDrawProperty; public EngineRender(Environement env) { super(env); // TODO Auto-generated constructor stub @@ -14,14 +26,15 @@ public class EngineRender extends Engine { @Override public void componentRemove(Component ref) { - // TODO Auto-generated method stub - + components.remove(ref); } @Override public void componentAdd(Component ref) { - // TODO Auto-generated method stub - + if (ref instanceof ComponentRender == false) { + return; + } + components.add((ComponentRender)ref); } @Override @@ -32,8 +45,73 @@ public class EngineRender extends Engine { @Override public void render(long deltaMili, Camera camera) { - // TODO Auto-generated method stub + //Matrix4f tmpMatrix; + for (ComponentRender it: this.components) { + //Log.info("Render " + it); + it.render(); + } + /* + getOrderedElementForDisplay(this.displayElementOrdered, camera->getEye(), camera->getViewVector()); + Log.verbose("DRAW : " + this.displayElementOrdered.size() + "/" + this.component.size() + " elements"); + // note : the first pass is done at the reverse way to prevent multiple display od the same point in the screen + // (and we remember that the first pass is to display all the non transparent elements) + for (int32t iii=this.displayElementOrdered.size()-1; iii >= 0; iii--) { + this.displayElementOrdered[iii].element->draw(0); + } + // for the other pass the user can draw transparent elements ... + for (int32t pass=1; pass <= NUMBEROFSUBPASS+1; pass++) { + for (auto &it: this.displayElementOrdered) { + it.element->draw(pass); + } + } + */ + + } + +// @Override +// public void renderDebug(long deltaMili, Camera camera) { +// //Log.debug("Draw (start)"); +// Matrix4f tmpMatrix; +// getOrderedElementForDisplay(this.displayElementOrdered, camera->getEye(), camera->getViewVector()); +// Log.verbose("DRAW : " + this.displayElementOrdered.size() + "/" + this.component.size() + " elements"); +//// if (propertyDebugPhysic.get() == true) { +//// // Draw debug ... (Object) +//// for (int32t iii=this.displayElementOrdered.size()-1; iii >= 0; iii--) { +//// this.displayElementOrdered[iii].element->drawDebug(this.debugDrawProperty, camera); +//// } +//// // Draw debug ... (Camera) +//// /* +//// etk::Map> listCamera = this.env->getCameraList(); +//// for (auto &itCam : listCamera) { +//// if (itCam.second != null) { +//// itCam.second->drawDebug(this.debugDrawProperty, camera); +//// } +//// } +//// */ +//// } +// if (propertyDebugNormal.get() == true) { +// // Draw debug ... (Object) +// for (int32t iii=this.displayElementOrdered.size()-1; iii >= 0; iii--) { +// this.displayElementOrdered[iii].element.drawNormalDebug(this.debugDrawProperty); +// } +// } +//// if (propertyDebugApplication.get() == true) { +//// // Draw debug ... (User) +//// signalDisplayDebug.emit(this.debugDrawProperty); +//// } +//// /* TODO: set it back ... +//// if (camera != null) { +//// this.env->getParticuleEngine().draw(*camera); +//// } +//// */ +// +// } + + @Override + public String getType() { + // TODO Auto-generated method stub + return ENGINE_NAME; } @Override @@ -42,10 +120,56 @@ public class EngineRender extends Engine { } - @Override - public String getType() { - // TODO Auto-generated method stub - return null; - } - } +// //ResourceColored3DObject debugDrawProperty; +// void getOrderedElementForDisplay(etk::Vector& resultList, +// const vec3& position, +// const vec3& direction) { +// // TODO : Set it back ... corrected... +// // remove all unneeded elements (old display...) +// resultList.clear(); +// // basic element result +// ege::render::Engine::ResultNearestElement result; +// result.dist = 99999999999.0f; +// result.element = null; +// // for all element in the game we chek if it is needed to display it ... +// for (ComponentRender it: this.components) { +// // check null pointer +// if (it == null) { +// // no pointer null are set in the output list ... +// continue; +// } +// result.element = it; +// // check distance ... +// vec3 destPosition = result.element->getTransform().getPosition(); +// vec3 angleView = (destPosition - position); +// angleView.safeNormalize(); +// float dotResult = angleView.dot(direction); +// //Log.debug("Dot position : " + destPosition + " == > dot=" + dotResult); +// /* +// if (dotResult <= 0.85f) { +// // they are not in the camera angle view ... == > no need to process display +// continue; +// } +// */ +// result.dist = (position - destPosition).length(); +// /* +// if (result.dist>500.0f) { +// // The element is realy too far ... == > no need to display +// continue; +// } +// */ +// // try to add the element at the best positions: +// sizet jjj; +// for (jjj=0; jjjresult.dist) { +// resultList.insert(resultList.begin()+jjj, result); +// break; +// } +// } +// // add element at the end : +// if (jjj >= resultList.size()) { +// resultList.pushBack(result); +// } +// } +// } diff --git a/src/org/atriaSoft/gameEngine/resource/Mesh.java b/src/org/atriaSoft/gameEngine/resource/Mesh.java deleted file mode 100644 index 84f2c8d..0000000 --- a/src/org/atriaSoft/gameEngine/resource/Mesh.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.atriaSoft.gameEngine.resource; - -public class Mesh { - -} diff --git a/src/org/atriaSoft/gameEngine/resource/ResourceMesh.java b/src/org/atriaSoft/gameEngine/resource/ResourceMesh.java new file mode 100644 index 0000000..0b45d07 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/resource/ResourceMesh.java @@ -0,0 +1,962 @@ +package org.atriaSoft.gameEngine.resource; + +enum NormalMode { + none, + face, + vertex, +} + +public class ResourceMesh { + protected NormalMode normalMode; // select the normal mode of display + public void setNormalMode(NormalMode _mode) { + normalMode = _mode; + } + + protected bool checkNormal; //!< when enable, this check the normal of the mesh before sending it at the 3d card + protected: + ememory::SharedPtr GLprogram; + int32_t GLPosition; + int32_t GLMatrix; + int32_t GLMatrixPosition; + int32_t GLNormal; + int32_t GLtexture; + int32_t GLColor; + int32_t bufferOfset; + int32_t numberOfElments; + MaterialGlId GLMaterial; + ege::Light light; + protected: + etk::Vector listVertex; //!< List of all vertex in the element + etk::Vector listUV; //!< List of all UV point in the mesh (for the specify texture) + etk::Vector listColor; //!< List of all Color point in the mesh + etk::Vector listFacesNormal; //!< List of all Face normal, when calculated + etk::Vector listVertexNormal; //!< List of all Face normal, when calculated + etk::Map listFaces; //!< List of all Face for the mesh + etk::Map> materials; + etk::Vector> physics; //!< collision shape module ... (independent of bullet lib) + void clean() { + physics.clear(); + materials.clear(); + listFaces.clear(); + listColor.clear(); + listVertexNormal.clear(); + listFacesNormal.clear(); + listUV.clear(); + listVertex.clear(); + } + protected: + ememory::SharedPtr verticesVBO; + protected: + Mesh() + normalMode(ege::resource::Mesh::normalMode::none), + checkNormal(false), + GLPosition(-1), + GLMatrix(-1), + GLMatrixPosition(-1), + GLNormal(-1), + GLtexture(-1), + GLColor(-1), + bufferOfset(-1), + numberOfElments(-1), + listFaces(0,false), + materials(0,false), + pointerShape(null), + functionFreeShape(null) { + addResourceType("ege::resource::Mesh"); + } + void init(const etk::Uri& _fileName="---", + const etk::Uri& _shaderName=etk::Uri() //==> Shader is automatically selected (depending on the presence or ot of texture... + ) { + gale::Resource::init(_fileName.getString()); + EGE_VERBOSE("Load a new mesh : '" << _fileName << "'"); + // ------------------------------------------------------------------------------------------------ + // get the shader resource : + GLPosition = 0; + + light.setDirection(vec3(0.0f,0.0f,10)); + light.setHalfPlane(vec3(1.0f,0.0f,0.0f)); + light.setAmbientColor(vec4(1.0f,1.0f,1.0f,1.0f)); // Global anbiant color of the scene + light.setDiffuseColor(vec4(1.0f,1.0f,1.0f,1.0f)); // Color of the object + light.setSpecularColor(vec4(0.0f,0.0f,0.0f,1.0f)); // Light color reflection + // ------------------------------------------------------------------------------------------------ + // this is the properties of the buffer requested : "r"/"w" + "-" + buffer type "f"=flaot "i"=integer + verticesVBO = gale::resource::VirtualBufferObject::create(5); + if (verticesVBO == null) { + EGE_ERROR("can not instanciate VBO ..."); + return; + } + // TO facilitate some debugs we add a name of the VBO: + verticesVBO->setName("[VBO] of " + _fileName.getString()); + // ------------------------------------------------------------------------------------------------ + // load the curent file : + etk::String extention = etk::toLower(_fileName.getPath().getExtention()); + // select the corect loader : + if (extention == "obj") { + if (loadOBJ(_fileName) == false) { + EGE_ERROR("Error To load OBJ file " << _fileName ); + return; + } + } else if (extention == "emf") { + if (loadEMF(_fileName) == false) { + EGE_ERROR("Error To load EMF file " << _fileName ); + return; + } + //EGE_CRITICAL("Load a new mesh : '" << _fileName << "' (end)"); + } else { + // nothing to do == > reqiest an enmpty mesh ==> user manage it ... + } + // ------------------------------------------------------------------------------------------------ + etk::Uri shaderName = _shaderName; + if (shaderName.isEmpty() == true) { + shaderName = "DATA:///material3D.prog"; + for (auto &it: materials) { + if (it.second->haveTexture() == true) { + shaderName = "DATA:///material3DTextured.prog"; + break; + } + } + } + // ------------------------------------------------------------------------------------------------ + EGE_VERBOSE(name << " " << light << " shader=" << shaderName); + GLprogram = gale::resource::Program::create(shaderName); + if (GLprogram != null) { + GLPosition = GLprogram->getAttribute("EW_coord3d"); + GLtexture = GLprogram->getAttribute("EW_texture2d"); + GLNormal = GLprogram->getAttribute("EW_normal"); + GLColor = GLprogram->getAttribute("EW_color"); + GLMatrix = GLprogram->getUniform("EW_MatrixTransformation"); + GLMatrixPosition = GLprogram->getUniform("EW_MatrixPosition"); + // Link material and Lights + GLMaterial.link(GLprogram, "EW_material"); + light.link(GLprogram, "EW_directionalLight"); + } + // ------------------------------------------------------------------------------------------------ + } + @Override + public void cleanUp() { + // remove dynamics dependencies : + if (functionFreeShape != null) { + functionFreeShape(pointerShape); + pointerShape = null; + } + } + public: + virtual void draw(mat4& _positionMatrix, bool _enableDepthTest=true, bool _enableDepthUpdate=true) { + // TODO : Remove this, it is just for test the 23-04-2016 + //checkNormal = false; + EGE_VERBOSE("draw Mesh : " << name << " (start)"); + if (GLprogram == null) { + EGE_ERROR("No shader ..."); + return; + } + //EGE_DEBUG(name << " " << light); + if (_enableDepthTest == true) { + gale::openGL::enable(gale::openGL::flag_depthTest); + if (_enableDepthUpdate == false) { + glDepthMask(GL_FALSE); + } + } else { + gale::openGL::disable(gale::openGL::flag_depthTest); + } + //EGE_DEBUG(" display " << coord.size() << " elements" ); + GLprogram->use(); + // set Matrix : translation/positionMatrix + mat4 projMatrix = gale::openGL::getMatrix(); + mat4 camMatrix = gale::openGL::getCameraMatrix(); + mat4 tmpMatrix = projMatrix * camMatrix; + GLprogram->uniformMatrix(GLMatrix, tmpMatrix); + GLprogram->uniformMatrix(GLMatrixPosition, _positionMatrix); + // position : + GLprogram->sendAttributePointer(GLPosition, verticesVBO, MESH_VBO_VERTICES); + // Texture (if needed): + if (listUV.size() != 0) { + GLprogram->sendAttributePointer(GLtexture, verticesVBO, MESH_VBO_TEXTURE); + } + // position : + if (normalMode != ege::resource::Mesh::normalMode::none) { + GLprogram->sendAttributePointer(GLNormal, verticesVBO, MESH_VBO_VERTICES_NORMAL); + #if DEBUG + // TODO : ... + #endif + #if DEBUG + } else { + // TODO : ... + } + #else + } + #endif + // colors : + GLprogram->sendAttributePointer(GLColor, verticesVBO, MESH_VBO_COLOR); + // draw lights : + //EGE_INFO("light : " << light); + light.draw(GLprogram); + #ifdef DISPLAY_NB_VERTEX_DISPLAYED + int32_t nbElementDrawTheoric = 0; + int32_t nbElementDraw = 0; + #endif + for (size_t kkk=0; kkkdraw(GLprogram, GLMaterial); + if (true) { // TODO : understand why the optimisation does not work at all ... : if (checkNormal == false) { + gale::openGL::drawElements(materials[listFaces.getKey(kkk)]->getRenderModeOpenGl(), listFaces.getValue(kkk).index); + #ifdef DISPLAY_NB_VERTEX_DISPLAYED + nbElementDraw += listFaces.getValue(kkk).index.size(); + nbElementDrawTheoric += listFaces.getValue(kkk).index.size(); + #endif + } else { + mat4 mattttt = (projMatrix * camMatrix) * _positionMatrix; + mattttt.mat[3] = 0; + mattttt.mat[7] = 0; + mattttt.mat[11] = 0; + //vec3 cameraNormal = vec3(-mattttt.mat[2], -mattttt.mat[6], -mattttt.mat[10]); + vec3 cameraNormal = vec3(0,0,-1); + cameraNormal.normalized(); + // remove face that is notin the view ... + etk::Vector tmpIndexResult; + etk::Vector& tmppFaces = listFaces.getValue(kkk).faces; + //etk::Vector& tmppIndex = listFaces.getValue(kkk).index; + switch(normalMode) { + case ege::resource::Mesh::normalMode::face: + for(size_t iii=0; iii= 0.0f) { + tmpIndexResult.pushBack(iii*3); + tmpIndexResult.pushBack(iii*3+1); + tmpIndexResult.pushBack(iii*3+2); + } + } + break; + case ege::resource::Mesh::normalMode::vertex: + for(size_t iii=0; iii= -0.2f) + || ((mattttt * listVertexNormal[tmppFaces[iii].normal[1]]).dot(cameraNormal) >= -0.2f) + || ((mattttt * listVertexNormal[tmppFaces[iii].normal[2]]).dot(cameraNormal) >= -0.2f) ) { + tmpIndexResult.pushBack(iii*3); + tmpIndexResult.pushBack(iii*3+1); + tmpIndexResult.pushBack(iii*3+2); + } + } + break; + default: + for(size_t iii=0; iiigetRenderModeOpenGl(), tmpIndexResult); + #ifdef DISPLAY_NB_VERTEX_DISPLAYED + nbElementDraw += tmpIndexResult.size(); + nbElementDrawTheoric += listFaces.getValue(kkk).index.size(); + #endif + } + } + #ifdef DISPLAY_NB_VERTEX_DISPLAYED + if (listFaces.size() == 0) { + EGE_ERROR(" !!!! No Face to display elements [" << name << "]"); + } else { + if (nbElementDrawTheoric != 0) { + EGE_WARNING(((float)nbElementDraw/(float)nbElementDrawTheoric*100.0f) << "% Request draw : " << listFaces.size() << ":" << nbElementDraw << "/" << nbElementDrawTheoric << " elements [" << name << "]"); + } else { + EGE_WARNING("0% Request draw : " << listFaces.size() << ":" << nbElementDraw << "/" << nbElementDrawTheoric << " elements [" << name << "]"); + } + } + #endif + GLprogram->unUse(); + + if (_enableDepthTest == true){ + if (_enableDepthUpdate == false) { + glDepthMask(GL_TRUE); + } + gale::openGL::disable(gale::openGL::flag_depthTest); + } + // TODO : UNDERSTAND why ... it is needed + gale::openGL::unbindBuffer(); + EGE_VERBOSE("draw Mesh : " << name << " ( end )"); + } + + virtual void draw(mat4& _positionMatrix, + Color _mainColor, + bool _enableDepthTest = true, + bool _enableDepthUpdate = true) { + draw(_positionMatrix, _enableDepthTest, _enableDepthUpdate); + } + // For debug only ... + void drawNormal(mat4& _positionMatrix, + ememory::SharedPtr _draw) { + Color tmpColor(0.0, 1.0, 0.0, 1.0); + etk::Vector vertices; + // generate element in 2 pass : + // - create new index dependeng a vertex is a unique componenet of position, texture, normal + // - the index list generation (can be dynamic ... (TODO later) + for (size_t kkk=0; kkkgetRenderMode()) { + case gale::openGL::renderMode::triangle: + case gale::openGL::renderMode::triangleStrip: + case gale::openGL::renderMode::triangleFan: + nbIndicInFace = 3; + break; + case gale::openGL::renderMode::line: + case gale::openGL::renderMode::lineStrip: + case gale::openGL::renderMode::lineLoop: + nbIndicInFace = 2; + break; + case gale::openGL::renderMode::point: + nbIndicInFace = 1; + break; + case gale::openGL::renderMode::quad: + case gale::openGL::renderMode::quadStrip: + nbIndicInFace = 4; + break; + case gale::openGL::renderMode::polygon: + nbIndicInFace = 3; + break; + } + FaceIndexing& tmpFaceList = listFaces.getValue(kkk); + for (size_t iii=0; iii= listFacesNormal.size()) { + EGE_ERROR("not enougth normal in the buffer ... " << index << " >= " << listFacesNormal.size()); + return; + } + vec3 normal = listFacesNormal[index]; + vertices.pushBack(center); + vertices.pushBack(center+normal*0.5f); + } break; + case ege::resource::Mesh::normalMode::none: + break; + } + } + } + _draw->drawLine(vertices, tmpColor, _positionMatrix); + } + void generateVBO() { + // calculate the normal of all faces if needed + if ( normalMode != ege::resource::Mesh::normalMode::none + && listFacesNormal.size() == 0) { + // when no normal detected == > auto generate Face normal .... + EGE_ERROR("Calculate normal face ... in case ????"); + calculateNormaleFace(listFaces.getKeys()[0]); + } + EGE_WARNING("Generate VBO for nb faces layers: " << listFaces.size() << " list layer=" << etk::toString(listFaces.getKeys())); + + // generate element in 2 pass: + // - create new index depending on a vertex is a unique component of position, texture, normal + // - the index list generation (can be dynamic ... (TODO later)) + for (size_t kkk=0; kkkgetRenderMode()) { + case gale::openGL::renderMode::triangle: + case gale::openGL::renderMode::triangleStrip: + case gale::openGL::renderMode::triangleFan: + nbIndicInFace = 3; + break; + case gale::openGL::renderMode::line: + case gale::openGL::renderMode::lineStrip: + case gale::openGL::renderMode::lineLoop: + nbIndicInFace = 2; + break; + case gale::openGL::renderMode::point: + nbIndicInFace = 1; + break; + case gale::openGL::renderMode::quad: + case gale::openGL::renderMode::quadStrip: + nbIndicInFace = 4; + break; + case gale::openGL::renderMode::polygon: + nbIndicInFace = 3; + break; + } + #ifdef TRY_MINIMAL_VBO + int64_t tmpppppp=0; + #endif + FaceIndexing& tmpFaceList = listFaces.getValue(kkk); + for (size_t iii=0; iiisizeOnBufferVec3(MESH_VBO_VERTICES); jjj++) { + if( verticesVBO->getOnBufferVec3(MESH_VBO_VERTICES,jjj) == position + && verticesVBO->getOnBufferVec3(MESH_VBO_VERTICES_NORMAL,jjj) == normal + && verticesVBO->getOnBufferVec2(MESH_VBO_TEXTURE,jjj) == texturepos) { + vertexVBOId[indice] = jjj; + elementFind = true; + //EGE_DEBUG("search indice : " << jjj); + tmpppppp += jjj; + // stop searching ... + break; + } + } + #endif + if (elementFind == false) { + verticesVBO->pushOnBuffer(MESH_VBO_VERTICES, position); + if (normalMode != ege::resource::Mesh::normalMode::none) { + verticesVBO->pushOnBuffer(MESH_VBO_VERTICES_NORMAL, normal); + } + verticesVBO->pushOnBuffer(MESH_VBO_TEXTURE, texturepos); + verticesVBO->pushOnBuffer(MESH_VBO_COLOR, color); + vertexVBOId[indice] = verticesVBO->bufferSize(MESH_VBO_VERTICES)-1; + } + } + for(size_t indice=0 ; indiceflush(); + } + private: + void calculateNormaleFace(const etk::String& _materialName) { + listFacesNormal.clear(); + if (normalMode == ege::resource::Mesh::normalMode::face) { + EGE_VERBOSE("calculateNormaleFace(" << _materialName << ")"); + gale::openGL::renderMode tmpRenderMode = materials[_materialName]->getRenderMode(); + if ( tmpRenderMode == gale::openGL::renderMode::point + || tmpRenderMode == gale::openGL::renderMode::line + || tmpRenderMode == gale::openGL::renderMode::lineStrip + || tmpRenderMode == gale::openGL::renderMode::lineLoop) { + EGE_ERROR("calculateNormaleFace(" << _materialName << ") : can not calculate normal on lines ..."); + normalMode = ege::resource::Mesh::normalMode::none; + return; + } + for(auto &it : listFaces[_materialName].faces) { + // for all case, We use only the 3 vertex for quad element, in theory 3D modeler export element in triangle if it is not a real plane. + vec3 normal = (listVertex[it.vertex[0]]-listVertex[it.vertex[1]]).cross(listVertex[it.vertex[1]]-listVertex[it.vertex[2]]); + //EGE_INFO("normal: " << normal.normalized()); + if (normal == vec3(0,0,0)) { + EGE_ERROR("Null vertor for a face ... " << listVertex[it.vertex[0]] << " " << listVertex[it.vertex[1]] << " " << listVertex[it.vertex[2]]); + listFacesNormal.pushBack(vec3(1,0,0)); + } else { + listFacesNormal.pushBack(normal.normalized()); + } + int32_t normalID = listFacesNormal.size() - 1; + it.normal[0] = normalID; + it.normal[1] = normalID; + it.normal[2] = normalID; + } + } + } + void calculateNormaleEdge(const etk::String& _materialName) { + listVertexNormal.clear(); + if (normalMode == ege::resource::Mesh::normalMode::vertex) { + EGE_INFO("calculateNormaleEdge(" << _materialName << ")"); + gale::openGL::renderMode tmpRenderMode = materials[_materialName]->getRenderMode(); + if ( tmpRenderMode == gale::openGL::renderMode::point + || tmpRenderMode == gale::openGL::renderMode::line + || tmpRenderMode == gale::openGL::renderMode::lineStrip + || tmpRenderMode == gale::openGL::renderMode::lineLoop) { + EGE_ERROR("calculateNormaleEdge(" << _materialName << ") : can not calculate normal on lines ..."); + normalMode = ege::resource::Mesh::normalMode::none; + return; + } + for(size_t iii=0 ; iii& tmpFaceList = listFaces[_materialName].faces; + vec3 normal(0,0,0); + // add the vertex from all the element in the list for face when the element in the face ... + for(size_t jjj=0 ; jjjpushOnBuffer(MESH_VBO_VERTICES_NORMAL, normal); + if( tmpFaceList[jjj].vertex[0] == (int32_t)iii + || tmpFaceList[jjj].vertex[1] == (int32_t)iii + || tmpFaceList[jjj].vertex[2] == (int32_t)iii) { + normal += listFacesNormal[jjj]; + } + } + if (normal == vec3(0,0,0)) { + listVertexNormal.pushBack(vec3(1,1,1)); + } else { + listVertexNormal.pushBack(normal.normalized()); + } + } + } + } + public : + void createViewBox(const etk::String& _materialName,float _size=1.0) { + normalMode = ege::resource::Mesh::normalMode::none; + ege::viewBox::create(materials, listFaces, listVertex, listUV, + _materialName, _size); + calculateNormaleFace(_materialName); + } + void createIcoSphere(const etk::String& _materialName,float _size=1.0, int32_t _subdivision=3) { + normalMode = ege::resource::Mesh::normalMode::none; + ege::icoSphere::create(materials, listFaces, listVertex, listUV, + _materialName, _size, _subdivision); + calculateNormaleFace(_materialName); + } + private: + bool loadOBJ(const etk::Uri& _fileName); + bool loadEMF(const etk::Uri& _fileName); + public: + void addMaterial(const etk::String& _name, ememory::SharedPtr _data) { + if (_data == null) { + EGE_ERROR(" can not add material with null pointer"); + return; + } + if (_name == "") { + EGE_ERROR(" can not add material with no name"); + return; + } + // really add the material: + EGE_WARNING("Add material: " << _name); + materials.add(_name, _data); + } + public: + /** + * @brief set the check of normal position befor sending it to the openGl card + * @param[in] _status New state. + */ + void setCheckNormal(bool _status) { + checkNormal=_status; + }; + /** + * @brief get the check value of normal position befor sending it to the openGl card + * @return get the chcking stus of normal or not + */ + bool getCheckNormal() { + return checkNormal; + }; + const etk::Vector>& getPhysicalProperties() { + for (auto &it: physics) { + if (it == null) { + EGE_WARNING("Get null ... "); + continue; + } + if (it->getType() == ege::physics::Shape::type::concave) { + // need to generate the internal list of point and triangle needed: + ege::physics::shape::Concave* tmpElement = it->toConcave(); + if (tmpElement == null) { + EGE_ERROR(" Concave ==> can not cast in Concave"); + return physics; + } + tmpElement->clear(); + //EGE_INFO(" add vertices : " << listVertex); + tmpElement->setListOfVertex(listVertex); + for (size_t kkk=0; kkk index; + for (auto &it : listFaces.getValue(kkk).faces) { + index.pushBack(it.vertex[0]); + index.pushBack(it.vertex[1]); + index.pushBack(it.vertex[2]); + } + //EGE_INFO(" add triangle : " << listFaces.getValue(kkk).index); + + //tmpElement->addTriangle(listFaces.getValue(kkk).index); + tmpElement->addTriangle(index); + } + //EGE_CRITICAL("kjlkj"); + // Can have only one concave element in a mesh ... + //return physics; + } + } + return physics; + } + void addPhysicElement(const ememory::SharedPtr& _shape) { + if (_shape == null) { + return; + } + physics.pushBack(_shape); + } + private: + void* pointerShape; //!< all mesh have a basic shape (bullet or other) the void pointer mermit to not depent on the bullet lib + public: + /** + * @brief set the shape pointer (no type == > user might know it ...) + * @param[in] _shape The new shape (this remove the previous one) + */ + void setShape(void* _shape) { + if (functionFreeShape!=null) { + functionFreeShape(pointerShape); + pointerShape = null; + } + pointerShape=_shape; + } + /** + * @brief get the pointer on the shame (no type) + * @return Pointer on shape. + */ + void* getShape() { + return pointerShape; + }; + private: + void (*functionFreeShape)(void* _pointer); + public: + void setFreeShapeFunction(void (*_functionFreeShape)(void* _pointer)) { + functionFreeShape = _functionFreeShape; + }; + /** + * @brief Add in the faces list the layer requested + * @param[in] _layerName face index to add + */ + void addFaceIndexing(const etk::String& _layerName) { + if (listFaces.exist(_layerName) == false) { + FaceIndexing empty; + listFaces.add(_layerName, empty); + } + } + public: + + void addPoint(const etk::String& _layerName, const vec3& _pos, Color _color) { + if ( listFaces.exist(_layerName) == false + || materials.exist(_layerName) == false) { + EGE_ERROR("Mesh layer : " << _layerName << " does not exist in list faces=" << listFaces.exist(_layerName) << " materials=" << listFaces.exist(_layerName) << " ..."); + return; + } + gale::openGL::renderMode tmpRenderMode = materials[_layerName]->getRenderMode(); + if (tmpRenderMode != gale::openGL::renderMode::point) { + EGE_ERROR("try to add Point in a mesh material section that not support Point"); + return; + } + // try to find position: + int32_t pos = findPositionInList(_pos); + // try to find UV mapping: + int32_t color = findColorInList(_color); + Face tmpFace; + tmpFace.setVertex(pos); + tmpFace.setColor(color, color, color); + listFaces[_layerName].faces.pushBack(tmpFace); + } + + void addLine(const etk::String& _layerName, const vec3& _pos1, const vec3& _pos2, Color _color) { + addLine( _layerName, _pos1, _pos2, _color, _color); + } + void addLine(const etk::String& _layerName, const vec3& _pos1, const vec3& _pos2, Color _color1, Color _color2) { + if ( listFaces.exist(_layerName) == false + || materials.exist(_layerName) == false) { + EGE_ERROR("Mesh layer : " << _layerName << " does not exist in list faces=" << listFaces.exist(_layerName) << " materials=" << listFaces.exist(_layerName) << " ..."); + return; + } + gale::openGL::renderMode tmpRenderMode = materials[_layerName]->getRenderMode(); + if ( tmpRenderMode != gale::openGL::renderMode::line + && tmpRenderMode != gale::openGL::renderMode::lineStrip + && tmpRenderMode != gale::openGL::renderMode::lineLoop) { + EGE_ERROR("try to add Line in a mesh material section that not support Line"); + return; + } + // try to find position: + int32_t pos1 = findPositionInList(_pos1); + int32_t pos2 = findPositionInList(_pos2); + // try to find UV mapping: + int32_t color1 = findColorInList(_color1); + int32_t color2 = findColorInList(_color2); + Face tmpFace; + tmpFace.setVertex(pos1, pos2); + tmpFace.setColor(color1, color2, color2); + listFaces[_layerName].faces.pushBack(tmpFace); + } + + void addLines(const etk::String& _layerName, const etk::Vector& _list, Color _color){ + for (size_t iii=1; iii<_list.size(); ++iii) { + addLine(_layerName, _list[iii-1], _list[iii], _color); + } + } + + void addLines(const etk::String& _layerName, const etk::Vector& _list, const etk::Vector& _color) { + if (_color.size() != _list.size()) { + EGE_ERROR("Can not add line with changing color without same number of color"); + return; + } + for (size_t iii=1; iii<_list.size(); ++iii) { + addLine(_layerName, _list[iii-1], _list[iii], _color[iii-1], _color[iii]); + } + } + + /** + * @not_in_doc + * @brief draw a colored triangle (usefull for debug and test) + * @param[in] _layerName Material and face indexing layer name + * @param[in] _pos1 First point position + * @param[in] _pos2 Second point position + * @param[in] _pos3 Third point position + * @param[in] _color1 color of the _pos1 element + * @param[in] _color2 color of the _pos2 element + * @param[in] _color3 color of the _pos3 element + */ + void addTriangle(const etk::String& _layerName, const vec3& _pos1, const vec3& _pos2, const vec3& _pos3, Color _color) { + addTriangle(_layerName, _pos1, _pos2, _pos3, _color, _color, _color); + } + /** + * @not_in_doc + * @brief draw a colored triangle (usefull for debug and test) + * @param[in] _layerName Material and face indexing layer name + * @param[in] _pos1 First point position + * @param[in] _pos2 Second point position + * @param[in] _pos3 Third point position + * @param[in] _color1 color of the _pos1 element + * @param[in] _color2 color of the _pos2 element + * @param[in] _color3 color of the _pos3 element + */ + void addTriangle(const etk::String& _layerName, const vec3& _pos1, const vec3& _pos2, const vec3& _pos3, + Color _color1, Color _color2, Color _color3) { + if ( listFaces.exist(_layerName) == false + || materials.exist(_layerName) == false) { + EGE_ERROR("Mesh layer : " << _layerName << " does not exist in list faces=" << listFaces.exist(_layerName) << " materials=" << listFaces.exist(_layerName) << " ..."); + return; + } + gale::openGL::renderMode tmpRenderMode = materials[_layerName]->getRenderMode(); + if ( tmpRenderMode == gale::openGL::renderMode::quad + || tmpRenderMode == gale::openGL::renderMode::quadStrip) { + EGE_TODO("Create quad interface ..."); + } else if ( tmpRenderMode == gale::openGL::renderMode::triangle + || tmpRenderMode == gale::openGL::renderMode::lineStrip + || tmpRenderMode == gale::openGL::renderMode::triangleFan) { + + // try to find position: + int32_t pos1 = findPositionInList(_pos1); + int32_t pos2 = findPositionInList(_pos2); + int32_t pos3 = findPositionInList(_pos3); + // try to find Color: + int32_t color1 = findColorInList(_color1); + int32_t color2 = findColorInList(_color2); + int32_t color3 = findColorInList(_color3); + Face tmpFace(pos1, -1, + pos2, -1, + pos3, -1); + tmpFace.setColor(color1, color2, color3); + listFaces[_layerName].faces.pushBack(tmpFace); + } else { + EGE_ERROR("try to add Quad in a mesh material section that not support Quad"); + return; + } + } + /** + * @not_in_doc + * @brief draw a colored quad (usefull for debug and test) + * @param[in] _layerName Material and face indexing layer name + * @param[in] _pos1 First point position + * @param[in] _pos2 Second point position + * @param[in] _pos3 Third point position + * @param[in] _pos4 faurth point position + * @param[in] _color color of all elements + */ + void addQuad(const etk::String& _layerName, const vec3& _pos1, const vec3& _pos2, const vec3& _pos3, const vec3& _pos4, Color _color) { + addQuad(_layerName, _pos1, _pos2, _pos3, _pos4, _color, _color, _color, _color); + } + /** + * @not_in_doc + * @brief draw a colored quad (usefull for debug and test) + * @param[in] _layerName Material and face indexing layer name + * @param[in] _pos1 First point position + * @param[in] _pos2 Second point position + * @param[in] _pos3 Third point position + * @param[in] _pos4 faurth point position + * @param[in] _color1 color of the _pos1 element + * @param[in] _color2 color of the _pos2 element + * @param[in] _color3 color of the _pos3 element + * @param[in] _color4 color of the _pos4 element + */ + void addQuad(const etk::String& _layerName, const vec3& _pos1, const vec3& _pos2, const vec3& _pos3, const vec3& _pos4, + Color _color1, Color _color2, Color _color3, Color _color4) { + addTriangle(_layerName, _pos1, _pos2, _pos3, _color1, _color2, _color3); + addTriangle(_layerName, _pos1, _pos3, _pos4, _color1, _color3, _color4); + } + /** + * @not_in_doc + * @brief draw a textured colored triangle (usefull for debug and test) + * @param[in] _layerName Material and face indexing layer name + * @param[in] _pos1 First point position + * @param[in] _pos2 Second point position + * @param[in] _pos3 Third point position + * @param[in] _color color of all elements + * @param[in] _uv1 texture position of the _pos1 element + * @param[in] _uv2 texture position of the _pos2 element + * @param[in] _uv3 texture position of the _pos3 element + */ + void addTriangle(const etk::String& _layerName, + const vec3& _pos1, const vec3& _pos2, const vec3& _pos3, + const vec2& _uv1, const vec2& _uv2, const vec2& _uv3, + Color _color) { + addTriangle(_layerName, _pos1, _pos2, _pos3, _uv1, _uv2, _uv3, _color, _color, _color); + } + /** + * @not_in_doc + * @brief draw a textured colored triangle (usefull for debug and test) + * @param[in] _layerName Material and face indexing layer name + * @param[in] _pos1 First point position + * @param[in] _pos2 Second point position + * @param[in] _pos3 Third point position + * @param[in] _color1 color of the _pos1 element + * @param[in] _color2 color of the _pos2 element + * @param[in] _color3 color of the _pos3 element + * @param[in] _uv1 texture position of the _pos1 element + * @param[in] _uv2 texture position of the _pos2 element + * @param[in] _uv3 texture position of the _pos3 element + */ + void addTriangle(const etk::String& _layerName, + const vec3& _pos1, const vec3& _pos2, const vec3& _pos3, + const vec2& _uv1, const vec2& _uv2, const vec2& _uv3, + Color _color1=etk::color::white, Color _color2=etk::color::white, Color _color3=etk::color::white) { + EGE_INFO("add Triangle: " << _layerName << " ..."); + if ( listFaces.exist(_layerName) == false + || materials.exist(_layerName) == false) { + EGE_ERROR("Mesh layer : " << _layerName << " does not exist in list faces=" << listFaces.exist(_layerName) << " materials=" << listFaces.exist(_layerName) << " ..."); + return; + } + gale::openGL::renderMode tmpRenderMode = materials[_layerName]->getRenderMode(); + if ( tmpRenderMode != gale::openGL::renderMode::triangle + && tmpRenderMode != gale::openGL::renderMode::triangleStrip + && tmpRenderMode != gale::openGL::renderMode::triangleFan) { + EGE_ERROR("try to add Line in a mesh material section that not support Line"); + return; + } + // try to find position: + int32_t pos1 = findPositionInList(_pos1); + int32_t pos2 = findPositionInList(_pos2); + int32_t pos3 = findPositionInList(_pos3); + // try to find UV mapping: + int32_t uv1 = findTextureInList(_uv1); + int32_t uv2 = findTextureInList(_uv2); + int32_t uv3 = findTextureInList(_uv3); + // try to find Color: + int32_t color1 = findColorInList(_color1); + int32_t color2 = findColorInList(_color2); + int32_t color3 = findColorInList(_color3); + Face tmpFace(pos1, uv1, + pos2, uv2, + pos3, uv3); + tmpFace.setColor(color1, color2, color3); + listFaces[_layerName].faces.pushBack(tmpFace); + EGE_INFO(" nbFace: " << listFaces[_layerName].faces.size()); + } + /** + * @not_in_doc + * @brief draw a textured colored quad (usefull for debug and test) + * @param[in] _layerName Material and face indexing layer name + * @param[in] _pos1 First point position + * @param[in] _pos2 Second point position + * @param[in] _pos3 Third point position + * @param[in] _pos4 faurth point position + * @param[in] _color color of all elements + * @param[in] _uv1 texture position of the _pos1 element + * @param[in] _uv2 texture position of the _pos2 element + * @param[in] _uv3 texture position of the _pos3 element + * @param[in] _uv4 texture position of the _pos4 element + */ + void addQuad(const etk::String& _layerName, + const vec3& _pos1, const vec3& _pos2, const vec3& _pos3, const vec3& _pos4, + const vec2& _uv1, const vec2& _uv2, const vec2& _uv3, const vec2& _uv4, + Color _color) { + addQuad(_layerName, _pos1, _pos2, _pos3, _pos4, _uv1, _uv2, _uv3, _uv4, _color, _color, _color, _color); + } + /** + * @not_in_doc + * @brief draw a textured quad (usefull for debug and test) + * @param[in] _layerName Material and face indexing layer name + * @param[in] _pos1 First point position + * @param[in] _pos2 Second point position + * @param[in] _pos3 Third point position + * @param[in] _pos4 faurth point position + * @param[in] _uv1 texture position of the _pos1 element + * @param[in] _uv2 texture position of the _pos2 element + * @param[in] _uv3 texture position of the _pos3 element + * @param[in] _uv4 texture position of the _pos4 element + * @param[in] _color1 color of the _pos1 element + * @param[in] _color2 color of the _pos2 element + * @param[in] _color3 color of the _pos3 element + * @param[in] _color4 color of the _pos4 element + */ + void addQuad(const etk::String& _layerName, + const vec3& _pos1, const vec3& _pos2, const vec3& _pos3, const vec3& _pos4, + const vec2& _uv1, const vec2& _uv2, const vec2& _uv3, const vec2& _uv4, + Color _color1=etk::color::white, Color _color2=etk::color::white, Color _color3=etk::color::white, Color _color4=etk::color::white) { + addTriangle(_layerName, _pos1, _pos2, _pos3, _uv1, _uv2, _uv3, _color1, _color2, _color3); + addTriangle(_layerName, _pos1, _pos3, _pos4, _uv1, _uv3, _uv4, _color1, _color3, _color4); + } + protected: + int32_t findPositionInList(const vec3& _pos) { + for (size_t iii=0; iii Init APPL (END)"); + creationDone = true; + } + + @Override + public void onRegenerateDisplay(Context context) { + //Log.verbose("Regenerate Gale Application"); + if (this.creationDone == false) { + return; + } + materialCube.setAmbientFactor(new Vector3f(1.0f,1.0f,1.0f)); + // apply a little rotation to show the element move + objectPosition.getTransform().applyRotation(basicRotation); + objectPosition.getTransform().applyRotation(basicRotation2); + env.periodicCall(); + markDrawingIsNeeded(); + } + + @Override + public void onDraw(Context _context) { + //Log.info("==> appl Draw ..."); + Vector2f size = getSize(); + if (this.creationDone == false) { + OpenGL.setViewPort(new Vector2f(0,0), size); + Color bgColor = new Color(0.8f, 0.5f, 0.5f, 1.0f); + OpenGL.clearColor(bgColor); + return; + } + // Store openGl context. + OpenGL.push(); + // set projection matrix: + Matrix4f tmpProjection = Matrix4f.createMatrixPerspective(3.14f*0.5f, getAspectRatio(), 0.1f, 50000); + OpenGL.setMatrix(tmpProjection); + + // set the basic openGL view port: (Draw in all the windows...) + OpenGL.setViewPort(new Vector2f(0,0), size); + + // clear background + Color bgColor = new Color(0.0f, 1.0f, 0.0f, 1.0f); + OpenGL.clearColor(bgColor); + // real clear request: + OpenGL.clear(OpenGL.ClearFlag.clearFlag_colorBuffer); + OpenGL.clear(OpenGL.ClearFlag.clearFlag_depthBuffer); + OpenGL.enable(Flag.flag_depthTest); + + env.render(20, "default"); + + // Restore context of matrix + OpenGL.pop(); + } + @Override + public void onPointer(KeySpecial special, + KeyType type, + int pointerID, + Vector2f pos, + KeyStatus state) { + env.onPointer(special, type, pointerID, pos, state); + } + @Override + public void onKeyboard(KeySpecial special, + KeyKeyboard type, + Character value, + KeyStatus state) { + env.onKeyboard(special, type, value, state); + } +} diff --git a/src/org/atriaSoft/gameEngine/sample/lowPoly/basic.frag b/src/org/atriaSoft/gameEngine/sample/lowPoly/basic.frag new file mode 100644 index 0000000..13d2aa8 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/sample/lowPoly/basic.frag @@ -0,0 +1,17 @@ +#version 400 core + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +in vec2 io_textureCoords; + +uniform sampler2D in_textureBase; + +// output: +out vec4 out_Color; + +void main(void) { + out_Color = texture(in_textureBase, io_textureCoords); +} diff --git a/src/org/atriaSoft/gameEngine/sample/lowPoly/basic.vert b/src/org/atriaSoft/gameEngine/sample/lowPoly/basic.vert new file mode 100644 index 0000000..c0dcaa7 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/sample/lowPoly/basic.vert @@ -0,0 +1,21 @@ +#version 400 core + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +// Input: +in vec3 in_position; +in vec2 in_textureCoords; +uniform mat4 in_matrixTransformation; +uniform mat4 in_matrixProjection; +uniform mat4 in_matrixView; + +// output: +out vec2 io_textureCoords; + +void main(void) { + gl_Position = in_matrixProjection * in_matrixView * in_matrixTransformation * vec4(in_position, 1.0); + io_textureCoords = in_textureCoords; +} diff --git a/src/org/atriaSoft/gameEngine/sample/lowPoly/basicMaterial.frag b/src/org/atriaSoft/gameEngine/sample/lowPoly/basicMaterial.frag new file mode 100644 index 0000000..2ea36f9 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/sample/lowPoly/basicMaterial.frag @@ -0,0 +1,80 @@ +#version 400 core + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +struct Light { + vec3 color; + vec3 position; + vec3 attenuation; +}; + +struct Material { + vec3 ambientFactor; + vec3 diffuseFactor; + vec3 specularFactor; + float shininess; +}; +const int MAX_LIGHT_NUMBER = 8; + + +in vec2 io_textureCoords; +in vec3 io_surfaceNormal; +in vec3 io_toCameraVector; +in vec3 io_toLightVector[MAX_LIGHT_NUMBER]; +// FOW: Fog Of War result calculation +in float io_fowVisibility; + +// texture properties +uniform sampler2D in_textureBase; +// Material +uniform Material in_material; +// 2 light for suns and other for locals ... +uniform Light in_lights[MAX_LIGHT_NUMBER]; +// global color of the sky ... needed to have a better color for the FOW +//uniform vec3 in_sky_color; +const vec3 in_sky_color = vec3(1.0,1.0,0.5); + +// output: +out vec4 out_Color; + +void main(void) { + // disable transparency elements in the texture ... + // Can be set at the start of the shader ... + vec4 textureColour = texture(in_textureBase, io_textureCoords); + if (textureColour.a < 0.5) { + discard; + } + + vec3 unitNormal = normalize(io_surfaceNormal); + vec3 unitVectorToCamera = normalize(io_toCameraVector); + vec3 totalDiffuse = vec3(0.0); + vec3 totalSpecular = vec3(0.0); + for(int iii=0; iii maybe set an uniform for this + totalDiffuse = max(totalDiffuse, 0.2); + + out_Color = vec4(totalDiffuse,1.0) * textureColour + vec4(totalSpecular, 1.0); + out_Color = mix(vec4(in_sky_color,1.0), out_Color, io_fowVisibility); +} + + + + diff --git a/src/org/atriaSoft/gameEngine/sample/lowPoly/basicMaterial.vert b/src/org/atriaSoft/gameEngine/sample/lowPoly/basicMaterial.vert new file mode 100644 index 0000000..c75190f --- /dev/null +++ b/src/org/atriaSoft/gameEngine/sample/lowPoly/basicMaterial.vert @@ -0,0 +1,59 @@ +#version 400 core + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +struct Light { + vec3 color; + vec3 position; + vec3 attenuation; +}; +const int MAX_LIGHT_NUMBER = 8; + +// Input: +in vec3 in_position; +in vec3 in_normal; +in vec2 in_textureCoords; +// 2 light for suns and other for locals ... +uniform Light in_lights[MAX_LIGHT_NUMBER]; + +uniform mat4 in_matrixTransformation; +uniform mat4 in_matrixProjection; +uniform mat4 in_matrixView; + +//uniform float in_numberOfRows; +//uniform vec2 in_offset; +const float in_numberOfRows = 1; +const vec2 in_offset = vec2(0.0,0.0); + +// Configuration of the FOV ==> TODO: Set it in parameter uniform ... +const float c_density = 0.007; +const float c_gradient = 1.5; + +// output: +out vec2 io_textureCoords; +out vec3 io_surfaceNormal; +out vec3 io_toCameraVector; +out vec3 io_toLightVector[MAX_LIGHT_NUMBER]; +// FOW: Fog Of War result calculation +out float io_fowVisibility; + +void main(void) { + vec4 worldPosition = in_matrixTransformation * vec4(in_position, 1.0); + vec4 positionRelativeToCam = in_matrixView * worldPosition; + gl_Position = in_matrixProjection * positionRelativeToCam; + io_textureCoords = (in_textureCoords/in_numberOfRows) + in_offset; + + io_surfaceNormal = (in_matrixTransformation * vec4(in_normal, 0.0)).xyz; + for(int iii=0;iii Init APPL (END)"); + creationDone = true; + } + + @Override + public void onRegenerateDisplay(Context context) { + //Log.verbose("Regenerate Gale Application"); + if (this.creationDone == false) { + return; + } + // apply a litthe rotation to show the element move + objectPosition.getTransform().applyRotation(basicRotation); + objectPosition.getTransform().applyRotation(basicRotation2); + env.periodicCall(); + markDrawingIsNeeded(); + } + + @Override + public void onDraw(Context _context) { + //Log.info("==> appl Draw ..."); + Vector2f size = getSize(); + if (this.creationDone == false) { + OpenGL.setViewPort(new Vector2f(0,0), size); + Color bgColor = new Color(0.8f, 0.5f, 0.5f, 1.0f); + OpenGL.clearColor(bgColor); + return; + } + // Store openGl context. + OpenGL.push(); + // set projection matrix: + Matrix4f tmpProjection = Matrix4f.createMatrixPerspective(3.14f*0.5f, getAspectRatio(), 0.1f, 50000); + OpenGL.setMatrix(tmpProjection); + + // set the basic openGL view port: (Draw in all the windows...) + OpenGL.setViewPort(new Vector2f(0,0), size); + + // clear background + Color bgColor = new Color(0.0f, 1.0f, 0.0f, 1.0f); + OpenGL.clearColor(bgColor); + // real clear request: + OpenGL.clear(OpenGL.ClearFlag.clearFlag_colorBuffer); + OpenGL.clear(OpenGL.ClearFlag.clearFlag_depthBuffer); + OpenGL.enable(Flag.flag_depthTest); + + env.render(20, "default"); + + // Restore context of matrix + OpenGL.pop(); + } + @Override + public void onPointer(KeySpecial special, + KeyType type, + int pointerID, + Vector2f pos, + KeyStatus state) { + env.onPointer(special, type, pointerID, pos, state); + } + @Override + public void onKeyboard(KeySpecial special, + KeyKeyboard type, + Character value, + KeyStatus state) { + env.onKeyboard(special, type, value, state); + } +} diff --git a/src/org/atriaSoft/gameEngine/sample/s1_texturedCube/Sample1TexturedCube.java b/src/org/atriaSoft/gameEngine/sample/s1_texturedCube/Sample1TexturedCube.java new file mode 100644 index 0000000..7c3985f --- /dev/null +++ b/src/org/atriaSoft/gameEngine/sample/s1_texturedCube/Sample1TexturedCube.java @@ -0,0 +1,13 @@ +package org.atriaSoft.gameEngine.sample.s1_texturedCube; + +import org.atriaSoft.etk.Uri; +import org.atriaSoft.gale.Gale; + +public class Sample1TexturedCube { + public static void main(String[] args) { + Uri.setGroup("DATA", "src/org/atriaSoft/gameEngine/sample/s1_texturedCube/"); + Uri.setGroup("DATA_EGE", "src/org/atriaSoft/gameEngine/data/"); + Uri.setGroup("RES", "res"); + Gale.run(new S1Application(), args); + } +} diff --git a/src/org/atriaSoft/gameEngine/sample/s1_texturedCube/basic.frag b/src/org/atriaSoft/gameEngine/sample/s1_texturedCube/basic.frag new file mode 100644 index 0000000..13d2aa8 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/sample/s1_texturedCube/basic.frag @@ -0,0 +1,17 @@ +#version 400 core + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +in vec2 io_textureCoords; + +uniform sampler2D in_textureBase; + +// output: +out vec4 out_Color; + +void main(void) { + out_Color = texture(in_textureBase, io_textureCoords); +} diff --git a/src/org/atriaSoft/gameEngine/sample/s1_texturedCube/basic.vert b/src/org/atriaSoft/gameEngine/sample/s1_texturedCube/basic.vert new file mode 100644 index 0000000..c0dcaa7 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/sample/s1_texturedCube/basic.vert @@ -0,0 +1,21 @@ +#version 400 core + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +// Input: +in vec3 in_position; +in vec2 in_textureCoords; +uniform mat4 in_matrixTransformation; +uniform mat4 in_matrixProjection; +uniform mat4 in_matrixView; + +// output: +out vec2 io_textureCoords; + +void main(void) { + gl_Position = in_matrixProjection * in_matrixView * in_matrixTransformation * vec4(in_position, 1.0); + io_textureCoords = in_textureCoords; +} diff --git a/src/org/atriaSoft/gameEngine/sample/todo_sample.md b/src/org/atriaSoft/gameEngine/sample/todo_sample.md new file mode 100644 index 0000000..728fd92 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/sample/todo_sample.md @@ -0,0 +1,13 @@ +TODO sample in order... +======================= + + - [ OK ] Textured cube + - [TODO] Material + - [TODO] Simple Light + - [TODO] Multiple Lights + - [TODO] Map (simple plan) + - [TODO] Fog + - [TODO] EnvironementBox with night and day + - [TODO] Ray tracing + - [TODO] Simple player moving (FPS/behind) + diff --git a/src/org/atriaSoft/gameEngine/tools/MeshGenerator.java b/src/org/atriaSoft/gameEngine/tools/MeshGenerator.java new file mode 100644 index 0000000..6b621b5 --- /dev/null +++ b/src/org/atriaSoft/gameEngine/tools/MeshGenerator.java @@ -0,0 +1,467 @@ +package org.atriaSoft.gameEngine.tools; + +import java.util.ArrayList; +import java.util.List; + +import org.atriaSoft.etk.Color; +import org.atriaSoft.etk.math.Vector3f; +import org.atriaSoft.gale.backend3d.OpenGL.RenderMode; +import org.atriaSoft.gameEngine.resource.ResourceStaticColoredMesh; + +class MeshData { + public List vertices = new ArrayList(); + public List colors = new ArrayList(); + public List indices = new ArrayList(); + + + public void addLine(Vector3f pos1, Vector3f pos2, Color color) { + vertices.add(pos1); + vertices.add(pos2); + colors.add(color); + colors.add(color); + indices.add(vertices.size()-2); + indices.add(vertices.size()-1); + } + public void addLines(List pos, Color color) { + for (int iii=1; iii list = new ArrayList(); + list.add(new Vector3f(-1,-1,iii)); + list.add(new Vector3f(1,-1,iii)); + list.add(new Vector3f(1,1,iii)); + list.add(new Vector3f(-1,1,iii)); + list.add(new Vector3f(-1,-1,iii)); + meshData.addLines(list, colorGray); + } + //out.addPoint(_materialName, new Vector3f(iii,-_lineCount,0), etk::color::white); + //out.addPoint(_materialName, new Vector3f(iii,_lineCount,0), etk::color::white); + } + return ResourceStaticColoredMesh.create(meshData.getListOfVertices(), meshData.getListOfColors(), + null, meshData.getListOfIndices(), RenderMode.line); + } + +// public static ResourceMesh createCube(float _size=1.0f, +// const etk::String& _materialName="basics", +// Color _color=etk::color::green) { +// return createCube(new Vector3f(_size, _size, _size), _materialName, _color); +// } +// public static ResourceMesh createCube(const new Vector3f& _size=new Vector3f(1.0f, 1.0f, 1.0f), +// const etk::String& _materialName="basics", +// Color _color=etk::color::green) { +// EGE_VERBOSE(" create a cube _size=" << _size << " _materialName=" << _materialName << " _color=" << _color); +// ememory::SharedPtr out = ege::resource::Mesh::create("---", "DATA:///color3.prog"); +// if (out != null) { +// ememory::SharedPtr material = ememory::makeShared(); +// // set the element material properties : +// material.setAmbientFactor(vec4(1,1,1,1)); +// material.setDiffuseFactor(vec4(0,0,0,1)); +// material.setSpecularFactor(vec4(0,0,0,1)); +// material.setShininess(1); +// material.setRenderMode(gale::openGL::renderMode::triangle); +// out.addMaterial(_materialName, material); +// +// out.addFaceIndexing(_materialName); +// +// out.addQuad(_materialName, new Vector3f(-1,-1, 1)*_size, new Vector3f(-1,-1,-1)*_size, new Vector3f( 1,-1,-1)*_size, new Vector3f( 1,-1, 1)*_size, _color); +// out.addQuad(_materialName, new Vector3f(-1, 1,-1)*_size, new Vector3f(-1, 1, 1)*_size, new Vector3f( 1, 1, 1)*_size, new Vector3f( 1, 1,-1)*_size, _color); +// out.addQuad(_materialName, new Vector3f(-1, 1,-1)*_size, new Vector3f(-1,-1,-1)*_size, new Vector3f(-1,-1, 1)*_size, new Vector3f(-1, 1, 1)*_size, _color); +// out.addQuad(_materialName, new Vector3f( 1,-1,-1)*_size, new Vector3f( 1, 1,-1)*_size, new Vector3f( 1, 1, 1)*_size, new Vector3f( 1,-1, 1)*_size, _color); +// out.addQuad(_materialName, new Vector3f(-1,-1,-1)*_size, new Vector3f(-1, 1,-1)*_size, new Vector3f( 1, 1,-1)*_size, new Vector3f( 1,-1,-1)*_size, _color); +// out.addQuad(_materialName, new Vector3f(-1, 1, 1)*_size, new Vector3f(-1,-1, 1)*_size, new Vector3f( 1,-1, 1)*_size, new Vector3f( 1, 1, 1)*_size, _color); +// out.setNormalMode(ege::resource::Mesh::normalMode::face); +// out.calculateNormaleFace(_materialName); +// // generate the VBO +// out.generateVBO(); +// } else { +// EGE_ERROR("can not create the basic mesh interface"); +// } +// return out; +// } +// public static ResourceMesh createSphere(float _size=1.0f, +// const etk::String& _materialName="basics", +// Color _color=etk::color::green, +// int _lats = 10, +// int _longs = 10) { +// EGE_VERBOSE(" create a sphere _size=" << _radius << " _materialName=" << _materialName << " _color=" << _color); +// ememory::SharedPtr out = ege::resource::Mesh::create("---", "DATA:///color3.prog"); +// if (out != null) { +// ememory::SharedPtr material = ememory::makeShared(); +// // set the element material properties : +// material.setAmbientFactor(vec4(1,1,1,1)); +// material.setDiffuseFactor(vec4(0,0,0,1)); +// material.setSpecularFactor(vec4(0,0,0,1)); +// material.setShininess(1); +// material.setRenderMode(gale::openGL::renderMode::triangle); +// out.addMaterial(_materialName, material); +// +// out.addFaceIndexing(_materialName); +// for(int iii=0; iii<=_lats; ++iii) { +// float lat0 = PI * (-0.5f + float(iii - 1) / _lats); +// float z0 = _radius*sin(lat0); +// float zr0 = _radius*cos(lat0); +// +// float lat1 = PI * (-0.5f + float(iii) / _lats); +// float z1 = _radius*sin(lat1); +// float zr1 = _radius*cos(lat1); +// +// for(int jjj=0; jjj<_longs; ++jjj) { +// float lng = 2.0f * PI * float(jjj - 1) / _longs; +// float x = cos(lng); +// float y = sin(lng); +// new Vector3f v1 = new Vector3f(x * zr1, y * zr1, z1); +// new Vector3f v4 = new Vector3f(x * zr0, y * zr0, z0); +// +// lng = 2 * PI * float(jjj) / _longs; +// x = cos(lng); +// y = sin(lng); +// new Vector3f v2 = new Vector3f(x * zr1, y * zr1, z1); +// new Vector3f v3 = new Vector3f(x * zr0, y * zr0, z0); +// +// out.addTriangle(_materialName, v1, v3, v2, _color); +// out.addTriangle(_materialName, v1, v4, v3, _color); +// } +// } +// out.setNormalMode(ege::resource::Mesh::normalMode::face); +// out.calculateNormaleFace(_materialName); +// // generate the VBO +// out.generateVBO(); +// } else { +// EGE_ERROR("can not create the basic mesh interface"); +// } +// return out; +// } +// public static ResourceMesh createCylinder(float _radius = 1.0f, +// float _size = 1.0f, +// const etk::String& _materialName="basics", +// Color _color=etk::color::green, +// int _lats = 10, +// int _longs = 10) { +// EGE_VERBOSE(" create a cylinder _size=" << _size << " _materialName=" << _materialName << " _color=" << _color); +// ememory::SharedPtr out = ege::resource::Mesh::create("---", "DATA:///color3.prog"); +// if (out != null) { +// ememory::SharedPtr material = ememory::makeShared(); +// // set the element material properties : +// material.setAmbientFactor(vec4(1,1,1,1)); +// material.setDiffuseFactor(vec4(0,0,0,1)); +// material.setSpecularFactor(vec4(0,0,0,1)); +// material.setShininess(1); +// material.setRenderMode(gale::openGL::renderMode::triangle); +// out.addMaterial(_materialName, material); +// +// out.addFaceIndexing(_materialName); +// +// // center to border (TOP) +// for(int jjj=0; jjj<_longs; ++jjj) { +// float lng = 2.0f * PI * float(jjj - 1) / _longs; +// +// float z = _size*0.5f; +// new Vector3f v1 = new Vector3f(0.0f, 0.0f, z); +// +// float x = cos(lng)*_radius; +// float y = sin(lng)*_radius; +// new Vector3f v2 = new Vector3f(x, y, z); +// +// lng = 2.0f * PI * float(jjj) / _longs; +// x = cos(lng)*_radius; +// y = sin(lng)*_radius; +// new Vector3f v3 = new Vector3f(x, y, z); +// out.addTriangle(_materialName, v1, v2, v3, _color); +// } +// // Cylinder +// for(int jjj=0; jjj<_longs; ++jjj) { +// float lng = 2.0f * PI * float(jjj - 1) / _longs; +// +// float z = _size*0.5f; +// +// float x = cos(lng)*_radius; +// float y = sin(lng)*_radius; +// new Vector3f v2 = new Vector3f(x, y, z); +// new Vector3f v2b = new Vector3f(x, y, -z); +// +// lng = 2.0f * PI * float(jjj) / _longs; +// x = cos(lng)*_radius; +// y = sin(lng)*_radius; +// new Vector3f v3 = new Vector3f(x, y, z); +// new Vector3f v3b = new Vector3f(x, y, -z); +// +// out.addQuad(_materialName, v3, v2, v2b, v3b, _color); +// } +// // center to border (BUTTOM) +// for(int jjj=0; jjj<_longs; ++jjj) { +// float lng = 2.0f * PI * float(jjj - 1) / _longs; +// +// float z = _size*-0.5f; +// new Vector3f v1 = new Vector3f(0.0f, 0.0f, z); +// +// float x = cos(lng)*_radius; +// float y = sin(lng)*_radius; +// new Vector3f v2 = new Vector3f(x, y, z); +// +// lng = 2.0f * PI * float(jjj) / _longs; +// x = cos(lng)*_radius; +// y = sin(lng)*_radius; +// new Vector3f v3 = new Vector3f(x, y, z); +// out.addTriangle(_materialName, v1, v3, v2, _color); +// } +// out.setNormalMode(ege::resource::Mesh::normalMode::face); +// out.calculateNormaleFace(_materialName); +// // generate the VBO +// out.generateVBO(); +// } else { +// EGE_ERROR("can not create the basic mesh interface"); +// } +// return out; +// } +// public static ResourceMesh createCapsule(float _radius = 1.0f, +// float _size = 1.0f, +// const etk::String& _materialName="basics", +// Color _color=etk::color::green, +// int _lats = 10, +// int _longs = 10) { +// EGE_VERBOSE(" create a capsule _size=" << _size << " _materialName=" << _materialName << " _color=" << _color); +// ememory::SharedPtr out = ege::resource::Mesh::create("---", "DATA:///color3.prog"); +// if (out != null) { +// ememory::SharedPtr material = ememory::makeShared(); +// // set the element material properties : +// material.setAmbientFactor(vec4(1,1,1,1)); +// material.setDiffuseFactor(vec4(0,0,0,1)); +// material.setSpecularFactor(vec4(0,0,0,1)); +// material.setShininess(1); +// material.setRenderMode(gale::openGL::renderMode::triangle); +// out.addMaterial(_materialName, material); +// +// out.addFaceIndexing(_materialName); +// +// // center to border (TOP) +// float offset = _size*0.5f; +// for(int iii=_lats/2+1; iii<=_lats; ++iii) { +// float lat0 = PI * (-0.5f + float(iii - 1) / _lats); +// float z0 = _radius*sin(lat0); +// float zr0 = _radius*cos(lat0); +// +// float lat1 = PI * (-0.5f + float(iii) / _lats); +// float z1 = _radius*sin(lat1); +// float zr1 = _radius*cos(lat1); +// +// for(int jjj=0; jjj<_longs; ++jjj) { +// float lng = 2.0f * PI * float(jjj - 1) / _longs; +// float x = cos(lng); +// float y = sin(lng); +// new Vector3f v1 = new Vector3f(x * zr1, y * zr1, z1+offset); +// new Vector3f v4 = new Vector3f(x * zr0, y * zr0, z0+offset); +// +// lng = 2 * PI * float(jjj) / _longs; +// x = cos(lng); +// y = sin(lng); +// new Vector3f v2 = new Vector3f(x * zr1, y * zr1, z1+offset); +// new Vector3f v3 = new Vector3f(x * zr0, y * zr0, z0+offset); +// out.addQuad(_materialName, v2, v1, v4, v3, _color); +// } +// } +// // Cylinder +// for(int jjj=0; jjj<_longs; ++jjj) { +// float lng = 2.0f * PI * float(jjj - 1) / _longs; +// +// float z = _size*0.5f; +// +// float x = cos(lng)*_radius; +// float y = sin(lng)*_radius; +// new Vector3f v2 = new Vector3f(x, y, z); +// new Vector3f v2b = new Vector3f(x, y, -z); +// +// lng = 2.0f * PI * float(jjj) / _longs; +// x = cos(lng)*_radius; +// y = sin(lng)*_radius; +// new Vector3f v3 = new Vector3f(x, y, z); +// new Vector3f v3b = new Vector3f(x, y, -z); +// +// out.addQuad(_materialName, v3, v2, v2b, v3b, _color); +// } +// // center to border (BUTTOM) +// offset = -_size*0.5f; +// for(int iii=0; iii<=_lats/2; ++iii) { +// float lat0 = PI * (-0.5f + float(iii - 1) / _lats); +// float z0 = _radius*sin(lat0); +// float zr0 = _radius*cos(lat0); +// +// float lat1 = PI * (-0.5f + float(iii) / _lats); +// float z1 = _radius*sin(lat1); +// float zr1 = _radius*cos(lat1); +// +// for(int jjj=0; jjj<_longs; ++jjj) { +// float lng = 2.0f * PI * float(jjj - 1) / _longs; +// float x = cos(lng); +// float y = sin(lng); +// new Vector3f v1 = new Vector3f(x * zr1, y * zr1, z1+offset); +// new Vector3f v4 = new Vector3f(x * zr0, y * zr0, z0+offset); +// +// lng = 2 * PI * float(jjj) / _longs; +// x = cos(lng); +// y = sin(lng); +// new Vector3f v2 = new Vector3f(x * zr1, y * zr1, z1+offset); +// new Vector3f v3 = new Vector3f(x * zr0, y * zr0, z0+offset); +// out.addQuad(_materialName, v2, v1, v4, v3, _color); +// } +// } +// out.setNormalMode(ege::resource::Mesh::normalMode::face); +// out.calculateNormaleFace(_materialName); +// // generate the VBO +// out.generateVBO(); +// } else { +// EGE_ERROR("can not create the basic mesh interface"); +// } +// return out; +// } +// public static ResourceMesh createCone(float _radius = 1.0f, +// float _size = 1.0f, +// const etk::String& _materialName="basics", +// Color _color=etk::color::green, +// int _lats = 10, +// int _longs = 10) { +// EGE_VERBOSE(" create a cylinder _size=" << _size << " _materialName=" << _materialName << " _color=" << _color); +// ememory::SharedPtr out = ege::resource::Mesh::create("---", "DATA:///color3.prog"); +// if (out != null) { +// ememory::SharedPtr material = ememory::makeShared(); +// // set the element material properties : +// material.setAmbientFactor(vec4(1,1,1,1)); +// material.setDiffuseFactor(vec4(0,0,0,1)); +// material.setSpecularFactor(vec4(0,0,0,1)); +// material.setShininess(1); +// material.setRenderMode(gale::openGL::renderMode::triangle); +// out.addMaterial(_materialName, material); +// +// out.addFaceIndexing(_materialName); +// +// // center to border (TOP) +// for(int jjj=0; jjj<_longs; ++jjj) { +// float lng = 2.0f * PI * float(jjj - 1) / _longs; +// new Vector3f v1 = new Vector3f(0.0f, 0.0f, _size/2); +// +// float x = cos(lng)*_radius; +// float y = sin(lng)*_radius; +// new Vector3f v2 = new Vector3f(x, y, -_size/2); +// +// lng = 2.0f * PI * float(jjj) / _longs; +// x = cos(lng)*_radius; +// y = sin(lng)*_radius; +// new Vector3f v3 = new Vector3f(x, y, -_size/2); +// out.addTriangle(_materialName, v1, v2, v3, _color); +// } +// // center to border (BUTTOM) +// for(int jjj=0; jjj<_longs; ++jjj) { +// float lng = 2.0f * PI * float(jjj - 1) / _longs; +// +// new Vector3f v1 = new Vector3f(0.0f, 0.0f, -_size/2); +// +// float x = cos(lng)*_radius; +// float y = sin(lng)*_radius; +// new Vector3f v2 = new Vector3f(x, y, -_size/2); +// +// lng = 2.0f * PI * float(jjj) / _longs; +// x = cos(lng)*_radius; +// y = sin(lng)*_radius; +// new Vector3f v3 = new Vector3f(x, y, -_size/2); +// out.addTriangle(_materialName, v1, v3, v2, _color); +// } +// out.setNormalMode(ege::resource::Mesh::normalMode::face); +// out.calculateNormaleFace(_materialName); +// // generate the VBO +// out.generateVBO(); +// } else { +// EGE_ERROR("can not create the basic mesh interface"); +// } +// return out; +// } +} diff --git a/src/shaders/static.frag b/src/shaders/static.frag index bdac457..0bde5aa 100644 --- a/src/shaders/static.frag +++ b/src/shaders/static.frag @@ -1,11 +1,11 @@ #version 400 core -in vec2 pass_textureCoordinates; -in vec3 surfaceNormal; -in vec3 toLightVector[4]; -in vec3 toCameraVector; +in vec2 io_textureCoords; +in vec3 io_textureCoords; +in vec3 io_toLightVector[4]; +in vec3 io_toCameraVector; // FOW: Fog Of War result calculation -in float visibility; +in float io_fowVisibility; out vec4 out_Color; @@ -19,14 +19,14 @@ uniform vec3 skyColor; void main(void) { - vec3 unitNormal = normalize(surfaceNormal); - vec3 unitVectorToCamera = normalize(toCameraVector); + vec3 unitNormal = normalize(io_textureCoords); + vec3 unitVectorToCamera = normalize(io_toCameraVector); vec3 totalDiffuse = vec3(0.0); vec3 totalSpecular = vec3(0.0); for(int i=0;i<4;i++) { - float distance = length(toLightVector[i]); + float distance = length(io_toLightVector[i]); float attenuationFactor = lightAttenuation[i].x + (lightAttenuation[i].y * distance) + (lightAttenuation[i].z * distance * distance); - vec3 unitLightVector = normalize(toLightVector[i]); + vec3 unitLightVector = normalize(io_toLightVector[i]); float nDot1 = dot(unitNormal, unitLightVector); float brightness = max(nDot1, 0.0); vec3 lightDirection = -unitLightVector; @@ -40,16 +40,16 @@ void main(void) { totalSpecular = totalSpecular + finalSpecular; } // the 0.2 represent the ambiant lightning ==> maybe set an uniform for this - totalDiffuse = max (totalDiffuse, 0.2); + totalDiffuse = max(totalDiffuse, 0.2); // disable transparency elements in the texture ... // Can be set at the start of the shader ... - vec4 textureColour = texture(textureSampler,pass_textureCoordinates); + vec4 textureColour = texture(textureSampler,io_textureCoords); if (textureColour.a < 0.5) { discard; } out_Color = vec4(totalDiffuse,1.0) * textureColour + vec4(totalSpecular, 1.0); - out_Color = mix(vec4(skyColor,1.0), out_Color, visibility); + out_Color = mix(vec4(skyColor,1.0), out_Color, io_fowVisibility); } diff --git a/src/shaders/static.vert b/src/shaders/static.vert index 233f1a9..b0a79bb 100644 --- a/src/shaders/static.vert +++ b/src/shaders/static.vert @@ -4,12 +4,12 @@ in vec3 position; in vec2 textureCoords; in vec3 normal; -out vec2 pass_textureCoordinates; -out vec3 surfaceNormal; -out vec3 toLightVector[4]; -out vec3 toCameraVector; +out vec2 io_textureCoords; +out vec3 io_textureCoords; +out vec3 io_toLightVector[4]; +out vec3 io_toCameraVector; // FOW: Fog Of War result calculation -out float visibility; +out float io_fowVisibility; uniform mat4 transformationMatrix; uniform mat4 projectionMatrix; @@ -24,25 +24,24 @@ uniform vec2 offset; const float density = 0.007; const float gradient = 1.5; - void main(void) { vec4 worldPosition = transformationMatrix * vec4(position, 1.0); vec4 positionRelativeToCam = viewMatrix * worldPosition; gl_Position = projectionMatrix * positionRelativeToCam; - pass_textureCoordinates = (textureCoords/numberOfRows) + offset; + io_textureCoords = (textureCoords/numberOfRows) + offset; vec3 actualNormal = normal; if (useFakeLighting > 0.5) { actualNormal = vec3(0.0, 1.0, 0.0); } - surfaceNormal = (transformationMatrix * vec4(actualNormal, 0.0)).xyz; + io_textureCoords = (transformationMatrix * vec4(actualNormal, 0.0)).xyz; for(int i=0;i<4;i++) { - toLightVector[i] = lightPosition[i] - worldPosition.xyz; + io_toLightVector[i] = lightPosition[i] - worldPosition.xyz; } - toCameraVector = (inverse(viewMatrix) * vec4(0.0,0.0,0.0,1.0)).xyz - worldPosition.xyz; + io_toCameraVector = (inverse(viewMatrix) * vec4(0.0,0.0,0.0,1.0)).xyz - worldPosition.xyz; float distance = length(positionRelativeToCam.xyz); - visibility = exp(-pow((distance*density),gradient)); - visibility = clamp(visibility, 0.0, 1.0); + io_fowVisibility = exp(-pow((distance*density),gradient)); + io_fowVisibility = clamp(io_fowVisibility, 0.0, 1.0); }