diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-05-16 19:01:43 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-05-16 19:01:43 +0400 |
commit | 1923a8f23a174c343601771ab5136f2a7d38fc47 (patch) | |
tree | 8cb2143b32dc8ff916ab571202fa10c95582a872 /source/blender/blenkernel/intern/displist.c | |
parent | 04665e20067cd7e5ffae8f48de50eb861b8e32d4 (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.c | 17 |
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) { |