diff --git a/include/entity.h b/include/entity.h index e07de17..530094d 100644 --- a/include/entity.h +++ b/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); diff --git a/include/shader.h b/include/shader.h index 3e9494e..0c00291 100644 --- a/include/shader.h +++ b/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[]); diff --git a/src/entity.cpp b/src/entity.cpp index a93f0aa..227b30a 100644 --- a/src/entity.cpp +++ b/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); diff --git a/src/shader.cpp b/src/shader.cpp index d2f692f..0fc88a1 100644 --- a/src/shader.cpp +++ b/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 diff --git a/src/tangerine.cpp b/src/tangerine.cpp index d3ca8d8..981d320 100644 --- a/src/tangerine.cpp +++ b/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); } } }