From e7f80875d26c4eca43866725b291b4cf1e482bcd Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Tue, 15 Dec 2020 13:36:59 -0500 Subject: [PATCH] make SDL_Handles an opaque pointer for render_state --- include/renderer.h | 19 +++++++++++-------- src/renderer.cpp | 44 ++++++++++++++++++++++++++++---------------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/include/renderer.h b/include/renderer.h index 08dd84a..e1905ad 100644 --- a/include/renderer.h +++ b/include/renderer.h @@ -16,13 +16,6 @@ #include "shader_program.h" -struct SDL_Handles -{ - SDL_Window *window; - SDL_GLContext glContext; - SDL_DisplayMode currentDisplayMode; -}; - // NOTE: array of entities rendered with the same shader program struct render_group { @@ -31,14 +24,24 @@ struct render_group uint entity_count; shader_wrapper shader; + + // TODO: does it makes sense to have the mesh_type stored on the + // render_group? can then easily pass to roDraw() along with the entity + // render_objects... + // only the mesh object and render object really need to know about the + // mesh_type... + // + //mesh_t mesh_type; }; +struct SDL_Handles; + struct render_state { glm::vec2 viewport_dims; - SDL_Handles handles; camera cam; util_RGBA clear_col; + SDL_Handles* handles; // TODO: this really needs to be a resizable array, or linked list, or // ...gasp, std::vector diff --git a/src/renderer.cpp b/src/renderer.cpp index c412d93..88aa7d5 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -25,12 +25,20 @@ // forward declarations + +struct SDL_Handles +{ + SDL_Window *window; + SDL_GLContext glContext; + SDL_DisplayMode currentDisplayMode; +}; + bool createWindow(const char* title, - SDL_Handles& handles, + SDL_Handles* handles, glm::vec2& viewport_dims); -bool initContext(SDL_Handles& handles); +bool initContext(SDL_Handles* handles); bool initGlOptions(); -bool initSDL(SDL_Handles& handles); +bool initSDL(SDL_Handles* handles); bool initShaders(render_state* rs); void openglDebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); @@ -43,6 +51,7 @@ render_state* renInit(const char* title, glm::vec2 viewport_dims) { render_state* rs = UTIL_ALLOC(1, render_state); + rs->handles = UTIL_ALLOC(1, SDL_Handles); setDefaults(rs, viewport_dims); if (initSDL(rs->handles) && @@ -75,9 +84,10 @@ renShutdown(render_state* rs) utilSafeFree(rs->render_groups); utilSafeFree(rs->default_shader); meShutdownAssimp(); - SDL_GL_DeleteContext(rs->handles.glContext); - SDL_DestroyWindow(rs->handles.window); + SDL_GL_DeleteContext(rs->handles->glContext); + SDL_DestroyWindow(rs->handles->window); SDL_Quit(); + utilSafeFree(rs->handles); } render_group* @@ -112,7 +122,7 @@ renDoRenderLoop(render_state* rs, uint framerate, frame_callback_fn cb_func) if (cb_func != nullptr) cb_func(rs); renRenderFrame(rs); - SDL_GL_SwapWindow(rs->handles.window); + SDL_GL_SwapWindow(rs->handles->window); frameTime = SDL_GetTicks() - frameStart; if (delay > frameTime) @@ -132,7 +142,7 @@ renRenderFrame(render_state* rs) for (uint i = 0; i < rs->render_group_count; i++) { render_group& rg = rs->render_groups[i]; - if (rg.shader.type == SIMPLE_SHADER) { + if (rg.shader.shader_type == SIMPLE_SHADER) { for (uint j = 0; j < rg.entity_count; j++) { entity& e = rg.entities[j]; @@ -143,7 +153,8 @@ renRenderFrame(render_state* rs) } } - if (rg.shader.type == DEFAULT_SHADER) { +#if 0 + if (rg.shader.shader_type == DEFAULT_SHADER) { for (uint j = 0; j < rg.entity_count; j++) { entity& e = rg.entities[j]; @@ -155,6 +166,7 @@ renRenderFrame(render_state* rs) } } } +#endif } } @@ -173,13 +185,13 @@ renAddLight(render_state* rs, glm::vec3 pos, glm::vec3 color, float intensity) // internal bool -createWindow(const char* title, SDL_Handles& handles, glm::vec2& viewport_dims) +createWindow(const char* title, SDL_Handles* handles, glm::vec2& viewport_dims) { uint display_id = 0; if (USE_SECOND_MONITOR && SDL_GetNumVideoDisplays() > 1) display_id = 1; - handles.window = SDL_CreateWindow( + handles->window = SDL_CreateWindow( title, SDL_WINDOWPOS_CENTERED_DISPLAY(display_id), SDL_WINDOWPOS_CENTERED_DISPLAY(display_id), @@ -188,7 +200,7 @@ createWindow(const char* title, SDL_Handles& handles, glm::vec2& viewport_dims) SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE ); - if (!handles.window) { + if (!handles->window) { LOG(Error) << "Error creating window: " << SDL_GetError() << "\n"; return false; } @@ -197,11 +209,11 @@ createWindow(const char* title, SDL_Handles& handles, glm::vec2& viewport_dims) } bool -initContext(SDL_Handles& handles) +initContext(SDL_Handles* handles) { - handles.glContext = SDL_GL_CreateContext(handles.window); + handles->glContext = SDL_GL_CreateContext(handles->window); - if (!handles.glContext) { + if (!handles->glContext) { LOG(Error) << "Error creating glContext: " << SDL_GetError() << "\n"; return false; } @@ -247,7 +259,7 @@ initGlOptions() } bool -initSDL(SDL_Handles& handles) +initSDL(SDL_Handles* handles) { if (SDL_Init(SDL_INIT_VIDEO) != 0) { LOG(Error) << "Error, SDL_Init: " << SDL_GetError() << "\n"; @@ -261,7 +273,7 @@ initSDL(SDL_Handles& handles) SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); - SDL_GetCurrentDisplayMode(0, &handles.currentDisplayMode); + SDL_GetCurrentDisplayMode(0, &handles->currentDisplayMode); return true; }