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>2010-07-05 03:08:37 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2010-07-05 03:08:37 +0400
commit38b7cbbd004ef7268a1c39114d8503906361c1f7 (patch)
tree1312b72e85499323e130b9e455f39c2b9833b1cb /source/blender/freestyle/intern/stroke/Operators.cpp
parent4dd23a381a8a7c65732e12025e2f0503595e2956 (diff)
Bug fixes from Stéphane Grabli, one of the coauthors of the
original Freestyle: * Fix for making the stroke construction more robust to nearly overlapping vertices. * Fix for a bug in the computation of the occluded surfaces. These changes make the visibility computation more robust and the line quality generally higher.
Diffstat (limited to 'source/blender/freestyle/intern/stroke/Operators.cpp')
-rwxr-xr-xsource/blender/freestyle/intern/stroke/Operators.cpp30
1 files changed, 23 insertions, 7 deletions
diff --git a/source/blender/freestyle/intern/stroke/Operators.cpp b/source/blender/freestyle/intern/stroke/Operators.cpp
index ef1b2662998..ea996c67785 100755
--- a/source/blender/freestyle/intern/stroke/Operators.cpp
+++ b/source/blender/freestyle/intern/stroke/Operators.cpp
@@ -938,10 +938,18 @@ Stroke* createStroke(Interface1D& inter) {
stroke_vertex = new StrokeVertex(cp);
current = stroke_vertex->point2d();
Vec3r vec_tmp(current - previous);
- currentCurvilignAbscissa += vec_tmp.norm();
- stroke_vertex->setCurvilinearAbscissa(currentCurvilignAbscissa);
- stroke->push_back(stroke_vertex);
- previous = current;
+ real vec_tmp_norm = vec_tmp.norm();
+ if((stroke->strokeVerticesSize() > 0) && (vec_tmp_norm < 1.e-06)){
+ // The point we just created is superimposed with the
+ // previous one. We remove it to avoid having to deal
+ // with this kind of singularities in the strip creation
+ delete stroke_vertex;
+ }else{
+ currentCurvilignAbscissa += vec_tmp.norm();
+ stroke_vertex->setCurvilinearAbscissa(currentCurvilignAbscissa);
+ stroke->push_back(stroke_vertex);
+ previous = current;
+ }
++it;
} while((it != itend) && (it != itfirst));
@@ -959,9 +967,17 @@ Stroke* createStroke(Interface1D& inter) {
stroke_vertex = new StrokeVertex(cp);
current = stroke_vertex->point2d();
Vec3r vec_tmp(current - previous);
- currentCurvilignAbscissa += vec_tmp.norm();
- stroke_vertex->setCurvilinearAbscissa(currentCurvilignAbscissa);
- stroke->push_back(stroke_vertex);
+ real vec_tmp_norm = vec_tmp.norm();
+ if((stroke->strokeVerticesSize() > 0) && (vec_tmp_norm < 1.e-06)){
+ // The point we just created is superimposed with the
+ // previous one. We remove it to avoid having to deal
+ // with this kind of singularities in the strip creation
+ delete stroke_vertex;
+ }else{
+ currentCurvilignAbscissa += vec_tmp.norm();
+ stroke_vertex->setCurvilinearAbscissa(currentCurvilignAbscissa);
+ stroke->push_back(stroke_vertex);
+ }
}
stroke->setLength(currentCurvilignAbscissa);
return stroke;