diff --git a/PlanetMiner b/PlanetMiner index 19c6d57..51d7794 100755 Binary files a/PlanetMiner and b/PlanetMiner differ diff --git a/bin/main.o b/bin/main.o index 286cefb..a19f6b3 100644 Binary files a/bin/main.o and b/bin/main.o differ diff --git a/bin/worldgen.o b/bin/worldgen.o index 182e0c3..2da4c50 100644 Binary files a/bin/worldgen.o and b/bin/worldgen.o differ diff --git a/src/main.c b/src/main.c index be94008..2dbe6ec 100644 --- a/src/main.c +++ b/src/main.c @@ -66,7 +66,7 @@ int main() glGenVertexArrays(1, &vertexArrayID); glBindVertexArray(vertexArrayID); - + //glEnable(GL_DEPTH_TEST); GLuint programID = loadShaders( "src/shader.vert", "src/shader.frag" ); GLuint matrixID = glGetUniformLocation(programID, "MVP"); @@ -92,7 +92,7 @@ int main() do { - glClear( GL_COLOR_BUFFER_BIT ); + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); mat4s view = glms_lookat(eye, center, up); mat4s model = glms_mat4_identity(); @@ -133,75 +133,37 @@ int main() return 0; } -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; -} 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);