Commit 10524351 by Alisa Jung

push last offset for vertex points

precompute new indexbuffer - new vertexbuffer first contains vertex points in order of original vertices in vertex buffer - new vertexbuffer then contains edge points that were created in order of edgeIndices
parent 593c1962
......@@ -50,13 +50,32 @@ Mesh *Subdivision::subdivide(Mesh *mesh) {
QVector<QVector<unsigned int> > edgeIndices;
QVector<unsigned int> vertexIndices;
QVector<unsigned int> vertexIndicesOffsets;
precomputeTables(mesh, edgeIndices, vertexIndices, vertexIndicesOffsets);
/*
* Die Indices im neuen Indexbuffer gehen davon aus,
* dass im neuen Vertex-buffer erst die Vertex-points kommen,
* die direkt aus den Vertices aus dem Vertexbuffer erstellt werden,
* und dann die Edgepoints in der Reihenfolge von edgeIndices.
* */
QVector<unsigned int> newIndexBuffer;
precomputeTables(mesh, edgeIndices, vertexIndices, vertexIndicesOffsets, newIndexBuffer);
runShader(mesh, edgeIndices);
return NULL;
}
/**
* @brief Subdivision::precomputeTables
* @param mesh
* @param edgeIndices_base Wird gefüllt mit 4er-Arrays, die die indices in den alten Vertexbuffer enthalten, von denen der jeweilige edge-point abhängt
* @param vertexIndices Wird gefüllt mit Folgen von ints, die die indices in den alten Vertexbuffer enthalten, von denen die neuen vertex-points abhängen
* @param vertexIndicesOffsets enthält offsets in vertexIndices
* @param newIndexBuffer Wird gefüllt mit neuem Indexbuffer. Der Indexbuffer geht davon aus, dass im neuen Vertex-Buffer
* erst die Vertex-points (in der selben Reihenfolge wie im ursprünglichen Vertex-Buffer) und dann die Edgepoints kommen.
*
* Einträge in neuem Vertex-buffer: Verschobene Knoten aus altem Vertex-Buffer :: edge-vertices erstellt aus edgeIndices_base.
*/
void Subdivision::precomputeTables(Mesh *mesh, QVector<QVector<unsigned int> > &edgeIndices_base,
QVector<unsigned int> &vertexIndices, QVector<unsigned int> &vertexIndicesOffsets) {
QVector<unsigned int> &vertexIndices, QVector<unsigned int> &vertexIndicesOffsets,
QVector<unsigned int> &newIndexBuffer) {
Mesh::Node root = mesh->getRootNode();
int firstMeshEntryIndex = -1;
......@@ -78,6 +97,7 @@ void Subdivision::precomputeTables(Mesh *mesh, QVector<QVector<unsigned int> > &
//compute edge table
//Format: first two entries: edge vertices. last two entries: distant vertices.
unsigned int nib_offset = vb.length();
for (int i = 0; i < ib.length(); i+=3){
//schaue alle dreiecke an
......@@ -158,7 +178,6 @@ void Subdivision::precomputeTables(Mesh *mesh, QVector<QVector<unsigned int> > &
}
}
//find indices for edge point on xy-edge
for (int j = 0; j < ib.length(); j+= 3){
if (j != i){
......@@ -185,8 +204,25 @@ void Subdivision::precomputeTables(Mesh *mesh, QVector<QVector<unsigned int> > &
}
}
}//quadratische Laufzeit ftw
//add indices to new index buffer
newIndexBuffer.push_back(ib[i]);
newIndexBuffer.push_back(nib_offset + 3*i);
newIndexBuffer.push_back(nib_offset + 3*i + 2);
newIndexBuffer.push_back(ib[i+1]);
newIndexBuffer.push_back(nib_offset + 3*i + 1);
newIndexBuffer.push_back(nib_offset + 3*i);
newIndexBuffer.push_back(ib[i+2]);
newIndexBuffer.push_back(nib_offset + 3*i + 2);
newIndexBuffer.push_back(nib_offset + 3*i + 1);
newIndexBuffer.push_back(nib_offset + 3*i);
newIndexBuffer.push_back(nib_offset + 3*i + 1);
newIndexBuffer.push_back(nib_offset + 3*i + 2);
//Wichtig: Wir gehen davon aus, dass wir geschlossene Oberflächen haben, dh für jede Kante von einem Dreieck wird eine passende Kante bei einem anderen Dreieck gefunden.
}
}//for each index in indexbuffer
qDebug()<<"Done with edge table. "<<edgeIndices_base.length()<<" edges found. Table: "<<edgeIndices_base;
if (true){
......@@ -258,6 +294,8 @@ void Subdivision::precomputeTables(Mesh *mesh, QVector<QVector<unsigned int> > &
qDebug()<<"Done with vertex index table. ";
vertexIndicesOffsets.push_back(offset);
qDebug()<<"Duplicates: ";
for (int i = 0; i < duplicates.length(); i++){
qDebug()<<duplicates[i];
......
......@@ -21,7 +21,8 @@ private:
QOpenGLShaderProgram *initEdgeComputeShaderProgram();
void precomputeTables(Mesh *mesh, QVector<QVector<unsigned int> > &edgeIndices_base,
QVector<unsigned int> &vertexIndices, QVector<unsigned int> &vertexIndicesOffsets);
QVector<unsigned int> &vertexIndices, QVector<unsigned int> &vertexIndicesOffsets,
QVector<unsigned int> &newIndexBuffer);
void runShader(Mesh *mesh, QVector<QVector<unsigned int> > &edgeIndices);
QVector<unsigned int> fillVector(unsigned int a, unsigned int b, unsigned int c,unsigned int d);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment