From 9c310f6ab43b94a9b329db4becb66560673d3a12 Mon Sep 17 00:00:00 2001 From: mtarini Date: Thu, 9 Jun 2016 14:32:40 +0000 Subject: [PATCH] Made AllocateEdge correctly compute per-edge border flag (whenever edges have flags) --- vcg/complex/algorithms/update/topology.h | 25 ++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/vcg/complex/algorithms/update/topology.h b/vcg/complex/algorithms/update/topology.h index fae0f68e..6c8383a1 100644 --- a/vcg/complex/algorithms/update/topology.h +++ b/vcg/complex/algorithms/update/topology.h @@ -69,6 +69,7 @@ public: VertexPointer v[2]; // the two Vertex pointer are ordered! FacePointer f; // the face where this edge belong int z; // index in [0..2] of the edge of the face + bool isBorder; PEdge() {} PEdge(FacePointer pf, const int nz) { this->Set(pf,nz); } @@ -123,16 +124,26 @@ static void FillEdgeVector(MeshType &m, std::vector &edgeVec, bool includ edgeVec.push_back(PEdge(&*fi,j)); } -static void FillUniqueEdgeVector(MeshType &m, std::vector &edgeVec, bool includeFauxEdge=true) +static void FillUniqueEdgeVector(MeshType &m, std::vector &edgeVec, bool includeFauxEdge=true, bool computeBorderFlag=false) { FillEdgeVector(m,edgeVec,includeFauxEdge); - sort(edgeVec.begin(), edgeVec.end()); // Lo ordino per vertici + sort(edgeVec.begin(), edgeVec.end()); // oredering by vertex + + if (computeBorderFlag) { + for (size_t i=0; i::iterator newEnd = std::unique(edgeVec.begin(), edgeVec.end()); - edgeVec.resize(newEnd-edgeVec.begin()); + edgeVec.resize(newEnd-edgeVec.begin()); // redundant! remove? } + /*! \brief Initialize the edge vector all the edges that can be inferred from current face vector, setting up all the current adjacency relations * * @@ -147,7 +158,7 @@ static void AllocateEdge(MeshType &m) // Compute and add edges std::vector Edges; - FillUniqueEdgeVector(m,Edges); + FillUniqueEdgeVector(m,Edges,true,tri::HasPerEdgeFlags(m) ); assert(m.edge.empty()); tri::Allocator::AddEdges(m,Edges.size()); assert(m.edge.size()==Edges.size()); @@ -162,6 +173,12 @@ static void AllocateEdge(MeshType &m) } } + if (tri::HasPerEdgeFlags(m)){ + for(size_t i=0; i< Edges.size(); ++i) { + if (Edges[i].isBorder) m.edge[i].SetB(); else m.edge[i].ClearB(); + } + } + if(tri::HasEFAdjacency(m)) // Note it is an unordered relation. { for(size_t i=0; i< Edges.size(); ++i)