23 #ifndef __VCG_TRI_UPDATE_SELECTION
24 #define __VCG_TRI_UPDATE_SELECTION
34 template <
class ComputeMeshType>
37 typedef typename ComputeMeshType::template PerVertexAttributeHandle< bool > vsHandle;
38 typedef typename ComputeMeshType::template PerEdgeAttributeHandle< bool > esHandle;
39 typedef typename ComputeMeshType::template PerFaceAttributeHandle< bool > fsHandle;
40 typedef typename ComputeMeshType::template PerTetraAttributeHandle< bool > tsHandle;
55 typename ComputeMeshType::VertexIterator vi;
56 for(vi = _m->vert.begin(); vi != _m->vert.end(); ++vi)
57 if( !(*vi).IsD() ) vsH[*vi] = (*vi).IsS() ;
59 typename ComputeMeshType::EdgeIterator ei;
60 for(ei = _m->edge.begin(); ei != _m->edge.end(); ++ei)
61 if( !(*ei).IsD() ) esH[*ei] = (*ei).IsS() ;
63 typename ComputeMeshType::FaceIterator fi;
64 for(fi = _m->face.begin(); fi != _m->face.end(); ++fi)
65 if( !(*fi).IsD() ) fsH[*fi] = (*fi).IsS() ;
67 typename ComputeMeshType::TetraIterator ti;
68 for(ti = _m->tetra.begin(); ti != _m->tetra.end(); ++ti)
69 if( !(*ti).IsD() ) tsH[*ti] = (*ti).IsS() ;
80 return pop(
true,
false);
85 return pop(
false,
true);
92 bool pop(
bool orFlag=
false,
bool andFlag=
false)
94 if(vsV.empty())
return false;
95 if(orFlag && andFlag)
return false;
97 vsHandle vsH = vsV.back();
98 esHandle esH = esV.back();
99 fsHandle fsH = fsV.back();
100 tsHandle tsH = tsV.back();
104 for(
auto vi = _m->vert.begin(); vi != _m->vert.end(); ++vi)
108 if(!andFlag) (*vi).SetS();
110 if(!orFlag) (*vi).ClearS();
114 for(
auto ei = _m->edge.begin(); ei != _m->edge.end(); ++ei)
118 if(!andFlag) (*ei).SetS();
120 if(!orFlag) (*ei).ClearS();
125 for(
auto fi = _m->face.begin(); fi != _m->face.end(); ++fi)
129 if(!andFlag) (*fi).SetS();
131 if(!orFlag) (*fi).ClearS();
135 for (
auto ti = _m->tetra.begin(); ti != _m->tetra.end(); ++ti)
139 if (!andFlag) (*ti).SetS();
141 if (!orFlag) (*ti).ClearS();
159 std::vector<vsHandle> vsV;
160 std::vector<esHandle> esV;
161 std::vector<fsHandle> fsV;
162 std::vector<tsHandle> tsV;
175 template <
class ComputeMeshType>
180 typedef ComputeMeshType MeshType;
181 typedef typename MeshType::ScalarType ScalarType;
182 typedef typename MeshType::VertexType VertexType;
183 typedef typename MeshType::VertexPointer VertexPointer;
184 typedef typename MeshType::VertexIterator VertexIterator;
185 typedef typename MeshType::EdgeIterator EdgeIterator;
186 typedef typename MeshType::FaceType FaceType;
187 typedef typename MeshType::FacePointer FacePointer;
188 typedef typename MeshType::FaceIterator FaceIterator;
189 typedef typename MeshType::TetraType TetraType;
190 typedef typename MeshType::TetraPointer TetraPointer;
191 typedef typename MeshType::TetraIterator TetraIterator;
193 typedef typename vcg::Box3<ScalarType> Box3Type;
198 for(VertexIterator vi = m.vert.begin(); vi != m.vert.end(); ++vi)
199 if( !(*vi).IsD() ) (*vi).SetS();
206 for(EdgeIterator ei = m.edge.begin(); ei != m.edge.end(); ++ei)
207 if( !(*ei).IsD() ) (*ei).SetS();
213 for(FaceIterator fi = m.face.begin(); fi != m.face.end(); ++fi)
214 if( !(*fi).IsD() ) (*fi).SetS();
221 ForEachTetra(m, [] (TetraType & t) {
231 for(VertexIterator vi = m.vert.begin(); vi != m.vert.end(); ++vi)
232 if( !(*vi).IsD() ) (*vi).ClearS();
239 for(EdgeIterator ei = m.edge.begin(); ei != m.edge.end(); ++ei)
240 if( !(*ei).IsD() ) (*ei).ClearS();
247 for(FaceIterator fi = m.face.begin(); fi != m.face.end(); ++fi)
248 if( !(*fi).IsD() ) (*fi).ClearS();
255 ForEachTetra(m, [] (TetraType & t) {
275 for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi)
276 if(!(*fi).IsD() && (*fi).IsS()) ++selCnt;
284 for(EdgeIterator ei=m.edge.begin();ei!=m.edge.end();++ei)
285 if(!(*ei).IsD() && (*ei).IsS()) ++selCnt;
293 for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
294 if(!(*vi).IsD() && (*vi).IsS()) ++selCnt;
302 ForEachTetra(m, [&selCnt] (TetraType & t) {
313 for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi)
316 if((*fi).IsS()) (*fi).ClearS();
329 for(EdgeIterator ei=m.edge.begin();ei!=m.edge.end();++ei)
332 if((*ei).IsS()) (*ei).ClearS();
345 for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
348 if((*vi).IsS()) (*vi).ClearS();
361 ForEachTetra(m, [&selCnt] (TetraType & t) {
381 for(FaceIterator fi = m.face.begin(); fi != m.face.end(); ++fi)
382 if( !(*fi).IsD() && (*fi).IsS())
383 for(
int i = 0; i < (*fi).VN(); ++i)
384 if( !(*fi).V(i)->IsS()) { (*fi).V(i)->SetS(); ++selCnt; }
394 for(EdgeIterator ei = m.edge.begin(); ei != m.edge.end(); ++ei)
395 if( !(*ei).IsD() && (*ei).IsS())
397 if( !(*ei).V(0)->IsS()) { (*ei).V(0)->SetS(); ++selCnt; }
398 if( !(*ei).V(1)->IsS()) { (*ei).V(1)->SetS(); ++selCnt; }
409 if(preserveSelection) ss.push();
411 for(FaceIterator fi = m.face.begin(); fi != m.face.end(); ++fi)
412 if( !(*fi).IsD() && !(*fi).IsS())
413 for(
int i = 0; i < (*fi).VN(); ++i)
414 (*fi).V(i)->ClearS();
416 if(preserveSelection) ss.popOr();
424 if(preserveSelection) ss.push();
427 for(FaceIterator fi = m.face.begin(); fi != m.face.end(); ++fi)
431 for(
int i = 0; i < (*fi).VN(); ++i)
432 if(!(*fi).V(i)->IsS())
441 if(preserveSelection) ss.popOr();
450 for(FaceIterator fi = m.face.begin(); fi != m.face.end(); ++fi)
454 for(
int i = 0; i < (*fi).VN(); ++i)
455 if((*fi).V(i)->IsS())
487 for(VertexIterator vi = m.vert.begin(); vi != m.vert.end(); ++vi)
502 tri::RequireTriangularMesh(m);
505 for(FaceIterator fi = m.face.begin(); fi != m.face.end(); ++fi)
509 for(
int i = 0; i < 3; ++i)
510 if((*fi).IsB(i)) bordFlag=
true;
522 static size_t FaceOutOfRangeEdge(MeshType &m, ScalarType MinEdgeThr, ScalarType MaxEdgeThr=(std::numeric_limits<ScalarType>::max)(),
bool preserveSelection=
false)
526 MinEdgeThr=MinEdgeThr*MinEdgeThr;
527 MaxEdgeThr=MaxEdgeThr*MaxEdgeThr;
528 for(FaceIterator fi=m.face.begin(); fi!=m.face.end();++fi)
531 for(
int i=0;i<(*fi).VN();++i)
533 const ScalarType squaredEdge=SquaredDistance((*fi).V0(i)->cP(),(*fi).V1(i)->cP());
534 if((squaredEdge<=MinEdgeThr) || (squaredEdge>=MaxEdgeThr) )
549 RequireFFAdjacency(m);
552 std::deque<FacePointer> visitStack;
554 for(FaceIterator fi = m.face.begin(); fi != m.face.end(); ++fi)
555 if( !(*fi).IsD() && (*fi).IsS() && !(*fi).IsV() )
556 visitStack.push_back(&*fi);
558 while(!visitStack.empty())
560 FacePointer fp = visitStack.front();
561 visitStack.pop_front();
564 for(
int i=0;i<fp->VN();++i) {
565 FacePointer ff = fp->FFp(i);
570 visitStack.push_back(ff);
582 RequirePerFaceQuality(m);
583 for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi)
586 if( (*fi).Q()>=minq && (*fi).Q()<=maxq )
600 RequirePerVertexQuality(m);
601 for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
604 if( (*vi).Q()>=minq && (*vi).Q()<=maxq )
614 static size_t VertexInBox( MeshType & m,
const Box3Type &bb,
bool preserveSelection=
false)
618 for (VertexIterator vi = m.vert.begin(); vi != m.vert.end(); ++vi)
if(!(*vi).IsD())
620 if(bb.IsIn((*vi).cP()) ) {
634 SimpleTempData<typename MeshType::VertContainer, ScalarType > angleSumH(m.vert,0);
636 for(
auto vi=m.vert.begin();vi!=m.vert.end();++vi)
if(!(*vi).IsD())
639 for(
auto fi=m.face.begin();fi!=m.face.end();++fi)
if(!(*fi).IsD())
641 for(
int i=0;i<(*fi).VN();++i)
645 for(
auto vi=m.vert.begin();vi!=m.vert.end();++vi)
if(!(*vi).IsD())
647 if(angleSumH[vi]<angleRad && vi->IsB())
657 void VertexNonManifoldEdges(MeshType &m,
bool preserveSelection=
false)
659 tri::RequireFFAdjacency(m);
662 for (FaceIterator fi = m.face.begin(); fi != m.face.end(); ++fi)
if (!fi->IsD())
664 for(
int i=0;i<fi->VN();++i)