[Bf-blender-cvs] [018593b] wiggly-widgets: Fix more crashes when removing facemaps. Indices of leftover facemaps above the deleted one could become invalid

Antony Riakiotakis noreply at git.blender.org
Wed Dec 17 18:33:38 CET 2014


Commit: 018593b75abd9ce928bf04f922b7644291fcefcb
Author: Antony Riakiotakis
Date:   Wed Dec 17 18:31:43 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB018593b75abd9ce928bf04f922b7644291fcefcb

Fix more crashes when removing facemaps. Indices of leftover facemaps
above the deleted one could become invalid

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

M	source/blender/editors/object/object_fmap.c

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

diff --git a/source/blender/editors/object/object_fmap.c b/source/blender/editors/object/object_fmap.c
index 2959749..168ca11 100644
--- a/source/blender/editors/object/object_fmap.c
+++ b/source/blender/editors/object/object_fmap.c
@@ -246,7 +246,7 @@ static void object_facemap_swap(Object *ob, int num1, int num2)
 		object_fmap_swap_object_mode(ob, num1, num2);
 }
 
-static void object_fmap_remove_edit_mode(Object *ob, bFaceMap *fmap, bool do_selected)
+static void object_fmap_remove_edit_mode(Object *ob, bFaceMap *fmap, bool do_selected, bool purge)
 {
 	const int fmap_nr = BLI_findindex(&ob->fmaps, fmap);
 	
@@ -262,11 +262,25 @@ static void object_fmap_remove_edit_mode(Object *ob, bFaceMap *fmap, bool do_sel
 				BMIter iter;
 				int *map;
 				
-				BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
-					map = BM_ELEM_CD_GET_VOID_P(efa, cd_fmap_offset);
-					
-					if (map && *map == fmap_nr && (!do_selected || BM_elem_flag_test(efa, BM_ELEM_SELECT))) {
-						*map = -1;
+				if (purge) {
+					BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+						map = BM_ELEM_CD_GET_VOID_P(efa, cd_fmap_offset);
+						
+						if (map) { 
+							if (*map == fmap_nr)
+								*map = -1;
+							else if (*map > fmap_nr)
+								*map -= 1;
+						}
+					}
+				}
+				else {
+					BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+						map = BM_ELEM_CD_GET_VOID_P(efa, cd_fmap_offset);
+						
+						if (map && *map == fmap_nr && (!do_selected || BM_elem_flag_test(efa, BM_ELEM_SELECT))) {
+							*map = -1;
+						}
 					}
 				}
 			}
@@ -280,7 +294,7 @@ static void object_fmap_remove_edit_mode(Object *ob, bFaceMap *fmap, bool do_sel
 	}
 }
 
-static void object_fmap_remove_object_mode(Object *ob, bFaceMap *fmap)
+static void object_fmap_remove_object_mode(Object *ob, bFaceMap *fmap, bool purge)
 {
 	const int fmap_nr = BLI_findindex(&ob->fmaps, fmap);
 	
@@ -295,6 +309,8 @@ static void object_fmap_remove_object_mode(Object *ob, bFaceMap *fmap)
 				for (i = 0; i < me->totpoly; i++) {
 					if (map[i] == fmap_nr)
 						map[i] = -1;
+					else if (purge && map[i] > fmap_nr)
+						map[i]--;
 				}
 			}
 		}
@@ -310,9 +326,9 @@ static void object_fmap_remove_object_mode(Object *ob, bFaceMap *fmap)
 void BKE_object_facemap_remove(Object *ob, bFaceMap *fmap)
 {
 	if (BKE_object_is_in_editmode(ob))
-		object_fmap_remove_edit_mode(ob, fmap, false);
+		object_fmap_remove_edit_mode(ob, fmap, false, true);
 	else
-		object_fmap_remove_object_mode(ob, fmap);
+		object_fmap_remove_object_mode(ob, fmap, true);
 }
 
 void BKE_object_fmap_remove_all(Object *ob)
@@ -326,9 +342,9 @@ void BKE_object_fmap_remove_all(Object *ob)
 			bFaceMap *next_fmap = fmap->next;
 
 			if (edit_mode)
-				object_fmap_remove_edit_mode(ob, fmap, false);
+				object_fmap_remove_edit_mode(ob, fmap, false, false);
 			else
-				object_fmap_remove_object_mode(ob, fmap);
+				object_fmap_remove_object_mode(ob, fmap, false);
 
 			fmap = next_fmap;
 		}
@@ -412,7 +428,7 @@ void OBJECT_OT_face_map_remove(struct wmOperatorType *ot)
 	/* identifiers */
 	ot->name = "Remove Face Map";
 	ot->idname = "OBJECT_OT_face_map_remove";
-	ot->description = "Remove a new face map to the active object";
+	ot->description = "Remove a face map from the active object";
 	
 	/* api callbacks */
 	ot->poll = face_map_supported_poll;




More information about the Bf-blender-cvs mailing list