commit a12a857fbfc27178d67de6b61653b0311a79f913
parent 0498f885b8f2130fcb09b23a560c783cdee56bd9
Author: rexim <reximkut@gmail.com>
Date: Fri, 10 Feb 2023 00:13:10 +0700
Implement reloading the shaders
Diffstat:
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);