Commit: 8a410572c295243649d66c8834b87d4e7d7b33ce Author: Campbell Barton Date: Sat Apr 7 10:57:26 2018 +0200 Branches: temp-object-multi-mode https://developer.blender.org/rB8a410572c295243649d66c8834b87d4e7d7b33ce
Merge branch '28' into temp-object-multi-mode =================================================================== =================================================================== diff --cc source/blender/blenkernel/BKE_object.h index 7596a33afa7,c5eefedcfad..63a89ffb34c --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@@ -83,11 -81,9 +81,11 @@@ void BKE_object_make_proxy(struct Objec void BKE_object_copy_proxy_drivers(struct Object *ob, struct Object *target); bool BKE_object_exists_check(struct Object *obtest); -bool BKE_object_is_in_editmode(struct Object *ob); +bool BKE_object_is_in_editmode(const struct Object *ob); bool BKE_object_is_in_editmode_vgroup(struct Object *ob); +bool BKE_object_is_in_editmode_and_selected(const struct Object *ob); - bool BKE_object_is_in_wpaint_select_vert(const struct Object *ob, eObjectMode object_mode); + bool BKE_object_is_in_wpaint_select_vert(const struct Object *ob); +bool BKE_object_has_mode_data(const struct Object *ob, eObjectMode object_mode); typedef enum eObjectVisibilityCheck { OB_VISIBILITY_CHECK_FOR_VIEWPORT, diff --cc source/blender/blenkernel/intern/object_update.c index 199e91a3dd9,de2002624c0..e6ec7e7cce3 --- a/source/blender/blenkernel/intern/object_update.c +++ b/source/blender/blenkernel/intern/object_update.c @@@ -172,15 -172,7 +172,15 @@@ void BKE_object_handle_data_update switch (ob->type) { case OB_MESH: { +#if 0 - BMEditMesh *em = (eval_ctx->object_mode & OB_MODE_EDIT) ? BKE_editmesh_from_object(ob) : NULL; + BMEditMesh *em = (ob->mode & OB_MODE_EDIT) ? BKE_editmesh_from_object(ob) : NULL; +#else - BMEditMesh *em = (eval_ctx->object_mode & OB_MODE_EDIT) ? ((Mesh *)ob->data)->edit_btmesh : NULL; ++ BMEditMesh *em = (ob->mode & OB_MODE_EDIT) ? ((Mesh *)ob->data)->edit_btmesh : NULL; + if (em && em->ob != ob) { + em = NULL; + } +#endif + uint64_t data_mask = scene->customdata_mask | CD_MASK_BAREMESH; #ifdef WITH_FREESTYLE /* make sure Freestyle edge/face marks appear in DM for render (see T40315) */ diff --cc source/blender/editors/include/ED_object.h index 48b029d106d,ebd9313f7c5..19189191b3b --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@@ -125,12 -124,9 +124,12 @@@ void ED_object_parent(struct Object *ob #define EM_WAITCURSOR 4 #define EM_DO_UNDO 8 #define EM_IGNORE_LAYER 16 +#define EM_NO_CONTEXT 32 void ED_object_editmode_exit_ex( - struct bContext *C, struct WorkSpace *workspace, struct Scene *scene, struct Object *obedit, int flag); + struct bContext *C, struct Scene *scene, struct Object *obedit, int flag); void ED_object_editmode_exit(struct bContext *C, int flag); + - void ED_object_editmode_enter_ex(struct WorkSpace *workspace, struct Scene *scene, struct Object *ob, int flag); ++void ED_object_editmode_enter_ex(struct Scene *scene, struct Object *ob, int flag); void ED_object_editmode_enter(struct bContext *C, int flag); bool ED_object_editmode_load(struct Object *obedit); diff --cc source/blender/editors/include/ED_uvedit.h index 0a6f9345078,2a5ad494643..2b619fa12e6 --- a/source/blender/editors/include/ED_uvedit.h +++ b/source/blender/editors/include/ED_uvedit.h @@@ -132,9 -129,9 +132,9 @@@ void ED_unwrap_lscm(struct Scene *scene /* uvedit_draw.c */ void ED_image_draw_cursor( -struct ARegion *ar, const float cursor[2]); + struct ARegion *ar, const float cursor[2]); void ED_uvedit_draw_main( - struct SpaceImage *sima, const struct EvaluationContext *eval_ctx, + struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene, struct ViewLayer *view_layer, struct Object *obedit, struct Object *obact, struct Depsgraph *depsgraph); diff --cc source/blender/editors/object/object_edit.c index 23cb7667847,9306213581e..19e9eb1d6f4 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@@ -275,9 -274,12 +275,9 @@@ bool ED_object_editmode_load(Object *ob * - Only in exceptional cases should #EM_DO_UNDO NOT be in the flag. * - If #EM_FREEDATA isn't in the flag, use ED_object_editmode_load directly. */ - void ED_object_editmode_exit_ex(bContext *C, WorkSpace *workspace, Scene *scene, Object *obedit, int flag) + void ED_object_editmode_exit_ex(bContext *C, Scene *scene, Object *obedit, int flag) { BLI_assert(C || !(flag & EM_DO_UNDO)); - /* Note! only in exceptional cases should 'EM_DO_UNDO' NOT be in the flag */ - /* Note! if 'EM_FREEDATA' isn't in the flag, use ED_object_editmode_load directly */ - ViewLayer *view_layer = CTX_data_view_layer(C); const bool freedata = (flag & EM_FREEDATA) != 0; if (flag & EM_WAITCURSOR) waitcursor(1); @@@ -285,7 -287,9 +285,9 @@@ if (ED_object_editmode_load_ex(G.main, obedit, freedata) == false) { /* in rare cases (background mode) its possible active object * is flagged for editmode, without 'obedit' being set [#35489] */ - workspace->object_mode &= ~OB_MODE_EDIT; - if (UNLIKELY(view_layer->basact && (view_layer->basact->object->mode & OB_MODE_EDIT))) { - view_layer->basact->object->mode &= ~OB_MODE_EDIT; ++ if (UNLIKELY(obedit && obedit->mode & OB_MODE_EDIT)) { ++ obedit->mode &= ~OB_MODE_EDIT; + } if (flag & EM_WAITCURSOR) waitcursor(0); return; } @@@ -313,36 -315,43 +313,33 @@@ if (flag & EM_DO_UNDO) ED_undo_push(C, "Editmode"); - WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene); + if (C != NULL) { + WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene); + } + else { + WM_main_add_notifier(NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene); + } - } + - ED_workspace_object_mode_sync_from_object(G.main->wm.first, workspace, obedit); - if (flag & EM_WAITCURSOR) waitcursor(0); + obedit->mode &= ~OB_MODE_EDIT; + } - /* This way we ensure scene's obedit is copied into all CoW scenes. */ - DEG_id_tag_update(&scene->id, 0); + if (flag & EM_WAITCURSOR) waitcursor(0); - - /* This way we ensure scene's obedit is copied into all CoW scenes. */ - DEG_id_tag_update(&scene->id, 0); } void ED_object_editmode_exit(bContext *C, int flag) { - WorkSpace *workspace = CTX_wm_workspace(C); Scene *scene = CTX_data_scene(C); Object *obedit = CTX_data_edit_object(C); - ED_object_editmode_exit_ex(C, workspace, scene, obedit, flag); + ED_object_editmode_exit_ex(C, scene, obedit, flag); } - void ED_object_editmode_enter_ex(WorkSpace *workspace, Scene *scene, Object *ob, int flag) -void ED_object_editmode_enter(bContext *C, int flag) ++void ED_object_editmode_enter_ex(Scene *scene, Object *ob, int flag) { - Scene *scene = CTX_data_scene(C); - ViewLayer *view_layer = CTX_data_view_layer(C); - Object *ob; bool ok = false; - if (ID_IS_LINKED(scene)) return; - - if ((flag & EM_IGNORE_LAYER) == 0) { - ob = CTX_data_active_object(C); /* active layer checked here for view3d */ - - if (ob == NULL) return; - } - else { - ob = view_layer->basact->object; - } - if (ELEM(NULL, ob, ob->data)) return; + if (ID_IS_LINKED(ob)) return; /* this checks actual object->data, for cases when other scenes have it in editmode context */ if (BKE_object_is_in_editmode(ob)) @@@ -355,6 -364,15 +352,10 @@@ if (flag & EM_WAITCURSOR) waitcursor(1); + ob->restore_mode = ob->mode; + - /* note, when switching scenes the object can have editmode data but - * not be scene->obedit: bug 22954, this avoids calling self eternally */ - if ((ob->restore_mode & OB_MODE_EDIT) == 0) - ED_object_mode_toggle(C, ob->mode); - + ob->mode = OB_MODE_EDIT; + if (ob->type == OB_MESH) { BMEditMesh *em; ok = 1; @@@ -420,38 -438,16 +421,35 @@@ if (ok) { DEG_id_tag_update(&ob->id, OB_RECALC_DATA); - /* This way we ensure scene's obedit is copied into all CoW scenes. */ - DEG_id_tag_update(&scene->id, 0); } else { - ob->mode &= ~OB_MODE_EDIT; - WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene); + if ((flag & EM_NO_CONTEXT) == 0) { - workspace->object_mode &= ~OB_MODE_EDIT; ++ ob->mode &= ~OB_MODE_EDIT; + } + WM_main_add_notifier(NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene); } - ED_workspace_object_mode_sync_from_object(G.main->wm.first, workspace, ob); - - if (flag & EM_DO_UNDO) ED_undo_push(C, "Enter Editmode"); if (flag & EM_WAITCURSOR) waitcursor(0); + BLI_assert((flag & EM_DO_UNDO) == 0); +} + +void ED_object_editmode_enter(bContext *C, int flag) +{ - WorkSpace *workspace = CTX_wm_workspace(C); + Scene *scene = CTX_data_scene(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + Object *ob; + + if ((flag & EM_IGNORE_LAYER) == 0) { + ob = CTX_data_active_object(C); /* active layer checked here for view3d */ + } + else { + ob = view_layer->basact->object; + } + if (ob == NULL) return; + if (ID_IS_LINKED(ob)) return; + - ED_object_editmode_enter_ex(workspace, scene, ob, flag & ~EM_DO_UNDO); ++ ED_object_editmode_enter_ex(scene, ob, flag & ~EM_DO_UNDO); + if (flag & EM_DO_UNDO) ED_undo_push(C, "Enter Editmode"); } static int editmode_toggle_exec(bContext *C, wmOperator *op) @@@ -459,43 -455,18 +457,32 @@@ const int mode_flag = OB_MODE_EDIT; const bool is_mode_set = (CTX_data_edit_object(C) != NULL); Scene *scene = CTX_data_scene(C); ++ ViewLayer *view_layer = CTX_data_view_layer(C); ++ Object *obact = OBACT(view_layer); if (!is_mode_set) { - if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) { - Object *ob = CTX_data_active_object(C); - if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) { ++ if (!ED_object_mode_compat_set(C, obact, mode_flag, op->reports)) { return OPERATOR_CANCELLED; } } - if (!is_mode_set) + if (!is_mode_set) { - Object *obact = view_layer->basact->object; - - workspace->object_mode_restore = workspace->object_mode; - - /* note, when switching scenes the object can have editmode data but - * not be scene->obedit: bug 22954, this avoids calling self eternally */ - if ((workspace->object_mode_restore & OB_MODE_EDIT) == 0) { - ED_object_mode_toggle(C, workspace->object_mode); - } - workspace->object_mode = OB_MODE_EDIT; - ED_object_editmode_enter(C, EM_WAITCURSOR); - if (works @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs