From a087d95f4a11f599bad621a09a30de8e70282c7d Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Sun, 13 Mar 2022 11:44:19 -0400 Subject: [PATCH] use new initGLBackingBuffer helper for lights and transform UBOs --- include/shader.h | 9 +------- src/shader.cpp | 28 ------------------------- src/tangerine.cpp | 52 ++++++++++++++++++++++------------------------- 3 files changed, 25 insertions(+), 64 deletions(-) diff --git a/include/shader.h b/include/shader.h index 452becf..63eba43 100644 --- a/include/shader.h +++ b/include/shader.h @@ -5,6 +5,7 @@ #include #include +#include "asset.h" #include "types.h" #include "util.h" @@ -219,11 +220,3 @@ GLMesh loadGLMesh(MemoryArena* arena, u32 num_mappings, GLBufferToAttribMapping mappings[]); -void initTransforms(MemoryArena* arena, - Transforms* xforms, - GLBuffer* xform_ubo, - GLContext* gl_ctx, - float fov = DEFAULT_FOV, - float near_clip_plane = NEAR_CLIP_PLANE, - float aspect_ratio = DEFAULT_ASPECT_RATIO); - diff --git a/src/shader.cpp b/src/shader.cpp index 00d7810..cf41e96 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -281,34 +281,6 @@ renderVAO(GLMesh* glmesh, glBindVertexArray(0); } -void -initTransforms(MemoryArena* arena, - Transforms* xforms, - GLBuffer* xform_ubo, - GLContext* gl_ctx, - float fov, - float near_clip_plane, - float aspect_ratio) -{ - xforms->proj_xform = glm::infinitePerspective( - glm::radians(fov), aspect_ratio, near_clip_plane); - - glGenBuffers(1, &xform_ubo->id); - xform_ubo->target = GL_UNIFORM_BUFFER; - xform_ubo->data_type = GL_FLOAT; - xform_ubo->name = arenaCopyCStr(arena, "matrices"); - xform_ubo->data_size = sizeof(*xforms); - - glBindBuffer(xform_ubo->target, xform_ubo->id); - glBufferData(xform_ubo->target, xform_ubo->data_size, xforms, - GL_DYNAMIC_DRAW); - - // NOTE: bindbufferbase - xform_ubo->binding_idx = gl_ctx->binding_count++; - glBindBufferBase(xform_ubo->target, xform_ubo->binding_idx, xform_ubo->id); - glBindBuffer(xform_ubo->target, 0); -} - GLVertexAttrib* getVertexAttribByName(ShaderProgram* shader, const char* name) { diff --git a/src/tangerine.cpp b/src/tangerine.cpp index b8f294b..830a2d0 100644 --- a/src/tangerine.cpp +++ b/src/tangerine.cpp @@ -1,6 +1,8 @@ #include +#include + #include "tangerine.h" #define UTIL_IMPLEMENTATION #include "util.h" @@ -54,14 +56,20 @@ initRenderState(GLClearColor clear_col, max_textures, max_ubos); - rs->xforms = ARENA_ALLOC(rs->assets.arena, Transforms, 1); - GLBuffer* xforms_ubo = getFreeUBO(rs->gl_ctx); + rs->camera = UTIL_ALLOC(1, Camera); + GLBuffer* xforms_ubo = initGLBackingBuffer(rs->gl_ctx, + rs->assets.arena, + "matrices", + GL_FLOAT, + sizeof(Transforms), + &rs->camera->xforms); 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, - ambient_color); + // FIXME: should this be an interface function? + 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); assert(ret); } @@ -313,19 +321,20 @@ initGraphics(SDLHandles* handles) } LightsBuffer* -initLights(MemoryArena* arena, - GLContext* gl_ctx, +initLights(RenderState* rs, u32 max_lights, glm::vec4 ambient_color) { // 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' + 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); + lb->buffer = ARENA_ALLOC(rs->assets.arena, u8, lb->buf_size); lb->max_p_lights = (u32*) lb->buffer; lb->active_p_lights = @@ -362,25 +371,12 @@ initLights(MemoryArena* arena, lb->dl_intensities = (glm::uvec4*) arenaGetAddressOffset(lb->dl_colors, arr_size); - GLBuffer* lights_ubo = getFreeUBO(gl_ctx); - assert(lights_ubo); - - lights_ubo->target = GL_UNIFORM_BUFFER; - lights_ubo->data_type = GL_BYTE; // NOTE: mixed types in structure - lights_ubo->data_size = lb->buf_size; - 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); + initGLBackingBuffer(rs->gl_ctx, + rs->assets.arena, + "lights", + GL_BYTE, + lb->buf_size, + lb->buffer); return lb; }