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-10-30 20:00:35 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2011-10-30 20:00:35 +0400
commitf0acdcf13526046236ce561736521100cba58ff1 (patch)
tree519edbd9f908e2f5c8fea76db1b5e5b12df13ea9 /source/blender/freestyle/intern/stroke
parent1f252288574f03205f329689693a0f483a894f89 (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/blender/freestyle/intern/stroke')
-rwxr-xr-xsource/blender/freestyle/intern/stroke/BasicStrokeShaders.cpp8
-rwxr-xr-xsource/blender/freestyle/intern/stroke/Stroke.cpp31
-rwxr-xr-xsource/blender/freestyle/intern/stroke/Stroke.h3
3 files changed, 18 insertions, 24 deletions
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 );