From 483f07ec19af0ede2c5ec393c0fcc9d007d7aa87 Mon Sep 17 00:00:00 2001 From: Emil Kosz Date: Mon, 2 Jun 2025 18:53:36 +0200 Subject: [PATCH] Chunk manager, fixed some chunk mesh problems --- game/Makefile | 8 +- game/res/shaders/chunk.frag | 5 +- game/res/shaders/chunk.vert | 13 +-- game/res/textures/asphalt_gravel.png | Bin 57538 -> 52914 bytes game/res/textures/dirt.png | Bin 52787 -> 48390 bytes game/res/textures/drygrass.png | Bin 59297 -> 54673 bytes game/res/textures/grass.png | Bin 30646 -> 53660 bytes game/res/textures/rock_cement.png | Bin 56007 -> 51383 bytes game/shell.nix | 8 +- game/src/camera.c | 6 ++ game/src/camera.h | 1 + game/src/chunk/chunk.c | 17 ++-- game/src/chunk/chunk.h | 7 +- game/src/chunk/manager.c | 134 +++++++++++++++++++++++++ game/src/chunk/manager.h | 33 ++++++ game/src/chunk/{chunkmesh.c => mesh.c} | 59 ++++++----- game/src/chunk/{chunkmesh.h => mesh.h} | 4 +- game/src/chunk/noise.c | 43 -------- game/src/chunk/noise.h | 17 ---- game/src/main.c | 46 ++++----- game/src/mesh.c | 21 ---- game/src/mesh.h | 15 --- game/src/program.c | 57 ++++++++--- game/src/program.h | 1 + game/src/resources.c | 1 + game/src/util.h | 9 ++ 26 files changed, 315 insertions(+), 190 deletions(-) create mode 100644 game/src/chunk/manager.c create mode 100644 game/src/chunk/manager.h rename game/src/chunk/{chunkmesh.c => mesh.c} (56%) rename game/src/chunk/{chunkmesh.h => mesh.h} (75%) delete mode 100644 game/src/chunk/noise.c delete mode 100644 game/src/chunk/noise.h delete mode 100644 game/src/mesh.c delete mode 100644 game/src/mesh.h diff --git a/game/Makefile b/game/Makefile index 5ac32d7..73da4b9 100644 --- a/game/Makefile +++ b/game/Makefile @@ -1,9 +1,9 @@ -SRC=src/math_3d.c src/main.c src/mesh.c src/program.c src/resources.c src/camera.c \ - src/chunk/chunk.c src/chunk/noise.c src/chunk/chunkmesh.c src/flags.c src/texture.c +SRC=src/math_3d.c src/main.c src/program.c src/resources.c src/camera.c \ + src/chunk/chunk.c src/chunk/mesh.c src/flags.c src/texture.c src/chunk/manager.c OBJ=$(SRC:.c=.o) -CFLAGS=-Werror -Wextra -Wall `pkg-config --cflags sdl3 sdl3-image gl` -LDFLAGS=`pkg-config --libs sdl3 sdl3-image gl` -lm +CFLAGS=-Werror -Wextra -Wall `pkg-config --cflags sdl3 sdl3-image gl glib-2.0` +LDFLAGS=`pkg-config --libs sdl3 sdl3-image gl glib-2.0` -lm TARGET=wschod CC=gcc LD=gcc diff --git a/game/res/shaders/chunk.frag b/game/res/shaders/chunk.frag index 0c7b037..b57d3cd 100644 --- a/game/res/shaders/chunk.frag +++ b/game/res/shaders/chunk.frag @@ -3,19 +3,18 @@ precision lowp float; varying vec2 f_uv; -varying vec3 f_material; +varying vec4 f_material; varying float f_height; uniform sampler2D materials[5]; void main () { - /* This means there can be four textures on a terrain. Could be - extended, but who cares? */ vec4 result = texture2D (materials[0], f_uv); result = mix (result, texture2D (materials[1], f_uv), f_material[0]); result = mix (result, texture2D (materials[2], f_uv), f_material[1]); result = mix (result, texture2D (materials[3], f_uv), f_material[2]); + result = mix (result, texture2D (materials[4], f_uv), f_material[3]); gl_FragColor = result; } diff --git a/game/res/shaders/chunk.vert b/game/res/shaders/chunk.vert index d75c126..1e40989 100644 --- a/game/res/shaders/chunk.vert +++ b/game/res/shaders/chunk.vert @@ -1,14 +1,15 @@ #version 100 attribute vec4 position; -attribute vec3 material; +attribute vec4 material; + +varying vec2 f_uv; +varying vec4 f_material; +varying float f_height; uniform mat4 view; uniform mat4 projection; - -varying vec2 f_uv; -varying vec3 f_material; -varying float f_height; +uniform vec4 chunk_position; void main () { @@ -16,5 +17,5 @@ void main () f_material = material; f_height = position.y; - gl_Position = projection * view * position; + gl_Position = projection * view * (position + chunk_position); } diff --git a/game/res/textures/asphalt_gravel.png b/game/res/textures/asphalt_gravel.png index 930b6b06deb4b1163a8b21f058a0e8ca002a11b6..14a849797c9b7db8935b085a492b5f2aa604acec 100644 GIT binary patch delta 85 zcmX?fka^Qw<_XH~42;D=?oNz1PwLb&Ffg#BJNh~@Fl_AS{*%bcz`&r8>=ES4z)+>e qz|hdb!0?NKfuZ3A14F3+1H-EX1_rAc3=HB0b9M#VY_1aWI0pb0W*A2R delta 4748 zcmdlqm-)~^<_XI6j3TKKo@t(*S_~Wv3=G^142&!cj0_A64Gatnj7V%IMrHj7$td3=9l27#J9Y7@5K9L3*SZS;6d83=9m?Q1&JU1_lkN8jyZNMkWSc1_p** z3=9lLj7;?mA`A=+Cm0wQGTR{*-(i3N4h9f(E=o--Nlj5G&n(GMaQE~LVECiSz!1&A z0H;BM3PyT{271P33=BpFMkZDU##V;L3Wk>zVAK6+_T6w6zM zM-vuWb;O1o*%-EvL)2;Qg;mWbm&RXMqUc#zC=$cXSEmyu8#AZ0v_O>QAiqF5ySl5m z=Er)^g|78I?8pCBl)o?h&iBE5wU24FP{XQ7H?^rEML$Coe{?Y@NjPvk7Bc>78R&Dk zxaRKRtsf|MvH?bhn4Or%)7az#d9|=rac;#r3_~uOuh5Ut&i-az&sXv$6TK`!reQQ+u+v-o^ZQQp` z8C}opQ)qS7acp6bEDZ^0ZM9e{rKx7LW&W2B{ML07V~locB|M36;MGz&&i{{n|8CRn z;K_MG7Mx%9-S~D~L*Nc;6z}bScH7=w;}oc1Teqce|2390d(ZrmEjI)&?B|V%DL1L) z-*JbrZC=UA2{M`vm*eYonBJ#<@vThwAjYwF=iaT~3x6@BtX%ztx1fNdXR1c^-N$!p z@9zCuz3lFN{*vsXPv?J`3mN+NuHtdjF{^%7I^lT!66atlDQ$Y5h%QIMFN zom!%hl$xHIXRGvn_kJaX%oJOta8q9c-vZ~lpi<;HsXMd|v6mX?V;Pps!Sq zoz_y;5d_7Jj5Dsl_p2BWBk`5vqo97>i$r5x%QQ1{U6T|`Gefg919PK96C@-2i!#$Q z^AdAh^6L@q0-2SPnPO#RVwPfHU}&M6Vqj*ZYhsj?qMKx7Y^-Z(l4fpXYGQ6^YLE;z zD<#>=Ex#x?vBXv>GdD3kRlguF9V`I~b1TOHPg^A;Jp+VDKu%&wT7FTkt&&e>UTFnb zq8_X^Br`WPxFiu2poZp#2F9kwX663dzsUu~h;Y0WPND(!QxBi7EAoC5bMHC8@Sbh>|-5 zR&r|_7+M)XJODD!H$Npat&)&xJ5Y+UfkeAUW^qY=Q6*RilCOeO3n4rRH>W-mq+CHk z0h~9i5|bgGC{8R(O#!>v#rbI^<%vb9j_Ij+CALcLnYjhv;8M^4N0uf; zIZSnVMk**G42(>44UBaSjY13!t&B{qOw6D`rjO!DJbtW4HJ21mCYvN$Bqyh(>Kde) z8ta;vr6uVm8k;5Qni`uKCL1RurY0vt(gHjPvG}o`Bu|=I8CqHyn2_p8JbtVPm8a0i z#}<=DiIyoQmS$$UspckTx+W>fNxF&2NyfU#iOGp(W=0k!NvUS2#$)j$9zWKj#iTKM z;)lkhjXtOrfTdm=eT?)CQGir!*l{U9#DZMh?6_?7!Ic-NB7-Iku*Vf3{)e!sOG5J% z0YfRZpEz4^JAyd-DYb<-`)OwjlKp6w5a)j+{lqcRY{9LGBKwK9g(CZ@U<(oU)6^E2 z{g{?e6#g({(P&It&=eqX$+w>rTaYY7V-m8TI<}x$io}K3PitGi7GkvoVn0}(Is{f* za2rjg{Uq8#ru|g21+V>duth-umnGov=R)+EQ}a@6mCBXu?Fy8p9%5i%U`z6LcVYMs zf(!O8pUl9(z**oCS(+(*$LA2FBtbcPGZ1Cw1x>7#LX69eo`c7&i8E|4C$JU|>*4_6YK2V5m}K qU}$JzVEDzrz|io5fuYoZf#FpG1B2BJ1_tqhIlBUFHcuCvvj+ebQy8HD delta 4516 zcmZqs#k6@2^91F3Mv>GA&ooa@Ed~w-1_o{h21XVJMg|6k1_lNOMkF>9BQpat0|Ub( z1_lN`MkWR!1_p*13=9lHjLcy5AU#rytYG#k1_lOcD0>qF1A_)s4M@KsBNGEJ0|Ub@ z1_lNrMy7fO5e5c^6ATOtne7mZ?=V0B2LlK?7o{eaq^2m8XO?6rxO@5rF#OSEV2Ea5 zfYTsB1tUE}13hCi1_mPoBNHnFV=F@=1tTLXV@oSz3kD{Jwn^*^k_-$Czd)W^fN(Ga zLp{VY5Q%A3aYpe~1_s8KOlRi+PiJR^f};Gi%$!sPhKf106Ky>XJIEZ34_>My%C6mE zk+Om>NnEsWO{j)bYk>BaR|!Qg#Z59jf?{M?uQxTzcZafzr^m|1usVKVK63M*=S5eq zKk-2sg7uFN7TVvtTYYCQbBkMRW>~n)g_7Go>cUB8+qK%_1YIPW1q}6!PtTaVM5N~U zbz7#Iz1<&m{ukHx*_q}WDkumYpP6{;i1ZQT+1n0Q&bK(^waKf-&nEE_Yp49qbrpY( z?R>H6fU$C#nytT#qFA@=ni2!;nNlB33PY}zoD$z8w|Y+fc8lz(QrUMW?>CrpJ$%|u zzhV|oog_}7(j^PpjI=fgE)G>c>NM+{u-(7J>-rPD6~iTaWVly2HNW|F@c)DI?O};o zm%O>u8{UZ@|0%)hwA*3xJB$0r`!3rsHl05(_1?E|=>u=nUw+*tX3O+zdt>+OZOh&; zPPaaAVY1@vP1>xPT&?v?AL`uhPhn=uYrJQ=e)}~$Kluip(y6-``S=<)Dy6Rfy=V9G z&D-nGZ~66`aYJa){$tg=cNrM?qBBDxN+NuHtdjF{^%7I^lT!66atlDQ$Y5h%QIMFN zom!%hl$xHIXRGvn_kJaX%oJOta8q9c-vZ~lpi<;HsXMd|v6mX?V;Pps!Sq zoz_y;5d_7Jj5Dsl_p2BWBk`5vqo97mLEi4Vq%#01es=$iEQj3Z+^YcK4f(u))3@B!-{EISE z^GXsyiPcsKqN5_WzzSTT<`;$J=jYfefs6nb(_n2NY2Vb6#FYBPl0=upl2ltIM9Ccj zE4j4|46O_x9sp~|PsvQHB&6C7l%i}P(e9C1T#{c@2^NCntKif^2oJ)|sm}x{S5Qy@ z=MAgGWQZq<6U$Olz%GSLC1)h&rKhIYDnXMsOiLz~W|n4dY@};qU}>ytVxDTQ zn`mNTscV^NWRYlYo@knynglVu9%f8&ep*R+Vo|DNdTL&Yt&)3YZUH#B6g0q*r3q0E zQ(c~s3W^8=BNJT%V_id|5JN*NBU39AGiZ?Mqj(aJAL~)gCB>7;=BB0w2F9tniHU}m zx+cjchPoDpX@|t~c6VX;4}uH!E}zW6z`$AH5n0T@ zpr;JNj1^1m%NQ6K*h@TpUD;nS^N6aeX--(6!oa{FS>hT|;+&tGo0=zH!T@e2BM)(e MH}Z*Z%$l=ES4z)+>e qz|hdb!0?NKfuZ3A14F3+1H-EX1_rAc3=HB0b9M#VY_1YgzX|{esu%|V delta 4748 zcmbQZnt9=Q<_XI6j3TKKo@t(*S_~Wv3=G^142&!cj0_A64Gatnj7V%IMrHj7$td3=9l27#J9Y7@5K9L3*SZS;6d83=9m?Q1&JU1_lkN8jyZNMkWSc1_p** z3=9lLj7;?mA`A=+Cm0wQGTR{*-(i3N4h9f(E=o--Nlj5G&n(GMaQE~LVECiSz!1&A z0H;BM3PyT{271P33=BpFMkZDU##V;L3Wk>zVAK6+_T6w6zM zM-vuWb;O1o*%-EvL)2;Qg;mWbm&RXMqUc#zC=$cXSEmyu8#AZ0v_O>QAiqF5ySl5m z=Er)^g|78I?8pCBl)o?h&iBE5wU24FP{XQ7H?^rEML$Coe{?Y@NjPvk7Bc>78R&Dk zxaRKRtsf|MvH?bhn4Or%)7az#d9|=rac;#r3_~uOuh5Ut&i-az&sXv$6TK`!reQQ+u+v-o^ZQQp` z8C}opQ)qS7acp6bEDZ^0ZM9e{rKx7LW&W2B{ML07V~locB|M36;MGz&&i{{n|8CRn z;K_MG7Mx%9-S~D~L*Nc;6z}bScH7=w;}oc1Teqce|2390d(ZrmEjI)&?B|V%DL1L) z-*JbrZC=UA2{M`vm*eYonBJ#<@vThwAjYwF=iaT~3x6@BtX%ztx1fNdXR1c^-N$!p z@9zCuz3lFN{*vsXPv?J`3mN+NuHtdjF{^%7I^lT!66atlDQ$Y5h%QIMFN zom!%hl$xHIXRGvn_kJaX%oJOta8q9c-vZ~lpi<;HsXMd|v6mX?V;Pps!Sq zoz_y;5d_7Jj5Dsl_p2BWBk`5vqo97Fp3sb{nT|)z7Q)4rORLdlbR3sz(i!#$Q z^AdAh^6L@q0-2SPnPO#RVwPfHU}&M6Vqj*ZYhsj?qMKx7Y^-Z(l4fpXYGQ6^YLE;z zD<#>=Ex#x?vBXv>GdD3kRlguF9V`I~b1TOHPg^A;Jp+VDKu%&wT7FTkt&&e>UTFnb zq8_X^Br`WPxFiu2poZpPH=CLp8d+ExSy+Nqffa?N78Pga=Yb3b7q(y-P|R5Q7iFgA zl_Y`^tF4kDSiB;)zzSTT<`;$J=jYfefs6nb({O3u)RM%M`oxk%m&B4(TO~xv9Re%4 zwG9ld3?Lo=ndh6Il9^UXNVOd(McF{2-6ONOB)_Nu0tA!z{~gjoDoPm(9itPCx!3`|J%BpyH3gUVBAmU?aUG150g0aCSL$E5%f3vzL@?hh5itML?EkxK)Q(Iv6V_HH{ z_`{4vqcLqkQ-H)J-+oeTL9!5yNyvWc*n(y$5*K1Wt!)8Yh}9B^{a|_O5Lj)&Z8Vwo zlV}T>_EXIky!O+<76k=dmVm>b3(;pz%}cRWDp#_%^E_$;8i`>`@^*J&_z!{$_AZ~y zz`(#+;1OBOz@VoL!i*J5?aLS#7}!fZeO=jKF!KuW826t$;l{wgAX(xXQR1AR3+i?; XfV%?7!#LrMeBulY3Je?bl&=B+Wj-!X diff --git a/game/res/textures/grass.png b/game/res/textures/grass.png index 1f0c342d0b6acdc4a9915aeecd5e176854f8b26d..0e2423b1c2de9577ea0a1abbd13da8038fcb840e 100644 GIT binary patch literal 53660 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 literal 30646 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4kiW$2A`O3a~K#HMN%U?(>y)37&sUh7`Pc2 z7+Dw?L24Kn7#NY*OpMG7%nS?+lNcBn_!yZOgcukYW-u@?2r)8))r0g%F|vZ$s~8v< zq@nCh3=9k!P&FX^hKx)MybKHsyBHW4j2M|1L>L$tPB1VqWVS=>y~6+j91I}nT$Gwv zlA5AWo>`Ki;O^-g!0<cUg+9t6xNHQ=m`~vxD0m8iyn;;~nO_?F;oeT_&t(nfw0iMpz3I#>^X_+~x3=9=> zYA4!y9Cna78Xvt>Nt9K)%OYikUs<5w!KGmfIYgb-URc$9a%ud9C5oPfg(5NBe04fu zvN3Z?OAAC<4)P16v#Yy`YksWvT^i#_A#|iYFHKNrX?tDbTd@( zM;F5{g9gVlUT3a6cQNEV|FM)`KK}h8o72DV%wOz&awg9Q&Lf7)q{Tk6ef+X)Y4JUE zzRio42+SAmmo9O9Ze-S_a^T*m~uI6+D^Y>7EYZcP9>HTD;BjF>9}NG^)Q^c=%JleJNWc7ikdDSry^7oda4g!`R}>^BXQ!4ZB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M z$}c3jDm&RSMakZd%cjDrBDWwnwIorYA~z?m*s8)-32d%aUa=KOSYJs2tfVB{Rw=?a zK*2e`C{@8k&qU8a*R>+E%t* zm6W&?6cnI_SL7D>`ofLRD~5(ba(=FUMPh-zp`L+$ZmvGEj^Yy6vJ(6{ibE<3QuTvU zi}Op1l2cvFQu9ibk&Q@6hU+gVEy@9VCnZ@wH77MUHLs*t-%!sG#Y#}dgzEqWL3(Cx z0a#Z>ZUKtQlFT$jV4?U1Bm?#ivO_9z3*hFWsD}9+tQZ_dRxbI;r6A{dy4Wg#?6*qE zPtHuS0y9kv&C`-iERuAMQ!Pz&O$-dpbuE)EEp#o-4J{4Kjf{*FlTDF~^2{qPNz6-5 z1sPS5TcDSjnPO#-l$>mlWMQUjU}KDs7$v3XCK(wU>sp$mnH!m!m>ZfJB!i7g zNw#v!FUn0Uu~o{?@u03i~PlUS0LUzBUBztAr@7Ltw?Vwt=CQ z0mS(r<9zc|GSeyvskQ@U4jV|6dt?@u)L8=uL6u_CnDlr-2 zh2q4r)D*Bg;Zn&NiFxU%DYi<`zbISn(HQ-SXk;> zCK_2Jnwuw@rluyLnqHirR#Ki=lNCm}$fsu)> zfw8WkQHY@-sD3jsg9eyB?Y)?6Zfa^^V4SL(m}qFJYm#hYsB2-EW~iHNl4fa;mSka` zWMGc!XbQb(WMpM*X=Q9dKQCIES)?W#Ca378n57x(nk1T==q6d380aP%T9_G_8kv|R zS)@_Xi)QG_9vX`_`k;~@mTqnIF;X@}0a8_A$E5%f3vzL@YhW{YAVDIwD3=9mM1s;*b3=De8Ak0{?)V_>?fq}im)7O>#1+##t zB*TK~*P0m^7$i$vBTAg}b3uJ825^%fd5|W&kx!g~L4m>3#WAGf7Ry2Q1mV_03=h2D z72T{}p1bS2+?J)S(>8sdplIacDzl^Zm&o7w(Uq?bcSeh_20Ba#T_6&*>$~6Nb1J#t z=9TY^nRNPp?SsSjb(cO1SiHf0bC_04+i9rEv!I`d!EDXxx&peV9)f@tu zQZ#=asJ~{R=@zEe5}Z6mgh7lsKW>$h=3dFy9Qh`3JA596C_Peg2xItb`Xj@Ir~KZo z%W3}}zK!2j^YP;D+GS}I_?P90Iqsae>aHOVyUXbtCUtK%`fpdAUR`5%WIaPb@aOjD z=L?J)RnMnuyo#6}{qN_`_4h4UO(uvgUCLB#x60|LhAQXnUt4N!u0HZ0CFTBg?V1-( zU-LNUIIp`i^~e4BuWVlKdcMErhRd~2#md$3tA2ktv^ZAyv7L&`!^_E^R%~FpQMjhY zENkMlL!DngzNxzCeLrtiW!Qn0-&j2ppO!5PII_0ZtW$~gmwVqG171yS6_HGyM-wiG zX)UgKzs!8o!!rp7PxUA?r0V%w{F#4MEo0l8#yz)WkIL74){#iC)M<{eXmfSEW6`f% zcEHg0g5{K3Th8nbe_s1J@v@1XxxuFD$88VuzTTd{&%)OF(|mLLYrRMFYpzxN`_y^< zT)BK@>HDvrnJtex#0$@gpBb=gi-Y+thX*11dRi`b9G`#VR`K%li;r6P@J(-J7w6<^ zT^Keq{?2cwZ$_>nmur4Kyv@8>>$TFX5QlxWxi2P{|F`&cZ=L7z^SN`@ue|U6-1WFg z@Ji7s?%$X7mqtVueO&d{TcvUzGr!3TaoJ5vHtqR3N5B5xyDR7U{Vcz(5S*R0eg4mn z`gYQNhmZ6ro2saGO}-nvy*A(G`-J<#E2AbwMX;_BzH0OR&PCHu?fKFFkL}vE)Zq4y zcdMD}_k4N#RC@YW;f_`A_iOfP8yZ&rywr8m)3?l7Nr?03pKba5`%UjAUYaFi#{TQu z>Gjt;!~T~1HDBN5`1DwM)Zf-n%c#YhRs1Wy&Gl?IeDT#Ka?uQ>*av*S#jf~$X8CdG zU-%K%d$YsUO_Gc6*Z;ZJdn~NZuO=yozfDp=q_2XxWyOq@I_kN$G4GTuW32vslD}na zUt9k;Pnfm4%K5;Hy^;#YviDt0`n+H0RY-{(4~wQ-bNsQ>0Ue0ZVHQk7cE z^f&KV^yf-#bzdwf6)t6dE>c3KE%lndj^a)AL#m=H<>t3HU7mf*ioN&oHp^2lf3QWr1tI=i5|m-91}hMdPGkXt(ipjoiXRmCv6^oKihE zFUb4UO1(2b|6Q+V*J(_S-~TQ7^3F3#2QP|WxA}Rh_gIhDZrhvM z)IRwC%{2bSqF{9#f+&E1bS~ zZ`Z4TzqkGMbn((2ogaVBg-RR0VViPJxjZiSRet0WjvFl|Q>GoA8Q}lrPb#adU_gYM zzqh}`Bafu0DUOftTCF^NLUsSQLvn`xiAQ%?<;|Q?*mYd&_uFgw;^+SFEUPc9ay)c) zckcPOzpn2+mKMM^Gi}55do|BK%g_4uCR%iM?jb-zlNYd3dX7h^O%`p;57yt9|W&6rI za}FMz*5`LQBmYmg{;y5b3$N!aJCrFf)m1V-T#-?!>Dcr3I-BCPqW!I&Isd2Y&yk+> z^526i^`&9vDGQdXswG_Ps5%s~JM`3J)kl7BzQ51^`!_fJieS$!P3OzgW=wv=ofN{E zeRLj^tE+`=P-e8jY#zn=lFcFl66&roeC1Ay&X~J>+BkRS(i|cCABWks0++o#CMi5s zhFQ_<%z>9C?-r_?&#|b}^yB2xsJMP3p(yQH$Zo~e7Jp}cWp{gCWuhB=tI*tB*2iml z^3dCKV4qTO}dGfi4&{raQ*`^=1AKi97JThSc8U;6l?K*1S3%=co~i|_e$ z?!16(x6+gx&zH@n(fxCO@jqNrxI|FJA%2Txf?2>WGs(>YyF9z^3m2VDGO3#Lp>ctY z&{4)LuQv;sRnJw<-*)@+vy0RBS$+IHak>0%>l?1e4ybx>cI2DQb6H{j>C?VRv!7oy z^`G3Me6cq=jCZ?*pt)oE<~i>U%zN(r&h+la+jm}yGKt^(|7)@J`_glZSM1kV?O|>3 z_w)ODsWlw>{n`^ff2s9sMas`stZJQ zW52$o{Ofe}v<<9GQ(nf*;OewYdd<{0Q@OtGU--dKTq;7d!hfqcr8>V2VmtFxJ#bOn zs|&q9H)zUzS+sKMBZiqG4o-`V0w$f)o|Mj89?@zkc~m;+e)ZSw=KFNLwHEFBdE)Z^ zxcw$q6B$pM%s7-1G_ye9^UGR*k0*o z{^6*=hrTFw|+UZ@1W4TZD*${ z*Z!K)BeI_NV50yhbA(J?~&VXZqYJHMvzC@(CNpMTbj&DPPIqr0JrMS#npQ1Rvd z|J#+D4s4HB59Gd@` z{JihA^r_r!$9siey=+kYbL9Wpe}8A6TmIdyixPpk-PNcj(_*qgQ=P;3%98+%Un^`|BYWsw6BIWvy7 zII`VM%Ho35+2nIUUis@fU*G|o@3;$@Dvs^Re!i1FXQ4vF}{sTtFwZnqpwP)esbOY`o!hgH4FSF zoli+=W#uwz6e?bOPNGv_=|}ecoB|s&94luz2%Xp0F*;iz>gCvFb5^E+jmPoqimR_b zU(%S^^=m5k<=|@h`i$SN-qxGn|M~6g`~5#(9sj?#TGf2Fm4b^{>8?XLg*IeJKw&YK5Mbch3=cv zpQOyGd0Rdq*2_~wQ#Wq!>Ey$YRA%vP;!|Q&`F7%G+fmF ze$Us-Cx5q{&(g{NzOL8bSMxdk=Oz~}!G~JPpS2!OTPuA_uTScYSzE*9!p*bQ(q=AO zW6~h@Tp>`qRV~3t@sOp|wOM=hc561Y%wU6vr{onq+H-YT*4Dk>zMXrP{rH|j*koF9+lPG30eufOxpd6RCJ zr>YZg_Jk^)+92PrIM{=GzVS+%TcZtlXFW951Wi^6nzL=O$hgDfLaIe^))bCdQE9@+R@j z@ru{4oxQz3%iZ|fbX+=(J0eA3lP^1?QKOP!p`MDc=Ai|%`?&P$%bx{3|M=c-d$IGJ zLt9f*7X5wpHX$gg?d-D0szE727f4{>hZ+$n3kkY?hev z%+nchu{zodiz@al-n8b7l+n3+o1N<>981!_yP~9JqefDfab@J3H?0qt{5~l~9lP{s zlk5E*-A^8SzcA_OdMTMad9qTg#ukSLO+kZmHIJ{}eZGEv@y)v%S0t4kdQ^IJ+Pi7T z0=I0@SpV_0W`KzEVud!=$wCz~1R4*&nK6HZu0n%+)GkwV_3+9^H&mzb+}MzFx1#^p zv%-rft%c6#ZNBop zTF~hFb!J@oh2H9K_VJdNQpziwH2UtpdA0A;?cAQ8&nI}!tH>Rg*i$pp{N4TXC9|e; z^z&xDpa1Iqo{%r!U!07um;3emH^2Y9ooi;!-W1Jgr1|gQZT7V1IqvgrmVB;iuQYO7 zd@RD|z{5jUx2h8bTXmUM3R*lOB0t0!WY&GUb%duFkGhH}~iXl-X~te0tYztH89B6RkXxz8=_?Yrn5_zPgaHqs0*yAudia zO%q$@Wh%jzI&+i~ULVU%3On@o;6jb7hXsyK51Z1c81BEF^}E|jpOaUOr*~gsF<}4u z>h$Z=uUn0SA9A!Y+Ob9Z+}r+`@$ihD^%-g}j@By1Xe_aQe)x-k?Q*Aevx{zjP26X5 zt@3mK_x(SjtkcuF6zY0pIg`SC`l~&U|EvBHFJHsqz|wv=#oU9a+M2cVGB?ytDsKolej0^K-5Lo!?q5qp7i^_zc?-lZTBJ501&2)-_jF+|Wwg zlvXlLWoOCteY_bVuE&qKSQwbRJ-A`P;fISpJ(yQ`_}8OT>(`mQyD=#;K>v2chOj7s zJ*9<-i3ggh0@TH<{=L1t?LmqE^xNzBH%)f3+THKh{q*^g^Ji`wPfiu-nsDam4H2ed z6}2bM3nhQ-ojy-x;~U##*~__Ed(XZ#6;NP|?Cr2G3I>g~#9e`Rc`Owl96~$SE@J-T%73jfdNnBt(`^cptD;NsW)N?`WI*+IIO_^cnPXi2v4?b%YaDEr?n_4H}$qW)$-E?s4j z^~rV8Pm|>rGJ)%r$#ExkT}rJru);?j+^WM&)Rqyw#NZ~4!kxM_ANhaVPq~~_bcx(^U>_% zyw}!ccRz}0JDO$qLf1%A|In7-;(r&pJnYCT3w7S>W?r#&bp8J;|5GBnYPkK3S4Kp-OyBf# z`Mv)Kw{cV%`d7_Nx<75}+Ou;5TQ*wc&ffD{d2(k9kC#MW`(F_wX`_dHeElcY1EX*K zmb4?XHIRP<2Vf7vQ zteU;f#`^X_)>hfK_UXRA9RGiU>cln4EU&)F)V^9U;n-9 zZo{CO$8jr>&qIwvf=mBoo`Z*9y~zXamj65dUR}9f|FFVTfyu&4W9FVcHz6t0(&hHu zgPnEuljV{-3bu#le-Vny518O?|M$}R{JNj{c}mv}o;)vJ;_2lY#1(7%pf^Y%ldWB5 zkw8oTEEz|ewoOYkJpT*NgFMi&*ts4l_|LV?^n#{8~df59Byos zC|cA#dGoeYO;?`SJbbgm&T%H^Bpo;2nJtff*rxML*8OZJ!1V9yr-LUGeNRX({QvvDH2?m9{i*XWZOz#8qg|@#a=qo<=#6=zeHZGizbcSspEl+HoEge_& znWdLqz9!-6iI(?Qug?#PzEbr$X4a(X6Lsg!G*uG`IJ+#vQ&RqGqL8Agwfmg8haXQo zWP7(bF}W)*N?&|Zl)C#T6{AGK$!A?y7lf=mY;S+-n%$GA?SVh;Ojkd@_u;SW+0{8w z55?8%?6#D*U(bGWs#wFr=E#;Or-I+TyrSf%5WR7U(bfa}mE0np>2-Vbrd)p1k&#fe zCNFg*H@5@FlkGnoQp~dDRat z{0c3tOc9u{q~Q9xxR1|QW=HPSoETxk#w;T+?fHju_5VIT(Rltj{eN{qe5S>->Q9~g zx8C`EEoJjseUp)Y-mC=@FXaBbnO$FgXNTLQwG2jHn*!FWZ}#|e?elxP;x|hrq`BJX zT$`ET70M-Pkbh^_$LsyG4MdhTTzP9P-Nbi(PVK6_m4&zO?deog_EVlAvP#GMQf#}Xm&x;L@Amp*zkbKkD3GdHh_+@*i=!SHr^5r zT9NE*$JM?>M_`8OxeAsCn>F(6Ww;dm-|77R)$b|U92>Ro&$+9|MB9aqsejr1JvDgY zkDjpmC8~26oO}1*t9*a#q3Fz&+C_0UK0aLNyY+T)gs0k#C!72(qzWy*8NKAhzUwA_ zpH)@Yz5RIerjL-r!U7q!sGhd662I&E-bWW3isx;NT2ay=#M?Hh_)@y*<4Hy}-F-n#uF+_v;vIbm|3memb15+ihR_egC@-?kTDr-`=mA_33P^jp@fz-u(Xx zf7-cyJb5H$^0ApS^y7oWKK*_goodRJGEtP%{lugnKPHr&PcFTFZrjmXg%is*u1ML{ zF>T5brkg88W*Vi!dU6j^l*~ztQD1CB&Z)19= zzC0#5wq(|J+ZiSAoAiWO4;QK|?sDh4Df)8L`M$mXZytSI`gQ5y$HK){-K(zai>N<; z;`RK>=BHD47C-Jd`KTe|io#9t#ti`-4J%9Jy2W`C(rOh9=kLGJc2OcgrQxkj%!FwN zkKLJY^@;m|ou@9%3A`HOW+(o^b5`_(KJR(c?|I+eT5-Uw{AO zeDztnp2nv_&VN|oXZ}(~CbYjad%J$+8G$!D@2!jun<2OK$X&l%7e1_rl<#p4sFItl z`6Na4`8Ja*t<}Y%1%=7M>~8L+SuLl}@40-f!=+;*-*VQgmf{6{B5PKjtA5}7-YD#J zpi;*U<*lYm&mO)jq}Mz3l>96y)}+9Vb2b^g^wge^6TSca#I4a`IVpWnx`N9E96Tal z7A?N{_2KOJe^tL?GBfv`O?sj|Lr}x+_FIO@r#6M<>6WkuuJn2Hv1P4Ub&}eA{q|q~ zVosbnpT4BRF#W_L?t&B%_C-c3-psH6ackMHC!A-QJf`aGSd%m>Bl7Ph=HEwD_gKx< z|8V47^WuB2{j`(J7OuDdyZ+?FXPZ{t*}eVB-MyPFPjYH>N-b8LsIYIB-dx9LzGtJG z8Vk~#6j@y)MHJ_H7A0iVhPv*~`f}jhEqlEZu_;}1r*$~^6#F}Toh?1<|GUkZwIX>b zhxyjAHoDe4+$jGq?bs*3zt8uFTHovTWUk!0X5H*}CpDj65!tjv=j6lhEmPFg4*M%N zYV>S3Ik%%ZE^(5J#>9-TY|Ezj2)voVEdAPOPQ~xJBCN~vT;H{A+Ep5weOSjm&MPk4 zUEhz-je#pxLQ~Ug>u;NrFZYN9J-W3vl;wENS1a?-T&wb(Pv4r$NxlrO&b=odAHAyd zX3V|?BA@pBdT9Pt+Dym)yq>R4-QyGguZq2|$@ts2zOG7NX6w1kH#>K3YI?NjqM+$R z)dLJqmJ~Nt$i!?feY;hDmdZ_=yG_$i@jpu1rE&6Jy|kjEpw^jyClj9?yU=>_!qtan zflO~7wQk(C)aVG;k;F-E=J)QTXYRGSa@D@#*{!{8n^LbHea+6MHm^SG@6F%3EG~2B zU1*(q@sa4!@8`b%dUIm^eL4Go`-A1ouLXqXZO}8?sd9GD;m2;QOo2s8Ta!!HWoRa! z+H+&WvL_SQW^;YceB@&{Ik4b!opKhp=ISNqZXWnh@Zp^3?fd4YbLIb*zIvuFuD;I0 zIH_dLMuW%YFFV@4E>)Z^yLh6_I|YY;Tw}()_jl)o=3Vi>yEoOpm#eDrew)>k5_0KV-T#B@-S6F`Cs`};foEOIu-2LnT4ulr(NPz zVhw)vLGq=E-AUp8BMR@GGJZ1Od}ztl*We!Sd(LCU-R;{WRD}OtvpBNkK%%hQ1?AOY z;WK0tr9^gIx6YU&@4H?k$l&OgD@j>iPWSgpaydlr-I%i>-1Yf|y8q9PZ4$j2b~(OWFC}+W)=T ztG#_+8n@;rp})KRug;O$5x3pV$oA2%M_bD|^orhhHLmK2{rBGf@ZPy?3nsd#K3`fq zY39_^-A@%|rfl$b^4pSLz@qx6@Y|f*Z|?pL*l1*HZmV5iQj}H{AitpfE8ml!z5hME zgy-%2d2`jPr;(|Xw)Ooyni(?1(XrNWrHtLLUz6Wn-hO@k`F+1GH-x_5YV|i*ZHv)z zkLO1Jf0X+_uUTCyB{P4=<%`w(Oza(Jb@uo8#b*BeJUf2h=ShsajIP+;dd_Dx(#Lsh%D8^3sDD2(nf-b0W1GGvsrEw|Cm#1l@cdiV z#&q{aN%i+D(|SX*!*u??dhD(G)w9DiCT?P8$<40mAGc)rOWEhTtUY)3!SwZdU)cpW zU)ybvw%B+_VcUL>8Rk~@%~87B|83w3jM1COM2yZX3m~@eq~Tc zYE6^#3>gV?>q~W;XP--m()s4vyu7ZqHS)cNRyyx}bFEJn2U&a0D5M`a`B&NPwT_wn z^Sqr&p67j*8KxN6N`2V9tIeczYoxY!-#v@Z)9b7nUO4n~vcKf2vS|DGRE9^z@adl~ zIxAzFcO~98*3Ze`Z^SxLIZ(#qz3XdjdAf+@9&X!kwGdn3 zTQ}YuxRSEI`u}1lE!pac6aH#?j@lPTy>l5 zUaSc`B__V?RCjR*Tk`dWvhVj&_5c36f0un)s>Y3@m8r9@=bX?>GQa<&@87epfuT8Zj)%7Aw_AIQT)D(PTl4VkKKa5d$iU*>*WWYq>n)2vpDMi~ zu0DAMqjS&6Crw{exI`CCW^l59>F4+KputfWBXzFF->pry7_b~n>2T$(Vv>`0n;fie z%B{p1di(uTwNp2Ortq<+yL+s+-TD9CTtTz`#jl*J+H+Y~*IX5ydRSI!PE+sJ7l%H2 z6hdum)**AEdk<&GsJ1@# zSr&8oZHX?++_3*Uw*5XeH*ft+7T1$MRS&&$n|!uY`_jwqF!$QfZ)>h9c_pigeX_Hw z`}6F5@BZ!Pd3U!OZD)D2H}}g;K|c8;kIICT*PfhCuishs`_wV!Qkk|-FBUr6EDL?^ zwsw}lOqXNIflLSfGFlzry|kjFgLBGs4Oy!cwwZDJx2-Z+J?o(GpARo{=XD4jW7y~6 zaKvM~-kJBeqU=o;bx%wV;hWju^zZ12X-}npFl{>esPOgK+4EOO?pRy@b!zzAvJ^Mt z?Fk<{R*0NdxmQ+v#rcM?my2U?MAV_F7j`h#&sfEyw|?TEk5?1I3bl@X2wu74XaZm5 zqKz80cYhg$tqLzy*Ez?d{+#Q6?Q1bXb;;+luBDvs>o-378oPI@x94QF-S-=WShg(L z!^k4D{g>NWWyV0J^2^Jtre8lV+Hk0(#Km};ws+`x$qyTnQ!dP&rmA(?b5rXc%d1{2 z2B)6(1mFLD_w|eo*@CIM8w|RRCL1OyO?MI4WMbvPTGRGplW8iCWpUKr8MCIn>EBsk zB2w6T(@P_vO#Nig)x)3VZGQzOA747X&-QNBvd@Q}D!Q`iZV>2oJ!tTNF*fk~_3-m@ z|6jzihVEOq=+Dn&edakAR{Oup&w9np&f&Uk%5?7iKTj&Z`snFdHpl-tFW=cGQ&d^s z@NEpKdHH0;*_Ugy&Kz@Ode#zQ5Pcx^5s!yc@z?&FD{QP915!?@tUjvY&!!i;(j z!dY8C^xJ<=eIgjEy!gG%AIJRiZl&4BmwRR!oPS!nVWp4M)ZSeimhf~5e^1p-t=ss2 zZui{hE}1D-zL_&OZ|l`zk#TU2T^sBgct}XrZ0=Mo$C@`bM`yh|y?ABip%+Sl+iV&; zj1IeGTtE1!?>6_Qns*-EnM;zp=E<3z-zjgqDO#a>_M6M8i`dTo5ePpp<+8{0e=~)a zcI@C`>pXIE!{$pbzSvZ!I49cq&(rXk^o;lJOirbRvFuuXd-s&Bx$cpE+3fAwmp|R7 zMk#rFidLzwE$*(GCQ$!*Zf)VbUf<=>GKzZcPxvCWr={fFSa&Dz|F3t~%NawKEX{3k zQOyYabxO8WeShWa3->|~S1JE|_cwn@&WhJXkGs$B|N3(N{QbY4$uX&$-`{pzkn3DW z;EyBU|J#Weox6Ux z_)|TWXFpCWy_TOWTT!&r$XDvwuRhydvr?Az{eN8juHAon$g^#C`FXbR_V7hkrhJRP zzvq&f0UKwNVbO~Z$?M-mlr!`&mh58}QPSVPv3tHe|4qr~cJGXn+~)FXYKl#Jt{xD< zFqtp%na1pLk*_>_D|dhFWnDe1Enofmhcz1m=3DM4Etm8tQa$ygecM!v9Jc?9p8naH zRy1Kp$-4i?*XymZm~eDb@UpGzu6=Y&?TeVf!M~;FqgJJ>XuxY-UX7yoqAW+dKODEPQN{UnsQyn>!`v_pZlZlF8k;( z$CqvKgN@CmB~iPM<{D=*OPj6x_4Ur*Jwa)qZ&w}rJ@>s$xk(fIDxvW1)W%X#Ua9KW z>t?mP%LhNe|fLBZeGfIn)ynC|LrRU z%hS9}b*HOGt8KkG^|ZD0*5=r2mV1kLByU`tdg`eoiJ9ayV%cJ?Np z%8eW@0>8`hq)p8$(M>(svMj2X-{(X_CF=7)^2td z?sX~RmR!~O!drjeauK%GVd-V7)SMi(Bwc25UXxvFeeU0ljB>00JN}-1`b_PPoU4OK z%I6nl(i}%J<}RM=9Uii!&-9s^YM4mM7L(pUjWemISEchz>*Zfo{w2$Q-VX~)@0%sN zc{d9gn6|YRDx8}oJM+B0o>wr}+8;Krlm)V{Sc<)nnqoS)I|&AEbN zO=in0-JbfK6uIHELS016TSa!Sv**c6dum=CnPco!&gw1{SNnaUyxmUE=NnHHm}qZZ z@HFcGJol75<(2KT$+83H4`1qg!=fGFqb@=*xUa}Meyp1vyYs@ z*PgqlvpQq;yt@AA$~sbUyj^ zz(?+|@Q0HYC)p-dX68LzdV4yDoKDh229tkxy7{+d=U+}al<0h4UEIF9p!(j&>;HUo zM5WF~xS2gaDf^o@xR2pn`0V9JIW;*~9=SPLH+%cFqLpv9-45Ow-Muhi25(@QeaxE= zKb`-*xOGc3ufNsjsEbTN)v5hyr8CdJFS24}?+XmFUF^G$W4@nr%FCUReE$y}-1Y0Z zzdXMrQ~kZ&?~J8;vJN~>)4LzjmvoE8Gwt+))`n(xhQQZ5wx@KvM^3B#yIga^eD|Ft zPv!Mlos;YKn$Hz+ zrfBoYCty-{_lqyH!`m%l<|(L3Z2ai+?!jdCZQt&_+JCc9{<9I&!48#)6PKKknD@dgo`({U0`$jhCue&X~o+NT6F>zmmTMP@bvh$d#`re zUwZzrszgXVB1-R#oHM^%MDDD)l6xQTynAtDX8ylD@oPmK^n!PkCpB?R)V+7~icHv? z{tBKI%3VqZ^Okx@?-e%t>Fc#^MSW76r%?Zv-9L&L(%XD@8TdN{ebwLbCQ(7^_p9c` zJCAa1Qn}S?|La7|yz4o2U*9gz`&TKw;A4|V#mi?lcE%gD_A9nYt-n*mA?)DcsTVod z?w;}T*#(UPb8{5ix7)?dnsVsV?Z!hwa;^S;XT1`=ZyNDkeytdsXg1ls(Iccp(MzD9 zXkLVQ*7Al8mIhl3bEjtOgv||qxBa1|>P)?U{gz{a3L*P+CY}|tHVm1mHF4SGxc}!9 z^_$k7jo7+*$pproVe7TN9ueRB?#3>5sbyD=EjXg?F=_4kxLY5$Ye_ZUEj$18Tx0P3 zyQ^27l+BqFGC^Yjlh?wh`~UvS|34>J_w?%cw?qmC%f_Q)4%ucz1h0sPp$Iix4!c%dN;ja_-p|>W|iT zy+?Bo7jZpxP3=7S>B`mJtJZJ%`?j+`R(jWrdFNX^MW&1Xe{<#esZ>crlQWA9j;g%7 zFykD{y_TG@LOzTqk}*mR-%S-1)s?#Yzj}em@n?|5Np)arvJeW=}dcoN#JC zcrfkq0u5yrw#k!&&oEv-lq<*ZsMyygF_9RF2zf?k5Ak-CO)r&G*7$ zZt3THP1Ir{<}S{RjM%q1rNT$tDQQp0IfvtmR-3C#+T8vpi|HVP!mkU@noW=Xd3=1A z(5BY2>FGBGX0CrCamH=eoFCtBT`w%EIB5UE#GyuVPhtGEJGJF8PI9tWA z*DdY2uZq;hC5tSU2ds(RqOZADB6Q``lUFV+TJ^5)=hCN3*Fm~t8eHx0d zFCB=lGue^#^wvzz;HX7KNp*|0PLOJvGMS?$s;zyiyB#!pxsASb9F0F@N78rN>j1{o50&4+!4atG|A2 z>6^3d_0vvo&^!C))>ccCOrB>)l)rRLI=Q>h%bDH7-)84=Kd0H&*6!6?lOJ2nGT8UY zA!rWInpLZJ{-0cTD%s0>`q9S@Su;zjZY_M^^+LqYGqcJw=-8$`x>Iikl`goxihFBc zkE7MSGgDUXv6w$!;_~W=5flELogM%G_l@8OU5hif>D5axdTD=F4~>%PH&DEh^JVs0 zzU6vRku$%ZQ9ggJ-D*yUzF6;5^{1O=PI1}z>F{B9+jW&&OE+5V<>;)E+Lo45u-R5c zqBq*d*idHi>Sw!GcTf9sx58gXIpt+z&k~c=Nhf?4l$N@tZN8lFQGAL<+VVFsjP?J| zrSh+@TDNO~iU5;+&FeeUWPkeYj$gm@p-S!Xx0$;-{FweWMQn3XN+~$}Zl^@oWDX8q z2@b{i%$q#w=BrP8Ve|RigiUE=~~krZOj@H1Lt=p zEK^8Ze7%#c&bIok-{xI=-M4<;`1GE@B}(q(b6tqoF(F=Mr|*9`=lYNIM@=<;c~Orl)}QPb{F*I2ZOXIl|E?bQUs(6|v*lt-E;X^oyBaOT zjwZ&bh;(?h2=sP5bkvGJbY$U$DXRSe#&5sla{lPK*U$I8PBiLJ$o+QVTderMoz)5MwYMAYt^ZoM zL?*QV*1NBHcjA(_Jz~!;|LX5^;?fQY5%vQ!BHR|SE|OqU`CNHN=Hjwdru{bm%$9ZL zRTt!n6y4dsdSmjwjcQA_Ov}C8#Nb$N)%-~0-i-;W3kAeJY(6|=ZGvZ=ny=I+=e=iz z%POuda^%kXF@fR5&P<6JTZ&b!V$~lgCCUiqTwG`u-*b#pzPkAH*Zb;BVLRTQ^2keb zyno=!x#L_H1>HL2dKz~`EtQ%pAGxpQsl)Fb>?&@*d^#m%Zu87rp(2(OeE!XiYwI@} z8hw?ojeE_z^Wf#Xyqg)@&xs^?aIEXlnc&o2)#KT^H*d}jLo^_KfNw#v9~Q-%K2tWjGox%G%=C6Ki^E9 zU7i-6|49E_<%*J^8y;Tgy`!&0aZ8Dq1?zaZsisU&UC#B>rs=^9wy{z6I`Yg|3@`dZyFE8J}(nsUNkF68jzg@E4xxaR$Xz0YHhN_(+YgV0ExlT7S zaM!a}UvDQV@^)#~|9ZM6%sji>diwQe-|m|SG-P<*I<@iP$48}i3Obg~+InGz3P<;~ z^_m`m8fU`}FAdgO8j;~1E2Jvxe#nMXUD@-Wyv(=9 z4{fy2Jd<)rqscANE92Pv!+QnACI;%v+$z~6C6s`)%JlB?P=Z56`}}-0$B8 zbDm4@N=(&1NluS`FO-;a-Pv;U+r+~QDl0DReNa?eop$t6lh*$|-yf~j{x$RAHS1Lp z+WRbC&Y4-9E`Is%HL!lF^)MRUn&k3Ff2Z< zA!q;W(lJN<Bbj{I)2X&n|13;^|dlBv6!mn zlXhg0q8YP<#6{h6Ka*?DpZPMUOvU4&t5lgv&)4%s8a{J4oWd=oLtr*0Mq?LMz2{@ryV2#e2n0 z)V*zSjcVw>dvxU&16`lvH#LkWt`bRYn54R>eg3-o*R%D{)huFaW@w+|!RI2=;qM{z z`$NJE5l_ElVV$auwj7P~`zka01lvs?_pLef$M<&drAe(xI%nUO?07SA)1^OeJ{{S& z&~RhR)mmraZ^z^79hk~l;wCw+ zUXl9m+eHRfk^Z)h((0ef&u`gV_~UTAUR-bc!6zmA+>+yibjq`mmwoiuWpKUY?Co}j z<%i>=w6{kGrmoxay6My#r^Pw`nQFD~pS2l0nIToWu;uJ)4$h#dGcD&>JXxsu==S#| z7RQ*MEyztu)RI`@Ai>hGP@=oFQaNeikL&SvT3RP$UdUWtb>T>fT19Ef;rf5?wM1Ez zI1W7B99YlL>86=;;VGBk8V;6At(hhzc2i~@eAHc0xBhloPm!pBvsCe}*tE|~9w&bP zQomRAxmR|zH{Y6ns|q;Pg99`8Z}Qv3sXgI*J7c4UVRDdgfwk^T)|GO1o|R6XUsZK? zYjmukRfcTw^z^CBe>R*=S4nb6w36-K#2cmVkvd`V6^`qYiV`M#9{s=BZm+%lZTjAA z|L5M{Z(sjn;?qqgRgdScGkxv-EAQN8m6YkyoeLH=s5^;2V75(uy88eAUAuE8tV&>D zt;yO|ot~DyyZmNK_%wltCCM-KM57&C1w<}}$1}&f9&~aPd6^ecbo1T2d2?^PTxVQ- z?##~n@4o+jJJ0@;&7p7Jd;&>Y#y_0*rU~|6i(fr|>y8FCM%BxU*T=l&t4LI7VOhYT zeocP*x%I2FMGo{Vi`qQt=+=;<9&>e7W#Ox)YtNk(&TQBb%VYI+YxwnTreD2_ zZ)V@0o5U^II-}rFLhFqyS5}DUgw)10nlv>$w$1BT*YRJ-Z_*po8qy#B_xVNj*LElB zDzZxg@)NohBh}t6U;pm&AUssbbTAW z8pEeszkXhocPponv*nq}9h-Sm5-w%L%%cv+)z9z^ zJX)N6ihZY{%R`yW)Tv_4O-55$nD5@-zyJA(lfl_uXqHe4@!^1VENe&wyJ3$M?Py}bOXiuh+H#RCFHg%VTN`24!d?z_8e-M`OwT0fi1 zyB_a+{`?sKO83i)FN^7UoIB|qzc1t0*4a~Y+dAKrsPS!j%B6QE^{dH@97X+b591YQ z^GtYtS4hln{V|tO{gv>Fjx&)b-f}PQTDj&(#kTdb>+9DYZw$!Mi=FDa^x~ZU^DmyP z$#}csY}3!jkB(?R6K`L!?$3-pd0WF)P58$DqV8v9@&yilpPs{tjW*J9D~dCGmMxrj z;Kzi08~=6Q^(uIr_*!9CW_VWdOx1)V>H0x;bOe+pyoId=$WGprQC4bDU*~n$+4z{r zY*UY-O)K`Us{XvlSA}HO^lBD{P-? z{<}-JzgqdOSI-X$Vv@HiPycZEx?MtHqCd;w4D7cR$KVP zdP4UZ{imN)51!NGe%Ew{kN;V_i`N7-Cp8^LGxj!PFU{tweF9yQ{FBe_%(~UM>6cNP=OeC%?EC*-c=<9*LwZ8Dt1ka-1G@v>&(fb9Gr#vLNP2CI zov_1)gA+TS8TG16eO16J$zNR>E3zE z`O{G;=|z#uk1|$3@}O|(B?0BoeQ8I#gxk-@Tm8Pkx;Xm!nZ1R}?=9H8 zKyTK`m6G4CP8V_JWqvFze$KLPPn2zo->fOu>=v*V+*r-Kxq{_Tg3ir#2}gb=XviKq z!{B$EK~Zl0`IFU#+fvtvesK?S+4;J+|K*)r@1Ccp9rLO^=KK1Pi;oP>NZ(xHemX_}Sj8E$+Z0Ra-=n$EQE+ z-rmsL;n}T<8Q1=Z%c#xvIrTpK!pEe@$H|T5@v}>}FPf~!8Oe5_z5kc1)~vhi^?T}r zKQF#^HG2AsUvA2a6x3(!G%B~V`5XJN;T-!f&V3E%RF?3HIx7fr?M{^AzOmOnQtoWQ zV!>?tz7u~8dsKGa@te&0w50Ip*04e=rkN>^!<1dl~27sZ{8Hx@XE)xZ}mzUpP7p^^v)fav#4-#;pJt2 z_THcO+t-&JeWGdl_gaG>yC8=cvuXdV|3AK;+tWL9e(j%Q3w+n-Z4YSHF_U$C zp|f1?iNoD*cK0t%etsixg|)~liL8x1Es7EzXQo~-T)6M@YI)h;Z#I8lC3p4K+Lrr zQB&oVX7MK-Hs|9D?mcBW_3z@|k5Qcl*EVKlpE|d8w~~_YlnJJHk}JP0Ic9O^VA825 z>)m2!qK=3!nEQ6y70CtJE(_ll#r^zvW!>I*Nw+_es*O8@+>^K3TDd*EDpbOm^}$+T zrr?4G#Vf0O&KG^-jovC(Cs=#^b#T;dU%RHz+ST1`0X1=Rloy})DWun|ET;V3Kg&g^ z?qAY|RZi!_j0Ci55BFtOEx+}?#Zf}|gF@-n+xd(>>jJ`No#0<^%W-{LOnvwQ&@m${CwvCS72bpI2ob>VNtX^GmeWrBzt*GC2zbZ^0Io68(j?iat zXJK$L$gsKon_bOc-&cRmvWkK-9ZyY_7yI6@?3^PedhE~4!rJXOEvlDXJ^kdmzI6k_w3`fe+yr7Z*rG5H8}IsU}N>yT0eCb&okTe?i9{=Ikmq% zXc?pE_TK0HF*-UvONw-Cn{(y!Y%_RgKDzW`mYnwd#TMo7yY4>X|Mlm)+?TA{bNu&W zKR-xYd|F6DEP}TsU*CUkp@9>x|GD#gi7k=O55~HDQJH!A#X%h= zvALJ-rfj!nn*S#L_|!+acY7l%-*oe@Hc58N=Q!QdSM+1!o2D6`W-pGhEBbr?+^S!< zrdlt1wdUIF|0So37b`jb+WX0^;`G0!W7cgC{p#K4+nLV|Dm|>-A(rurSK(M!sL!Uy z!u_Y&78yzCi+u_?wdLZ+#@EZYS{A=N{P%B;=JJhs91C0-v{)Ly9Bwb0YgczVi#PdN zfGiOGba?%llV8HF^i8+o+=H)7y>4FOY_`<5EPMazFsJ8H?Pu>S zc061j-~Z3bD53FYVi!a5$(OdZk57k-o+x5G!|D*@bh+8|$_~+0C)V*V|5N*F)-qoKxx=ftog!#2sPD&THZvMYW*&ZLecE`O8=(HcCuB9=O!&@zOJf-Kl%p%03*p)c3IQoY~g9jakR$D0o!# zm@QK{GNIcx;DGRkh376DyAgW4nA)PYe zE1{__b9Cn3tbKH-)N9S>3kT2d|8-w+4)>EY-f5Rs*tHkOeY9!5#b9{GU(fOdM_cep z>#{TYGv{ypqI&XLs`*@=M;FwyrQ~`74~bauh^0J>l4Yxm3CfL~yU$*tp{aZN*&W5t zYuM(W}RNJwaH9DvJI}>=fUc1>`x!>3< z@!jgubvpCx?%6XI3tFV<`Ktu=%vxictX3GKVrh8swA{nOT3_X~s2Liw78U&3!aJAw z<;_R09v+)fQ5Lvq(+Z8XOYbsoP@4MP{fyQ8+g)2rOJ$=@r!xRk76`Tn~$BIEz@-8y}o%&+w3+5fz` zvg&t$#esu*e?IsJ23|X>zCG)G+`YZ2bI;ip{X0MFP2?2){p;s#R`S+(KIh-UzE=%@ z8?L`UP$;tGhGbrh@N7+~b(@Zg9T7jX#CETJ-i4?aHjLAy-o5;At(>pm1tyKM-zVys&+vIy+_FQ@Dy*#G&!=BaG=gnq55o(k> zzxvpjEw8-R=Bh+&vR%0JUtx(;i2Lq52U!m5!?sqY8mtmZEPR2@|27y~x_PF%@RZ8U zH;5=qKk{(VuDkPY=qy?6dOK2hj*0WrFBUCHRuT`6Xl#CWKlcjn_w)1S&oJESVEyda zLV>By-CdJB7QZN(cjC#VqbG~iz9cWcx~^xAMdF?Zv-``|$IUNTzHI7;*4}j-XA1gm zxqW+EDgB61ZSrL+sgBdW7kFn);E?#xD*BO=w_LhKW@UHM>daT4e>xqmJ*F}B!iDE) z9t_TN%a1?59DMnyxV~M-N%4DjfBsHPcF(jCbl_iKk@|AII^Vpyvii@_Mi-9WEqSnb zotk@M63@hgal0x$&Hugn$;ZxFiFg0ymz8b%;=-w#c;WE#M`7BAmtOvVb7J4BbWy!o zC#}1Dc&hXNm)y;|nD%VRk)s9Ea&;tSCF^Roo)j`+JuI^M;tVC9xQ&(*wGUihH-DZS z@7Y^h>OUWQBVYIXsbBco!%vnvKQ!phzq0UNVSVXZv-JT+X7ApF|9-AMyj?%`xjT1&@T`q-+eP#euYAON;up>$3!LGk7tG zthmw9u{R+v(6utOYTlN;X(2-AW49!o`?+6#glh9gCtoVnMODz&-FNA$@qBBiju1P#?hykW^sR- zU-P?t|GWR2Q$POhpHE z$rxg|vU{16?c;Y-H+#oLmURoeKK7DjxBv0t*X2(kiHGX#EjK@3{pe!j!DG=DOPUze zR9}?jL`7CTy|Zu)qGt;?A(*)&K6_tM<4xr6P)F%UYG+ z_Ve$nCEW6u&%G>YQ&B{n`q5XV6)`^+>2`iRxFXT%ZO)>d0?F>R9&;Lw`}T4DlDy@{ zJNLB7mkLXxEQSU7b-nd(FIp^F$|74bW4_OHjvea~G~84+MW`3pcNGdu*OvHj`PY@Z zQKoLJ6Ry?q`m^Rom_NU`laY(@Lqt;ceq#|94z&*J1NQr@p17)=VZ6WRq<5X|rwiFG zx1>trW(#*W7;3f@8sxnDe$>TXbjp!$_cmsIS@>z5`ZdP|S!?DXL&ztt2 z+qb9s`?T0a^Y{JB{P%6`_jOwXY|s3dzC&a% zxqI)s&!x_{uHLrlvDa^p$BWZ3UXL3%kz-P8B|xz%=RmDUud zeVa;4y@Tc7@xOL(KfCiCLzi>ns=MoFZm0@-d-7eDSyFi8$Itxc!^}rkbnLmgF@Nvm=v^OH#fyKbJj8J(MId8_E4RSE zXQ$Ks=KXownpu4NclMq(1J?9PPLmhxCc=O7-$&Yh6!AJg_m%NCx8ubhI~HBOu)jX| zQI~A6{Pa>0pU1OI8!MyJQvDv;?#L8z-5fV-*5mI76?GQ$gq4^`2pNB#ofWO_7RV;g zvZHRltk=Zlx4-E1IjKIoShP&_fUy}z1W#W4YRzQ|ZYw?+B+8w6ut4$3YB%*S-}tw! zKfE$8bkn6(?Z2ds>xA83cQ$|X<@RZ7{o^7x*cB%(n)>2@&gGnEviZNdAG7*9Y-$TWeNeAIay(Un&F2iuHTUYU zc#EGd{>J_@*ZfKhzq^=yRw?)Aj7uD+HuCYzl62BL^ubj#RJioqjgy{_R9>9B`P(i( zBD#0e5u@$q6NIMs&6<iB4Oq>cr2X!?B z`SR}nKGwSW`Bkaf_Y3~L>AZJ2{g>739I>tTiq`r6=be5ev+Qd2`D#r++k2(Y-$aC{ zeLmZ|)Ghq?m6u;T>&RFa``pEcJt#rZ>NDitwH)HLx&yh>k`#-<7ApKv~ys5^E7yUlA zb@kQ$_o4f@6{b5^KHjk*wd~ZXcJuesui6KEOpa=kie7z1z5egUeZPGK9A-G4`+MqI z-rWOBw$yAsd~oq+@wIm>u2?)`*drubTat1l`>=XclV@v^zlFwxjlE^clYI}qJkWFW zOL@4+d^@8n!EH%fK74K4ZJPTu{B-@#jO*FiVX}uKU1Wk+z5T>7>4oQHmihZCH*8wT zc(v91&5ZIN2khhj|J+?8b#`&tl)D$t&6;^RK6il;r;|+D$(tow&q|q^7wfT^zA5_^ ztKheEq0R)UxigP1cwA>uk>T(8-M5EZONhJsf$iCy%)Eyz{ud^p5Z#6|V;G9S&HEQwFIlqWE>G*&2-?kYHc+c<0XuYI?6XMNoy zB%+oVv)(;pT~Fq!qsGhQs=s&$YKOdLi@*Qr*w^&$$M2q#=Fg6r)&51Q+RJOwwY8zr zzeOegl|Os?=9*IL%VH-dS(oIVp4;=||9yHezn*{l>j<5Sd%KRzx7(-I{q$;xf6gsk ziEX!qT%#=F{(oiPUjO^+1L^m*dD72|7fz_V^H}D1QfuV%|CLz=yZ^N8H85OUwt!KE z;Sgg}h07#`#~v%%@{HH@|2S6T)0DWW>QvNo{TW)-pASDb_I~ut&-=aPe2Gedz}L<; zb`gdPEUUkiHab-Nudxp2`Sf$qveUxfPrqhT)b~3)?~3&N`S(h{)IC+1`s7%u??od` z4KCj6HySw(O=o&7rn{qL z@?c)AEe{fl|8`%Vc=P4#M>}@9JwG7-f6n=iZYh~dt}%iwZpj@p_2%DADX?;Ol)C!# z(1owNyQk@Uv}}(RIOZ-qHC!j%|D}@H(Vgw(VLCH|W-Pw4;NWr5+`oNtIzB7+u3gI3 zFl*Mc+5c;&i2KG`eO=lbEY5TIt!eMAhl20xr|sk1{6k#s&hKxtr5(0xOxtn((vzLV zuU>8RK3-|4;OG3gOa1Pz?Y%R(Z1z_acU;Oo?BmM1Xo5qx(~)hut@Ho=bT5mm@o#pP z;$0iN`@xa(?0PZlQ#?1!dE;W%EF0e8nb>FG6?5N&!T7@N^naf}`-f}D`DqC8HCpH} z&M$v&Q@illBm2H-UeSJPZ!6C)sBF;kTJAq@VaAJsHTMNp`$*VqSS@<&kV5}6{>=|P z9Hi8hCImPi{lD+et6B5RL}bs_RumiLbD3m+TeL3jZQCT*xw?nzxQw!AX5G8A<(yYH zzk6x3;^hs;*A*I8Y_M-SqIR0AyJBrP@9Ayn=C(5&l5TpNGa5hsx$=^0UC;k5-we+# zmEibhwBxa({NZfHl*ug{C9jyr#mcD86FC-pNuuEp2mg1UEh~>7Skx~(bx{F_(}hB| zwg(wU5~aV-{LS2yW0M=TtFU6uaq)~O*@+1qzE77eTEJ)R^++>j&Wbn1> z>sxug+LrderKX`-!7q+ojxYzcra?TVc0h4tCTnQE)0ZS@d^3K?nI%b(PUM-mw$+V~B>l*FjYn@bZn-^LM}WnWNTrhB+kE=Gf%N@Av-S zHe=C`FVpk)-QK!q6VJ*QJA=OnJ-z&tRvvcWRH+1`_@A`AKS8dW}SK7PEW@^q1gV8x>2Yu~wk-&@YW-q66$l<9JL z#?EhTwcqx5`q=(IX}`|<|4U=R!|rysx4gbEQ8!*@^=i4>-#=}8_L=>DUH-p}&FmZ5 z^!}S1OJr@IrEAF@Av@K%vBA8m$Y=Yto!?JPoG<_X)BJk>kguWlR%U$T>uX5hK zly$l}yQ<#(TK>MKo7p6KK68(N#r3pJyA2M7+XPS8t8yWvkMpsR+iNzi<(`auBAo$2 z!j-k#7EU+MtBku}{Oy$O;`SN8f*h|-_VZ0|aCljJHZM+OLiC)QH`6;Z9-um$I{PndpugzD+aJU{ymes58NW5(QEXU)c#oo-9 zp2Ak&x1N6K=^D-&oB)C(yUy@7CH}#WUBJn^j#{_`c3w z+vADnk11w9UnxLG}%-D;dJQZtl&0*c3B!um6p>*9t;^12~FyeR#!g z>mtBs-Q>nB#m2e&;Qp-7G2Maf?G4}5t2W=1E^+sorfFk0+ofZ^MVOqn=r?Jd@OQQ! zXJ0hGKlA^KpGU%_>uzp;-+gxd`8ea+yRYBxdu#CU{I2@W24JbUzl_Q&-foqdAk3;snMeO>o8IM1-p>x$U8rsRri;fcdgY88 zy^Ohkt1dg&EVyG~DC1zEIFF^JCE)1V#(zagt`}FYzJKE7tHAj`o_@RN&lh?1nZWsi zcmH}{JzuMQ{tRRNjYnJfx3`$|R{a0lao_3TW0MfxjQKlmy|=9Y_u;*-{yD{%7t{CG zIxufkzW-n1{JigfBJ$t%_D#3nZT3^FuR6JsKemdZ{aQ&?fN4i-_QT~ z*l6W{<{!tF#xD8xojdK>#9#IeuOA#=^6mTVD*1`O>>2dSrcJnYKYz7^^4EHX>K|%B z-nuHv3=Ay)L3afF{>{Ov_O+fN{p@Mgt^4(-P5y1)(E8IZ==X2_yl{|9>}@7{X4UV{ z2;*7#pV?yD46m&E`{D}U>lxnvOJ`g8_iqA+!q<9+>*bSf-~V122y&zblgHcl>dz!B+oQB~|NWS&&aeJ6DDB?w|Ls3RT~dz1*8TDg$3TJSZKk8Rb^rRAGeCwc{^J<* z`}eiHo-6+udBhl(eEWV_uIN9zf$|xpt^4^8v#k8j-0|k0-Oc~ZH{4u3-@boeTgkWb zKXZg-t7}$${rT_Z9)INztXX2P^6y_sZBP`v*d`r0RdFE`$6 z^Lt_Jc6-}zwx<`p$$8Hg%v?FMcyiGVo9Uls$1lHfr~EV5VXt{XhZd`!P|4rB_s`X( z`CrTVDsz4m?Ee0G{{O63>)sWYANNY0J8gpR+ps|HK$){Mj~4u_{L9BHaD-8RS5or3 zLq}a1#3~nmStKARCDXQ}X4%0-e&+%VUN)V(xba5D!D*%1I&wa%zsByXlAcz*{JCm( zWdOs~U>6JRz6(2Q^WXj1w|{Z{2g}#rAFmC&^8M)d%Us)xoof!U?pUI^!D40-_d_4E zjElQ6Lb&9fY^+Q;#$CiH&|I+b-a^6Y_vg%+IcjWa|R>aYo(==8kIrJXP5)_XB~+p$j>6GB*jxjE0=DVbs5v_Zqi>i)a3;)aB{ z#wo|1aQxg@FyqJ9Bfr&*_a?3=KR@qj{=T|UrQRdQ8@;Ee9DRCn(xw~j_Pd3dVpg7x z_$2c!I(nOsh8$PZh6p{St^4iM)W6p=7;`f%`SyMHFSmd1>kE2X{xiP$vIrC{7Ek~G zW9Q)f&pczcv*OnM|9^j!1SRV!ku^cTe}6yE4@$`MxBqp>s=vSB`{ZBt4a%9yOTK;2 z6l}QipK(ux{NyYD{>}ZA7xbU~!*ul%Z{M%B6<+d>KfzUT{*{0K)&}1N8P?Ep=iffp zZje!}HG(Vu{x!Y*36$;%lz#kw^Zv1j)u;d6`|sabp!l_(VcI{7-ES%^Wl|I~8}C(b zwN1{I|Mz}w^#0gqLKhAS+uyOe{_$1%%=)=`b%klmj9;wZzaVwyi?}1qEf03EhzfQ* zFf>c$TmP=dE-&oQq|i;9-K}>pMM!A(b~C+;y?oL*GlZX|%_9HJY*)^X^KC5c)QjsccW9gunW&^0ZFs@|$g)d%|8Az3?{47WFf?pp2>t1`_1K=ecW2%m z{CH2#*J)AB3U}Z3nUi`>6l5DHdMC)0EA!ac+N;i zn}LV3XUVtkwrch(|1-}x{9w|p``;NIL1my2?}S_T%iC-~arZ@)C+PR@8pfUfnQu59 z_k8>Qd$}YihbswAz4EWlQLz8Ye@2~iNfU0}=U-44^q+l$JjcXa_v?RDfXa_M4=O;( z;Lr7nCI9#xt|ftr*15+(CEdik_tk&bf2e2B(v>KdD4#JAbbYC(tDnm{r-UW|%VtuU diff --git a/game/res/textures/rock_cement.png b/game/res/textures/rock_cement.png index a49d9525f520f574d89bcfd7de6a2bcb9f9932a9..f4947f5a73e69af871d4c7d5821ad3d104eec58e 100644 GIT binary patch delta 85 zcmX@Um3jL_<_XH~42;D=?oNz1PwLb&Ffg#BJNh~@Fl_AS{*%bcz`&r8>=ES4z)+>e qz|hdb!0?NKfuZ3A14F3+1H-EX1_rAc3=HB0b9M#VY_1aWJplj_@fbJ& delta 4748 zcmdl!k@@&m<_XI6j3TKKo@t(*S_~Wv3=G^142&!cj0_A64Gatnj7V%IMrHj7$td3=9l27#J9Y7@5K9L3*SZS;6d83=9m?Q1&JU1_lkN8jyZNMkWSc1_p** z3=9lLj7;?mA`A=+Cm0wQGTR{*-(i3N4h9f(E=o--Nlj5G&n(GMaQE~LVECiSz!1&A z0H;BM3PyT{271P33=BpFMkZDU##V;L3Wk9-~C)#=(c91z5AH6gvish}s zqX`SGI$}ePYz$k-A?mdD!m8$zOXDvrQS>Y<6p7*HtJ4XSjhRzgS|G}DkY6C3UENh& z^JBf|Lf85p_Tzsm%HJ1$=lfv3+Q+n7s9{y4o7z;7qMxCPKe`x{Bpf&%3mJd44D>l% zTyyvE@$0)S&VRD|{=7qjbuyz}qs76J!%FuQ=H1*_VdQXl$%uY z@3_O*Hm~I51Q|_-%klL(Oz+db_*N!-5aU?8bMMygg})e5R<8cSTTsB!GgYJd?&G_) zclZ9SUUv6Be@S-Ha)}FfdWk9dNvV1jxdotDWU#TXC`e4s zPAySLN=?tqvsHS(d%u!GW{Ry+xT&v!Z-H}aMy5wqQEG6NUr2IQeRi^Cijut@mraFL zMQ%ZEYDuC(MQ%=Bu~mhw64+p?ykaYmu)dN4SV>8?tx|+KUTg3Cf;u9iTu+&&(|V>#E2t&{wKQ z@=!@;8X~+<`~#8!dkEPj6}bg)gHcq&d=FL(4kas>{Nz%Q`#fE2l|T-#O36>oOtDJO ztj{g5GBGqyOE$4c(lt)CG|@FNFf`Y-Ot!SpwKO-hG%zWkHrBN?Ni#PxH8D3dHAn`V zm6B}bmS2>cSYoS`nVXoNs$Y&Ba9>iL(NI*_vNm_nUuC0jmkN>MhDX!po0F3B&d1Pej(Rd8w{ga_f~)MtW} zD<~*{^M+MoGQ<?ga!5)`GfOi!HqtdQur$^+ zF;6wuO*FBv)U`}BvPd*HPc%(UO@f$S4>P7XKdq!Zu_)CsJvFbyR>?gxw*VYm3L4h*1x18`k%_K>v96&}h@qjCk*Sr588pcBQ9OyqkM*eLlH$o^lSGT;> zgH%&vT@$mkB;7<~vm{+pV>82KskM*GP z6dL*1V$#?++0ewuG)dRcz|2I~B-zqPH_^z%OxHBUD9yqw6_iuVP>sjpNj!e6M~g{g zXyP|DK=q`JKByLerCu9-jPwmrfK+YRaVbE=f?V9}xNP*nl^3WYgC-5I#}y#{hp?$j zLh}^?Ln*bNI9qT#f;jsrwS_qQX=e+P{b-gD=YJ&q#4*uq!L5lR`-!%NBKxUe3la9y z)E1cin3hl!{xDO>_%)p?h48n{ROYO@T7#P?~Jbhi+Uoi6ui5Yo3Vd7?BV2~_v fjVN)>&joe67{FZtfov, aspect, camera->near, camera->far); } + +void +Camera_print (Camera *camera) +{ + INFO ("Camera position: (%6.1f, %6.1f, %6.1f)", camera->position.x, camera->position.y, camera->position.z); +} diff --git a/game/src/camera.h b/game/src/camera.h index 5e8ef89..a70a035 100644 --- a/game/src/camera.h +++ b/game/src/camera.h @@ -18,3 +18,4 @@ vec3_t Camera_get_direction (Camera *camera); vec3_t Camera_get_right (Camera *camera); mat4_t Camera_get_view (Camera *camera); mat4_t Camera_get_projection (Camera *camera, float aspect); +void Camera_print (Camera *camera); diff --git a/game/src/chunk/chunk.c b/game/src/chunk/chunk.c index 6147786..845f8f9 100644 --- a/game/src/chunk/chunk.c +++ b/game/src/chunk/chunk.c @@ -2,29 +2,24 @@ #include -Chunk +Chunk * Chunk_new () { - Chunk chunk; - chunk.heightmap = malloc (sizeof (float) * CHUNK_SIZE); - chunk.materialmap = malloc (sizeof (char) * CHUNK_SIZE); - INFO ("Created new Chunk. Memory size: %zu bytes", - sizeof (float) * CHUNK_SIZE + sizeof (char) * CHUNK_SIZE); + Chunk *chunk = malloc (sizeof (Chunk)); + chunk->heightmap = malloc (sizeof (float) * CHUNK_SIZE); + chunk->materialmap = malloc (sizeof (char) * CHUNK_SIZE); return chunk; } void -Chunk_noise (Chunk *chunk, int xoffset, int yoffset) +Chunk_random (Chunk *chunk) { for (int y = 0; y < CHUNK_DIM; ++y) { for (int x = 0; x < CHUNK_DIM; ++x) { - (void) xoffset; (void) yoffset; - float val = sinf (x) + sinf (y); - (void) val; chunk->heightmap[INDEX (x, y)] = 0; - chunk->materialmap[INDEX (x, y)] = rand () % 2; + chunk->materialmap[INDEX (x, y)] = rand () % 5; } } } diff --git a/game/src/chunk/chunk.h b/game/src/chunk/chunk.h index bea42f6..e4b03af 100644 --- a/game/src/chunk/chunk.h +++ b/game/src/chunk/chunk.h @@ -1,7 +1,8 @@ #pragma once +#include + #include "../util.h" -#include "noise.h" #define CHUNK_DIM 16 #define CHUNK_SIZE (CHUNK_DIM*CHUNK_DIM) @@ -14,7 +15,7 @@ typedef struct Chunk char *materialmap; } Chunk; -Chunk Chunk_new (); -void Chunk_noise (Chunk *chunk, int xoffset, int yoffset); +Chunk *Chunk_new (); +void Chunk_random (Chunk *chunk); void Chunk_free (Chunk *chunk); void Chunk_heightmap_print (Chunk *chunk); diff --git a/game/src/chunk/manager.c b/game/src/chunk/manager.c new file mode 100644 index 0000000..fe0a0b2 --- /dev/null +++ b/game/src/chunk/manager.c @@ -0,0 +1,134 @@ +#include "manager.h" + +/* TODO: switch from string keys to struct keys or some other + stuff. */ + +ChunkManager chunk_manager; + +void +ChunkManager_init () +{ + chunk_manager.chunks = g_hash_table_new (g_str_hash, g_str_equal); + chunk_manager.chunk_meshes = g_hash_table_new (g_str_hash, g_str_equal); +} + +void +cm_get_chunk_pos (float x, float y, int *ox, int *oy) +{ + *ox = floor (x / (float) CHUNK_DIM); + *oy = floor (y / (float) CHUNK_DIM); +} + +char * +cm_coords_to_string (int ox, int oy) +{ + char *buffer = malloc (sizeof (char) * 128); + snprintf (buffer, 128, "%d %d", ox, oy); + return buffer; +} + +void +ChunkManager_update (float px, float py) +/* x = camera's X position, y = camera's Y position */ +{ + (void) px; (void) py; + int cx = 0, cy = 0; + + /* cm_get_chunk_pos (px, py, &cx, &cy); */ + + for (int y = cy - RENDER_DISTANCE - 1; y <= cy + RENDER_DISTANCE + 1; ++y) + { + for (int x = cx - RENDER_DISTANCE - 1; x <= cx + RENDER_DISTANCE + 1; ++x) + { + if (ChunkManager_get_chunk_at (x, y) == NULL) + { + ChunkManager_generate_chunk_at (x, y); + } + } + } + + for (int y = cy - RENDER_DISTANCE; y <= cy + RENDER_DISTANCE; ++y) + { + for (int x = cx - RENDER_DISTANCE; x <= cx + RENDER_DISTANCE; ++x) + { + if (ChunkManager_get_chunk_mesh_at (x, y) == NULL) + { + ChunkManager_generate_chunk_mesh_at (x, y); + } + } + } +} + +void +ChunkManager_render (float px, float py, int program) +{ + (void) px; (void) py; + int cx = 0, cy = 0; + /* cm_get_chunk_pos (px, py, &cx, &cy); */ + + for (int y = cy - RENDER_DISTANCE; y <= cy + RENDER_DISTANCE; ++y) + { + for (int x = cx - RENDER_DISTANCE; x <= cx + RENDER_DISTANCE; ++x) + { + ChunkMesh *mesh = ChunkManager_get_chunk_mesh_at (x, y); + if (mesh != NULL) + { + program_set_vec4 (program, "chunk_position", x * CHUNKMESH_DIM, 0.0, y * CHUNKMESH_DIM, 1.0); + ChunkMesh_render (mesh); + } + } + } +} + +Chunk * +ChunkManager_get_chunk_at (int x, int y) +{ + char *key = cm_coords_to_string (x, y); + return (Chunk *) g_hash_table_lookup (chunk_manager.chunks, key); +} + +void +ChunkManager_set_chunk_at (int x, int y, Chunk *chunk) +{ + char *key = cm_coords_to_string (x, y); + g_hash_table_insert (chunk_manager.chunks, key, chunk); +} + +void +ChunkManager_generate_chunk_at (int x, int y) +{ + Chunk *chunk = Chunk_new (); + Chunk_random (chunk); + ChunkManager_set_chunk_at (x, y, chunk); +} + +void +ChunkManager_get_chunk_neighbors_at (int x, int y, Chunk **nr, Chunk **nd, Chunk **nc) +{ + *nr = ChunkManager_get_chunk_at (x + 1, y); + *nd = ChunkManager_get_chunk_at (x, y + 1); + *nc = ChunkManager_get_chunk_at (x + 1, y + 1); +} + +ChunkMesh * +ChunkManager_get_chunk_mesh_at (int x, int y) +{ + char *key = cm_coords_to_string (x, y); + return (ChunkMesh *) g_hash_table_lookup (chunk_manager.chunk_meshes, key); +} + +void +ChunkManager_set_chunk_mesh_at (int x, int y, ChunkMesh *mesh) +{ + char *key = cm_coords_to_string (x, y); + g_hash_table_insert (chunk_manager.chunk_meshes, key, mesh); +} + +void +ChunkManager_generate_chunk_mesh_at (int x, int y) +{ + Chunk *nr, *nd, *nc; + ChunkManager_get_chunk_neighbors_at (x, y, &nr, &nd, &nc); + ChunkManager_set_chunk_mesh_at + (x, y, ChunkMesh_from_Chunk_and_neighbors (ChunkManager_get_chunk_at (x, y), nr, nd, nc)); +} diff --git a/game/src/chunk/manager.h b/game/src/chunk/manager.h new file mode 100644 index 0000000..eb4de2d --- /dev/null +++ b/game/src/chunk/manager.h @@ -0,0 +1,33 @@ +#pragma once + +/* Yes, glib. */ +#include + +#include "../program.h" +#include "chunk.h" +#include "mesh.h" + +#define RENDER_DISTANCE 1 + +typedef struct ChunkManager +{ + GHashTable *chunks; + GHashTable *chunk_meshes; + + GAsyncQueue *chunk_queue; + GAsyncQueue *chunk_mesh_queue; +} ChunkManager; + +void ChunkManager_init (); +void ChunkManager_update (float px, float py); +void ChunkManager_render (float px, float py, int program); + +Chunk *ChunkManager_get_chunk_at (int x, int y); +void ChunkManager_get_chunk_neighbors_at (int x, int y, Chunk **nr, Chunk **nd, Chunk **nc); +void ChunkManager_set_chunk_at (int x, int y, Chunk *chunk); + +ChunkMesh *ChunkManager_get_chunk_mesh_at (int x, int y); +void ChunkManager_set_chunk_mesh_at (int x, int y, ChunkMesh *mesh); + +void ChunkManager_generate_chunk_at (int x, int y); +void ChunkManager_generate_chunk_mesh_at (int x, int y); diff --git a/game/src/chunk/chunkmesh.c b/game/src/chunk/mesh.c similarity index 56% rename from game/src/chunk/chunkmesh.c rename to game/src/chunk/mesh.c index 29a1cd7..43b3635 100644 --- a/game/src/chunk/chunkmesh.c +++ b/game/src/chunk/mesh.c @@ -1,20 +1,16 @@ -#include "chunkmesh.h" +#include "mesh.h" extern GameFlags game_flags; -ChunkMesh -ChunkMesh_from_Chunk_and_neighbors (Chunk *chunk, Chunk *nd, Chunk *nr, Chunk *nc) +ChunkMesh * +ChunkMesh_from_Chunk_and_neighbors (Chunk *chunk, Chunk *nr, Chunk *nd, Chunk *nc) /* nd --- down neighbor; nr --- right neighbor; nc --- corner neighbor */ { vec3_t *positions = malloc (sizeof (vec3_t) * CHUNKMESH_SIZE); - vec3_t *materials = malloc (sizeof (vec3_t) * CHUNKMESH_SIZE); + float *materials = malloc (sizeof (float) * 4 * CHUNKMESH_SIZE); unsigned int *indices = malloc (sizeof (unsigned int) * CHUNKMESH_SIZE * 6); - INFO ("Temporarily allocated %zu bytes for ChunkMesh.", - (sizeof (vec3_t) * CHUNKMESH_SIZE * 2 - + sizeof (unsigned int) * CHUNKMESH_SIZE * 6)); - - int i_i = 0; + int m_i = 0, i_i = 0; for (int y = 0; y < CHUNKMESH_DIM; ++y) { for (int x = 0; x < CHUNKMESH_DIM; ++x) @@ -22,28 +18,29 @@ ChunkMesh_from_Chunk_and_neighbors (Chunk *chunk, Chunk *nd, Chunk *nr, Chunk *n float height = chunk->heightmap[INDEX (x, y)]; float material_id = chunk->materialmap[INDEX (x, y)]; - if (x == CHUNK_DIM && y < CHUNKMESH_DIM && nr != NULL) + if (x == CHUNK_DIM && y < CHUNK_DIM && nr != NULL) { height = nr->heightmap[INDEX (0, y)]; material_id = nr->materialmap[INDEX (0, y)]; } - if (y == CHUNK_DIM && x < CHUNKMESH_DIM && nd != NULL) + if (y == CHUNK_DIM && x < CHUNK_DIM && nd != NULL) { height = nd->heightmap[INDEX (x, 0)]; - material_id = nr->materialmap[INDEX (x, 0)]; + material_id = nd->materialmap[INDEX (x, 0)]; } if (x == CHUNK_DIM && y == CHUNK_DIM && nc != NULL) { height = nc->heightmap[INDEX (0, 0)]; - material_id = nr->materialmap[INDEX (0, 0)]; + material_id = nc->materialmap[INDEX (0, 0)]; } positions[CMINDEX (x, y)] = vec3 (x, height, y); - materials[CMINDEX (x, y)] = vec3 - (material_id == 1 ? 1 : 0, material_id == 2 ? 1 : 0, - material_id == 3 ? 1 : 0); + materials[m_i++] = material_id == 1 ? 1 : 0; + materials[m_i++] = material_id == 2 ? 1 : 0; + materials[m_i++] = material_id == 3 ? 1 : 0; + materials[m_i++] = material_id == 4 ? 1 : 0; if (x < CHUNK_DIM && y < CHUNK_DIM) { @@ -69,22 +66,22 @@ ChunkMesh_from_Chunk_and_neighbors (Chunk *chunk, Chunk *nd, Chunk *nr, Chunk *n } } - ChunkMesh mesh; - glGenBuffers (1, &mesh.pbo); - glGenBuffers (1, &mesh.mbo); - glGenBuffers (1, &mesh.ebo); + ChunkMesh *mesh = malloc (sizeof (ChunkMesh)); + glGenBuffers (1, &mesh->pbo); + glGenBuffers (1, &mesh->mbo); + glGenBuffers (1, &mesh->ebo); - glBindBuffer (GL_ARRAY_BUFFER, mesh.pbo); + glBindBuffer (GL_ARRAY_BUFFER, mesh->pbo); glBufferData (GL_ARRAY_BUFFER, sizeof (vec3_t) * CHUNKMESH_SIZE, positions, GL_STATIC_DRAW); glEnableVertexAttribArray (0); glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, sizeof (vec3_t), 0); - glBindBuffer (GL_ARRAY_BUFFER, mesh.mbo); - glBufferData (GL_ARRAY_BUFFER, sizeof (vec3_t) * CHUNKMESH_SIZE, materials, GL_STATIC_DRAW); + glBindBuffer (GL_ARRAY_BUFFER, mesh->mbo); + glBufferData (GL_ARRAY_BUFFER, sizeof (float) * 4 * CHUNKMESH_SIZE, materials, GL_STATIC_DRAW); glEnableVertexAttribArray (1); - glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, sizeof (vec3_t), 0); + glVertexAttribPointer (1, 4, GL_FLOAT, GL_FALSE, sizeof (float) * 4, 0); - glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, mesh.ebo); + glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, mesh->ebo); glBufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (unsigned int) * CHUNKMESH_SIZE * 6, indices, GL_STATIC_DRAW); glBindBuffer (GL_ARRAY_BUFFER, 0); @@ -100,15 +97,23 @@ ChunkMesh_from_Chunk_and_neighbors (Chunk *chunk, Chunk *nd, Chunk *nr, Chunk *n void ChunkMesh_render (ChunkMesh *mesh) { + glBindBuffer (GL_ARRAY_BUFFER, mesh->pbo); + glEnableVertexAttribArray (0); + glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, sizeof (vec3_t), 0); + + glBindBuffer (GL_ARRAY_BUFFER, mesh->mbo); + glEnableVertexAttribArray (1); + glVertexAttribPointer (1, 4, GL_FLOAT, GL_FALSE, sizeof (float) * 4, 0); + glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, mesh->ebo); if (game_flags.wireframe_enabled) { - glDrawElements (GL_LINES, CHUNKMESH_SIZE * 6, GL_UNSIGNED_INT, 0); + glDrawElements (GL_LINES, CHUNK_SIZE * 6, GL_UNSIGNED_INT, 0); } else { - glDrawElements (GL_TRIANGLES, CHUNKMESH_SIZE * 6, GL_UNSIGNED_INT, 0); + glDrawElements (GL_TRIANGLES, CHUNK_SIZE * 6, GL_UNSIGNED_INT, 0); } glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); diff --git a/game/src/chunk/chunkmesh.h b/game/src/chunk/mesh.h similarity index 75% rename from game/src/chunk/chunkmesh.h rename to game/src/chunk/mesh.h index abee039..a3ae743 100644 --- a/game/src/chunk/chunkmesh.h +++ b/game/src/chunk/mesh.h @@ -6,7 +6,6 @@ #include "../math_3d.h" #include "chunk.h" -/* TODO: set to + 1 */ #define CHUNKMESH_DIM (CHUNK_DIM+1) #define CHUNKMESH_SIZE (CHUNKMESH_DIM*CHUNKMESH_DIM) #define CMINDEX(x, y) (CHUNKMESH_DIM * (y) + (x)) @@ -18,5 +17,6 @@ typedef struct ChunkMesh unsigned int ebo; } ChunkMesh; -ChunkMesh ChunkMesh_from_Chunk_and_neighbors (Chunk *chunk, Chunk *nd, Chunk *nr, Chunk *nc); +/* Rename to ChunkMesh_build */ +ChunkMesh *ChunkMesh_from_Chunk_and_neighbors (Chunk *chunk, Chunk *nr, Chunk *nd, Chunk *nc); void ChunkMesh_render (ChunkMesh *mesh); diff --git a/game/src/chunk/noise.c b/game/src/chunk/noise.c deleted file mode 100644 index ab13569..0000000 --- a/game/src/chunk/noise.c +++ /dev/null @@ -1,43 +0,0 @@ -#include "noise.h" - -static u_int8_t *perm; - -void -noise_seed (int seed) -{ - srand (seed); - perm = malloc (sizeof (u_int8_t) * 256); - - for (size_t i = 0; i < 256; ++i) { - perm[i] = i; - } - - for (size_t i = 0; i < 255; ++i) { - size_t j = i + rand() / (RAND_MAX / (256 - i) + 1); - u_int8_t t = perm[j]; - perm[j] = perm[i]; - perm[i] = t; - } -} - -float -noise2 (float x, float y) -{ - int X = (int) FASTFLOOR (x) & 0xff; - int Y = (int) FASTFLOOR (y) & 0xff; - x -= FASTFLOOR (x); - y -= FASTFLOOR (y); - float u = FADE (x); - float v = FADE (y); - int A = (perm[X] + Y) & 0xff; - int B = (perm[X + 1] + Y) & 0xff; - - return LERP - (v, LERP - (u, GRAD2 - (perm[A], x, y), - GRAD2(perm[B], x - 1, y)), - LERP(u, GRAD2 - (perm[A + 1], x, y - 1), - GRAD2(perm[B + 1], x - 1, y - 1))); -} diff --git a/game/src/chunk/noise.h b/game/src/chunk/noise.h deleted file mode 100644 index 4f09dc1..0000000 --- a/game/src/chunk/noise.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include -#include - -#define FADE(t) (((6 * t - 15) * t + 10) * t * t * t) -#define LERP(t, a, b) (a + t * (b - a)) -#define FASTFLOOR(x) (((int) (x) < (x)) ? ((int) x) : ((int) x - 1)) - -static inline float -GRAD2 (int hash, float x, float y) -{ - return ((hash & 1) ? -x : x) + ((hash & 2) ? -y : y); -} - -void noise_seed (int seed); -float noise2 (float x, float y); diff --git a/game/src/main.c b/game/src/main.c index 179c058..6cf8672 100644 --- a/game/src/main.c +++ b/game/src/main.c @@ -4,11 +4,10 @@ #include -#include "chunk/chunkmesh.h" +#include "chunk/manager.h" #include "state.h" #include "flags.h" #include "camera.h" -#include "mesh.h" #include "resources.h" /* TODO: switch back to cglm.h, since it's faster or something */ @@ -19,8 +18,8 @@ static SDL_GLContext context = NULL; extern GameState game_state; extern GameFlags game_flags; extern Resources resources; +extern ChunkManager chunk_manager; -static ChunkMesh test_chunkmesh; static Camera camera; SDL_AppResult @@ -71,16 +70,11 @@ SDL_AppInit (void **appstate, int argc, char **argv) /* Initialize and load resources. */ Resources_init (); - noise_seed (1337); - - /* Generate a test chunk. */ - Chunk chunk = Chunk_new (); - Chunk_noise (&chunk, 0, 0); - test_chunkmesh = ChunkMesh_from_Chunk_and_neighbors (&chunk, NULL, NULL, NULL); + ChunkManager_init (); program_use (resources.programs[1]); - int arr[4] = { 0, 1, 2, 3 }; - program_set_int_array (resources.programs[1], "materials", 4, arr); + int arr[5] = { 0, 1, 2, 3, 4 }; + program_set_int_array (resources.programs[1], "materials", 5, arr); /* Set up game state. */ game_state.last_time = SDL_GetTicks (); @@ -91,7 +85,6 @@ SDL_AppInit (void **appstate, int argc, char **argv) /* Initialize the default camera. */ camera = Camera_default (); - camera.position.z = -1.0; return SDL_APP_CONTINUE; } @@ -133,6 +126,14 @@ SDL_AppEvent (void *appstate, SDL_Event *event) case SDLK_F1: game_flags.wireframe_enabled = !game_flags.wireframe_enabled; break; + case SDLK_F2: + int active_program; + glGetIntegerv (GL_CURRENT_PROGRAM, &active_program); + program_print (active_program); + break; + case SDLK_F3: + Camera_print (&camera); + break; } } @@ -172,48 +173,47 @@ SDL_AppIterate (void *appstate) { camera.position = v3_add (camera.position, v3_muls - (Camera_get_direction (&camera), game_state.delta_time)); + (Camera_get_direction (&camera), game_state.delta_time * 5)); } if (game_flags.moving_backward) { camera.position = v3_sub (camera.position, v3_muls - (Camera_get_direction (&camera), game_state.delta_time)); + (Camera_get_direction (&camera), game_state.delta_time * 5)); } if (game_flags.moving_right) { camera.position = v3_add (camera.position, v3_muls - (Camera_get_right (&camera), game_state.delta_time)); + (Camera_get_right (&camera), game_state.delta_time * 5)); } if (game_flags.moving_left) { camera.position = v3_sub (camera.position, v3_muls - (Camera_get_right (&camera), game_state.delta_time)); + (Camera_get_right (&camera), game_state.delta_time * 5)); } + + ChunkManager_update (camera.position.x, camera.position.z); /* Render stuff. */ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - mat4_t view = Camera_get_view (&camera); - mat4_t projection = Camera_get_projection (&camera, 640.0 / 480.0); program_use (resources.programs[1]); + program_set_mat4 (resources.programs[1], "projection", Camera_get_projection (&camera, 640.0 / 480.0)); + program_set_mat4 (resources.programs[1], "view", Camera_get_view (&camera)); for (size_t i = 0; i < resources.textures_len; ++i) { glActiveTexture (GL_TEXTURE0 + i); glBindTexture (GL_TEXTURE_2D, resources.textures[i]); } - - program_set_mat4 (resources.programs[1], "view", view); - program_set_mat4 (resources.programs[1], "projection", projection); - ChunkMesh_render (&test_chunkmesh); + + ChunkManager_render (camera.position.x, camera.position.z, resources.programs[1]); glBindTexture (GL_TEXTURE_2D, 0); diff --git a/game/src/mesh.c b/game/src/mesh.c deleted file mode 100644 index f58e730..0000000 --- a/game/src/mesh.c +++ /dev/null @@ -1,21 +0,0 @@ -#include "mesh.h" - -Mesh -Mesh_new (size_t vertices_len, float *vertices) -{ - Mesh mesh = { vertices_len, vertices, 0 }; - glGenBuffers (1, &mesh.vbo); - glBindBuffer (GL_ARRAY_BUFFER, mesh.vbo); - glBufferData (GL_ARRAY_BUFFER, vertices_len * sizeof (float), vertices, GL_STATIC_DRAW); - glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof (float), 0); - glEnableVertexAttribArray (0); - - return mesh; -} - -void -Mesh_draw (Mesh *mesh) -{ - glBindBuffer (GL_ARRAY_BUFFER, mesh->vbo); - glDrawArrays (GL_TRIANGLES, 0, mesh->vertices_len); -} diff --git a/game/src/mesh.h b/game/src/mesh.h deleted file mode 100644 index bb36702..0000000 --- a/game/src/mesh.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include - -#include "util.h" - -typedef struct Mesh -{ - size_t vertices_len; - float *vertices; - GLuint vbo; -} Mesh; - -Mesh Mesh_new (size_t vertices_len, float *vertices); -void Mesh_draw (Mesh *mesh); diff --git a/game/src/program.c b/game/src/program.c index e220ccc..b2adf9b 100644 --- a/game/src/program.c +++ b/game/src/program.c @@ -72,6 +72,12 @@ program_create (const char *v_src, const char *f_src) return program; } +void +program_set_vec4 (int program, const char *name, float x, float y, float z, float w) +{ + glUniform4f (glGetUniformLocation (program, name), x, y, z, w); +} + void program_set_int_array (int program, const char *name, size_t count, int *value) { @@ -104,26 +110,53 @@ gl_type_to_string (GLenum type) void program_print (int program) +/* This function assumes that `program' is the active program. */ { - int bufsize; - glGetProgramiv (program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &bufsize); - char name[bufsize]; - - int uniform_no, attribute_no; - glGetProgramiv (program, GL_ACTIVE_UNIFORMS, &uniform_no); - glGetProgramiv (program, GL_ACTIVE_ATTRIBUTES, &attribute_no); + INFO ("== Program %d ==", program); - INFO ("== Program %d: %d active attribute(s) / %d active uniform(s) ==", program, attribute_no, uniform_no); + int attr_len; + glGetProgramiv (program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &attr_len); + char attr[attr_len]; + + int attribute_no; + glGetProgramiv (program, GL_ACTIVE_ATTRIBUTES, &attribute_no); GLenum type; for (GLint i = 0; i < attribute_no; i++) { - glGetActiveAttrib (program, i, bufsize, NULL, NULL, &type, name); - INFO ("Attribute #%d: %s %s", i, gl_type_to_string (type), name); + glGetActiveAttrib (program, i, attr_len, NULL, NULL, &type, attr); + INFO ("Attribute #%d: %s %s", i, gl_type_to_string (type), attr); } + + int uniform_len; + glGetProgramiv (program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &uniform_len); + char uniform[uniform_len]; + + int uniform_no; + glGetProgramiv (program, GL_ACTIVE_UNIFORMS, &uniform_no); + + float *vec = malloc (sizeof (float) * 4); for (GLint i = 0; i < uniform_no; i++) { - glGetActiveUniform (program, i, bufsize, NULL, NULL, &type, name); - INFO ("Uniform #%d: %s %s", i, gl_type_to_string (type), name); + glGetActiveUniform (program, i, uniform_len, NULL, NULL, &type, uniform); + + switch (type) + { + case GL_FLOAT_VEC3: + glGetUniformfv (program, glGetUniformLocation (program, uniform), vec); + INFO ("Uniform #%d: %s %s = (%5.1f,%5.1f,%5.1f)", i, gl_type_to_string (type), + uniform, vec[0], vec[1], vec[2]); + break; + case GL_FLOAT_VEC4: + glGetUniformfv (program, glGetUniformLocation (program, uniform), vec); + INFO ("Uniform #%d: %s %s = (%5.1f,%5.1f,%5.1f,%5.1f)", i, gl_type_to_string (type), + uniform, vec[0], vec[1], vec[2], vec[3]); + break; + default: + INFO ("Uniform #%d: %s %s", i, gl_type_to_string (type), uniform); + break; + } } + + free (vec); } diff --git a/game/src/program.h b/game/src/program.h index d2ed27b..c34f206 100644 --- a/game/src/program.h +++ b/game/src/program.h @@ -12,5 +12,6 @@ void shader_fail (int shader); void program_fail (int program); int program_create (const char *v_src, const char *f_src); void program_set_int_array (int program, const char *name, size_t count, int *value); +void program_set_vec4 (int program, const char *name, float x, float y, float z, float w); void program_set_mat4 (int program, const char *name, mat4_t value); void program_print (int program); diff --git a/game/src/resources.c b/game/src/resources.c index 4800ed6..3c505f4 100644 --- a/game/src/resources.c +++ b/game/src/resources.c @@ -80,6 +80,7 @@ Resources_init () Resources_load_texture ("res/textures/dirt.png"); Resources_load_texture ("res/textures/drygrass.png"); Resources_load_texture ("res/textures/grass.png"); + Resources_load_texture ("res/textures/rock_cement.png"); Resources_load_texture ("res/textures/asphalt_gravel.png"); } diff --git a/game/src/util.h b/game/src/util.h index 671ae37..3ccb578 100644 --- a/game/src/util.h +++ b/game/src/util.h @@ -16,3 +16,12 @@ #define FATAL(fmt, args...) (fprintf (stderr, COLOR_RED "[!] %s:%d:%s(): " COLOR_RESET fmt "\n", __FILE__, __LINE__, __func__, ##args), exit (-1)) #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) + +typedef struct ivec2_t { int x; int y; } ivec2_t; + +static inline ivec2_t +ivec2 (int x, int y) +{ + ivec2_t v = { x, y }; + return v; +}