[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