fixed mesh bugs
authorEleni Maria Stea <elene.mst@gmail.com>
Mon, 24 Jul 2017 14:51:57 +0000 (17:51 +0300)
committerEleni Maria Stea <elene.mst@gmail.com>
Mon, 24 Jul 2017 14:51:57 +0000 (17:51 +0300)
src/main.cc
src/mesh.h
src/opengl/mesh-gl.cc
src/opengl/mesh-gl.h
src/opengl/renderer-gl.cc
src/scene.cc

index 4d77441..3c75e31 100644 (file)
@@ -173,5 +173,7 @@ static void display()
        }
        else {
                display_opengl();
+               scene.objects[0]->mesh->update_vertex_data();
+               scene.objects[0]->mesh->draw();
        }
 }
\ No newline at end of file
index a7fb327..57165ba 100644 (file)
@@ -15,9 +15,6 @@ enum {
 };
 
 class Mesh {
-private:
-       // call before draw in gl
-       virtual void update_vertex_data() = 0;
 public:
        std::vector<uint16_t> indices;
        std::vector<Vec3> vertices;
@@ -33,6 +30,7 @@ public:
        virtual ~Mesh() = 0;
 
        virtual void draw() const = 0;
+       virtual void update_vertex_data() = 0;
 };
 
 #endif // MESH_H_
\ No newline at end of file
index e7cf44d..42c2af9 100644 (file)
@@ -27,6 +27,7 @@ MeshGL::MeshGL(const MeshGL &mesh)
        vbo_normals = 0;
        vbo_tex_coords = 0;
        ibo = 0;
+       vao = 0;
 
        /*
         * if we set these to the actual
@@ -65,6 +66,9 @@ MeshGL::~MeshGL()
 
 void MeshGL::draw() const
 {
+       if(!vao)
+               return;
+
        glBindVertexArray(vao);
 
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
@@ -81,6 +85,9 @@ void MeshGL::update_vertex_data()
 
 void MeshGL::update_vbo()
 {
+       if(!num_vertices)
+               return;
+
        /* vao */
        if(!vao)
                glGenVertexArrays(1, &vao);
@@ -92,13 +99,12 @@ void MeshGL::update_vbo()
                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);
+               glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vec3),
+                            &vertices[0], GL_STATIC_DRAW);
        else
-               glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.size() * sizeof(float) * 3,
-                               &vertices);
-       num_vertices = vertices.size();
-       glBindBuffer(GL_ARRAY_BUFFER, 0);
+               glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.size() * sizeof(Vec3),
+                               &vertices[0]);
+       glVertexAttribPointer(MESH_VERTEX, 3, GL_FLOAT, GL_FALSE, sizeof(Vec3), 0);
 
        /* normals */
 
@@ -106,22 +112,23 @@ void MeshGL::update_vbo()
                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);
+               glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(Vec3),
+                            &normals[0], GL_STATIC_DRAW);
        else
-               glBufferSubData(GL_ARRAY_BUFFER, 0, normals.size() * sizeof(float) * 3,
-                               &normals);
-       glBindBuffer(GL_ARRAY_BUFFER, 0);
+               glBufferSubData(GL_ARRAY_BUFFER, 0, normals.size() * sizeof(Vec3),
+                               &normals[0]);
+       glVertexAttribPointer(MESH_NORMAL, 3, GL_FLOAT, GL_FALSE, sizeof(Vec3), 0);
 
        /* texture coordinates */
 
        if(!vbo_tex_coords)
                glGenBuffers(1, &vbo_tex_coords);
+       glBindBuffer(GL_ARRAY_BUFFER, 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);
+               glBufferData(GL_ARRAY_BUFFER, tex_coords.size() * sizeof(Vec2), &tex_coords[0], GL_STATIC_DRAW);
        else
-               glBufferSubData(GL_ARRAY_BUFFER, 0, tex_coords.size() * sizeof(float) * 2, &tex_coords);
-       glBindBuffer(GL_ARRAY_BUFFER, 0);
+               glBufferSubData(GL_ARRAY_BUFFER, 0, tex_coords.size() * sizeof(Vec2), &tex_coords[0]);
+       glVertexAttribPointer(MESH_TEXTURE, 2, GL_FLOAT, GL_FALSE, sizeof(Vec2), 0);
 
        /* indices */
 
@@ -134,22 +141,17 @@ void MeshGL::update_vbo()
        else
                glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indices.size() * 2,
                                &indices[0]);
+
        num_indices = indices.size();
-       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+       num_vertices = vertices.size();
 
        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);
 
+       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+       glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindVertexArray(0);
 }
 
index f935a59..ab1ea07 100644 (file)
@@ -16,6 +16,11 @@ private:
        int num_vertices;
        int num_indices;
 
+       void update_vbo();
+
+protected:
+       virtual void update_vertex_data() override;
+
 public:
        MeshGL();
        MeshGL(const MeshGL &mesh);
@@ -24,9 +29,7 @@ public:
        virtual ~MeshGL();
 
        virtual void draw() const override;
-       virtual void update_vertex_data() override;
 
-       void update_vbo();
        void destroy_vbo();
 };
 
index 8ff53ca..6eaafda 100644 (file)
@@ -33,6 +33,7 @@ bool RendererGL::create()
 
 void RendererGL::draw_object(Object *object) const
 {
+       object->mesh->draw();
 }
 
 void RendererGL::draw() const
index c640847..c13e081 100644 (file)
@@ -66,6 +66,7 @@ bool Scene::load(const char *fname)
                        fprintf(stderr, "Failed to load mesh no: %d.\n", i);
                        return false;
                }
+               mesh->update_vertex_data();
                meshes.push_back(mesh);
        }