From be4691bf546bf04b1c3ac63030c243028496bca1 Mon Sep 17 00:00:00 2001 From: MallocNull Date: Mon, 21 Dec 2020 19:52:31 -0600 Subject: [PATCH] terrain code works do run --- src/data/cube.obj | 32 +++- src/data/cube.rbm | Bin 260 -> 516 bytes src/data/cube2.obj | 51 ++++++ src/data/cube2.rbm | Bin 0 -> 516 bytes src/data/map-colors.bmp | Bin 30122 -> 40138 bytes src/data/map-heights.bmp | Bin 30122 -> 40138 bytes src/data/map-reserve.bmp | Bin 0 -> 40138 bytes src/data/map.xcf | Bin 35694 -> 64779 bytes src/data/rbm.sh | 1 + src/koa/etc.c | 12 ++ src/koa/etc.h | 7 + src/koa/file.c | 9 +- src/koa/file.h | 6 +- src/koa/sdl.c | 29 ---- src/koa/sdl.h | 13 -- src/main.c | 50 +++++- src/okuu/mesh.c | 6 +- src/okuu/shader.c | 25 +++ src/okuu/shader.h | 6 + src/okuu/terrain.c | 330 +++++++++++++++++++++++++++++++-------- src/okuu/terrain.h | 6 +- src/shaders/test.frag | 48 ++++-- src/shaders/test.vert | 15 +- 23 files changed, 503 insertions(+), 143 deletions(-) create mode 100644 src/data/cube2.obj create mode 100644 src/data/cube2.rbm create mode 100644 src/data/map-reserve.bmp create mode 100755 src/data/rbm.sh delete mode 100644 src/koa/sdl.c delete mode 100644 src/koa/sdl.h diff --git a/src/data/cube.obj b/src/data/cube.obj index 2f57cff..718693d 100644 --- a/src/data/cube.obj +++ b/src/data/cube.obj @@ -10,6 +10,20 @@ v 0.500000 -0.500000 0.500000 v 0.500000 0.500000 0.500000 v 0.500000 -0.500000 -0.500000 v 0.500000 0.500000 -0.500000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 vn -1.0000 0.0000 0.0000 vn 0.0000 0.0000 -1.0000 vn 1.0000 0.0000 0.0000 @@ -18,9 +32,15 @@ vn 0.0000 -1.0000 0.0000 vn 0.0000 1.0000 0.0000 usemtl None s off -f 1//1 2//1 4//1 3//1 -f 3//2 4//2 8//2 7//2 -f 7//3 8//3 6//3 5//3 -f 5//4 6//4 2//4 1//4 -f 3//5 7//5 5//5 1//5 -f 8//6 4//6 2//6 6//6 +f 2/1/1 3/2/1 1/3/1 +f 4/4/2 7/5/2 3/2/2 +f 8/6/3 5/7/3 7/5/3 +f 6/8/4 1/9/4 5/7/4 +f 7/5/5 1/10/5 3/11/5 +f 4/12/6 6/8/6 8/6/6 +f 2/1/1 4/4/1 3/2/1 +f 4/4/2 8/6/2 7/5/2 +f 8/6/3 6/8/3 5/7/3 +f 6/8/4 2/13/4 1/9/4 +f 7/5/5 5/7/5 1/10/5 +f 4/12/6 2/14/6 6/8/6 diff --git a/src/data/cube.rbm b/src/data/cube.rbm index efcaf12b755d3364bedda76a3531855ad8dbfc52..b455f19ebc993a1b7303bff4edaa74d93757d4cb 100644 GIT binary patch literal 516 zcmZWmff2$W5KE!0Xw?}yiFOo6VI$oDCvg@Np7*%=T*!a^A-(c>zLo^wO3cKWV3dY? z$DVsn>{`#tdzAk>R`nV08;}XHLi(>}UgyZ_Z><)q&SW%Q4Au{6#7g8=Z^{exT}ac+ zK3wb1m=-W_MK})_xdINDxJwU6n3+w~V$~z-#Hj&C?$XDqPgG8|NC4gHLc7% ibiX^Am%8p~UOM59<`rJAMHXWhCGL literal 260 zcmZXMfenBl3#zwjUn=p(2V3P(*E?=&cem|$lEJYAh`?x}S?=z;mnCv6% s|3{@;imq~RDR*&ax+F<9kim{F0|Ny&0}2jU9g{q61%}6lRlHVt0S-nK(*OVf diff --git a/src/data/cube2.obj b/src/data/cube2.obj new file mode 100644 index 0000000..7a22000 --- /dev/null +++ b/src/data/cube2.obj @@ -0,0 +1,51 @@ +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +mtllib cube2.mtl +o Cube_Cube.001 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl None +s off +f 2/1/1 3/2/1 1/3/1 +f 2/1/1 4/4/1 3/2/1 + +f 4/4/2 7/5/2 3/2/2 +f 4/4/2 8/6/2 7/5/2 + +f 8/6/3 5/7/3 7/5/3 +f 8/6/3 6/8/3 5/7/3 + +f 6/8/4 1/9/4 5/7/4 +f 6/8/4 2/13/4 1/9/4 + +f 7/5/5 1/10/5 3/11/5 +f 7/5/5 5/7/5 1/10/5 + +f 4/12/6 6/8/6 8/6/6 +f 4/12/6 2/14/6 6/8/6 diff --git a/src/data/cube2.rbm b/src/data/cube2.rbm new file mode 100644 index 0000000000000000000000000000000000000000..981e62e802e02a5fe84a002eb98c82a4e58a83da GIT binary patch literal 516 zcmZXR+Y!Pr3~QVFCKN^wWfL8ydUxOHrgCnzJ`X(j6?-`9Jd%9br#18>u z=NN^xZ+7Oa)90;dmtC+>Io{c5y(*hdJ!G;$b?11mjZqci)6|PjmE*a3Qe`uwDVMI5 d^S0N{Io+7k9)$hEgZ}7{-f|JQ6Q@63_zwXCB;Wu5 literal 0 HcmV?d00001 diff --git a/src/data/map-colors.bmp b/src/data/map-colors.bmp index 668384beaef2badc619505f11663882c6104d8d8..ce9a07c04c0eeec9d53aa035f0d58a221ea31036 100644 GIT binary patch literal 40138 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 emg_-&YVPq2vEXAb@V=;Hqi?lTx>>i+>^qpv3b literal 30122 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 aDT?PZ0)mxI%X+3b!;BS6_2R0KQT;EK0c2qS diff --git a/src/data/map-reserve.bmp b/src/data/map-reserve.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5da9d6a5f73e517f9d0e023fd6355530054269eb GIT binary patch literal 40138 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 E0Wz%B3;+NC literal 0 HcmV?d00001 diff --git a/src/data/map.xcf b/src/data/map.xcf index 6b3de1b167f19338c35d2f6d078d059cacea93ca..182d43809415a7a5ce38e9d735f41c7d4c889a2c 100644 GIT binary patch literal 64779 zcmeFaSCAd&l_r?xdY9gtn>RDB_x|3h0zuFSq)32H6dgzw4M0K#fD|m@t5CiGQak&w z8!^$lu@4*jwh`O2u@Un!6C15|Gdt5g6W!`o8%bntKBB>_u|b@aQr{u!{I}c_(#Aeb|+2+ zAN+~aJHFE|;nDRMUfI8Y_kqLsO#~PDI}h%D?(psxonw0szwB(k zcgKUl6?Ss#-u=(Lw7dS&!M#Bhg1bqgbm;K$eY>4Quk73VVmVRT^U@2i?0e;)Q<{9$ z55DyLb55(#n*9BigZ9l!WfXn>w-o*Qy7P}81Vvvv^y+gj>^<<3)BgHhIC=cHoxFLj ze&oR3!_M9VFTA|_P*DDrJ$nxAK76Z!LFxbW)QvO$uxQW^-}oc{pJ36@JHS3 zm&uP8@o(_Cc@Oo;GB{QLDi_(2El#9#TpyYapC4{v-w{=*yJ1Q8~#GZgW6 zq$s8YQTGdlVx?O09NW=l4h<4i!!#s0WPc{xRwg3g9K$4unD`6B%6f%zrP3@H^R8#6 zuuw=!(oMspY|{GNmSrO&u?$1w1^9$$6#Au_^GeN1wc2b}D+Sk<6_FuHHmsVI6|%3$ zw#kYV^A&*_k<2xgiUx(=&X@dVtzB)EO4Vwq;HsJ=h9fkunwD)@w0&8!Oid)|8-+Mt z2@3s<;}u%nX1h|YwJMc@Ev3UGL55{bH*A!$ZN)NVI>e9!&0IqxgEC)u<$Al{ZMWzu zS-R?4j7YIx#5G;hElWnDlq+6V&{7mb zaDt?&hAiV{mMEuqI?R&Pq>f**f`*bpO#JudYQ5d*v|G(arCxS5SqilK>vP%*SX^J(-C$4A8vN`+bzM6FS;H!As@#cMLdQ0xc1s2YaGS+ZpciliEn zBGVM{CCTw(26Kstie&L(z1gU@nypHsth?Db7h&GvL|N5&K@>GZG$mWk#Ay}-%Emb^ z=$enbe7;^Q7fY2|wdiNPtR9XqzhFZlK9*25)v&X+A`5C%U*dSET<}aWg#OdQ#5S+0h-uc*(!J^Cw@R`l zXUnc-sUnG&5ty1-uHv5>StsZEZq_m+juQ-Bl^CYdy!+)d-`)QBllMLM%JaML7#GXM zJGNMcq6sXEA-pyz`LU#_S~iz81c7HbMUyG+?K=-WyzRx~%dZ@G_4}vJoIU>3{oi@! zJ3DXlv%IQEY?!%@7ygD96PzEG#auKj>S^kzU$E0m6i4N<(1{tbBim>i;GLAPQ3Q) z_H9F(7A7s6lqA{95=sWo`jpf8e7^PYwgU?*%WKreyX&iKD;w(~^7k5-- z4ucUa!RzSQ%Phn49IAdv)W@}_9yoXoZ(66$zkgwIePiSNg$w6bmsXeN_dU8*j?tK2 zH%i5si}qCKu18;;e{K1~`Hhv03-tL9H_ivQpWoP6TUk8(!j6I(MLU9~;WgLUIP;Nv z-|W6KXIF6F`uh3Taqk7{JbB^$mF4x-<)wv_dv@Mg5O|DTutZ{FunL$@i_h-fx3GR5 zFFC)wN?jn&lWV`cfWoL8+I9Ni?A@NE1ZxL#Uy6xW1&L=v%x@%r+jB>jH}DSX!aJxE zsy3>tmCC? zt1C;3i}Q0k+Aghg{9+BA&Mquk^)8inAINselRzJR=pnd=K1v#$5+=EmR8m_mgY|#J+W`+ zw1s}5n9D35VUki*{9}PlVPj3W?%i`o&aIqBZ(Mle^$U2}x%sn8-#>Zsg##y!9XWRF z=;=exY(<|k1RG9dM8=AVpYk!9CerEqZ(mqDw?V!B6$bD1_b#lQIQz=%t{r=iegEmb zk34^H&l7td9QP;!Gg*iwI8i`-Kb6@;h^DLcXTE!E{e0}gPd8T2oO$H7c6;~f)4N`M z{OK2N>uv3iM&Q91QeeUvQ3?u4OqwM4ZTFlwySTAIU-&E3^}>bKJ-6NAGWGB5J-qk1 zXWG?bu5tg}cRtc%2%3(lR6>wsv{B|$B*X69f9CYk+Q!EEI;Po$jg6H<&*rdK-TmyS zH|ljXFE@I6XTig6Mvns%Vu@ymFn&2icZV32}Ukf ziQ4UBjgVzbQ$e%R49B79J1R{Qy6J5{xUjU0x2~MWz^|Wrpw?%&V6UTz4}xhef*1t- z%1U}F&1BHfU#JvG3~$fhe&F=EmDP>a)%C^YrPD7z)qDE>pj@yMT?qyP3op!k$%ey; zBuJw8i!?ER_8>CkHq*$k_aVa5Q}%%P?#oInxw`LJn_AQ$4@TqyDeY9^P>?mMtl^L z)0|{rW+g%)hGnz_7Z-ny%0~%`j<7L*YBcl6gD-z8XLNG1A<-lgA+C~qoTtP~7U;N) zGo+TvObSKgSchSrb&5UHC=I5HhM~x|s?q2@l6;>Ca}tA1>IUzF9!bUnPJpEUG@25_ znG7#Y-_>vwE2rnOY8I@DDsl`|434Vu9P@MNyCy z)byvOWjUVjm+K`kJ2ez^Z9nV!S;x>F*Dn+cCA#=!!OGc^sfEO=VP2Nw;-7<`K}VJf z`BJr3saJi^1;?W~dB+m{d>%YYnEp>m{oC>teR(`kpB>8A+E7-ACQN z@I5b=wJakpUd7a5(&Ck}U#pfh@vEGh5`*TbReFyuY) zx=Bf&q58ouFgP+=nYHpI7WZCFS+)@puUjGU{Zi4vtP|Kc3zm!wg~QR5qEY6DV3l*O z<)ib#Gh<#D5fU?x`J<$)S*GO|EWMDg1cU8pN>;+2oMHt!nNBgBsM==MQEkUEv%YQG zrU-5(6N(Uj03vQ;U~-r#g&f#J+wcr0YlX25gku?ww7vzVHgBCb^^IQd*r2X6`fGl}b)(#)nbvnkDNN;8|%%%(K6Da~w3Gn>-PrZlrD z&1_0Do6^jtZD!Lp1MSKN1#5VUxGGwb9JasA z%0L`&93@`i!(p0C5Wj@Ab8^4!+B)D{f~0TV%En_MTzgkHZ9uqWfW|bZ=-5*aY#TNN zCKXN+@3Jr!q6T(%>h^70UN~@IVd2#7yZgyxk{~nh3aBm2isMJ0-?R7V*^?(TyASR;y12A_b{-&) zy$=qObb@$?movIyHV3n(PR;`ju)emsx^(dQdomFcM(mGC4)Cq}cTPWfba7$v@S$aD z>667Xdmi{!KAhq+;b<6kyRU#}VBeX(|ACiIFD(JbvkHvN{NZP}<slTnrEZ%gZZAzqfZso)Ss<8W#hO4}d|IG(Kdi4;?%+zr1`7h=k==?!5b+ znn=r^i%c9(fus>)KDzhtv7?KN%gal6%((;i*ENZfFT;qK4gsA&GavcIdtNxUxO8se z+?n~a$6kK&PAww8$z_1koM3#o@9v*{d_Owj%qhTC_H6Ct^Z-L9Uy-;Nh3CJ=nh!oZ z``GjY`%fM{cKqbRi9L7fnru_bWm)7hF}&eDmQ(w~hn~4>=abua?w^}I@c5RIA_}zp zucb^l#Uy~VfTdWH;*TAjyZg~cckbFUx^2{N0G1|UPKYTQ@CHEq6b7(C{o9B4Z!d;& zX0~$AUH9(VN=ZM3K@+tNhaxQO*SukvrdqFYtq$j9hr6GsmlY)>za^wInGhkt%q{}Z zXBG1TE7Y5b)_u2`mTQIO&qM)z7M4|o2MY4C9RP-a)4CkhY*oVbOJW*l!r`Q>7(hFI zpjZmWa||c*=`b5qQx<`)_#z#RhBZ`yvfqTY-qrxx;wY92(}{FiglRq=ON0StNQs;Q zC}WnguNW%uMHKUykjMm(L*N+V6m>ZqO959I&c0~@_lb$X;UBj zcmOI(Dx~#}4iFE=0}YbUgj6O3SO-bb0JXtdOlQB+aN8%AW|+Fh^Q2uA78nx-MDVLl|80u$k2%8f)537QZ!7@!3+YdK1Q+tdwBmS|C;lMyNz zkA%cHU_h*pPz@CiH)ty`_`~Qfh;oEZCu8Y&NR~0#fOO#m0i?k)rI7to*zFBKThoFh z%0fzFVu1Zp94~RAZe=k7vQ1lW>Oxw?L;z_(XR~}bfJ3s9ARE9|f|9_He$7b&E%31( z2?rCF3a9aM+p;C`GX*DLn@8<2oD=}&*SL&fh+nc;IRGP>;$;9}=ooK{*CV|6nOg*m zqFN~Ud7Bo$QZp&>lBocY>AQX1tCB#Amx0BU8J=eTKvHyOLSkhZ zFj2)W7>=&WK$etBuHyo=2$T}1nu>-^!Op6V=jpa*s92I7RlWiMrlo|~p91*G^CHU! zSd|0lV#7wiR*8rq1v?IK>+W} zoDTV3g+|E`MahOYLg1D3`xK<#3=|QH?AT_`b;@4e$?1AlWhFQaLIxLQJ?q%II&o!z z&x@=kGig2!w;>X~S5znzPV<4b$1$>nqFX3rUCR0ZJ_%{K^6@;hJ&FZ2f~saIS36ERe;|eGP6&ae`NA<+?`cpFx4e!%5eWK=h>bh5f3kBZjf1$G>mLPQ_q`W6ff)WdpGzD+TTBC8-qxV$%r9^~yixs3KYno_~ zq-0Ia%R@<#wS+W06rr#SDL)L9U4b$SHS_P=aogjE4nFzN)^u}i$bY?6%TSbnca8v)Z)_oS(Ha{IOZ-do_g-F zRjA?=UFu^9{#Ak&^UpTaM?%dMC{2IMMF8_LMeRXBwmEAk; zxa&4s*5QXkS)Xg@bu+FAaI=TYZs3^zZlJ|d(w%Kj9)|&7H83Z@H}%xQGPQDP@$`W` z&)hq8$8^=UDeE&sGoZN-Jc*&${+!^VsT4(r0%v5!=}bR&dTDuO4W6p-_FX5}K3Q2` zLsb@zKXd=RcRsi^Y+ub9ngFkN3jcf#XJJLl#1g2-rR?30?mY_6K{#T<0r&a_wf@QK z+FH<#GkfozYCQF1#J*yw@Xii1UwD27G$7C@|1~2{Klbv0*8=MX9BI)}@D*NL-&mes zge_$Ey%oDqfTo$UuNrFLv;FqB>(g+^moxBEB@~6tKJezxX_3ZJzkL)_O1gp=)4;wS|)Pegg z1YWpmz~m5Sek$?uccF}h7TMNykrULo$ZPjKwd?SSUEkaN=(8^!T&B;{8yC->eD$8v zB#Hv8STYL!1cax!LxO$6&YC(r6iukUH8_r6$AbGC==Gm`N!4t}v2;<>oj~_5@$H>Y?(jIJWwMX$KeB*M`WTk7BRjtH z-3ki>04xA-Hvcole*$yb%|Q{a%PJUWRoeE4@42g1F zU^@wFO)>AmZ#F3?2K*OoY*Lyk2OAH(r+);-j0?6RS+?Ozik%}4$Kc@Fjd&M-jv>Xqiy5tBcS=SqHxHr^aW1Nhj~1PLyEstTu7A(IG)u(f=Z&}l5NFYz#eO@=Z72@AGy zlKCYM&%tOUZOS~XN_-st(5M4J#W~8l1oN+q(O0o?GnjEOAyLf7VJgC=qp%@o(t*JU zUcMiIB@ogEY6M%1g{2UQhR7&tL{9=Y1pPoUn=Hj9OR>pPY_b%aEX5{EvB^?wvJ{&v z#io{GQ%kX_rP$O`Y-%YswG^9LivNFTDFWli;({3xLU-98$u>ulW9L zyN3QJ+=!yMvATF*n~?z?R|`YE{<+wyJ$rh7 z@xpof!lmh(q}L>uWb+Tz|F!-^W$p%{&GPzEOm#w41L99Tev$~WG69opcv z6W@C<8xx|*L?THBX!iui6y4eV$IgUazy1dG`e)GJ9(=%}_-FiE>0*&M2LH_+&&{1!UBeAu|94?y>BvKF zOiU(VdrH8J@Wu1{4$m(kBq4=retQ1G8|&xipK9|-fSf7$(^M=7bA9;Kxw9)L&WGN3 z^TO-s){Vtiw=grj`p;>P(^=-ZFK{3w@$s!al#J%f;TuP)B7K(8JQ`Qqy7M%;(HFw|ii*ql`o&DaCvyVMo z(;wJp46?9M;eT5GIhPV*RPOsP-+%w^#`pGq`|+pmypx!@*GqB%9^Izozms@Dip8}3 zC!eT%S9`qQ9^RMRxrJcV3=g9llsB zO(Z_R?T4dL&1-OpMuWH7_dh1MX^Lankih8@LJ49Z#5fV66Jmkq5I2(~>oazYM<8mf z21(LVCJ@(|Ky4d}$4DUfX^tT2m@LBJ1G-KUpR;hSvCJsVQ^c?1a3X+;m4K0s3k9)N zgD{1k7=V~Zpm2sA5RNVsP6Z(ZL?)h2JX$y@!G%Z)Rb6E2S7y^!N38<3a60v0_a1} za}ncNH_a@NDdwcSg(vG=7-&V&$~k(jKRq=)U2;raw@YQTS_wssyqk%|0j>lX2ADed zR07xnSk0t7e1x68m+Z7yE7h54GYMlVOWJ0kTXg=m20=GXdM2jZdL;(#E#bq6y z`?lAR%74i!xq7395a;!J#m%q?Qk|RJtOpg%Ia-QNa=eZ)(8^?!Y`tG=v|H62@GDg6 zMmMNv66Jj1nRFzXQL|?G^KP%#X*cUd9ZCq2Rws|k2d%yA)>{?J;>+|y@$%pG2g3%^ zrC0=oC7k*uA*NfhbJ}$Rg^^zYhdk=-n7Y9Qm3!2<-A!551 z!P!vxV;2jnJD8l70J6=6%RWwDw3_|VaB6be$Yz~zIUk(Owg{18>X*lJ*wJ8pY&)^#b=2@M_eKpLFNXmU1p>+BfdFU!Aq7VgjLL$PugZTNKs z9gsx447ocgVWEWlP`XUwS-)-%r^Zwyo@Q=TCu31%=^?57>%r92m`vKfb)!LuNnaLm z{=@EQdTJciYJ=8|s`5HYa1TYx*9M(Rs{COmC}h8peOU{LCer)O@w96dmnS={^A-F~|>H8VY`nHegj!v(%lZ(&h2hSOWN%uE_l zthO3-nL+a|mw=5f_Ngsz&a{A>6%4;vYIOR;ZnZnc-8XKpkEX{1x}3)S?|15joKqUi zY}qp1DOW+O%I)ren)+ne98Ar8U7$(LT%V@PDfH3X1Jv2cx2LwujM|;ypjEDRM^n>N zQ=`^sJVQ-?IjK-%hT3v{CR~nU+{h8x|EpfJ>>)yZYcOb`lc)QY5{6-VW@ZYH2o5Ht zYEv{yMavW__Iag=rP*neTq^q$(6B;tG#+<~eq(?hnwcIns`bvzS>MEtvIRAqN|gW2 zbg$^wdc9WF$E2`;!Lv%;ezzRFc{H9LkB5k&Unn*vud8&1qtSS3YFIJC<-fq?ndx?+ z82I)(KtC#(Xht$TWH7MZdZ#-8AsW%BWFv zOv<^aiz1s$@H&v&F4A{V#Y36EwF{oJ-&VwAgSyj?4hbq4nbVpD(&n;AIr5rG# z0A5>0wLk3FeJeEkWwj29)96sMUkM4S{38V^8?b|!26nn)YczvinHsl?`R1VCspm`w zbisAY?Owa;hG)s*m3*Z)wS}7fGo%KKMdJpL`ygkCl5=}Ypka6)hG=ToDp9kS`olq|FCfQm0Yx z&&+gYKkcFi3e|R}UTKe~JF^$9tW)g`hP7h8(jAR@_1RxFx=jm{7{i~nbNO<;=A-A4 zOJnwO2lJs`q-U?{<)B5#-0MI8=!6aBwE#Y1!Za7{ENhoyB&f(|8^Oq$`Yl# zx(nrU(M2|h5;muPE$8U}Zm@ig3gCQPO@tp8nh?ttYLd@d7|J-+Wj{Khb zPrTQjqkZM(z2aQRr|056fAhC6r}&wh$K0Imr*9s!bEcoVdCbgNw~o_uj-R}FJ~ik1 ziCf2M|7yOF&$G8qCFjyUnHRqC+q-p~nDcKP$LI3D^*B0LymkJY$C0_xt@9Dw^L2Ip z@#Ama|M$n?x$>>&gz(I-oBI!sRX;WtzSS+EIT^>~tu71ANq+Wb7lh_S-?@1lp5uJ? zw;V_2*jwkLbIh&d82ZY)d4Fs!<@+~}lXFqOaPv4bNBO0j$A3RPLPTedoSm7YW+V8t z=0cP2=3IF4U7L%}Msc3RJtbU=&n0Jh{Kj)}+?h?`lbNf}$~YIEqi1Q93*$J1&sj1# z7bZfPDdI|I7XSU1`nKUtq}+U_NQB_h5s&gWe+z_ySXwvU#}Rroee;+l%xLQ7F+*6l zj?;t_P2N18BHU==w;U%4@7DQm9w!L@*7-P*|EDKuO?)kb7|M>AY z@BjPbFj2nsoDiP*bsPWTu^NpL;ahzXB4ixH`Ris|5#%YFy>%=`otwvDIJ~&Ofbz0647Yk=5dCgqNSV1e?K2WnGS(DNMH`)(;_ej@!cda z2k~7aFbDAsT0L9BwK#z}h~IcFjxh)E$q<->IEMsbvoy+uaf~c@!5k!l_-$cgp7t#6;ZQgli=E!KPv0{1-ee@8e~MOH3&lW1Ht%7DGr^m5e+_Cg4OMFk#P2?_o& z$b02wRRj}@@_4o7RNGY_A`S9Fxuzt~MZX3bK&*FtL1cE3Lu4H`A@O7%vw;^&;K1a}hLlhb*t zQ0;UZwPqh1UZ+&3)=RF3gsd1B8Igv_+`G0ASKL~EG-y?7y}RfLWD=SS&T829bESGMZ`$aJtO0)>TNh$5KmVdxb7gREey!6gWgTP#b#$}bEa|dD z@z;=Bl_K7vMx$09?=>ACX}ys6GpBQ$?O9wb779hE=${j4JXqB_qAj8SijCf&TXVQb zOhmk=5J@Lk$@c67MPNs-Q|>(R1JCuF!{K<`E3kA-Fx(PLB~giDtFA}zq;AQ^D0oF^ z6~KoyjAVqBvkfaPK%?T93jhd|TV;E~*%iCsdzhq=x*ohrK zTSnw8Re{fmkuB9~c&^UIMaFCox;e?I)XHF1E9Ek#f`OEpoQ`?syU-Pd6+wU#CzH_2 z-9dLasFlmZ;h?~Al4ki;a7t#3h)Al)zymG9TD1XKHosgRj|Mfjh%CBQC`CFRi=~95 zy#fb6C_Pu}w(=GPn5j;!-t9KZ?ddHu<%*~t*d^aI##5tCp$rbSU+V>O z*O(gqA5-IgHDB)yhuuceb2M{$JS^$O;nb*C3mD&-soUjzEXTgI?V$c6(iPV*`=I95WryXr^XB>hlVDJ(Wl^)Oeow=Yu*p(^0crDfn4v zSrDL)w+l!I>|wE3aO6|QQ`4jVXnJPcE?FWdoNW4@tz}E~R-@pS8o1L`#?ug5pkjj* zXakgy%~d+!R{ct&SubIh4rmBO=EXGXm?HG5SxYg5$h#fHjM%N4xQ%~!!?E3==0Wkz&2D0#{qbrzxK&|juv z&VJ=Nl>3z}M`o`e^YSbnaXn7Yl8_p{2$5tW2PznweaCJMx~-ZkF^LG7fKoDNrb3Yj zo!6aQc=nx^FY9%Xx@w_REoHfsiuig`Bmo>mF*f^)seaiig99IQdZS?{4@Wp%O3)cy z%S2|cx9HKk{c;tPIGASRQM>GjafG@|h+;A{dnIXgrbg88;|?Y-IyVsahP_4}KDAdV zz&YqyU~`nlXgnN^`;&jCLsM6J&8i&<+^@ePWB8t5bdWK=Y*Q`Ji91p5F$5j1hvpooUuA7$<6a#|T?Y7$3YU<6wc+`Ry zeWh4yqkn_t-1GP-$wEMG7D}zrRKHSg4|=syQ11@a{}-6HQ=_^G>Kz0@EO^aczu)q+ z=#?%ANx$9hby~>cI%wDl7#%`zf3%BT=)=nvE9apz8TA^aQl*GYh{c=~3!!f!F~_Y0 zo2DbC6o`XRfLdhCH6c6~uNTiL>GV9jr19HaYlY=9JmQoC=oP#3wRK&3!eC z)7QaKllYF##b$NfuH#$7WfPn@gtFP}+;wm`e>R7Qf#;#Y?*yL=frk-z7=ecoco^~3 zEKbAmbe6<-l)%GqyN+)Smrbx#V5w)b#N=T_fZe-dr87>4n);WchA9}u)^ObKpcne} zd;x^L4EY$8soZTr#qa2_M;!{uc8}hh_K7#3YFH7o+hV0A2y5i z{&?6b(C(Kg4J`w-(|-fnH|{|*2QtwcLvsYpngs$=?(}6`GDg`Vj7NIMU04|IDC=)5{mIKXC+PN}fz z3>tp6*r+$qa&#FqcZl^EaFeicWNYY6Y*M2Rn1M!POl_Gb7NGs;gWgq2IhZjN(JIuc zzG+q3%@Vji?AyaZ6Z`;}SQG4~2h!Jv)u!JMs91YAa~s|PeM7xi>vn2LB8s@CE;cHs z(rLH|&WV($&{H;=H4o7N%zV9Asy8cOl!n28PIo&&6R0ikO?M06Li(LfuiL63%_{UL zy>^N6{}!Pm@}Q*sZVk~r4X<6xBjxCX%%gFmW*wwszngj13ORszaVB**Rcn&=*6RONZ74js4Ho5uTp zcd8Z04F$*?qb8;c)_st3w$`W>vw~z=8lr}Ryp)khchqmz>m@xI5&{O8dcs2I6N*ya5JQDVg;doGHDAWK=sbAnvh%kkLeA>xx!0dWt~H0wih znjTZc|4OEdFxtVM1(Jphr3T?8>oz-O7u0tO99q9@_&o@jLM)QzQxVR}S~}SHY_Sfl zHaM<0qvq=%L{JuIkw>}g*{+!_*F3$@A5+tRIjX5Fj;65e5QSM|Rm@RajLTRj2;obF zB(Ic5US}sqyMI@Og|-Tz9-*T}3pN}q>aHEvG3RE$jk=WcZ|yAf7bcqw3Se##F{cM} z0|eMWVDQ0Qj=K3k5MeU;VC$To>gvhT6gBfR5UmpCPptxBU5cj+ly?l32z#TM8SJV~ zmU2G!`Y;3Z^9Y)d2{V=PG(B^*tETJp%)bkysa&zwYc`5nf=IoUwTV;U)D<)O3VvDp`4GcwK4szIc>Q!_- z@;O&42(T1&U{D%XL>6SchuyDPP||U`-l}IOtel4Jsgnb@Gl$QF>v`9=EvW75MVm`W zNGy)X)qbsLVj2^F7fSO;Bi_y%1=#v(o+)G)LFCecS1np%grvdvC6U5gNlkT1m2SV+ z@bhIPc;`iq*AU|)Nr#BH$c%viIwFWF%pOo{z=+U=r9)G=I0ErR5MbW`g^{+5VS*d> zV9mqW4{ABYJEw!Vz*xK{H{Hjk+V6H@X2INO=WSgM$B1`gs^i*XtOHpclfOGL1O-|R zgQcRxJ0ysEE61v)$wGV4^%Cv{BI&Y=vZ5&N;ai^3b7y$R7bDwYZ>Tt z-lXHe`x69J9)QL<;Z6yAD^Lnqzg)rlgJ=8{S|)`@Oe+e@WYp1P!%i{4hhQEXhJvU~ zfh)iVVHP-ilAy8G^~xgCZx^x{^Php<=L=re6yw25BFO~8UQn5AAtx~+wlW9z%oG2M z<3b_OD!Zl}LzO9*^AP480j@;o8`?z}b-?`CC2SPK21LRP8RrE(56;9jb@)|C^01cG zcm&8+YJsTQDtI;@)k<|tf?==b*&>F2xwRfOUL1lSHY5*9F_@fG0j>=REmvp)JOgqf@OBM~s&2bc z%iCV1>O*SR3^@~vCL$a*&Q?x`>i}cJ_yy}T78xv`mXyqBh!cf)I%y7Su9}=cI5ER6 z+gx6=mS<+&QnUPxn3W&e9kDR(+vDr(nSjTS}^rdAx3jZ6iR#j7wN1Qt{gO>Mb6J#1t-O!|hdHoo+Y5kdiZ3 zN0lIU%tbP8BD=j~aA6KoB+h&}s+9vKiJH0AH}U%uTB%}#_M{jIbt@GjK5hDbD-blM zrur7*rd*0cO9f<8DDc$tclMu zm?>jeia`QG#IG?cgWxzilhmLG&8gU|J`D@dqrxC4gpub1jtgNZflX6m!y)Xnt|P&X z=1r(yb1*YzB54-BJw!}{!XX*xjT2fhV(7>ZqZ*XEN-Qp^9Q3uIzJYcV5FVI6v7z80 zAJJO1)xt2u5HlWHfRvU4?hc|M3t9936Mq*wxckuVgGYB0`1{WR?}B^&TLIo7M$}+etiw93*9*PgM}O4R|CM|*MDE%gWo^+-5V$W)y^B=Ke}||`=g6Dz7czW5;=$@ z-wvmc&j9#{V!%&0E*U);J_%#VLyDms-0SeMK;0Z1G0F|z~79&#Z7jaETh^!zZ11VoIML1*K z2;cPkET81jSA3XL1ksdWxqxK>w69%*mNHmZT8d%_4$oB$q_siCMLEUOVU`TSIFZc1 zVg(K51re$nNrED@Tm{nxn?F=8r(z6pHkWFZlhW=JG-VBU@(co=Lcxx8z8g;KeY!)Bb5 zbvSZ~9LDETG!hY`bV?GYTqz`9wKa{WFva*N&3qYF(u$@bUe-U$diioO7ra0Wp_jEV zvCXS0Vw!cdbZ@%(trA?rvIzHWsUjS?kQOEI>mmizM~Goi!6duB3*kZHfcMm)lw>N+ zyI(%@-R+M*dEaxdJiq&nF=UK8wjhk07Np#`5jpH#ij_1u3U@j!NFtJj@r`FVMUyG+ z?K=-WyzRx~%l}wHO%Q2DLg+pLX*m?6$S{y$hGKrgAvp}=J$&TsiN%$*qbE+xFP&UC ze&qOT^YbTPynAFzQV`D!%M8wySR<$`i}#sG;SrSneHK3nX8W!~XW@dlj_gFM=N4C% z7Z;aKop|lp?c0VnElk>trU#?}?LY}uLiymapK>~%&$k}lc3@#;8G+&6MGU=_4Y*9M zubnw@eE*9(Dl(!xq98@Y5Vq|KA{N3OkGUl3iJ4=YDP966F=FY~k@@dz^b8_D1H+>zxCyp6i>&UrNG{Kneqc{FQdZ4C*V4!!Wg zeMOL3H0)!5oT4nxb5RT>m_U|hJ~xKnI&*wsVI8i!BwqXlA}Ow|Ay^-E{%5NgkmZB- z-?gnG1jB`wvoVC9j7Jl)7y}_hw9zZIr?)@#Dz$X={Ko5(C%hN5eHAec;eorl0w2`* zxgBj-iJ3P+4I>#@)`MvvTY4Dzh=|;S`(C->j0`W-*WX3^QT6qWl{GvBzMyALAAauP zA!HloOO}pD1%s!h%d9G7l8|_Q%xVvRKbSp1QzuTv=hsghUtM2VT3Opznn$LoeLJTu zbQy)xe1u6#@c+CnQNkaxDR6TM*S&l0$T>JAZ>(K_Cof)lZvO1j_fMXD;lPPwM~)pk zdiu~aTLZsH#QRKSLARoD{-QIor^sZMQfBJ>ndRw7bmhoOvV8R&@8Fqq7%b!XNV66PM zdrq8P+}NNm{AJ+Ndtr6YZFjg#{X2UP?|tr>cD0ym+<*6-kM!XENk>#F5zq{johSZh zSTkilMKbKp{bx=i;^oHrIwt3Zjg6H<&*rd;-u>*TH|ljXFE@I6XTigEOeHuYl;DGK zxG1YgmXL|CgxZ)rI{(_jI;O}PmfPymE7jZ4MV*#s6O3G}61CgM8X+V4A|u>P%!xe+ zJttc#^781WxBcM4(lXw^avoD;{nP`sJ_A!v;FkJ+uq;Fnm7vpENl&Gjj3CqY+o*vG z6T$HI{Ot!$BVXFa>gqZ|m7ae2sovA~2W7F-GFO6;!qN>he~Bbp2{_a%fh7@1wU9K9 zh}|&Z|yHBM=e{$$>&(f>XqQWavbkF(kn9;g%fmoJ3Zf zJ@D%86U&QBt3evIS0CKr5K&`N$$+>~%)3a?MRRb_4F-)0$9e2ofDFT@mw1mM`nNy! z;-0gsi}Q=ir_UU^N8w^L6GeS5qn#Xwj9>4IGycxVIqzY*znWDi+W5WlX;{#njL)G8)Gc5A&>3?3qSsF!c{}dcIAB zIf=oZd4r!rk0s-bpkQVp0J2EYe;Q4R;Y@~?rtfMvh~JE4SSqA#?4cZZN{}8pp(Z&A zF-;LQSPWyzAq=fdD}Q85JSmd`t07pXV^}cYAg5LirUx)jnkLY(B)r^34SIaIDFpF` zJ}cXT(j+BC zl|M5qgbRhp3#((^^ubJ&3y_c;#EnIcH#AHI-{h#8Re~s+qq1Kpf;36-8Bu-=4-B}6 zScU*D#zoF6=${LPJfIrThS~};*lB8@3G=Apl|lgQr<5y_YVmmMU!wbTNZFQdLi8;_ z&)h_wFDSAh145f_8nO-?1|aC0WEq)dP)ry+l=iUCb6;-!o+bE0jmuz z>wiki2(7Ew!90VZq5z>Byl3xKweAMWl!el(;4({S5OVD36|zRVhG=TlrEh zp9{RJ5G#U3;x*#alx4&6;y~Pha7dLtC^}g40vl(s(U75VIGR#4%KQ-MlALS#nCpo0 zjr9m6Xh8q|C@CYKpXC=Uy#R9tR+s}FDYR$N6f4k4M6QKnmko%!3M>iKdjFO3s&0zR znO-V~WPMdnSBdDF_gX=UEDGH+U$H?7Q@R_0ABbIx(C|3qXC zqQ6|^+jLA1Lt(9}d%Gg7{^C1q$xBU0Vl^S&;OtTiG}g(I$v@5d#!BGUQjc0B>;Y zsRyI;QiFHd0AGSq-KpERZF%9qfrW)ryYKENlSzWiyepu#z@m&FeSXj0qi0W^ zeC??%w~h5M75EQv0svyB`>p5aUOtB86sL|JefjyF*;oV@e~FALCh*t!?t^=dE-o#f zod+6m?}LLRogm)f7!rvf#l3j{&gmzQE-ow{ zKD10NeX@9F&ja7ehf{nej2zMvbScHYGkyO9NH!9r+g=66bN=wN+w$oM;8a`^0d?MG zxCjtsxqA;>6J+LPN#jGN`q05M^UKTUfQVau<<7hB zf!~Mxxd?YacuoX4jz7Bh@Uf$di_6PPc+9y2_t!N*0xts&kq!YEM>8M!#d}^jwzza| z;oO<|v&UY3@=h%xzsY6b)-b`Ta^KxQ`}lrz!kJURRPNc@L#kt-rR6IU0`B1X@3H2C z&(1zJ{lNZ{M~@vpxo~37ow_F5lyVuqNSPSk@E*&l{ozB;+_m$`?K}6+%^rAs%Lqw? zY589x$$W}Q03U<=)^Lh??C9Lxk3PC{*Ot+3qkba*FJexJDLNdF0r9Rd0MqN=KD>W> zF_bg2m3!{Gch^=*`l%>MsBIWARe%`b5$V=c>ou;`;k@i{_Y?K9qJ-qPgmfl@z)k>a ziNLg5#k{}@^=6`V-)*MlTF7@2B*}?~WmVzfCvX{&f{{v_VlGEDTa|GAl9(141^3!61YM*pfh8 zx<;eX=-59Ye?%&OL9$g_d9$g?W^+`95ZfDjz1VB6;Nk-@rF1|jE1uLgaVR?$05l69sFLtXaUh>O^+zablSq%m53)J zIOLivJ&&`$B>T@vvk8mpBQu#1u6xXJ30Zy?i8tY#iInaTZ=#VJZy()3Moi;JV~Pgq zNGhq|0xLPNYMoH=_c^9zx+s`VdS+8b1ZzUFf*(@DKnnBnHZ&KDIH_8Kn^Cfz&^UYiq z+5RJb{Zh7=qy9!%K?&Q6_=D{Krf3%&%GcptQUXI1w9uSMIs6SyB)%CZn&xXBK24UO zS`y?F*9AUD23k}|dZB0XIl1_w&(G!|E#q#%CED3sX_ea_lv`Eo=voN7t*TLlo&6in z$!Yoaa@oh?kDm?Ol;z^)R48_F(p0{%w>*w9;F}$UOxAQ(1k}neYF0EBkEe;|C6lVf z4Mc%A=*A9gfvelwD{Ve$zO0+kbx(G_)0<-H6xJx=_N=s4y4pHkkylMhvu%K!9pALF z4lciJLHP9y*P{ZawWXs%biciG?JHfrU>iA*DNFeb#F4b3YXo%2MBry@ZR_eYvkY}JrXQfziv!>h`TJ^lOXsd>z{wnL_ z)Rk9;Z4>Zt{C4P6u8q;M6F_V$F#-&~Iw#TNCFhsi=5jgbmtl$JbKrQNlaMGnVeK|P zdA#zNiTSOya9uop-JVl!g&{$PN?nvxn1fQPYyD>pS|5^gqYg`N9(pQwdn=5KzlGXY6w;h!Kxw98Un2$&>8}*ADzkb^UwO<>rIRQ!NH>0MjhD5=wZH< z(|j~R&vP6j%ol1w5R;vd{Q@DMGx}YoXYlgr3)iMD9_m5uRhnZ$+Wtz5WZ@H{*A?sn zq9wXj&avp7mi#vA}HYAM%xDF>_yKYNI zS%|uEPf%AREtQZSwIBNU^XfFM?~`?<5t{u|eSWSsb@5E!wjEo2JLjS;79SJ;Efx~w zwiWdSiaO)HZ-kiXq}RXIKhD5uPK>XBcHEenm1_@YZVrF)(e5qVdREgKReY59=r4rP zMDkizA5)&u)FdlmL2q%I*Y}*fN!@!Ld4^ezdu*6i|=u3@a-+#$NHoG^CG24Mnrv5 zu7DV@#RTI&RIBIkx#6o~ng(Hn69rqPKHr#~oMHBMW_Oq04x1ZA`30D7P%&Tbd8G#i zk`1e0ksL=Wy?g1xnX8$k|1_|9zu*R0Dvt@x z_q%@4e_+e0kho1~WkGXYga;i2t$3a87ksD9vhkDn8>E&=4qCiagjb~KYF;B?6P;)KQGmW*| z4h#&>%uS3B9vHY%Wy%O4W&!X=?Z)t4itPEOjJP7|?W|#cfLP85z|Z9@-EhRF}=TCFj8jk=zfnyM(0v<(wNckJQGQ)&YQNV}c6?)9(1i0fX0jyF>ukAWM z_Ti!9Tg2!T>=4KzF{=|tEvw%G2T8%)59F*2 z<=Dh2`<>+EC^0PZD&yI09Rp_p;0^pkVpFkK!5I0W;F;NsZn%t^EHjgggn706n1p^M z`%n2WQ%i+2;t?iZ;~`jJWbR|pbip>5Vj2k;FdTy^^5W4{=aNp&{t#Ze4Sb&To za#Tyl@GNA~Vn7M86}l#0k{;I=SWoor0{T3OwH_`;Qm>r>US<2zs5_+CC4GgCT45*dx>8#UcKJTN*j zFX? z1!eK!0`Y|l+c#KQT;mZ((E6X1whvssQCHw5KU}QWtCtRLqI%JD!_G@vAbh_`ZXTWh z%)GR;yu1Q-u8kcmv=%&<&5^$!BOA3Hy;*B4MV7w@8C|=$bHjQ#@4zojWHZJr>Qm{p zzN^#o%i&*!7QbAm&kXi$?s5}3gwceK7@U;Ug0%L)@Kj?_S^i=PHMoB5{QgqhjHQyv zR7j*NlDgW_dg9Y7x57(5Ez3)f&~HC`w z(vq@#Z*gvFpi;1+Aa>(X(GGH_@8r<6xjKLF=l>QP)zSA_<5nuk>?z3@;mN5BBa>BF z%rb}hU}152eqr+1t40b_J=Ex?xM(gJxiLLayS5NszO%T*X>H70>P@;7lM1EUOkoo1%@5qr~ghU=?s}tF=_P5WUaPPgE8Ky-5Q@5xjA$8 zXhFw(kIIL6oyr$Y9v!NZRjCU0`Sj`GD+fLv>fY)3sDLy^pj29sh?Y8eg7Lx3t;Ry_ z*7beE+tzH^(Y0%RGyAZSL9@0VRbt73lV{I=ULCK_-Th;kJR zF~xxApCGh?#40hQ)5C&Cukf?HpC>91MQ~;gNU%y?k!BU?!HOKr-^h9{$JFi_bH5d3 uT2|B2i=>w`6H@TB3Z7QM(<*pc1y8GBZ56Dog0)q!w))Ght^RLY-Twmg*|hcm literal 35694 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 diff --git a/src/data/rbm.sh b/src/data/rbm.sh new file mode 100755 index 0000000..d36a450 --- /dev/null +++ b/src/data/rbm.sh @@ -0,0 +1 @@ +../../cmake-build-debug/rbm_gen $1 diff --git a/src/koa/etc.c b/src/koa/etc.c index 1fc022e..94b0520 100644 --- a/src/koa/etc.c +++ b/src/koa/etc.c @@ -1,5 +1,17 @@ #include "etc.h" +int color_eq(color_t a, color_t b) { + return color_eqp(&a, &b); +} + +int color_eqp(const color_t* a, const color_t* b) { + return + (a->r == b->r) && + (a->g == b->g) && + (a->b == b->b) && + (a->a == b->a); +} + void mfree(int n, ...) { va_list args; va_start(args, n); diff --git a/src/koa/etc.h b/src/koa/etc.h index 8770dd9..38c3954 100644 --- a/src/koa/etc.h +++ b/src/koa/etc.h @@ -9,6 +9,13 @@ #define __MIN(A, B) ((A) < (B) ? (A) : (B)) #define __MAX(A, B) ((A) > (B) ? (A) : (B)) +typedef struct { + uint8_t r, g, b, a; +} color_t; + +int color_eq(color_t, color_t); +int color_eqp(const color_t*, const color_t*); + void mfree(int n, ...); uint8_t* ltoh(uint8_t*, int); uint8_t* btoh(uint8_t*, int); diff --git a/src/koa/file.c b/src/koa/file.c index a61a1fc..ea59daa 100644 --- a/src/koa/file.c +++ b/src/koa/file.c @@ -137,7 +137,7 @@ int bmp_reload_chunk(bmp_t* bmp, int x, int y, int width, int height) { if(x > data->width || y > data->height) { fclose(fp); - return NULL; + return 0; } if(bmp->pixels != NULL) @@ -152,9 +152,9 @@ int bmp_reload_chunk(bmp_t* bmp, int x, int y, int width, int height) { bmp->width = width; bmp->height = height; - bmp->pixels = malloc(sizeof(pixel_t*) * height); + bmp->pixels = malloc(sizeof(color_t*) * height); for(int i = 0; i < height; ++i) - bmp->pixels[i] = malloc(sizeof(pixel_t) * width); + bmp->pixels[i] = malloc(sizeof(color_t) * width); uint8_t buffer[4]; for(int ay = 0; ay < height; ++ay) { @@ -168,10 +168,11 @@ int bmp_reload_chunk(bmp_t* bmp, int x, int y, int width, int height) { for(int ax = 0; ax < width; ++ax) { fread(buffer, 1, data->bytepp, fp); - pixel_t* px = &bmp->pixels[ay][ax]; + color_t* px = &bmp->pixels[ay][ax]; px->b = buffer[0]; px->g = buffer[1]; px->r = buffer[2]; + px->a = 0xFF; } } diff --git a/src/koa/file.h b/src/koa/file.h index 87886cf..f09b025 100644 --- a/src/koa/file.h +++ b/src/koa/file.h @@ -20,10 +20,6 @@ char* file_read(const char*); // BEGIN BMP LOADING FUNCTIONS -typedef struct { - uint8_t r, g, b; -} pixel_t; - typedef struct { char file[4096]; uint32_t width, height, size, @@ -35,7 +31,7 @@ typedef struct { bmp_meta_t data; uint32_t width, height; - pixel_t** pixels; + color_t** pixels; } bmp_t; bmp_t* bmp_load(const char*); diff --git a/src/koa/sdl.c b/src/koa/sdl.c deleted file mode 100644 index c9801b6..0000000 --- a/src/koa/sdl.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "sdl.h" - -void get_pixel(SDL_Color* out, SDL_Surface* img, int x, int y) { - int bpp = img->format->BytesPerPixel; - uint8_t* ptr = (uint8_t*)img->pixels + y * img->pitch + x * bpp; - Uint32 pixel; - - switch(bpp) { - case 1: - pixel = *ptr; - break; - case 2: - pixel = *(Uint16*)ptr; - break; - case 3: - if(SDL_BYTEORDER == SDL_BIG_ENDIAN) - pixel = ptr[0] << 16 | ptr[1] << 8 | ptr[2]; - else - pixel = ptr[0] | ptr[1] << 8 | ptr[2] << 16; - break; - case 4: - pixel = *(Uint32*)ptr; - break; - default: - pixel = 0; - } - - SDL_GetRGBA(pixel, img->format, &out->r, &out->g, &out->b, &out->a); -} diff --git a/src/koa/sdl.h b/src/koa/sdl.h deleted file mode 100644 index a6b5666..0000000 --- a/src/koa/sdl.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef KOA_SDL_H -#define KOA_SDL_H - -#include -#include - -typedef struct { - uint8_t r, g, b, a; -} pixel_t; - -void get_pixel(SDL_Color*, SDL_Surface*, int x, int y); - -#endif diff --git a/src/main.c b/src/main.c index e6b63bb..3afde3b 100644 --- a/src/main.c +++ b/src/main.c @@ -10,6 +10,7 @@ #include "koa/file.h" #include "okuu/mesh.h" #include "okuu/shader.h" +#include "okuu/terrain.h" #define WINDOW_WIDTH 640 #define WINDOW_HEIGHT 480 @@ -21,6 +22,7 @@ struct { int mode, running; mesh_t* monkey; + terrain_t* map; } _g; struct { @@ -41,9 +43,18 @@ int main(int argc, char* argv[]) { if(init() < 0) return -1; - _g.monkey = mesh_load("data/cube.rbm"); + _g.monkey = mesh_load("data/player.rbm"); + + _g.map = terrain_load( + "data/map-heights.bmp", + "data/map-colors.bmp", + 10, 10 + ); _s_def.shader = shader_create("default"); + shader_layout(_s_def.shader, 4, + "vertex", "texuv", "normal", "color" + ); shader_source(_s_def.shader, 2, "shaders/test.vert", GL_VERTEX_SHADER, "shaders/test.frag", GL_FRAGMENT_SHADER @@ -62,19 +73,22 @@ int main(int argc, char* argv[]) { } void run() { - static mat4 model, view, projection; + static mat4 model, map, view, projection; static float rot_up = 45, rot_around = 45; + static float x = 0, y = 0; static int init = 1; if(init) { - glm_rotate_make(model, glm_rad(90), (vec3){ 0.f, -1.f, 0.f }); + //glm_rotate_make(model, glm_rad(90), (vec3){ 0.f, -1.f, 0.f }); + glm_mat4_identity(model); + glm_mat4_identity(map); glm_mat4_identity(view); glm_perspective( - glm_rad(45), + glm_rad(55), (float)WINDOW_WIDTH/(float)WINDOW_HEIGHT, - 0.1f, 10.f, + 0.1f, 100.f, projection ); @@ -106,9 +120,16 @@ void run() { shader_start(_s_def.shader); { glUniformMatrix4fv(_ATTR(DEF_VIEW), 1, GL_FALSE, (float*)view); - mesh_bind(_g.monkey); + /*mesh_bind(_g.monkey); mesh_render(_g.monkey); - mesh_unbind(); + mesh_unbind();*/ + glm_translate_make(model, (vec3){-x, -(_g.map->heights[(int)y][(int)x] + 2.f), -y}); + glm_mat4_mul(model, map, model); + glUniformMatrix4fv(_ATTR(DEF_MODEL), 1, GL_FALSE, (float*)model); + + glBindVertexArray(_g.map->vao); + glDrawArrays(GL_TRIANGLES, 0, _g.map->tri_cnt * 3); + glBindVertexArray(0); } shader_stop(); SDL_GL_SwapWindow(_g.window); @@ -137,6 +158,21 @@ void run() { else if(_g.keys[SDL_SCANCODE_LEFT]) rot_around += 2.f; + if(_g.keys[SDL_SCANCODE_W]) + x += .25; + else if(_g.keys[SDL_SCANCODE_S]) + x -= .25; + + if(_g.keys[SDL_SCANCODE_D]) + y += .25; + else if(_g.keys[SDL_SCANCODE_A]) + y -= .25; + + if(_g.keys[SDL_SCANCODE_SPACE]) { + terrain_move(_g.map, x, y); + glm_translate_make(map, (vec3){__MAX(0, x - CHUNK_SIZE / 2), 0, __MAX(0, y - CHUNK_SIZE / 2)}); + } + SDL_Event ev; while(SDL_PollEvent(&ev)) { if(ev.type == SDL_QUIT) diff --git a/src/okuu/mesh.c b/src/okuu/mesh.c index cd8f929..67cce46 100644 --- a/src/okuu/mesh.c +++ b/src/okuu/mesh.c @@ -35,8 +35,10 @@ int _populate_faces for(int i = 0; i < 3; ++i) { for(int j = 0; j < 3; ++j) { - if((flags & (1 << j)) == 0) + if((flags & (1 << j)) == 0) { + data[at].data[i][j] = 0; continue; + } chk = fread(buffer, 1, length, fp); if(chk != length) @@ -127,7 +129,7 @@ mesh_t* mesh_load(const char* file) { } memcpy( - &verts_asm[i*3*3 + 3*j], + &verts_asm[i * 3 *3 + 3 * j], verts[faces[i].data[j][0] - 1].data, 3 * sizeof(float) ); diff --git a/src/okuu/shader.c b/src/okuu/shader.c index fc40c1c..a5d1969 100644 --- a/src/okuu/shader.c +++ b/src/okuu/shader.c @@ -5,6 +5,8 @@ shader_t* _active = NULL; shader_t* shader_create(const char* name) { shader_t* shader = malloc(sizeof(shader_t)); shader->name = name; + shader->layout = NULL; + shader->layout_cnt = 0; shader->attribs = NULL; shader->program = glCreateProgram(); shader->loaded = 0; @@ -12,6 +14,23 @@ shader_t* shader_create(const char* name) { return shader; } +int shader_layout(shader_t* shader, int count, ...) { + if(shader->loaded) + return -1; + if(shader->layout != NULL) + free(shader->layout); + shader->layout = malloc(sizeof(layout_name_t) * count); + shader->layout_cnt = count; + + va_list args; + va_start(args, count); + for(int i = 0; i < count; ++i) + strcpy(shader->layout[i], va_arg(args, const char*)); + va_end(args); + + return 0; +} + int shader_source(shader_t* shader, int files, ...) { if(shader->loaded) return -1; @@ -66,6 +85,12 @@ int shader_source(shader_t* shader, int files, ...) { if(failed) return -1; + if(shader->layout != NULL) { + for(int i = 0; i < shader->layout_cnt; ++i) + glBindAttribLocation(shader->program, i, shader->layout[i]); + free(shader->layout); + } + glLinkProgram(shader->program); glGetProgramiv(shader->program, GL_LINK_STATUS, &err); if(err == GL_FALSE) { diff --git a/src/okuu/shader.h b/src/okuu/shader.h index 94c996c..75add8c 100644 --- a/src/okuu/shader.h +++ b/src/okuu/shader.h @@ -12,8 +12,13 @@ #define _SHADER shader_active() #define _ATTR(I) shader_attr(_SHADER, I) +typedef char layout_name_t[256]; + typedef struct { const char* name; + int layout_cnt; + layout_name_t* layout; + GLuint program; GLint* attribs; int loaded; @@ -21,6 +26,7 @@ typedef struct { shader_t* shader_create(const char*); +int shader_layout(shader_t*, int, ...); int shader_source(shader_t*, int, ...); int shader_attribs(shader_t*, int, ...); GLint shader_attr(const shader_t*, int); diff --git a/src/okuu/terrain.c b/src/okuu/terrain.c index 9b7b519..49788d8 100644 --- a/src/okuu/terrain.c +++ b/src/okuu/terrain.c @@ -1,7 +1,18 @@ #include "terrain.h" #define _HGT_AT(A, X, Y) (A->bmps[0]->pixels[Y][X].r / 10.f) -#define _COL_AT(A, X, Y, C) (A->bmps[1]->pixels[Y][X].C / 255.f) +#define _RWCOL_AT(A, X, Y) (A->bmps[1]->pixels[Y][X]) +#define _RCOL_AT(A, X, Y, C) (_RWCOL_AT(A, X, Y).C) +#define _COL_AT(A, X, Y, C) (_RCOL_AT(A, X, Y, C) / 255.f) +#define _COL_EQ(A, X1, Y1, X2, Y2) \ + (color_eqp(&A->bmps[1]->pixels[Y1][X1], &A->bmps[1]->pixels[Y2][X2])) + +float _avg_hgt(terrain_t* map, int x, int y) { + return + (_HGT_AT(map, x, y) + _HGT_AT(map, x + 1, y) + + _HGT_AT(map, x, y + 1) + _HGT_AT(map, x + 1, y + 1)) + / 4.f; +} terrain_t* terrain_load (const char* heights, const char* colors, @@ -50,96 +61,289 @@ void terrain_move(terrain_t* terrain, int center_x, int center_y) { terrain->center_x = center_x; terrain->center_y = center_y; - const int data_length = 6 * 3 * (CHUNK_SIZE - 1) * (CHUNK_SIZE - 1); + const int data_length = 12 * 3 * (CHUNK_SIZE - 1) * (CHUNK_SIZE - 1); + terrain->tri_cnt = data_length / 3; float data[data_length]; - vec3 dir1, dir2, norm; + vec3 dir1, dir2, norm1, norm2, norm3; for(int i = 0; i < TERR_BUFFS; ++i) { + int cnt = i == 1 ? 2 : 3; for(int y = 0; y < CHUNK_SIZE - 1; ++y) { for(int x = 0; x < CHUNK_SIZE - 1; ++x) { - int at = (y * CHUNK_SIZE * 6 * 3) + (x * 6 * 3); + int at = (y * (CHUNK_SIZE - 1) * 12 * cnt) + (x * 12 * cnt); switch(i) { case 0: data[at] = x; - data[at + 1] = _HGT_AT(terrain, x, y); + data[at + 1] = terrain->heights[y][x] = + _HGT_AT(terrain, x, y); data[at + 2] = y; - data[at + 3] = x; - data[at + 4] = _HGT_AT(terrain, x, y + 1); - data[at + 5] = y + 1; + data[at + 3] = x + 0.5f; + data[at + 4] = _avg_hgt(terrain, x, y); + data[at + 5] = y + 0.5f; data[at + 6] = x + 1; data[at + 7] = _HGT_AT(terrain, x + 1, y); data[at + 8] = y; + data[at + 9] = x + 1; - data[at + 10] = _HGT_AT(terrain, x + 1, y + 1); - data[at + 11] = y + 1; + data[at + 10] = _HGT_AT(terrain, x + 1, y); + data[at + 11] = y; - data[at + 12] = x + 1; - data[at + 13] = _HGT_AT(terrain, x + 1, y); - data[at + 14] = y; + data[at + 12] = x + 0.5f; + data[at + 13] = _avg_hgt(terrain, x, y); + data[at + 14] = y + 0.5f; - data[at + 15] = x; - data[at + 16] = _HGT_AT(terrain, x, y + 1); + data[at + 15] = x + 1; + data[at + 16] = _HGT_AT(terrain, x + 1, y + 1); data[at + 17] = y + 1; + + + data[at + 18] = x; + data[at + 19] = _HGT_AT(terrain, x, y + 1); + data[at + 20] = y + 1; + + data[at + 21] = x + 1; + data[at + 22] = _HGT_AT(terrain, x + 1, y + 1); + data[at + 23] = y + 1; + + data[at + 24] = x + 0.5f; + data[at + 25] = _avg_hgt(terrain, x, y); + data[at + 26] = y + 0.5f; + + + data[at + 27] = x; + data[at + 28] = _HGT_AT(terrain, x, y); + data[at + 29] = y; + + data[at + 30] = x; + data[at + 31] = _HGT_AT(terrain, x, y + 1); + data[at + 32] = y + 1; + + data[at + 33] = x + 0.5f; + data[at + 34] = _avg_hgt(terrain, x, y); + data[at + 35] = y + 0.5f; break; case 1: - glm_vec3_sub( - (vec3){ x + 1, _HGT_AT(terrain, x + 1, y), y }, - (vec3){ x, _HGT_AT(terrain, x, y), y }, - dir1 - ); - glm_vec3_sub( - (vec3){ x, _HGT_AT(terrain, x, y + 1), y + 1 }, - (vec3){ x, _HGT_AT(terrain, x, y), y }, - dir2 - ); - glm_vec3_cross(dir1, dir2, norm); - memcpy(&data[at], norm, 3 * sizeof(float)); - memcpy(&data[at + 3], norm, 3 * sizeof(float)); - memcpy(&data[at + 6], norm, 3 * sizeof(float)); + data[at] = 0.f; + data[at + 1] = 0.f; - glm_vec3_sub( - (vec3){ x + 1, _HGT_AT(terrain, x + 1, y + 1), y + 1 }, - (vec3){ x + 1, _HGT_AT(terrain, x + 1, y), y }, - dir1 - ); - glm_vec3_sub( - (vec3){ x + 1, _HGT_AT(terrain, x + 1, y + 1), y + 1 }, - (vec3){ x, _HGT_AT(terrain, x, y + 1), y + 1 }, - dir2 - ); - glm_vec3_cross(dir1, dir2, norm); - memcpy(&data[at + 9], norm, 3 * sizeof(float)); - memcpy(&data[at + 12], norm, 3 * sizeof(float)); - memcpy(&data[at + 15], norm, 3 * sizeof(float)); + data[at + 2] = .5f; + data[at + 3] = .5f; + + data[at + 4] = 1.f; + data[at + 5] = 0.f; + + + data[at + 6] = 1.f; + data[at + 7] = 0.f; + + data[at + 8] = .5f; + data[at + 9] = .5f; + + data[at + 10] = 1.f; + data[at + 11] = 1.f; + + + data[at + 12] = 0.f; + data[at + 13] = 1.f; + + data[at + 14] = 1.f; + data[at + 15] = 1.f; + + data[at + 16] = .5f; + data[at + 17] = .5f; + + + data[at + 18] = 0.f; + data[at + 19] = 0.f; + + data[at + 20] = 0.f; + data[at + 21] = 1.f; + + data[at + 22] = .5f; + data[at + 23] = .5f; break; case 2: - data[at] = _COL_AT(terrain, x, y, r); - data[at + 1] = _COL_AT(terrain, x, y, g); - data[at + 2] = _COL_AT(terrain, x, y, b); + glm_vec3_sub( + (vec3){ x, _HGT_AT(terrain, x, y), y }, + (vec3){ x + 0.5f, _avg_hgt(terrain, x, y), y + 0.5f }, + dir1 + ); + glm_vec3_sub( + (vec3){ x, _HGT_AT(terrain, x, y), y }, + (vec3){ x + 1, _HGT_AT(terrain, x + 1, y), y }, + dir2 + ); + glm_vec3_cross(dir1, dir2, norm1); + glm_vec3_normalize(norm1); + memcpy(&data[at], norm1, 3 * sizeof(float)); + memcpy(&data[at + 3], norm1, 3 * sizeof(float)); + memcpy(&data[at + 6], norm1, 3 * sizeof(float)); - data[at + 3] = _COL_AT(terrain, x + 1, y, r); - data[at + 4] = _COL_AT(terrain, x + 1, y, g); - data[at + 5] = _COL_AT(terrain, x + 1, y, b); + glm_vec3_sub( + (vec3){ x + 1, _HGT_AT(terrain, x + 1, y), y }, + (vec3){ x + 0.5f, _avg_hgt(terrain, x, y), y + 0.5f }, + dir1 + ); + glm_vec3_sub( + (vec3){ x + 1, _HGT_AT(terrain, x + 1, y), y }, + (vec3){ x + 1, _HGT_AT(terrain, x + 1, y + 1), y + 1 }, + dir2 + ); + glm_vec3_cross(dir1, dir2, norm1); + glm_vec3_normalize(norm1); + memcpy(&data[at + 9], norm1, 3 * sizeof(float)); + memcpy(&data[at + 12], norm1, 3 * sizeof(float)); + memcpy(&data[at + 15], norm1, 3 * sizeof(float)); - data[at + 6] = _COL_AT(terrain, x, y + 1, r); - data[at + 7] = _COL_AT(terrain, x, y + 1, g); - data[at + 8] = _COL_AT(terrain, x, y + 1, b); + glm_vec3_sub( + (vec3){ x + 1, _HGT_AT(terrain, x + 1, y + 1), y + 1 }, + (vec3){ x + 0.5f, _avg_hgt(terrain, x, y), y + 0.5f }, + dir1 + ); + glm_vec3_sub( + (vec3){ x + 1, _HGT_AT(terrain, x + 1, y + 1), y + 1 }, + (vec3){ x, _HGT_AT(terrain, x, y + 1), y + 1 }, + dir2 + ); + glm_vec3_cross(dir1, dir2, norm1); + glm_vec3_normalize(norm1); + memcpy(&data[at + 18], norm1, 3 * sizeof(float)); + memcpy(&data[at + 21], norm1, 3 * sizeof(float)); + memcpy(&data[at + 24], norm1, 3 * sizeof(float)); - data[at + 9] = _COL_AT(terrain, x + 1, y + 1, r); - data[at + 10] = _COL_AT(terrain, x + 1, y + 1, g); - data[at + 11] = _COL_AT(terrain, x + 1, y + 1, b); + glm_vec3_sub( + (vec3){ x, _HGT_AT(terrain, x, y), y }, + (vec3){ x + 0.5f, _avg_hgt(terrain, x, y), y + 0.5f }, + dir1 + ); + glm_vec3_sub( + (vec3){ x, _HGT_AT(terrain, x, y), y }, + (vec3){ x, _HGT_AT(terrain, x, y + 1), y + 1 }, + dir2 + ); + glm_vec3_cross(dir2, dir1, norm1); + glm_vec3_normalize(norm1); + memcpy(&data[at + 27], norm1, 3 * sizeof(float)); + memcpy(&data[at + 30], norm1, 3 * sizeof(float)); + memcpy(&data[at + 33], norm1, 3 * sizeof(float)); - data[at + 12] = _COL_AT(terrain, x + 1, y, r); - data[at + 13] = _COL_AT(terrain, x + 1, y, g); - data[at + 14] = _COL_AT(terrain, x + 1, y, b); + glm_vec3_add( + data + at + 3, + data + at + 12, + data + at + 3 + ); + glm_vec3_add( + data + at + 3, + data + at + 33, + data + at + 3 + ); + glm_vec3_add( + data + at + 3, + data + at + 24, + data + at + 3 + ); + glm_vec3_normalize(data + at + 3); + memcpy(data + at + 12, data + at + 3, 3 * sizeof(float)); + memcpy(data + at + 24, data + at + 3, 3 * sizeof(float)); + memcpy(data + at + 33, data + at + 3, 3 * sizeof(float)); + + //_norm_smooth(data, x, y); + break; + case 3: + for(int j = 0; j < 12; ++j) { + data[at + j * 3] = _COL_AT(terrain, x, y, r); + data[at + j * 3 + 1] = _COL_AT(terrain, x, y, g); + data[at + j * 3 + 2] = _COL_AT(terrain, x, y, b); + } + + const color_t path_colors[] = { + {0x60, 0x60, 0x60, 0xFF}, + {0x9C, 0x00, 0x0E, 0xFF} + }; + + int found = 0; + for(int j = 0; j < sizeof(path_colors) / sizeof(color_t); ++j) { + if(color_eqp(&path_colors[j], &_RWCOL_AT(terrain, x, y))) { + found = 1; + break; + } + } + + if(!found) + continue; + + if(x == 0 || y == 0) + continue; + + int neighbors = + _COL_EQ(terrain, x, y, x, y - 1) + + _COL_EQ(terrain, x, y, x + 1, y) + + _COL_EQ(terrain, x, y, x, y + 1) + + _COL_EQ(terrain, x, y, x - 1, y); + + if(neighbors > 2) + continue; + + const int coords[][2] = { + {0, -1}, {1, 0}, + {0, 1}, {-1, 0} + }; + + for(int j = 0; j < 4; ++j) { + if(!_COL_EQ(terrain, + x, y, + x + coords[j][0], + y + coords[j][1])) + { + data[at + j * 9] = _COL_AT(terrain, + x + coords[j][0], + y + coords[j][1], r + ); + + data[at + j * 9 + 1] = _COL_AT(terrain, + x + coords[j][0], + y + coords[j][1], g + ); + + data[at + j * 9 + 2] = _COL_AT(terrain, + x + coords[j][0], + y + coords[j][1], b + ); + + memcpy(data + at + j * 9 + 3, data + at + j * 9, 3 * sizeof(float)); + memcpy(data + at + j * 9 + 6, data + at + j * 9, 3 * sizeof(float)); + } + } + + /* + for(int j = 0; j < 4; ++j) { + if(_COL_EQ(terrain, + x + coords[j][0], + y + coords[j][1], + x + coords[j][2], + y + coords[j][3])) + { + for(int k = 0; k < 6; ++k) { + data[at + ((k * 3 + j * 9) % 36)] = + _COL_AT(terrain, + x + coords[j][0], + y + coords[j][1], r); + data[at + ((k * 3 + j * 9 + 1) % 36)] = + _COL_AT(terrain, + x + coords[j][0], + y + coords[j][1], g); + data[at + ((k * 3 + j * 9 + 2) % 36)] = + _COL_AT(terrain, + x + coords[j][0], + y + coords[j][1], b); + } + } + }*/ - data[at + 15] = _COL_AT(terrain, x, y + 1, r); - data[at + 16] = _COL_AT(terrain, x, y + 1, g); - data[at + 17] = _COL_AT(terrain, x, y + 1, b); break; } } @@ -156,8 +360,8 @@ void terrain_move(terrain_t* terrain, int center_x, int center_y) { glBindVertexArray(terrain->vao); { glEnableVertexAttribArray(i); - glVertexAttribPointer(i, 3, GL_FLOAT, - i == 1 ? GL_TRUE : GL_FALSE, 0, (void*)0); + glVertexAttribPointer(i, cnt, GL_FLOAT, + i == 2 ? GL_TRUE : GL_FALSE, 0, (void*)0); } glBindVertexArray(0); } else { glBufferSubData( diff --git a/src/okuu/terrain.h b/src/okuu/terrain.h index 5acab76..2e04bed 100644 --- a/src/okuu/terrain.h +++ b/src/okuu/terrain.h @@ -14,12 +14,12 @@ #include "koa/file.h" -#define CHUNK_SIZE 32 -#define TERR_BUFFS 3 +#define CHUNK_SIZE 100 +#define TERR_BUFFS 4 typedef struct { bmp_t* bmps[2]; - int center_x, center_y; + int center_x, center_y, tri_cnt; float heights[CHUNK_SIZE][CHUNK_SIZE]; GLuint buffers[TERR_BUFFS], vao; } terrain_t; diff --git a/src/shaders/test.frag b/src/shaders/test.frag index 84e6b8d..1033257 100644 --- a/src/shaders/test.frag +++ b/src/shaders/test.frag @@ -1,20 +1,48 @@ #version 100 -precision mediump float; -varying vec3 f_normal; +precision lowp float; -const vec3 light_color = vec3(0.8, 0.8, 0.8); -const vec3 light = normalize(vec3(-1.0, -1.0, 1.0)); +varying vec3 f_normal; +varying vec3 f_color; + +const vec3 light_color = vec3(1.0, 1.0, 1.0); +const vec3 light_dir = normalize(vec3(-1.0, 2.0, -1.0)); +const float ambient_strength = 0.1; + +void main() { + vec3 ambient = light_color * ambient_strength; + vec3 norm = normalize(f_normal); + + float diff = max(0.0, dot(norm, light_dir)); + vec3 diffuse = diff * light_color; + + vec3 color = (ambient + diffuse) * f_color; + gl_FragColor = vec4(color, 1.0); + //gl_FragColor = vec4(f_normal, 1.0); +} + +/*varying vec3 f_normal; +//varying vec3 f_pos; + +const vec3 light_dir = normalize(vec3(1, 1, -1)); +const vec3 object_color = vec3(.4157, .051, .6784); +const vec3 light_pos = vec3(3, 3, 3); +//const vec3 light = normalize(vec3(1.0, 1.0, 1.0)); void main() { //gl_FragColor = vec4(coord.z, coord.z, coord.z, 1.0); //float xval = gl_FragCoord.x / 640.0; //float yval = gl_FragCoord.y / 480.0; - vec3 ambient_color = vec3(0.2, 0.1, 0.1); - float light_intensity = dot(light, normalize(f_normal)); - //vec3 color = f_normal; - vec3 color = ambient_color + light_color * light_intensity; - //vec3 color = vec3(light_intensity, light_intensity, light_intensity); + vec3 ambient = light_color * ambient_strength; + vec3 norm = normalize(f_normal); + //vec3 light_dir = normalize(light_pos - f_pos); + float diff = max(0.0, dot(norm, light_dir)); + vec3 diffuse = diff * light_color; + //vec3 color = (f_normal + vec3(1.0)) / vec3(2.0); + //vec3 color = f_normal; + //vec3 color = vec3(f_normal, f_normal, f_normal); + + vec3 color = (ambient + diffuse) * object_color; gl_FragColor = vec4(color, 1.0); -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/src/shaders/test.vert b/src/shaders/test.vert index f49b898..b44175a 100644 --- a/src/shaders/test.vert +++ b/src/shaders/test.vert @@ -4,15 +4,28 @@ precision highp float; attribute vec3 vertex; attribute vec2 texuv; attribute vec3 normal; +attribute vec3 color; + +/*layout(location = 0) in vec3 vertex; +layout(location = 1) in vec2 texuv; +layout(location = 2) in vec3 normal;*/ uniform mat4 model; uniform mat4 view; uniform mat4 projection; varying vec3 f_normal; +varying vec3 f_color; void main() { - f_normal = normal; + //f_normal = normal; + //f_pos = vertex; + /*vec3 norm = normalize(normal); + float intensity = max(dot(norm, light_dir), 0.0); + f_color = intensity * vec3(.4157, .051, .6784);*/ + f_normal = normalize(normal); + f_color = color; + gl_Position = projection * view * model * vec4(vertex, 1.0);