Browse Source

move draw_mode and usage from GLMesh to Entity

the entity properties make more sense, so we can load the usage,
and draw_mode once, and it applies to all the sub_meshes.
remotes/bxxa/master
cinnaboot 4 years ago
parent
commit
0821166a74
  1. 7
      include/entity.h
  2. 6
      include/shader.h
  3. 9
      src/entity.cpp
  4. 18
      src/shader.cpp
  5. 2
      src/tangerine.cpp

7
include/entity.h

@ -14,6 +14,9 @@ struct Entity
GLTexture* diffuse_texture; // NOTE: pointer into gl_ctx->textures array
mat4* model_xform;
char* name;
GLenum draw_mode; // NOTE: GL_LINES, GL_TRIANGLES (default)
GLenum usage; // NOTE: GL_STATIC_DRAW (default), GL_DYNAMIC_DRAW
};
@ -23,7 +26,9 @@ bool initEntity(Entity* e,
Model* mdl,
u32 num_attrib_mappings,
GLBufferToAttribMapping* attrib_mappings,
const char* name = "");
const char* name = "",
GLenum draw_mode = GL_TRIANGLES,
GLenum usage = GL_STATIC_DRAW);
void setEntityPosition(Entity* e, vec3 pos);

6
include/shader.h

@ -144,8 +144,6 @@ struct GLMesh
GLuint vao_id;
bool has_texture;
GLuint tex_id;
GLenum draw_mode; // NOTE: GL_LINES, GL_TRIANGLES
GLenum usage; // NOTE: GL_STATIC_DRAW, GL_DYNAMIC_DRAW
mat4* node_xform;
@ -200,13 +198,15 @@ void updateGLBuffer(GLBuffer* gl_buf, void* data);
void renderVAO(GLMesh* glmesh,
mat4* node_xform,
ShaderProgram* shader,
GLTexture* gl_tex);
GLTexture* gl_tex,
GLenum draw_mode);
GLVertexAttrib* getVertexAttribByName(ShaderProgram* shader, const char* name);
GLMesh loadGLMesh(MemoryArena* arena,
const Mesh& m,
GLenum draw_mode,
GLenum usage,
GLTexture* diffuse_texture,
u32 num_mappings,
GLBufferToAttribMapping mappings[]);

9
src/entity.cpp

@ -12,13 +12,17 @@ initEntity(Entity* e,
Model* mdl,
u32 num_attrib_mappings,
GLBufferToAttribMapping* attrib_mappings,
const char* name)
const char* name,
GLenum draw_mode,
GLenum usage)
{
e->num_meshes = mdl->num_meshes;
e->meshes = ARENA_ALLOC(arena, GLMesh, e->num_meshes);
e->model_xform = ARENA_ALLOC(arena, mat4, 1);
*e->model_xform = mat4(1.f);
e->name = arenaCopyCStr(arena, name);
e->draw_mode = draw_mode;
e->usage = usage;
if (mdl->diffuse_texture) {
e->diffuse_texture = getGLTexture(gl_ctx, mdl->diffuse_texture);
@ -31,7 +35,8 @@ initEntity(Entity* e,
GLMesh* glm = &e->meshes[i];
*glm = loadGLMesh(arena,
mdl->meshes[i],
GL_TRIANGLES,
draw_mode,
usage,
e->diffuse_texture,
num_attrib_mappings,
attrib_mappings);

18
src/shader.cpp

@ -256,7 +256,8 @@ void
renderVAO(GLMesh* glmesh,
mat4* node_xform,
ShaderProgram* shader,
GLTexture* gl_tex)
GLTexture* gl_tex,
GLenum draw_mode)
{
glUseProgram(shader->prog_id);
glBindVertexArray(glmesh->vao_id);
@ -278,8 +279,7 @@ renderVAO(GLMesh* glmesh,
}
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glmesh->element_buf->id);
glDrawElements(
glmesh->draw_mode, glmesh->num_indices, GL_UNSIGNED_SHORT, 0);
glDrawElements(draw_mode, glmesh->num_indices, GL_UNSIGNED_SHORT, 0);
glBindVertexArray(0);
}
@ -298,13 +298,10 @@ getVertexAttribByName(ShaderProgram* shader, const char* name)
GLMesh
initGLMesh(MemoryArena* arena,
const Mesh& m,
u32 num_mappings,
GLenum draw_mode)
u32 num_mappings)
{
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 = ARENA_ALLOC(arena, GLBuffer, num_mappings);
glm.element_buf = ARENA_ALLOC(arena, GLBuffer, 1);
@ -332,11 +329,12 @@ GLMesh
loadGLMesh(MemoryArena* arena,
const Mesh& m,
GLenum draw_mode,
GLenum usage,
GLTexture* diffuse_texture,
u32 num_mappings,
GLBufferToAttribMapping mappings[])
{
GLMesh glm = initGLMesh(arena, m, num_mappings, draw_mode);
GLMesh glm = initGLMesh(arena, m, num_mappings);
if (diffuse_texture) {
glm.has_texture = true;
@ -361,7 +359,7 @@ loadGLMesh(MemoryArena* arena,
glBufferData(buf.target,
buf.data_size,
mesh_buf_data,
glm.usage);
usage);
glVertexAttribPointer(attrib->location, attrib->num_components,
attrib->component_type, GL_FALSE, 0, 0);
glEnableVertexAttribArray(attrib->location);
@ -376,7 +374,7 @@ loadGLMesh(MemoryArena* arena,
glBufferData(glm.element_buf->target,
glm.element_buf->data_size,
m.indices,
glm.usage);
usage);
// TODO: many of these GL functions can set an error state
// TODO: return error status

2
src/tangerine.cpp

@ -211,7 +211,7 @@ renderFrame(RenderState* rs, const GLClearColor& clear_col)
for (u32 k = 0; k < e->num_meshes; k++) {
GLMesh& glm = e->meshes[k];
renderVAO(&glm, e->model_xform, rg->shader,
e->diffuse_texture);
e->diffuse_texture, e->draw_mode);
}
}
}

Loading…
Cancel
Save