diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2010-07-05 03:08:37 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2010-07-05 03:08:37 +0400 |
commit | 38b7cbbd004ef7268a1c39114d8503906361c1f7 (patch) | |
tree | 1312b72e85499323e130b9e455f39c2b9833b1cb /source/blender/freestyle/intern/stroke/Operators.cpp | |
parent | 4dd23a381a8a7c65732e12025e2f0503595e2956 (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-x | source/blender/freestyle/intern/stroke/Operators.cpp | 30 |
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; |