struct Face
{
public:
Texture tex; // textur der fläche
int Points[3]; // indizes der 3 punkte
int TexCoords[3]; // indizes der 3 texcoords
int Normals[3]; // indizes der 3 normalen
int Colors[3]; // indizes der 3 farben
M3DVector3f vNormal; // berechnete flächennormale
Edge vEdges[3]; // kanten, aus denen die fläche besteht
...
};
void Objectloader::generateBatch(void) {
// wir haben flist.size flächen
// pro fläche haben wir 3 vertizes
// jedes vertex besteht aus 3d punkt, 3d normale, 2d texcoord und 4d farbe - jeweils float
int vCount = this->flist.size() * 3 * 3;
int nCount = this->flist.size() * 3 * 3;
int tCount = this->flist.size() * 3 * 2;
int cCount = this->flist.size() * 3 * 4;
float *vPtr = (float*)calloc(vCount, sizeof(float));
float *nPtr = (float*)calloc(nCount, sizeof(float));
float *tPtr = (float*)calloc(tCount, sizeof(float));
float *cPtr = (float*)calloc(cCount, sizeof(float));
/*float *vPtr = new float[vCount];
float *nPtr = new float[nCount];
float *tPtr = new float[tCount];
float *cPtr = new float[cCount];*/
// arrays mit daten der flächen füllen
for(int i = 0; i < this->flist.size(); i++) {
for(int j = 0; j < 3; j++) {
vPtr[(i*9)+(j*3)] = this->pointlist[this->flist[i].Points[j]].x;
vPtr[(i*9)+(j*3)+1] = this->pointlist[this->flist[i].Points[j]].y;
vPtr[(i*9)+(j*3)+2] = this->pointlist[this->flist[i].Points[j]].z;
nPtr[(i*9)+(j*3)] = this->vnlist[this->flist[i].Normals[j]].x;
nPtr[(i*9)+(j*3)+1] = this->vnlist[this->flist[i].Normals[j]].y;
nPtr[(i*9)+(j*3)+2] = this->vnlist[this->flist[i].Normals[j]].z;
}
for(int j = 0; j < 3; j++) {
tPtr[(i*6)+(j*2)] = this->vtlist[this->flist[i].TexCoords[j]].x;
tPtr[(i*6)+(j*2)+1] = this->vtlist[this->flist[i].TexCoords[j]].y;
}
for(int j = 0; j < 3; j++) {
cPtr[(i*12)+(j*4)] = this->vclist[this->flist[i].Colors[j]].x;
cPtr[(i*12)+(j*4)+1] = this->vclist[this->flist[i].Colors[j]].y;
cPtr[(i*12)+(j*4)+2] = this->vclist[this->flist[i].Colors[j]].z;
cPtr[(i*12)+(j*4)+3] = this->vclist[this->flist[i].Colors[j]].w;
}
}
glGenVertexArrays(1, &this->vertexArrayObjID); // objekt
glGenBuffers(1, &this->vertexBufferObjID); // geometriedaten (vertizes), texcoords, normalen, farbe - all in one
glBindVertexArray(this->vertexArrayObjID);
GLuint offset = 0;
// VBO für alle daten vorbereiten
glBindBuffer(GL_ARRAY_BUFFER, this->vertexBufferObjID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vPtr)+sizeof(nPtr)+sizeof(tPtr)+sizeof(cPtr), NULL, GL_STATIC_DRAW);
// vertex daten ins VBO kopieren
glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(vPtr), vPtr);
offset += sizeof(vPtr);
// normal daten ins VBO kopieren
glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(nPtr), nPtr);
offset += sizeof(nPtr);
// texcoord daten ins VBO kopieren
glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(tPtr), tPtr);
offset += sizeof(tPtr);
// color daten ins VBO kopieren
glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(cPtr), cPtr);
offset += sizeof(cPtr);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid *)sizeof(vPtr));
glVertexAttribPointer((GLuint)2, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(sizeof(vPtr) + sizeof(nPtr)));
glVertexAttribPointer((GLuint)3, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(sizeof(vPtr) + sizeof(nPtr) + sizeof(tPtr)));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
glBindVertexArray(0);
free(vPtr); vPtr = NULL;
free(nPtr); nPtr = NULL;
free(tPtr); tPtr = NULL;
free(cPtr); cPtr = NULL;
/*delete[] vPtr;
delete[] nPtr;
delete[] tPtr;
delete[] cPtr;*/
}