23 #ifndef __VCG_TRI_UPDATE_FLAGS
24 #define __VCG_TRI_UPDATE_FLAGS
38 template <
class UpdateMeshType>
43 typedef UpdateMeshType MeshType;
44 typedef typename MeshType::ScalarType ScalarType;
45 typedef typename MeshType::VertexType VertexType;
46 typedef typename MeshType::VertexPointer VertexPointer;
47 typedef typename MeshType::VertexIterator VertexIterator;
48 typedef typename MeshType::EdgeType EdgeType;
49 typedef typename MeshType::EdgePointer EdgePointer;
50 typedef typename MeshType::EdgeIterator EdgeIterator;
51 typedef typename MeshType::FaceType FaceType;
52 typedef typename MeshType::FacePointer FacePointer;
53 typedef typename MeshType::FaceIterator FaceIterator;
54 typedef typename MeshType::TetraType TetraType;
55 typedef typename MeshType::TetraPointer TetraPointer;
56 typedef typename MeshType::TetraIterator TetraIterator;
62 if(HasPerVertexFlags(m) )
63 for(VertexIterator vi=m.vert.begin(); vi!=m.vert.end(); ++vi)
65 if(HasPerEdgeFlags(m) )
66 for(EdgeIterator ei=m.edge.begin(); ei!=m.edge.end(); ++ei)
68 if(HasPerFaceFlags(m) )
69 for(FaceIterator fi=m.face.begin(); fi!=m.face.end(); ++fi)
71 if(HasPerTetraFlags(m) )
72 for(TetraIterator ti=m.tetra.begin(); ti!=m.tetra.end(); ++ti)
77 static void VertexClear(MeshType &m,
unsigned int FlagMask = 0xffffffff)
79 RequirePerVertexFlags(m);
80 int andMask = ~FlagMask;
81 for(VertexIterator vi=m.vert.begin(); vi!=m.vert.end(); ++vi)
82 if(!(*vi).IsD()) (*vi).Flags() &= andMask ;
85 static void EdgeClear(MeshType &m,
unsigned int FlagMask = 0xffffffff)
87 RequirePerEdgeFlags(m);
88 int andMask = ~FlagMask;
89 for(EdgeIterator ei=m.edge.begin(); ei!=m.edge.end(); ++ei)
90 if(!(*ei).IsD()) (*ei).Flags() &= andMask ;
93 static void FaceClear(MeshType &m,
unsigned int FlagMask = 0xffffffff)
95 RequirePerFaceFlags(m);
96 int andMask = ~FlagMask;
97 for(FaceIterator fi=m.face.begin(); fi!=m.face.end(); ++fi)
98 if(!(*fi).IsD()) (*fi).Flags() &= andMask ;
101 static void TetraClear(MeshType &m,
unsigned int FlagMask = 0xffffffff)
103 RequirePerTetraFlags(m);
104 int andMask = ~FlagMask;
105 for(TetraIterator ti=m.tetra.begin(); ti!=m.tetra.end(); ++ti)
106 if(!(*ti).IsD()) (*ti).Flags() &= andMask ;
109 static void VertexSet(MeshType &m,
unsigned int FlagMask)
111 RequirePerVertexFlags(m);
112 for(VertexIterator vi=m.vert.begin(); vi!=m.vert.end(); ++vi)
113 if(!(*vi).IsD()) (*vi).Flags() |= FlagMask ;
116 static void EdgeSet(MeshType &m,
unsigned int FlagMask)
118 RequirePerEdgeFlags(m);
119 for(EdgeIterator ei=m.edge.begin(); ei!=m.edge.end(); ++ei)
120 if(!(*ei).IsD()) (*ei).Flags() |= FlagMask ;
123 static void FaceSet(MeshType &m,
unsigned int FlagMask)
125 RequirePerFaceFlags(m);
126 for(FaceIterator fi=m.face.begin(); fi!=m.face.end(); ++fi)
127 if(!(*fi).IsD()) (*fi).Flags() |= FlagMask ;
130 static void TetraSet(MeshType &m,
unsigned int FlagMask)
132 RequirePerTetraFlags(m);
133 for(TetraIterator ti=m.tetra.begin(); ti!=m.tetra.end(); ++ti)
134 if(!(*ti).IsD()) (*ti).Flags() |= FlagMask ;
139 static void VertexClearV(MeshType &m) { VertexClear(m,VertexType::VISITED);}
140 static void VertexClearS(MeshType &m) { VertexClear(m,VertexType::SELECTED);}
141 static void VertexClearB(MeshType &m) { VertexClear(m,VertexType::BORDER);}
142 static void EdgeClearV(MeshType &m) { EdgeClear(m,EdgeType::VISITED);}
143 static void FaceClearV(MeshType &m) { FaceClear(m,FaceType::VISITED);}
144 static void FaceClearB(MeshType &m) { FaceClear(m,FaceType::BORDER012);}
145 static void FaceClearS(MeshType &m) {FaceClear(m,FaceType::SELECTED);}
146 static void FaceClearF(MeshType &m) { FaceClear(m,FaceType::FAUX012);}
147 static void FaceClearFaceEdgeS(MeshType &m) { FaceClear(m,FaceType::FACEEDGESEL012 ); }
149 static void EdgeSetV(MeshType &m) { EdgeSet(m,EdgeType::VISITED);}
150 static void VertexSetV(MeshType &m) { VertexSet(m,VertexType::VISITED);}
151 static void VertexSetS(MeshType &m) { VertexSet(m,VertexType::SELECTED);}
152 static void VertexSetB(MeshType &m) { VertexSet(m,VertexType::BORDER);}
153 static void FaceSetV(MeshType &m) { FaceSet(m,FaceType::VISITED);}
154 static void FaceSetB(MeshType &m) { FaceSet(m,FaceType::BORDER);}
155 static void FaceSetF(MeshType &m) { FaceSet(m,FaceType::FAUX012);}
156 static void TetraClearV(MeshType &m) { TetraClear(m, TetraType::VISITED); }
157 static void TetraClearS(MeshType &m) { TetraClear(m, TetraType::SELECTED); }
158 static void TetraClearB(MeshType &m) { TetraClear(m, TetraType::BORDER0123); }
159 static void TetraSetV(MeshType &m) { TetraSet(m, TetraType::VISITED); }
160 static void TetraSetS(MeshType &m) { TetraSet(m, TetraType::SELECTED); }
161 static void TetraSetB(MeshType &m) { TetraSet(m, TetraType::BORDER0123); }
168 RequirePerFaceFlags(m);
169 RequireFFAdjacency(m);
171 for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi)
if(!(*fi).IsD())
172 for(
int j=0;j<fi->VN();++j)
175 else (*fi).ClearB(j);
185 RequirePerTetraFlags(m);
186 RequireTTAdjacency(m);
188 for(TetraIterator ti=m.tetra.begin(); ti!=m.tetra.end(); ++ti)
190 for(
int j = 0; j < 4; ++j)
192 if (IsTTBorder(*ti,j)) (*ti).SetB(j);
193 else (*ti).ClearB(j);
197 static void VertexBorderFromTT(MeshType &m)
199 RequirePerVertexFlags(m);
200 RequireTTAdjacency(m);
204 for(TetraIterator ti=m.tetra.begin(); ti!=m.tetra.end(); ++ti)
206 for(
int j = 0; j < 4; ++j)
208 if (IsTTBorder(*ti,j))
210 for (
int i = 0; i < 3; ++i)
211 ti->V(Tetra::VofF(j, i))->SetB();
217 static void FaceBorderFromVF(MeshType &m)
219 RequirePerFaceFlags(m);
220 RequireVFAdjacency(m);
223 int visitedBit=VertexType::NewBitFlag();
229 const int BORDERFLAG[3]={FaceType::BORDER0, FaceType::BORDER1, FaceType::BORDER2};
231 for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
234 for(face::VFIterator<FaceType> vfi(&*vi) ; !vfi.End(); ++vfi )
236 vfi.f->V1(vfi.z)->ClearUserBit(visitedBit);
237 vfi.f->V2(vfi.z)->ClearUserBit(visitedBit);
239 for(face::VFIterator<FaceType> vfi(&*vi) ; !vfi.End(); ++vfi )
241 if(vfi.f->V1(vfi.z)->IsUserBit(visitedBit)) vfi.f->V1(vfi.z)->ClearUserBit(visitedBit);
242 else vfi.f->V1(vfi.z)->SetUserBit(visitedBit);
243 if(vfi.f->V2(vfi.z)->IsUserBit(visitedBit)) vfi.f->V2(vfi.z)->ClearUserBit(visitedBit);
244 else vfi.f->V2(vfi.z)->SetUserBit(visitedBit);
246 for(face::VFIterator<FaceType> vfi(&*vi) ; !vfi.End(); ++vfi )
248 if(vfi.f->V(vfi.z)< vfi.f->V1(vfi.z) && vfi.f->V1(vfi.z)->IsUserBit(visitedBit))
249 vfi.f->Flags() |= BORDERFLAG[vfi.z];
250 if(vfi.f->V(vfi.z)< vfi.f->V2(vfi.z) && vfi.f->V2(vfi.z)->IsUserBit(visitedBit))
251 vfi.f->Flags() |= BORDERFLAG[(vfi.z+2)%3];
254 VertexType::DeleteBitFlag(visitedBit);
269 void Set(
const FacePointer pf,
const int nz )
276 v[1] = pf->V((nz+1)%3);
277 assert(v[0] != v[1]);
279 if( v[0] > v[1] ) std::swap(v[0],v[1]);
284 inline bool operator < (
const EdgeSorter & pe )
const {
285 if( v[0]<pe.v[0] )
return true;
286 else if( v[0]>pe.v[0] )
return false;
287 else return v[1] < pe.v[1];
290 inline bool operator == (
const EdgeSorter & pe )
const
292 return v[0]==pe.v[0] && v[1]==pe.v[1];
294 inline bool operator != (
const EdgeSorter & pe )
const
296 return v[0]!=pe.v[0] || v[1]!=pe.v[1];
303 static void VertexBorderFromNone(MeshType &m)
305 RequirePerVertexFlags(m);
307 std::vector<EdgeSorter> e;
308 typename UpdateMeshType::FaceIterator pf;
309 typename std::vector<EdgeSorter>::iterator p;
316 for(pf=m.face.begin();pf!=m.face.end();++pf)
325 sort(e.begin(), e.end());
327 typename std::vector<EdgeSorter>::iterator pe,ps;
328 for(ps = e.begin(), pe = e.begin(); pe < e.end(); ++pe)
330 if( pe==e.end() || *pe != *ps )
351 RequirePerFaceFlags(m);
353 std::vector<EdgeSorter> e;
354 typename UpdateMeshType::FaceIterator pf;
355 typename std::vector<EdgeSorter>::iterator p;
357 for(VertexIterator v=m.vert.begin();v!=m.vert.end();++v)
365 for(fi = m.face.begin(); fi != m.face.end(); ++fi)
if(! (*fi).IsD()) n_edges+=(*fi).VN();
369 for(pf=m.face.begin();pf!=m.face.end();++pf)
371 for(
int j=0;j<(*pf).VN();++j)
378 sort(e.begin(), e.end());
380 typename std::vector<EdgeSorter>::iterator pe,ps;
381 ps = e.begin();pe=e.begin();
384 if( pe==e.end() || *pe != *ps )
395 if(pe==e.end())
break;
404 RequirePerFaceFlags(m);
405 RequirePerVertexFlags(m);
406 RequireFFAdjacency(m);
410 for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi)
414 for(
int z=0;z<(*fi).VN();++z)
426 RequirePerFaceFlags(m);
427 RequirePerVertexFlags(m);
429 for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi)
432 for(
int z=0;z<(*fi).VN();++z)
436 (*fi).V((*fi).Next(z))->SetB();
444 RequirePerVertexFlags(m);
445 RequireEEAdjacency(m);
448 for (EdgeIterator ei=m.edge.begin();ei!=m.edge.end();++ei)
451 for (
int z=0; z<2; ++z)
452 if (edge::IsEdgeBorder(*ei, z))
470 RequirePerFaceFlags(m);
471 RequireFFAdjacency(m);
473 FaceClearFaceEdgeS(m);
475 for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi)
if(!(*fi).IsD())
477 for(
int z=0;z<(*fi).VN();++z)
482 if(angle<AngleRadNeg || angle>AngleRadPos)
483 (*fi).SetFaceEdgeS(z);
487 if(MarkBorderFlag) (*fi).SetFaceEdgeS(z);
497 RequirePerFaceFlags(m);
498 RequireFFAdjacency(m);
500 FaceClearFaceEdgeS(m);
501 for (FaceIterator fi=m.face.begin(); fi!=m.face.end();++fi)
504 for (
int z=0; z<(*fi).VN(); ++z)