diff options
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/include/ED_mesh.h | 1 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_tools.c | 7 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_undo.c | 1 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_utils.c | 8 | ||||
-rw-r--r-- | source/blender/editors/object/object_edit.c | 2 |
5 files changed, 16 insertions, 3 deletions
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 835e1b4e26f..4bf43a2034a 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -83,6 +83,7 @@ void EDBM_mesh_clear(struct BMEditMesh *em); void EDBM_selectmode_to_scene(struct bContext *C); void EDBM_mesh_make(struct Object *ob, const int select_mode, const bool add_key_index); void EDBM_mesh_free(struct BMEditMesh *em); +void EDBM_mesh_load_ex(struct Main *bmain, struct Object *ob, bool free_data); void EDBM_mesh_load(struct Main *bmain, struct Object *ob); /* flushes based on the current select mode. if in vertex select mode, diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 8df392fb04b..59090acf433 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -4197,7 +4197,12 @@ static bool mesh_separate_loose( BM_mesh_elem_hflag_disable_all(bm_old, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, false); if (clear_object_data) { - BM_mesh_bm_to_me(NULL, bm_old, me_old, (&(struct BMeshToMeshParams){0})); + BM_mesh_bm_to_me(NULL, + bm_old, + me_old, + (&(struct BMeshToMeshParams){ + .update_shapekey_indices = true, + })); } finally: diff --git a/source/blender/editors/mesh/editmesh_undo.c b/source/blender/editors/mesh/editmesh_undo.c index 44984251243..d07ba05de20 100644 --- a/source/blender/editors/mesh/editmesh_undo.c +++ b/source/blender/editors/mesh/editmesh_undo.c @@ -521,6 +521,7 @@ static void *undomesh_from_editmesh(UndoMesh *um, BMEditMesh *em, Key *key) (&(struct BMeshToMeshParams){ /* Undo code should not be manipulating 'G_MAIN->object' hooks/vertex-parent. */ .calc_object_remap = false, + .update_shapekey_indices = false, .cd_mask_extra = {.vmask = CD_MASK_SHAPE_KEYINDEX}, })); diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c index 522c2f32d27..42404554ed8 100644 --- a/source/blender/editors/mesh/editmesh_utils.c +++ b/source/blender/editors/mesh/editmesh_utils.c @@ -325,7 +325,7 @@ void EDBM_mesh_make(Object *ob, const int select_mode, const bool add_key_index) * \warning This can invalidate the #Mesh runtime cache of other objects (for linked duplicates). * Most callers should run #DEG_id_tag_update on \a ob->data, see: T46738, T46913 */ -void EDBM_mesh_load(Main *bmain, Object *ob) +void EDBM_mesh_load_ex(Main *bmain, Object *ob, bool free_data) { Mesh *me = ob->data; BMesh *bm = me->edit_mesh->bm; @@ -341,6 +341,7 @@ void EDBM_mesh_load(Main *bmain, Object *ob) me, (&(struct BMeshToMeshParams){ .calc_object_remap = true, + .update_shapekey_indices = !free_data, })); /* Free derived mesh. usually this would happen through depsgraph but there @@ -380,6 +381,11 @@ void EDBM_mesh_clear(BMEditMesh *em) } } +void EDBM_mesh_load(Main *bmain, Object *ob) +{ + EDBM_mesh_load_ex(bmain, ob, true); +} + /** * Should only be called on the active editmesh, otherwise call #BKE_editmesh_free */ diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index be815fb0d10..b7c9579e277 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -445,7 +445,7 @@ static bool ED_object_editmode_load_ex(Main *bmain, Object *obedit, const bool f return false; } - EDBM_mesh_load(bmain, obedit); + EDBM_mesh_load_ex(bmain, obedit, freedata); if (freedata) { EDBM_mesh_free(me->edit_mesh); |