diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 79a9a29ae8f..7dd17e59f6f 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -88,6 +88,7 @@ #include "object_intern.h" static void modifier_skin_customdata_ensure(struct Object *ob); +static void modifier_skin_customdata_delete(struct Object *ob); /******************************** API ****************************/ @@ -231,6 +232,21 @@ static int object_modifier_remove(Object *ob, ModifierData *md, int *sort_depsgr multires_customdata_delete(ob->data); } } + else if (md->type == eModifierType_Skin) { + int ok = 1; + ModifierData *tmpmd; + + /* ensure skin CustomData layer isn't used by another skin modifier */ + for (tmpmd = ob->modifiers.first; tmpmd; tmpmd = tmpmd->next) { + if (tmpmd != md && tmpmd->type == eModifierType_Skin) { + ok = 0; + break; + } + } + + if (ok) + modifier_skin_customdata_delete(ob); + } if (ELEM(md->type, eModifierType_Softbody, eModifierType_Cloth) && ob->particlesystem.first == NULL) @@ -1369,6 +1385,17 @@ static void modifier_skin_customdata_ensure(Object *ob) } } +static void modifier_skin_customdata_delete(Object *ob) +{ + Mesh *me = ob->data; + BMEditMesh *em = me->edit_btmesh; + + if (em) + BM_data_layer_free(em->bm, &em->bm->vdata, CD_MVERT_SKIN); + else + CustomData_free_layer_active(&me->vdata, CD_MVERT_SKIN, me->totvert); +} + static int skin_poll(bContext *C) { return (!CTX_data_edit_object(C) &&