- 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);