From 46bde19035217921f3905f7bf6c81a0ef0033997 Mon Sep 17 00:00:00 2001 From: Adog64 Date: Tue, 19 Dec 2023 12:11:04 -0500 Subject: [PATCH] World mesh loads; working on diffuse shader --- PlanetMiner | Bin 23880 -> 23880 bytes bin/main.o | Bin 8552 -> 9432 bytes bin/worldgen.o | Bin 4576 -> 4576 bytes src/main.c | 96 +++++++++++++++--------------------------------- src/shader.frag | 23 ++++++++++-- src/shader.vert | 10 ++++- src/shaders.c | 64 ++++++++++++++++++++++++++++++++ src/shaders.h | 24 ++++++++++++ 8 files changed, 145 insertions(+), 72 deletions(-) create mode 100644 src/shaders.c create mode 100644 src/shaders.h diff --git a/PlanetMiner b/PlanetMiner index 19c6d57a1b7196a18f8c50291e0ddf77299bdc2d..51d77949f05152bf754a59b91ad329c6b3b4872a 100755 GIT binary patch delta 1522 zcmZWoZ%i9y7{7blVh0^h%Npm*2r>ve7&I+`$Rc11?RHG2Od-1@&_vG#3CYwp z=^!3W3CVrXEc>u%vJZ2KWfwC836wu8|E6O&GltReVUZhZ+;*cQPC1{qcaSY!a`*mz z&+mDD&(rsPJ3Yis53va=n_ZX7WS+WQIgjlk&i>)oR;nvaLxnZ(e^;_=D7dTX!lB33lu@yoqjQ%yp8DRbAdRsS0no9H5ryf)=%d!2KE* zvhcSqX6D*-vg%H?y75V}>4de;Eh8LfcgDz%U@!pOY+SJU!8wP;{>|<212-KPa@8<| zQfdG~v%o#T*aB_fhtQ9z4?_2VyM@G|cUK{FjYfY4ZUZ;}F=mfpWpEtHA_~D7`WdI6 z`!o+vDKrP%O_cEsr84<63)-(^a}49#9=@)^kp*zwfWD#)O@p3%`h9Z-4?lUg4DrCk z6USfRXBc1G$biSoG>QNETHD^>qkmYHU|Q4oo@8hD5MCj?WfPt>FHR|hhQ-^;g*8nZ zy@)lunBv7Nc=@_9LKPt$MiBpmRi44zCUKIwoZ`h>ytq1o$Bh+JN{HI*zw*&bzLdF~ z-eIMWMxv9}W^wtgqrQ;u=ma0DYun2(%~&R3BW!UVb4IC!au%C4iz~{F%(^Ej6W^X z{j#0pjz!Aew9kG<3_7FJa|WH& zX~LkH9dJaF2ED4Q^9KFiB00*-vd1218vX|@0ka$^|DC<$ew8JWm!%fZV<}wekw31C zu+Jy(Olt6O6OS~l8`sFXrd`C<`?vIL)p=4#q>-uyBCJWIx}LbxQbTnmxtf-`s>{gn zb@|Kcek*aio)TvB~wy{*Eabd?ef&;2hTO*R(i)EHTHF0V95@@2a} zVWN)X2YU$-_DP2h^%KS=E#cxVm*0J*m)%xKuMj>P(vbr@CHvtPB9zJR9PZ5_`8H{_ O-L*9c+UyCInEwOLlq!<| delta 1061 zcmZWnT}TvB6uxs^+f6rS75gEIjoQSuNp>ZnNM%;7uC|Jq(yw7Xm{gLGiDa=$Th?V+ zGcJ^s(jrkW5?j+l3EBFS`Vb^SNkU``-Sm- zAz~3y8m&nC8m&sY(1J4>9^Rc2`;<>>ifc~4I%4gK=bt*JbSK@mfb#<}y0@G+ZSkZ^(3`UbL4W6kI_9qb3rFT0{9& zG0|pvM(EFwPY4X*n3yKdYZ6Bb99`#Vv2@$Fvtz^cIimfNHlS#ik*8*$(=DS?`rA`o zvzG+ET2$vkB0(-kn_K%~AVhq0*c~TyOr87zI{l!YgZQEkng|^w^d(G6jEu}XLl*>f z3WQQR!d==3eMjirfWW=LMdCHvUY_0V88u1#zUo1)1V$`gI&-MjbJ$ZmOo9a)od|iM zjkyoV2##ohq8HplJq6xgI;-B(;@rRjOyZ70ODqer6}&Eq*Ol<0f(7qEwRH32X;c}XF`iDd@CLC zL?YN`B7?J7y$IQQ@pSSzuz|cyOhcTu@dMLj8^=B!uj4qNV;9F)bS!fm)Nv)p*K}OR zF*Da|MopaD)DnI_EQHf8opu`ZmQKS4y{*%TLA4E}`J)Ey*0U1^?J={Do3m4{&nFV_ z2PO+kl;t^J1jV*|LU`<|5a0<|rTdp4Gk>m2IiKqnR?k4`R(RqWxPL3e2<)T}V$%X! zvE@FlLTq455e~-~&MU-q^Qf!x#uPNUX59 z&{}Iy9$BPl)qesTDR!hb7*&mu%pT#jimfD)#2trrwPPH1va+%c?2_0tgr;oe#O`)s oX_a;gLVwtvohzBGyb_1Alw;-Xskl6a&F# diff --git a/bin/main.o b/bin/main.o index 286cefb08b05e3509c55a1dea31ec3fd0f868c03..a19f6b3afbf3c639e52134edf88b6e9b6b2582f5 100644 GIT binary patch delta 3017 zcmZ`*ZERCj7{0gLU>&zT{oLv8+O1^+%g0tGV?f;4ItC5{Q7{HZiY~z*MhSI4RE(sM zF<_7q$O{Tl%!t2CoUxe%e@HSmS%3-1&@hn^erN=RIIO6VkNKW+&z+~h-sC>_ocDR& z=X~6AZ+pFAXvy9P^@WtNsOPPE#jUu~b!C=htmE6Jj=$Rn$u?q9lnil{GeKof<={H< z`%gD^VP{ul?B$<>YXdr4bDRg~RT?>DBjH!}^yk=wDfy&)_TT_a5@2Q)QFArA`&^1N@$J5Gl0d7=Jqs_$f;Dqo=K8;e`XPh zpCOSyFgM5sXe9BAnHY(WkjM|%aT=p%Nc=p@{zxJZaP#k?`UF-s_hM%ViRRM`dKuhi zI($m;0TQ`{G+yz3u4gK;>H-dqX}nfVzK|iy2T8?uWLN2f(NWSKWVrG)KKz~=)3Lp` z4`TTx-945OiyG@r=WSFSin67S9|r*tnt0O^wshO`Eh?+zzfHO9ag9METpYb^%dA^rRqBz_i*gwc#Pu! z$EzGiIOf2Sf~Xoor0Q&j`eGc0jTI7OgvEU|sFSGr5?3ZTZsNF;R~^DCr;^KO#UNj_ zI=SW;#~zLsI9}!WC&vN^Yg8@eSjn-0UM118#RJGE*5O(2-Lc$O5g=oRA7YKS2h@o0J> zI+?R;6=#jjt`L@?;$4rX?uH}S+Ue2YQ;%lrlQcSXd1%)9E(wm7D@l>!rznq@5!UAiJ?+WzO*}k)MRQ9K1q!vDiLNe*ZZ6j~~q^xl#I2 zg6I3j$&Zecx3k${JUr2+aq=s3=03h)|2PFF%{;v7EwYth@m+Be?QnwavrE&%m^F8< z%CP6JYZ%UYX%@R8i@ooqY8bqQQGK%HuvKW-ic4WlA=TNZ&h$Shu_cf~c8bJyNo*+` zFQjm@P_vyAS$1BYfLoXiP|bE-(oTaQeHt`;Hxjf=XP;1Wys6^+u-X~WMX4T?SoT3< z!R9&>hACCc;SP>P<*C|I@w)o>hHc7)8@ z6;f>}+|qGx{hBQ<)y#*WpX#Mj%?62$!ZJU80kCF|NDIG*#6-NrR*rdW5f-!ff&w8e z{28-&jPi4#+-WMyKS32+K|Nk__}C{0qsh4Ozd?355SrnfC;rRK61(JteIW|hLq6+z W_9KMR3D)pjYm0FBk}vE^Q2P%v_}J6{ delta 2131 zcmZ9Oe`s4(6vy9tOKnr{Ynm>}&C8EA$uf0Y+PAc>+c4?U&9QE7It$`diW`E0Q`E6S zH>g^R(qeoT2H@*GolHT37|Y1~ybk?YkGt0D3>%J|kb@hvjGCah)Qtp~ZDhe_lCVh_^R zd&wUrjuEGcSBW=?zY^1s(Y1u(jMgm&eTL%I_ot9p=eW;{D*ZU| zByo`VF$|boA0vO7c!_wOc$4@$u?jltxZX(25c9+*i7yggCB91>BAz3DPW*wmK>Ujs zfRc~vX<{33AMphu&J)%5h{MED;#qjQzAcb#(^?Mh$v#TlMr@s#s6W2$0a|eo1|nSF zCVPcd9mZ5M<^)8Fl*3Q(rU0tpH}Z zm9Hq3LCA-=8C2BMkPUI@3o&>t#Po4EhTlHLZ{s0mepk``d+ci|mA@#e1@};mDC*zJ zs1a!995S3GYvd*rm#C7xS;lLj6prH7nF@1Dyj1QQoEJ&c#5xl&k7`0u_nINVvDIfSMyrK9MspawqvU4c z^%%EWQFmwP70GDg(gqVTZf4MP)mA8Bm$?|Twkgpkl$v(9haFRj`m9vNliUu?alD6d zX1=7YqTP>2G+Cca z_Q92eZA=?5;0eLuS`V;f+9(^)n(XkF<)Gg{XYG0zNv6F+vg!m(V&poeY99C_+2QXK zuR2P{{dsV=XYIntff!5_*#9GoE!s&3ZtHue1 hF2hy3gC87+(@+5cGQB`*K~ diff --git a/bin/worldgen.o b/bin/worldgen.o index 182e0c3b49941834966a7d85f3c3df1140d6ab8b..2da4c5082d5ca3c97bdd975d044d8ae7fbb2a56f 100644 GIT binary patch delta 651 zcmZY3u}cDB7{~E@&$>I$_v%i{H^WFVTEemjus_q6Z)x557rFX)equv|o zBsxX=*JEIsUB0AYoU9qKGQ`jI)cQr2QJWe%%d(Ci4lH~9}(k3~P#Kk8`TsNGW zBr8bh0tJ#MNj6a=*&}I7QbLuaMq;yGs^EsCMUs}}0IwvrVK@az&fpjVIiq1`m1#Gh z@s>Gn$wCd5u^&8S8Z2{$=~ysDw4c8C_47B8?yFR42DVLsbCX*sUo~+-^^xk5uW~f0 zu7)_;<`x^kT1en1#I2_9j*Vlgw^ZMJHHL_-pUUSZN@Jvq)KEe9xFZ@cStva}_{sJzMUa$ZF delta 630 zcmZ9|y-UMD7{~Fuz9eaKX$^fj;tN)ai=c(JbQ21$72C~0u|vm-&QhV>1a&As2L}cJ z0EJ3dg}OLd|AsmUE<)WEeHw+Hx#8~ke8a<$VP=@=&Ifs^mkvG$f*ND!IB^uT1W$o$ z618Y3%$UwfaH4V4wS>FK#!F`v@0@H)=xEZ-dZ4q~BzU(19%x!$Gn|&Ml<+}iMCHm? z%2?1P(z@aFePt6>Ditb2U#X)_rA3AD|7jn$RJv5szS6`Cl_8aquN=WKB&G~wy5=iq z-f)eD7;?s=$yUm1#qpMh5jhCcC09f{a?C@p%`6XN)s!y%UH19?yHbDi0%SUNO^Jpn z>}5qGxFo$G-B8rRfb_`}7?}-jW80G0vV=WQzKP+K^n~N yIerqY@sY%wkeC(1&MPXhPFg0dD(d2pv`M 0 ) - { - char vertexShaderErrorMessage[infoLogLength + 1]; - glGetShaderInfoLog(vertexShaderID, infoLogLength, NULL, &vertexShaderErrorMessage); - printf("%s\n", &vertexShaderErrorMessage); - } - - printf("Compiling fragment shader...\n"); - glShaderSource(fragmentShaderID, 1, &fragmentShaderCode, NULL); - glCompileShader(fragmentShaderID); - - glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &result); - glGetShaderiv(fragmentShaderID, GL_INFO_LOG_LENGTH, &infoLogLength); - if( infoLogLength > 0 ) - { - char fragmentShaderErrorMessage[infoLogLength + 1]; - glGetShaderInfoLog(fragmentShaderID, infoLogLength, NULL, &fragmentShaderErrorMessage); - printf("%s\n", &fragmentShaderErrorMessage); - } - - printf("Linking program\n"); - GLuint programID = glCreateProgram(); - glAttachShader(programID, vertexShaderID); - glAttachShader(programID, fragmentShaderID); - glLinkProgram(programID); - - glGetProgramiv(programID, GL_LINK_STATUS, &result); - glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &infoLogLength); - if( infoLogLength > 0 ) - { - char programErrorMessage[infoLogLength + 1]; - glGetProgramInfoLog(programID, infoLogLength, NULL, &programErrorMessage); - printf("%s\n", &programErrorMessage); - } - - free( vertexShaderCode ); - free( fragmentShaderCode ); - - glDetachShader( programID, vertexShaderID ); - glDetachShader( programID, fragmentShaderID ); - - glDeleteShader( vertexShaderID ); - glDeleteShader( fragmentShaderID ); - return programID; -} void setVertexBufferData(GLfloat* vertices, unsigned int* triangles, unsigned int triangleCount) { - for( int i = 0; i < triangleCount; ++i ) + vec3s triangleVerts[3]; + int startingIndex; + for( unsigned int i = 0; i < triangleCount; i+=3 ) { - vertexBufferData[i*3] = vertices[triangles[i]*3]; - vertexBufferData[i*3 + 1] = vertices[triangles[i]*3 + 1]; - vertexBufferData[i*3 + 2] = vertices[triangles[i]*3 + 2]; + 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/shader.frag b/src/shader.frag index d2e0cfa..2082f6d 100644 --- a/src/shader.frag +++ b/src/shader.frag @@ -1,7 +1,24 @@ #version 330 core -// Ouput data -out vec3 color; +out vec4 FragColor; + +in vec3 Normal; +in vec3 FragPos; + +uniform vec3 lightPos; +uniform vec3 viewPos; +uniform vec3 lightColor; +uniform vec3 objectColor; + void main() { - color = vec3(1,1,1); + float ambientStrength = 0.1; + vec3 ambient = ambientStrength * lightColor; + + vec3 norm = normalize(Normal); + vec3 lightDir = normalize(lightPos - FragPos); + float diff = max(dot(norm, lightDir), 0.0); + vec3 diffuse = diff * lightColor; + + vec3 result = (ambient + diffuse) * objectColor; + FragColor = vec4(result, 1.0); } diff --git a/src/shader.vert b/src/shader.vert index 28f88c7..5c096e4 100644 --- a/src/shader.vert +++ b/src/shader.vert @@ -1,9 +1,15 @@ #version 330 core -layout(location = 0) in vec3 vertexPosition_modelspace; +layout(location = 0) in vec3 aPos; +layout(location = 1) in vec3 aNormal; +out vec3 Normal; + uniform mat4 MVP; void main(){ - gl_Position = MVP * vec4(vertexPosition_modelspace,1); + FragPos = vec3(model * vec4(aPos, 1.0)); + Normal = mat3(transpose(inverse(model))) * aNormal; + + gl_Position = MVP * vec4(aPos, 1.0); } diff --git a/src/shaders.c b/src/shaders.c new file mode 100644 index 0000000..a7c9391 --- /dev/null +++ b/src/shaders.c @@ -0,0 +1,64 @@ +GLuint loadShaders(const char* vertexShaderPath, const char* fragmentShaderPath) +{ + char* vertexShaderCode = readTextFile( vertexShaderPath ); + char* fragmentShaderCode = readTextFile( fragmentShaderPath ); + + GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER); + GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); + + GLint result = GL_FALSE; + int infoLogLength; + + printf("Compiling vertex shader...\n"); + glShaderSource(vertexShaderID, 1, &vertexShaderCode, NULL); + glCompileShader(vertexShaderID); + + glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &result); + glGetShaderiv(vertexShaderID, GL_INFO_LOG_LENGTH, &infoLogLength); + if( infoLogLength > 0 ) + { + char vertexShaderErrorMessage[infoLogLength + 1]; + glGetShaderInfoLog(vertexShaderID, infoLogLength, NULL, &vertexShaderErrorMessage); + printf("%s\n", &vertexShaderErrorMessage); + } + + printf("Compiling fragment shader...\n"); + glShaderSource(fragmentShaderID, 1, &fragmentShaderCode, NULL); + glCompileShader(fragmentShaderID); + + glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &result); + glGetShaderiv(fragmentShaderID, GL_INFO_LOG_LENGTH, &infoLogLength); + if( infoLogLength > 0 ) + { + char fragmentShaderErrorMessage[infoLogLength + 1]; + glGetShaderInfoLog(fragmentShaderID, infoLogLength, NULL, &fragmentShaderErrorMessage); + printf("%s\n", &fragmentShaderErrorMessage); + } + + printf("Linking program\n"); + GLuint programID = glCreateProgram(); + glAttachShader(programID, vertexShaderID); + glAttachShader(programID, fragmentShaderID); + glLinkProgram(programID); + + glGetProgramiv(programID, GL_LINK_STATUS, &result); + glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &infoLogLength); + if( infoLogLength > 0 ) + { + char programErrorMessage[infoLogLength + 1]; + glGetProgramInfoLog(programID, infoLogLength, NULL, &programErrorMessage); + printf("%s\n", &programErrorMessage); + } + + free( vertexShaderCode ); + free( fragmentShaderCode ); + + glDetachShader( programID, vertexShaderID ); + glDetachShader( programID, fragmentShaderID ); + + glDeleteShader( vertexShaderID ); + glDeleteShader( fragmentShaderID ); + return programID; +} + + diff --git a/src/shaders.h b/src/shaders.h new file mode 100644 index 0000000..b114713 --- /dev/null +++ b/src/shaders.h @@ -0,0 +1,24 @@ +#include +#include +#include + +GLuint loadShaders(const char* vertexShaderPath, const char* fragmentShaderPath); + +void use(); + +void setBool(char* name, bool value); +void setInt(char* name, int value); +void setFloat(char* name, float value); + +void setVec2(char* name, vec2s value); +void setVec3(char* name, float x, float y); + +void setVec3(char* name, vec3s value); +void setVec3(char* name, float x, float y, float z); + +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);