summaryrefslogtreecommitdiff
path: root/source/sdlmain.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/sdlmain.cpp')
-rw-r--r--source/sdlmain.cpp187
1 files changed, 132 insertions, 55 deletions
diff --git a/source/sdlmain.cpp b/source/sdlmain.cpp
index 372758a..bc269c9 100644
--- a/source/sdlmain.cpp
+++ b/source/sdlmain.cpp
@@ -18,14 +18,16 @@
#endif
// GAME LIBRARY FUNCTIONS
+typedef void (*GameInit)(GameState*);
+typedef void (*GameShaderInitUniforms)(GameState*);
typedef void (*GameHandleEvent)(GameState*, GameEventType);
-typedef void (*GameSetup)(GameState*);
typedef void (*GameUpdateAndRender)(GameState*);
struct GameLayer {
void *lib;
+ GameInit init;
+ GameShaderInitUniforms shader_init_uniforms;
GameHandleEvent handle_event;
- GameSetup setup;
GameUpdateAndRender update_and_render;
};
internal GameLayer game_layer;
@@ -40,12 +42,15 @@ bool load_game_layer()
if (game_layer.lib == NULL) {
return false;
}
+ game_layer.init =
+ (GameInit)SDL_LoadFunction(game_layer.lib,
+ "game_init");
+ game_layer.shader_init_uniforms =
+ (GameShaderInitUniforms)SDL_LoadFunction(game_layer.lib,
+ "game_shader_init_uniforms");
game_layer.handle_event =
(GameHandleEvent)SDL_LoadFunction(game_layer.lib,
"game_handle_event");
- game_layer.setup =
- (GameSetup)SDL_LoadFunction(game_layer.lib,
- "game_setup");
game_layer.update_and_render =
(GameUpdateAndRender)SDL_LoadFunction(game_layer.lib,
"game_update_and_render");
@@ -53,19 +58,6 @@ bool load_game_layer()
return true;
}
-bool game_file_update(fswatcher_event_handler *handler,
- fswatcher_event_type evtype,
- const char *src,
- const char *dst) {
- return load_game_layer();
-}
-
-//bool game_shader_update(fswatcher_event_handler *handler,
-// fswatcher_event_type evtype,
-// const char *src,
-// const char *dst) {
-//}
-
u32 gl_shader_program(char *vs, char *fs)
{
//==============
@@ -166,8 +158,112 @@ u32 gl_shader_program_from_path(const char *vspath, const char *fspath)
return shader_program;
}
+void setup_shaders(GameState *state, bool reinit=false) {
+ if (reinit) {
+ // we have to delete previous state
+ glDeleteVertexArrays(1, &state->triangle_vao);
+ glDeleteBuffers(1, &state->triangle_vbo);
+ glDeleteProgram(state->triangle_sp);
+
+ glDeleteVertexArrays(1, &state->line_vao);
+ glDeleteBuffers(1, &state->line_vbo);
+ glDeleteProgram(state->line_sp);
+ }
+ // triangle shader program
+ u32 triangle_shader_program = gl_shader_program_from_path("./shaders/quad.vs.glsl",
+ "./shaders/quad.fs.glsl");
+
+ state->triangle_sp = triangle_shader_program;
+ glUseProgram(state->triangle_sp);
+
+ // @func: gl_setup_triangle
+ {
+ GLfloat vertices[9] = {
+ -0.5f, -0.5f, 0.0f,
+ 0.5f, -0.5f, 0.0f,
+ 0.0f, 0.5f, 0.0f
+ };
+
+ GLuint VBO, VAO;
+ glGenVertexArrays(1, &VAO);
+ glGenBuffers(1, &VBO);
+
+ glBindVertexArray(VAO);
+
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
+ glEnableVertexAttribArray(0);
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindVertexArray(0);
+
+ state->triangle_vao = VAO;
+ state->triangle_vbo = VBO;
+ }
+ glUseProgram(0);
+
+ // line shader program
+ u32 line_shader_program = gl_shader_program_from_path("./shaders/quad.vs.glsl",
+ "./shaders/quad.fs.glsl");
+ state->line_sp = line_shader_program;
+ glUseProgram(state->line_sp);
+
+ // @func: gl_setup_line
+ {
+ GLfloat vertices[12] = {
+ -0.5f, 0.5f, 0.0f,
+ 0.5f, 0.5f, 0.0f,
+ -0.5f, -0.5f, 0.0f,
+ 0.5f, -0.5f, 0.0f,
+ };
+
+ GLuint VBO, VAO;
+ glGenVertexArrays(1, &VAO);
+ glGenBuffers(1, &VBO);
+
+ glBindVertexArray(VAO);
+
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);
+
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
+ glEnableVertexAttribArray(0);
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindVertexArray(0);
+
+ state->line_vao = VAO;
+ state->line_vbo = VBO;
+
+ }
+}
+
+bool game_file_update(fswatcher_event_handler *handler,
+ fswatcher_event_type evtype,
+ const char *src,
+ const char *dst) {
+ GameState *state = (GameState*)handler->custom_data;
+ load_game_layer();
+ game_layer.init(state);
+ return 1;
+}
+
+bool shader_file_update(fswatcher_event_handler *handler,
+ fswatcher_event_type evtype,
+ const char *src,
+ const char *dst) {
+ GameState *state = (GameState*)handler->custom_data;
+ setup_shaders(state, true);
+ game_layer.shader_init_uniforms(state);
+ return 1;
+}
+
int main(int argc, char *argv[])
{
+ GameState state = {};
+
i32 raw_width = 1920;
i32 raw_height = 1080;
i32 dpi_width;
@@ -177,8 +273,6 @@ int main(int argc, char *argv[])
i32 width;
i32 height;
- GameState state = {};
-
if (SDL_Init(SDL_INIT_VIDEO) != 0)
{
printf("Error initialising SDL2: %s\n", SDL_GetError());
@@ -225,52 +319,29 @@ int main(int argc, char *argv[])
SDL_GL_SetSwapInterval(1);
- u32 shader_program = gl_shader_program_from_path("./shaders/quad.vs.glsl",
- "./shaders/quad.fs.glsl");
-
- state.triangle_sp = shader_program;
- glUseProgram(state.triangle_sp);
-
- // @func: gl_setup_triangle
- {
- GLfloat vertices[9] = {
- -0.5f, -0.5f, 0.0f,
- 0.5f, -0.5f, 0.0f,
- 0.0f, 0.5f, 0.0f
- };
-
- GLuint VBO, VAO;
- glGenVertexArrays(1, &VAO);
- glGenBuffers(1, &VBO);
-
- glBindVertexArray(VAO);
-
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
-
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
- glEnableVertexAttribArray(0);
-
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindVertexArray(0);
-
- state.triangle_vao = VAO;
- state.triangle_vbo = VBO;
- }
- glUseProgram(0);
+ setup_shaders(&state);
+ // add shader watcher
+ fswatcher_t shader_watcher = fswatcher_create(FSWATCHER_CREATE_DEFAULT,
+ FSWATCHER_EVENT_MODIFY,
+ "shaders", NULL);
+ fswatcher_event_handler shader_file_update_handler;
+ shader_file_update_handler.callback = shader_file_update;
+ shader_file_update_handler.custom_data = &state;
// add file watcher
fswatcher_t game_watcher = fswatcher_create(FSWATCHER_CREATE_DEFAULT,
FSWATCHER_EVENT_MODIFY,
"source/game", NULL);
fswatcher_event_handler game_file_update_handler;
game_file_update_handler.callback = game_file_update;
+ game_file_update_handler.custom_data = &state;
// load game layer
if (!load_game_layer()) {
return -1;
}
- game_layer.setup(&state);
+ game_layer.init(&state);
+ game_layer.shader_init_uniforms(&state);
for(;;)
{
@@ -296,16 +367,22 @@ int main(int argc, char *argv[])
}
}
fswatcher_poll(game_watcher, &game_file_update_handler, NULL);
+ fswatcher_poll(shader_watcher, &shader_file_update_handler, NULL);
- // opengl rendering code here
game_layer.update_and_render(&state);
+
SDL_GL_SwapWindow(window);
}
// filewatcher
fswatcher_destroy(game_watcher);
+ fswatcher_destroy(shader_watcher);
// opengl free calls
+ glDeleteVertexArrays(1, &state.line_vao);
+ glDeleteBuffers(1, &state.line_vbo);
+ glDeleteProgram(state.line_sp);
+
glDeleteVertexArrays(1, &state.triangle_vao);
glDeleteBuffers(1, &state.triangle_vbo);
glDeleteProgram(state.triangle_sp);