[Bf-blender-cvs] [1923a8f] master: Fix T40223: Setting bevel_factor_mapping_start/end crashes

Campbell Barton noreply at git.blender.org
Fri May 16 17:03:05 CEST 2014


Commit: 1923a8f23a174c343601771ab5136f2a7d38fc47
Author: Campbell Barton
Date:   Sat May 17 01:01:43 2014 +1000
https://developer.blender.org/rB1923a8f23a174c343601771ab5136f2a7d38fc47

Fix T40223: Setting bevel_factor_mapping_start/end crashes

Patch from Lukas Treyer

===================================================================

M	source/blender/blenkernel/intern/displist.c

===================================================================

diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 0ca4537..e5d7f03 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) {




More information about the Bf-blender-cvs mailing list