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 GLTexture* diffuse_texture; // NOTE: pointer into gl_ctx->textures array
mat4* model_xform; mat4* model_xform;
char* name; 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, Model* mdl,
u32 num_attrib_mappings, u32 num_attrib_mappings,
GLBufferToAttribMapping* 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); void setEntityPosition(Entity* e, vec3 pos);

6
include/shader.h

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

9
src/entity.cpp

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

18
src/shader.cpp

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

Loading…
Cancel
Save