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:
authorCampbell Barton <ideasman42@gmail.com>2014-05-16 19:01:43 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-05-16 19:01:43 +0400
commit1923a8f23a174c343601771ab5136f2a7d38fc47 (patch)
tree8cb2143b32dc8ff916ab571202fa10c95582a872 /source/blender/blenkernel/intern/displist.c
parent04665e20067cd7e5ffae8f48de50eb861b8e32d4 (diff)
Fix T40223: Setting bevel_factor_mapping_start/end crashes
Patch from Lukas Treyer
Diffstat (limited to 'source/blender/blenkernel/intern/displist.c')
-rw-r--r--source/blender/blenkernel/intern/displist.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 0ca4537c4cc..e5d7f03aae3 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -1377,13 +1377,17 @@ static void calc_bevfac_spline_mapping(BevList *bl, float bevfac, float spline_l
}
}
-static void calc_bevfac_mapping(Curve *cu, BevList *bl, int *r_start, float *r_firstblend, int *r_steps, float *r_lastblend)
+static void calc_bevfac_mapping(Curve *cu, BevList *bl, short splinetype, const bool use_render_resolution,
+ int *r_start, float *r_firstblend, int *r_steps, float *r_lastblend)
{
+ const int resolu = (use_render_resolution) ? cu->resolu_ren : cu->resolu;
+ const int segcount = (splinetype == CU_POLY) ? bl->nr : (bl->nr / resolu);
+
BevPoint *bevp, *bevl;
float l, startf, endf, tmpf = 0.0, sum = 0.0, total_length = 0.0f;
float *bevp_array = NULL;
float *segments = NULL;
- int end = 0, i, j, segcount = (int)(bl->nr / cu->resolu);
+ int end = 0, i, j;
if ((cu->bevfac1_mapping != CU_BEVFAC_MAP_RESOLU) ||
(cu->bevfac2_mapping != CU_BEVFAC_MAP_RESOLU))
@@ -1398,7 +1402,7 @@ static void calc_bevfac_mapping(Curve *cu, BevList *bl, int *r_start, float *r_f
bevp_array[i - 1] = len_v3v3(bevp->vec, bevl->vec);
total_length += bevp_array[i - 1];
tmpf += bevp_array[i - 1];
- if ((i % cu->resolu) == 0 || (bl->nr - 1) == i) {
+ if ((i % resolu) == 0 || (bl->nr - 1) == i) {
BLI_assert(j < segcount);
segments[j++] = tmpf;
tmpf = 0.0f;
@@ -1423,7 +1427,7 @@ static void calc_bevfac_mapping(Curve *cu, BevList *bl, int *r_start, float *r_f
for (i = 0; i < segcount; i++) {
l = segments[i] / total_length;
if (sum + l > cu->bevfac1) {
- startf = i * cu->resolu + (cu->bevfac1 - sum) / l * cu->resolu;
+ startf = i * resolu + (cu->bevfac1 - sum) / l * resolu;
*r_start = (int) startf;
*r_firstblend = 1.0f - (startf - *r_start);
break;
@@ -1460,7 +1464,7 @@ static void calc_bevfac_mapping(Curve *cu, BevList *bl, int *r_start, float *r_f
for (i = 0; i < segcount; i++) {
l = segments[i] / total_length;
if (sum + l > cu->bevfac2) {
- endf = i * cu->resolu + (cu->bevfac2 - sum) / l * cu->resolu;
+ endf = i * resolu + (cu->bevfac2 - sum) / l * resolu;
end = (int)endf;
*r_lastblend = (endf - end);
*r_steps = end - *r_start + 2;
@@ -1598,7 +1602,8 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
float firstblend = 0.0f, lastblend = 0.0f;
int i, start, steps;
- calc_bevfac_mapping(cu, bl, &start, &firstblend, &steps, &lastblend);
+ calc_bevfac_mapping(cu, bl, nu->type, use_render_resolution,
+ &start, &firstblend, &steps, &lastblend);
for (dlb = dlbev.first; dlb; dlb = dlb->next) {