[Bf-blender-cvs] [8a410572c29] temp-object-multi-mode: Merge branch '28' into temp-object-multi-mode
Campbell Barton
noreply at git.blender.org
Sat Apr 7 11:53:54 CEST 2018
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. @@
More information about the Bf-blender-cvs
mailing list