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:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2011-11-12 23:08:16 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2011-11-12 23:08:16 +0400
commit1ae159bff4c9c1d2e26df81744ab73c388b3bbe1 (patch)
tree117b9fc3244cf53eb27d25050ae7ef1767d202e7 /source/blender/freestyle/intern/view_map
parent2910427277f5fc0c201d19d72cd8347e89164e45 (diff)
Fix for the view map construction not taking account of face marks.
Diffstat (limited to 'source/blender/freestyle/intern/view_map')
-rwxr-xr-xsource/blender/freestyle/intern/view_map/ViewEdgeXBuilder.cpp34
-rwxr-xr-xsource/blender/freestyle/intern/view_map/ViewEdgeXBuilder.h1
2 files changed, 35 insertions, 0 deletions
diff --git a/source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.cpp b/source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.cpp
index 0f282fb643f..d158e345505 100755
--- a/source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.cpp
+++ b/source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.cpp
@@ -311,6 +311,9 @@ OWXFaceLayer ViewEdgeXBuilder::FindNextFaceLayer(const OWXFaceLayer& iFaceLayer)
// maybe should test whether this face has
// also a vertex_edge configuration
WXFaceLayer * winner = sameNatureLayers[0];
+ // check face mark continuity
+ if(winner->getFace()->GetMark() != iFaceLayer.fl->getFace()->GetMark())
+ return OWXFaceLayer(0,true);
if(woeend == winner->getSmoothEdge()->woea()->twin())
return OWXFaceLayer(winner,true);
else
@@ -333,6 +336,9 @@ OWXFaceLayer ViewEdgeXBuilder::FindNextFaceLayer(const OWXFaceLayer& iFaceLayer)
return OWXFaceLayer(0,true);
else{
WXFaceLayer * winner = sameNatureLayers[0];
+ // check face mark continuity
+ if(winner->getFace()->GetMark() != iFaceLayer.fl->getFace()->GetMark())
+ return OWXFaceLayer(0,true);
if(woeend == winner->getSmoothEdge()->woea()->twin())
return OWXFaceLayer(winner,true);
else
@@ -375,6 +381,9 @@ OWXFaceLayer ViewEdgeXBuilder::FindPreviousFaceLayer(const OWXFaceLayer& iFaceLa
// maybe should test whether this face has
// also a vertex_edge configuration
WXFaceLayer * winner = sameNatureLayers[0];
+ // check face mark continuity
+ if(winner->getFace()->GetMark() != iFaceLayer.fl->getFace()->GetMark())
+ return OWXFaceLayer(0,true);
if(woebegin == winner->getSmoothEdge()->woeb()->twin())
return OWXFaceLayer(winner,true);
else
@@ -398,6 +407,9 @@ OWXFaceLayer ViewEdgeXBuilder::FindPreviousFaceLayer(const OWXFaceLayer& iFaceLa
return OWXFaceLayer(0,true);
else{
WXFaceLayer * winner = sameNatureLayers[0];
+ // check face mark continuity
+ if(winner->getFace()->GetMark() != iFaceLayer.fl->getFace()->GetMark())
+ return OWXFaceLayer(0,true);
if(woebegin == winner->getSmoothEdge()->woeb()->twin())
return OWXFaceLayer(winner,true);
else
@@ -501,6 +513,18 @@ bool ViewEdgeXBuilder::stopSmoothViewEdge(WXFaceLayer *iFaceLayer){
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;
+}
+
OWXEdge ViewEdgeXBuilder::FindNextWEdge(const OWXEdge& iEdge){
if(Nature::NO_FEATURE == iEdge.e->nature())
return OWXEdge(0, true);
@@ -515,6 +539,7 @@ OWXEdge ViewEdgeXBuilder::FindNextWEdge(const OWXEdge& iEdge){
return 0;
+ int faceMarks = retrieveFaceMarks(iEdge.e);
vector<WEdge*>& vEdges = (v)->GetEdges();
for(vector<WEdge*>::iterator ve=vEdges.begin(),veend=vEdges.end();
ve!=veend;
@@ -526,6 +551,10 @@ OWXEdge ViewEdgeXBuilder::FindNextWEdge(const OWXEdge& iEdge){
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.
@@ -554,6 +583,7 @@ OWXEdge ViewEdgeXBuilder::FindPreviousWEdge(const OWXEdge& iEdge){
return 0;
+ int faceMarks = retrieveFaceMarks(iEdge.e);
vector<WEdge*>& vEdges = (v)->GetEdges();
for(vector<WEdge*>::iterator ve=vEdges.begin(),veend=vEdges.end();
ve!=veend;
@@ -565,6 +595,10 @@ OWXEdge ViewEdgeXBuilder::FindPreviousWEdge(const OWXEdge& iEdge){
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{
diff --git a/source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.h b/source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.h
index 69134f5a212..744cc520b2b 100755
--- a/source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.h
+++ b/source/blender/freestyle/intern/view_map/ViewEdgeXBuilder.h
@@ -193,6 +193,7 @@ protected:
// SHARP //
/*! checks whether a WEdge has already been processed or not */
bool stopSharpViewEdge(WXEdge *iFace);
+ int retrieveFaceMarks(WXEdge *iEdge);
OWXEdge FindNextWEdge(const OWXEdge& iEdge);
OWXEdge FindPreviousWEdge(const OWXEdge& iEdge);
FEdge * BuildSharpFEdge(FEdge *feprevious, const OWXEdge& iwe);