From 9044db4794e95ef9dbc2d5bfde4215ddc82d6ae8 Mon Sep 17 00:00:00 2001 From: talha Date: Mon, 29 Dec 2025 13:45:53 +0500 Subject: added 2d "meshes" --- source/sdlmain.cpp | 187 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 132 insertions(+), 55 deletions(-) (limited to 'source/sdlmain.cpp') 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); -- cgit v1.2.3