From 922a02aa1cf3f2ac05434a17e00fc3e71d3d1812 Mon Sep 17 00:00:00 2001 From: Adog64 Date: Sat, 13 Jan 2024 22:52:39 -0500 Subject: [PATCH] Started simplifying main.c by modularizing different subsystems --- Makefile | 2 +- PlanetMiner | Bin 23880 -> 29128 bytes bin/initialization.o | Bin 0 -> 3664 bytes bin/main.o | Bin 9432 -> 6480 bytes bin/renderer.o | Bin 0 -> 1920 bytes bin/shaders.o | Bin 0 -> 6448 bytes bin/worldgen.o | Bin 4576 -> 4704 bytes src/initialization.c | 48 +++++++++++++++++++ src/initialization.h | 11 +++++ src/main.c | 111 +++++++++---------------------------------- src/renderer.c | 36 ++++++++++++++ src/renderer.h | 2 + src/shader.vert | 9 ++-- src/shaders.c | 61 ++++++++++++++++++++++++ src/shaders.h | 26 +++++----- src/worldgen.c | 8 ++++ src/worldgen.h | 2 + 17 files changed, 209 insertions(+), 107 deletions(-) create mode 100644 bin/initialization.o create mode 100644 bin/renderer.o create mode 100644 bin/shaders.o create mode 100644 src/initialization.c create mode 100644 src/initialization.h create mode 100644 src/renderer.c create mode 100644 src/renderer.h diff --git a/Makefile b/Makefile index 3bb3f39..21acdc7 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ LDLIBS = # add include paths (start with -I) INC = -# finds all your objects that corrispond to your .cpp files, system agnostic version +# finds all your objects that corrispond to your .c files, system agnostic version OBJECTS := $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(wildcard $(SRC_DIR)/*.c)) .PHONY: all diff --git a/PlanetMiner b/PlanetMiner index 51d77949f05152bf754a59b91ad329c6b3b4872a..9c460c56779d4e68df3b5ac5085df2be1d1116f2 100755 GIT binary patch literal 29128 zcmeHw3v^V~z4yr^k;o%w5TdDKIi-Ug5XOWc^3ZaUOp=KP4TR?fOlFb^Nu6ZU$pnI> zIvVsk#@sKTx7X5EEA4HS>-8>Kt=CJbO@@aA6f3?FwWd~ZMp2_dL`$9f`|ro(%wfj5 z?zh&rzO}yWtaJYR|J(n^ew}^x*=Nqqtz}i^mW&KV28;4tg}5W%(HX?gigK`-u>zZ~ zOi*-1Q>H5C0m;IlvlOB{Ch1WNPmnZ6$Yp|(UOq(_)syHH#wm)VGKWM-ZzSj<%IWHS z&Pu9SIZt}o6xHa2py`ZA`toGXN@~<&{)D)qi-@2HMS&zW>QUY7TEgw_TF><)b&7K5 zNOpN{i193)F^ z8p+wCD3h`>3&-x*vi)L3xqVE|x3b3BhQ`l%)H*hQD9^|E`EH1}(->f}>PmPSA236*%4umrZ`;pD#Q6 z>c9T_)}jjgT_;OhUaQS|`mX-K2NaHemsyKr0+ura+&|F~{? z>462GbWhnk;q%Z-7kv7LJvw}$kL=Xk{=N13Azye$exsiKdFX++$3=#3+SR+@O3X3orWgjrGck{tYYK*5Cf{%IhkRFTE>t{^z03^2&Rkg^kCrF8%T+0}oJj zrwk7w<$@F`m!ct3;ZLWLx22J%x=Ll|_B1&45ex@%xiB_{VAL;UeG@m2W7WZXKF@Od|TIh2wP|ome(j5j`dFh({+jfp?>Q z$<7&*ok>FeE{{&)3Hb+w{E$Z{IDsD)@|s5{IDxMdxZ=?XPT+oFXSGKsIDtnHr~EXT z@^fP*$3rH3lfZWf9A;U#T9(%&{~O_VyGLho^8WlPIP#lslFvgs5w+Q=fCi%NE zx%^HO{+_U(W3p2v?6^$$OCp~k6Fx)8TTS@+Lf&ffyHDVn2_F=8bdw#2kgqo3*_pgt z+f8;Z5%Swi@;+g|*Mz?>aZY)+!r(jhkvVx!X!Q8XLWVcE*t<4-??hUjwx5Ar2s;0@`;cF=M`P;peTc3B+iq_^vf1stPabq&D z#2pMYcg{_~POr}!^wu=F8@vG_>1=LydwkxN-T<;x9E7~5I1q4e7Re|G7jKrPfm8?l z8v^c@1jNnC8sb@UdV}uzrX*KJAJu*oHIWG}R^#so)Kfvdn^^g|p;CWKTeB}Y)5xdU zIQQ;!2i?h4Feg#?L{TbR8~s)O4asu6s?Mpwk-95EbBhuf>W6oQq+*K3C~Qo2P}rQz z&yndB-d1zfQ7ajIwF^y1ra%*opKO1ww9m6B+Dyps7E8ufw0o0*s^-?4l9963ztdNQ zcybL>&G8Z@$`KTquJYHrgU$X{*63xOZQek03oZ$_FS#tdai}Rb_;?-=aR%I*SXZSB ztJLRp2TJ`ue?T%yn}1WI67X(=6kMNsJ|?kfJRVn@6#F9;>LTEGey>L{-ZQa+&>7H&whl<`xfC&0z}Xa z@+A@ktv29g2E5LI)AOPXa=u0OFP9)_n?Zh#0q->6(+qgXfYY zuQuQl40xRZ&o$sp23$4ZZ3djiVi`IO_(TbUh77oIo!~A5KFJ{8Yrtu}PKIp;TrS~K z+I9nep%ez)VZbjk;5!YtSh{AZyA1d@4Dt~Jj^({XIB38xNuXHAH{fzDosy3l@NXLA z2MzdC10FTtngJg&;NLRfqtVeC7_EWP8W^pC(Ha=7f&X`FU|9X;7p|_8Ij-*PLwN3T z-4O{|;zwLv`*ZfOOvkT$8gP92VVu>eI%32(QCe&;jxc>M@idi<9bx=#;w{8S82=mM zY3dr=$@oWzrzvY}JL7*zJWW+&y^Q}U@iaw^g&2P?@ibkIwK4u~;%TZHt7H7_#M2Zt zR?YaEiKnS)OlN$6c$$*N3K;)A;%O=x(-`j|o~EENE93uxc$#{~6vi(jo~E3!p)UbU zzm|BKYQ_c`UqU=hF=Iy3 z>KF?#{sQ7@${1^7{8-{?su-(dyoGq0BF3s2{{@iZlj6)^ri;%O=v z(-{9Y@wAi>voih|@!up~0bkRv)a#1twv$6ZqW^?;arFdk`Tf-3@w|=j-Mz(@AJ4m5 zSCszmqne|~{uYn-9n*EC|2>?ducK-DzCbLzFFX*>8xM^}^`nTZXSuB){FXXnt8FJt zq5JKH&%Q4qIKZJFoSwP3QT0E{(n&4?Idz85Rsezhh~NF$kGTL(*lIh%1h(1+L0#dk zwxgi1a6e0cQk3wFC4FQ>XQoL~ow3eVO;BC*F?0i0&lcO1K8*@J;IwHFP(baN+3V4_ zQ2hS$i&3f-C}fP@@eHfhJUeo(+FxrdQ$P9uWjjQX*N4>`j|{78jtx82HGApwG@afb zRwu5rjaOG)`WICBaIw1P;Bc9`=Cxwg{ydJ4)m2wMjRdD^N1FX8={rug-c9&53gxnlaXFSQ8olL$BWc4$! zd%tZPgwPZ20il5C{X9mQTm2FEM;RYltlAI2*?!eNeGOcwtFq^iCw2A9sI=MhC=P|g z>I~68S53Hp#O$-LBQoPxqPITEIwM?fwQYxCMDDTuibsBA+kr?tZ{anBTl1ztv2O}G z7ge8i!bRjlwPrtqOE-D~7ZJ(yf$6g|8P)zY+BkYxr2L9fii|10K?+@ETHnH{Hl_bw)N4HNWvua(6&@-pj1(R!jPE`V z<5yoM%lfKY$ z#^dT87vc;@mpU-6G9SM~9zwWi_E6ueV%N|fuzyDPhYkDlbUopSA$|zQ$2dO6@#okJ zWN)gDdZ)@oSy8zMQMuu_;(0qkjiaj$KKeS!=(=q`4ZnqvwfpF*hoOBiejI*O`|}%F)N7s2sI&H4G_bo9Y$mb)PAs)U|9QmT&sZ%}>CYjy z2W&q$bbj>w-45KI`u0LP+JFRCIMWp#K>es&AAo`Ac3=mxm$JO_1LZ_dq-Dz7+C2Usj~8b#+fD#JYQI zJbX~S@4h&Zz6j|^z5vP54`2>g(rGkuv=E|eV?P6;PE~e)KOx`5<=;j=qkll^+Sn#0 z6M}?-Civ79{*tPd^-h`_#`78>+g&8af*Ld}gXl=} z^t!@l&>4%vPv3D!-8z6uz-2UhF{U$x@j|*%-+BKAR$kTqX0bZ?4DOo8a8>T3+BtA& z5H}rH*PcvuQk8Xl*T4lBKAqOd#MxMM7DcaSQKxgk^J-Tk929p?4m*3YmJOGv)~q|L z!h6el^bBGq-`Ta-QdK{I`zkUq{=RE_Cf`9tRwo}TQ726aIeUsTD!Q|7gS{$iPDRfY zeYhN2KVK3)TGq3cnV9nP;;x8=;3;?FD*VLRQ*qvs`iMFi_9x8^Az|XWP!0@P$PhCD z$8!@VpqRx?0KWQ8j23@{iScFXs0(Nj%U3UQ1X{dS{{0lU24Z+34EukD5 z$ z!$1PBn2aEbvF`=d@sfIX6Xt*F9UeNbqPB{}{D|{$W}iAWM3qOEZ1KwC6~)WZWropP zwCGQ8>AAvhxx!^fqCJTB7j_d+b~K*%bG#DhF92H{ekz{VOWc#inDLbzBwNMd{n4|- zxO*IO^{hC;I=?gg5ynNxu}B3XNIKYe8%!`{$y{6|TgiUUio*<91f;v;@ExabnblLC z;R^qy@CD$mZLY3}>gpOCa?RN93jaBt*G0C%??$`f&=r28|5fB8dW-aaRCs?ko;Qbi zN8}JJ8@vN~t|-YnkUs!9$NRhIde0W#CkXGS$h!h2o_9CgIKvGBfh`~=+{N)RRb z9$c_&+>T-s@Vv1O2#6%A;Br(!W%xwl3uumWYT#osgc=Bc5|3AfPr15(cqIBa#1T0f zJ%tG60_MH}IcJ#VA(utbByZxKn=_08zl4aZ$2%B4y0&;-@%rK$*BeLp#@-b*;TQSy z9M2m^UNL&8PYj0#*1E#c^|-B!3>XIae`E5mlLN?y|CCC+w+6|E=h~u2v_ef=8+&B6UG5>et%!lu< zD(}gHLW#zlMIvx&W(p^aE3VBgjKM?-uX~I(D*hq zqPZl8*@+U(B0t^NOb~YFb2}db?Wa;j-}#Ww8&(uX!k@Cc`!67Z^5>&X(R-ss5V+%m zV4LX7;kOED;{3s|ddqhJ)#j-7Q>y*2df@bN+$Rpx9YO;aUPKhf>Zft%IHWqB zz1b3+kI8gbB-7P3fJe3)X`+3M9$45d{V+V%o>eE^aB4v`@F1!pf9-nQPPQVOib6^Q zwAzEb4U8YCI7`t5QT6tAjEzFpFkJMm(A6hSBcr%K-SSk;usZXPn7LrNVjI+u@9d*k zxruK00EM?tpdV{sz#CR)MO1tCUZkiqs%!;FInCl(Ho(6Zunzbm#Cs-()EQ2j6-hh6 z-W0jIXZZydQmlr=nO|P^Xa9^0Pt>gx ze~`yDivKH*7f}3R9@i=U?>t^j@yB?)j^e-N@ivP87mJ5@HvQSVINQr|?a%%lXSWM> zH)nSWmetq9P(-j#^3)@O{R3wQ!Qvr?8U<}_Y`>cRd`iP09$k8pJ!EBHiN!Z|3F1K*{w8&qm!UHuIeetP#@ddHJGvBGqvK&o*OJLM)#qu#X2UgtbMRJ8b)hiv<60N zV6+BCYhbhnMr&ZS21aXOvP?gEonr{R*hBoXFdzH=?(HXq9elf?5iS;zE|*Xa%h!}+Gc-;<_>tZ zj`rr(4Vt@EtHd`mKCPm9#VoB2A3U^swN`)7s|B0fL7cpsnKU4+9v{u%!wP)Z1ADdp{gOT5euYi;#E31{Zfd6~mdiG^T8GWZi{^?5y z&FA;GDSi(n@~JfN|X%}KpY zO=MS!kuUT&7?TQ`hkb{J3|x;7zNi40#SO^LxCt;$`Dju3q(nW4vNziNP5I$y`1S0kN34q zpX}t|AX&19Um@V@5}r=-6emh{C{9$$5G7s0iIPn^C{A`sk9hJ&dc;#cNRN2(NwUO~ z?~F?_7rg{ZKR6kBJs!`8k)b!^@ok{n{}PW60Y3to1-|#4cw7e^JRXnxKnqU9;}KA6 zG#)=n{Cn{@IjIA+gZ6?}gGNBxK!-rLffl?UkM9Dl104k22}%VT1hs<}VBx?8S_j$& z+6%f3Gy)nSij@>9ST9yr=7LsZ)vOLQ1RA0OBTVK*$+&r$lF@0+xMcj8oLBH!><32mM!|-|iQ~vIUM3~iTArJKtvYT~PDojN@uHbUwrM11$AMu& zaiNYXVP7fEwRTx7&yLN_xprJN&eh|ZaCVJbmzzVfv}EE#J(huz?46d1-2AT0s$6YV zZhmF1^}1YY9qxZWX!RTM_#>1lX16LgWXZfWdu*MNAYvy%D5cW?H0(*hulmd*JW|$YU`;2xt;rw?n3(I$#yE3zw1Wq?1x-6PCtqp4Wl(M zS_7js@c&y4?6m8w$RR;#Sfx;w#i`_%nRvH}r*D`kNO}5ZnZkHZ6uCbd{Xm++!MQr4 zH2vp?r(DpLf;I}eQP4XD zy-(1G1bsr#1A@LH=m|kj3wqwSxStCJy-d(~f|d)qQqV?0Hwt>Ep!W&-kf2WpdO*-u z1U(_>X+h7MCj1MkAXJo=F4XMUS#5?^Smc=FDAeW@%qc1?C@j?M%diOI!g2#om_2uf zQoM5E+_u6wMFq;Tl?wwMt*!J#x}m<_tgDo)TZ(=7ThNRTSGYirj^XeJf9YN2ipOGTCCxlr)tcIqqF3`fn;3ITjuf zV`3^9tMK)Nps8dAgubNzQyH1pOTHq{GOsTSpRAHnoala#rF2Sf z0ca|Dx=&s^5tnD8?K*G>313)Sbj;bP#a>f!P< z_@XrU65v#>YLnj$Y2^KB@Q|=mXR`BSlDDXdd8I7L146#ZB>%X;+f4XVWJf9+=+QLz zd%{kq$xcotZ(nPH&aAMt8^k69r+NsPr7uvf0Zs~Cs&Dx@sO=0LgJ?a?{#o_8`DyhhZ!yy1KGvwe?!^j=JL|-9|ayU z;eP^7{l8As4_l*wy_3MLDX#0!h5X;z zyhh+>O!x-isr=G&&qNDm^Fkh3Wa0KS^8do*txAq)7b*Ws!fD*|=nRte`5S@fnDFPB z{amG2)K3Z1!k)MS*91OK;4xvxYO-@y;F<}yVl9~3OP{4P3v6u{u_?eQpSnrDK*-mL z{xh9vVecG)4;AVR*)Q;FVaMg+xGZm-z^hGokl7K+26Cs6Uu}~A36n?tnEKnp0H+WT)7lfUVm=Dbsse^=D@JmE-eSu}+43ig(fn?)>m9=}l&QMto z;{{&lNyeuLJY>R)1b&wZuLMr*7@5QEuys@gKc^J(y(W1dlZSvQ+$`j`d32T{^VuWp z?-cbQpND@5oa!wS;POlfr-#$n-<<}3M%cH`0h!T;^vujU5Z_?<5~F z$xjmapb5WB;6o;SL7I6&6~j@_rvCO10v{6Bg&fD|%XAv|%>Bxr#(q~Ce7mq;C+bJO zn|VBq{DCz1o5GGZO;;$ecR`?U3p^t7Ka-^@%EyFT#$ytp3xt!;g#3`G2llQ2Nm*#1 zRO9ExX>g@J5G-`~vDqM=ZEJ&g4^Qvc@kGd9SsS*qgrLW}0cm~(yAUGQju-N^!IoO= zKiKM}y&)U?*ag(@arMHj)HEg9ysgpMd2>*m4cM2KZzwvFw9;EY7yU|XcFXdW!V}-A zRWvPKtRtJj%6)i~cU$GZaFP4vQqMH(KwMk9d`YRe#Q4^zCYKHE{@NyYYlF|UwQyp$ z+O+!xCyHETD1JgM#Xh;o`_lUS?uHunt0Y;#b+dtSQsZ=*>3`X1y8Rr5t@5w+6aRqNd#q%W)^9 zpN}zZULnRUy=g<@gb%jMucLi)OVI669PPmXr%f`3ABTAZZHj{}j&Eq~aNxIV*hM+G z*#LPun(^;ini~XETv9ok<{J(YZ*sRcDUOECt#H9E}=nk(q*bT%H@Uv=nc$>sTqNxG8lH(eDM!_{?9EP#6cs;!OVGAb*bHI(^ zT2maD*wD}R6o+`1z={r>O2bO(aI-sLM-ZdJ|9PPIceF-f5vKApbr#Fd<8D%@1ZUKj>(loOeJx3v z)=HDZDzMmlftIgWhzS4m`!Nc28Jyy=gavc{-9X3TkosD-&g3-l;CNIhQXa{a)R*rM zn}LxlsW0Dyo*|i_lys*7bJ>uuMn2`mvWNcf^>R^DS7!G zbN)oGSSR#l9n1U+Sm{B8>Qw5>_omx~{!vkn(!bP~<^QqJFA)aid)PMdVpqPmC4G7} zHS7NZ7}cw^pLm|p03uNTHU@M1-;YG2zNYC+T+2hlfFu^rz`8L7T>i z^04WlN$T-bv@aq?efe(b;9M>-K?(|L&i`+PzN~+_Ua06?p}?eI_Wyg6zFhy8|EKFE zZYFUynNtp#^mEE|CYvK3^yPIV4aoMB{ELXtrfZ^`B;L2k|J!Ajm%OBJL6=@FNqzZ# zC$a<}f|TRj2ru#XkwAS%>dW^T^8c{O|F=f{pMunr^>_*xwV%|N`?nvxfuw1TAUQ~V zNk2!jQD44iiAsG+Gz6(9sRijqeffUnOf^?Bx0lJBLhp~rmdw9g2R$qFBjP%iS`=F literal 23880 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 Hy!w3NU literal 9432 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 diff --git a/bin/renderer.o b/bin/renderer.o new file mode 100644 index 0000000000000000000000000000000000000000..7b14952bbad3c2c307ab309cda9530533d96f06c GIT binary patch literal 1920 zcmbtU&ubG=5Pq9R8!yK3#_Ui^#Mf&`Eica$S+`_{1M_y1NkQ{&=Cvx^NZ~kv}pm6qP@0zklbUot7%6nkWXWS z@T^$Sir!(X7XsdySfLath6D=4nS99;OD%%Diihw&I#m>>=_DY&>xGVBPAi6m=&bi1 z>cs-SXfYVF`jItvy0984Ua}>EbK(5Fhv48$7~~&XF}nG5Y92(?@94>4qAij0p^%4! zYzb`KQev zG)TMx`7PEg5&j@>k&w9wH-YuZf2;&%f45e(vLxGaYnmtTOWyZ(#2`re%n7V=k@64LX)O8+Tow%jkG%`2w zoKr|7IeqL(+DMM;_5T0qNXVzzZ+7W~cwC5d?w`IH zPJieAoAt&r_L%pdqyQKF->HwAPnzz#M~KNB+($vfa^~(p^u1`t&v9_dDdg78{{vJ~ B6Bhsg literal 0 HcmV?d00001 diff --git a/bin/shaders.o b/bin/shaders.o new file mode 100644 index 0000000000000000000000000000000000000000..3cb7e60988695917d28d4bb85639e87ae720c2e9 GIT binary patch literal 6448 zcmb`Ldu$X%9LML{0#)Je03R4IU1L=$u=K9@jE^3@w%b^>Qff4SQ;pK6HICnPFj05wK~zu)X{_I@|LMSM)MH#494 z{vJC!doy<%T07gSLLs3_NZc+;Jw=7saY?D&ESt?DEM|xv%l$TSU!o_myxVe5StCCf z$8pqhk6Lc)A=%y&8%5AMepdR}(+J&!dw_bV9&0^_Rl?mb4PqZ!n|luJ#x#=dPoBB;;2Io_xxAb(opTerBwMG{q@NUBz*Ex z!Fkjgy#k$|ip)&bPxnHcibSCefuio11<65>NL^Bh9$2Q86SCaTs#`JLz!$Q*Ke$~3y!_cC=R6h?1E{UqBN8)r1}T#oWlk?Gr5P+ zYN(L!FQf*AXm4q`#hBlIcTa;6Yck_z%!oI}n_`Wzm@$8u-Dg-ShXxicX~3l^YTz>9 zngSQti7FA=i%fmjhNyo5Ff12)l?XkyOoY}&LvyE3tK9N2k^H7_<;aE9>7lq z@G}9t79Lood7BFy=ik707>ayHp>7D!-yFb~k)JN|Bi~{0vzquu;_{sZo(u5vB|5cD* zrTlTdec;O`_UF)j_nD=(6Cb^?vd{NaG}?i%KcGkJ@aay_|BI$s!!WlHxzs59T2ax(cGO(>XklX0GZ1imM+pdZd}WSr-J2XQ_BcH%1ko1|AEIs^2$Phr8h)8SI{gZmT~ z{Gk9|U_8w9BaBBF-x|Q*WgPbh6?Y$T{eC}Td?wT5K7|GKoPW*y&w?@K|3m=) zm2rG`lwM8@^l^STUw{A#R`|Dy(#IITl<^gebA5_&u782?%bB08jC1{ajN@8X`Fy}Q z*B@sbf4nRG?~HT(LVC$@7{5c5KF&DT-_Q7!Oh3dp*T2sARZRaT<6J+^IG){9K4%!` z`h~bapkV&j!lm?a#<_ka;|)x|hHe6*=XwJ)STG-&a@n`!XNem$IHYlP z-rT0~jileHadobo(D;N3&elI7bxxeGadjTFG_KBlLmF4-JN)g81$|5ZG%q_fuFh){ z8dv8sVHVd9I;k~KI|Z*EP_2TUO_}hwf+Nhnl#>$XnqpCyg*h|bUfA)aHP7Da;RV{yg{&0`3WZ#IJB9zCy%Ky~u{{n+zJaqs7 literal 0 HcmV?d00001 diff --git a/bin/worldgen.o b/bin/worldgen.o index 2da4c5082d5ca3c97bdd975d044d8ae7fbb2a56f..afdb84ea48979a2179b0fa9e74149990caf8ff23 100644 GIT binary patch delta 302 zcmaE${6J-b22%pxMy<dnvwEWKR{;$`c>GF%of0$(08XOpa zV6qRh$z~sB8zx>6Aa4#x2nfU{Kjc;3ynxk%S@0QwaD-RIRV05fE8lL uhRFv7%sDf7A-sgijDqHz2cU8llO2IP3r>jK@5zlo-U+D6X_F7~$pZjo*-R7w delta 227 zcmaE$@<4fl2GaxHjarwPtKcO5+)x6@?LO2c+Vy?3Yl|yKvhng?8q+<0MI}|I{*Lx diff --git a/src/initialization.c b/src/initialization.c new file mode 100644 index 0000000..f2958b1 --- /dev/null +++ b/src/initialization.c @@ -0,0 +1,48 @@ +#include "initialization.h" + +void initializeWindowSystem(GLFWwindow** windowPtr) +{ + glewExperimental = true; + if( !glfwInit() ) + { + fprintf( stderr, "Failed to initialize GLFW :(\n" ); + return -1; + } + glfwWindowHint(GLFW_SAMPLES, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); + + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + *windowPtr = glfwCreateWindow(WINW, WINH, "Planet Miner", NULL, NULL); + if( *windowPtr == NULL ) + { + fprintf( stderr, "Failed to create window. If you are using an Intel GPU, please note that they are not compatible with OpenGL 3.3\n" ); + glfwTerminate(); + return -1; + } + glfwMakeContextCurrent(*windowPtr); + + glewExperimental = true; + if( glewInit() != GLEW_OK ) + { + fprintf( stderr, "Failed to initialize GLEW\n" ); + getchar(); + glfwTerminate(); + return -1; + } + + glfwSetInputMode(*windowPtr, GLFW_STICKY_KEYS, GL_TRUE); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + printf("Window: %d\n", (int)windowPtr); +} + +void initializeVertexBuffer(GLuint* vertexBufferPtr, GLfloat* vertexBufferData) +{ + glGenBuffers(1, vertexBufferPtr); + glBindBuffer(GL_ARRAY_BUFFER, *vertexBufferPtr); + glBufferData(GL_ARRAY_BUFFER, sizeof(*vertexBufferData), vertexBufferData, GL_STATIC_DRAW); +} diff --git a/src/initialization.h b/src/initialization.h new file mode 100644 index 0000000..dab6777 --- /dev/null +++ b/src/initialization.h @@ -0,0 +1,11 @@ +#include +#include +#include +#include + +#define WINW 800 +#define WINH 450 + +void initializeWindowSystem(GLFWwindow** windowPtr); +void initializeVertexBuffer(GLuint* vertexBufferPtr, GLfloat* vertexBufferDataPtr); +void initializeRenderer(); diff --git a/src/main.c b/src/main.c index 2dbe6ec..a2c5c39 100644 --- a/src/main.c +++ b/src/main.c @@ -5,86 +5,48 @@ #include #include - #include -GLFWwindow* window; #include #include "worldgen.h" - -#define WINW 800 -#define WINH 450 +#include "shaders.h" +#include "initialization.h" +#include "renderer.h" #define FOV 1.4f #define SHADER_BUF_SIZE 1000 -GLuint loadShaders(const char*, const char*); +GLFWwindow** window; + static GLfloat vertexBufferData[1000]; void setVertexBufferData(GLfloat*, unsigned int*, unsigned int); int main() { - glewExperimental = true; - if( !glfwInit() ) - { - fprintf( stderr, "Failed to initialize GLFW :(\n" ); - return -1; - } - glfwWindowHint(GLFW_SAMPLES, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); - glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); - - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - - window = glfwCreateWindow(WINW, WINH, "Planet Miner", NULL, NULL); - if( window == NULL ) - { - fprintf( stderr, "Failed to create window. If you are using an Intel GPU, please note that they are not compatible with OpenGL 3.3\n" ); - glfwTerminate(); - return -1; - } - glfwMakeContextCurrent(window); - - glewExperimental = true; - if( glewInit() != GLEW_OK ) - { - fprintf( stderr, "Failed to initialize GLEW\n" ); - getchar(); - glfwTerminate(); - return -1; - } - - glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); - - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + // start initialization + initializeWindowSystem(&window); GLuint vertexArrayID; glGenVertexArrays(1, &vertexArrayID); glBindVertexArray(vertexArrayID); - //glEnable(GL_DEPTH_TEST); + glEnable(GL_DEPTH_TEST); GLuint programID = loadShaders( "src/shader.vert", "src/shader.frag" ); GLuint matrixID = glGetUniformLocation(programID, "MVP"); mat4s projection = glms_perspective(FOV, 16.0f / 9.0f, 0.1f, 100.0f); + shaderSetMat4(programID, "projection", &projection); vec3s eye = {0.0f, 0.0f, 5.0f}; vec3s center = {0.0f, 0.0f, 0.0f}; vec3s up = {0.0f, 1.0f, 0.0f}; - vec3s planetPos = {0.0f, 0.0f, 0.0f}; - worldMesh* mesh = generateWorld(planetPos); - setVertexBufferData(mesh->vertices, mesh->triangles, mesh->triangleArrayCount); - - GLuint vertexbuffer; - glGenBuffers(1, &vertexbuffer); - glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(vertexBufferData), vertexBufferData, GL_STATIC_DRAW); + GLuint vertexBuffer; + initializeVertexBuffer(&vertexBuffer, &vertexBufferData); vec3s direction = {0.0f, 0.0f, -5.0f}; @@ -96,14 +58,21 @@ int main() mat4s view = glms_lookat(eye, center, up); mat4s model = glms_mat4_identity(); - mat4s mvp = glms_mat4_mul(glms_mat4_mul(projection, view), model); + // start shaders glUseProgram(programID); + + shaderSet3f(programID, "objectColor", 1.0f, 0.5f, 0.31f); + shaderSet3f(programID, "lightColor", 1.0f, 1.0f, 1.0f); + shaderSet3f(programID, "lightPos", 1.0f, 1.0f, 1.0f); + shaderSetVec3(programID, "viewPos", &eye); + + shaderSetMat4(programID, "view", &view); + shaderSetMat4(programID, "model", &model); - glUniformMatrix4fv(matrixID, 1, GL_FALSE, &mvp); glEnableVertexAttribArray(0); - glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glVertexAttribPointer( 0, @@ -116,6 +85,7 @@ int main() glDrawArrays(GL_TRIANGLES, 0, 20*3); glDisableVertexAttribArray(0); + glfwSwapBuffers(window); glfwPollEvents(); @@ -124,7 +94,7 @@ int main() && glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS) && !glfwWindowShouldClose(window)); - glDeleteBuffers(1, &vertexbuffer); + glDeleteBuffers(1, &vertexBuffer); glDeleteProgram(programID); glDeleteVertexArrays(1, &vertexArrayID); @@ -132,38 +102,3 @@ int main() return 0; } - - - -void setVertexBufferData(GLfloat* vertices, unsigned int* triangles, unsigned int triangleCount) -{ - vec3s triangleVerts[3]; - int startingIndex; - for( unsigned int i = 0; i < triangleCount; i+=3 ) - { - startingIndex = i*6; - for( int j = 0; j < 3; ++j ) - { - triangleVerts[j].x = vertices[triangles[i+j]*3]; - triangleVerts[j].y = vertices[triangles[i+j]*3 + 1]; - triangleVerts[j].z = vertices[triangles[i+j]*3 + 2]; - - vertexBufferData[startingIndex + j*6] = triangleVerts[j].x; - vertexBufferData[startingIndex + j*6 + 1] = triangleVerts[j].y; - vertexBufferData[startingIndex + j*6 + 2] = triangleVerts[j].z; - } - - vec3s normal = glms_vec3_crossn(glms_vec3_sub(triangleVerts[0], triangleVerts[1]), - glms_vec3_sub(triangleVerts[0], triangleVerts[2])); - - vertexBufferData[startingIndex + 3] = normal.x; - vertexBufferData[startingIndex + 4] = normal.y; - vertexBufferData[startingIndex + 5] = normal.z; - vertexBufferData[startingIndex + 9] = normal.x; - vertexBufferData[startingIndex + 10] = normal.y; - vertexBufferData[startingIndex + 11] = normal.z; - vertexBufferData[startingIndex + 15] = normal.x; - vertexBufferData[startingIndex + 16] = normal.y; - vertexBufferData[startingIndex + 17] = normal.z; - } -} diff --git a/src/renderer.c b/src/renderer.c new file mode 100644 index 0000000..160ea72 --- /dev/null +++ b/src/renderer.c @@ -0,0 +1,36 @@ +#include "renderer.h" +#include + +void setVertexBufferData(GLfloat* vertexBufferData, GLfloat* vertices, unsigned int* triangles, unsigned int triangleCount) +{ + vec3s triangleVerts[3]; + int startingIndex; + for( unsigned int i = 0; i < triangleCount; i+=3 ) + { + startingIndex = i*6; + for( int j = 0; j < 3; ++j ) + { + triangleVerts[j].x = vertices[triangles[i+j]*3]; + triangleVerts[j].y = vertices[triangles[i+j]*3 + 1]; + triangleVerts[j].z = vertices[triangles[i+j]*3 + 2]; + + vertexBufferData[startingIndex + j*6] = triangleVerts[j].x; + vertexBufferData[startingIndex + j*6 + 1] = triangleVerts[j].y; + vertexBufferData[startingIndex + j*6 + 2] = triangleVerts[j].z; + } + + vec3s normal = glms_vec3_crossn(glms_vec3_sub(triangleVerts[0], triangleVerts[2]), + glms_vec3_sub(triangleVerts[0], triangleVerts[1])); + + vertexBufferData[startingIndex + 3] = normal.x; + vertexBufferData[startingIndex + 4] = normal.y; + vertexBufferData[startingIndex + 5] = normal.z; + vertexBufferData[startingIndex + 9] = normal.x; + vertexBufferData[startingIndex + 10] = normal.y; + vertexBufferData[startingIndex + 11] = normal.z; + vertexBufferData[startingIndex + 15] = normal.x; + vertexBufferData[startingIndex + 16] = normal.y; + vertexBufferData[startingIndex + 17] = normal.z; + + } +} diff --git a/src/renderer.h b/src/renderer.h new file mode 100644 index 0000000..e9d5c1e --- /dev/null +++ b/src/renderer.h @@ -0,0 +1,2 @@ +#include +void setVertexBufferData(GLfloat* vertexBufferData, GLfloat* vertices, unsigned int* triangles, unsigned int triangleCount); diff --git a/src/shader.vert b/src/shader.vert index 5c096e4..95e82b3 100644 --- a/src/shader.vert +++ b/src/shader.vert @@ -1,15 +1,16 @@ #version 330 core - layout(location = 0) in vec3 aPos; layout(location = 1) in vec3 aNormal; +out vec3 FragPos; out vec3 Normal; -uniform mat4 MVP; +uniform mat4 model; +uniform mat4 view; +uniform mat4 projection; void main(){ FragPos = vec3(model * vec4(aPos, 1.0)); Normal = mat3(transpose(inverse(model))) * aNormal; - - gl_Position = MVP * vec4(aPos, 1.0); + gl_Position = projection * view * vec4(aPos, 1.0); } diff --git a/src/shaders.c b/src/shaders.c index a7c9391..eff52af 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -1,3 +1,6 @@ +#include "shaders.h" +#include "textfiles.h" + GLuint loadShaders(const char* vertexShaderPath, const char* fragmentShaderPath) { char* vertexShaderCode = readTextFile( vertexShaderPath ); @@ -61,4 +64,62 @@ GLuint loadShaders(const char* vertexShaderPath, const char* fragmentShaderPath) return programID; } +void shaderSetBool(GLuint ID, char* name, bool value) +{ + glUniform1i(glGetUniformLocation(ID, name), (int) value); +} +void shaderSetInt(GLuint ID, char* name, int value) +{ + glUniform1i(glGetUniformLocation(ID, name), value); +} + +void shaderSetFloat(GLuint ID, char* name, float value) +{ + glUniform1f(glGetUniformLocation(ID, name), value); +} + +void shaderSetVec2(GLuint ID, char* name, vec2s* ref) +{ + glUniform2fv(glGetUniformLocation(ID, name), 1, ref); +} + +void shaderSet2f(GLuint ID, char* name, float x, float y) +{ + glUniform2f(glGetUniformLocation(ID, name), x, y); +} + +void shaderSetVec3(GLuint ID, char* name, vec3s* ref) +{ + glUniform3fv(glGetUniformLocation(ID, name), 1, ref); +} + +void shaderSet3f(GLuint ID, char* name, float x, float y, float z) +{ + glUniform3f(glGetUniformLocation(ID, name), x, y, z); +} + +void shaderSetVec4(GLuint ID, char* name, vec4s* ref) +{ + glUniform4fv(glGetUniformLocation(ID, name), 1, ref); +} + +void shaderSet4f(GLuint ID, char* name, float x, float y, float z, float w) +{ + glUniform4f(glGetUniformLocation(ID, name), x, y, z, w); +} + +void shaderSetMat2(GLuint ID, char* name, mat2s* ref) +{ + glUniformMatrix2fv(glGetUniformLocation(ID, name), 1, GL_FALSE, ref); +} + +void shaderSetMat3(GLuint ID, char* name, mat3s* ref) +{ + glUniformMatrix3fv(glGetUniformLocation(ID, name), 1, GL_FALSE, ref); +} + +void shaderSetMat4(GLuint ID, char* name, mat4s* ref) +{ + glUniformMatrix4fv(glGetUniformLocation(ID, name), 1, GL_FALSE, ref); +} diff --git a/src/shaders.h b/src/shaders.h index b114713..0c77378 100644 --- a/src/shaders.h +++ b/src/shaders.h @@ -4,21 +4,19 @@ GLuint loadShaders(const char* vertexShaderPath, const char* fragmentShaderPath); -void use(); +void shaderSetBool(GLuint ID, char* name, bool value); +void shaderSetInt(GLuint ID, char* name, int value); +void shaderSetFloat(GLuint ID, char* name, float value); -void setBool(char* name, bool value); -void setInt(char* name, int value); -void setFloat(char* name, float value); +void shaderSetVec2(GLuint ID, char* name, vec2s* ref); +void shaderSet2f(GLuint ID, char* name, float x, float y); -void setVec2(char* name, vec2s value); -void setVec3(char* name, float x, float y); +void shaderSetVec3(GLuint ID, char* name, vec3s* ref); +void shaderSet3f(GLuint ID, char* name, float x, float y, float z); -void setVec3(char* name, vec3s value); -void setVec3(char* name, float x, float y, float z); +void shaderSetVec4(GLuint ID, char* name, vec4s* ref); +void shaderSet4f(GLuint ID, char* name, float x, float y, float z, float w); -void setVec4(char* name, vec4s value); -void setVec4(char* name, float x, float y, float z, float w); - -void setMat2(char* name, mat2s value); -void setMat3(char* name, mat3s value); -void setMat4(char* name, mat4s value); +void shaderSetMat2(GLuint ID, char* name, mat2s* ref); +void shaderSetMat3(GLuint ID, char* name, mat3s* ref); +void shaderSetMat4(GLuint ID, char* name, mat4s* ref); diff --git a/src/worldgen.c b/src/worldgen.c index 9e44cf8..80da081 100644 --- a/src/worldgen.c +++ b/src/worldgen.c @@ -4,6 +4,9 @@ #include #include +#define MIN(i, j) (((i) < (j)) ? (i) : (j)) +#define MAX(i, j) (((i) > (j)) ? (i) : (j)) + #define ORDER 0 #define RSQRT5 0.4472135954999579f #define TWICE_RSQRT5 0.8944271909999159f @@ -65,3 +68,8 @@ void normalizeVertices(GLfloat* vertices, unsigned int vertexArrayCount, GLfloat vertices[i + 2] = vertex.z; } } + +unsigned int reducedSymmetricPair(unsigned int a, unsigned int b) +{ + return ((a+b+1)*(a+b+1) - (a+b+1)&1) >> 2 + MIN(a,b); +} diff --git a/src/worldgen.h b/src/worldgen.h index 183a720..0a91388 100644 --- a/src/worldgen.h +++ b/src/worldgen.h @@ -19,3 +19,5 @@ typedef struct worldMesh worldMesh* generateWorld(vec3s pos); void populateIcosphere(worldMesh* mesh, unsigned char order, GLfloat radius); void normalizeVertices(GLfloat* vertices, unsigned int vertexArrayCount, GLfloat radius); + +unsigned int reducedSymmetricPair(unsigned int, unsigned int);