added renderer system and ported gsa to it
This commit is contained in:
parent
42d712a26b
commit
2150ea5769
|
@ -1,5 +1,5 @@
|
||||||
@ECHO OFF
|
@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%
|
EXIT /B %ERRORLEVEL%
|
||||||
|
|
||||||
|
|
|
@ -19,25 +19,8 @@ void fade_palette(f32 amount) {
|
||||||
|
|
||||||
bool tick_fade_in();
|
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() {
|
void init() {
|
||||||
i32 x, y;
|
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);
|
gsa_copy_palette_to(pal);
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
|
@ -2,6 +2,7 @@
|
||||||
#define GUARD_F247452E0BF1EC9CD9131C2A6FD281CA
|
#define GUARD_F247452E0BF1EC9CD9131C2A6FD281CA
|
||||||
|
|
||||||
#include "framebuffer.h"
|
#include "framebuffer.h"
|
||||||
|
#include "renderer.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "vec2i.h"
|
#include "vec2i.h"
|
||||||
|
|
||||||
|
@ -14,10 +15,16 @@ struct sw_window {
|
||||||
|
|
||||||
struct GLFWwindow *_window;
|
struct GLFWwindow *_window;
|
||||||
struct sw_framebuffer *_scaler_fb;
|
struct sw_framebuffer *_scaler_fb;
|
||||||
|
|
||||||
|
struct sw_renderer **_renderers;
|
||||||
|
u32 _renderer_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sw_window *sw_window_create(struct sw_vec2i size, char *title);
|
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 */
|
#endif /* GUARD_F247452E0BF1EC9CD9131C2A6FD281CA */
|
||||||
|
|
|
@ -2,9 +2,11 @@
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "gl.h"
|
#include "gl.h"
|
||||||
#include "image8.h"
|
#include "image8.h"
|
||||||
|
#include "renderer.h"
|
||||||
#include "shader.h"
|
#include "shader.h"
|
||||||
#include "skip.h"
|
#include "skip.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
#include "window.h"
|
||||||
#include <gl/gl.h>
|
#include <gl/gl.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#define GSA_NOMAIN
|
#define GSA_NOMAIN
|
||||||
|
@ -112,7 +114,8 @@ int gsa_main(int argc, char *argv[]) {
|
||||||
|
|
||||||
sw_log("gsa setup done");
|
sw_log("gsa setup done");
|
||||||
init();
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
#include "renderer.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
|
@ -1,7 +1,3 @@
|
||||||
#include "renderer2d.h"
|
#include "renderer2d.h"
|
||||||
|
|
||||||
static char *shader_vert = "\
|
|
||||||
\
|
|
||||||
";
|
|
||||||
|
|
||||||
struct sw_renderer2d *sw_renderer2d_create(){};
|
struct sw_renderer2d *sw_renderer2d_create(){};
|
||||||
|
|
41
src/window.c
41
src/window.c
|
@ -14,7 +14,6 @@
|
||||||
|
|
||||||
static void _tick();
|
static void _tick();
|
||||||
static struct sw_window *_tick_window;
|
static struct sw_window *_tick_window;
|
||||||
static void (*_tick_fn)();
|
|
||||||
static void win_callback(GLFWwindow *glfw_win, i32 width, i32 height);
|
static void win_callback(GLFWwindow *glfw_win, i32 width, i32 height);
|
||||||
|
|
||||||
#ifndef __EMSCRIPTEN__
|
#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 *sw_window_create(struct sw_vec2i size, char *title) {
|
||||||
struct sw_window *win;
|
struct sw_window *win;
|
||||||
|
|
||||||
sw_init();
|
|
||||||
|
|
||||||
win = malloc(sizeof(struct sw_window));
|
win = malloc(sizeof(struct sw_window));
|
||||||
win->window_size = size;
|
win->window_size = size;
|
||||||
win->game_size = size;
|
win->game_size = size;
|
||||||
|
|
||||||
|
win->_renderer_count = 0;
|
||||||
|
win->_renderers = 0;
|
||||||
|
|
||||||
sw_log("init glfw");
|
sw_log("init glfw");
|
||||||
glfwInit();
|
glfwInit();
|
||||||
glfwDefaultWindowHints();
|
glfwDefaultWindowHints();
|
||||||
|
@ -70,10 +70,9 @@ struct sw_window *sw_window_create(struct sw_vec2i size, char *title) {
|
||||||
return win;
|
return win;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sw_window_run(struct sw_window *window, void (*callback)()) {
|
void sw_window_run(struct sw_window *window) {
|
||||||
sw_log("run window");
|
sw_log("run window");
|
||||||
_tick_window = window;
|
_tick_window = window;
|
||||||
_tick_fn = callback;
|
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
emscripten_set_main_loop(_tick, 60, 1);
|
emscripten_set_main_loop(_tick, 60, 1);
|
||||||
#else
|
#else
|
||||||
|
@ -83,13 +82,43 @@ void sw_window_run(struct sw_window *window, void (*callback)()) {
|
||||||
#endif
|
#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 */
|
/* private functions */
|
||||||
|
|
||||||
void _tick() {
|
void _tick() {
|
||||||
|
u32 i;
|
||||||
|
|
||||||
sw_gamepad_tick();
|
sw_gamepad_tick();
|
||||||
glViewport(0, 0, _tick_window->game_size.x, _tick_window->game_size.y);
|
glViewport(0, 0, _tick_window->game_size.x, _tick_window->game_size.y);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, _tick_window->_scaler_fb->_fb);
|
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);
|
glViewport(0, 0, _tick_window->window_size.x, _tick_window->window_size.y);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
|
Loading…
Reference in New Issue