From da31d5c1c026e817e49dbb5a37568ec4bfa3c510 Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Fri, 11 Feb 2022 10:46:59 -0500 Subject: [PATCH] add ambient_color to the LightsBuffer structure --- data/full_lighting.frag | 4 ++-- src/tangerine.cpp | 20 ++++++++++++++++---- src/tangerine.h | 6 ++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/data/full_lighting.frag b/data/full_lighting.frag index a99a778..f157004 100644 --- a/data/full_lighting.frag +++ b/data/full_lighting.frag @@ -8,8 +8,6 @@ out vec4 color; uniform sampler2D sampler; -// TODO: ambient light should be part of the lights uniform -const vec4 ambient_color = vec4(0.1, 0.1, 0.1, 1); const uint NUM_LIGHTS = 32u; layout (std140) uniform lights @@ -20,6 +18,8 @@ layout (std140) uniform lights uint active_d_lights; uint padding; + vec4 ambient_color; + vec4 pl_positions[NUM_LIGHTS]; vec4 pl_colors[NUM_LIGHTS]; uint pl_intensities[NUM_LIGHTS]; // NOTE: 16 bytes * NUM_LIGHTS diff --git a/src/tangerine.cpp b/src/tangerine.cpp index 763c094..f799512 100644 --- a/src/tangerine.cpp +++ b/src/tangerine.cpp @@ -10,13 +10,15 @@ bool initGraphics(SDLHandles* handles); -LightsBuffer* initLights(MemoryArena* arena, GLContext* gl_ctx, u32 max_lights); +LightsBuffer* initLights(MemoryArena* arena, GLContext* gl_ctx, u32 max_lights, + glm::vec4 ambient_color); // interface RenderState* initRenderState(GLClearColor clear_col, + glm::vec4 ambient_color, u32 max_models, u32 max_textures, u32 max_shaders, @@ -56,7 +58,8 @@ initRenderState(GLClearColor clear_col, assert(xforms_ubo); initTransforms(rs->assets.arena, rs->xforms, xforms_ubo, rs->gl_ctx); - rs->lights_buf = initLights(rs->rg_arena, rs->gl_ctx, max_lights); + rs->lights_buf = initLights(rs->rg_arena, rs->gl_ctx, max_lights, + ambient_color); bool ret = loadDefaultShaders(rs); assert(ret); @@ -309,12 +312,16 @@ initGraphics(SDLHandles* handles) } LightsBuffer* -initLights(MemoryArena* arena, GLContext* gl_ctx, u32 max_lights) +initLights(MemoryArena* arena, + GLContext* gl_ctx, + u32 max_lights, + glm::vec4 ambient_color) { // FIXME: revisit for 'Scene' abstraction LightsBuffer* lb = ARENA_ALLOC(arena, LightsBuffer, 1); lb->buf_size = 8 * sizeof(u32) // NOTE: 'header' + + sizeof(glm::vec4) // NOTE: ambient color + 6 * max_lights * sizeof(glm::vec4); // NOTE: vector arrays LOGF(Debug, "buf_size: %d\n", lb->buf_size); lb->buffer = ARENA_ALLOC(arena, u8, lb->buf_size); @@ -335,9 +342,14 @@ initLights(MemoryArena* arena, GLContext* gl_ctx, u32 max_lights) // in the future void* arr_start = arenaGetAddressOffset(lb->buffer, 8 * sizeof(u32)); + // NOTE: ambient color + lb->ambient_color = (glm::vec4*) arr_start; + *lb->ambient_color = ambient_color; + // NOTE: set offsets for array pointers u32 arr_size = max_lights * sizeof(glm::vec4); - lb->pl_positions = (glm::vec4*) arr_start; + lb->pl_positions = //(glm::vec4*) arr_start; + (glm::vec4*) arenaGetAddressOffset(arr_start, sizeof(glm::vec4)); lb->pl_colors = (glm::vec4*) arenaGetAddressOffset(lb->pl_positions, arr_size); lb->pl_intensities = diff --git a/src/tangerine.h b/src/tangerine.h index f20f136..c804e94 100644 --- a/src/tangerine.h +++ b/src/tangerine.h @@ -59,6 +59,8 @@ * - maybe fixed now with MeshBufferType enum and getMeshData() * - allow entities to have an empty diffuse texture (see initEntity()) * - use dynamic shader parsing to set 'sampler_id' for shaders with textures +* - add ambient light to LightsBuffer structure +* - remember to update offsets in initLights() */ @@ -132,6 +134,8 @@ struct LightsBuffer u32* max_d_lights; u32* active_d_lights; + glm::vec4* ambient_color; + glm::vec4* pl_positions; glm::vec4* pl_colors; glm::uvec4* pl_intensities; @@ -170,8 +174,10 @@ struct RenderState #define DEFAULT_UBO_COUNT 32 #define DEFAULT_RENDER_GROUP_COUNT 256 #define DEFAULT_CLEAR_COLOR { 0.2, 0.2, 0.2, 1 } +#define DEFAULT_AMBIENT_COLOR { 0.1, 0.1, 0.1, 1 } #define DEFAULT_MAX_LIGHTS 32 // NOTE: needs to match NUM_LIGHTS in shaders RenderState* initRenderState(GLClearColor clear_col = DEFAULT_CLEAR_COLOR, + glm::vec4 ambient_color = DEFAULT_AMBIENT_COLOR, u32 max_models = DEFAULT_MODEL_COUNT, u32 max_textures = DEFAULT_TEXTURE_COUNT, u32 max_shaders = DEFAULT_SHADER_COUNT,