From 4bc86b416f29b4889075ad5c8dfdb1e11454a6c3 Mon Sep 17 00:00:00 2001 From: Eleni Maria Stea Date: Mon, 24 Jul 2017 17:51:57 +0300 Subject: [PATCH] fixed mesh bugs --- src/main.cc | 2 ++ src/mesh.h | 4 +--- src/opengl/mesh-gl.cc | 48 +++++++++++++++++++++++---------------------- src/opengl/mesh-gl.h | 7 +++++-- src/opengl/renderer-gl.cc | 1 + src/scene.cc | 1 + 6 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/main.cc b/src/main.cc index 4d77441..3c75e31 100644 --- a/src/main.cc +++ b/src/main.cc @@ -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 diff --git a/src/mesh.h b/src/mesh.h index a7fb327..57165ba 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -15,9 +15,6 @@ enum { }; class Mesh { -private: - // call before draw in gl - virtual void update_vertex_data() = 0; public: std::vector indices; std::vector 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 diff --git a/src/opengl/mesh-gl.cc b/src/opengl/mesh-gl.cc index e7cf44d..42c2af9 100644 --- a/src/opengl/mesh-gl.cc +++ b/src/opengl/mesh-gl.cc @@ -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); } diff --git a/src/opengl/mesh-gl.h b/src/opengl/mesh-gl.h index f935a59..ab1ea07 100644 --- a/src/opengl/mesh-gl.h +++ b/src/opengl/mesh-gl.h @@ -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(); }; diff --git a/src/opengl/renderer-gl.cc b/src/opengl/renderer-gl.cc index 8ff53ca..6eaafda 100644 --- a/src/opengl/renderer-gl.cc +++ b/src/opengl/renderer-gl.cc @@ -33,6 +33,7 @@ bool RendererGL::create() void RendererGL::draw_object(Object *object) const { + object->mesh->draw(); } void RendererGL::draw() const diff --git a/src/scene.cc b/src/scene.cc index c640847..c13e081 100644 --- a/src/scene.cc +++ b/src/scene.cc @@ -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); } -- 1.7.10.4