diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2011-10-30 20:00:35 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2011-10-30 20:00:35 +0400 |
commit | f0acdcf13526046236ce561736521100cba58ff1 (patch) | |
tree | 519edbd9f908e2f5c8fea76db1b5e5b12df13ea9 /source | |
parent | 1f252288574f03205f329689693a0f483a894f89 (diff) |
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.
Diffstat (limited to 'source')
4 files changed, 43 insertions, 24 deletions
diff --git a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp index 7edfde7e8f6..fe215588275 100644 --- a/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp +++ b/source/blender/freestyle/intern/python/Interface1D/BPy_Stroke.cpp @@ -223,6 +223,29 @@ static PyObject * Stroke_RemoveVertex( BPy_Stroke *self, PyObject *args ) { Py_RETURN_NONE; } +static char Stroke_UpdateLength___doc__[] = +".. method:: UpdateLength()\n" +"\n" +" Updates the 2D length of the Stroke.\n"; + +static PyObject * Stroke_UpdateLength( BPy_Stroke *self ) { + self->s->UpdateLength(); + + Py_RETURN_NONE; +} + +static char Stroke_getLength2D___doc__[] = +".. method:: getLength2D()\n" +"\n" +" Returns the 2D length of the Stroke.\n" +"\n" +" :return: the 2D length of the Stroke.\n" +" :rtype: float\n"; + +static PyObject * Stroke_getLength2D( BPy_Stroke *self ) { + return PyFloat_FromDouble( self->s->getLength2D() ); +} + static char Stroke_getMediumType___doc__[] = ".. method:: getMediumType()\n" "\n" @@ -415,6 +438,8 @@ static PyMethodDef BPy_Stroke_methods[] = { {"Resample", ( PyCFunction ) Stroke_Resample, METH_VARARGS, Stroke_Resample___doc__}, {"RemoveVertex", ( PyCFunction ) Stroke_RemoveVertex, METH_VARARGS, Stroke_RemoveVertex___doc__}, {"InsertVertex", ( PyCFunction ) Stroke_InsertVertex, METH_VARARGS, Stroke_InsertVertex___doc__}, + {"UpdateLength", ( PyCFunction ) Stroke_UpdateLength, METH_NOARGS, Stroke_UpdateLength___doc__}, + {"getLength2D", ( PyCFunction ) Stroke_getLength2D, METH_NOARGS, Stroke_getLength2D___doc__}, {"getMediumType", ( PyCFunction ) Stroke_getMediumType, METH_NOARGS, Stroke_getMediumType___doc__}, {"getTextureId", ( PyCFunction ) Stroke_getTextureId, METH_NOARGS, Stroke_getTextureId___doc__}, {"hasTips", ( PyCFunction ) Stroke_hasTips, METH_NOARGS, Stroke_hasTips___doc__}, 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 ); |