reimplemented and fixed edge mesh split

This commit is contained in:
Luigi Malomo 2017-07-12 20:14:33 +02:00
parent 014edf0e05
commit aaea34f882
1 changed files with 46 additions and 27 deletions

View File

@ -436,32 +436,50 @@ public:
return count_removed; return count_removed;
} }
static int SplitSelectedVertexOnEdgeMesh(MeshType& m) static int SplitSelectedVertexOnEdgeMesh(MeshType& m)
{ {
tri::RequireCompactness(m); tri::RequireCompactness(m);
tri::UpdateFlags<MeshType>::VertexClearV(m);
int count_split = 0; // count selected vertices references
std::unordered_map<size_t,size_t> refCount; // selected vertex index -> reference count
size_t countSplit = 0;
for (size_t i=0; i<m.edge.size(); ++i) for (size_t i=0; i<m.edge.size(); ++i)
{ {
for (int j=0; j<2; ++j) for (int j=0; j<2; ++j)
{ {
VertexPointer vp = m.edge[i].V(j); const VertexPointer vp = m.edge[i].V(j);
if (vp->IsS()) if (vp->IsS())
{ {
if(!vp->IsV()) const size_t refs = ++refCount[Index(m, m.edge[i].V(j))];
if (refs > 1) {
countSplit++;
}
}
}
}
// actual split
if (countSplit > 0)
{ {
m.edge[i].V(j) = &*(tri::Allocator<MeshType>::AddVertex(m,vp->P())); auto newVertIt = tri::Allocator<MeshType>::AddVertices(m, countSplit);
++count_split; for (size_t i=0; i<m.edge.size(); ++i)
}
else
{ {
vp->SetV(); for (int j=0; j<2; ++j)
} {
const VertexPointer vp = m.edge[i].V(j);
const size_t vIdx = Index(m, vp);
if (vp->IsS())
{
if (--refCount[vIdx] > 0)
{
newVertIt->ImportData(*vp);
m.edge[i].V(j) = &*(newVertIt++);
} }
} }
} }
return count_split; }
}
return int(countSplit);
} }
@ -485,6 +503,7 @@ public:
tri::RequireCompactness(m); tri::RequireCompactness(m);
tri::RequireVEAdjacency(m); tri::RequireVEAdjacency(m);
tri::UpdateTopology<MeshType>::VertexEdge(m); tri::UpdateTopology<MeshType>::VertexEdge(m);
tri::UpdateSelection<MeshType>::VertexClear(m);
for(size_t i=0;i<m.vert.size();++i) for(size_t i=0;i<m.vert.size();++i)
{ {
std::vector<VertexPointer> VVStarVec; std::vector<VertexPointer> VVStarVec;