#include <GL/glew.h>
+#include <GL/gl.h>
#include <gmath/gmath.h>
#include "mesh-gl.h"
vbo_normals = 0;
vbo_tex_coords = 0;
ibo = 0;
+ vao = 0;
/*
* if we set these to the actual
glBindVertexArray(vao);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
- glDrawElements(GL_TRIANGLES, num_indices, GL_UNSIGNED_INT, 0);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ glDrawElements(GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, 0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
void MeshGL::update_vbo()
{
+ if(vertices.empty()) {
+ printf("empty vertices\n");
+ return;
+ }
+
/* vao */
if(!vao)
glGenVertexArrays(1, &vao);
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 */
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);
+
+ num_vertices = vertices.size();
/* indices */
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);
-
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}