Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.cpp')
-rw-r--r--source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.cpp1311
1 files changed, 660 insertions, 651 deletions
diff --git a/source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.cpp b/source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.cpp
index 0ec008ebf2b..8896918e60d 100644
--- a/source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.cpp
+++ b/source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.cpp
@@ -33,712 +33,721 @@ namespace Freestyle {
void ViewEdgeXBuilder::Init(ViewShape *oVShape)
{
- if (NULL == oVShape)
- return;
+ if (NULL == oVShape)
+ return;
- // for design conveniance, we store the current SShape.
- _pCurrentSShape = oVShape->sshape();
- if (0 == _pCurrentSShape)
- return;
+ // for design conveniance, we store the current SShape.
+ _pCurrentSShape = oVShape->sshape();
+ if (0 == _pCurrentSShape)
+ return;
- _pCurrentVShape = oVShape;
+ _pCurrentVShape = oVShape;
- // Reset previous data
- //--------------------
- if (!_SVertexMap.empty())
- _SVertexMap.clear();
+ // Reset previous data
+ //--------------------
+ if (!_SVertexMap.empty())
+ _SVertexMap.clear();
}
-void ViewEdgeXBuilder::BuildViewEdges(WXShape *iWShape, ViewShape *oVShape, vector<ViewEdge*>& ioVEdges,
- vector<ViewVertex*>& ioVVertices, vector<FEdge*>& ioFEdges,
- vector<SVertex*>& ioSVertices)
+void ViewEdgeXBuilder::BuildViewEdges(WXShape *iWShape,
+ ViewShape *oVShape,
+ vector<ViewEdge *> &ioVEdges,
+ vector<ViewVertex *> &ioVVertices,
+ vector<FEdge *> &ioFEdges,
+ vector<SVertex *> &ioSVertices)
{
- // Reinit structures
- Init(oVShape);
-
- /* ViewEdge *vedge; */ /* UNUSED */
- // Let us build the smooth stuff
- //----------------------------------------
- // We parse all faces to find the ones that contain smooth edges
- vector<WFace*>& wfaces = iWShape->GetFaceList();
- vector<WFace*>::iterator wf, wfend;
- WXFace *wxf;
- for (wf = wfaces.begin(), wfend = wfaces.end(); wf != wfend; wf++) {
- wxf = dynamic_cast<WXFace*>(*wf);
- if (false == ((wxf))->hasSmoothEdges()) // does it contain at least one smooth edge ?
- continue;
- // parse all smooth layers:
- vector<WXFaceLayer*>& smoothLayers = wxf->getSmoothLayers();
- for (vector<WXFaceLayer*>::iterator sl = smoothLayers.begin(), slend = smoothLayers.end(); sl != slend; ++sl) {
- if (!(*sl)->hasSmoothEdge())
- continue;
- if (stopSmoothViewEdge((*sl))) // has it been parsed already ?
- continue;
- // here we know that we're dealing with a face layer that has not been processed yet and that contains
- // a smooth edge.
- /* vedge =*/ /* UNUSED */ BuildSmoothViewEdge(OWXFaceLayer(*sl, true));
- }
- }
-
- // Now let's build sharp view edges:
- //----------------------------------
- // Reset all userdata for WXEdge structure
- //----------------------------------------
- //iWShape->ResetUserData();
-
- WXEdge *wxe;
- vector<WEdge*>& wedges = iWShape->getEdgeList();
- //------------------------------
- for (vector<WEdge*>::iterator we = wedges.begin(), weend = wedges.end(); we != weend; we++) {
- wxe = dynamic_cast<WXEdge*>(*we);
- if (Nature::NO_FEATURE == wxe->nature())
- continue;
-
- if (!stopSharpViewEdge(wxe)) {
- bool b = true;
- if (wxe->order() == -1)
- b = false;
- BuildSharpViewEdge(OWXEdge(wxe, b));
- }
- }
-
- // Reset all userdata for WXEdge structure
- //----------------------------------------
- iWShape->ResetUserData();
-
- // Add all these new edges to the scene's feature edges list:
- //-----------------------------------------------------------
- vector<FEdge*>& newedges = _pCurrentSShape->getEdgeList();
- vector<SVertex*>& newVertices = _pCurrentSShape->getVertexList();
- vector<ViewVertex*>& newVVertices = _pCurrentVShape->vertices();
- vector<ViewEdge*>& newVEdges = _pCurrentVShape->edges();
-
- // inserts in ioFEdges, at its end, all the edges of newedges
- ioFEdges.insert(ioFEdges.end(), newedges.begin(), newedges.end());
- ioSVertices.insert(ioSVertices.end(), newVertices.begin(), newVertices.end());
- ioVVertices.insert(ioVVertices.end(), newVVertices.begin(), newVVertices.end());
- ioVEdges.insert(ioVEdges.end(), newVEdges.begin(), newVEdges.end());
+ // Reinit structures
+ Init(oVShape);
+
+ /* ViewEdge *vedge; */ /* UNUSED */
+ // Let us build the smooth stuff
+ //----------------------------------------
+ // We parse all faces to find the ones that contain smooth edges
+ vector<WFace *> &wfaces = iWShape->GetFaceList();
+ vector<WFace *>::iterator wf, wfend;
+ WXFace *wxf;
+ for (wf = wfaces.begin(), wfend = wfaces.end(); wf != wfend; wf++) {
+ wxf = dynamic_cast<WXFace *>(*wf);
+ if (false == ((wxf))->hasSmoothEdges()) // does it contain at least one smooth edge ?
+ continue;
+ // parse all smooth layers:
+ vector<WXFaceLayer *> &smoothLayers = wxf->getSmoothLayers();
+ for (vector<WXFaceLayer *>::iterator sl = smoothLayers.begin(), slend = smoothLayers.end();
+ sl != slend;
+ ++sl) {
+ if (!(*sl)->hasSmoothEdge())
+ continue;
+ if (stopSmoothViewEdge((*sl))) // has it been parsed already ?
+ continue;
+ // here we know that we're dealing with a face layer that has not been processed yet and that contains
+ // a smooth edge.
+ /* vedge =*//* UNUSED */ BuildSmoothViewEdge(OWXFaceLayer(*sl, true));
+ }
+ }
+
+ // Now let's build sharp view edges:
+ //----------------------------------
+ // Reset all userdata for WXEdge structure
+ //----------------------------------------
+ //iWShape->ResetUserData();
+
+ WXEdge *wxe;
+ vector<WEdge *> &wedges = iWShape->getEdgeList();
+ //------------------------------
+ for (vector<WEdge *>::iterator we = wedges.begin(), weend = wedges.end(); we != weend; we++) {
+ wxe = dynamic_cast<WXEdge *>(*we);
+ if (Nature::NO_FEATURE == wxe->nature())
+ continue;
+
+ if (!stopSharpViewEdge(wxe)) {
+ bool b = true;
+ if (wxe->order() == -1)
+ b = false;
+ BuildSharpViewEdge(OWXEdge(wxe, b));
+ }
+ }
+
+ // Reset all userdata for WXEdge structure
+ //----------------------------------------
+ iWShape->ResetUserData();
+
+ // Add all these new edges to the scene's feature edges list:
+ //-----------------------------------------------------------
+ vector<FEdge *> &newedges = _pCurrentSShape->getEdgeList();
+ vector<SVertex *> &newVertices = _pCurrentSShape->getVertexList();
+ vector<ViewVertex *> &newVVertices = _pCurrentVShape->vertices();
+ vector<ViewEdge *> &newVEdges = _pCurrentVShape->edges();
+
+ // inserts in ioFEdges, at its end, all the edges of newedges
+ ioFEdges.insert(ioFEdges.end(), newedges.begin(), newedges.end());
+ ioSVertices.insert(ioSVertices.end(), newVertices.begin(), newVertices.end());
+ ioVVertices.insert(ioVVertices.end(), newVVertices.begin(), newVVertices.end());
+ ioVEdges.insert(ioVEdges.end(), newVEdges.begin(), newVEdges.end());
}
-ViewEdge *ViewEdgeXBuilder::BuildSmoothViewEdge(const OWXFaceLayer& iFaceLayer)
+ViewEdge *ViewEdgeXBuilder::BuildSmoothViewEdge(const OWXFaceLayer &iFaceLayer)
{
- // Find first edge:
- OWXFaceLayer first = iFaceLayer;
- OWXFaceLayer currentFace = first;
-
- // bidirectional chaining.
- // first direction
- list<OWXFaceLayer> facesChain;
- unsigned size = 0;
- while (!stopSmoothViewEdge(currentFace.fl)) {
- facesChain.push_back(currentFace);
- ++size;
- currentFace.fl->userdata = (void *)1; // processed
- // Find the next edge!
- currentFace = FindNextFaceLayer(currentFace);
- }
- OWXFaceLayer end = facesChain.back();
- // second direction
- currentFace = FindPreviousFaceLayer(first);
- while (!stopSmoothViewEdge(currentFace.fl)) {
- facesChain.push_front(currentFace);
- ++size;
- currentFace.fl->userdata = (void *)1; // processed
- // Find the previous edge!
- currentFace = FindPreviousFaceLayer(currentFace);
- }
- first = facesChain.front();
-
- if (iFaceLayer.fl->nature() & Nature::RIDGE) {
- if (size < 4) {
- return 0;
- }
- }
-
- // Start a new chain edges
- ViewEdge *newVEdge = new ViewEdge;
- newVEdge->setId(_currentViewId);
- ++_currentViewId;
-
- _pCurrentVShape->AddEdge(newVEdge);
-
- // build FEdges
- FEdge *feprevious = NULL;
- FEdge *fefirst = NULL;
- FEdge *fe = NULL;
- for (list<OWXFaceLayer>::iterator fl = facesChain.begin(), flend = facesChain.end(); fl != flend; ++fl) {
- fe = BuildSmoothFEdge(feprevious, (*fl));
- if (feprevious && fe == feprevious)
- continue;
- fe->setViewEdge(newVEdge);
- if (!fefirst)
- fefirst = fe;
- feprevious = fe;
- }
- // Store the chain starting edge:
- _pCurrentSShape->AddChain(fefirst);
- newVEdge->setNature(iFaceLayer.fl->nature());
- newVEdge->setFEdgeA(fefirst);
- newVEdge->setFEdgeB(fe);
-
- // is it a closed loop ?
- if ((first == end) && (size != 1)) {
- fefirst->setPreviousEdge(fe);
- fe->setNextEdge(fefirst);
- newVEdge->setA(0);
- newVEdge->setB(0);
- }
- else {
- ViewVertex *vva = MakeViewVertex(fefirst->vertexA());
- ViewVertex *vvb = MakeViewVertex(fe->vertexB());
-
- ((NonTVertex *)vva)->AddOutgoingViewEdge(newVEdge);
- ((NonTVertex *)vvb)->AddIncomingViewEdge(newVEdge);
-
- newVEdge->setA(vva);
- newVEdge->setB(vvb);
- }
-
- return newVEdge;
+ // Find first edge:
+ OWXFaceLayer first = iFaceLayer;
+ OWXFaceLayer currentFace = first;
+
+ // bidirectional chaining.
+ // first direction
+ list<OWXFaceLayer> facesChain;
+ unsigned size = 0;
+ while (!stopSmoothViewEdge(currentFace.fl)) {
+ facesChain.push_back(currentFace);
+ ++size;
+ currentFace.fl->userdata = (void *)1; // processed
+ // Find the next edge!
+ currentFace = FindNextFaceLayer(currentFace);
+ }
+ OWXFaceLayer end = facesChain.back();
+ // second direction
+ currentFace = FindPreviousFaceLayer(first);
+ while (!stopSmoothViewEdge(currentFace.fl)) {
+ facesChain.push_front(currentFace);
+ ++size;
+ currentFace.fl->userdata = (void *)1; // processed
+ // Find the previous edge!
+ currentFace = FindPreviousFaceLayer(currentFace);
+ }
+ first = facesChain.front();
+
+ if (iFaceLayer.fl->nature() & Nature::RIDGE) {
+ if (size < 4) {
+ return 0;
+ }
+ }
+
+ // Start a new chain edges
+ ViewEdge *newVEdge = new ViewEdge;
+ newVEdge->setId(_currentViewId);
+ ++_currentViewId;
+
+ _pCurrentVShape->AddEdge(newVEdge);
+
+ // build FEdges
+ FEdge *feprevious = NULL;
+ FEdge *fefirst = NULL;
+ FEdge *fe = NULL;
+ for (list<OWXFaceLayer>::iterator fl = facesChain.begin(), flend = facesChain.end(); fl != flend;
+ ++fl) {
+ fe = BuildSmoothFEdge(feprevious, (*fl));
+ if (feprevious && fe == feprevious)
+ continue;
+ fe->setViewEdge(newVEdge);
+ if (!fefirst)
+ fefirst = fe;
+ feprevious = fe;
+ }
+ // Store the chain starting edge:
+ _pCurrentSShape->AddChain(fefirst);
+ newVEdge->setNature(iFaceLayer.fl->nature());
+ newVEdge->setFEdgeA(fefirst);
+ newVEdge->setFEdgeB(fe);
+
+ // is it a closed loop ?
+ if ((first == end) && (size != 1)) {
+ fefirst->setPreviousEdge(fe);
+ fe->setNextEdge(fefirst);
+ newVEdge->setA(0);
+ newVEdge->setB(0);
+ }
+ else {
+ ViewVertex *vva = MakeViewVertex(fefirst->vertexA());
+ ViewVertex *vvb = MakeViewVertex(fe->vertexB());
+
+ ((NonTVertex *)vva)->AddOutgoingViewEdge(newVEdge);
+ ((NonTVertex *)vvb)->AddIncomingViewEdge(newVEdge);
+
+ newVEdge->setA(vva);
+ newVEdge->setB(vvb);
+ }
+
+ return newVEdge;
}
-ViewEdge *ViewEdgeXBuilder::BuildSharpViewEdge(const OWXEdge& iWEdge)
+ViewEdge *ViewEdgeXBuilder::BuildSharpViewEdge(const OWXEdge &iWEdge)
{
- // Start a new sharp chain edges
- ViewEdge *newVEdge = new ViewEdge;
- newVEdge->setId(_currentViewId);
- ++_currentViewId;
- unsigned size = 0;
-
- _pCurrentVShape->AddEdge(newVEdge);
-
- // Find first edge:
- OWXEdge firstWEdge = iWEdge;
- /* OWXEdge previousWEdge = firstWEdge; */ /* UNUSED */
- OWXEdge currentWEdge = firstWEdge;
- list<OWXEdge> edgesChain;
+ // Start a new sharp chain edges
+ ViewEdge *newVEdge = new ViewEdge;
+ newVEdge->setId(_currentViewId);
+ ++_currentViewId;
+ unsigned size = 0;
+
+ _pCurrentVShape->AddEdge(newVEdge);
+
+ // Find first edge:
+ OWXEdge firstWEdge = iWEdge;
+ /* OWXEdge previousWEdge = firstWEdge; */ /* UNUSED */
+ OWXEdge currentWEdge = firstWEdge;
+ list<OWXEdge> edgesChain;
#if 0 /* TK 02-Sep-2012 Experimental fix for incorrect view edge visibility. */
- // bidirectional chaining
- // first direction:
- while (!stopSharpViewEdge(currentWEdge.e)) {
- edgesChain.push_back(currentWEdge);
- ++size;
- currentWEdge.e->userdata = (void *)1; // processed
- // Find the next edge!
- currentWEdge = FindNextWEdge(currentWEdge);
- }
- OWXEdge endWEdge = edgesChain.back();
- // second direction
- currentWEdge = FindPreviousWEdge(firstWEdge);
- while (!stopSharpViewEdge(currentWEdge.e)) {
- edgesChain.push_front(currentWEdge);
- ++size;
- currentWEdge.e->userdata = (void *)1; // processed
- // Find the previous edge!
- currentWEdge = FindPreviousWEdge(currentWEdge);
- }
+ // bidirectional chaining
+ // first direction:
+ while (!stopSharpViewEdge(currentWEdge.e)) {
+ edgesChain.push_back(currentWEdge);
+ ++size;
+ currentWEdge.e->userdata = (void *)1; // processed
+ // Find the next edge!
+ currentWEdge = FindNextWEdge(currentWEdge);
+ }
+ OWXEdge endWEdge = edgesChain.back();
+ // second direction
+ currentWEdge = FindPreviousWEdge(firstWEdge);
+ while (!stopSharpViewEdge(currentWEdge.e)) {
+ edgesChain.push_front(currentWEdge);
+ ++size;
+ currentWEdge.e->userdata = (void *)1; // processed
+ // Find the previous edge!
+ currentWEdge = FindPreviousWEdge(currentWEdge);
+ }
#else
- edgesChain.push_back(currentWEdge);
- ++size;
- currentWEdge.e->userdata = (void *)1; // processed
- OWXEdge endWEdge = edgesChain.back();
+ edgesChain.push_back(currentWEdge);
+ ++size;
+ currentWEdge.e->userdata = (void *)1; // processed
+ OWXEdge endWEdge = edgesChain.back();
#endif
- firstWEdge = edgesChain.front();
-
- // build FEdges
- FEdge *feprevious = NULL;
- FEdge *fefirst = NULL;
- FEdge *fe = NULL;
- for (list<OWXEdge>::iterator we = edgesChain.begin(), weend = edgesChain.end(); we != weend; ++we) {
- fe = BuildSharpFEdge(feprevious, (*we));
- fe->setViewEdge(newVEdge);
- if (!fefirst)
- fefirst = fe;
- feprevious = fe;
- }
- // Store the chain starting edge:
- _pCurrentSShape->AddChain(fefirst);
- newVEdge->setNature(iWEdge.e->nature());
- newVEdge->setFEdgeA(fefirst);
- newVEdge->setFEdgeB(fe);
-
- // is it a closed loop ?
- if ((firstWEdge == endWEdge) && (size != 1)) {
- fefirst->setPreviousEdge(fe);
- fe->setNextEdge(fefirst);
- newVEdge->setA(0);
- newVEdge->setB(0);
- }
- else {
- ViewVertex *vva = MakeViewVertex(fefirst->vertexA());
- ViewVertex *vvb = MakeViewVertex(fe->vertexB());
-
- ((NonTVertex *)vva)->AddOutgoingViewEdge(newVEdge);
- ((NonTVertex *)vvb)->AddIncomingViewEdge(newVEdge);
-
- newVEdge->setA(vva);
- newVEdge->setB(vvb);
- }
-
- return newVEdge;
+ firstWEdge = edgesChain.front();
+
+ // build FEdges
+ FEdge *feprevious = NULL;
+ FEdge *fefirst = NULL;
+ FEdge *fe = NULL;
+ for (list<OWXEdge>::iterator we = edgesChain.begin(), weend = edgesChain.end(); we != weend;
+ ++we) {
+ fe = BuildSharpFEdge(feprevious, (*we));
+ fe->setViewEdge(newVEdge);
+ if (!fefirst)
+ fefirst = fe;
+ feprevious = fe;
+ }
+ // Store the chain starting edge:
+ _pCurrentSShape->AddChain(fefirst);
+ newVEdge->setNature(iWEdge.e->nature());
+ newVEdge->setFEdgeA(fefirst);
+ newVEdge->setFEdgeB(fe);
+
+ // is it a closed loop ?
+ if ((firstWEdge == endWEdge) && (size != 1)) {
+ fefirst->setPreviousEdge(fe);
+ fe->setNextEdge(fefirst);
+ newVEdge->setA(0);
+ newVEdge->setB(0);
+ }
+ else {
+ ViewVertex *vva = MakeViewVertex(fefirst->vertexA());
+ ViewVertex *vvb = MakeViewVertex(fe->vertexB());
+
+ ((NonTVertex *)vva)->AddOutgoingViewEdge(newVEdge);
+ ((NonTVertex *)vvb)->AddIncomingViewEdge(newVEdge);
+
+ newVEdge->setA(vva);
+ newVEdge->setB(vvb);
+ }
+
+ return newVEdge;
}
-OWXFaceLayer ViewEdgeXBuilder::FindNextFaceLayer(const OWXFaceLayer& iFaceLayer)
+OWXFaceLayer ViewEdgeXBuilder::FindNextFaceLayer(const OWXFaceLayer &iFaceLayer)
{
- WXFace *nextFace = NULL;
- WOEdge *woeend;
- real tend;
- if (iFaceLayer.order) {
- woeend = iFaceLayer.fl->getSmoothEdge()->woeb();
- tend = iFaceLayer.fl->getSmoothEdge()->tb();
- }
- else {
- woeend = iFaceLayer.fl->getSmoothEdge()->woea();
- tend = iFaceLayer.fl->getSmoothEdge()->ta();
- }
- // special case of EDGE_VERTEX config:
- if ((tend == 0.0) || (tend == 1.0)) {
- WVertex *nextVertex;
- if (tend == 0.0)
- nextVertex = woeend->GetaVertex();
- else
- nextVertex = woeend->GetbVertex();
- if (nextVertex->isBoundary()) // if it's a non-manifold vertex -> ignore
- return OWXFaceLayer(0, true);
- bool found = false;
- WVertex::face_iterator f = nextVertex->faces_begin();
- WVertex::face_iterator fend = nextVertex->faces_end();
- while ((!found) && (f != fend)) {
- nextFace = dynamic_cast<WXFace*>(*f);
- if ((0 != nextFace) && (nextFace != iFaceLayer.fl->getFace())) {
- vector<WXFaceLayer*> sameNatureLayers;
- nextFace->retrieveSmoothEdgesLayers(iFaceLayer.fl->nature(), sameNatureLayers);
- // don't know... Maybe should test whether this face has also a vertex_edge configuration.
- if (sameNatureLayers.size() == 1) {
- WXFaceLayer *winner = sameNatureLayers[0];
- // check face mark continuity
- if (winner->getFace()->GetMark() != iFaceLayer.fl->getFace()->GetMark())
- return OWXFaceLayer(NULL, true);
- if (woeend == winner->getSmoothEdge()->woea()->twin())
- return OWXFaceLayer(winner, true);
- else
- return OWXFaceLayer(winner, false);
- }
- }
- ++f;
- }
- }
- else {
- nextFace = dynamic_cast<WXFace*>(iFaceLayer.fl->getFace()->GetBordingFace(woeend));
- if (!nextFace)
- return OWXFaceLayer(NULL, true);
- // if the next face layer has either no smooth edge or no smooth edge of same nature, no next face
- if (!nextFace->hasSmoothEdges())
- return OWXFaceLayer(NULL, true);
- vector<WXFaceLayer*> sameNatureLayers;
- nextFace->retrieveSmoothEdgesLayers(iFaceLayer.fl->nature(), sameNatureLayers);
- // don't know how to deal with several edges of same nature on a single face
- if ((sameNatureLayers.empty()) || (sameNatureLayers.size() != 1)) {
- return OWXFaceLayer(NULL, true);
- }
- else {
- WXFaceLayer *winner = sameNatureLayers[0];
- // check face mark continuity
- if (winner->getFace()->GetMark() != iFaceLayer.fl->getFace()->GetMark())
- return OWXFaceLayer(NULL, true);
- if (woeend == winner->getSmoothEdge()->woea()->twin())
- return OWXFaceLayer(winner, true);
- else
- return OWXFaceLayer(winner, false);
- }
- }
- return OWXFaceLayer(NULL, true);
+ WXFace *nextFace = NULL;
+ WOEdge *woeend;
+ real tend;
+ if (iFaceLayer.order) {
+ woeend = iFaceLayer.fl->getSmoothEdge()->woeb();
+ tend = iFaceLayer.fl->getSmoothEdge()->tb();
+ }
+ else {
+ woeend = iFaceLayer.fl->getSmoothEdge()->woea();
+ tend = iFaceLayer.fl->getSmoothEdge()->ta();
+ }
+ // special case of EDGE_VERTEX config:
+ if ((tend == 0.0) || (tend == 1.0)) {
+ WVertex *nextVertex;
+ if (tend == 0.0)
+ nextVertex = woeend->GetaVertex();
+ else
+ nextVertex = woeend->GetbVertex();
+ if (nextVertex->isBoundary()) // if it's a non-manifold vertex -> ignore
+ return OWXFaceLayer(0, true);
+ bool found = false;
+ WVertex::face_iterator f = nextVertex->faces_begin();
+ WVertex::face_iterator fend = nextVertex->faces_end();
+ while ((!found) && (f != fend)) {
+ nextFace = dynamic_cast<WXFace *>(*f);
+ if ((0 != nextFace) && (nextFace != iFaceLayer.fl->getFace())) {
+ vector<WXFaceLayer *> sameNatureLayers;
+ nextFace->retrieveSmoothEdgesLayers(iFaceLayer.fl->nature(), sameNatureLayers);
+ // don't know... Maybe should test whether this face has also a vertex_edge configuration.
+ if (sameNatureLayers.size() == 1) {
+ WXFaceLayer *winner = sameNatureLayers[0];
+ // check face mark continuity
+ if (winner->getFace()->GetMark() != iFaceLayer.fl->getFace()->GetMark())
+ return OWXFaceLayer(NULL, true);
+ if (woeend == winner->getSmoothEdge()->woea()->twin())
+ return OWXFaceLayer(winner, true);
+ else
+ return OWXFaceLayer(winner, false);
+ }
+ }
+ ++f;
+ }
+ }
+ else {
+ nextFace = dynamic_cast<WXFace *>(iFaceLayer.fl->getFace()->GetBordingFace(woeend));
+ if (!nextFace)
+ return OWXFaceLayer(NULL, true);
+ // if the next face layer has either no smooth edge or no smooth edge of same nature, no next face
+ if (!nextFace->hasSmoothEdges())
+ return OWXFaceLayer(NULL, true);
+ vector<WXFaceLayer *> sameNatureLayers;
+ nextFace->retrieveSmoothEdgesLayers(iFaceLayer.fl->nature(), sameNatureLayers);
+ // don't know how to deal with several edges of same nature on a single face
+ if ((sameNatureLayers.empty()) || (sameNatureLayers.size() != 1)) {
+ return OWXFaceLayer(NULL, true);
+ }
+ else {
+ WXFaceLayer *winner = sameNatureLayers[0];
+ // check face mark continuity
+ if (winner->getFace()->GetMark() != iFaceLayer.fl->getFace()->GetMark())
+ return OWXFaceLayer(NULL, true);
+ if (woeend == winner->getSmoothEdge()->woea()->twin())
+ return OWXFaceLayer(winner, true);
+ else
+ return OWXFaceLayer(winner, false);
+ }
+ }
+ return OWXFaceLayer(NULL, true);
}
-OWXFaceLayer ViewEdgeXBuilder::FindPreviousFaceLayer(const OWXFaceLayer& iFaceLayer)
+OWXFaceLayer ViewEdgeXBuilder::FindPreviousFaceLayer(const OWXFaceLayer &iFaceLayer)
{
- WXFace *previousFace = NULL;
- WOEdge *woebegin;
- real tend;
- if (iFaceLayer.order) {
- woebegin = iFaceLayer.fl->getSmoothEdge()->woea();
- tend = iFaceLayer.fl->getSmoothEdge()->ta();
- }
- else {
- woebegin = iFaceLayer.fl->getSmoothEdge()->woeb();
- tend = iFaceLayer.fl->getSmoothEdge()->tb();
- }
-
- // special case of EDGE_VERTEX config:
- if ((tend == 0.0) || (tend == 1.0)) {
- WVertex *previousVertex;
- if (tend == 0.0)
- previousVertex = woebegin->GetaVertex();
- else
- previousVertex = woebegin->GetbVertex();
- if (previousVertex->isBoundary()) // if it's a non-manifold vertex -> ignore
- return OWXFaceLayer(NULL, true);
- bool found = false;
- WVertex::face_iterator f = previousVertex->faces_begin();
- WVertex::face_iterator fend = previousVertex->faces_end();
- for (; (!found) && (f != fend); ++f) {
- previousFace = dynamic_cast<WXFace*>(*f);
- if ((0 != previousFace) && (previousFace != iFaceLayer.fl->getFace())) {
- vector<WXFaceLayer*> sameNatureLayers;
- previousFace->retrieveSmoothEdgesLayers(iFaceLayer.fl->nature(), sameNatureLayers);
- // don't know... Maybe should test whether this face has also a vertex_edge configuration
- if (sameNatureLayers.size() == 1) {
- WXFaceLayer *winner = sameNatureLayers[0];
- // check face mark continuity
- if (winner->getFace()->GetMark() != iFaceLayer.fl->getFace()->GetMark())
- return OWXFaceLayer(NULL, true);
- if (woebegin == winner->getSmoothEdge()->woeb()->twin())
- return OWXFaceLayer(winner, true);
- else
- return OWXFaceLayer(winner, false);
- }
- }
- }
- }
- else {
- previousFace = dynamic_cast<WXFace*>(iFaceLayer.fl->getFace()->GetBordingFace(woebegin));
- if (0 == previousFace)
- return OWXFaceLayer(NULL, true);
- // if the next face layer has either no smooth edge or no smooth edge of same nature, no next face
- if (!previousFace->hasSmoothEdges())
- return OWXFaceLayer(NULL, true);
- vector<WXFaceLayer*> sameNatureLayers;
- previousFace->retrieveSmoothEdgesLayers(iFaceLayer.fl->nature(), sameNatureLayers);
- // don't know how to deal with several edges of same nature on a single face
- if ((sameNatureLayers.empty()) || (sameNatureLayers.size() != 1)) {
- return OWXFaceLayer(NULL, true);
- }
- else {
- WXFaceLayer *winner = sameNatureLayers[0];
- // check face mark continuity
- if (winner->getFace()->GetMark() != iFaceLayer.fl->getFace()->GetMark())
- return OWXFaceLayer(NULL, true);
- if (woebegin == winner->getSmoothEdge()->woeb()->twin())
- return OWXFaceLayer(winner, true);
- else
- return OWXFaceLayer(winner, false);
- }
- }
- return OWXFaceLayer(NULL, true);
+ WXFace *previousFace = NULL;
+ WOEdge *woebegin;
+ real tend;
+ if (iFaceLayer.order) {
+ woebegin = iFaceLayer.fl->getSmoothEdge()->woea();
+ tend = iFaceLayer.fl->getSmoothEdge()->ta();
+ }
+ else {
+ woebegin = iFaceLayer.fl->getSmoothEdge()->woeb();
+ tend = iFaceLayer.fl->getSmoothEdge()->tb();
+ }
+
+ // special case of EDGE_VERTEX config:
+ if ((tend == 0.0) || (tend == 1.0)) {
+ WVertex *previousVertex;
+ if (tend == 0.0)
+ previousVertex = woebegin->GetaVertex();
+ else
+ previousVertex = woebegin->GetbVertex();
+ if (previousVertex->isBoundary()) // if it's a non-manifold vertex -> ignore
+ return OWXFaceLayer(NULL, true);
+ bool found = false;
+ WVertex::face_iterator f = previousVertex->faces_begin();
+ WVertex::face_iterator fend = previousVertex->faces_end();
+ for (; (!found) && (f != fend); ++f) {
+ previousFace = dynamic_cast<WXFace *>(*f);
+ if ((0 != previousFace) && (previousFace != iFaceLayer.fl->getFace())) {
+ vector<WXFaceLayer *> sameNatureLayers;
+ previousFace->retrieveSmoothEdgesLayers(iFaceLayer.fl->nature(), sameNatureLayers);
+ // don't know... Maybe should test whether this face has also a vertex_edge configuration
+ if (sameNatureLayers.size() == 1) {
+ WXFaceLayer *winner = sameNatureLayers[0];
+ // check face mark continuity
+ if (winner->getFace()->GetMark() != iFaceLayer.fl->getFace()->GetMark())
+ return OWXFaceLayer(NULL, true);
+ if (woebegin == winner->getSmoothEdge()->woeb()->twin())
+ return OWXFaceLayer(winner, true);
+ else
+ return OWXFaceLayer(winner, false);
+ }
+ }
+ }
+ }
+ else {
+ previousFace = dynamic_cast<WXFace *>(iFaceLayer.fl->getFace()->GetBordingFace(woebegin));
+ if (0 == previousFace)
+ return OWXFaceLayer(NULL, true);
+ // if the next face layer has either no smooth edge or no smooth edge of same nature, no next face
+ if (!previousFace->hasSmoothEdges())
+ return OWXFaceLayer(NULL, true);
+ vector<WXFaceLayer *> sameNatureLayers;
+ previousFace->retrieveSmoothEdgesLayers(iFaceLayer.fl->nature(), sameNatureLayers);
+ // don't know how to deal with several edges of same nature on a single face
+ if ((sameNatureLayers.empty()) || (sameNatureLayers.size() != 1)) {
+ return OWXFaceLayer(NULL, true);
+ }
+ else {
+ WXFaceLayer *winner = sameNatureLayers[0];
+ // check face mark continuity
+ if (winner->getFace()->GetMark() != iFaceLayer.fl->getFace()->GetMark())
+ return OWXFaceLayer(NULL, true);
+ if (woebegin == winner->getSmoothEdge()->woeb()->twin())
+ return OWXFaceLayer(winner, true);
+ else
+ return OWXFaceLayer(winner, false);
+ }
+ }
+ return OWXFaceLayer(NULL, true);
}
-FEdge *ViewEdgeXBuilder::BuildSmoothFEdge(FEdge *feprevious, const OWXFaceLayer& ifl)
+FEdge *ViewEdgeXBuilder::BuildSmoothFEdge(FEdge *feprevious, const OWXFaceLayer &ifl)
{
- WOEdge *woea, *woeb;
- real ta, tb;
- SVertex *va, *vb;
- FEdgeSmooth *fe;
- // retrieve exact silhouette data
- WXSmoothEdge *se = ifl.fl->getSmoothEdge();
-
- if (ifl.order) {
- woea = se->woea();
- woeb = se->woeb();
- ta = se->ta();
- tb = se->tb();
- }
- else {
- woea = se->woeb();
- woeb = se->woea();
- ta = se->tb();
- tb = se->ta();
- }
-
- Vec3r normal;
- // Make the 2 Svertices
- if (feprevious == 0) { // that means that we don't have any vertex already built for that face
- Vec3r A1(woea->GetaVertex()->GetVertex());
- Vec3r A2(woea->GetbVertex()->GetVertex());
- Vec3r A(A1 + ta * (A2 - A1));
-
- va = MakeSVertex(A, false);
- // Set normal:
- Vec3r NA1(ifl.fl->getFace()->GetVertexNormal(woea->GetaVertex()));
- Vec3r NA2(ifl.fl->getFace()->GetVertexNormal(woea->GetbVertex()));
- Vec3r na((1 - ta) * NA1 + ta * NA2);
- na.normalize();
- va->AddNormal(na);
- normal = na;
-
- // Set CurvatureInfo
- CurvatureInfo *curvature_info_a =
- new CurvatureInfo(*(dynamic_cast<WXVertex*>(woea->GetaVertex())->curvatures()),
- *(dynamic_cast<WXVertex*>(woea->GetbVertex())->curvatures()), ta);
- va->setCurvatureInfo(curvature_info_a);
- }
- else {
- va = feprevious->vertexB();
- }
-
- Vec3r B1(woeb->GetaVertex()->GetVertex());
- Vec3r B2(woeb->GetbVertex()->GetVertex());
- Vec3r B(B1 + tb * (B2 - B1));
-
- if (feprevious && (B - va->point3D()).norm() < 1.0e-6)
- return feprevious;
-
- vb = MakeSVertex(B, false);
- // Set normal:
- Vec3r NB1(ifl.fl->getFace()->GetVertexNormal(woeb->GetaVertex()));
- Vec3r NB2(ifl.fl->getFace()->GetVertexNormal(woeb->GetbVertex()));
- Vec3r nb((1 - tb) * NB1 + tb * NB2);
- nb.normalize();
- normal += nb;
- vb->AddNormal(nb);
-
- // Set CurvatureInfo
- CurvatureInfo *curvature_info_b =
- new CurvatureInfo(*(dynamic_cast<WXVertex*>(woeb->GetaVertex())->curvatures()),
- *(dynamic_cast<WXVertex*>(woeb->GetbVertex())->curvatures()), tb);
- vb->setCurvatureInfo(curvature_info_b);
-
- // Creates the corresponding feature edge
- fe = new FEdgeSmooth(va, vb);
- fe->setNature(ifl.fl->nature());
- fe->setId(_currentFId);
- fe->setFrsMaterialIndex(ifl.fl->getFace()->frs_materialIndex());
- fe->setFace(ifl.fl->getFace());
- fe->setFaceMark(ifl.fl->getFace()->GetMark());
- if (feprevious == 0)
- normal.normalize();
- fe->setNormal(normal);
- fe->setPreviousEdge(feprevious);
- if (feprevious)
- feprevious->setNextEdge(fe);
- _pCurrentSShape->AddEdge(fe);
- va->AddFEdge(fe);
- vb->AddFEdge(fe);
-
- ++_currentFId;
- ifl.fl->userdata = fe;
- return fe;
+ WOEdge *woea, *woeb;
+ real ta, tb;
+ SVertex *va, *vb;
+ FEdgeSmooth *fe;
+ // retrieve exact silhouette data
+ WXSmoothEdge *se = ifl.fl->getSmoothEdge();
+
+ if (ifl.order) {
+ woea = se->woea();
+ woeb = se->woeb();
+ ta = se->ta();
+ tb = se->tb();
+ }
+ else {
+ woea = se->woeb();
+ woeb = se->woea();
+ ta = se->tb();
+ tb = se->ta();
+ }
+
+ Vec3r normal;
+ // Make the 2 Svertices
+ if (feprevious == 0) { // that means that we don't have any vertex already built for that face
+ Vec3r A1(woea->GetaVertex()->GetVertex());
+ Vec3r A2(woea->GetbVertex()->GetVertex());
+ Vec3r A(A1 + ta * (A2 - A1));
+
+ va = MakeSVertex(A, false);
+ // Set normal:
+ Vec3r NA1(ifl.fl->getFace()->GetVertexNormal(woea->GetaVertex()));
+ Vec3r NA2(ifl.fl->getFace()->GetVertexNormal(woea->GetbVertex()));
+ Vec3r na((1 - ta) * NA1 + ta * NA2);
+ na.normalize();
+ va->AddNormal(na);
+ normal = na;
+
+ // Set CurvatureInfo
+ CurvatureInfo *curvature_info_a = new CurvatureInfo(
+ *(dynamic_cast<WXVertex *>(woea->GetaVertex())->curvatures()),
+ *(dynamic_cast<WXVertex *>(woea->GetbVertex())->curvatures()),
+ ta);
+ va->setCurvatureInfo(curvature_info_a);
+ }
+ else {
+ va = feprevious->vertexB();
+ }
+
+ Vec3r B1(woeb->GetaVertex()->GetVertex());
+ Vec3r B2(woeb->GetbVertex()->GetVertex());
+ Vec3r B(B1 + tb * (B2 - B1));
+
+ if (feprevious && (B - va->point3D()).norm() < 1.0e-6)
+ return feprevious;
+
+ vb = MakeSVertex(B, false);
+ // Set normal:
+ Vec3r NB1(ifl.fl->getFace()->GetVertexNormal(woeb->GetaVertex()));
+ Vec3r NB2(ifl.fl->getFace()->GetVertexNormal(woeb->GetbVertex()));
+ Vec3r nb((1 - tb) * NB1 + tb * NB2);
+ nb.normalize();
+ normal += nb;
+ vb->AddNormal(nb);
+
+ // Set CurvatureInfo
+ CurvatureInfo *curvature_info_b = new CurvatureInfo(
+ *(dynamic_cast<WXVertex *>(woeb->GetaVertex())->curvatures()),
+ *(dynamic_cast<WXVertex *>(woeb->GetbVertex())->curvatures()),
+ tb);
+ vb->setCurvatureInfo(curvature_info_b);
+
+ // Creates the corresponding feature edge
+ fe = new FEdgeSmooth(va, vb);
+ fe->setNature(ifl.fl->nature());
+ fe->setId(_currentFId);
+ fe->setFrsMaterialIndex(ifl.fl->getFace()->frs_materialIndex());
+ fe->setFace(ifl.fl->getFace());
+ fe->setFaceMark(ifl.fl->getFace()->GetMark());
+ if (feprevious == 0)
+ normal.normalize();
+ fe->setNormal(normal);
+ fe->setPreviousEdge(feprevious);
+ if (feprevious)
+ feprevious->setNextEdge(fe);
+ _pCurrentSShape->AddEdge(fe);
+ va->AddFEdge(fe);
+ vb->AddFEdge(fe);
+
+ ++_currentFId;
+ ifl.fl->userdata = fe;
+ return fe;
}
bool ViewEdgeXBuilder::stopSmoothViewEdge(WXFaceLayer *iFaceLayer)
{
- if (NULL == iFaceLayer)
- return true;
- if (iFaceLayer->userdata == 0)
- return false;
- return true;
+ if (NULL == iFaceLayer)
+ return true;
+ if (iFaceLayer->userdata == 0)
+ return false;
+ return true;
}
int ViewEdgeXBuilder::retrieveFaceMarks(WXEdge *iEdge)
{
- WFace *aFace = iEdge->GetaFace();
- WFace *bFace = iEdge->GetbFace();
- int result = 0;
- if (aFace && aFace->GetMark())
- result += 1;
- if (bFace && bFace->GetMark())
- result += 2;
- return result;
+ WFace *aFace = iEdge->GetaFace();
+ WFace *bFace = iEdge->GetbFace();
+ int result = 0;
+ if (aFace && aFace->GetMark())
+ result += 1;
+ if (bFace && bFace->GetMark())
+ result += 2;
+ return result;
}
-OWXEdge ViewEdgeXBuilder::FindNextWEdge(const OWXEdge& iEdge)
+OWXEdge ViewEdgeXBuilder::FindNextWEdge(const OWXEdge &iEdge)
{
- if (Nature::NO_FEATURE == iEdge.e->nature())
- return OWXEdge(NULL, true);
-
- WVertex *v;
- if (true == iEdge.order)
- v = iEdge.e->GetbVertex();
- else
- v = iEdge.e->GetaVertex();
-
- if (((WXVertex *)v)->isFeature())
- return 0; /* XXX eeek? NULL? OWXEdge(NULL, true/false)?*/
-
- int faceMarks = retrieveFaceMarks(iEdge.e);
- vector<WEdge*>& vEdges = (v)->GetEdges();
- for (vector<WEdge*>::iterator ve = vEdges.begin(), veend = vEdges.end(); ve != veend; ve++) {
- WXEdge *wxe = dynamic_cast<WXEdge*>(*ve);
- if (wxe == iEdge.e)
- continue; // same edge as the one processed
-
- if (wxe->nature() != iEdge.e->nature())
- continue;
-
- // check face mark continuity
- if (retrieveFaceMarks(wxe) != faceMarks)
- continue;
-
- if (wxe->GetaVertex() == v) {
- // That means that the face necesarily lies on the edge left.
- // So the vertex order is OK.
- return OWXEdge(wxe, true);
- }
- else {
- // That means that the face necesarily lies on the edge left.
- // So the vertex order is OK.
- return OWXEdge(wxe, false);
- }
- }
- // we did not find:
- return OWXEdge(NULL, true);
+ if (Nature::NO_FEATURE == iEdge.e->nature())
+ return OWXEdge(NULL, true);
+
+ WVertex *v;
+ if (true == iEdge.order)
+ v = iEdge.e->GetbVertex();
+ else
+ v = iEdge.e->GetaVertex();
+
+ if (((WXVertex *)v)->isFeature())
+ return 0; /* XXX eeek? NULL? OWXEdge(NULL, true/false)?*/
+
+ int faceMarks = retrieveFaceMarks(iEdge.e);
+ vector<WEdge *> &vEdges = (v)->GetEdges();
+ for (vector<WEdge *>::iterator ve = vEdges.begin(), veend = vEdges.end(); ve != veend; ve++) {
+ WXEdge *wxe = dynamic_cast<WXEdge *>(*ve);
+ if (wxe == iEdge.e)
+ continue; // same edge as the one processed
+
+ if (wxe->nature() != iEdge.e->nature())
+ continue;
+
+ // check face mark continuity
+ if (retrieveFaceMarks(wxe) != faceMarks)
+ continue;
+
+ if (wxe->GetaVertex() == v) {
+ // That means that the face necesarily lies on the edge left.
+ // So the vertex order is OK.
+ return OWXEdge(wxe, true);
+ }
+ else {
+ // That means that the face necesarily lies on the edge left.
+ // So the vertex order is OK.
+ return OWXEdge(wxe, false);
+ }
+ }
+ // we did not find:
+ return OWXEdge(NULL, true);
}
-OWXEdge ViewEdgeXBuilder::FindPreviousWEdge(const OWXEdge& iEdge)
+OWXEdge ViewEdgeXBuilder::FindPreviousWEdge(const OWXEdge &iEdge)
{
- if (Nature::NO_FEATURE == iEdge.e->nature())
- return OWXEdge(NULL, true);
-
- WVertex *v;
- if (true == iEdge.order)
- v = iEdge.e->GetaVertex();
- else
- v = iEdge.e->GetbVertex();
-
- if (((WXVertex *)v)->isFeature())
- return 0;
-
- int faceMarks = retrieveFaceMarks(iEdge.e);
- vector<WEdge *>& vEdges = (v)->GetEdges();
- for (vector<WEdge *>::iterator ve = vEdges.begin(), veend = vEdges.end(); ve != veend; ve++) {
- WXEdge *wxe = dynamic_cast<WXEdge *>(*ve);
- if (wxe == iEdge.e)
- continue; // same edge as the one processed
-
- if (wxe->nature() != iEdge.e->nature())
- continue;
-
- // check face mark continuity
- if (retrieveFaceMarks(wxe) != faceMarks)
- continue;
-
- if (wxe->GetbVertex() == v) {
- return OWXEdge(wxe, true);
- }
- else {
- return OWXEdge(wxe, false);
- }
- }
- // we did not find:
- return OWXEdge(NULL, true);
+ if (Nature::NO_FEATURE == iEdge.e->nature())
+ return OWXEdge(NULL, true);
+
+ WVertex *v;
+ if (true == iEdge.order)
+ v = iEdge.e->GetaVertex();
+ else
+ v = iEdge.e->GetbVertex();
+
+ if (((WXVertex *)v)->isFeature())
+ return 0;
+
+ int faceMarks = retrieveFaceMarks(iEdge.e);
+ vector<WEdge *> &vEdges = (v)->GetEdges();
+ for (vector<WEdge *>::iterator ve = vEdges.begin(), veend = vEdges.end(); ve != veend; ve++) {
+ WXEdge *wxe = dynamic_cast<WXEdge *>(*ve);
+ if (wxe == iEdge.e)
+ continue; // same edge as the one processed
+
+ if (wxe->nature() != iEdge.e->nature())
+ continue;
+
+ // check face mark continuity
+ if (retrieveFaceMarks(wxe) != faceMarks)
+ continue;
+
+ if (wxe->GetbVertex() == v) {
+ return OWXEdge(wxe, true);
+ }
+ else {
+ return OWXEdge(wxe, false);
+ }
+ }
+ // we did not find:
+ return OWXEdge(NULL, true);
}
-FEdge *ViewEdgeXBuilder::BuildSharpFEdge(FEdge *feprevious, const OWXEdge& iwe)
+FEdge *ViewEdgeXBuilder::BuildSharpFEdge(FEdge *feprevious, const OWXEdge &iwe)
{
- SVertex *va, *vb;
- FEdgeSharp *fe;
- Vec3r vA, vB;
- if (iwe.order) {
- vA = iwe.e->GetaVertex()->GetVertex();
- vB = iwe.e->GetbVertex()->GetVertex();
- }
- else {
- vA = iwe.e->GetbVertex()->GetVertex();
- vB = iwe.e->GetaVertex()->GetVertex();
- }
- // Make the 2 SVertex
- va = MakeSVertex(vA, true);
- vb = MakeSVertex(vB, true);
-
- // get the faces normals and the material indices
- Vec3r normalA, normalB;
- unsigned matA(0), matB(0);
- bool faceMarkA = false, faceMarkB = false;
- if (iwe.order) {
- normalB = (iwe.e->GetbFace()->GetNormal());
- matB = (iwe.e->GetbFace()->frs_materialIndex());
- faceMarkB = (iwe.e->GetbFace()->GetMark());
- if (!(iwe.e->nature() & Nature::BORDER)) {
- normalA = (iwe.e->GetaFace()->GetNormal());
- matA = (iwe.e->GetaFace()->frs_materialIndex());
- faceMarkA = (iwe.e->GetaFace()->GetMark());
- }
- }
- else {
- normalA = (iwe.e->GetbFace()->GetNormal());
- matA = (iwe.e->GetbFace()->frs_materialIndex());
- faceMarkA = (iwe.e->GetbFace()->GetMark());
- if (!(iwe.e->nature() & Nature::BORDER)) {
- normalB = (iwe.e->GetaFace()->GetNormal());
- matB = (iwe.e->GetaFace()->frs_materialIndex());
- faceMarkB = (iwe.e->GetaFace()->GetMark());
- }
- }
- // Creates the corresponding feature edge
- fe = new FEdgeSharp(va, vb);
- fe->setNature(iwe.e->nature());
- fe->setId(_currentFId);
- fe->setaFrsMaterialIndex(matA);
- fe->setbFrsMaterialIndex(matB);
- fe->setaFaceMark(faceMarkA);
- fe->setbFaceMark(faceMarkB);
- fe->setNormalA(normalA);
- fe->setNormalB(normalB);
- fe->setPreviousEdge(feprevious);
- if (feprevious)
- feprevious->setNextEdge(fe);
- _pCurrentSShape->AddEdge(fe);
- va->AddFEdge(fe);
- vb->AddFEdge(fe);
- //Add normals:
- va->AddNormal(normalA);
- va->AddNormal(normalB);
- vb->AddNormal(normalA);
- vb->AddNormal(normalB);
-
- ++_currentFId;
- iwe.e->userdata = fe;
- return fe;
+ SVertex *va, *vb;
+ FEdgeSharp *fe;
+ Vec3r vA, vB;
+ if (iwe.order) {
+ vA = iwe.e->GetaVertex()->GetVertex();
+ vB = iwe.e->GetbVertex()->GetVertex();
+ }
+ else {
+ vA = iwe.e->GetbVertex()->GetVertex();
+ vB = iwe.e->GetaVertex()->GetVertex();
+ }
+ // Make the 2 SVertex
+ va = MakeSVertex(vA, true);
+ vb = MakeSVertex(vB, true);
+
+ // get the faces normals and the material indices
+ Vec3r normalA, normalB;
+ unsigned matA(0), matB(0);
+ bool faceMarkA = false, faceMarkB = false;
+ if (iwe.order) {
+ normalB = (iwe.e->GetbFace()->GetNormal());
+ matB = (iwe.e->GetbFace()->frs_materialIndex());
+ faceMarkB = (iwe.e->GetbFace()->GetMark());
+ if (!(iwe.e->nature() & Nature::BORDER)) {
+ normalA = (iwe.e->GetaFace()->GetNormal());
+ matA = (iwe.e->GetaFace()->frs_materialIndex());
+ faceMarkA = (iwe.e->GetaFace()->GetMark());
+ }
+ }
+ else {
+ normalA = (iwe.e->GetbFace()->GetNormal());
+ matA = (iwe.e->GetbFace()->frs_materialIndex());
+ faceMarkA = (iwe.e->GetbFace()->GetMark());
+ if (!(iwe.e->nature() & Nature::BORDER)) {
+ normalB = (iwe.e->GetaFace()->GetNormal());
+ matB = (iwe.e->GetaFace()->frs_materialIndex());
+ faceMarkB = (iwe.e->GetaFace()->GetMark());
+ }
+ }
+ // Creates the corresponding feature edge
+ fe = new FEdgeSharp(va, vb);
+ fe->setNature(iwe.e->nature());
+ fe->setId(_currentFId);
+ fe->setaFrsMaterialIndex(matA);
+ fe->setbFrsMaterialIndex(matB);
+ fe->setaFaceMark(faceMarkA);
+ fe->setbFaceMark(faceMarkB);
+ fe->setNormalA(normalA);
+ fe->setNormalB(normalB);
+ fe->setPreviousEdge(feprevious);
+ if (feprevious)
+ feprevious->setNextEdge(fe);
+ _pCurrentSShape->AddEdge(fe);
+ va->AddFEdge(fe);
+ vb->AddFEdge(fe);
+ //Add normals:
+ va->AddNormal(normalA);
+ va->AddNormal(normalB);
+ vb->AddNormal(normalA);
+ vb->AddNormal(normalB);
+
+ ++_currentFId;
+ iwe.e->userdata = fe;
+ return fe;
}
bool ViewEdgeXBuilder::stopSharpViewEdge(WXEdge *iEdge)
{
- if (NULL == iEdge)
- return true;
- if (iEdge->userdata == 0)
- return false;
- return true;
+ if (NULL == iEdge)
+ return true;
+ if (iEdge->userdata == 0)
+ return false;
+ return true;
}
-SVertex *ViewEdgeXBuilder::MakeSVertex(Vec3r& iPoint)
+SVertex *ViewEdgeXBuilder::MakeSVertex(Vec3r &iPoint)
{
- SVertex *va = new SVertex(iPoint, _currentSVertexId);
- SilhouetteGeomEngine::ProjectSilhouette(va);
- ++_currentSVertexId;
- // Add the svertex to the SShape svertex list:
- _pCurrentSShape->AddNewVertex(va);
- return va;
+ SVertex *va = new SVertex(iPoint, _currentSVertexId);
+ SilhouetteGeomEngine::ProjectSilhouette(va);
+ ++_currentSVertexId;
+ // Add the svertex to the SShape svertex list:
+ _pCurrentSShape->AddNewVertex(va);
+ return va;
}
-SVertex *ViewEdgeXBuilder::MakeSVertex(Vec3r& iPoint, bool shared)
+SVertex *ViewEdgeXBuilder::MakeSVertex(Vec3r &iPoint, bool shared)
{
- SVertex *va;
- if (!shared) {
- va = MakeSVertex(iPoint);
- }
- else {
- // Check whether the iPoint is already in the table
- SVertexMap::const_iterator found = _SVertexMap.find(iPoint);
- if (shared && found != _SVertexMap.end()) {
- va = (*found).second;
- }
- else {
- va = MakeSVertex(iPoint);
- // Add the svertex into the table using iPoint as the key
- _SVertexMap[iPoint] = va;
- }
- }
- return va;
+ SVertex *va;
+ if (!shared) {
+ va = MakeSVertex(iPoint);
+ }
+ else {
+ // Check whether the iPoint is already in the table
+ SVertexMap::const_iterator found = _SVertexMap.find(iPoint);
+ if (shared && found != _SVertexMap.end()) {
+ va = (*found).second;
+ }
+ else {
+ va = MakeSVertex(iPoint);
+ // Add the svertex into the table using iPoint as the key
+ _SVertexMap[iPoint] = va;
+ }
+ }
+ return va;
}
ViewVertex *ViewEdgeXBuilder::MakeViewVertex(SVertex *iSVertex)
{
- ViewVertex *vva = iSVertex->viewvertex();
- if (vva)
- return vva;
- vva = new NonTVertex(iSVertex);
- // Add the view vertex to the ViewShape svertex list:
- _pCurrentVShape->AddVertex(vva);
- return vva;
+ ViewVertex *vva = iSVertex->viewvertex();
+ if (vva)
+ return vva;
+ vva = new NonTVertex(iSVertex);
+ // Add the view vertex to the ViewShape svertex list:
+ _pCurrentVShape->AddVertex(vva);
+ return vva;
}
} /* namespace Freestyle */