From dc791e3481d81cdf11b84790764b9ab1aeeea51f Mon Sep 17 00:00:00 2001 From: Rakarake Date: Mon, 15 Dec 2025 23:33:30 +0100 Subject: [PATCH] trying to read commands from std while displaying things, fixes --- Makefile | 2 -- glonkers.c | 35 +++++++++++++++++++++++++++++++++-- renderer.c | 11 ++++++++--- renderer.h | 2 +- run.sh | 2 +- 5 files changed, 43 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 41bf9df..feab2ba 100644 --- a/Makefile +++ b/Makefile @@ -13,5 +13,3 @@ $(objects): %.o: %.c clean: rm -f *.o glonkers -run: glonkers - SDL_VIDEODRIVER="wayland,x11" ./glonkers diff --git a/glonkers.c b/glonkers.c index 9f9fd58..0339ee1 100644 --- a/glonkers.c +++ b/glonkers.c @@ -1,10 +1,12 @@ #include #include +#include #include #include #include #include #include +#include #include "renderer.h" //int main() { @@ -79,7 +81,34 @@ double time_since_start() { (now.tv_nsec - program_start.tv_nsec) / 1e9; } +_Atomic bool running = true; + +void intHandler(int dummy) { + printf("exiting\n"); + running = false; + fclose(stdin); +} + +bool reload_shader = false; + +/// reads stdin on a separate thread. +void *read_stdin(void *ptr) { + char buff[10]; + while (running) { + fgets(buff, 10, stdin); + if (strcmp(buff, "r\n") == 0) { + printf("reloading shader\n"); + reload_shader = true; + } + } + return NULL; +} + int main(int argc, char *argv[]) { + signal(SIGINT, intHandler); + pthread_t stdin_thread; + pthread_create( &stdin_thread, NULL, read_stdin, NULL); + init_timer(); printf("Good Morning 🍵\n"); @@ -109,7 +138,6 @@ int main(int argc, char *argv[]) { Renderer renderer = new_renderer(); SDL_Event e; - int running = 1; int w, h; while (running) { while (SDL_PollEvent(&e)) { @@ -128,9 +156,12 @@ int main(int argc, char *argv[]) { } double time = time_since_start(); - render(&renderer, w, h, time, shader_path); + render(&renderer, w, h, time, shader_path, reload_shader); + if (reload_shader) reload_shader = false; SDL_GL_SwapWindow(window); } + + pthread_join(stdin_thread, NULL); } diff --git a/renderer.c b/renderer.c index b26fd46..3c5b952 100644 --- a/renderer.c +++ b/renderer.c @@ -68,12 +68,16 @@ GLuint create_shader(const char *fragment_src) { GLuint load_shader(const char *path) { FILE *handle = fopen(path, "r"); + if (handle == NULL) { + printf("failed to open shader file\n"); + exit(1); + } fseek(handle, 0L, SEEK_END); long length = ftell(handle); fseek(handle, 0L, SEEK_SET); char *string = malloc(length * sizeof(char)); if (!fread(string, sizeof(char), length, handle)) { - printf("failed to read shader file"); + printf("failed to read shader file\n"); exit(1); } fclose(handle); @@ -143,9 +147,10 @@ Renderer new_renderer() { } /// shader_path cannot be NULL. -void render(Renderer *state, int w, int h, double time, char *shader_path) { - if (strcmp(state->shader_path, shader_path)) { +void render(Renderer *state, int w, int h, double time, char *shader_path, int reload_shader) { + if (reload_shader || strcmp(state->shader_path, shader_path)) { state->shader = load_shader(shader_path); + state->shader_path = shader_path; } checkGlError(); diff --git a/renderer.h b/renderer.h index b0a78d7..ffcfb9a 100644 --- a/renderer.h +++ b/renderer.h @@ -8,7 +8,7 @@ typedef struct Renderer { } Renderer; Renderer new_renderer(); -void render(Renderer *renderer, int w, int h, double time, char *shader_path); +void render(Renderer *renderer, int w, int h, double time, char *shader_path, int reload_shader); #endif diff --git a/run.sh b/run.sh index 2e3e1ff..1ef4771 100755 --- a/run.sh +++ b/run.sh @@ -1,3 +1,3 @@ make -./glonkers "$@" +SDL_VIDEODRIVER="wayland,x11" ./glonkers "$@"