diff options
author | Campbell Barton <ideasman42@gmail.com> | 2016-04-29 15:33:06 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2016-04-29 16:39:50 +0300 |
commit | 6d0cae56e84306ed64a51005c4fb1811a40822b7 (patch) | |
tree | de25f4c347865a2aefe7d33b8ab5920d35718254 /source/blender/editors/object/object_edit.c | |
parent | b5ce2bbef7a91f81c3556f2ddf6dd5f21161bc91 (diff) |
Fix T48290: Hook fails after deleting geometry
Now CD_SHAPEKEY_INDEX customdata is stored in edit-mode when hooks and vertex parents are used.
This also fixes a bug where undo would loose key-index data.
Move to structs for BM_mesh_bm_to/from_me to avoid passing many argument, which mostly aren't used.
Diffstat (limited to 'source/blender/editors/object/object_edit.c')
-rw-r--r-- | source/blender/editors/object/object_edit.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 56d27bfd727..06200778ee5 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -316,6 +316,27 @@ void OBJECT_OT_hide_render_set(wmOperatorType *ot) /* ******************* toggle editmode operator ***************** */ +static bool mesh_needs_keyindex(const Mesh *me) +{ + if (me->key) { + return false; /* will be added */ + } + + for (const Object *ob = G.main->object.first; ob; ob = ob->id.next) { + if ((ob->parent) && (ob->parent->data == me) && ELEM(ob->partype, PARVERT1, PARVERT3)) { + return true; + } + if (ob->data == me) { + for (const ModifierData *md = ob->modifiers.first; md; md = md->next) { + if (md->type == eModifierType_Hook) { + return true; + } + } + } + } + return false; +} + /** * Load EditMode data back into the object, * optionally freeing the editmode data. @@ -494,7 +515,9 @@ void ED_object_editmode_enter(bContext *C, int flag) ok = 1; scene->obedit = ob; /* context sees this */ - EDBM_mesh_make(scene->toolsettings, ob); + const bool use_key_index = mesh_needs_keyindex(ob->data); + + EDBM_mesh_make(scene->toolsettings, ob, use_key_index); em = BKE_editmesh_from_object(ob); if (LIKELY(em)) { |