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>2013-03-17 02:39:39 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2013-03-17 02:39:39 +0400
commit0d9c98c4bbfbc8c70c4772086dd09a51d01921ef (patch)
tree7ea39e803e66e0a688168910bda10383dfdc8f8b /source/blender/freestyle/intern
parent031a58dc027a7e6c4e630e64584d68b08fb52e2c (diff)
Fix for a crash due to a bug in the handling of singularity in stroke creation,
where additions of a small offset (to prevent vertices from being at the same point) were not properly done when vertices were shifted in the reverse order. A problem report by Vicente Carro through personal communications, thanks a lot!
Diffstat (limited to 'source/blender/freestyle/intern')
-rw-r--r--source/blender/freestyle/intern/stroke/Operators.cpp29
1 files changed, 12 insertions, 17 deletions
diff --git a/source/blender/freestyle/intern/stroke/Operators.cpp b/source/blender/freestyle/intern/stroke/Operators.cpp
index df2c3dad175..b9213b86acb 100644
--- a/source/blender/freestyle/intern/stroke/Operators.cpp
+++ b/source/blender/freestyle/intern/stroke/Operators.cpp
@@ -1113,8 +1113,9 @@ static Stroke *createStroke(Interface1D& inter)
if (!vprevious.isBegin())
--vprevious;
- // collect a set of overlapping vertices (except the first one)
+ // collect a set of overlapping vertices
std::vector<Interface0D *> overlapping_vertices;
+ overlapping_vertices.push_back(&(*v));
do {
overlapping_vertices.push_back(&(*vnext));
current = next;
@@ -1140,43 +1141,37 @@ static Stroke *createStroke(Interface1D& inter)
delete stroke;
return NULL;
}
+ current = overlapping_vertices.front()->getPoint2D();
Vec2r dir(target - current);
real dist = dir.norm();
real len = 1.0e-3; // default offset length
int nvert = overlapping_vertices.size();
if (dist < len * nvert) {
- len = dist / (nvert + 1);
+ len = dist / nvert;
}
dir.normalize();
Vec2r offset(dir * len);
-#if 0
- if (G.debug & G_DEBUG_FREESTYLE) {
- cout << "#vert " << nvert << " len " << len << " reverse? " << reverse << endl;
- }
-#endif
// add the offset to the overlapping vertices
StrokeVertex *sv;
- std::vector<Interface0D *>::iterator it = overlapping_vertices.begin(),
- itend = overlapping_vertices.end();
+ std::vector<Interface0D *>::iterator it = overlapping_vertices.begin();
if (!reverse) {
- int n = 1;
- for (; it != itend; ++it) {
+ for (int n = 1; n < nvert; n++) {
sv = dynamic_cast<StrokeVertex*>(*it);
sv->setPoint(sv->getPoint() + offset * n);
- ++n;
+ ++it;
}
}
else {
- int n = nvert;
- for (; it != itend; ++it) {
+ int last = nvert - 1;
+ for (int n = 0; n < last; n++) {
sv = dynamic_cast<StrokeVertex*>(*it);
- sv->setPoint(sv->getPoint() + offset * n);
- --n;
+ sv->setPoint(sv->getPoint() + offset * (last - n));
+ ++it;
}
}
if (vnext.isEnd())
- break;
+ break;
}
++v;
++vnext;