Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 namespace PolyVox
00025 {
00026 template <typename VertexType>
00027 SurfaceMesh<VertexType>::SurfaceMesh()
00028 {
00029 m_iTimeStamp = -1;
00030 }
00031
00032 template <typename VertexType>
00033 SurfaceMesh<VertexType>::~SurfaceMesh()
00034 {
00035 }
00036
00037 template <typename VertexType>
00038 const std::vector<uint32_t>& SurfaceMesh<VertexType>::getIndices(void) const
00039 {
00040 return m_vecTriangleIndices;
00041 }
00042
00043 template <typename VertexType>
00044 uint32_t SurfaceMesh<VertexType>::getNoOfIndices(void) const
00045 {
00046 return m_vecTriangleIndices.size();
00047 }
00048
00049 template <typename VertexType>
00050 uint32_t SurfaceMesh<VertexType>::getNoOfNonUniformTrianges(void) const
00051 {
00052 uint32_t result = 0;
00053 for(uint32_t i = 0; i < m_vecTriangleIndices.size() - 2; i += 3)
00054 {
00055 if((m_vecVertices[m_vecTriangleIndices[i]].getMaterial() == m_vecVertices[m_vecTriangleIndices[i+1]].getMaterial())
00056 && (m_vecVertices[m_vecTriangleIndices[i]].getMaterial() == m_vecVertices[m_vecTriangleIndices[i+2]].getMaterial()))
00057 {
00058 }
00059 else
00060 {
00061 result++;
00062 }
00063 }
00064 return result;
00065 }
00066
00067 template <typename VertexType>
00068 uint32_t SurfaceMesh<VertexType>::getNoOfUniformTrianges(void) const
00069 {
00070 uint32_t result = 0;
00071 for(uint32_t i = 0; i < m_vecTriangleIndices.size() - 2; i += 3)
00072 {
00073 if((m_vecVertices[m_vecTriangleIndices[i]].getMaterial() == m_vecVertices[m_vecTriangleIndices[i+1]].getMaterial())
00074 && (m_vecVertices[m_vecTriangleIndices[i]].getMaterial() == m_vecVertices[m_vecTriangleIndices[i+2]].getMaterial()))
00075 {
00076 result++;
00077 }
00078 }
00079 return result;
00080 }
00081
00082 template <typename VertexType>
00083 uint32_t SurfaceMesh<VertexType>::getNoOfVertices(void) const
00084 {
00085 return m_vecVertices.size();
00086 }
00087
00088 template <typename VertexType>
00089 std::vector<VertexType>& SurfaceMesh<VertexType>::getRawVertexData(void)
00090 {
00091 return m_vecVertices;
00092 }
00093
00094 template <typename VertexType>
00095 const std::vector<VertexType>& SurfaceMesh<VertexType>::getVertices(void) const
00096 {
00097 return m_vecVertices;
00098 }
00099
00100 template <typename VertexType>
00101 void SurfaceMesh<VertexType>::addTriangle(uint32_t index0, uint32_t index1, uint32_t index2)
00102 {
00103 m_vecTriangleIndices.push_back(index0);
00104 m_vecTriangleIndices.push_back(index1);
00105 m_vecTriangleIndices.push_back(index2);
00106
00107 if((m_vecVertices[index0].material == m_vecVertices[index1].material) && (m_vecVertices[index0].material == m_vecVertices[index2].material))
00108 {
00109 m_mapUsedMaterials.insert(m_vecVertices[index0].material);
00110 }
00111 }
00112
00113 template <typename VertexType>
00114 void SurfaceMesh<VertexType>::addTriangleCubic(uint32_t index0, uint32_t index1, uint32_t index2)
00115 {
00116 m_vecTriangleIndices.push_back(index0);
00117 m_vecTriangleIndices.push_back(index1);
00118 m_vecTriangleIndices.push_back(index2);
00119 }
00120
00121 template <typename VertexType>
00122 uint32_t SurfaceMesh<VertexType>::addVertex(const VertexType& vertex)
00123 {
00124 m_vecVertices.push_back(vertex);
00125 return m_vecVertices.size() - 1;
00126 }
00127
00128 template <typename VertexType>
00129 void SurfaceMesh<VertexType>::clear(void)
00130 {
00131 m_vecVertices.clear();
00132 m_vecTriangleIndices.clear();
00133 m_vecLodRecords.clear();
00134 m_mapUsedMaterials.clear();
00135 }
00136
00137 template <typename VertexType>
00138 bool SurfaceMesh<VertexType>::isEmpty(void) const
00139 {
00140 return (getNoOfVertices() == 0) || (getNoOfIndices() == 0);
00141 }
00142
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309 template <typename VertexType>
00310 int SurfaceMesh<VertexType>::noOfDegenerateTris(void)
00311 {
00312 int count = 0;
00313 for(uint32_t triCt = 0; triCt < m_vecTriangleIndices.size();)
00314 {
00315 int v0 = m_vecTriangleIndices[triCt];
00316 triCt++;
00317 int v1 = m_vecTriangleIndices[triCt];
00318 triCt++;
00319 int v2 = m_vecTriangleIndices[triCt];
00320 triCt++;
00321
00322 if((v0 == v1) || (v1 == v2) || (v2 == v0))
00323 {
00324 count++;
00325 }
00326 }
00327 return count;
00328 }
00329
00330 template <typename VertexType>
00331 void SurfaceMesh<VertexType>::removeDegenerateTris(void)
00332 {
00333 int noOfNonDegenerate = 0;
00334 int targetCt = 0;
00335 for(uint32_t triCt = 0; triCt < m_vecTriangleIndices.size();)
00336 {
00337 int v0 = m_vecTriangleIndices[triCt];
00338 triCt++;
00339 int v1 = m_vecTriangleIndices[triCt];
00340 triCt++;
00341 int v2 = m_vecTriangleIndices[triCt];
00342 triCt++;
00343
00344 if((v0 != v1) && (v1 != v2) & (v2 != v0))
00345 {
00346 m_vecTriangleIndices[targetCt] = v0;
00347 targetCt++;
00348 m_vecTriangleIndices[targetCt] = v1;
00349 targetCt++;
00350 m_vecTriangleIndices[targetCt] = v2;
00351 targetCt++;
00352
00353 noOfNonDegenerate++;
00354 }
00355 }
00356
00357 m_vecTriangleIndices.resize(noOfNonDegenerate * 3);
00358 }
00359
00360 template <typename VertexType>
00361 void SurfaceMesh<VertexType>::removeUnusedVertices(void)
00362 {
00363 std::vector<bool> isVertexUsed(m_vecVertices.size());
00364 fill(isVertexUsed.begin(), isVertexUsed.end(), false);
00365
00366 for(uint32_t triCt = 0; triCt < m_vecTriangleIndices.size(); triCt++)
00367 {
00368 int v = m_vecTriangleIndices[triCt];
00369 isVertexUsed[v] = true;
00370 }
00371
00372 int noOfUsedVertices = 0;
00373 std::vector<uint32_t> newPos(m_vecVertices.size());
00374 for(uint32_t vertCt = 0; vertCt < m_vecVertices.size(); vertCt++)
00375 {
00376 if(isVertexUsed[vertCt])
00377 {
00378 m_vecVertices[noOfUsedVertices] = m_vecVertices[vertCt];
00379 newPos[vertCt] = noOfUsedVertices;
00380 noOfUsedVertices++;
00381 }
00382 }
00383
00384 m_vecVertices.resize(noOfUsedVertices);
00385
00386 for(uint32_t triCt = 0; triCt < m_vecTriangleIndices.size(); triCt++)
00387 {
00388 m_vecTriangleIndices[triCt] = newPos[m_vecTriangleIndices[triCt]];
00389 }
00390 }
00391
00392
00393 template <typename VertexType>
00394 polyvox_shared_ptr< SurfaceMesh<VertexType> > extractSubset(SurfaceMesh<VertexType>& inputMesh, std::set<uint8_t> setMaterials)
00395 {
00396 polyvox_shared_ptr< SurfaceMesh<VertexType> > result(new SurfaceMesh<VertexType>);
00397
00398 result->m_Region = inputMesh.m_Region;
00399
00400 if(inputMesh.m_vecVertices.size() == 0)
00401 {
00402 return result;
00403 }
00404
00405 assert(inputMesh.m_vecLodRecords.size() == 1);
00406 if(inputMesh.m_vecLodRecords.size() != 1)
00407 {
00408
00409 return result;
00410 }
00411
00412 std::vector<int32_t> indexMap(inputMesh.m_vecVertices.size());
00413 std::fill(indexMap.begin(), indexMap.end(), -1);
00414
00415 for(uint32_t triCt = 0; triCt < inputMesh.m_vecTriangleIndices.size(); triCt += 3)
00416 {
00417
00418 VertexType& v0 = inputMesh.m_vecVertices[inputMesh.m_vecTriangleIndices[triCt]];
00419 VertexType& v1 = inputMesh.m_vecVertices[inputMesh.m_vecTriangleIndices[triCt + 1]];
00420 VertexType& v2 = inputMesh.m_vecVertices[inputMesh.m_vecTriangleIndices[triCt + 2]];
00421
00422 if(
00423 (setMaterials.find(v0.getMaterial()) != setMaterials.end()) ||
00424 (setMaterials.find(v1.getMaterial()) != setMaterials.end()) ||
00425 (setMaterials.find(v2.getMaterial()) != setMaterials.end()))
00426 {
00427 uint32_t i0;
00428 if(indexMap[inputMesh.m_vecTriangleIndices[triCt]] == -1)
00429 {
00430 indexMap[inputMesh.m_vecTriangleIndices[triCt]] = result->addVertex(v0);
00431 }
00432 i0 = indexMap[inputMesh.m_vecTriangleIndices[triCt]];
00433
00434 uint32_t i1;
00435 if(indexMap[inputMesh.m_vecTriangleIndices[triCt+1]] == -1)
00436 {
00437 indexMap[inputMesh.m_vecTriangleIndices[triCt+1]] = result->addVertex(v1);
00438 }
00439 i1 = indexMap[inputMesh.m_vecTriangleIndices[triCt+1]];
00440
00441 uint32_t i2;
00442 if(indexMap[inputMesh.m_vecTriangleIndices[triCt+2]] == -1)
00443 {
00444 indexMap[inputMesh.m_vecTriangleIndices[triCt+2]] = result->addVertex(v2);
00445 }
00446 i2 = indexMap[inputMesh.m_vecTriangleIndices[triCt+2]];
00447
00448 result->addTriangle(i0,i1,i2);
00449 }
00450 }
00451
00452 result->m_vecLodRecords.clear();
00453 LodRecord lodRecord;
00454 lodRecord.beginIndex = 0;
00455 lodRecord.endIndex = result->getNoOfIndices();
00456 result->m_vecLodRecords.push_back(lodRecord);
00457
00458 return result;
00459 }
00460
00461 template <typename VertexType>
00462 void SurfaceMesh<VertexType>::scaleVertices(float amount)
00463 {
00464 for(uint32_t ct = 0; ct < m_vecVertices.size(); ct++)
00465 {
00466
00467 Vector3DFloat position = m_vecVertices[ct].getPosition();
00468 position *= amount;
00469 m_vecVertices[ct].setPosition(position);
00470 }
00471 }
00472
00473 template <typename VertexType>
00474 void SurfaceMesh<VertexType>::translateVertices(const Vector3DFloat& amount)
00475 {
00476 for(uint32_t ct = 0; ct < m_vecVertices.size(); ct++)
00477 {
00478
00479 Vector3DFloat position = m_vecVertices[ct].getPosition();
00480 position += amount;
00481 m_vecVertices[ct].setPosition(position);
00482 }
00483 }
00484 }