quick backup of the renderer - things missing
[demo] / src / opengl / mesh-gl.cc
index a6efb7d..e7cf44d 100644 (file)
@@ -1,15 +1,15 @@
 #include <GL/glew.h>
+#include <gmath/gmath.h>
 
 #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