trying to read commands from std while displaying things, fixes
This commit is contained in:
parent
a32e44f45f
commit
dc791e3481
5 changed files with 43 additions and 9 deletions
2
Makefile
2
Makefile
|
|
@ -13,5 +13,3 @@ $(objects): %.o: %.c
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o glonkers
|
rm -f *.o glonkers
|
||||||
|
|
||||||
run: glonkers
|
|
||||||
SDL_VIDEODRIVER="wayland,x11" ./glonkers
|
|
||||||
|
|
|
||||||
35
glonkers.c
35
glonkers.c
|
|
@ -1,10 +1,12 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <signal.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <wayland-client.h>
|
#include <wayland-client.h>
|
||||||
#include <wayland-util.h>
|
#include <wayland-util.h>
|
||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
|
#include <pthread.h>
|
||||||
#include "renderer.h"
|
#include "renderer.h"
|
||||||
|
|
||||||
//int main() {
|
//int main() {
|
||||||
|
|
@ -79,7 +81,34 @@ double time_since_start() {
|
||||||
(now.tv_nsec - program_start.tv_nsec) / 1e9;
|
(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[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
signal(SIGINT, intHandler);
|
||||||
|
pthread_t stdin_thread;
|
||||||
|
pthread_create( &stdin_thread, NULL, read_stdin, NULL);
|
||||||
|
|
||||||
init_timer();
|
init_timer();
|
||||||
|
|
||||||
printf("Good Morning 🍵\n");
|
printf("Good Morning 🍵\n");
|
||||||
|
|
@ -109,7 +138,6 @@ int main(int argc, char *argv[]) {
|
||||||
Renderer renderer = new_renderer();
|
Renderer renderer = new_renderer();
|
||||||
|
|
||||||
SDL_Event e;
|
SDL_Event e;
|
||||||
int running = 1;
|
|
||||||
int w, h;
|
int w, h;
|
||||||
while (running) {
|
while (running) {
|
||||||
while (SDL_PollEvent(&e)) {
|
while (SDL_PollEvent(&e)) {
|
||||||
|
|
@ -128,9 +156,12 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
double time = time_since_start();
|
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);
|
SDL_GL_SwapWindow(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_join(stdin_thread, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
11
renderer.c
11
renderer.c
|
|
@ -68,12 +68,16 @@ GLuint create_shader(const char *fragment_src) {
|
||||||
|
|
||||||
GLuint load_shader(const char *path) {
|
GLuint load_shader(const char *path) {
|
||||||
FILE *handle = fopen(path, "r");
|
FILE *handle = fopen(path, "r");
|
||||||
|
if (handle == NULL) {
|
||||||
|
printf("failed to open shader file\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
fseek(handle, 0L, SEEK_END);
|
fseek(handle, 0L, SEEK_END);
|
||||||
long length = ftell(handle);
|
long length = ftell(handle);
|
||||||
fseek(handle, 0L, SEEK_SET);
|
fseek(handle, 0L, SEEK_SET);
|
||||||
char *string = malloc(length * sizeof(char));
|
char *string = malloc(length * sizeof(char));
|
||||||
if (!fread(string, sizeof(char), length, handle)) {
|
if (!fread(string, sizeof(char), length, handle)) {
|
||||||
printf("failed to read shader file");
|
printf("failed to read shader file\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
fclose(handle);
|
fclose(handle);
|
||||||
|
|
@ -143,9 +147,10 @@ Renderer new_renderer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// shader_path cannot be NULL.
|
/// shader_path cannot be NULL.
|
||||||
void render(Renderer *state, int w, int h, double time, char *shader_path) {
|
void render(Renderer *state, int w, int h, double time, char *shader_path, int reload_shader) {
|
||||||
if (strcmp(state->shader_path, shader_path)) {
|
if (reload_shader || strcmp(state->shader_path, shader_path)) {
|
||||||
state->shader = load_shader(shader_path);
|
state->shader = load_shader(shader_path);
|
||||||
|
state->shader_path = shader_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
checkGlError();
|
checkGlError();
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ typedef struct Renderer {
|
||||||
} Renderer;
|
} Renderer;
|
||||||
|
|
||||||
Renderer new_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
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
2
run.sh
2
run.sh
|
|
@ -1,3 +1,3 @@
|
||||||
make
|
make
|
||||||
./glonkers "$@"
|
SDL_VIDEODRIVER="wayland,x11" ./glonkers "$@"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue