[Bf-blender-cvs] [81be1c7] master: Correct crash /w vertex slide with no faces

Campbell Barton noreply at git.blender.org
Mon Feb 16 03:43:05 CET 2015


Commit: 81be1c7a219070255d979af9e607bb9b7a6741b5
Author: Campbell Barton
Date:   Mon Feb 16 13:41:46 2015 +1100
Branches: master
https://developer.blender.org/rB81be1c7a219070255d979af9e607bb9b7a6741b5

Correct crash /w vertex slide with no faces

Error in recent commit

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

M	source/blender/editors/transform/transform.c

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

diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index b928343..1740e54 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -5272,6 +5272,7 @@ static void slide_origdata_create_data(
 		for (i = 0; i < v_num; i++, sv = (void *)(((char *)sv) + v_stride)) {
 			BMIter fiter;
 			BMFace *f;
+			bool has_faces = false;
 
 			/* copy face data */
 			BM_ITER_ELEM (f, &fiter, sv->v, BM_FACES_OF_VERT) {
@@ -5279,13 +5280,19 @@ static void slide_origdata_create_data(
 					BMFace *f_copy = BM_face_copy(sod->bm_origfaces, bm, f, true, true);
 					BLI_ghash_insert(sod->origfaces, f, f_copy);
 				}
+				has_faces = true;
 			}
 
 			/* store cd_loop_groups */
-			sv->cd_loop_groups = BLI_memarena_alloc(sod->arena, layer_groups_array_size);
-			for (j = 0; j < layer_index_dst; j++) {
-				const int layer_nr = layer_math_map[j];
-				sv->cd_loop_groups[j] = BM_vert_loop_groups_data_layer_create(bm, sv->v, layer_nr, sod->arena);
+			if (has_faces) {
+				sv->cd_loop_groups = BLI_memarena_alloc(sod->arena, layer_groups_array_size);
+				for (j = 0; j < layer_index_dst; j++) {
+					const int layer_nr = layer_math_map[j];
+					sv->cd_loop_groups[j] = BM_vert_loop_groups_data_layer_create(bm, sv->v, layer_nr, sod->arena);
+				}
+			}
+			else {
+				sv->cd_loop_groups = NULL;
 			}
 		}
 	}
@@ -5303,25 +5310,28 @@ static void slide_origdata_interp_data(
 		const int *layer_math_map = sod->layer_math_map;
 
 		for (i = 0; i < v_num; i++, sv = (void *)(((char *)sv) + v_stride)) {
-			BMIter fiter;
-			BMLoop *l;
-			int j;
 
-			BM_ITER_ELEM (l, &fiter, sv->v, BM_LOOPS_OF_VERT) {
-				BMFace *f_copy;  /* the copy of 'f' */
+			if (sv->cd_loop_groups) {
+				BMIter fiter;
+				BMLoop *l;
+				int j;
 
-				f_copy = BLI_ghash_lookup(sod->origfaces, l->f);
+				BM_ITER_ELEM (l, &fiter, sv->v, BM_LOOPS_OF_VERT) {
+					BMFace *f_copy;  /* the copy of 'f' */
 
-				/* only loop data, no vertex data since that contains shape keys,
-				 * and we do not want to mess up other shape keys */
-				BM_loop_interp_from_face(em->bm, l, f_copy, false, is_final);
+					f_copy = BLI_ghash_lookup(sod->origfaces, l->f);
 
-				/* make sure face-attributes are correct (e.g. MTexPoly) */
-				BM_elem_attrs_copy(sod->bm_origfaces, em->bm, f_copy, l->f);
-			}
+					/* only loop data, no vertex data since that contains shape keys,
+					 * and we do not want to mess up other shape keys */
+					BM_loop_interp_from_face(em->bm, l, f_copy, false, is_final);
+
+					/* make sure face-attributes are correct (e.g. MTexPoly) */
+					BM_elem_attrs_copy(sod->bm_origfaces, em->bm, f_copy, l->f);
+				}
 
-			for (j = 0; j < sod->layer_math_map_num; j++) {
-				 BM_vert_loop_groups_data_layer_merge(em->bm, sv->cd_loop_groups[j], layer_math_map[j]);
+				for (j = 0; j < sod->layer_math_map_num; j++) {
+					 BM_vert_loop_groups_data_layer_merge(em->bm, sv->cd_loop_groups[j], layer_math_map[j]);
+				}
 			}
 		}
 	}




More information about the Bf-blender-cvs mailing list