From 2ffcdfb3dccb682118eaea5464f05d4fdd9dbebf Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 4 May 2011 16:12:00 -0400 Subject: [PATCH] remove draw(); add get*() methods for client access --- WFObj.cc | 32 ++++++-------------------------- WFObj.h | 12 ++++++++++-- 2 files changed, 16 insertions(+), 28 deletions(-) diff --git a/WFObj.cc b/WFObj.cc index 6c1eb3a..44857b4 100644 --- a/WFObj.cc +++ b/WFObj.cc @@ -126,7 +126,6 @@ void WFObj::clear() for (int i = 0; i < sizeof(m_vertices)/sizeof(m_vertices[0]); i++) m_vertices[i].clear(); m_faces.clear(); - m_face_indices.clear(); m_materials.clear(); m_valid = false; m_path = ""; @@ -217,7 +216,10 @@ void WFObj::processInputLine(const std::string & input) else if (type == "f") { if (m_faces.find(m_current_material_name) == m_faces.end()) + { m_faces[m_current_material_name] = vector(); + m_num_materials = m_faces.size(); + } vector faces = readFaces(tokens); for (vector::iterator it = faces.begin(); it != faces.end(); it++) m_faces[m_current_material_name].push_back(*it); @@ -529,7 +531,8 @@ bool WFObj::buildVBO() vid++; } } - m_face_indices[it->first] = make_pair(first, vid - first); + m_materials[it->first].first_vertex = first; + m_materials[it->first].num_vertices = vid - first; } glGenBuffers(1, &m_data_vbo); glGenBuffers(1, &m_index_vbo); @@ -545,33 +548,10 @@ bool WFObj::buildVBO() return true; } -void WFObj::draw() +void WFObj::bindBuffers() { - if (!m_valid) - return; glBindBuffer(GL_ARRAY_BUFFER, m_data_vbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_index_vbo); - glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - size_t stride = sizeof(GLfloat) * m_n_floats_per_vref; - glVertexPointer(3, GL_FLOAT, stride, NULL); - glNormalPointer(GL_FLOAT, stride, (GLvoid *) (sizeof(GLfloat) * 3)); - if (m_do_textures) - { - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(2, GL_FLOAT, stride, - (GLvoid *) (sizeof(GLfloat) * 6)); - } - for (map >::iterator it = m_faces.begin(); - it != m_faces.end(); - it++) - { - glDrawElements(GL_TRIANGLES, m_face_indices[it->first].second, - GL_UNSIGNED_SHORT, - (GLvoid *) (sizeof(GLshort) * m_face_indices[it->first].first)); - } - glPopClientAttrib(); } bool WFObj::VertexRef::operator<(const VertexRef & other) const diff --git a/WFObj.h b/WFObj.h index 4c8b490..3629b51 100644 --- a/WFObj.h +++ b/WFObj.h @@ -45,6 +45,8 @@ public: GLfloat specular[4]; std::string texture; int flags; + int first_vertex; + int num_vertices; }; typedef bool (*loadfile_t)(const char *fname, Buffer & buff); @@ -60,7 +62,13 @@ public: bool load(const char *fname); bool load(const Buffer &buff); const float * const getAABB() { return m_aabb; } - void draw(); + size_t getStride() { return sizeof(GLfloat) * m_n_floats_per_vref; } + size_t getVertexOffset() { return 0; } + size_t getNormalOffset() { return 3 * sizeof(GLfloat); } + size_t getTextureCoordOffset() { return 6 * sizeof(GLfloat); } + void bindBuffers(); + size_t getNumMaterials() { return m_num_materials; } + std::map & getMaterials() { return m_materials; } protected: /* types */ @@ -105,7 +113,6 @@ protected: /* variables */ std::vector m_vertices[VERTEX_TYPES]; std::map< std::string, std::vector< Face > > m_faces; - std::map< std::string, std::pair > m_face_indices; std::map< std::string, Material > m_materials; float m_aabb[6]; std::string m_path; @@ -116,6 +123,7 @@ protected: GLuint m_data_vbo, m_index_vbo; bool m_do_textures; size_t m_n_floats_per_vref; + size_t m_num_materials; }; #endif