corrected some bugs in halfedge allocation

This commit is contained in:
Paolo Cignoni 2010-04-26 14:49:42 +00:00
parent 5c9ee5cdff
commit df4edbee23
1 changed files with 74 additions and 45 deletions

View File

@ -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;
}