Rewrote the RemoveUnreferenceVertex to not use bit flags.

This commit is contained in:
Paolo Cignoni 2017-01-22 00:32:44 +01:00
parent 67621588d2
commit ee9c389418
1 changed files with 18 additions and 21 deletions

View File

@ -316,41 +316,38 @@ public:
} }
/** This function removes that are not referenced by any face. The function updates the vn counter. /** This function removes that are not referenced by any face or by any edge.
@param m The mesh @param m The mesh
@param DeleteVertexFlag if false prevent the vertex deletion and just count it.
@return The number of removed vertices @return The number of removed vertices
*/ */
static int RemoveUnreferencedVertex( MeshType& m, bool DeleteVertexFlag=true) // V1.0 static int RemoveUnreferencedVertex( MeshType& m, bool DeleteVertexFlag=true) // V1.0
{ {
FaceIterator fi; tri::RequirePerVertexFlags(m);
EdgeIterator ei;
VertexIterator vi; std::vector<bool> referredVec(m.vert.size(),false);
int referredBit = VertexType::NewBitFlag();
int j;
int deleted = 0; int deleted = 0;
for(vi=m.vert.begin();vi!=m.vert.end();++vi) for(auto fi=m.face.begin();fi!=m.face.end();++fi)
(*vi).ClearUserBit(referredBit);
for(fi=m.face.begin();fi!=m.face.end();++fi)
if( !(*fi).IsD() ) if( !(*fi).IsD() )
for(j=0;j<(*fi).VN();++j) for(auto j=0;j<(*fi).VN();++j)
(*fi).V(j)->SetUserBit(referredBit); referredVec[tri::Index(m,(*fi).V(j))]=true;
for(ei=m.edge.begin();ei!=m.edge.end();++ei) for(auto ei=m.edge.begin();ei!=m.edge.end();++ei)
if( !(*ei).IsD() ){ if( !(*ei).IsD() ){
(*ei).V(0)->SetUserBit(referredBit); referredVec[tri::Index(m,(*ei).V(0))]=true;
(*ei).V(1)->SetUserBit(referredBit); referredVec[tri::Index(m,(*ei).V(1))]=true;
} }
for(vi=m.vert.begin();vi!=m.vert.end();++vi) if(!DeleteVertexFlag)
if( (!(*vi).IsD()) && (!(*vi).IsUserBit(referredBit))) return std::count(referredVec.begin(),referredVec.end(),true);
for(auto vi=m.vert.begin();vi!=m.vert.end();++vi)
if( (!(*vi).IsD()) && (!referredVec[tri::Index(m,*vi)]) )
{ {
if(DeleteVertexFlag) Allocator<MeshType>::DeleteVertex(m,*vi); Allocator<MeshType>::DeleteVertex(m,*vi);
++deleted; ++deleted;
} }
VertexType::DeleteBitFlag(referredBit);
return deleted; return deleted;
} }