From 81cb24a2d8fd4146d779c2f4b8722ed1c276f946 Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Sun, 20 Dec 2020 12:21:46 -0500 Subject: [PATCH] don't forget to free meshes and shaders --- README.txt | 10 ++++++++++ include/entity.h | 1 + include/mesh.h | 2 +- include/renderer.h | 1 + src/entity.cpp | 3 +++ src/mesh.cpp | 14 +++++++------- src/renderer.cpp | 7 +++++-- src/shader_program.cpp | 3 ++- 8 files changed, 30 insertions(+), 11 deletions(-) diff --git a/README.txt b/README.txt index 1d3b30d..c783b70 100644 --- a/README.txt +++ b/README.txt @@ -4,6 +4,16 @@ Tangerine A small OpenGL 3+ renderer and game engine NOTE: This is still a work in progress +Features: + vertices + pixels + +TODO: + finish node animations from assimp + add input abstraction for SDL + store meshes separately from entities for reuse + add a function to update camera transforms only once per frame, per shader + Dependencies: assimp glew diff --git a/include/entity.h b/include/entity.h index 642834e..ba65c3a 100644 --- a/include/entity.h +++ b/include/entity.h @@ -15,6 +15,7 @@ struct entity { glm::mat4 world_transform; + // TODO: hide simple_mesh/mesh_group pointer behind abstraction simple_mesh* mesh; // TODO: should be a pointer into a global array of mesh_info(s) or diff --git a/include/mesh.h b/include/mesh.h index 72cc7bf..7dbd2e7 100644 --- a/include/mesh.h +++ b/include/mesh.h @@ -58,7 +58,7 @@ void meFreeMeshGroup(mesh_group& mesh_group); void -meFreeSimpleMesh(simple_mesh& mesh); +meFreeSimpleMesh(simple_mesh* mesh); void meShutdownAssimp(); diff --git a/include/renderer.h b/include/renderer.h index a0693b3..1fda5d4 100644 --- a/include/renderer.h +++ b/include/renderer.h @@ -48,6 +48,7 @@ struct render_state render_group* render_groups; uint render_group_count; + // TODO: hide shaders behind a better abstraction than 'shader_wrapper' default_shader_program* default_shader; simple_shader_program* simple_shader; diff --git a/src/entity.cpp b/src/entity.cpp index b95bb85..35791fe 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -50,6 +50,9 @@ entFree(entity& e) { roFree(e.render_objs); e.render_objs = nullptr; + meFreeMeshGroup(e.meshes); + meFreeSimpleMesh(e.mesh); + e.mesh = nullptr; } void diff --git a/src/mesh.cpp b/src/mesh.cpp index b51c96a..d34f4d0 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -14,7 +14,7 @@ // forward declarations -// + mesh_info* allocateMeshInfo(uint num_vertices, uint num_indices); void assimpLogCB(const char* message, char* user); mesh_info* copyMeshInfo(const aiScene* scene, aiMesh* mesh); @@ -92,13 +92,13 @@ meFreeMeshGroup(mesh_group& mesh_group) } void -meFreeSimpleMesh(simple_mesh& mesh) +meFreeSimpleMesh(simple_mesh* mesh) { - utilSafeFree(mesh.vertices); - mesh.vertices = nullptr; - utilSafeFree(mesh.vert_colors); - mesh.vert_colors = nullptr; - mesh.num_vertices = 0; + utilSafeFree(mesh->vertices); + mesh->vertices = nullptr; + utilSafeFree(mesh->vert_colors); + mesh->vert_colors = nullptr; + mesh->num_vertices = 0; } void diff --git a/src/renderer.cpp b/src/renderer.cpp index 7d0f7c7..b30506a 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -16,7 +16,6 @@ #include "renderer.h" #include "default_shaders.cpp" -#define MAX_LIGHTS 10 // NOTE: needs to match the fragment shader source #define CLEAR_COL_R 55.f / 255.f #define CLEAR_COL_G 55.f / 255.f #define CLEAR_COL_B 55.f / 255.f @@ -79,10 +78,14 @@ renShutdown(render_state* rs) } shaderFree(rs->default_shader->program_id); + utilSafeFree(rs->default_shader); + rs->default_shader = nullptr; shaderFree(rs->simple_shader->program_id); + utilSafeFree(rs->simple_shader); + rs->simple_shader = nullptr; + lightsOut(rs->lights); utilSafeFree(rs->render_groups); - utilSafeFree(rs->default_shader); meShutdownAssimp(); SDL_GL_DeleteContext(rs->handles->glContext); SDL_DestroyWindow(rs->handles->window); diff --git a/src/shader_program.cpp b/src/shader_program.cpp index ce7f05c..ef15f7f 100644 --- a/src/shader_program.cpp +++ b/src/shader_program.cpp @@ -43,6 +43,7 @@ shaderInitDefault(const char* vertex_code, const char* frag_code) if (!checkShaderErrors(sp->program_id)) { glDeleteProgram(sp->program_id); + utilSafeFree(sp); return nullptr; } @@ -56,7 +57,6 @@ shaderInitSimple(const char* vertex_code, const char* frag_code) GLuint vs_id = 0; GLuint fs_id = 0; compileProgram(sp->program_id, vs_id, fs_id, vertex_code, frag_code); - // TODO: add to compile program? glGenVertexArrays(1, &sp->vertex_array_id); glBindVertexArray(sp->vertex_array_id); @@ -67,6 +67,7 @@ shaderInitSimple(const char* vertex_code, const char* frag_code) if (!checkShaderErrors(sp->program_id)) { glDeleteProgram(sp->program_id); + utilSafeFree(sp); return nullptr; }