diff --git a/examples/assimp_loading/main.cpp b/examples/assimp_loading/main.cpp index 22bd60b..0c39c4a 100644 --- a/examples/assimp_loading/main.cpp +++ b/examples/assimp_loading/main.cpp @@ -68,7 +68,6 @@ main() rs->render_group_count = 1; entity& spaceship = rs->render_groups->entities[0]; - // setup camera cameraInitPerspective( rs->cam, glm::vec3(200, -150, 150), @@ -76,11 +75,7 @@ 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 - rs->num_lights = 1; - rs->lights[0].position = glm::vec3(200, -150, 150); + renAddLight(rs, 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: diff --git a/include/lights.h b/include/lights.h index d317449..deba1ac 100644 --- a/include/lights.h +++ b/include/lights.h @@ -1,6 +1,11 @@ #pragma once +#include + +#include "shader_program.h" +#include "util.h" + struct point_light { uint light_ID; @@ -9,3 +14,20 @@ struct point_light float intensity; }; +struct light_group +{ + point_light* lights; + uint num_lights; + uint max_lights; + bool needs_update; +}; + +light_group* lightsInit(uint max_lights = 10); + +void lightsOut(light_group* lights); + +bool +lightsAdd(light_group* lights, glm::vec3 pos, glm::vec3 color, float intensity); + +void lightsUpdate(light_group* lights, shader_program* shader); + diff --git a/include/render_object.h b/include/render_object.h index b1345c3..c582330 100644 --- a/include/render_object.h +++ b/include/render_object.h @@ -29,5 +29,4 @@ void roFree(render_object& ro); void roDraw(render_object& ro, camera& cam, shader_program& shader, - point_light* lights, - uint num_lights); + light_group* lights); diff --git a/include/renderer.h b/include/renderer.h index a8b611c..c6b9ae8 100644 --- a/include/renderer.h +++ b/include/renderer.h @@ -35,7 +35,6 @@ struct render_group struct render_state { glm::vec2 viewport_dims; - bool is_debug_draw; SDL_Handles handles; camera cam; util_RGBA clear_col; @@ -46,10 +45,7 @@ struct render_state uint render_group_count; shader_program* default_shader; - - point_light* lights; - uint num_lights; - uint max_lights; + light_group* lights; }; render_state* @@ -63,3 +59,9 @@ renAllocateGroup(uint entity_count, shader_program shader); void renRenderFrame(render_state* rs); +bool +renAddLight(render_state* rs, + glm::vec3 pos = glm::vec3(0, 0, 0), + glm::vec3 color = glm::vec3(1, 1, 1), + float intensity = 1.0); + diff --git a/src/lights.cpp b/src/lights.cpp new file mode 100644 index 0000000..6e2fb51 --- /dev/null +++ b/src/lights.cpp @@ -0,0 +1,54 @@ + +#include "lights.h" + + +light_group* +lightsInit(uint max_lights) +{ + light_group* lg = UTIL_ALLOC(1, light_group); + lg->lights = UTIL_ALLOC(max_lights, point_light); + return lg; +} + +void +lightsOut(light_group* lights) +{ + utilSafeFree(lights->lights); + utilSafeFree(lights); +} + +bool +lightsAdd(light_group* lights, glm::vec3 pos, glm::vec3 color, float intensity) +{ + return false; +} + +void +lightsUpdate(light_group* lights, shader_program* shader) +{ + // set shader max_lights uniform to match.. +} + +#if 0 +#include + +inline void +updateLights(shader_program& shader, point_light* lights, uint num_lights) +{ + // TODO: use Uniform Buffer Objects to update light data + // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_uniform_buffer_object.txt + // https://www.khronos.org/opengl/wiki/Uniform_Buffer_Objects + + glUniform1ui(shader.num_lights_id, num_lights); + + for (uint i = 0; i < num_lights; i++) { + // TODO: don't do this every frame * every render_group + std::stringstream ss; + ss << "lights[" << i << "].position"; + int light_pos_loc = glGetUniformLocation(shader.program_id, ss.str().c_str()); + + glUniform3fv(light_pos_loc, 1, &lights[i].position[0]); + } +} +#endif + diff --git a/src/render_object.cpp b/src/render_object.cpp index b1d3487..199bd97 100644 --- a/src/render_object.cpp +++ b/src/render_object.cpp @@ -13,8 +13,6 @@ bool initGLTexture(const util_image image, GLuint& tex_id); inline void updateMatrices(shader_program& shader, camera& cam, glm::mat4 node_xform); inline void enableGLFloatBuffer(uint buffer_id, uint location); -inline void -updateLights(shader_program& shader, point_light* lights, uint num_lights); // interface @@ -60,20 +58,21 @@ void roDraw(render_object& ro, camera& cam, shader_program& shader, - point_light* lights, - uint num_lights) + light_group* lights) { glUseProgram(shader.program_id); updateMatrices(shader, cam, ro.node_xform); enableGLFloatBuffer(ro.vertex_buffer_id, 0); enableGLFloatBuffer(ro.normal_buffer_id, 1); - updateLights(shader, lights, num_lights); // TODO: could pass in a stride parameter here to enableGLFloatBuffer() // could then use a 2d buffer for uv coords enableGLFloatBuffer(ro.uv_buffer_id, 2); glBindTexture(GL_TEXTURE_2D, ro.tex_id); glUniform1i(shader.sampler_id, 0); + if (lights->needs_update) + lightsUpdate(lights, &shader); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ro.index_buffer_id); glDrawElements(GL_TRIANGLES, ro.index_buffer_count, GL_UNSIGNED_INT, 0); @@ -148,24 +147,3 @@ enableGLFloatBuffer(uint buffer_id, uint location) glVertexAttribPointer(location, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0); } -#include - -inline void -updateLights(shader_program& shader, point_light* lights, uint num_lights) -{ - // TODO: use Uniform Buffer Objects to update light data - // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_uniform_buffer_object.txt - // https://www.khronos.org/opengl/wiki/Uniform_Buffer_Objects - - glUniform1ui(shader.num_lights_id, num_lights); - - for (uint i = 0; i < num_lights; i++) { - // TODO: don't do this every frame * every render_group - std::stringstream ss; - ss << "lights[" << i << "].position"; - int light_pos_loc = glGetUniformLocation(shader.program_id, ss.str().c_str()); - - glUniform3fv(light_pos_loc, 1, &lights[i].position[0]); - } -} - diff --git a/src/renderer.cpp b/src/renderer.cpp index 4eb7b53..4146d6a 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -84,9 +84,9 @@ renShutdown(render_state* rs) } shaderFree(rs->default_shader); + lightsOut(rs->lights); utilSafeFree(rs->render_groups); utilSafeFree(rs->default_shader); - utilSafeFree(rs->lights); SDL_GL_DeleteContext(rs->handles.glContext); SDL_DestroyWindow(rs->handles.window); SDL_Quit(); @@ -119,13 +119,18 @@ renRenderFrame(render_state* rs) roDraw(e.render_objs[k], rs->cam, rg.shader, - rs->lights, - rs->num_lights); + rs->lights); } } } } +bool +renAddLight(render_state* rs, glm::vec3 pos, glm::vec3 color, float intensity) +{ + return lightsAdd(rs->lights, pos, color, intensity); +} + // internal @@ -238,8 +243,7 @@ void setDefaults(render_state* rs, glm::vec2 viewport_dims) { rs->viewport_dims = viewport_dims; - rs->max_lights = MAX_LIGHTS; - rs->lights = UTIL_ALLOC(rs->max_lights, point_light); + rs->lights = lightsInit(); rs->clear_col.R = CLEAR_COL_R; rs->clear_col.B = CLEAR_COL_B; rs->clear_col.G = CLEAR_COL_G;