Browse Source

add ambient_color to the LightsBuffer structure

main
cinnaboot 4 years ago
parent
commit
da31d5c1c0
  1. 4
      data/full_lighting.frag
  2. 20
      src/tangerine.cpp
  3. 6
      src/tangerine.h

4
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

20
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 =

6
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,

Loading…
Cancel
Save