diff --git a/src/main.c b/src/main.c index a0dfc14..c69b2ca 100644 --- a/src/main.c +++ b/src/main.c @@ -1,68 +1,29 @@ #include #include #include -#include #include "SDL3/SDL_events.h" #include "SDL3/SDL_keycode.h" #include "camera.h" +#include "shader.h" #include "window.h" -// settings -const unsigned int SCR_WIDTH = 800; -const unsigned int SCR_HEIGHT = 600; - int main(int argc, char *argv[]) { wn_window window = {0}; if (!wn_window_init(&window)) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize wn_window"); + return EXIT_FAILURE; } + wn_shader_code_location shader_code_location = { + .vertex_shader_source_path = "shaders/vert.glsl", + .fragment_shader_source_path = "shaders/frag.glsl"}; - const char *vertexShaderSource = SDL_LoadFile("shaders/vert.glsl", NULL); - const char *fragmentShaderSource = SDL_LoadFile("shaders/frag.glsl", NULL); - - // vertex shader - unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); - glCompileShader(vertexShader); - // check for shader compile errors - int success; - char infoLog[512]; - glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); - if (!success) { - glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, - "Failed to compile vertex shader: %s", infoLog); + wn_shader shader = wn_shader_init(shader_code_location); + if (shader.success == false) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize shader"); + return EXIT_FAILURE; } - // fragment shader - unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); - glCompileShader(fragmentShader); - // check for shader compile errors - glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); - if (!success) { - glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, - "Failed to compile fragment shader: %s", infoLog); - } - // Free source code memory - SDL_free((void *)vertexShaderSource); - SDL_free((void *)fragmentShaderSource); - // link shaders - unsigned int shaderProgram = glCreateProgram(); - glAttachShader(shaderProgram, vertexShader); - glAttachShader(shaderProgram, fragmentShader); - glLinkProgram(shaderProgram); - // check for linking errors - glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); - if (!success) { - glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, - "Failed to link shader program: %s", infoLog); - } - glDeleteShader(vertexShader); - glDeleteShader(fragmentShader); // set up vertex data (and buffer(s)) and configure vertex attributes float vertices[] = { @@ -134,7 +95,8 @@ int main(int argc, char *argv[]) { mat4 mvp; camera_calc_mvp(&mvp, &camera); // glm_mat4_print(mvp,stdout); - int mvp_uniform_location = glGetUniformLocation(shaderProgram, "MVP"); + int mvp_uniform_location = + glGetUniformLocation(shader.shaderProgram, "MVP"); glUniformMatrix4fv(mvp_uniform_location, 1, GL_FALSE, &mvp[0][0]); // render @@ -142,7 +104,7 @@ int main(int argc, char *argv[]) { glClear(GL_COLOR_BUFFER_BIT); // draw our first triangle - glUseProgram(shaderProgram); + glUseProgram(shader.shaderProgram); glBindVertexArray( VAO); // seeing as we only have a single VAO there's no need to bind it // every time, but we'll do so to keep things a bit more organized @@ -156,8 +118,8 @@ int main(int argc, char *argv[]) { glDeleteVertexArrays(1, &VAO); glDeleteBuffers(1, &VBO); glDeleteBuffers(1, &EBO); - glDeleteProgram(shaderProgram); + wn_shader_deinit(shader); wn_window_deinit(&window); return EXIT_SUCCESS; diff --git a/src/shader.c b/src/shader.c index e69de29..38b42c3 100644 --- a/src/shader.c +++ b/src/shader.c @@ -0,0 +1,70 @@ +#include "shader.h" +#include "SDL3/SDL_iostream.h" +#include "SDL3/SDL_log.h" +#include + +wn_shader wn_shader_init(wn_shader_code_location shader_code_location) { + wn_shader shader = {.shaderProgram = 0, .success = false}; + + const char *vertexShaderSource = + SDL_LoadFile(shader_code_location.vertex_shader_source_path, NULL); + const char *fragmentShaderSource = + SDL_LoadFile(shader_code_location.fragment_shader_source_path, NULL); + + // vertex shader + unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); + glCompileShader(vertexShader); + // check for shader compile errors + int success; + char infoLog[512]; + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Failed to compile vertex shader: %s", infoLog); + return shader; + } + + // fragment shader + unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); + glCompileShader(fragmentShader); + // check for shader compile errors + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Failed to compile fragment shader: %s", infoLog); + return shader; + } + + // Free source code memory + SDL_free((void *)vertexShaderSource); + SDL_free((void *)fragmentShaderSource); + + // link shaders + unsigned int shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + + // check for linking errors + glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); + if (!success) { + glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Failed to link shader program: %s", infoLog); + return shader; + } + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + + shader.shaderProgram = shaderProgram; + shader.success = true; + return shader; +} + +void wn_shader_deinit(wn_shader shader) { + glDeleteProgram(shader.shaderProgram); +} diff --git a/src/shader.h b/src/shader.h index c794cc1..648df84 100644 --- a/src/shader.h +++ b/src/shader.h @@ -1,5 +1,7 @@ #pragma once +#include + typedef struct { const char *vertex_shader_source_path; const char *fragment_shader_source_path; @@ -7,6 +9,7 @@ typedef struct { struct wn_shader_s { unsigned int shaderProgram; + bool success; }; typedef struct wn_shader_s wn_shader;