From 90a3fe7bad08002ecc0f54d156ae47bb66862103 Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Mon, 7 Feb 2022 09:11:19 -0500 Subject: [PATCH] update example appliction to use the recent LightsBuffer changes --- src/main.cpp | 117 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 46 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 8770206..488ec86 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,37 +1,39 @@ #include +#include + +#include #include "tangerine.h" bool -initLights(RenderState* rs) +loadLights(RenderState* rs) { - // NOTE: add a directional light LightsBuffer* lb = rs->lights_buf; - u32 idx = lb->active_d_lights++; + u32 idx = 0; + +#if 0 + // NOTE: add a directional light + idx = (*lb->active_d_lights)++; lb->dl_directions[idx] = glm::vec4(-2, 1, 3, 1); - lb->dl_colors[idx] = glm::vec4(1, 0.8, 0.6, 1); + lb->dl_colors[idx] = glm::vec4(0.5, 0.5, 0.3, 1); lb->dl_intensities[idx] = glm::uvec4(1, 0, 0, 0); +#endif + // NOTE: add a point light + idx = (*lb->active_p_lights)++; + lb->pl_positions[idx] = glm::vec4(-10, 0, -10, 1); + lb->pl_colors[idx] = glm::vec4(1, 1, 0.8, 1); + lb->pl_intensities[idx] = glm::vec4(3, 0, 0, 0); - // FIXME: we need an interface function to get uniforms by name - GLBuffer* lights_ubo = nullptr; - for (u32 i = 0; i < rs->gl_ctx->num_ubos; i++) { - GLBuffer* ubo = &rs->gl_ctx->uniform_buffers[i]; - - // FIXME: we need a utilty function for cstring comparison that takes - // into account the length of both strings so we don't match a longer - // string with a matching prefix - if (strncmp(ubo->name, "lights", 8)) - lights_ubo = ubo; - } + GLBuffer* lights_ubo = getUBOByName(rs->gl_ctx, "lights"); + assert(lights_ubo != nullptr); // FIXME: we need an interface function to update lights - glBufferSubData(lights_ubo->target, 0, lb->buf_size, lb); + glBindBuffer(lights_ubo->target, lights_ubo->id); + glBufferSubData(lights_ubo->target, 0, lb->buf_size, lb->buffer); - // FIXME: this only makes sense for point lights -#if 0 - // NOTE: add a debug mesh to view the light source + // NOTE: add a debug mesh to view the point light source RenderGroup* debug_group = getFreeRenderGroup(rs); assert(debug_group); ShaderProgram* s_debug = getShaderByName("debug", rs->gl_ctx); @@ -44,14 +46,15 @@ initLights(RenderState* rs) rs->rg_arena, &rs->assets.models[0], // tex_cube from loadScene() s_debug->num_vertex_attribs, - s_debug->attrib_mappings)) + s_debug->attrib_mappings, + "debug_light")) { LOGF(Error, "Error initializing debug entity for light\n"); return false; } - setEntityPosition(e, glm::vec3(lb->dl_directions[idx])); -#endif + setEntityPosition(e, glm::vec3(lb->pl_positions[idx])); + return true; } @@ -107,7 +110,16 @@ loadScene(RenderState* rs) scaleEntity(e, 3); } - return initLights(rs); + // NOTE: initilize the 'camera' + glm::vec3 cam_pos = { 0, 15, 40 }; + glm::vec3 look_pos = { 0, 0, 0 }; + glm::vec3 up = { 0, 1, 0 }; + rs->xforms->view_xform = glm::lookAt(cam_pos, look_pos, up); + GLBuffer* xforms_ubo = getUBOByName(rs->gl_ctx, "matrices"); + assert(xforms_ubo); + updateCameraTransforms(rs->xforms, xforms_ubo); + + return loadLights(rs); } void @@ -138,20 +150,35 @@ render_cb_pre(RenderState* rs) } } - // NOTE: wiggle camera - - static glm::vec3 cam_pos = glm::vec3(0, 0, 50); - static glm::vec3 cam_mov = glm::vec3(0.3, 0, 0); - static glm::vec3 look_pos = glm::vec3(0, 0, 0); - static float direction = -1; + // NOTE: orbit point light + LightsBuffer* lb = rs->lights_buf; + orbitPositionZ0(&lb->pl_positions[0], 2 * M_PI / 180); + RenderGroup* rg = getRenderGroupByName(rs, "debug_lights"); + Entity* ent = &rg->entities[0]; + setEntityPosition(ent, glm::vec3(lb->pl_positions[0])); - if (cam_pos.x < -20 || cam_pos.x > 20) { - direction *= -1; - cam_mov.x *= direction; + // FIXME: we need an interface function to update lights + GLBuffer* lights_ubo = getUBOByName(rs->gl_ctx, "lights"); + assert(lights_ubo); + glBindBuffer(lights_ubo->target, lights_ubo->id); + glBufferSubData(lights_ubo->target, 0, lb->buf_size, lb->buffer); + + // NOTE: orbit camera + static glm::vec4 cam_pos; + static glm::vec3 look_pos; + static glm::vec3 up; + static bool initialized = false; + + if (!initialized) { + cam_pos = { 0, 15, 40, 1 }; + look_pos = { 0, 0, 0 }; + up = { 0, 1, 0 }; + initialized = true; } - cam_pos += cam_mov; - rs->xforms->view_xform = glm::lookAt(cam_pos, look_pos, glm::vec3(0, 1, 0)); + orbitPositionZ0(&cam_pos, 0.5 * M_PI / 180); + rs->xforms->view_xform = + glm::lookAt(glm::vec3(cam_pos), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); static GLBuffer* xform_ubo = nullptr; @@ -161,19 +188,17 @@ render_cb_pre(RenderState* rs) } updateCameraTransforms(rs->xforms, xform_ubo); -#if 0 - for (u32 i = 0; i < rs->num_render_groups; i++) { - RenderGroup& rg = rs->render_groups[i]; - - for (u32 j = 0; j < rg.num_entities; j++) { - Entity& e = rg.entities[j]; - float direction = (j % 2 == 0) ? 1 : -1; - rotateEntity(&e, - glm::vec3(0, 1, 0), - direction * (float) M_PI / (3 * 60)); - } + + // NOTE: rotate cubes + RenderGroup* rg2 = getRenderGroupByName(rs, "textured_cubes"); + + for (u32 j = 0; j < rg2->num_entities; j++) { + Entity& e = rg2->entities[j]; + float direction = (j % 2 == 0) ? 1 : -1; + rotateEntity(&e, + glm::vec3(0, 1, 0), + direction * (float) M_PI / (3 * 60)); } -#endif } int