Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-02-08 13:14:26 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-02-08 13:14:26 +0300
commit345c6298e995ea618c34282ba6d7ab5af032f191 (patch)
treef4fbc4798e17d0f19efc28b51a41425d0c552be8 /source/blender/editors
parent14a19fed788af0cf3695eb5def92510841056e08 (diff)
Object Mode: move to workspace struct
- Read-only access can often use EvaluationContext.object_mode - Write access to go to WorkSpace.object_mode. - Some TODO's remain (marked as "TODO/OBMODE") - Add-ons will need updating (context.active_object.mode -> context.workspace.object_mode) - There will be small/medium issues that still need resolving this does work on a basic level though. See D3037
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/armature/armature_relations.c5
-rw-r--r--source/blender/editors/armature/pose_edit.c12
-rw-r--r--source/blender/editors/include/ED_image.h6
-rw-r--r--source/blender/editors/include/ED_info.h5
-rw-r--r--source/blender/editors/include/ED_object.h17
-rw-r--r--source/blender/editors/include/ED_screen.h3
-rw-r--r--source/blender/editors/interface/interface_handlers.c10
-rw-r--r--source/blender/editors/object/object_add.c12
-rw-r--r--source/blender/editors/object/object_bake.c25
-rw-r--r--source/blender/editors/object/object_bake_api.c2
-rw-r--r--source/blender/editors/object/object_edit.c84
-rw-r--r--source/blender/editors/object/object_modifier.c41
-rw-r--r--source/blender/editors/object/object_relations.c14
-rw-r--r--source/blender/editors/object/object_select.c29
-rw-r--r--source/blender/editors/physics/particle_edit.c14
-rw-r--r--source/blender/editors/physics/particle_object.c8
-rw-r--r--source/blender/editors/render/render_update.c20
-rw-r--r--source/blender/editors/screen/screen_edit.c12
-rw-r--r--source/blender/editors/screen/screen_ops.c3
-rw-r--r--source/blender/editors/screen/workspace_edit.c40
-rw-r--r--source/blender/editors/sculpt_paint/paint_hide.c2
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c11
-rw-r--r--source/blender/editors/sculpt_paint/paint_utils.c3
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c20
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c14
-rw-r--r--source/blender/editors/space_image/image_edit.c9
-rw-r--r--source/blender/editors/space_image/image_ops.c3
-rw-r--r--source/blender/editors/space_image/space_image.c2
-rw-r--r--source/blender/editors/space_info/info_stats.c9
-rw-r--r--source/blender/editors/space_time/space_time.c3
-rw-r--r--source/blender/editors/util/ed_util.c34
31 files changed, 264 insertions, 208 deletions
diff --git a/source/blender/editors/armature/armature_relations.c b/source/blender/editors/armature/armature_relations.c
index de2611f7092..8fc7aeaf029 100644
--- a/source/blender/editors/armature/armature_relations.c
+++ b/source/blender/editors/armature/armature_relations.c
@@ -281,7 +281,6 @@ int join_armature_exec(bContext *C, wmOperator *op)
/* get pose of active object and move it out of posemode */
pose = ob->pose;
- ob->mode &= ~OB_MODE_POSE;
CTX_DATA_BEGIN(C, Base *, base, selected_editable_bases)
{
@@ -302,8 +301,6 @@ int join_armature_exec(bContext *C, wmOperator *op)
/* Get Pose of current armature */
opose = base->object->pose;
- base->object->mode &= ~OB_MODE_POSE;
- //BASACT->flag &= ~OB_MODE_POSE;
/* Find the difference matrix */
invert_m4_m4(oimat, ob->obmat);
@@ -608,8 +605,6 @@ static int separate_armature_exec(bContext *C, wmOperator *op)
/* 1) store starting settings and exit editmode */
oldob = obedit;
oldbase = view_layer->basact;
- oldob->mode &= ~OB_MODE_POSE;
- //oldbase->flag &= ~OB_POSEMODE;
ED_armature_from_edit(obedit->data);
ED_armature_edit_free(obedit->data);
diff --git a/source/blender/editors/armature/pose_edit.c b/source/blender/editors/armature/pose_edit.c
index 74e29b2e8da..119a27cd4a7 100644
--- a/source/blender/editors/armature/pose_edit.c
+++ b/source/blender/editors/armature/pose_edit.c
@@ -94,13 +94,16 @@ void ED_armature_enter_posemode(bContext *C, Base *base)
switch (ob->type) {
case OB_ARMATURE:
- ob->restore_mode = ob->mode;
- ob->mode |= OB_MODE_POSE;
+ {
+ WorkSpace *workspace = CTX_wm_workspace(C);
+ workspace->object_mode_restore = workspace->object_mode;
+ workspace->object_mode |= OB_MODE_POSE;
/* Inform all CoW versions that we changed the mode. */
DEG_id_tag_update_ex(CTX_data_main(C), &ob->id, DEG_TAG_COPY_ON_WRITE);
WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_POSE, NULL);
break;
+ }
default:
return;
}
@@ -112,10 +115,11 @@ void ED_armature_enter_posemode(bContext *C, Base *base)
void ED_armature_exit_posemode(bContext *C, Base *base)
{
if (base) {
+ WorkSpace *workspace = CTX_wm_workspace(C);
Object *ob = base->object;
- ob->restore_mode = ob->mode;
- ob->mode &= ~OB_MODE_POSE;
+ workspace->object_mode_restore = workspace->object_mode;
+ workspace->object_mode &= ~OB_MODE_POSE;
/* Inform all CoW versions that we changed the mode. */
DEG_id_tag_update_ex(CTX_data_main(C), &ob->id, DEG_TAG_COPY_ON_WRITE);
diff --git a/source/blender/editors/include/ED_image.h b/source/blender/editors/include/ED_image.h
index cb824b3c9b7..9802f8c3c03 100644
--- a/source/blender/editors/include/ED_image.h
+++ b/source/blender/editors/include/ED_image.h
@@ -40,6 +40,7 @@ struct wmWindowManager;
struct ARegion;
struct Scene;
struct ViewLayer;
+struct WorkSpace;
/* image_edit.c, exported for transform */
struct Image *ED_space_image(struct SpaceImage *sima);
@@ -75,7 +76,10 @@ bool ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit);
bool ED_space_image_paint_curve(const struct bContext *C);
-bool ED_space_image_check_show_maskedit(struct SpaceImage *sima, struct ViewLayer *view_layer);
+bool ED_space_image_check_show_maskedit(
+ struct SpaceImage *sima,
+ const struct WorkSpace *workspace,
+ struct ViewLayer *view_layer);
int ED_space_image_maskedit_poll(struct bContext *C);
int ED_space_image_maskedit_mask_poll(struct bContext *C);
diff --git a/source/blender/editors/include/ED_info.h b/source/blender/editors/include/ED_info.h
index 072b1a135a3..3d873906ecf 100644
--- a/source/blender/editors/include/ED_info.h
+++ b/source/blender/editors/include/ED_info.h
@@ -27,8 +27,11 @@
#ifndef __ED_INFO_H__
#define __ED_INFO_H__
+struct EvaluationContext;
+
/* info_stats.c */
void ED_info_stats_clear(struct ViewLayer *view_layer);
-const char *ED_info_stats_string(struct Scene *scene, struct ViewLayer *view_layer);
+const char *ED_info_stats_string(
+ struct Scene *scene, struct WorkSpace *workspace, struct ViewLayer *view_layer);
#endif /* __ED_INFO_H__ */
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 5c04614f4f1..94ee228f4f8 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -56,6 +56,7 @@ struct PointerRNA;
struct PropertyRNA;
struct EnumPropertyItem;
struct EvaluationContext;
+struct WorkSpace;
#include "DNA_object_enums.h"
@@ -116,7 +117,7 @@ struct Base *ED_object_add_duplicate(struct Main *bmain, struct Scene *scene, st
void ED_object_parent(struct Object *ob, struct Object *parent, const int type, const char *substr);
-bool ED_object_mode_compat_set(struct bContext *C, struct Object *ob, eObjectMode mode, struct ReportList *reports);
+bool ED_object_mode_compat_set(struct bContext *C, struct WorkSpace *workspace, eObjectMode mode, struct ReportList *reports);
void ED_object_toggle_modes(struct bContext *C, eObjectMode mode);
/* bitflags for enter/exit editmode */
@@ -190,15 +191,17 @@ enum {
MODIFIER_APPLY_SHAPE
};
-struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene,
- struct Object *ob, const char *name, int type);
+struct ModifierData *ED_object_modifier_add(
+ struct ReportList *reports, struct Main *bmain, struct Scene *scene,
+ struct Object *ob, eObjectMode object_mode, const char *name, int type);
bool ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain,
struct Object *ob, struct ModifierData *md);
void ED_object_modifier_clear(struct Main *bmain, struct Object *ob);
int ED_object_modifier_move_down(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
int ED_object_modifier_move_up(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
-int ED_object_modifier_convert(struct ReportList *reports, struct Main *bmain, struct Scene *scene,
- struct ViewLayer *view_layer, struct Object *ob, struct ModifierData *md);
+int ED_object_modifier_convert(
+ struct ReportList *reports, struct Main *bmain, struct Scene *scene,
+ struct ViewLayer *view_layer, struct Object *ob, eObjectMode object_mode, struct ModifierData *md);
int ED_object_modifier_apply(struct ReportList *reports, const struct bContext *C, struct Scene *scene,
struct Object *ob, struct ModifierData *md, int mode);
int ED_object_modifier_copy(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
@@ -223,7 +226,9 @@ const struct EnumPropertyItem *ED_object_vgroup_selection_itemf_helper(
bool *r_free,
const unsigned int selection_mask);
-void ED_object_check_force_modifiers(struct Main *bmain, struct Scene *scene, struct Object *object);
+void ED_object_check_force_modifiers(
+ struct Main *bmain, struct Scene *scene,
+ struct Object *object, eObjectMode object_mode);
/* object_facemap_ops.c */
void ED_object_facemap_face_add(struct Object *ob, struct bFaceMap *fmap, int facenum);
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 942292788fc..18480d01ed7 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -147,6 +147,7 @@ struct ScrArea *ED_screen_state_toggle(struct bContext *C, struct wmWindow *win,
void ED_screens_header_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg);
bool ED_screen_stereo3d_required(const struct bScreen *screen, const struct Scene *scene);
Scene *ED_screen_scene_find(const struct bScreen *screen, const struct wmWindowManager *wm);
+Scene *ED_screen_scene_find_with_window(const struct bScreen *screen, const struct wmWindowManager *wm, struct wmWindow **r_window);
void ED_screen_preview_render(const struct bScreen *screen, int size_x, int size_y, unsigned int *r_rect) ATTR_NONNULL();
/* workspaces */
@@ -159,7 +160,7 @@ struct WorkSpace *ED_workspace_add(
bool ED_workspace_change(
struct WorkSpace *workspace_new,
struct bContext *C,
- struct wmWindowManager *wm, struct wmWindow *win) ATTR_NONNULL();
+ struct wmWindow *win) ATTR_NONNULL();
struct WorkSpace *ED_workspace_duplicate(
struct WorkSpace *workspace_old,
struct Main *bmain, struct wmWindow *win);
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 34a347979a8..3a01ff16297 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -46,6 +46,7 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "DNA_workspace_types.h"
#include "BLI_math.h"
#include "BLI_listbase.h"
@@ -5232,12 +5233,11 @@ static int ui_do_but_COLOR(
if (event->type == LEFTMOUSE && event->val == KM_RELEASE) {
if ((int)(but->a1) == UI_PALETTE_COLOR) {
if (!event->ctrl) {
- EvaluationContext eval_ctx;
- CTX_data_eval_ctx(C, &eval_ctx);
float color[3];
+ const WorkSpace *workspace = CTX_wm_workspace(C);
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
- Paint *paint = BKE_paint_get_active(scene, view_layer, eval_ctx.object_mode);
+ Paint *paint = BKE_paint_get_active(scene, view_layer, workspace->object_mode);
Brush *brush = BKE_paint_brush(paint);
if (brush->flag & BRUSH_USE_GRADIENT) {
@@ -6153,6 +6153,7 @@ static int ui_do_but_CURVE(
{
int mx, my, a;
bool changed = false;
+
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
@@ -6269,6 +6270,7 @@ static int ui_do_but_CURVE(
}
else if (event->type == LEFTMOUSE && event->val != KM_PRESS) {
if (data->dragsel != -1) {
+ const WorkSpace *workspace = CTX_wm_workspace(C);
CurveMapping *cumap = (CurveMapping *)but->poin;
CurveMap *cuma = cumap->cm + cumap->cur;
CurveMapPoint *cmp = cuma->curve;
@@ -6283,7 +6285,7 @@ static int ui_do_but_CURVE(
}
else {
curvemapping_changed(cumap, true); /* remove doubles */
- BKE_paint_invalidate_cursor_overlay(scene, view_layer, cumap);
+ BKE_paint_invalidate_cursor_overlay(scene, view_layer, cumap, workspace->object_mode);
}
}
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 56279522c88..18c18f10c13 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -2081,7 +2081,9 @@ void OBJECT_OT_convert(wmOperatorType *ot)
/* used below, assumes id.new is correct */
/* leaves selection of base/object unaltered */
/* Does set ID->newid pointers. */
-static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, ViewLayer *view_layer, Object *ob, int dupflag)
+static Base *object_add_duplicate_internal(
+ Main *bmain, Scene *scene,
+ ViewLayer *view_layer, Object *ob, int dupflag)
{
#define ID_NEW_REMAP_US(a) if ( (a)->id.newid) { (a) = (void *)(a)->id.newid; (a)->id.us++; }
#define ID_NEW_REMAP_US2(a) if (((ID *)a)->newid) { (a) = ((ID *)a)->newid; ((ID *)a)->us++; }
@@ -2092,10 +2094,14 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, ViewLayer
ID *id;
int a, didit;
- if (ob->mode & OB_MODE_POSE) {
+ /* ignore pose mode now, Caller can inspect mode. */
+#if 0
+ if (eval_ctx->object_mode & OB_MODE_POSE) {
; /* nothing? */
}
- else {
+ else
+#endif
+ {
obn = ID_NEW_SET(ob, BKE_object_copy(bmain, ob));
DEG_id_tag_update(&obn->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c
index 3efb6253f6f..cf00e657fbf 100644
--- a/source/blender/editors/object/object_bake.c
+++ b/source/blender/editors/object/object_bake.c
@@ -206,7 +206,8 @@ static bool multiresbake_check(bContext *C, wmOperator *op)
return ok;
}
-static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *lvl)
+static DerivedMesh *multiresbake_create_loresdm(
+ Scene *scene, Object *ob, eObjectMode object_mode, int *lvl)
{
DerivedMesh *dm;
MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
@@ -226,13 +227,15 @@ static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *l
tmp_mmd.lvl = *lvl;
tmp_mmd.sculptlvl = *lvl;
- dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0);
+ dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0, object_mode);
cddm->release(cddm);
return dm;
}
-static DerivedMesh *multiresbake_create_hiresdm(Scene *scene, Object *ob, int *lvl, bool *simple)
+static DerivedMesh *multiresbake_create_hiresdm(
+ Scene *scene, Object *ob, eObjectMode object_mode,
+ int *lvl, bool *simple)
{
Mesh *me = (Mesh *)ob->data;
MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
@@ -253,7 +256,7 @@ static DerivedMesh *multiresbake_create_hiresdm(Scene *scene, Object *ob, int *l
tmp_mmd.lvl = mmd->totlvl;
tmp_mmd.sculptlvl = mmd->totlvl;
- dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0);
+ dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0, object_mode);
cddm->release(cddm);
return dm;
@@ -323,6 +326,9 @@ static int multiresbake_image_exec_locked(bContext *C, wmOperator *op)
if (!multiresbake_check(C, op))
return OPERATOR_CANCELLED;
+ EvaluationContext eval_ctx;
+ CTX_data_eval_ctx(C, &eval_ctx);
+
if (scene->r.bake_flag & R_BAKE_CLEAR) { /* clear images */
CTX_DATA_BEGIN (C, Base *, base, selected_editable_bases)
{
@@ -371,8 +377,8 @@ static int multiresbake_image_exec_locked(bContext *C, wmOperator *op)
bkr.ob_image.array = BKE_object_material_edit_image_get_array(ob);
bkr.ob_image.len = ob->totcol;
- bkr.hires_dm = multiresbake_create_hiresdm(scene, ob, &bkr.tot_lvl, &bkr.simple);
- bkr.lores_dm = multiresbake_create_loresdm(scene, ob, &bkr.lvl);
+ bkr.hires_dm = multiresbake_create_hiresdm(scene, ob, eval_ctx.object_mode, &bkr.tot_lvl, &bkr.simple);
+ bkr.lores_dm = multiresbake_create_loresdm(scene, ob, eval_ctx.object_mode, &bkr.lvl);
RE_multires_bake_images(&bkr);
@@ -399,6 +405,9 @@ static void init_multiresbake_job(bContext *C, MultiresBakeJob *bkj)
Scene *scene = CTX_data_scene(C);
Object *ob;
+ EvaluationContext eval_ctx;
+ CTX_data_eval_ctx(C, &eval_ctx);
+
/* backup scene settings, so their changing in UI would take no effect on baker */
bkj->bake_filter = scene->r.bake_filter;
bkj->mode = scene->r.bake_mode;
@@ -427,8 +436,8 @@ static void init_multiresbake_job(bContext *C, MultiresBakeJob *bkj)
data->ob_image.len = ob->totcol;
/* create low-resolution DM (to bake to) and hi-resolution DM (to bake from) */
- data->hires_dm = multiresbake_create_hiresdm(scene, ob, &data->tot_lvl, &data->simple);
- data->lores_dm = multiresbake_create_loresdm(scene, ob, &lvl);
+ data->hires_dm = multiresbake_create_hiresdm(scene, ob, eval_ctx.object_mode, &data->tot_lvl, &data->simple);
+ data->lores_dm = multiresbake_create_loresdm(scene, ob, eval_ctx.object_mode, &lvl);
data->lvl = lvl;
BLI_addtail(&bkj->data, data);
diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c
index 37d6efa7746..50922be76eb 100644
--- a/source/blender/editors/object/object_bake_api.c
+++ b/source/blender/editors/object/object_bake_api.c
@@ -853,7 +853,7 @@ static int bake(
/* triangulating so BVH returns the primitive_id that will be used for rendering */
highpoly[i].tri_mod = ED_object_modifier_add(
- reports, bmain, scene, highpoly[i].ob,
+ reports, bmain, scene, highpoly[i].ob, OB_MODE_OBJECT,
"TmpTriangulate", eModifierType_Triangulate);
tmd = (TriangulateModifierData *)highpoly[i].tri_mod;
tmd->quad_method = MOD_TRIANGULATE_QUAD_FIXED;
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 72378cfba05..b9956876cb3 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -263,8 +263,8 @@ void ED_object_editmode_exit(bContext *C, int flag)
{
/* 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 */
+ WorkSpace *workspace = CTX_wm_workspace(C);
Scene *scene = CTX_data_scene(C);
- ViewLayer *view_layer = CTX_data_view_layer(C);
Object *obedit = CTX_data_edit_object(C);
const bool freedata = (flag & EM_FREEDATA) != 0;
@@ -273,9 +273,7 @@ void ED_object_editmode_exit(bContext *C, int flag)
if (ED_object_editmode_load_ex(CTX_data_main(C), obedit, freedata) == false) {
/* in rare cases (background mode) its possible active object
* is flagged for editmode, without 'obedit' being set [#35489] */
- if (UNLIKELY(view_layer->basact && (view_layer->basact->object->mode & OB_MODE_EDIT))) {
- view_layer->basact->object->mode &= ~OB_MODE_EDIT;
- }
+ workspace->object_mode &= ~OB_MODE_EDIT;
if (flag & EM_WAITCURSOR) waitcursor(0);
return;
}
@@ -306,7 +304,7 @@ void ED_object_editmode_exit(bContext *C, int flag)
WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene);
- obedit->mode &= ~OB_MODE_EDIT;
+ workspace->object_mode &= ~OB_MODE_EDIT;
}
if (flag & EM_WAITCURSOR) waitcursor(0);
@@ -318,6 +316,7 @@ void ED_object_editmode_exit(bContext *C, int flag)
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;
@@ -347,14 +346,14 @@ void ED_object_editmode_enter(bContext *C, int flag)
if (flag & EM_WAITCURSOR) waitcursor(1);
- ob->restore_mode = ob->mode;
+ 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 ((ob->restore_mode & OB_MODE_EDIT) == 0)
- ED_object_toggle_modes(C, ob->mode);
+ if ((workspace->object_mode_restore & OB_MODE_EDIT) == 0)
+ ED_object_toggle_modes(C, workspace->object_mode);
- ob->mode = OB_MODE_EDIT;
+ workspace->object_mode = OB_MODE_EDIT;
if (ob->type == OB_MESH) {
BMEditMesh *em;
@@ -433,7 +432,7 @@ void ED_object_editmode_enter(bContext *C, int flag)
}
else {
scene->obedit = NULL; /* XXX for context */
- ob->mode &= ~OB_MODE_EDIT;
+ workspace->object_mode &= ~OB_MODE_EDIT;
WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene);
}
@@ -443,13 +442,13 @@ void ED_object_editmode_enter(bContext *C, int flag)
static int editmode_toggle_exec(bContext *C, wmOperator *op)
{
+ WorkSpace *workspace = CTX_wm_workspace(C);
const int mode_flag = OB_MODE_EDIT;
const bool is_mode_set = (CTX_data_edit_object(C) != NULL);
Scene *scene = CTX_data_scene(C);
if (!is_mode_set) {
- 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, workspace, mode_flag, op->reports)) {
return OPERATOR_CANCELLED;
}
}
@@ -503,13 +502,14 @@ void OBJECT_OT_editmode_toggle(wmOperatorType *ot)
static int posemode_exec(bContext *C, wmOperator *op)
{
+ WorkSpace *workspace = CTX_wm_workspace(C);
Base *base = CTX_data_active_base(C);
Object *ob = base->object;
const int mode_flag = OB_MODE_POSE;
- const bool is_mode_set = (ob->mode & mode_flag) != 0;
-
+ const bool is_mode_set = (workspace->object_mode & mode_flag) != 0;
+
if (!is_mode_set) {
- if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
+ if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) {
return OPERATOR_CANCELLED;
}
}
@@ -1002,7 +1002,7 @@ static void UNUSED_FUNCTION(copy_attr_menu) (Main *bmain, Scene *scene, ViewLaye
/* ******************* force field toggle operator ***************** */
-void ED_object_check_force_modifiers(Main *bmain, Scene *scene, Object *object)
+void ED_object_check_force_modifiers(Main *bmain, Scene *scene, Object *object, eObjectMode object_mode)
{
PartDeflect *pd = object->pd;
ModifierData *md = modifiers_findByType(object, eModifierType_Surface);
@@ -1011,7 +1011,7 @@ void ED_object_check_force_modifiers(Main *bmain, Scene *scene, Object *object)
if (!md) {
if (pd && (pd->shape == PFIELD_SHAPE_SURFACE) && !ELEM(pd->forcefield, 0, PFIELD_GUIDE, PFIELD_TEXTURE)) {
if (ELEM(object->type, OB_MESH, OB_SURF, OB_FONT, OB_CURVE)) {
- ED_object_modifier_add(NULL, bmain, scene, object, NULL, eModifierType_Surface);
+ ED_object_modifier_add(NULL, bmain, scene, object, object_mode, NULL, eModifierType_Surface);
}
}
}
@@ -1024,6 +1024,8 @@ void ED_object_check_force_modifiers(Main *bmain, Scene *scene, Object *object)
static int forcefield_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
+ EvaluationContext eval_ctx;
+ CTX_data_eval_ctx(C, &eval_ctx);
Object *ob = CTX_data_active_object(C);
if (ob->pd == NULL)
@@ -1033,7 +1035,7 @@ static int forcefield_toggle_exec(bContext *C, wmOperator *UNUSED(op))
else
ob->pd->forcefield = 0;
- ED_object_check_force_modifiers(CTX_data_main(C), CTX_data_scene(C), ob);
+ ED_object_check_force_modifiers(CTX_data_main(C), CTX_data_scene(C), ob, eval_ctx.object_mode);
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
@@ -1545,18 +1547,14 @@ static bool object_mode_compat_test(Object *ob, eObjectMode mode)
*
* This is so each mode's exec function can call
*/
-bool ED_object_mode_compat_set(bContext *C, Object *ob, eObjectMode mode, ReportList *reports)
+bool ED_object_mode_compat_set(bContext *C, WorkSpace *workspace, eObjectMode mode, ReportList *reports)
{
bool ok;
- if (!ELEM(ob->mode, mode, OB_MODE_OBJECT)) {
- const char *opstring = object_mode_op_string(ob->mode);
+ if (!ELEM(workspace->object_mode, mode, OB_MODE_OBJECT)) {
+ const char *opstring = object_mode_op_string(workspace->object_mode);
WM_operator_name_call(C, opstring, WM_OP_EXEC_REGION_WIN, NULL);
-#ifdef USE_WORKSPACE_MODE
- BKE_workspace_object_mode_set(CTX_wm_workspace(C), CTX_data_scene(C), ob->mode);
-#endif
-
- ok = ELEM(ob->mode, mode, OB_MODE_OBJECT);
+ ok = ELEM(workspace->object_mode, mode, OB_MODE_OBJECT);
if (!ok) {
wmOperatorType *ot = WM_operatortype_find(opstring, false);
BKE_reportf(reports, RPT_ERROR, "Unable to execute '%s', error changing modes", ot->name);
@@ -1584,10 +1582,11 @@ static int object_mode_set_poll(bContext *C)
static int object_mode_set_exec(bContext *C, wmOperator *op)
{
+ WorkSpace *workspace = CTX_wm_workspace(C);
Object *ob = CTX_data_active_object(C);
bGPdata *gpd = CTX_data_gpencil_data(C);
eObjectMode mode = RNA_enum_get(op->ptr, "mode");
- eObjectMode restore_mode = (ob) ? ob->mode : OB_MODE_OBJECT;
+ eObjectMode restore_mode = workspace->object_mode;
const bool toggle = RNA_boolean_get(op->ptr, "toggle");
if (gpd) {
@@ -1611,28 +1610,31 @@ static int object_mode_set_exec(bContext *C, wmOperator *op)
if (!ob || !object_mode_compat_test(ob, mode))
return OPERATOR_PASS_THROUGH;
- if (ob->mode != mode) {
+ if (workspace->object_mode != mode) {
/* we should be able to remove this call, each operator calls */
- ED_object_mode_compat_set(C, ob, mode, op->reports);
+ ED_object_mode_compat_set(C, workspace, mode, op->reports);
}
/* Exit current mode if it's not the mode we're setting */
- if (mode != OB_MODE_OBJECT && (ob->mode != mode || toggle)) {
+ if (mode != OB_MODE_OBJECT && (workspace->object_mode != mode || toggle)) {
/* Enter new mode */
ED_object_toggle_modes(C, mode);
}
if (toggle) {
/* Special case for Object mode! */
- if (mode == OB_MODE_OBJECT && restore_mode == OB_MODE_OBJECT && ob->restore_mode != OB_MODE_OBJECT) {
- ED_object_toggle_modes(C, ob->restore_mode);
+ if ((mode == OB_MODE_OBJECT) &&
+ (restore_mode == OB_MODE_OBJECT) &&
+ (workspace->object_mode_restore != OB_MODE_OBJECT))
+ {
+ ED_object_toggle_modes(C, workspace->object_mode_restore);
}
- else if (ob->mode == mode) {
+ else if (workspace->object_mode == mode) {
/* For toggling, store old mode so we know what to go back to */
- ob->restore_mode = restore_mode;
+ workspace->object_mode_restore = restore_mode;
}
- else if (ob->restore_mode != OB_MODE_OBJECT && ob->restore_mode != mode) {
- ED_object_toggle_modes(C, ob->restore_mode);
+ else if (!ELEM(workspace->object_mode_restore, mode, OB_MODE_OBJECT)) {
+ ED_object_toggle_modes(C, workspace->object_mode_restore);
}
}
@@ -1670,17 +1672,7 @@ void ED_object_toggle_modes(bContext *C, eObjectMode mode)
const char *opstring = object_mode_op_string(mode);
if (opstring) {
-#ifdef USE_WORKSPACE_MODE
- WorkSpace *workspace = CTX_wm_workspace(C);
-#endif
WM_operator_name_call(C, opstring, WM_OP_EXEC_REGION_WIN, NULL);
-
-#ifdef USE_WORKSPACE_MODE
- Object *ob = CTX_data_active_object(C);
- if (ob) {
- BKE_workspace_object_mode_set(workspace, CTX_data_scene(C), ob->mode);
- }
-#endif
}
}
}
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index f3934fde356..6411676420a 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -95,7 +95,10 @@ static void modifier_skin_customdata_delete(struct Object *ob);
/******************************** API ****************************/
-ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type)
+ModifierData *ED_object_modifier_add(
+ ReportList *reports,
+ Main *bmain, Scene *scene,
+ Object *ob, eObjectMode object_mode, const char *name, int type)
{
ModifierData *md = NULL, *new_md = NULL;
const ModifierTypeInfo *mti = modifierType_getInfo(type);
@@ -162,7 +165,7 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *sc
/* set totlvl from existing MDISPS layer if object already had it */
multiresModifier_set_levels_from_disps((MultiresModifierData *)new_md, ob);
- if (ob->mode & OB_MODE_SCULPT) {
+ if (object_mode & OB_MODE_SCULPT) {
/* ensure that grid paint mask layer is created */
BKE_sculpt_mask_layers_ensure(ob, (MultiresModifierData *)new_md);
}
@@ -252,7 +255,7 @@ static bool object_has_modifier_cb(
* for any multires modifiers on the object to the int pointed to by
* callback_data. */
bool ED_object_multires_update_totlevels_cb(
- const struct EvaluationContext *UNUSED(eval_ctx),
+ const struct EvaluationContext *eval_ctx,
Object *ob, void *totlevel_v)
{
ModifierData *md;
@@ -260,7 +263,7 @@ bool ED_object_multires_update_totlevels_cb(
for (md = ob->modifiers.first; md; md = md->next) {
if (md->type == eModifierType_Multires) {
- multires_set_tot_level(ob, (MultiresModifierData *)md, totlevel);
+ multires_set_tot_level((MultiresModifierData *)md, totlevel, eval_ctx->object_mode);
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
@@ -322,11 +325,13 @@ static bool object_modifier_remove(Main *bmain, Object *ob, ModifierData *md,
modifier_skin_customdata_delete(ob);
}
+#if 0 /* not needed now modes are in workspace */
if (ELEM(md->type, eModifierType_Softbody, eModifierType_Cloth) &&
BLI_listbase_is_empty(&ob->particlesystem))
{
ob->mode &= ~OB_MODE_PARTICLE_EDIT;
}
+#endif
DEG_relations_tag_update(bmain);
@@ -419,7 +424,9 @@ int ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData *
return 1;
}
-int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene *scene, ViewLayer *view_layer, Object *ob, ModifierData *md)
+int ED_object_modifier_convert(
+ ReportList *UNUSED(reports), Main *bmain, Scene *scene,
+ ViewLayer *view_layer, Object *UNUSED(ob), eObjectMode object_mode, ModifierData *md)
{
Object *obn;
ParticleSystem *psys;
@@ -433,7 +440,7 @@ int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene *
int totpart = 0, totchild = 0;
if (md->type != eModifierType_ParticleSystem) return 0;
- if (ob && ob->mode & OB_MODE_PARTICLE_EDIT) return 0;
+ if (object_mode & OB_MODE_PARTICLE_EDIT) return 0;
psys = ((ParticleSystemModifierData *)md)->psys;
part = psys->part;
@@ -747,12 +754,14 @@ int ED_object_modifier_copy(ReportList *UNUSED(reports), Object *ob, ModifierDat
static int modifier_add_exec(bContext *C, wmOperator *op)
{
+ EvaluationContext eval_ctx;
+ CTX_data_eval_ctx(C, &eval_ctx);
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
Object *ob = ED_object_active_context(C);
int type = RNA_enum_get(op->ptr, "type");
- if (!ED_object_modifier_add(op->reports, bmain, scene, ob, NULL, type))
+ if (!ED_object_modifier_add(op->reports, bmain, scene, ob, eval_ctx.object_mode, NULL, type))
return OPERATOR_CANCELLED;
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
@@ -1068,14 +1077,17 @@ void OBJECT_OT_modifier_apply(wmOperatorType *ot)
static int modifier_convert_exec(bContext *C, wmOperator *op)
{
+ EvaluationContext eval_ctx;
+ CTX_data_eval_ctx(C, &eval_ctx);
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
Object *ob = ED_object_active_context(C);
ModifierData *md = edit_modifier_property_get(op, ob, 0);
-
- if (!md || !ED_object_modifier_convert(op->reports, bmain, scene, view_layer, ob, md))
+
+ if (!md || !ED_object_modifier_convert(op->reports, bmain, scene, view_layer, ob, eval_ctx.object_mode, md)) {
return OPERATOR_CANCELLED;
+ }
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
@@ -1163,7 +1175,7 @@ static int multires_higher_levels_delete_exec(bContext *C, wmOperator *op)
EvaluationContext eval_ctx;
CTX_data_eval_ctx(C, &eval_ctx);
- multiresModifier_del_levels(mmd, ob, 1);
+ multiresModifier_del_levels(mmd, ob, 1, eval_ctx.object_mode);
ED_object_iter_other(&eval_ctx, CTX_data_main(C), ob, true,
ED_object_multires_update_totlevels_cb,
@@ -1209,7 +1221,7 @@ static int multires_subdivide_exec(bContext *C, wmOperator *op)
EvaluationContext eval_ctx;
CTX_data_eval_ctx(C, &eval_ctx);
- multiresModifier_subdivide(mmd, ob, 0, mmd->simple);
+ multiresModifier_subdivide(mmd, ob, 0, mmd->simple, eval_ctx.object_mode);
ED_object_iter_other(
&eval_ctx, CTX_data_main(C), ob, true,
@@ -1433,8 +1445,11 @@ static int multires_base_apply_exec(bContext *C, wmOperator *op)
if (!mmd)
return OPERATOR_CANCELLED;
-
- multiresModifier_base_apply(mmd, ob);
+
+ EvaluationContext eval_ctx;
+ CTX_data_eval_ctx(C, &eval_ctx);
+
+ multiresModifier_base_apply(mmd, ob, eval_ctx.object_mode);
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index 43d29b6f931..d76019e9172 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -717,7 +717,8 @@ bool ED_object_parent_set(ReportList *reports, const bContext *C, Scene *scene,
switch (partype) {
case PAR_CURVE: /* curve deform */
if (modifiers_isDeformedByCurve(ob) != par) {
- md = ED_object_modifier_add(reports, bmain, scene, ob, NULL, eModifierType_Curve);
+ md = ED_object_modifier_add(
+ reports, bmain, scene, ob, eval_ctx.object_mode, NULL, eModifierType_Curve);
if (md) {
((CurveModifierData *)md)->object = par;
}
@@ -728,7 +729,8 @@ bool ED_object_parent_set(ReportList *reports, const bContext *C, Scene *scene,
break;
case PAR_LATTICE: /* lattice deform */
if (modifiers_isDeformedByLattice(ob) != par) {
- md = ED_object_modifier_add(reports, bmain, scene, ob, NULL, eModifierType_Lattice);
+ md = ED_object_modifier_add(
+ reports, bmain, scene, ob, eval_ctx.object_mode, NULL, eModifierType_Lattice);
if (md) {
((LatticeModifierData *)md)->object = par;
}
@@ -736,7 +738,8 @@ bool ED_object_parent_set(ReportList *reports, const bContext *C, Scene *scene,
break;
default: /* armature deform */
if (modifiers_isDeformedByArmature(ob) != par) {
- md = ED_object_modifier_add(reports, bmain, scene, ob, NULL, eModifierType_Armature);
+ md = ED_object_modifier_add(
+ reports, bmain, scene, ob, eval_ctx.object_mode, NULL, eModifierType_Armature);
if (md) {
((ArmatureModifierData *)md)->object = par;
}
@@ -1425,6 +1428,9 @@ static bool allow_make_links_data(const int type, Object *ob_src, Object *ob_dst
static int make_links_data_exec(bContext *C, wmOperator *op)
{
+ EvaluationContext eval_ctx;
+ CTX_data_eval_ctx(C, &eval_ctx);
+
Main *bmain = CTX_data_main(C);
const int type = RNA_enum_get(op->ptr, "type");
Object *ob_src;
@@ -1509,7 +1515,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
}
break;
case MAKE_LINKS_MODIFIERS:
- BKE_object_link_modifiers(ob_dst, ob_src);
+ BKE_object_link_modifiers(ob_dst, ob_src, eval_ctx.object_mode);
DEG_id_tag_update(&ob_dst->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
break;
case MAKE_LINKS_FONTS:
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index d5a719515f8..8c9281e3e61 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -121,12 +121,35 @@ void ED_object_base_select(Base *base, eObjectSelect_Mode mode)
void ED_object_base_activate(bContext *C, Base *base)
{
ViewLayer *view_layer = CTX_data_view_layer(C);
+
+ WorkSpace *workspace = CTX_wm_workspace(C);
+
+ bool reset = true;
+ if (base) {
+ Object *ob_prev = OBACT(view_layer);
+ Object *ob_curr = base->object;
+ if (ob_prev != NULL) {
+ if (ob_prev->type == ob_curr->type) {
+ reset = false;
+ }
+ }
+ }
+
+ eObjectMode object_mode = workspace->object_mode;
+ workspace->object_mode = OB_MODE_OBJECT;
+
view_layer->basact = base;
+ if (reset == false) {
+ wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_mode_set", false);
+ PointerRNA ptr;
+ WM_operator_properties_create_ptr(&ptr, ot);
+ RNA_enum_set(&ptr, "mode", object_mode);
+ WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &ptr);
+ WM_operator_properties_free(&ptr);
+ }
+
if (base) {
-#ifdef USE_WORKSPACE_MODE
- BKE_workspace_object_mode_set(CTX_wm_workspace(C), CTX_data_scene(C), base->object->mode);
-#endif
WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, view_layer);
}
else {
diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c
index aeb7f0b9222..63eee657c3a 100644
--- a/source/blender/editors/physics/particle_edit.c
+++ b/source/blender/editors/physics/particle_edit.c
@@ -43,6 +43,7 @@
#include "DNA_view3d_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_workspace_types.h"
#include "BLI_math.h"
#include "BLI_lasso.h"
@@ -4784,26 +4785,27 @@ static int particle_edit_toggle_poll(bContext *C)
static int particle_edit_toggle_exec(bContext *C, wmOperator *op)
{
+ struct WorkSpace *workspace = CTX_wm_workspace(C);
+ EvaluationContext eval_ctx;
+ CTX_data_eval_ctx(C, &eval_ctx);
Scene *scene = CTX_data_scene(C);
Object *ob = CTX_data_active_object(C);
const int mode_flag = OB_MODE_PARTICLE_EDIT;
- const bool is_mode_set = (ob->mode & mode_flag) != 0;
+ const bool is_mode_set = (eval_ctx.object_mode & mode_flag) != 0;
BKE_report(op->reports, RPT_INFO, "Particles are changing, editing is not possible");
return OPERATOR_CANCELLED;
if (!is_mode_set) {
- if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
+ if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) {
return OPERATOR_CANCELLED;
}
}
if (!is_mode_set) {
PTCacheEdit *edit;
- EvaluationContext eval_ctx;
- CTX_data_eval_ctx(C, &eval_ctx);
- ob->mode |= mode_flag;
+ workspace->object_mode |= mode_flag;
edit= PE_create_current(&eval_ctx, scene, ob);
/* mesh may have changed since last entering editmode.
@@ -4815,7 +4817,7 @@ static int particle_edit_toggle_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_PARTICLE, NULL);
}
else {
- ob->mode &= ~mode_flag;
+ workspace->object_mode &= ~mode_flag;
toggle_particle_cursor(C, 0);
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL);
}
diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c
index 1536c15525f..7a22a0d81d9 100644
--- a/source/blender/editors/physics/particle_object.c
+++ b/source/blender/editors/physics/particle_object.c
@@ -133,23 +133,25 @@ void OBJECT_OT_particle_system_add(wmOperatorType *ot)
static int particle_system_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
+ WorkSpace *workspace = CTX_wm_workspace(C);
Object *ob = ED_object_context(C);
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
- int mode_orig;
+ eObjectMode mode_orig;
if (!scene || !ob)
return OPERATOR_CANCELLED;
- mode_orig = ob->mode;
+ mode_orig = workspace->object_mode;
object_remove_particle_system(scene, ob);
/* possible this isn't the active object
* object_remove_particle_system() clears the mode on the last psys
*/
if (mode_orig & OB_MODE_PARTICLE_EDIT) {
- if ((ob->mode & OB_MODE_PARTICLE_EDIT) == 0) {
+ if ((workspace->object_mode & OB_MODE_PARTICLE_EDIT) == 0) {
if (view_layer->basact && view_layer->basact->object == ob) {
+ workspace->object_mode &= ~OB_MODE_PARTICLE_EDIT;
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL);
}
}
diff --git a/source/blender/editors/render/render_update.c b/source/blender/editors/render/render_update.c
index 4943222f038..92f9dd9ee26 100644
--- a/source/blender/editors/render/render_update.c
+++ b/source/blender/editors/render/render_update.c
@@ -401,10 +401,12 @@ static void texture_changed(Main *bmain, Tex *tex)
/* icons */
BKE_icon_changed(BKE_icon_id_ensure(&tex->id));
+ const eObjectMode object_mode = WM_windows_object_mode_get(bmain->wm.first);
+
/* paint overlays */
for (scene = bmain->scene.first; scene; scene = scene->id.next) {
for (view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) {
- BKE_paint_invalidate_overlay_tex(scene, view_layer, tex);
+ BKE_paint_invalidate_overlay_tex(scene, view_layer, tex, object_mode);
}
}
@@ -524,8 +526,18 @@ static void scene_changed(Main *bmain, Scene *scene)
Object *ob;
/* glsl */
- for (ob = bmain->object.first; ob; ob = ob->id.next) {
- if (ob->mode & OB_MODE_TEXTURE_PAINT) {
+ bool has_texture_mode = false;
+ wmWindowManager *wm = bmain->wm.first;
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ WorkSpace *workspace = WM_window_get_active_workspace(win);
+ if (workspace->object_mode & OB_MODE_TEXTURE_PAINT) {
+ has_texture_mode = true;
+ break;
+ }
+ }
+
+ if (has_texture_mode) {
+ for (ob = bmain->object.first; ob; ob = ob->id.next) {
BKE_texpaint_slots_refresh_object(scene, ob);
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
GPU_drawobject_free(ob->derivedFinal);
@@ -558,8 +570,10 @@ void ED_render_id_flush_update(const DEGEditorUpdateContext *update_ctx, ID *id)
lamp_changed(bmain, (Lamp *)id);
break;
case ID_IM:
+ {
image_changed(bmain, (Image *)id);
break;
+ }
case ID_SCE:
scene_changed(bmain, (Scene *)id);
render_engine_flag_changed(bmain, RE_ENGINE_UPDATE_OTHER);
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 0b78590d4d8..604a86a1519 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -1850,10 +1850,14 @@ bool ED_screen_stereo3d_required(const bScreen *screen, const Scene *scene)
* Find the scene displayed in \a screen.
* \note Assumes \a screen to be visible/active!
*/
-Scene *ED_screen_scene_find(const bScreen *screen, const wmWindowManager *wm)
+
+Scene *ED_screen_scene_find_with_window(const bScreen *screen, const wmWindowManager *wm, struct wmWindow **r_window)
{
for (wmWindow *win = wm->windows.first; win; win = win->next) {
if (WM_window_get_active_screen(win) == screen) {
+ if (r_window) {
+ *r_window = win;
+ }
return WM_window_get_active_scene(win);
}
}
@@ -1861,3 +1865,9 @@ Scene *ED_screen_scene_find(const bScreen *screen, const wmWindowManager *wm)
BLI_assert(0);
return NULL;
}
+
+
+Scene *ED_screen_scene_find(const bScreen *screen, const wmWindowManager *wm)
+{
+ return ED_screen_scene_find_with_window(screen, wm, NULL);
+}
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 9167c4c3d4d..9f5a3c84243 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -573,9 +573,10 @@ int ED_operator_mask(bContext *C)
}
case SPACE_IMAGE:
{
+ WorkSpace *workspace = CTX_wm_workspace(C);
SpaceImage *sima = sa->spacedata.first;
ViewLayer *view_layer = CTX_data_view_layer(C);
- return ED_space_image_check_show_maskedit(sima, view_layer);
+ return ED_space_image_check_show_maskedit(sima, workspace, view_layer);
}
}
}
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index 00dc1003121..1ec83ed7c08 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -79,33 +79,9 @@ WorkSpace *ED_workspace_add(
BKE_workspace_view_layer_set(workspace, act_view_layer, scene);
BKE_viewrender_copy(&workspace->view_render, view_render);
-#ifdef USE_WORKSPACE_MODE
- BKE_workspace_object_mode_set(workspace, scene, OB_MODE_OBJECT);
-#endif
-
return workspace;
}
-#ifdef USE_WORKSPACE_MODE
-/**
- * Changes the object mode (if needed) to the one set in \a workspace_new.
- * Object mode is still stored on object level. In future it should all be workspace level instead.
- */
-static void workspace_change_update_mode(
- const WorkSpace *workspace_old, const WorkSpace *workspace_new,
- bContext *C, Object *ob_act, ReportList *reports)
-{
- const Scene *scene = CTX_data_scene(C);
- eObjectMode mode_old = BKE_workspace_object_mode_get(workspace_old, scene);
- eObjectMode mode_new = BKE_workspace_object_mode_get(workspace_new, scene);
-
- if (mode_old != mode_new) {
- ED_object_mode_compat_set(C, ob_act, mode_new, reports);
- ED_object_toggle_modes(C, mode_new);
- }
-}
-#endif
-
static void workspace_change_update_view_layer(
WorkSpace *workspace_new, const WorkSpace *workspace_old,
Scene *scene)
@@ -117,15 +93,10 @@ static void workspace_change_update_view_layer(
static void workspace_change_update(
WorkSpace *workspace_new, const WorkSpace *workspace_old,
- bContext *C, wmWindowManager *wm)
+ bContext *C)
{
/* needs to be done before changing mode! (to ensure right context) */
workspace_change_update_view_layer(workspace_new, workspace_old, CTX_data_scene(C));
-#ifdef USE_WORKSPACE_MODE
- workspace_change_update_mode(workspace_old, workspace_new, C, CTX_data_active_object(C), &wm->reports);
-#else
- UNUSED_VARS(C, wm);
-#endif
}
static bool workspace_change_find_new_layout_cb(const WorkSpaceLayout *layout, void *UNUSED(arg))
@@ -177,7 +148,7 @@ static WorkSpaceLayout *workspace_change_get_new_layout(
* \returns if workspace changing was successful.
*/
bool ED_workspace_change(
- WorkSpace *workspace_new, bContext *C, wmWindowManager *wm, wmWindow *win)
+ WorkSpace *workspace_new, bContext *C, wmWindow *win)
{
Main *bmain = CTX_data_main(C);
WorkSpace *workspace_old = WM_window_get_active_workspace(win);
@@ -200,7 +171,7 @@ bool ED_workspace_change(
/* update screen *after* changing workspace - which also causes the actual screen change */
screen_changed_update(C, win, screen_new);
- workspace_change_update(workspace_new, workspace_old, C, wm);
+ workspace_change_update(workspace_new, workspace_old, C);
BLI_assert(BKE_workspace_view_layer_get(workspace_new, CTX_data_scene(C)) != NULL);
BLI_assert(CTX_wm_workspace(C) == workspace_new);
@@ -231,9 +202,6 @@ WorkSpace *ED_workspace_duplicate(
ListBase *transform_orientations_old = BKE_workspace_transform_orientations_get(workspace_old);
ListBase *transform_orientations_new = BKE_workspace_transform_orientations_get(workspace_new);
-#ifdef USE_WORKSPACE_MODE
- BKE_workspace_object_mode_set(workspace_new, scene, BKE_workspace_object_mode_get(workspace_old, scene));
-#endif
BLI_duplicatelist(transform_orientations_new, transform_orientations_old);
workspace_new->tool = workspace_old->tool;
@@ -264,7 +232,7 @@ bool ED_workspace_delete(
WorkSpace *prev = workspace_id->prev;
WorkSpace *next = workspace_id->next;
- ED_workspace_change((prev != NULL) ? prev : next, C, wm, win);
+ ED_workspace_change((prev != NULL) ? prev : next, C, win);
}
BKE_libblock_free(bmain, workspace_id);
diff --git a/source/blender/editors/sculpt_paint/paint_hide.c b/source/blender/editors/sculpt_paint/paint_hide.c
index 8377b22756e..4c6cd8d6d22 100644
--- a/source/blender/editors/sculpt_paint/paint_hide.c
+++ b/source/blender/editors/sculpt_paint/paint_hide.c
@@ -384,7 +384,7 @@ static int hide_show_exec(bContext *C, wmOperator *op)
clip_planes_from_rect(C, clip_planes, &rect);
dm = mesh_get_derived_final(&eval_ctx, CTX_data_scene(C), ob, CD_MASK_BAREMESH);
- pbvh = dm->getPBVH(ob, dm);
+ pbvh = dm->getPBVH(ob, dm, eval_ctx.object_mode);
ob->sculpt->pbvh = pbvh;
get_pbvh_nodes(pbvh, &nodes, &totnode, clip_planes, area);
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index 1ae13fcaec0..662485bf4f7 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -1376,19 +1376,20 @@ static int texture_paint_toggle_poll(bContext *C)
static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
{
+ WorkSpace *workspace = CTX_wm_workspace(C);
Scene *scene = CTX_data_scene(C);
Object *ob = CTX_data_active_object(C);
const int mode_flag = OB_MODE_TEXTURE_PAINT;
- const bool is_mode_set = (ob->mode & mode_flag) != 0;
+ const bool is_mode_set = (workspace->object_mode & mode_flag) != 0;
if (!is_mode_set) {
- if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
+ if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) {
return OPERATOR_CANCELLED;
}
}
- if (ob->mode & mode_flag) {
- ob->mode &= ~mode_flag;
+ if (workspace->object_mode & mode_flag) {
+ workspace->object_mode &= ~mode_flag;
if (U.glreslimit != 0)
GPU_free_images();
@@ -1436,7 +1437,7 @@ static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
}
}
- ob->mode |= mode_flag;
+ workspace->object_mode |= mode_flag;
BKE_paint_init(scene, ePaintTextureProjective, PAINT_CURSOR_TEXTURE_PAINT);
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index 1ec1e052d43..6b14f97d80c 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -566,10 +566,11 @@ static int brush_curve_preset_exec(bContext *C, wmOperator *op)
Brush *br = BKE_paint_brush(BKE_paint_get_active_from_context(C));
if (br) {
+ const WorkSpace *workspace = CTX_wm_workspace(C);
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
BKE_brush_curve_preset(br, RNA_enum_get(op->ptr, "shape"));
- BKE_paint_invalidate_cursor_overlay(scene, view_layer, br->curve);
+ BKE_paint_invalidate_cursor_overlay(scene, view_layer, br->curve, workspace->object_mode);
}
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 43bb19639cf..3a20973c465 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -1045,23 +1045,24 @@ static void vertex_paint_init_session_data(
*/
static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
{
+ WorkSpace *workspace = CTX_wm_workspace(C);
Object *ob = CTX_data_active_object(C);
const int mode_flag = OB_MODE_WEIGHT_PAINT;
- const bool is_mode_set = (ob->mode & mode_flag) != 0;
+ const bool is_mode_set = (workspace->object_mode & mode_flag) != 0;
Scene *scene = CTX_data_scene(C);
VPaint *wp = scene->toolsettings->wpaint;
Mesh *me;
if (!is_mode_set) {
- if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
+ if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) {
return OPERATOR_CANCELLED;
}
}
me = BKE_mesh_from_object(ob);
- if (ob->mode & mode_flag) {
- ob->mode &= ~mode_flag;
+ if (workspace->object_mode & mode_flag) {
+ workspace->object_mode &= ~mode_flag;
if (me->editflag & ME_EDIT_PAINT_VERT_SEL) {
BKE_mesh_flush_select_from_verts(me);
@@ -1085,7 +1086,7 @@ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
paint_cursor_delete_textures();
}
else {
- ob->mode |= mode_flag;
+ workspace->object_mode |= mode_flag;
if (wp == NULL)
wp = scene->toolsettings->wpaint = new_vpaint();
@@ -2222,15 +2223,16 @@ void PAINT_OT_weight_paint(wmOperatorType *ot)
*/
static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op)
{
+ WorkSpace *workspace = CTX_wm_workspace(C);
Object *ob = CTX_data_active_object(C);
const int mode_flag = OB_MODE_VERTEX_PAINT;
- const bool is_mode_set = (ob->mode & mode_flag) != 0;
+ const bool is_mode_set = (workspace->object_mode & mode_flag) != 0;
Scene *scene = CTX_data_scene(C);
VPaint *vp = scene->toolsettings->vpaint;
Mesh *me;
if (!is_mode_set) {
- if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
+ if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) {
return OPERATOR_CANCELLED;
}
}
@@ -2239,7 +2241,7 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op)
/* toggle: end vpaint */
if (is_mode_set) {
- ob->mode &= ~mode_flag;
+ workspace->object_mode &= ~mode_flag;
if (me->editflag & ME_EDIT_PAINT_FACE_SEL) {
BKE_mesh_flush_select_from_polys(me);
@@ -2259,7 +2261,7 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op)
paint_cursor_delete_textures();
}
else {
- ob->mode |= mode_flag;
+ workspace->object_mode |= mode_flag;
ED_mesh_color_ensure(me, NULL);
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index e121030da0c..d6b279008f0 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -5221,7 +5221,7 @@ void sculpt_pbvh_clear(Object *ob)
BKE_pbvh_free(ss->pbvh);
ss->pbvh = NULL;
if (dm)
- dm->getPBVH(NULL, dm);
+ dm->getPBVH(NULL, dm, OB_MODE_OBJECT);
BKE_object_free_derived_caches(ob);
}
@@ -5616,16 +5616,17 @@ static void sculpt_init_session(const bContext *C, Scene *scene, Object *ob)
static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op)
{
+ WorkSpace *workspace = CTX_wm_workspace(C);
Scene *scene = CTX_data_scene(C);
Object *ob = CTX_data_active_object(C);
const int mode_flag = OB_MODE_SCULPT;
- const bool is_mode_set = (ob->mode & mode_flag) != 0;
+ const bool is_mode_set = (workspace->object_mode & mode_flag) != 0;
Mesh *me;
MultiresModifierData *mmd = BKE_sculpt_multires_active(scene, ob);
int flush_recalc = 0;
if (!is_mode_set) {
- if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
+ if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) {
return OPERATOR_CANCELLED;
}
}
@@ -5659,7 +5660,7 @@ static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op)
}
/* Leave sculptmode */
- ob->mode &= ~mode_flag;
+ workspace->object_mode &= ~mode_flag;
BKE_sculptsession_free(ob);
@@ -5667,14 +5668,15 @@ static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op)
}
else {
/* Enter sculptmode */
- ob->mode |= mode_flag;
+ workspace->object_mode |= mode_flag;
if (flush_recalc)
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* Create sculpt mode session data */
- if (ob->sculpt)
+ if (ob->sculpt) {
BKE_sculptsession_free(ob);
+ }
sculpt_init_session(C, scene, ob);
diff --git a/source/blender/editors/space_image/image_edit.c b/source/blender/editors/space_image/image_edit.c
index 8db9f8fb720..68bef3fd142 100644
--- a/source/blender/editors/space_image/image_edit.c
+++ b/source/blender/editors/space_image/image_edit.c
@@ -378,11 +378,12 @@ bool ED_space_image_show_uvedit(SpaceImage *sima, Object *obedit)
}
/* matches clip function */
-bool ED_space_image_check_show_maskedit(SpaceImage *sima, ViewLayer *view_layer)
+bool ED_space_image_check_show_maskedit(
+ SpaceImage *sima, const WorkSpace *workspace, ViewLayer *view_layer)
{
/* check editmode - this is reserved for UV editing */
Object *ob = OBACT(view_layer);
- if (ob && ob->mode & OB_MODE_EDIT && ED_space_image_show_uvedit(sima, ob)) {
+ if (ob && (workspace->object_mode & OB_MODE_EDIT) && ED_space_image_show_uvedit(sima, ob)) {
return false;
}
@@ -392,10 +393,10 @@ bool ED_space_image_check_show_maskedit(SpaceImage *sima, ViewLayer *view_layer)
int ED_space_image_maskedit_poll(bContext *C)
{
SpaceImage *sima = CTX_wm_space_image(C);
-
if (sima) {
+ WorkSpace *workspace = CTX_wm_workspace(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
- return ED_space_image_check_show_maskedit(sima, view_layer);
+ return ED_space_image_check_show_maskedit(sima, workspace, view_layer);
}
return false;
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 6c8f9a12b7e..0ff30c228b4 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -791,6 +791,7 @@ void IMAGE_OT_view_all(wmOperatorType *ot)
static int image_view_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
+ WorkSpace *workspace = CTX_wm_workspace(C);
SpaceImage *sima;
ARegion *ar;
Scene *scene;
@@ -814,7 +815,7 @@ static int image_view_selected_exec(bContext *C, wmOperator *UNUSED(op))
return OPERATOR_CANCELLED;
}
}
- else if (ED_space_image_check_show_maskedit(sima, view_layer)) {
+ else if (ED_space_image_check_show_maskedit(sima, workspace, view_layer)) {
if (!ED_mask_selected_minmax(C, min, max)) {
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index e20d2a620d7..aa6120942d8 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -551,7 +551,7 @@ static void image_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn, Sc
{
ViewLayer *view_layer = BKE_view_layer_from_workspace_get(scene, workspace);
Object *ob = OBACT(view_layer);
- if (ob && (ob == wmn->reference) && (ob->mode & OB_MODE_EDIT)) {
+ if (ob && (ob == wmn->reference) && (workspace->object_mode & OB_MODE_EDIT)) {
if (sima->lock && (sima->flag & SI_DRAWSHADOW)) {
ED_area_tag_refresh(sa);
ED_area_tag_redraw(sa);
diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c
index 25d590550ce..118be88216e 100644
--- a/source/blender/editors/space_info/info_stats.c
+++ b/source/blender/editors/space_info/info_stats.c
@@ -36,6 +36,7 @@
#include "DNA_lattice_types.h"
#include "DNA_meta_types.h"
#include "DNA_scene_types.h"
+#include "DNA_workspace_types.h"
#include "BLI_math.h"
#include "BLI_string.h"
@@ -526,14 +527,12 @@ void ED_info_stats_clear(ViewLayer *view_layer)
}
}
-const char *ED_info_stats_string(Scene *scene, ViewLayer *view_layer)
+const char *ED_info_stats_string(Scene *scene, WorkSpace *workspace, ViewLayer *view_layer)
{
- const eObjectMode object_mode = (view_layer->basact) ? view_layer->basact->object->mode : OB_MODE_OBJECT;
-
if (!view_layer->stats) {
- stats_update(scene, view_layer, object_mode);
+ stats_update(scene, view_layer, workspace->object_mode);
}
- stats_string(scene, view_layer, object_mode);
+ stats_string(scene, view_layer, workspace->object_mode);
return view_layer->stats->infostr;
}
diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c
index 283dbf3b4e2..853c24390d9 100644
--- a/source/blender/editors/space_time/space_time.c
+++ b/source/blender/editors/space_time/space_time.c
@@ -402,6 +402,7 @@ static void time_draw_caches_keyframes(Main *bmain, ViewLayer *view_layer, View2
/* draw keyframe lines for timeline */
static void time_draw_keyframes(const bContext *C, ARegion *ar)
{
+ WorkSpace *workspace = CTX_wm_workspace(C);
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
Object *ob = CTX_data_active_object(C);
@@ -443,7 +444,7 @@ static void time_draw_keyframes(const bContext *C, ARegion *ar)
*/
UI_GetThemeColor3ubv(TH_TIME_KEYFRAME, color);
- if (ob && ((ob->mode == OB_MODE_POSE) || onlysel)) {
+ if (ob && ((workspace->object_mode == OB_MODE_POSE) || onlysel)) {
/* draw keyframes for active object only */
time_draw_idblock_keyframes(v2d, (ID *)ob, onlysel, color);
}
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index 8973c96c438..02443af0bfc 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -41,6 +41,7 @@
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
#include "DNA_packedFile_types.h"
+#include "DNA_workspace_types.h"
#include "BLI_utildefines.h"
#include "BLI_string.h"
@@ -70,6 +71,8 @@
#include "ED_space_api.h"
#include "ED_util.h"
+#include "DEG_depsgraph.h"
+
#include "GPU_immediate.h"
#include "UI_interface.h"
@@ -86,11 +89,7 @@
void ED_editors_init(bContext *C)
{
wmWindowManager *wm = CTX_wm_manager(C);
- Main *bmain = CTX_data_main(C);
Scene *sce = CTX_data_scene(C);
- ViewLayer *view_layer = CTX_data_view_layer(C);
- Object *ob, *obact = (view_layer && view_layer->basact) ? view_layer->basact->object : NULL;
- ID *data;
/* This is called during initialization, so we don't want to store any reports */
ReportList *reports = CTX_wm_reports(C);
@@ -98,24 +97,6 @@ void ED_editors_init(bContext *C)
SWAP(int, reports->flag, reports_flag_prev);
- /* toggle on modes for objects that were saved with these enabled. for
- * e.g. linked objects we have to ensure that they are actually the
- * active object in this scene. */
- for (ob = bmain->object.first; ob; ob = ob->id.next) {
- int mode = ob->mode;
-
- if (mode == OB_MODE_OBJECT) {
- /* pass */
- }
- else {
- data = ob->data;
- ob->mode = OB_MODE_OBJECT;
- if ((ob == obact) && !ID_IS_LINKED(ob) && !(data && ID_IS_LINKED(data))) {
- ED_object_toggle_modes(C, mode);
- }
- }
- }
-
/* image editor paint mode */
if (sce) {
ED_space_image_paint_update(wm, sce);
@@ -170,11 +151,16 @@ bool ED_editors_flush_edits(const bContext *C, bool for_render)
Object *ob;
Main *bmain = CTX_data_main(C);
+ eObjectMode object_mode = WM_windows_object_mode_get(bmain->wm.first);
+ if ((object_mode & (OB_MODE_SCULPT | OB_MODE_EDIT)) == 0) {
+ return has_edited;
+ }
+
/* loop through all data to find edit mode or object mode, because during
* exiting we might not have a context for edit object and multiple sculpt
* objects can exist at the same time */
for (ob = bmain->object.first; ob; ob = ob->id.next) {
- if (ob->mode & OB_MODE_SCULPT) {
+ if (object_mode & OB_MODE_SCULPT) {
/* Don't allow flushing while in the middle of a stroke (frees data in use).
* Auto-save prevents this from happening but scripts may cause a flush on saving: T53986. */
if ((ob->sculpt && ob->sculpt->cache) == 0) {
@@ -193,7 +179,7 @@ bool ED_editors_flush_edits(const bContext *C, bool for_render)
}
}
}
- else if (ob->mode & OB_MODE_EDIT) {
+ else if (object_mode & OB_MODE_EDIT) {
/* get editmode results */
has_edited = true;
ED_object_editmode_load(ob);