ded

Dramatic EDitor
Index Commits Files Refs README LICENSE
commit a12a857fbfc27178d67de6b61653b0311a79f913
parent 0498f885b8f2130fcb09b23a560c783cdee56bd9
Author: rexim <reximkut@gmail.com>
Date:   Fri, 10 Feb 2023 00:13:10 +0700

Implement reloading the shaders

Diffstat:
Msrc/main.c | 5+++++
Msrc/simple_renderer.c | 28+++++++++++++++++++++++++++-
Msrc/simple_renderer.h | 2++
3 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/src/main.c b/src/main.c
@@ -264,6 +264,11 @@ int main(int argc, char **argv)
                     }
                     break;
 
+                    case SDLK_F5: {
+                        simple_renderer_reload_shaders(&sr);
+                    }
+                    break;
+
                     case SDLK_RETURN: {
                         editor_insert_char(&editor, '\n');
                         editor.last_stroke = SDL_GetTicks();
diff --git a/src/simple_renderer.c b/src/simple_renderer.c
@@ -173,7 +173,31 @@ void simple_renderer_init(Simple_Renderer *sr)
 
     GLuint shaders[2] = {0};
 
-    // TODO: dynamic shader reloading
+    if (!compile_shader_file(vert_shader_file_path, GL_VERTEX_SHADER, &shaders[0])) {
+        exit(1);
+    }
+
+    for (int i = 0; i < COUNT_SIMPLE_SHADERS; ++i) {
+        if (!compile_shader_file(frag_shader_file_paths[i], GL_FRAGMENT_SHADER, &shaders[1])) {
+            exit(1);
+        }
+        sr->programs[i] = glCreateProgram();
+        attach_shaders_to_program(shaders, sizeof(shaders) / sizeof(shaders[0]), sr->programs[i]);
+        if (!link_program(sr->programs[i], __FILE__, __LINE__)) {
+            exit(1);
+        }
+        glDeleteShader(shaders[1]);
+    }
+    glDeleteShader(shaders[0]);
+}
+
+void simple_renderer_reload_shaders(Simple_Renderer *sr)
+{
+    for (int i = 0; i < COUNT_SIMPLE_SHADERS; ++i) {
+        glDeleteProgram(sr->programs[i]);
+    }
+
+    GLuint shaders[2] = {0};
 
     if (!compile_shader_file(vert_shader_file_path, GL_VERTEX_SHADER, &shaders[0])) {
         exit(1);
@@ -188,7 +212,9 @@ void simple_renderer_init(Simple_Renderer *sr)
         if (!link_program(sr->programs[i], __FILE__, __LINE__)) {
             exit(1);
         }
+        glDeleteShader(shaders[1]);
     }
+    glDeleteShader(shaders[0]);
 }
 
 // TODO: Don't render triples of verticies that form a triangle that is completely outside of the screen
diff --git a/src/simple_renderer.h b/src/simple_renderer.h
@@ -64,6 +64,8 @@ typedef struct {
 
 void simple_renderer_init(Simple_Renderer *sr);
 
+void simple_renderer_reload_shaders(Simple_Renderer *sr);
+
 void simple_renderer_vertex(Simple_Renderer *sr,
                             Vec2f p, Vec4f c, Vec2f uv);
 void simple_renderer_set_shader(Simple_Renderer *sr, Simple_Shader shader);