void Polygon3::addVertex(Vector3 const & p, long index) { // update bounding box... bounds.merge(p); vertices.push_back(IndexedVertex(p, index)); if (index > max_index) max_index = index; }
void GeomCleaner::SortIndexedVertexArray(const float *iVertices, unsigned iVSize, const unsigned *iIndices, unsigned iISize, float **oVertices, unsigned **oIndices) { // First, we build a list of IndexVertex: list<IndexedVertex> indexedVertices; unsigned i; for (i = 0; i < iVSize; i += 3) { indexedVertices.push_back(IndexedVertex(Vec3f(iVertices[i], iVertices[i + 1], iVertices[i + 2]), i / 3)); } // q-sort indexedVertices.sort(); // build the indices mapping array: unsigned *mapIndices = new unsigned[iVSize / 3]; *oVertices = new float[iVSize]; list<IndexedVertex>::iterator iv; unsigned newIndex = 0; unsigned vIndex = 0; for (iv = indexedVertices.begin(); iv != indexedVertices.end(); iv++) { // Build the final results: (*oVertices)[vIndex] = iv->x(); (*oVertices)[vIndex + 1] = iv->y(); (*oVertices)[vIndex + 2] = iv->z(); mapIndices[iv->index()] = newIndex; newIndex++; vIndex += 3; } // Build the final index array: *oIndices = new unsigned[iISize]; for (i = 0; i < iISize; i++) { (*oIndices)[i] = 3 * mapIndices[iIndices[i] / 3]; } delete [] mapIndices; }