Made AllocateEdge correctly compute per-edge border flag (whenever edges have flags)
This commit is contained in:
parent
aeffdc1090
commit
9c310f6ab4
|
@ -69,6 +69,7 @@ public:
|
||||||
VertexPointer v[2]; // the two Vertex pointer are ordered!
|
VertexPointer v[2]; // the two Vertex pointer are ordered!
|
||||||
FacePointer f; // the face where this edge belong
|
FacePointer f; // the face where this edge belong
|
||||||
int z; // index in [0..2] of the edge of the face
|
int z; // index in [0..2] of the edge of the face
|
||||||
|
bool isBorder;
|
||||||
|
|
||||||
PEdge() {}
|
PEdge() {}
|
||||||
PEdge(FacePointer pf, const int nz) { this->Set(pf,nz); }
|
PEdge(FacePointer pf, const int nz) { this->Set(pf,nz); }
|
||||||
|
@ -123,16 +124,26 @@ static void FillEdgeVector(MeshType &m, std::vector<PEdge> &edgeVec, bool includ
|
||||||
edgeVec.push_back(PEdge(&*fi,j));
|
edgeVec.push_back(PEdge(&*fi,j));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FillUniqueEdgeVector(MeshType &m, std::vector<PEdge> &edgeVec, bool includeFauxEdge=true)
|
static void FillUniqueEdgeVector(MeshType &m, std::vector<PEdge> &edgeVec, bool includeFauxEdge=true, bool computeBorderFlag=false)
|
||||||
{
|
{
|
||||||
FillEdgeVector(m,edgeVec,includeFauxEdge);
|
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<edgeVec.size(); i++)
|
||||||
|
edgeVec[ i ].isBorder = true;
|
||||||
|
for (size_t i=1; i<edgeVec.size(); i++) {
|
||||||
|
if (edgeVec[i]==edgeVec[i-1])
|
||||||
|
edgeVec[i-1].isBorder = edgeVec[i-1].isBorder = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
typename std::vector< PEdge>::iterator newEnd = std::unique(edgeVec.begin(), edgeVec.end());
|
typename std::vector< PEdge>::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
|
/*! \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
|
// Compute and add edges
|
||||||
std::vector<PEdge> Edges;
|
std::vector<PEdge> Edges;
|
||||||
FillUniqueEdgeVector(m,Edges);
|
FillUniqueEdgeVector(m,Edges,true,tri::HasPerEdgeFlags(m) );
|
||||||
assert(m.edge.empty());
|
assert(m.edge.empty());
|
||||||
tri::Allocator<MeshType>::AddEdges(m,Edges.size());
|
tri::Allocator<MeshType>::AddEdges(m,Edges.size());
|
||||||
assert(m.edge.size()==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.
|
if(tri::HasEFAdjacency(m)) // Note it is an unordered relation.
|
||||||
{
|
{
|
||||||
for(size_t i=0; i< Edges.size(); ++i)
|
for(size_t i=0; i< Edges.size(); ++i)
|
||||||
|
|
Loading…
Reference in New Issue