diff --git a/src/main.c b/src/main.c index ac82afc..a1bb1d7 100644 --- a/src/main.c +++ b/src/main.c @@ -71,6 +71,9 @@ void handleInputs(double deltaTime) { if (glfwGetKey(window, GLFW_KEY_4) == GLFW_PRESS) { cameraPosition = (vec3){-0.6f, 2.1f, -4.5f}; } + if (glfwGetKey(window, GLFW_KEY_5) == GLFW_PRESS) { + cameraPosition = (vec3){-10.6f, 22.1f, -4.5f}; + } if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) { cameraPosition.z += deltaTime * 10; } @@ -161,8 +164,6 @@ void renderNode(SceneNode* node) { void init(void) { //IDEE: shader in array speichern und dann so kompilieren etc - GLuint vertexShader; - GLuint fragmentShader; GLint status; Shader shaders[2] = { @@ -170,8 +171,13 @@ void init(void) { {GL_FRAGMENT_SHADER, 0} }; - compileShader(vertexShader_glsl, &shaders[0]); - compileShader(fragmentShader_glsl, &shaders[1]); + const GLchar* shaderSources[2] = { + vertexShader_glsl, + fragmentShader_glsl + }; + + int numShaders = sizeof(shaders) / sizeof(Shader); + compileShaders(shaders, shaderSources, numShaders); program = glCreateProgram(); diff --git a/src/shader.c b/src/shader.c index a84e0f8..24e2846 100644 --- a/src/shader.c +++ b/src/shader.c @@ -1,13 +1,7 @@ #include #include - #include -#include - -typedef struct { - GLenum type; - GLuint id; -} Shader; +#include "shader.h" void compileShader(const GLchar *shaderSource, Shader *shader) { shader->id = glCreateShader(shader->type); @@ -26,4 +20,51 @@ void compileShader(const GLchar *shaderSource, Shader *shader) { printf("%s\n", infoLog); exit(1); } -} \ No newline at end of file +} + +void compileShaders(Shader* shaders, const GLchar** glslSources, int numShaders) { + for (int i = 0; i < numShaders; i++) { + compileShader(glslSources[i], &shaders[i]); + } +} + +ShaderProgram createShaderProgram(const GLchar* vertexSource, const GLchar* fragmentSource) { + Shader vertexShader = { GL_VERTEX_SHADER, 0 }; + Shader fragmentShader = { GL_FRAGMENT_SHADER, 0 }; + + const GLchar* shaderSources[2] = { vertexSource, fragmentSource }; + Shader shaders[2] = { vertexShader, fragmentShader }; + + compileShaders(shaders, shaderSources, 2); + + GLuint program = glCreateProgram(); + glAttachShader(program, shaders[0].id); + glAttachShader(program, shaders[1].id); + glLinkProgram(program); + + GLint status; + glGetProgramiv(program, GL_LINK_STATUS, &status); + + if (!status) { + printf("Error linking program: "); + GLchar infoLog[1024]; + glGetProgramInfoLog(program, 1024, NULL, infoLog); + printf("%s\n", infoLog); + exit(1); + } + + glValidateProgram(program); + + glGetProgramiv(program, GL_VALIDATE_STATUS, &status); + + if (!status) { + printf("Error validating program: "); + GLchar infoLog[1024]; + glGetProgramInfoLog(program, 1024, NULL, infoLog); + printf("%s\n", infoLog); + exit(1); + } + + ShaderProgram shaderProgram = { program, vertexSource, fragmentSource }; + return shaderProgram; +} diff --git a/src/shader.h b/src/shader.h index 01646ea..cb2beab 100644 --- a/src/shader.h +++ b/src/shader.h @@ -8,6 +8,14 @@ typedef struct { GLuint id; } Shader; +typedef struct { + GLuint program; + const GLchar* vertexSource; + const GLchar* fragmentSource; +} ShaderProgram; + void compileShader(const GLchar *shaderSource, Shader *shader); +void compileShaders(Shader* shaders, const GLchar** glslSources, int numShaders); +ShaderProgram createShaderProgram(const GLchar* vertexSource, const GLchar* fragmentSource); #endif \ No newline at end of file