From f0acdcf13526046236ce561736521100cba58ff1 Mon Sep 17 00:00:00 2001 From: Tamito Kajiyama Date: Sun, 30 Oct 2011 16:00:35 +0000 Subject: Fix for stroke rendering instability with stroke geometry shaders. * Stroke::Resample(int nPoints) was not properly working when a wrong value was returned from Stroke::getLength2D(), resulting in repeated warning messages "Warning: incorrect points number" during stroke rendering. The main cause was that stroke geometry shaders did not update the two-dimensional (2D) length (also referred to as curvilinear abscissa) after they modified the 2D points of stroke vertices. Now all stroke geometry shaders make explicit calls for Stroke::UpdateLength() that has been introduced for recomputing the 2D length. Many thanks to Josef who reported the problem together with sample .blend files for reproducing the issue. * Missing Python wrapper of Stroke::getLength2D() was added. --- .../freestyle/intern/stroke/BasicStrokeShaders.cpp | 8 ++++++ source/blender/freestyle/intern/stroke/Stroke.cpp | 31 +++++----------------- source/blender/freestyle/intern/stroke/Stroke.h | 3 +++ 3 files changed, 18 insertions(+), 24 deletions(-) (limited to 'source/blender/freestyle/intern/stroke') diff --git a/source/blender/freestyle/intern/stroke/BasicStrokeShaders.cpp b/source/blender/freestyle/intern/stroke/BasicStrokeShaders.cpp index bc9edcef057..ec9f887d533 100755 --- a/source/blender/freestyle/intern/stroke/BasicStrokeShaders.cpp +++ b/source/blender/freestyle/intern/stroke/BasicStrokeShaders.cpp @@ -586,6 +586,8 @@ namespace StrokeShaders { (v0)->setPoint(newFirst[0], newFirst[1]); Vec2d newLast(last+_amount*dn); (vn)->setPoint(newLast[0], newLast[1]); + + stroke.UpdateLength(); return 0; } @@ -611,6 +613,7 @@ namespace StrokeShaders { sv->setPoint(newPoint[0], newPoint[1]); ++it; } + stroke.UpdateLength(); return 0; } @@ -726,6 +729,7 @@ namespace StrokeShaders { ++it; ++n; } + stroke.UpdateLength(); return 0; } @@ -844,6 +848,7 @@ namespace StrokeShaders { ++p; ++n; } + stroke.UpdateLength(); // Deal with extra vertices: if(nExtraVertex == 0) @@ -931,6 +936,7 @@ namespace StrokeShaders { sv->setPoint(newPoint[0], newPoint[1]); ++it; } + stroke.UpdateLength(); return 0; } @@ -1038,6 +1044,7 @@ namespace StrokeShaders { // u.normalize(); // (*a)->setPoint((*a)->x()-u.x()*10, (*a)->y()-u.y()*10); } + stroke.UpdateLength(); // delete stuff for(cp=_results.begin(), cpend=_results.end(); @@ -1076,6 +1083,7 @@ namespace StrokeShaders { { v->setPoint(piece.A.x()+v->u()*u.x()+n.x()*offset, piece.A.y()+v->u()*u.y()+n.y()*offset); } + stroke.UpdateLength(); return 0; } diff --git a/source/blender/freestyle/intern/stroke/Stroke.cpp b/source/blender/freestyle/intern/stroke/Stroke.cpp index f6cefdfee34..0c852d0e209 100755 --- a/source/blender/freestyle/intern/stroke/Stroke.cpp +++ b/source/blender/freestyle/intern/stroke/Stroke.cpp @@ -674,28 +674,7 @@ void Stroke::RemoveVertex(StrokeVertex *iVertex) break; } } - // recompute various values (length, curvilign abscissa) - float curvabsc = 0.f; - it=_Vertices.begin(); - itend=_Vertices.end(); - vertex_container::iterator previous=it; - for(; - (it!=itend); - ++it) - { - if(it != previous) - curvabsc += ((*it)->point2d()-(*previous)->point2d()).norm(); - (*it)->setCurvilinearAbscissa(curvabsc); - previous = it; - } - _Length = curvabsc; - it=_Vertices.begin(); - for(; - (it!=itend); - ++it) - { - (*it)->setStrokeLength(_Length); - } + UpdateLength(); } void Stroke::InsertVertex(StrokeVertex *iVertex, StrokeInternal::StrokeVertexIterator next) @@ -704,10 +683,14 @@ void Stroke::InsertVertex(StrokeVertex *iVertex, StrokeInternal::StrokeVertexIte vertex_container::iterator itnext = next.getIt(); _Vertices.insert(itnext, iVertex); + UpdateLength(); +} + +void Stroke::UpdateLength() +{ // recompute various values (length, curvilign abscissa) float curvabsc = 0.f; - it=_Vertices.begin(); - itend=_Vertices.end(); + vertex_container::iterator it=_Vertices.begin(), itend=_Vertices.end(); vertex_container::iterator previous=it; for(; (it!=itend); diff --git a/source/blender/freestyle/intern/stroke/Stroke.h b/source/blender/freestyle/intern/stroke/Stroke.h index 5e0974edea7..1b1084b54c2 100755 --- a/source/blender/freestyle/intern/stroke/Stroke.h +++ b/source/blender/freestyle/intern/stroke/Stroke.h @@ -466,6 +466,9 @@ public: */ void InsertVertex(StrokeVertex *iVertex, StrokeInternal::StrokeVertexIterator next); + /*! Updates the 2D length of the Stroke */ + void UpdateLength(); + /* Render method */ void Render(const StrokeRenderer *iRenderer ); void RenderBasic(const StrokeRenderer *iRenderer ); -- cgit v1.2.3