#include <GL/glew.h>
+#include <gmath/gmath.h>
#include "mesh-gl.h"
MeshGL::MeshGL()
{
- which_mask = 0;
-
vao = 0;
vbo_vertices = 0;
vbo_normals = 0;
+ vbo_tex_coords = 0;
ibo = 0;
num_vertices = 0;
indices = mesh.indices;
vertices = mesh.vertices;
normals = mesh.normals;
+ tex_coords = mesh.tex_coords;
vbo_vertices = 0;
vbo_normals = 0;
+ vbo_tex_coords = 0;
ibo = 0;
/*
indices = mesh.indices;
vertices = mesh.vertices;
normals = mesh.normals;
+ tex_coords = mesh.tex_coords;
return *this;
}
normals.clear();
}
-/*
void MeshGL::draw() const
{
- // save the previously bound vao, vbo just in case
- int curr_vao;
- int curr_vbo;
- glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &curr_vao);
- glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &curr_vbo);
-
glBindVertexArray(vao);
- glBindBuffer(GL_ARRAY_BUFFER, vbo_vertices);
- glVertexPointer(3, GL_FLOAT, 0, 0);
- glBindBuffer(GL_ARRAY_BUFFER, vbo_normals);
- glNormalPointer(GL_FLOAT, 0, 0);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
-
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_NORMAL_ARRAY);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
- glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_SHORT, 0);
+ glDrawElements(GL_TRIANGLES, num_indices, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_NORMAL_ARRAY);
- // return to previous state
- glBindBuffer(GL_ARRAY_BUFFER, curr_vbo);
- glBindVertexArray(curr_vao);
+ glBindVertexArray(0);
}
-*/
void MeshGL::update_vertex_data()
{
void MeshGL::update_vbo()
{
- // save the previously bound vao, vbo just in case
- int curr_vao;
- int curr_vbo;
- glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &curr_vao);
- glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &curr_vbo);
-
+ /* vao */
if(!vao)
glGenVertexArrays(1, &vao);
-
glBindVertexArray(vao);
- 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);
}
void MeshGL::destroy_vbo()
glDeleteBuffers(1, &vbo_vertices);
if(vbo_normals)
glDeleteBuffers(1, &vbo_normals);
+ if(vbo_tex_coords)
+ glDeleteBuffers(1, &vbo_tex_coords);
if(ibo)
- glDeleteBuffers(1, &ibo);
- if(vao)
- glDeleteVertexArrays(1, &vao);
+ if(vao)
+ glDeleteVertexArrays(1, &vao);
}
\ No newline at end of file
}
mesh->name = std::string(amesh->mName.data);
- mesh->which_mask = 0;
for(unsigned int i=0; i<amesh->mNumVertices; ++i) {
/* vertices */
if(amesh->HasPositions()) {
- mesh->which_mask |= MESH_VERTEX;
Vec3 vertex = Vec3(amesh->mVertices[i].x, amesh->mVertices[i].y,
amesh->mVertices[i].z);
/* normals */
if(amesh->HasNormals()) {
- mesh->which_mask |= MESH_NORMAL;
Vec3 normal = Vec3(amesh->mNormals[i].x, amesh->mNormals[i].y,
amesh->mNormals[i].z);
mesh->normals.push_back(normal);
/* texture coordinates */
if(amesh->mTextureCoords[0]) {
- mesh->which_mask |= MESH_TEXTURE;
Vec2 tex_coord = Vec2(amesh->mTextureCoords[0][i].x, amesh->mTextureCoords[0][i].y);
mesh->tex_coords.push_back(tex_coord);
}
}
/* tangents */
- if(amesh->mTangents) {
- mesh->which_mask |= MESH_TANGENT;
- Vec3 tangent = Vec3(amesh->mTangents[i].x, amesh->mTangents[i].y,
- amesh->mTangents[i].z);
- mesh->tangents.push_back(tangent);
- }
- else {
- mesh->tangents.push_back(Vec3(1, 0, 0));
- }
+ // if(amesh->mTangents) {
+ // mesh->which_mask |= MESH_TANGENT;
+ // Vec3 tangent = Vec3(amesh->mTangents[i].x, amesh->mTangents[i].y,
+ // amesh->mTangents[i].z);
+ // mesh->tangents.push_back(tangent);
+ // }
+ // else {
+ // mesh->tangents.push_back(Vec3(1, 0, 0));
+ // }
}
/* indices (called faces in assimp) */
if(amesh->HasFaces()) {
- mesh->which_mask |= MESH_INDEX;
for(unsigned int i=0; i<amesh->mNumFaces; ++i) {
mesh->indices.push_back(amesh->mFaces[i].mIndices[0]);
mesh->indices.push_back(amesh->mFaces[i].mIndices[1]);