diff --git a/vcg/complex/algorithms/clean.h b/vcg/complex/algorithms/clean.h index 676fd800..706b5963 100644 --- a/vcg/complex/algorithms/clean.h +++ b/vcg/complex/algorithms/clean.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -457,6 +458,60 @@ public: return count_removed; } + static int SplitSelectedVertexOnEdgeMesh(MeshType& m) + { + tri::RequireCompactness(m); + tri::UpdateFlags::VertexClearV(m); + for(size_t i=0;iIsS()) + { + if(!vp->IsV()) + m.edge[i].V(j) = &*(tri::Allocator::AddVertex(m,vp->P())); + else vp->SetV(); + } + } + } + } + + + static void SelectNonManifoldVertexOnEdgeMesh(MeshType &m) + { + tri::RequireCompactness(m); + tri::UpdateSelection::VertexClear(m); + std::vector cnt(m.vn,0); + + for(size_t i=0;i2) m.vert[i].SetS(); + } + + static void SelectCreaseVertexOnEdgeMesh(MeshType &m, ScalarType AngleRadThr) + { + tri::RequireCompactness(m); + tri::RequireVEAdjacency(m); + tri::UpdateTopology::VertexEdge(m); + for(size_t i=0;i VVStarVec; + edge::VVStarVE(&(m.vert[i]),VVStarVec); + if(VVStarVec.size()==2) + { + CoordType v0 = m.vert[i].P() - VVStarVec[0]->P(); + CoordType v1 = m.vert[i].P() - VVStarVec[1]->P(); + float angle = M_PI-vcg::Angle(v0,v1); + if(angle > AngleRadThr) m.vert[i].SetS(); + } + } + } + /// Removal of faces that were incident on a non manifold edge. @@ -623,6 +678,22 @@ public: } + static bool IsFaceFauxConsistent(MeshType &m) + { + RequirePerFaceFlags(m); + RequireFFAdjacency(m); + for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi) if(!(*fi).IsD()) + { + for(int z=0;z<(*fi).VN();++z) + { + FacePointer fp = fi->FFp(z); + int zp = fi->FFi(z); + if(fi->IsF(z) != fp->IsF(zp)) return false; + } + } + return true; + } + /** * Is the mesh only composed by triangles? (non polygonal faces) */