Browse Source

use rg_arena for storing GLMesh buffers

main
cinnaboot 4 years ago
parent
commit
8f77e33f33
  1. 11
      src/entity.cpp
  2. 32
      src/shader.cpp
  3. 3
      src/shader.h
  4. 1
      src/tangerine.h

11
src/entity.cpp

@ -29,11 +29,12 @@ initEntity(Entity* e,
for (u32 i = 0; i< e->num_meshes; i++) {
GLMesh* glm = &e->meshes[i];
*glm = loadGLMesh(mdl->meshes[i],
GL_TRIANGLES,
e->diffuse_texture,
num_attrib_mappings,
attrib_mappings);
*glm = loadGLMesh(arena,
mdl->meshes[i],
GL_TRIANGLES,
e->diffuse_texture,
num_attrib_mappings,
attrib_mappings);
if (glm->vao_id == 0) {
LOGF(Error, "error initializing entity\n");

32
src/shader.cpp

@ -300,16 +300,19 @@ getVertexAttribByName(ShaderProgram* shader, const char* name)
}
GLMesh
initGLMesh(const Mesh& m, u32 num_mappings, GLenum draw_mode)
initGLMesh(MemoryArena* arena,
const Mesh& m,
u32 num_mappings,
GLenum draw_mode)
{
GLMesh glm = {0};
glm.num_indices = m.num_indices;
glm.draw_mode = draw_mode;
glm.usage = GL_STATIC_DRAW; // TODO: logic for updating dynamic meshes
glm.num_vertex_attrib_buffers = num_mappings;
glm.vertex_attrib_buffers = UTIL_ALLOC(num_mappings, GLBuffer);
glm.element_buf = UTIL_ALLOC(1, GLBuffer);
glm.node_xform = UTIL_ALLOC(1, glm::mat4);
glm .vertex_attrib_buffers = ARENA_ALLOC(arena, GLBuffer, num_mappings);
glm.element_buf = ARENA_ALLOC(arena, GLBuffer, 1);
glm.node_xform = ARENA_ALLOC(arena, glm::mat4, 1);
*glm.node_xform = glm::mat4(1);
return glm;
@ -328,15 +331,14 @@ initGLAttribBuffer(GLBuffer* buf, GLenum target, GLVertexAttrib* attrib)
// FIXME: might as well pass in pointer to GLMesh, since that's how we're
// going to use this, can void copying GLMesh twice that way
GLMesh
loadGLMesh(const Mesh& m,
loadGLMesh(MemoryArena* arena,
const Mesh& m,
GLenum draw_mode,
GLTexture* diffuse_texture,
u32 num_mappings,
GLBufferToAttribMapping mappings[])
{
// NOTE: need to use freeGLMesh() when freeing because we're not storing
// the GLBuffers on a memory arean (yet)
GLMesh glm = initGLMesh(m, num_mappings, draw_mode);
GLMesh glm = initGLMesh(arena, m, num_mappings, draw_mode);
if (diffuse_texture) {
glm.has_texture = true;
@ -384,20 +386,6 @@ loadGLMesh(const Mesh& m,
return glm;
}
void
freeGLMesh(GLMesh* glm)
{
if (glm) {
for (u32 i = 0; i < glm->num_vertex_attrib_buffers; i++)
utilSafeFree(glm->vertex_attrib_buffers[i].name);
utilSafeFree(glm->vertex_attrib_buffers);
utilSafeFree(glm->element_buf);
// NOTE: don't free the GLMesh because it is part of a memory arena
//utilSafeFree(glm);
}
}
// NOTE: internal

3
src/shader.h

@ -205,7 +205,8 @@ void renderVAO(GLMesh* glmesh,
GLVertexAttrib* getVertexAttribByName(ShaderProgram* shader, const char* name);
GLMesh loadGLMesh(const Mesh& m,
GLMesh loadGLMesh(MemoryArena* arena,
const Mesh& m,
GLenum draw_mode,
GLTexture* diffuse_texture,
u32 num_mappings,

1
src/tangerine.h

@ -61,6 +61,7 @@
* - use dynamic shader parsing to set 'sampler_id' for shaders with textures
* - add ambient light to LightsBuffer structure
* - remember to update offsets in initLights()
* - use rg_arena for store GLMeshes, see initGLMesh()
*/

Loading…
Cancel
Save