# HG changeset patch # User John Tsiombikas # Date 1412807368 -10800 # Node ID 25cab9e20c9c12127e5ed475feebe8aa27cb1caf # Parent 0168104ec5683027b88df7a011218e0a113f42aa mesh vbos diff -r 0168104ec568 -r 25cab9e20c9c src/mesh.cc --- a/src/mesh.cc Sat Oct 04 03:41:59 2014 +0300 +++ b/src/mesh.cc Thu Oct 09 01:29:28 2014 +0300 @@ -246,62 +246,103 @@ cur_tang_valid = true; } +void Mesh::update_buffers() +{ + for(int i=0; iupdate_buffers(); + bool use_norm = !attrib[MESH_NORMAL].data.empty(); bool use_tc = !attrib[MESH_TEXCOORD].data.empty(); bool use_tang = !attrib[MESH_TANGENT].data.empty(); int norm_loc, tc_loc, tang_loc; - const float *ptr = &attrib[MESH_VERTEX].data[0]; + glBindBuffer(GL_ARRAY_BUFFER, attrib[MESH_VERTEX].vbo); int loc = attrib[MESH_VERTEX].sdrloc; if(loc == -1) { glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(attrib[MESH_VERTEX].nelems, GL_FLOAT, 0, ptr); + glVertexPointer(attrib[MESH_VERTEX].nelems, GL_FLOAT, 0, 0); } else { glEnableVertexAttribArray(loc); - glVertexAttribPointer(loc, attrib[MESH_VERTEX].nelems, GL_FLOAT, 0, 0, ptr); + glVertexAttribPointer(loc, attrib[MESH_VERTEX].nelems, GL_FLOAT, 0, 0, 0); } if(use_norm) { - const float *ptr = &attrib[MESH_NORMAL].data[0]; + glBindBuffer(GL_ARRAY_BUFFER, attrib[MESH_NORMAL].vbo); norm_loc = attrib[MESH_NORMAL].sdrloc; if(norm_loc == -1) { glEnableClientState(GL_NORMAL_ARRAY); - glNormalPointer(GL_FLOAT, 0, ptr); + glNormalPointer(GL_FLOAT, 0, 0); } else { glEnableVertexAttribArray(norm_loc); - glVertexAttribPointer(norm_loc, attrib[MESH_NORMAL].nelems, GL_FLOAT, 0, 0, ptr); + glVertexAttribPointer(norm_loc, attrib[MESH_NORMAL].nelems, GL_FLOAT, 0, 0, 0); } } if(use_tc) { - const float *ptr = &attrib[MESH_TEXCOORD].data[0]; + glBindBuffer(GL_ARRAY_BUFFER, attrib[MESH_TEXCOORD].vbo); tc_loc = attrib[MESH_TEXCOORD].sdrloc; if(tc_loc == -1) { glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(attrib[MESH_TEXCOORD].nelems, GL_FLOAT, 0, ptr); + glTexCoordPointer(attrib[MESH_TEXCOORD].nelems, GL_FLOAT, 0, 0); } else { glEnableVertexAttribArray(tc_loc); - glVertexAttribPointer(tc_loc, attrib[MESH_TEXCOORD].nelems, GL_FLOAT, 0, 0, ptr); + glVertexAttribPointer(tc_loc, attrib[MESH_TEXCOORD].nelems, GL_FLOAT, 0, 0, 0); } } if(!attrib[MESH_TANGENT].data.empty()) { - const float *ptr = &attrib[MESH_TANGENT].data[0]; + glBindBuffer(GL_ARRAY_BUFFER, attrib[MESH_TANGENT].vbo); tang_loc = attrib[MESH_TANGENT].sdrloc; if(tang_loc != -1) { glEnableVertexAttribArray(tang_loc); - glVertexAttribPointer(tang_loc, attrib[MESH_TANGENT].nelems, GL_FLOAT, 0, 0, ptr); + glVertexAttribPointer(tang_loc, attrib[MESH_TANGENT].nelems, GL_FLOAT, 0, 0, 0); } } + glBindBuffer(GL_ARRAY_BUFFER, 0); + if(!index.empty()) { - glDrawElements(prim, num_idx, GL_UNSIGNED_INT, &index[0]); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); + glDrawElements(prim, num_idx, GL_UNSIGNED_INT, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } else { glDrawArrays(prim, 0, num_verts * 3); } diff -r 0168104ec568 -r 25cab9e20c9c src/mesh.h --- a/src/mesh.h Sat Oct 04 03:41:59 2014 +0300 +++ b/src/mesh.h Thu Oct 09 01:29:28 2014 +0300 @@ -46,6 +46,8 @@ Vector2 cur_tc; bool cur_norm_valid, cur_tc_valid, cur_tang_valid; + void update_buffers(); + public: Mesh(); ~Mesh();