diff --git a/build.bat b/build.bat index 1f21179..7178189 100644 --- a/build.bat +++ b/build.bat @@ -1,5 +1,5 @@ @ECHO OFF -cl build.c src/str.c src/types.c /Iinclude && del *.obj && build.exe && del build.exe && build\gsa_simple.exe +cl build.c src/str.c src/types.c /Iinclude /nologo && del *.obj && build.exe && del build.exe && build\gsa_simple.exe EXIT /B %ERRORLEVEL% diff --git a/examples/gsa_simple.c b/examples/gsa_simple.c index 03ed9e1..d62f2ff 100644 --- a/examples/gsa_simple.c +++ b/examples/gsa_simple.c @@ -19,25 +19,8 @@ void fade_palette(f32 amount) { bool tick_fade_in(); -void test() { - struct sw_skip *skip; - u32 len; - u8 *str; - - skip = sw_skip_load("build/gsa.exe"); - str = sw_skip_get(skip, "test.c", &len); - sw_log("%i", str); - - sw_log("%.*s", len, str); -} - void init() { i32 x, y; - char *a, *b; - - sw_str_split2("hellonyaworld", "nya", &a, &b); - printf("%s - %s\n", a, b); - // test(); gsa_copy_palette_to(pal); diff --git a/include/renderer.h b/include/renderer.h new file mode 100644 index 0000000..2335a9f --- /dev/null +++ b/include/renderer.h @@ -0,0 +1,20 @@ +#ifndef GUARD_EAE42F57582CDD6C49D6C5F8B0CD994B +#define GUARD_EAE42F57582CDD6C49D6C5F8B0CD994B + +struct sw_window; + +typedef void (*sw_renderer_cb)(struct sw_window *, void *); +typedef void (*sw_render_cb)(); + +struct sw_renderer { + void *data; + sw_renderer_cb enter; + sw_renderer_cb exit; + sw_render_cb render; +}; + +struct sw_renderer * +sw_renderer_create(void *data, sw_renderer_cb enter, sw_renderer_cb exit); +void sw_renderer_destroy(struct sw_renderer *renderer); + +#endif /* GUARD_EAE42F57582CDD6C49D6C5F8B0CD994B */ diff --git a/include/window.h b/include/window.h index 369a09b..76b3966 100644 --- a/include/window.h +++ b/include/window.h @@ -2,6 +2,7 @@ #define GUARD_F247452E0BF1EC9CD9131C2A6FD281CA #include "framebuffer.h" +#include "renderer.h" #include "types.h" #include "vec2i.h" @@ -14,10 +15,16 @@ struct sw_window { struct GLFWwindow *_window; struct sw_framebuffer *_scaler_fb; + + struct sw_renderer **_renderers; + u32 _renderer_count; }; struct sw_window *sw_window_create(struct sw_vec2i size, char *title); -void sw_window_run(struct sw_window *window, void (*callback)()); +void sw_window_run(struct sw_window *window); +void sw_window_add_renderer( + struct sw_window *window, struct sw_renderer *renderer, sw_render_cb cb +); #endif /* GUARD_F247452E0BF1EC9CD9131C2A6FD281CA */ diff --git a/src/gsa.c b/src/gsa.c index 0d0e9eb..fa80440 100644 --- a/src/gsa.c +++ b/src/gsa.c @@ -2,9 +2,11 @@ #include "error.h" #include "gl.h" #include "image8.h" +#include "renderer.h" #include "shader.h" #include "skip.h" #include "types.h" +#include "window.h" #include #include #define GSA_NOMAIN @@ -112,7 +114,8 @@ int gsa_main(int argc, char *argv[]) { sw_log("gsa setup done"); init(); - sw_window_run(_win, _gsa_tick); + sw_window_add_renderer(_win, sw_renderer_create(0, 0, 0), _gsa_tick); + sw_window_run(_win); return 0; } diff --git a/src/renderer.c b/src/renderer.c new file mode 100644 index 0000000..60bf4ec --- /dev/null +++ b/src/renderer.c @@ -0,0 +1,21 @@ +#include "renderer.h" + +#include + +struct sw_renderer * +sw_renderer_create(void *data, sw_renderer_cb enter, sw_renderer_cb exit) { + struct sw_renderer *renderer; + + renderer = malloc(sizeof(struct sw_renderer)); + + renderer->data = data; + renderer->enter = enter; + renderer->exit = exit; + renderer->render = 0; + + return renderer; +} + +void sw_renderer_destroy(struct sw_renderer *renderer) { + free(renderer); +} diff --git a/src/renderer2d.c b/src/renderer2d.c index 04a132f..8a0094c 100644 --- a/src/renderer2d.c +++ b/src/renderer2d.c @@ -1,7 +1,3 @@ #include "renderer2d.h" -static char *shader_vert = "\ -\ - "; - struct sw_renderer2d *sw_renderer2d_create(){}; diff --git a/src/window.c b/src/window.c index 6c32af1..44b556c 100644 --- a/src/window.c +++ b/src/window.c @@ -14,7 +14,6 @@ static void _tick(); static struct sw_window *_tick_window; -static void (*_tick_fn)(); static void win_callback(GLFWwindow *glfw_win, i32 width, i32 height); #ifndef __EMSCRIPTEN__ @@ -32,12 +31,13 @@ static void GLAPIENTRY gldebug( struct sw_window *sw_window_create(struct sw_vec2i size, char *title) { struct sw_window *win; - sw_init(); - win = malloc(sizeof(struct sw_window)); win->window_size = size; win->game_size = size; + win->_renderer_count = 0; + win->_renderers = 0; + sw_log("init glfw"); glfwInit(); glfwDefaultWindowHints(); @@ -70,10 +70,9 @@ struct sw_window *sw_window_create(struct sw_vec2i size, char *title) { return win; } -void sw_window_run(struct sw_window *window, void (*callback)()) { +void sw_window_run(struct sw_window *window) { sw_log("run window"); _tick_window = window; - _tick_fn = callback; #ifdef __EMSCRIPTEN__ emscripten_set_main_loop(_tick, 60, 1); #else @@ -83,13 +82,43 @@ void sw_window_run(struct sw_window *window, void (*callback)()) { #endif } +void sw_window_add_renderer( + struct sw_window *window, struct sw_renderer *renderer, sw_render_cb cb +) { + window->_renderer_count += 1; + renderer->render = cb; + window->_renderers = realloc( + window->_renderers, + sizeof(struct sw_renderer *) * window->_renderer_count + ); + window->_renderers[window->_renderer_count - 1] = renderer; +} + /* private functions */ void _tick() { + u32 i; + sw_gamepad_tick(); glViewport(0, 0, _tick_window->game_size.x, _tick_window->game_size.y); glBindFramebuffer(GL_FRAMEBUFFER, _tick_window->_scaler_fb->_fb); - _tick_fn(); + for(i = 0; i < _tick_window->_renderer_count; ++i) { + struct sw_renderer *renderer; + + renderer = _tick_window->_renderers[i]; + + if(renderer->enter) { + renderer->enter(_tick_window, renderer->data); + } + + if(renderer->render) { + renderer->render(); + } + + if(renderer->exit) { + renderer->exit(_tick_window, renderer->data); + } + } glViewport(0, 0, _tick_window->window_size.x, _tick_window->window_size.y); glBindFramebuffer(GL_FRAMEBUFFER, 0);