1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
#include "Mesh.h"
using namespace std;
Mesh::Mesh(): m_OBJFile(m_faces)
{
m_nbVertex = 0;
}
bool Mesh::Load(const std::string& fileName){
if(!m_OBJFile.Load(fileName))
return false;
glGenBuffersARB(1, &m_indexBuffer);
glGenBuffersARB(3, buffer);
cout << "nb vertex: " << m_OBJFile.GetNbVertex() << "\n";
cout << "nb face: " << m_faces.size() << "\n";
for (int i = 0; i < m_faces[0].Positions.size(); i++)
{
cout << "face0: " << m_faces[0].Positions[i] << "\n";
}
//alloc memory for position, texture and normal buffers
for(unsigned int i = 0; i < 3; i ++) {
glBindBufferARB(GL_ARRAY_BUFFER, buffer[i]);
glBufferDataARB(GL_ARRAY_BUFFER, m_OBJFile.GetNbVertex() * sizeof(float) * 3, NULL, GL_STREAM_DRAW);
}
std::vector<unsigned int> index;
unsigned int currentOffset = 0;
unsigned int begin = 0;
for(unsigned int i = 0; i < m_faces.size(); i ++){
//position buffer sub data
glBindBufferARB(GL_ARRAY_BUFFER, buffer[POSITION]);
glBufferSubDataARB(GL_ARRAY_BUFFER, currentOffset,m_faces[i].Positions.size()*sizeof(float), &(m_faces[i].Positions[0]) );
//texture buffer sub data
glBindBufferARB(GL_ARRAY_BUFFER, buffer[TEXTURE]);
glBufferSubDataARB(GL_ARRAY_BUFFER, currentOffset,m_faces[i].Textures.size()*sizeof(float), &(m_faces[i].Textures[0]) );
//normals buffer sub data
glBindBufferARB(GL_ARRAY_BUFFER, buffer[NORMAL]);
glBufferSubDataARB(GL_ARRAY_BUFFER, currentOffset,m_faces[i].Normals.size()*sizeof(float), &(m_faces[i].Normals[0]) );
glBindBufferARB(GL_ARRAY_BUFFER, 0);
PolytoTriangles(index, m_faces[i].Positions.size()/3, begin);
begin += m_faces[i].Positions.size()/3;
currentOffset += m_faces[i].Positions.size();
//cout << m_faces[i].Textures.size()*sizeof(float) << endl;
if (m_faces[i].Textures.size() != m_faces[i].Positions.size()
|| m_faces[i].Normals.size() != m_faces[i].Positions.size())
{
exit(0);
}
m_nbVertex += m_faces[i].Positions.size();
}
cout << "index size: " << index.size() << "\n";
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * index.size(), NULL, GL_STREAM_DRAW);
glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER,0, sizeof(unsigned int) * index.size(), &index[0]);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0);
return true;
}
void Mesh::Draw(){
glEnableClientState(GL_INDEX_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glColor3f(1, 1, 1);
glBindBufferARB(GL_ARRAY_BUFFER, buffer[POSITION]);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBufferARB(GL_ARRAY_BUFFER, buffer[TEXTURE]);
glTexCoordPointer(3, GL_FLOAT, 0, 0);
glBindBufferARB(GL_ARRAY_BUFFER, buffer[NORMAL]);
glNormalPointer(GL_FLOAT, 0, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
glDrawElements(GL_TRIANGLES, m_nbVertex, GL_UNSIGNED_INT, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0);
if (glGetError() != GL_NO_ERROR)
{
// ca peut aider a trouver ses erreurs :)
exit(1);
}
}
void Mesh::PolytoTriangles(vector<unsigned int>& v, const unsigned int s, const int begin){
for(unsigned int i = 1; i < s - 1; i ++){
v.push_back(begin);
v.push_back(begin+i);
v.push_back(begin+i+1);
cout << begin << " "<< begin +i << " " <<begin + i + 1 << endl;
}
} |
Partager