9 # if defined(__GNUC__) && (__GNUC__ >= 3)
12 # include <hash_map.h>
24 #include "../system/TimeUtils.h"
32 void GeomCleaner::SortIndexedVertexArray(
const float *iVertices,
34 const unsigned *iIndices,
40 list<IndexedVertex> indexedVertices;
42 for (i = 0; i < iVSize; i += 3) {
43 indexedVertices.emplace_back(
Vec3f(iVertices[i], iVertices[i + 1], iVertices[i + 2]), i / 3);
47 indexedVertices.sort();
50 unsigned *mapIndices =
new unsigned[iVSize / 3];
51 *oVertices =
new float[iVSize];
52 list<IndexedVertex>::iterator iv;
53 unsigned newIndex = 0;
55 for (iv = indexedVertices.begin(); iv != indexedVertices.end(); iv++) {
57 (*oVertices)[vIndex] = iv->x();
58 (*oVertices)[vIndex + 1] = iv->y();
59 (*oVertices)[vIndex + 2] = iv->z();
61 mapIndices[iv->index()] = newIndex;
67 *oIndices =
new unsigned[iISize];
68 for (i = 0; i < iISize; i++) {
69 (*oIndices)[i] = 3 * mapIndices[iIndices[i] / 3];
75 void GeomCleaner::CompressIndexedVertexArray(
const float *iVertices,
77 const unsigned *iIndices,
84 vector<Vec3f> vertices;
86 for (i = 0; i < iVSize; i += 3) {
87 vertices.emplace_back(iVertices[i], iVertices[i + 1], iVertices[i + 2]);
90 unsigned *mapVertex =
new unsigned[iVSize];
91 vector<Vec3f>::iterator
v = vertices.begin();
93 vector<Vec3f> compressedVertices;
96 compressedVertices.push_back(vertices.front());
101 for (;
v != vertices.end();
v++) {
103 if (current == previous) {
104 mapVertex[i] = compressedVertices.size() - 1;
107 compressedVertices.push_back(current);
108 mapVertex[i] = compressedVertices.size() - 1;
115 *oVSize = 3 * compressedVertices.size();
116 *oVertices =
new float[*oVSize];
118 for (
v = compressedVertices.begin();
v != compressedVertices.end();
v++) {
119 (*oVertices)[i] = (*v)[0];
120 (*oVertices)[i + 1] = (*v)[1];
121 (*oVertices)[i + 2] = (*v)[2];
126 *oIndices =
new unsigned[iISize];
127 for (i = 0; i < iISize; i++) {
128 (*oIndices)[i] = 3 * mapVertex[iIndices[i] / 3];
134 void GeomCleaner::SortAndCompressIndexedVertexArray(
const float *iVertices,
136 const unsigned *iIndices,
144 unsigned *tmpIndices;
149 GeomCleaner::SortIndexedVertexArray(
150 iVertices, iVSize, iIndices, iISize, &tmpVertices, &tmpIndices);
152 printf(
"Sorting: %lf sec.\n", chrono.
stop());
157 GeomCleaner::CompressIndexedVertexArray(
158 tmpVertices, iVSize, tmpIndices, iISize, oVertices, oVSize, oIndices);
161 printf(
"Merging: %lf sec.\n", duration);
165 delete[] tmpVertices;
171 #define _MUL 950706376UL
172 #define _MOD 2147483647UL
175 size_t res = ((
unsigned long)(p[0] *
_MUL)) %
_MOD;
176 res = ((res + (
unsigned long)(p[1]) *
_MUL)) %
_MOD;
177 return ((res + (
unsigned long)(p[2]) *
_MUL)) %
_MOD;
183 void GeomCleaner::CleanIndexedVertexArray(
const float *iVertices,
185 const unsigned *iIndices,
191 using cleanHashTable = map<Vec3f, unsigned>;
192 vector<Vec3f> vertices;
194 for (i = 0; i < iVSize; i += 3) {
195 vertices.emplace_back(iVertices[i], iVertices[i + 1], iVertices[i + 2]);
199 vector<unsigned> newIndices;
200 vector<Vec3f> newVertices;
203 unsigned currentIndex = 0;
204 vector<Vec3f>::const_iterator
v = vertices.begin();
205 vector<Vec3f>::const_iterator end = vertices.end();
206 cleanHashTable::const_iterator found;
207 for (;
v != end;
v++) {
209 if (found != ht.end()) {
211 newIndices.push_back((*found).second);
214 newVertices.push_back(*
v);
215 newIndices.push_back(currentIndex);
216 ht[*
v] = currentIndex;
222 *oVSize = 3 * newVertices.size();
223 *oVertices =
new float[*oVSize];
225 end = newVertices.end();
226 for (
v = newVertices.begin();
v != end;
v++) {
227 (*oVertices)[currentIndex++] = (*v)[0];
228 (*oVertices)[currentIndex++] = (*v)[1];
229 (*oVertices)[currentIndex++] = (*v)[2];
233 *oIndices =
new unsigned[iISize];
234 for (i = 0; i < iISize; i++) {
235 (*oIndices)[i] = 3 * newIndices[iIndices[i] / 3];
Class to define a cleaner of geometry providing a set of useful tools.
ATTR_WARN_UNUSED_RESULT const BMVert * v
size_t operator()(const Vec3r &p) const