|
|
|
@ -1,6 +1,8 @@ |
|
|
|
|
|
|
|
|
|
|
|
#include <cassert> |
|
|
|
#include <cassert> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <glm/gtc/matrix_transform.hpp> |
|
|
|
|
|
|
|
|
|
|
|
#include "tangerine.h" |
|
|
|
#include "tangerine.h" |
|
|
|
#define UTIL_IMPLEMENTATION |
|
|
|
#define UTIL_IMPLEMENTATION |
|
|
|
#include "util.h" |
|
|
|
#include "util.h" |
|
|
|
@ -54,14 +56,20 @@ initRenderState(GLClearColor clear_col, |
|
|
|
max_textures, |
|
|
|
max_textures, |
|
|
|
max_ubos); |
|
|
|
max_ubos); |
|
|
|
|
|
|
|
|
|
|
|
rs->xforms = ARENA_ALLOC(rs->assets.arena, Transforms, 1); |
|
|
|
rs->camera = UTIL_ALLOC(1, Camera); |
|
|
|
GLBuffer* xforms_ubo = getFreeUBO(rs->gl_ctx); |
|
|
|
GLBuffer* xforms_ubo = initGLBackingBuffer(rs->gl_ctx, |
|
|
|
|
|
|
|
rs->assets.arena, |
|
|
|
|
|
|
|
"matrices", |
|
|
|
|
|
|
|
GL_FLOAT, |
|
|
|
|
|
|
|
sizeof(Transforms), |
|
|
|
|
|
|
|
&rs->camera->xforms); |
|
|
|
assert(xforms_ubo); |
|
|
|
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, |
|
|
|
// FIXME: should this be an interface function?
|
|
|
|
ambient_color); |
|
|
|
rs->lights_buf = initLights(rs, max_lights, ambient_color); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// FIXME: should have an error message instead of assert here, and
|
|
|
|
|
|
|
|
// clean up arenas/allocations before returning
|
|
|
|
bool ret = loadDefaultShaders(rs); |
|
|
|
bool ret = loadDefaultShaders(rs); |
|
|
|
assert(ret); |
|
|
|
assert(ret); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -313,19 +321,20 @@ initGraphics(SDLHandles* handles) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LightsBuffer* |
|
|
|
LightsBuffer* |
|
|
|
initLights(MemoryArena* arena, |
|
|
|
initLights(RenderState* rs, |
|
|
|
GLContext* gl_ctx, |
|
|
|
|
|
|
|
u32 max_lights, |
|
|
|
u32 max_lights, |
|
|
|
glm::vec4 ambient_color) |
|
|
|
glm::vec4 ambient_color) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// FIXME: revisit for 'Scene' abstraction
|
|
|
|
// FIXME: revisit for 'Scene' abstraction
|
|
|
|
|
|
|
|
// FIXME: see if we can simplify this with the use of offsetof()
|
|
|
|
|
|
|
|
// https://en.cppreference.com/w/cpp/types/offsetof
|
|
|
|
|
|
|
|
|
|
|
|
LightsBuffer* lb = ARENA_ALLOC(arena, LightsBuffer, 1); |
|
|
|
LightsBuffer* lb = ARENA_ALLOC(rs->assets.arena, LightsBuffer, 1); |
|
|
|
lb->buf_size = 8 * sizeof(u32) // NOTE: 'header'
|
|
|
|
lb->buf_size = 8 * sizeof(u32) // NOTE: 'header'
|
|
|
|
+ sizeof(glm::vec4) // NOTE: ambient color
|
|
|
|
+ sizeof(glm::vec4) // NOTE: ambient color
|
|
|
|
+ 6 * max_lights * sizeof(glm::vec4); // NOTE: vector arrays
|
|
|
|
+ 6 * max_lights * sizeof(glm::vec4); // NOTE: vector arrays
|
|
|
|
LOGF(Debug, "buf_size: %d\n", lb->buf_size); |
|
|
|
LOGF(Debug, "buf_size: %d\n", lb->buf_size); |
|
|
|
lb->buffer = ARENA_ALLOC(arena, u8, lb->buf_size); |
|
|
|
lb->buffer = ARENA_ALLOC(rs->assets.arena, u8, lb->buf_size); |
|
|
|
|
|
|
|
|
|
|
|
lb->max_p_lights = (u32*) lb->buffer; |
|
|
|
lb->max_p_lights = (u32*) lb->buffer; |
|
|
|
lb->active_p_lights = |
|
|
|
lb->active_p_lights = |
|
|
|
@ -362,25 +371,12 @@ initLights(MemoryArena* arena, |
|
|
|
lb->dl_intensities = |
|
|
|
lb->dl_intensities = |
|
|
|
(glm::uvec4*) arenaGetAddressOffset(lb->dl_colors, arr_size); |
|
|
|
(glm::uvec4*) arenaGetAddressOffset(lb->dl_colors, arr_size); |
|
|
|
|
|
|
|
|
|
|
|
GLBuffer* lights_ubo = getFreeUBO(gl_ctx); |
|
|
|
initGLBackingBuffer(rs->gl_ctx, |
|
|
|
assert(lights_ubo); |
|
|
|
rs->assets.arena, |
|
|
|
|
|
|
|
"lights", |
|
|
|
lights_ubo->target = GL_UNIFORM_BUFFER; |
|
|
|
GL_BYTE, |
|
|
|
lights_ubo->data_type = GL_BYTE; // NOTE: mixed types in structure
|
|
|
|
lb->buf_size, |
|
|
|
lights_ubo->data_size = lb->buf_size; |
|
|
|
lb->buffer); |
|
|
|
lights_ubo->name = arenaCopyCStr(arena, "lights"); |
|
|
|
|
|
|
|
assert((GLint) gl_ctx->binding_count < gl_ctx->max_binding_points); |
|
|
|
|
|
|
|
lights_ubo->binding_idx = gl_ctx->binding_count++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
glGenBuffers(1, &lights_ubo->id); |
|
|
|
|
|
|
|
glBindBuffer(lights_ubo->target, lights_ubo->id); |
|
|
|
|
|
|
|
glBufferData(lights_ubo->target, |
|
|
|
|
|
|
|
lb->buf_size, |
|
|
|
|
|
|
|
lb->buffer, |
|
|
|
|
|
|
|
GL_DYNAMIC_DRAW); |
|
|
|
|
|
|
|
glBindBufferBase(lights_ubo->target, |
|
|
|
|
|
|
|
lights_ubo->binding_idx, |
|
|
|
|
|
|
|
lights_ubo->id); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return lb; |
|
|
|
return lb; |
|
|
|
} |
|
|
|
} |
|
|
|
|