Browse Source

use new initGLBackingBuffer helper for lights and transform UBOs

remotes/bxxa/master
cinnaboot 4 years ago
parent
commit
a087d95f4a
  1. 9
      include/shader.h
  2. 28
      src/shader.cpp
  3. 50
      src/tangerine.cpp

9
include/shader.h

@ -5,6 +5,7 @@
#include <GL/glew.h>
#include <glm/glm.hpp>
#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);

28
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)
{

50
src/tangerine.cpp

@ -1,6 +1,8 @@
#include <cassert>
#include <glm/gtc/matrix_transform.hpp>
#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,
initGLBackingBuffer(rs->gl_ctx,
rs->assets.arena,
"lights",
GL_BYTE,
lb->buf_size,
lb->buffer,
GL_DYNAMIC_DRAW);
glBindBufferBase(lights_ubo->target,
lights_ubo->binding_idx,
lights_ubo->id);
lb->buffer);
return lb;
}

Loading…
Cancel
Save