From 6ca8cfff2bc5c2417c6c5759ee42554de9e88a0c Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Tue, 10 Nov 2020 18:05:59 -0500 Subject: [PATCH] add renAllocateGroup() --- examples/assimp_loading/main.cpp | 34 ++++++++++++++------------------ include/entity.h | 1 + include/render_object.h | 1 + include/renderer.h | 11 +++++++---- include/shader_program.h | 1 + src/entity.cpp | 22 +++++++++++++++++++-- src/mesh.cpp | 12 +++++------ src/renderer.cpp | 26 ++++++++++++++++++++---- 8 files changed, 73 insertions(+), 35 deletions(-) diff --git a/examples/assimp_loading/main.cpp b/examples/assimp_loading/main.cpp index 74b9aed..28e9b86 100644 --- a/examples/assimp_loading/main.cpp +++ b/examples/assimp_loading/main.cpp @@ -17,7 +17,7 @@ doFrameCallback(render_state* rs) } void -doRenderLoop(render_state* rs, frame_callback_fn callback_fn, entity* entities, uint entity_count) +doRenderLoop(render_state* rs, frame_callback_fn callback_fn) { // TODO: move frame delay to renderFrame() const uint TARGET_FPS = 60; @@ -29,7 +29,8 @@ doRenderLoop(render_state* rs, frame_callback_fn callback_fn, entity* entities, while (running) { frameStart = SDL_GetTicks(); - // TODO: add a better structure for input, and provide a callback to use here + // TODO: add a better structure for input, and provide a callback to use + // here while (SDL_PollEvent(&e)) { if ((e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE) || e.type == SDL_QUIT) { @@ -39,13 +40,6 @@ doRenderLoop(render_state* rs, frame_callback_fn callback_fn, entity* entities, callback_fn(rs); - // TODO: entity pointer and entity count should be stored somewhere on the render_state object - // TODO: render_group should track a group of entity objects. the entity objects - // should keep track of their own render_objects? - /* - * render_group -> entities -> render_object(s) - * -> mesh_info ? - */ renRenderFrame(rs); SDL_GL_SwapWindow(rs->handles.window); frameTime = SDL_GetTicks() - frameStart; @@ -61,13 +55,15 @@ doRenderLoop(render_state* rs, frame_callback_fn callback_fn, entity* entities, int main() { - // TODO: would be nice to be able to pass in viewport_dims, window title here + // TODO: would be nice to be able to pass in viewport_dims, window title + // here render_state* rs = renInit(); meInitAssimp(); - // TODO: entInit() doesn't allocate memory because we want to do the allocation in - // one big block, but this is really clunky to use - entity spaceship; + // TODO: entInit() doesn't allocate memory because we want to do the + // allocation in one big block, but this is really clunky to use + render_group* group_1 = renAllocateGroup(1, *rs->default_shader); + entity spaceship = group_1->entities[0]; // TODO: this should be handled in entInit entSetWorldPosition(spaceship, 0, 0, 0); @@ -83,14 +79,14 @@ main() glm::vec3(0,0,1) ); - // TODO: renderer::setDefaults() allocates 10 lights based on a MACRO in renderer.cpp - // probably need an interface to add more than that - // add a light + // TODO: renderer::setDefaults() allocates 10 lights based on a MACRO in + // renderer.cpp probably need an interface to add more than that add a + // light rs->num_lights = 1; rs->lights[0].position = glm::vec3(200, -150, 150); - // TODO: look into setting up git-annex for large files. git-lfs works fine for gitlab, - // but has no real implementation for self-hosting: + // TODO: look into setting up git-annex for large files. git-lfs works fine + // for gitlab, but has no real implementation for self-hosting: // https://github.com/git-lfs/git-lfs/issues/1044 // https://git-annex.branchable.com/ // @@ -98,7 +94,7 @@ main() logDebugAnimationInfo("../data/spaceship.glb"); if (entInit(spaceship, "../data/spaceship.glb")) - doRenderLoop(rs, doFrameCallback, &spaceship, 1); + doRenderLoop(rs, doFrameCallback); else LOG(Error) << "Error initializing entity, exiting\n"; diff --git a/include/entity.h b/include/entity.h index 262a576..1b20b7e 100644 --- a/include/entity.h +++ b/include/entity.h @@ -32,6 +32,7 @@ bool entInit(entity& e, const char* model_path); void entFree(entity& e); +// TODO: just use glm::vec3 here also void entSetWorldPosition(entity& e, float x, float y, float z); void entTranslate(entity& e, glm::vec3 v); diff --git a/include/render_object.h b/include/render_object.h index e601a23..ab1033a 100644 --- a/include/render_object.h +++ b/include/render_object.h @@ -16,6 +16,7 @@ struct render_object GLuint index_buffer_id; }; +// TODO: make use of glIsBuffer/glDeleteBuffers void roFree(render_object* ro); // TODO: implement me! diff --git a/include/renderer.h b/include/renderer.h index b2388c4..8fd60b2 100644 --- a/include/renderer.h +++ b/include/renderer.h @@ -30,7 +30,6 @@ struct point_light float intensity; }; -/* // NOTE: array of entities rendered with the same shader program struct render_group { @@ -39,7 +38,6 @@ struct render_group shader_program shader; }; -*/ struct render_state { @@ -49,8 +47,10 @@ struct render_state camera cam; util_RGBA clear_col; - //render_group* render_groups; - //uint render_group_count; + render_group** render_groups; + uint render_group_count; + + shader_program* default_shader; point_light* lights; uint num_lights; @@ -61,5 +61,8 @@ render_state* renInit(); void renShutdown(render_state* rs); +render_group* +renAllocateGroup(uint entity_count, shader_program shader); + void renRenderFrame(render_state* rs); diff --git a/include/shader_program.h b/include/shader_program.h index 806941a..be46672 100644 --- a/include/shader_program.h +++ b/include/shader_program.h @@ -20,3 +20,4 @@ struct shader_program shader_program* shaderInit(const char* vertex_code, const char* frag_code); +// TODO: make use of glDeleteShader/glDeleteProgram in eg) shaderFree() diff --git a/src/entity.cpp b/src/entity.cpp index 9558154..c76879c 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -5,19 +5,27 @@ #include "entity.h" +// forward declarations + +bool loadMeshIntoGL(entity& e); #if 0 bool initEntityROs(entity& e); bool convertMeshInfo(meMeshInfo* mesh, render_object* ro, bool use_normals, bool use_texture); #endif + +// interface + bool entInit(entity& e, const char* model_path) { e.world_transform = glm::mat4(1.0); entScale(e, glm::vec3(1.0)); + entSetWorldPosition(e, 0, 0, 0); - if (meLoadFromFile(e.mesh_group, model_path)) { - entSetWorldPosition(e, 0, 0, 0); + if (meLoadFromFile(e.mesh_group, model_path) + && loadMeshIntoGL(e)) + { #if 0 initEntityRG(e, shader, e.mesh_group.use_normals); @@ -64,6 +72,16 @@ entScale(entity& e, glm::vec3 v) e.world_transform = glm::scale(e.world_transform, v); } + +// internal + +bool +loadMeshIntoGL(entity& e) +{ + LOG(Error) << "TODO: redo GL init for new render_object\n"; + return false; +} + #if 0 void initEntityRG(entity& e, rg_shader_program& shader, bool use_normals) diff --git a/src/mesh.cpp b/src/mesh.cpp index 248797f..bb6e406 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -60,12 +60,12 @@ meLoadFromFile(meMeshGroup& mesh_group, const char* filepath) if (!mesh->HasTextureCoords(0) || !loadDiffuseTexture(scene, mesh, mi)) - { - LOG(Error) << "Error loading texture, cleaning up import\n"; - freeMesh(mi); - aiReleaseImport(scene); - return false; - } + { + LOG(Error) << "Error loading texture, cleaning up import\n"; + freeMesh(mi); + aiReleaseImport(scene); + return false; + } mesh_group.meshes[i] = mi; } diff --git a/src/renderer.cpp b/src/renderer.cpp index 578b7d8..f8e7a40 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -48,11 +48,19 @@ renInit() initContext(rs->handles) && initGlOptions()) { - return rs; - } else { - LOG(Error) << "renderer initialization failed, aborting\n"; - return nullptr; + rs->default_shader = + shaderInit(DEFAULT_VERTEX_SHADER, DEFAULT_FRAGMENT_SHADER); + + if (rs->default_shader != nullptr) { + return rs; + } else { + LOG(Error) << "shader loading failed\n"; + return nullptr; + } } + + LOG(Error) << "renderer initialization failed, aborting\n"; + return nullptr; } void @@ -64,6 +72,16 @@ renShutdown(render_state* rs) SDL_Quit(); } +render_group* +renAllocateGroup(uint entity_count, shader_program shader) +{ + assert(entity_count > 0); + render_group* rg = UTIL_ALLOC(1, render_group); + rg->entities = UTIL_ALLOC(entity_count, entity); + rg->shader = shader; + return rg; +} + void renRenderFrame(render_state* rs) {