diff --git a/src/main.cpp b/src/main.cpp index 4bede5d..21a11cb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -259,37 +259,44 @@ loadScene(RenderState* rs) shader_program* s_default = getShaderByName("default", rs->gl_ctx); shader_program* s_debug = getShaderByName("debug", rs->gl_ctx); - - if (!s_default || !s_debug) - return false; + if (!s_default || !s_debug) return false; // TODO: full lighting model model* tex_cube = getModel(rs, "../data/textured_cube.gltf"); assert(tex_cube != nullptr && tex_cube->num_meshes > 0); GLmesh* texmesh = getFreeGLMesh(rs); + if (!texmesh) return false; - if (texmesh) { - *texmesh = loadGLMesh(s_debug, tex_cube->meshes[0], - GL_TRIANGLES, glm::vec3(0, 0, 0)); - *texmesh->model_xform = glm::mat4(1.f); + *texmesh = loadGLMesh(s_debug, tex_cube->meshes[0], + GL_TRIANGLES, glm::vec3(0, 0, 0)); + if (texmesh->vao_id == 0) return false; - if (texmesh->vao_id == 0) - return false; + // ======== + // NOTE: testing new loadGLMesh interface + texmesh = getFreeGLMesh(rs); + if (!texmesh) return false; - } else { - return false; - } + GLVertexAttrib* pos_attrib = getVertexAttribByName(s_debug, "position"); + GLVertexAttrib* normal_attrib = getVertexAttribByName(s_debug, "normal"); + if (!pos_attrib || !normal_attrib) return false; + + GLBufferToAttribMapping attrib_mappings[2] = { + { "position", nullptr, pos_attrib }, + { "normal", nullptr, normal_attrib } + }; + *texmesh = loadGLMesh(s_debug, tex_cube->meshes[0], + GL_TRIANGLES, glm::vec3(10, 0, 0), + 2, attrib_mappings); + if (texmesh->vao_id == 0) return false; + // + // ======== for (u32 i = 0; i < NUM_CUBES; i++) { GLmesh* gmesh = getFreeGLMesh(rs); - - if (!gmesh) - return false; + if (!gmesh) return false; *gmesh = loadGLMesh(s_default, cube, GL_TRIANGLES, cube_locs[i]); - - if (gmesh->vao_id == 0) - return false; + if (gmesh->vao_id == 0) return false; } return true; diff --git a/src/shader.cpp b/src/shader.cpp index 3a03e6b..d5711ca 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -16,7 +16,6 @@ #include "util.h" - // NOTE: forward declarations const std::string dumpTextFile(const char* filepath); @@ -77,7 +76,7 @@ addShaderProgram(memory_arena* arena, s->name = arenaCopyCStr(arena, name); s->hash = hash; - // TODO: replace std::string w/ utilAllocCStr() ? + // TODO: replace std::string w/ utilAllocateCStr() ? std::string vert = dumpTextFile(vs); std::string frag = dumpTextFile(fs); GLuint vs_id, fs_id; @@ -227,6 +226,38 @@ loadGLMesh(shader_program* s, return gm; } +GLVertexAttrib* +getVertexAttribByName(shader_program* shader, const char* name) +{ + for (u32 i = 0; i < shader->num_vertex_attribs; i++) { + if (strncmp(shader->vertex_attribs[i].name, name, 256) == 0) + return &shader->vertex_attribs[i]; + } + + printf("%s, attribute: %s, not found on shader: %s\n", + __FUNCTION__, name, shader->name); + return nullptr; +} + +GLmesh +loadGLMesh(shader_program* s, + const mesh& m, + GLenum draw_mode, + const glm::vec3& pos, + u32 num_mappings, + GLBufferToAttribMapping mappings[]) +{ + GLmesh glm = {0}; +#if 0 + // TODO: store gl_buffers on gl_ctx + // TODO: loop over mapping array to get buffer attrib info + WRONG! gl_ctx->num_vertex_buffers = num_mappings; + gl_ctx->vertex_buffers = ... + for (u32 i = 0; i < num_mappings; i++) { + } +#endif + return glm; +} // NOTE: internal @@ -438,10 +469,9 @@ bool parseAttributes(memory_arena* arena, shader_program* s, GLContext* gl_ctx) { printf("\n---------------------------------\n"); - printf("%s(), FIXME: dumping attrib info for programe: %s\n", + printf("%s(), FIXME: dumping attrib info for program: %s\n", __FUNCTION__, s->name); - GLint num_attribs; glGetProgramiv(s->prog_id, GL_ACTIVE_ATTRIBUTES, &num_attribs); printf("active attributes: %d\n", num_attribs); @@ -449,7 +479,7 @@ parseAttributes(memory_arena* arena, shader_program* s, GLContext* gl_ctx) s->num_vertex_attribs = num_attribs; s->vertex_attribs = ARENA_ALLOC(arena, GLVertexAttrib, num_attribs); - GLchar attrib_name[256] = {0} ; + GLchar attrib_name[256] = {0}; GLsizei length; GLint size; GLenum type; diff --git a/src/shader.h b/src/shader.h index a0b3216..d18073a 100644 --- a/src/shader.h +++ b/src/shader.h @@ -203,6 +203,14 @@ GLmesh loadGLMesh(shader_program* s, const mesh& m, GLenum draw_mode, const glm::vec3& pos); +// NOTE: testing new loadGLMesh interface +GLVertexAttrib* getVertexAttribByName(shader_program* shader, const char* name); +GLmesh loadGLMesh(shader_program* s, + const mesh& m, + GLenum draw_mode, + const glm::vec3& pos, + u32 num_mappings, + GLBufferToAttribMapping mappings[]); void initTransforms(memory_arena* arena, transforms* xforms, gl_buffer* xform_ubo,