X-Git-Url: http://git.mutantstargoat.com?p=demo;a=blobdiff_plain;f=src%2Fopengl%2Fmesh-gl.cc;h=e7cf44dc8b5411271bde5ee777a05749f2be4aa1;hp=a6efb7d1f7c53ccb82ebddef8f9a0775c5d8a9ad;hb=0da7a98f74d00bfa6cf0d47fd7cf0f687eeba5f6;hpb=826b0cf7adaf8b1dc4c37f57a4a98c79a3995e21 diff --git a/src/opengl/mesh-gl.cc b/src/opengl/mesh-gl.cc index a6efb7d..e7cf44d 100644 --- a/src/opengl/mesh-gl.cc +++ b/src/opengl/mesh-gl.cc @@ -1,15 +1,15 @@ #include +#include #include "mesh-gl.h" MeshGL::MeshGL() { - which_mask = 0; - vao = 0; vbo_vertices = 0; vbo_normals = 0; + vbo_tex_coords = 0; ibo = 0; num_vertices = 0; @@ -21,9 +21,11 @@ MeshGL::MeshGL(const MeshGL &mesh) indices = mesh.indices; vertices = mesh.vertices; normals = mesh.normals; + tex_coords = mesh.tex_coords; vbo_vertices = 0; vbo_normals = 0; + vbo_tex_coords = 0; ibo = 0; /* @@ -48,6 +50,7 @@ MeshGL &MeshGL::operator=(const MeshGL &mesh) indices = mesh.indices; vertices = mesh.vertices; normals = mesh.normals; + tex_coords = mesh.tex_coords; return *this; } @@ -60,36 +63,16 @@ MeshGL::~MeshGL() normals.clear(); } -/* void MeshGL::draw() const { - // save the previously bound vao, vbo just in case - int curr_vao; - int curr_vbo; - glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &curr_vao); - glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &curr_vbo); - glBindVertexArray(vao); - glBindBuffer(GL_ARRAY_BUFFER, vbo_vertices); - glVertexPointer(3, GL_FLOAT, 0, 0); - glBindBuffer(GL_ARRAY_BUFFER, vbo_normals); - glNormalPointer(GL_FLOAT, 0, 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); - glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_SHORT, 0); + glDrawElements(GL_TRIANGLES, num_indices, GL_UNSIGNED_INT, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - // return to previous state - glBindBuffer(GL_ARRAY_BUFFER, curr_vbo); - glBindVertexArray(curr_vao); + glBindVertexArray(0); } -*/ void MeshGL::update_vertex_data() { @@ -98,67 +81,76 @@ void MeshGL::update_vertex_data() void MeshGL::update_vbo() { - // save the previously bound vao, vbo just in case - int curr_vao; - int curr_vbo; - glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &curr_vao); - glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &curr_vbo); - + /* vao */ if(!vao) glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - if(which_mask & MESH_NORMAL) { - if(!vbo_normals) { - glGenBuffers(1, &vbo_normals); - } - glBindBuffer(GL_ARRAY_BUFFER, vbo_normals); - if(num_vertices != (int)normals.size()) { - glBufferData(GL_ARRAY_BUFFER, normals.size() * 3 * sizeof(float), - &normals[0], GL_STREAM_DRAW); - } - else { - glBufferSubData(GL_ARRAY_BUFFER, 0, normals.size() * 3 * sizeof(float), - &normals[0]); - } - } - - if(which_mask & MESH_VERTEX) { - if(!vbo_vertices) { - glGenBuffers(1, &vbo_vertices); - } - glBindBuffer(GL_ARRAY_BUFFER, vbo_vertices); - if(num_vertices != (int)vertices.size()) { - glBufferData(GL_ARRAY_BUFFER, vertices.size() * 3 * sizeof(float), - &vertices[0], GL_STREAM_DRAW); - } - else { - glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.size() * 3 * sizeof(float), - &vertices[0]); - } - num_vertices = vertices.size(); - } - - if(which_mask & MESH_INDEX) { - if(!ibo) { - glGenBuffers(1, &ibo); - } - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); - if(num_indices != (int)indices.size()) { - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * 2, - &indices[0], GL_STATIC_DRAW); - } - else { - glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indices.size() * 2, - &indices[0]); - } - num_indices = indices.size(); - } - - /* bind previously bound vbo */ - glBindBuffer(GL_ARRAY_BUFFER, curr_vbo); - glBindVertexArray(curr_vao); + /* vertices */ + + if(!vbo_vertices) + glGenBuffers(1, &vbo_vertices); + glBindBuffer(GL_ARRAY_BUFFER, vbo_vertices); + if(num_vertices != (int)vertices.size()) + glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float) * 3, + &vertices, GL_STATIC_DRAW); + else + glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.size() * sizeof(float) * 3, + &vertices); + num_vertices = vertices.size(); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + /* normals */ + + if(!vbo_normals) + glGenBuffers(1, &vbo_normals); + glBindBuffer(GL_ARRAY_BUFFER, vbo_normals); + if(num_vertices != (int)normals.size()) + glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(float) * 3, + &normals, GL_STATIC_DRAW); + else + glBufferSubData(GL_ARRAY_BUFFER, 0, normals.size() * sizeof(float) * 3, + &normals); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + /* texture coordinates */ + + if(!vbo_tex_coords) + glGenBuffers(1, &vbo_tex_coords); + if(num_vertices != (int)tex_coords.size()) + glBufferData(GL_ARRAY_BUFFER, tex_coords.size() * sizeof(float) * 2, &tex_coords, GL_STATIC_DRAW); + else + glBufferSubData(GL_ARRAY_BUFFER, 0, tex_coords.size() * sizeof(float) * 2, &tex_coords); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + /* indices */ + + if(!ibo) + glGenBuffers(1, &ibo); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); + if(num_indices != (int)indices.size()) + glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * 2, + &indices[0], GL_STATIC_DRAW); + else + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indices.size() * 2, + &indices[0]); + num_indices = indices.size(); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + glEnableVertexAttribArray(MESH_VERTEX); + glEnableVertexAttribArray(MESH_NORMAL); + glEnableVertexAttribArray(MESH_TEXTURE); + + glBindBuffer(GL_ARRAY_BUFFER, vbo_vertices); + glVertexAttribPointer(MESH_VERTEX, 3, GL_FLOAT, GL_FALSE, sizeof(Vec3), 0); + + glBindBuffer(GL_ARRAY_BUFFER, vbo_normals); + glVertexAttribPointer(MESH_NORMAL, 3, GL_FLOAT, GL_FALSE, sizeof(Vec3), 0); + + glBindBuffer(GL_ARRAY_BUFFER, vbo_tex_coords); + glVertexAttribPointer(MESH_TEXTURE, 2, GL_FLOAT, GL_FALSE, sizeof(Vec2), 0); + + glBindVertexArray(0); } void MeshGL::destroy_vbo() @@ -167,8 +159,9 @@ void MeshGL::destroy_vbo() glDeleteBuffers(1, &vbo_vertices); if(vbo_normals) glDeleteBuffers(1, &vbo_normals); + if(vbo_tex_coords) + glDeleteBuffers(1, &vbo_tex_coords); if(ibo) - glDeleteBuffers(1, &ibo); - if(vao) - glDeleteVertexArrays(1, &vao); + if(vao) + glDeleteVertexArrays(1, &vao); } \ No newline at end of file