Browse Source

Implement reloading the shaders

rexim 2 years ago
parent
commit
a12a857fbf
3 changed files with 34 additions and 1 deletions
  1. 5 0
      src/main.c
  2. 27 1
      src/simple_renderer.c
  3. 2 0
      src/simple_renderer.h

+ 5 - 0
src/main.c

@@ -264,6 +264,11 @@ int main(int argc, char **argv)
                     }
                     }
                     break;
                     break;
 
 
+                    case SDLK_F5: {
+                        simple_renderer_reload_shaders(&sr);
+                    }
+                    break;
+
                     case SDLK_RETURN: {
                     case SDLK_RETURN: {
                         editor_insert_char(&editor, '\n');
                         editor_insert_char(&editor, '\n');
                         editor.last_stroke = SDL_GetTicks();
                         editor.last_stroke = SDL_GetTicks();

+ 27 - 1
src/simple_renderer.c

@@ -173,7 +173,31 @@ void simple_renderer_init(Simple_Renderer *sr)
 
 
     GLuint shaders[2] = {0};
     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])) {
     if (!compile_shader_file(vert_shader_file_path, GL_VERTEX_SHADER, &shaders[0])) {
         exit(1);
         exit(1);
@@ -188,7 +212,9 @@ void simple_renderer_init(Simple_Renderer *sr)
         if (!link_program(sr->programs[i], __FILE__, __LINE__)) {
         if (!link_program(sr->programs[i], __FILE__, __LINE__)) {
             exit(1);
             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
 // TODO: Don't render triples of verticies that form a triangle that is completely outside of the screen

+ 2 - 0
src/simple_renderer.h

@@ -64,6 +64,8 @@ typedef struct {
 
 
 void simple_renderer_init(Simple_Renderer *sr);
 void simple_renderer_init(Simple_Renderer *sr);
 
 
+void simple_renderer_reload_shaders(Simple_Renderer *sr);
+
 void simple_renderer_vertex(Simple_Renderer *sr,
 void simple_renderer_vertex(Simple_Renderer *sr,
                             Vec2f p, Vec4f c, Vec2f uv);
                             Vec2f p, Vec4f c, Vec2f uv);
 void simple_renderer_set_shader(Simple_Renderer *sr, Simple_Shader shader);
 void simple_renderer_set_shader(Simple_Renderer *sr, Simple_Shader shader);