From df4edbee230d9f084d79e48933e25a8c18887cd1 Mon Sep 17 00:00:00 2001 From: cnr-isti-vclab Date: Mon, 26 Apr 2010 14:49:42 +0000 Subject: [PATCH] corrected some bugs in halfedge allocation --- vcg/complex/trimesh/allocate.h | 119 ++++++++++++++++++++------------- 1 file changed, 74 insertions(+), 45 deletions(-) diff --git a/vcg/complex/trimesh/allocate.h b/vcg/complex/trimesh/allocate.h index 60018a21..0726e2d8 100644 --- a/vcg/complex/trimesh/allocate.h +++ b/vcg/complex/trimesh/allocate.h @@ -161,7 +161,7 @@ namespace vcg { pu.newBase = &*m.vert.begin(); pu.newEnd = &m.vert.back()+1; - if(pu.NeedUpdate()) + if(pu.NeedUpdate()) { FaceIterator fi; for (fi=m.face.begin(); fi!=m.face.end(); ++fi) @@ -175,6 +175,15 @@ namespace vcg { if(HasEVAdjacency (m)) { pu.Update((*ei).V(0));pu.Update((*ei).V(1));} // if(HasEVAdjacency(m)) pu.Update((*ei).EVp()); } + HEdgeIterator hi; + for (hi=m.hedge.begin(); hi!=m.hedge.end(); ++hi) + if(!(*hi).IsD()) + { + if(HasHVAdjacency (m)) + { + pu.Update((*hi).HVp()); + } + } // e poiche' lo spazio e' cambiato si ricalcola anche last da zero } @@ -237,22 +246,31 @@ namespace vcg { pu.newBase = &*m.edge.begin(); pu.newEnd = &m.edge.back()+1; - if(pu.NeedUpdate()) + if(pu.NeedUpdate()) { int ii = 0; FaceIterator fi; for (fi=m.face.begin(); fi!=m.face.end(); ++fi){ - if(HasFHEAdjacency(m)) - pu.Update((*fi).FHEp()); + //if(HasFHEAdjacency(m)) + // pu.Update((*fi).FHEp()); if(!(*fi).IsD()) for(int i=0; i < (*fi).VN(); ++i) if ((*fi).cFEp(i)!=0) pu.Update((*fi).FEp(i)); } VertexIterator vi; - for (vi=m.vert.begin(); vi!=m.vert.end(); ++vi) + if(HasVEAdjacency(m)) + for (vi=m.vert.begin(); vi!=m.vert.end(); ++vi) if(!(*vi).IsD()) - if ((*vi).cVEp()!=0) pu.Update((*vi).VEp()); + if ((*vi).cVEp()!=0) pu.Update((*vi).VEp()); + + HEdgeIterator hi; + if(HasHEAdjacency(m)) + for (hi=m.hedge.begin(); hi!=m.hedge.end(); ++hi) + if(!(*hi).IsD()) + if ((*hi).cHEp()!=0) pu.Update((*hi).HEp()); + + } unsigned int siz=(unsigned int)m.edge.size()-n; @@ -311,42 +329,53 @@ namespace vcg { pu.newBase = &*m.hedge.begin(); pu.newEnd = &m.hedge.back()+1; - if(pu.NeedUpdate()) - { - int ii = 0; - FaceIterator fi; - for (fi=m.face.begin(); fi!=m.face.end(); ++fi){ - if(HasFHAdjacency(m)) - pu.Update((*fi).FHp()); - } - { - VertexIterator vi; - for (vi=m.vert.begin(); vi!=m.vert.end(); ++vi) - if(!(*vi).IsD()) - if ((*vi).cVHp()!=0) pu.Update((*vi).VHp()); - } - { - EdgeIterator ei; - for (ei=m.edge.begin(); ei!=m.edge.end(); ++ei) - if(!(*ei).IsD()) - if ((*ei).cEHp()!=0) pu.Update((*ei).EHp()); - } - { - HEdgeIterator hi = m.hedge.begin(); - while(ii < m.hn - n){// cycle on all the faces except the new ones - if(!(*hi).IsD()) - { - if(HasHNextAdjacency(m)) pu.Update((*hi).HNp()); - if(HasHPrevAdjacency(m)) pu.Update((*hi).HPp()); - if(HasHOppAdjacency(m)) pu.Update((*hi).HOp()); - ++ii; - } - ++hi; - } - } + if(pu.NeedUpdate()) + { + int ii = 0; + FaceIterator fi; + for (fi=m.face.begin(); fi!=m.face.end(); ++fi) + { + if(HasFHAdjacency(m)) + if(!(*fi).IsD() && (*fi).FHp()) + pu.Update((*fi).FHp()); + } + + { + VertexIterator vi; + for (vi=m.vert.begin(); vi!=m.vert.end(); ++vi) + if(HasVHAdjacency(m)) + if(!(*vi).IsD()) + if ((*vi).cVHp()!=0) + pu.Update((*vi).VHp()); + } + + { + EdgeIterator ei; + for (ei=m.edge.begin(); ei!=m.edge.end(); ++ei) + if(HasEHAdjacency(m)) + if(!(*ei).IsD()) + if ((*ei).cEHp()!=0) + pu.Update((*ei).EHp()); + } + + { + HEdgeIterator hi = m.hedge.begin(); + while(ii < m.hn - n)// cycle on all the faces except the new ones + { + if(!(*hi).IsD()) + { + if(HasHNextAdjacency(m)) pu.Update((*hi).HNp()); + if(HasHPrevAdjacency(m)) pu.Update((*hi).HPp()); + if(HasHOppAdjacency(m)) pu.Update((*hi).HOp()); + ++ii; + } + + ++hi; + } + } } - unsigned int siz=(unsigned int)m.hedge.size()-n; + unsigned int siz = (unsigned int)m.hedge.size()-n; last = m.hedge.begin(); advance(last,siz); @@ -516,20 +545,20 @@ namespace vcg { /** Function to delete an edge from the mesh. NOTE: THIS FUNCTION ALSO UPDATE en */ - static void DeleteHEdge(MeshType &m, EdgeType &e) + static void DeleteEdge(MeshType &m, EdgeType &e) { assert(!e.IsD()); e.SetD(); - --m.hn; + --m.en; } /** Function to delete a hedge from the mesh. NOTE: THIS FUNCTION ALSO UPDATE en */ - static void DeleteHEdge(MeshType &m, HEdgeType &e) + static void DeleteHEdge(MeshType &m, HEdgeType &h) { - assert(!e.IsD()); - e.SetD(); + assert(!h.IsD()); + h.SetD(); --m.hn; }