Removed the missing face bug and the wrong orientation bug.
This commit is contained in:
parent
cc52ce5439
commit
97a8cb9238
|
@ -447,6 +447,7 @@ static void ConvertVoronoiDiagramToMesh(MeshType &m,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Final pass
|
||||||
// search for a boundary face
|
// search for a boundary face
|
||||||
face::Pos<FaceType> pos,startPos;
|
face::Pos<FaceType> pos,startPos;
|
||||||
for(int i=0;i<3;++i)
|
for(int i=0;i<3;++i)
|
||||||
|
@ -456,9 +457,13 @@ static void ConvertVoronoiDiagramToMesh(MeshType &m,
|
||||||
}
|
}
|
||||||
assert(pos.IsBorder());
|
assert(pos.IsBorder());
|
||||||
startPos=pos;
|
startPos=pos;
|
||||||
|
bool foundBorderSeed=false;
|
||||||
FacePointer curBorderCorner = pos.F();
|
FacePointer curBorderCorner = pos.F();
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
pos.NextB();
|
||||||
|
if(sources[pos.V()]==pos.V())
|
||||||
|
foundBorderSeed=true;
|
||||||
assert(isBorderCorner(curBorderCorner,sources));
|
assert(isBorderCorner(curBorderCorner,sources));
|
||||||
if(isBorderCorner(pos.F(),sources))
|
if(isBorderCorner(pos.F(),sources))
|
||||||
if(pos.F() != curBorderCorner)
|
if(pos.F() != curBorderCorner)
|
||||||
|
@ -469,10 +474,12 @@ static void ConvertVoronoiDiagramToMesh(MeshType &m,
|
||||||
int otherCorner1 = vertexIndCornerMap[curBorderCorner];
|
int otherCorner1 = vertexIndCornerMap[curBorderCorner];
|
||||||
VertexPointer corner0 = &(outMesh.vert[otherCorner0]);
|
VertexPointer corner0 = &(outMesh.vert[otherCorner0]);
|
||||||
VertexPointer corner1 = &(outMesh.vert[otherCorner1]);
|
VertexPointer corner1 = &(outMesh.vert[otherCorner1]);
|
||||||
tri::Allocator<MeshType>::AddFace(outMesh,curSeed,corner0,corner1);
|
if(!foundBorderSeed)
|
||||||
|
tri::Allocator<MeshType>::AddFace(outMesh,curSeed,corner0,corner1);
|
||||||
|
foundBorderSeed=false;
|
||||||
curBorderCorner=pos.F();
|
curBorderCorner=pos.F();
|
||||||
}
|
}
|
||||||
pos.NextB();
|
|
||||||
}
|
}
|
||||||
while(pos!=startPos);
|
while(pos!=startPos);
|
||||||
|
|
||||||
|
@ -483,26 +490,16 @@ static void ConvertVoronoiDiagramToMesh(MeshType &m,
|
||||||
tri::UpdateTopology<MeshType>::FaceFace(outMesh);
|
tri::UpdateTopology<MeshType>::FaceFace(outMesh);
|
||||||
tri::Clean<MeshType>::OrientCoherentlyMesh(outMesh,oriented,orientable);
|
tri::Clean<MeshType>::OrientCoherentlyMesh(outMesh,oriented,orientable);
|
||||||
assert(orientable);
|
assert(orientable);
|
||||||
|
// check that the normal of the input mesh are consistent with the result
|
||||||
|
tri::UpdateNormal<MeshType>::PerVertexNormalizedPerFaceNormalized(outMesh);
|
||||||
|
tri::UpdateNormal<MeshType>::PerVertexNormalizedPerFaceNormalized(m);
|
||||||
|
if(seedVec[0]->N() * outMesh.vert[0].N() < 0 )
|
||||||
|
tri::Clean<MeshType>::FlipMesh(outMesh);
|
||||||
|
|
||||||
// 2) search and mark folded stuff
|
|
||||||
tri::UpdateNormal<MeshType>::PerFaceNormalized(outMesh);
|
|
||||||
tri::UpdateFlags<MeshType>::FaceClearV(outMesh);
|
|
||||||
for(FaceIterator fi=outMesh.face.begin();fi!=outMesh.face.end();++fi)
|
|
||||||
{
|
|
||||||
int badDiedralCnt=0;
|
|
||||||
for(int i=0;i<3;++i)
|
|
||||||
if(fi->N() * fi->FFp(i)->N() <0 ) badDiedralCnt++;
|
|
||||||
|
|
||||||
if(badDiedralCnt == 2) fi->SetV();
|
|
||||||
}
|
|
||||||
// 3) actual deleting
|
|
||||||
for(FaceIterator fi=outMesh.face.begin();fi!=outMesh.face.end();++fi)
|
|
||||||
if(fi->IsV()) Allocator<MeshType>::DeleteFace(outMesh,*fi);
|
|
||||||
tri::Allocator<MeshType>::CompactEveryVector(outMesh);
|
|
||||||
tri::UpdateTopology<MeshType>::FaceFace(outMesh);
|
tri::UpdateTopology<MeshType>::FaceFace(outMesh);
|
||||||
tri::UpdateFlags<MeshType>::FaceBorderFromFF(outMesh);
|
tri::UpdateFlags<MeshType>::FaceBorderFromFF(outMesh);
|
||||||
|
|
||||||
// 4) set up faux bits
|
// 2) set up faux bits
|
||||||
for(FaceIterator fi=outMesh.face.begin();fi!=outMesh.face.end();++fi)
|
for(FaceIterator fi=outMesh.face.begin();fi!=outMesh.face.end();++fi)
|
||||||
for(int i=0;i<3;++i)
|
for(int i=0;i<3;++i)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue