fixed terrain rendering - visualized normals
[demo] / src / opengl / mesh-gl.cc
index 4707f11..f0956b4 100644 (file)
@@ -15,6 +15,9 @@ MeshGL::MeshGL()
 
        num_vertices = 0;
        num_indices = 0;
+
+       /* draw normals */
+       nvao = nvbo = 0;
 }
 
 MeshGL::MeshGL(const MeshGL &mesh)
@@ -30,6 +33,9 @@ MeshGL::MeshGL(const MeshGL &mesh)
        ibo = 0;
        vao = 0;
 
+       /* draw normals */
+       nvao = nvbo = 0;
+
        /*
         * if we set these to the actual
         * vertices.size() and indices.size()
@@ -76,6 +82,36 @@ void MeshGL::draw() const
        glBindVertexArray(0);
 }
 
+void MeshGL::draw_normals(float scale) const
+{
+       if(!nvao) {
+               glGenVertexArrays(1, &nvao);
+               glBindVertexArray(nvao);
+
+               glGenBuffers(1, &nvbo);
+               glBindBuffer(GL_ARRAY_BUFFER, nvbo);
+               
+               glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(Vec3) * 2, 0, GL_STATIC_DRAW);
+               Vec3 *data = (Vec3 *)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
+
+               for (size_t i = 0; i < normals.size(); i++)
+               {
+                       *data++ = vertices[i];
+                       *data++ = vertices[i] + normals[i] * scale;
+               }
+               glUnmapBuffer(GL_ARRAY_BUFFER);
+
+               glVertexAttribPointer(MESH_VERTEX, 3, GL_FLOAT, GL_FALSE, sizeof(Vec3), 0);
+               glEnableVertexAttribArray(MESH_VERTEX);
+               glBindBuffer(GL_ARRAY_BUFFER, 0);
+       } else {
+               glBindVertexArray(nvao);
+       }
+
+       glDrawArrays(GL_LINES, 0, normals.size() * 2);
+       glBindVertexArray(0);
+}
+
 void MeshGL::update_vertex_data()
 {
        update_vbo();
@@ -164,6 +200,12 @@ void MeshGL::destroy_vbo()
        if(vbo_tex_coords)
                glDeleteBuffers(1, &vbo_tex_coords);
        if(ibo)
-               if(vao)
-                       glDeleteVertexArrays(1, &vao);
+               glDeleteBuffers(1, &ibo);
+       if (vao)
+               glDeleteVertexArrays(1, &vao);
+
+       if(nvbo)
+               glDeleteBuffers(1, &nvbo);
+       if(nvao)
+               glDeleteVertexArrays(1, &nvao);
 }
\ No newline at end of file