From fea2100741b97c050b1f3fb07c10b97b47d49178 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 24 Apr 2011 23:16:13 -0400 Subject: [PATCH] fill indices VBO --- WFObj.cc | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/WFObj.cc b/WFObj.cc index 14221d8..47d2a2c 100644 --- a/WFObj.cc +++ b/WFObj.cc @@ -172,9 +172,8 @@ bool WFObj::load(const WFObj::Buffer &buff) updateAABB(); - buildVBO(); - m_valid = true; - return true; + m_valid = buildVBO(); + return m_valid; } string WFObj::getLine(const Buffer & buff, size_t idx, size_t *update_idx) @@ -447,15 +446,13 @@ bool WFObj::loadfile(const char *path, Buffer & buff) bool WFObj::buildVBO() { map flat_vertices; - int vid = 0, texture_ref_count = 0; + int vid = 0, texture_ref_count = 0, n_vrefs = 0; bool do_textures = m_loadtexture != NULL && m_vertices[VERTEX_TEXTURE].size() > 0; for (map >::iterator it = m_faces.begin(); it != m_faces.end(); it++) { - int first = vid; - int num = 0; for (vector::iterator fit = it->second.begin(); fit != it->second.end(); fit++) @@ -480,11 +477,10 @@ bool WFObj::buildVBO() if (flat_vertices.find(vf) == flat_vertices.end()) { flat_vertices[vf] = vid++; - num++; } + n_vrefs++; } } - m_face_indices[it->first] = make_pair(first, num); } if (texture_ref_count == 0) do_textures = false; @@ -512,12 +508,37 @@ bool WFObj::buildVBO() data[base + 7] = m_vertices[VERTEX_TEXTURE][vr.texture - 1][1]; } } + GLshort * indices = new GLshort[n_vrefs]; + vid = 0; + for (map >::iterator it = m_faces.begin(); + it != m_faces.end(); + it++) + { + int first = vid; + int num = 0; + for (vector::iterator fit = it->second.begin(); + fit != it->second.end(); + fit++) + { + for (int i = 0; i < 3; i++) + { + VertexRef vf = fit->vertices[i]; + indices[vid] = flat_vertices[vf]; + num++; + vid++; + } + } + m_face_indices[it->first] = make_pair(first, num); + } glGenBuffers(1, &m_data_vbo); glGenBuffers(1, &m_index_vbo); /* move data from client side to GL */ glBufferData(m_data_vbo, sizeof(GLfloat) * n_data_elements, data, GL_STATIC_DRAW); + glBufferData(m_index_vbo, sizeof(GLshort) * n_vrefs, indices, + GL_STATIC_DRAW); delete[] data; + delete[] indices; return true; }