fixed creases handling problems on non manifold edges

This commit is contained in:
T.Alderighi 2019-12-20 14:40:52 +01:00
parent 50165d7b03
commit 1f75de3df3
1 changed files with 41 additions and 27 deletions

View File

@ -111,6 +111,31 @@ public:
} Params; } Params;
static void debug_crease (MeshType & toRemesh, std::string prepend, int i)
{
ForEachVertex(toRemesh, [] (VertexType & v) {
v.C() = Color4b::Gray;
v.Q() = 0;
});
ForEachFacePos(toRemesh, [&](PosType &p){
if (p.F()->IsFaceEdgeS(p.E()))
{
p.V()->Q() += 1;
p.VFlip()->Q() += 1;
}
});
ForEachVertex(toRemesh, [] (VertexType & v) {
if (v.Q() >= 4)
v.C() = Color4b::Green;
else if (v.Q() >= 2)
v.C() = Color4b::Red;
});
prepend += "_creases" + std::to_string(i) + ".ply";
vcg::tri::io::Exporter<MeshType>::Save(toRemesh, prepend.c_str(), vcg::tri::io::Mask::IOM_ALL);
}
static void Do(MeshType &toRemesh, Params & params, vcg::CallBackPos * cb=0) static void Do(MeshType &toRemesh, Params & params, vcg::CallBackPos * cb=0)
{ {
MeshType toProjectCopy; MeshType toProjectCopy;
@ -151,30 +176,11 @@ public:
if(cb) cb(100*i/params.iter, "Remeshing"); if(cb) cb(100*i/params.iter, "Remeshing");
// debug_crease(toRemesh, std::string("pre_ref"), i);
if(params.splitFlag) if(params.splitFlag)
SplitLongEdges(toRemesh, params); SplitLongEdges(toRemesh, params);
#ifdef DEBUG_CREASE #ifdef DEBUG_CREASE
ForEachVertex(toRemesh, [] (VertexType & v) { debug_crease(toRemesh, std::string("after_ref"), i);
v.C() = Color4b::Gray;
v.Q() = 0;
});
ForEachFacePos(toRemesh, [&](PosType &p){
if (p.F()->IsFaceEdgeS(p.E()))
{
p.V()->Q() += 1;
p.VFlip()->Q() += 1;
}
});
ForEachVertex(toRemesh, [] (VertexType & v) {
if (v.Q() >= 4)
v.C() = Color4b::Green;
else if (v.Q() >= 2)
v.C() = Color4b::Red;
});
std::string name = "creases" + std::to_string(i) + ".ply";
vcg::tri::io::Exporter<MeshType>::Save(toRemesh, name.c_str(), vcg::tri::io::Mask::IOM_ALL);
#endif #endif
if(params.collapseFlag) if(params.collapseFlag)
@ -308,13 +314,21 @@ private:
vcg::tri::UpdateFlags<MeshType>::VertexClearV(m); vcg::tri::UpdateFlags<MeshType>::VertexClearV(m);
std::queue<PosType> creaseQueue; std::queue<PosType> creaseQueue;
ForEachFacePos(m, [&](PosType &p){ ForEachFacePos(m, [&](PosType &p){
if((p.FFlip() > p.F()) || p.IsBorder())
if (p.IsBorder())
p.F()->SetFaceEdgeS(p.E());
// if((p.FFlip() > p.F()))
{ {
if (!params.userSelectedCreases && (testCreaseEdge(p, params.creaseAngleCosThr) || p.IsBorder())) if (!params.userSelectedCreases && (testCreaseEdge(p, params.creaseAngleCosThr) || p.IsBorder()))
{ {
p.F()->SetFaceEdgeS(p.E()); PosType pp = p;
p.FlipF();
p.F()->SetFaceEdgeS(p.E()); do {
pp.F()->SetFaceEdgeS(pp.E());
pp.NextF();
} while (pp != p);
creaseQueue.push(p); creaseQueue.push(p);
} }
} }
@ -679,7 +693,7 @@ private:
Point3<ScalarType> newN = Normal(mp, v1->P(), v2->P()).Normalize(); Point3<ScalarType> newN = Normal(mp, v1->P(), v2->P()).Normalize();
float div = fastAngle(oldN, newN); float div = fastAngle(oldN, newN);
if(div < 0.0 ) return false; if(div < .0f ) return false;
// // check on new face distance from original mesh // // check on new face distance from original mesh
if (params.surfDistCheck) if (params.surfDistCheck)
@ -1097,7 +1111,7 @@ private:
{ {
int count = 0; int count = 0;
ForEachFacePos(m, [&](PosType &p){ ForEachFacePos(m, [&](PosType &p){
if((p.FFlip() > p.F()) && p.IsEdgeS()/*testCreaseEdge(p, creaseThr)*/) if(((p.FFlip() > p.F()) || p.IsBorder()) && p.IsEdgeS()/*testCreaseEdge(p, creaseThr)*/)
{ {
p.V()->SetS(); p.V()->SetS();
p.VFlip()->SetS(); p.VFlip()->SetS();