diff --git a/src/main.c b/src/main.c index 1648016..d7f8ac4 100644 --- a/src/main.c +++ b/src/main.c @@ -89,28 +89,8 @@ void recalculateProjectionMatrix() { void init(void) { - INFO("Compiling Shaders..."); - - // create and compile vertex shader - INFO("Compiling Vertex Shader..."); - ShaderCompileResult vertexShader = readAndCompileShaderFromFile("src/shaders/vertex.glsl", GL_VERTEX_SHADER); - - if (!vertexShader.success) { - FATAL("Failed to compile Vertex Shader"); - exit(1); - } - - // create and compile fragment shader - INFO("Compiling Fragment Shader..."); - ShaderCompileResult fragmentShader = readAndCompileShaderFromFile("src/shaders/fragment.glsl", GL_FRAGMENT_SHADER); - if (!fragmentShader.success) { - FATAL("Failed to compile Fragment Shader"); - exit(1); - } - - // create and link shader program - INFO("Linking Shader Program..."); - ProgramLinkResult linkResult = linkShaderProgram(vertexShader.shader, fragmentShader.shader); + INFO("Building Programs..."); + ProgramLinkResult linkResult = buildShaderProgram("src/shaders/vertex.glsl", "src/shaders/fragment.glsl"); if (!linkResult.success) { FATAL("Failed to link Program"); exit(1); diff --git a/src/shader.c b/src/shader.c index 2154b99..6ff19ab 100644 --- a/src/shader.c +++ b/src/shader.c @@ -116,4 +116,27 @@ ProgramLinkResult linkShaderProgram(GLuint vertexShader, GLuint fragmentShader) result.success = true; return result; -} \ No newline at end of file +} + +ProgramLinkResult buildShaderProgram(const char* vertexShaderPath, const char* fragmentShaderPath) { + ProgramLinkResult result = { .success = false, .program = 0 }; + + ShaderCompileResult vertexShader = readAndCompileShaderFromFile(vertexShaderPath, GL_VERTEX_SHADER); + if (!vertexShader.success) { + FATAL("Failed to compile vertex shader"); + return result; + } + + ShaderCompileResult fragmentShader = readAndCompileShaderFromFile(fragmentShaderPath, GL_FRAGMENT_SHADER); + if (!fragmentShader.success) { + FATAL("Failed to compile fragment shader"); + return result; + } + + result = linkShaderProgram(vertexShader.shader, fragmentShader.shader); + + glDeleteShader(vertexShader.shader); + glDeleteShader(fragmentShader.shader); + + return result; +} diff --git a/src/shader.h b/src/shader.h index a541b32..a2ac3f3 100644 --- a/src/shader.h +++ b/src/shader.h @@ -17,5 +17,6 @@ typedef struct { extern const char* readFileToMemory(const char* filepath); extern ShaderCompileResult readAndCompileShaderFromFile(const char* filepath, GLenum shaderType); extern ProgramLinkResult linkShaderProgram(GLuint vertexShader, GLuint fragmentShader); +extern ProgramLinkResult buildShaderProgram(const char* vertexShaderPath, const char* fragmentShaderPath); #endif // SHADER_H \ No newline at end of file