diff options
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/include/ED_screen.h | 4 | ||||
-rw-r--r-- | source/blender/editors/object/object_edit.c | 8 | ||||
-rw-r--r-- | source/blender/editors/object/object_select.c | 3 | ||||
-rw-r--r-- | source/blender/editors/scene/scene_edit.c | 17 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_context.c | 2 | ||||
-rw-r--r-- | source/blender/editors/screen/workspace_edit.c | 37 |
6 files changed, 40 insertions, 31 deletions
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index c1655cbccc2..23e65011387 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -136,6 +136,7 @@ void ED_screen_preview_render(const struct bScreen *screen, int size_x, int s struct WorkSpace *ED_workspace_add( struct Main *bmain, const char *name, + Scene *scene, ViewLayer *act_render_layer, struct ViewRender *view_render) ATTR_NONNULL(); bool ED_workspace_change( @@ -152,7 +153,8 @@ bool ED_workspace_delete( void ED_workspace_scene_data_sync( struct WorkSpaceInstanceHook *hook, Scene *scene) ATTR_NONNULL(); void ED_workspace_view_layer_unset( - const struct Main *bmain, const ViewLayer *layer_unset, ViewLayer *layer_new) ATTR_NONNULL(1, 2); + const struct Main *bmain, struct Scene *scene, + const ViewLayer *layer_unset, ViewLayer *layer_new) ATTR_NONNULL(1, 2); struct WorkSpaceLayout *ED_workspace_layout_add( struct WorkSpace *workspace, struct wmWindow *win, diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 804d0ed1f0d..5697c48d381 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -1516,15 +1516,13 @@ bool ED_object_mode_compat_set(bContext *C, Object *ob, int mode, ReportList *re { bool ok; if (!ELEM(ob->mode, mode, OB_MODE_OBJECT)) { - WorkSpace *workspace = CTX_wm_workspace(C); const char *opstring = object_mode_op_string(ob->mode); WM_operator_name_call(C, opstring, WM_OP_EXEC_REGION_WIN, NULL); #ifdef USE_WORKSPACE_MODE - BKE_workspace_object_mode_set(workspace, ob->mode); -#else - UNUSED_VARS(workspace); + BKE_workspace_object_mode_set(CTX_wm_workspace(C), CTX_data_scene(C), ob->mode); #endif + ok = ELEM(ob->mode, mode, OB_MODE_OBJECT); if (!ok) { wmOperatorType *ot = WM_operatortype_find(opstring, false); @@ -1648,7 +1646,7 @@ void ED_object_toggle_modes(bContext *C, int mode) #ifdef USE_WORKSPACE_MODE Object *ob = CTX_data_active_object(C); if (ob) { - BKE_workspace_object_mode_set(workspace, ob->mode); + BKE_workspace_object_mode_set(workspace, CTX_data_scene(C), ob->mode); } #endif } diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 47e63cb43e5..552380cebdb 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -123,8 +123,7 @@ void ED_object_base_activate(bContext *C, Base *base) if (base) { #ifdef USE_WORKSPACE_MODE - WorkSpace *workspace = CTX_wm_workspace(C); - BKE_workspace_object_mode_set(workspace, base->object->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); } diff --git a/source/blender/editors/scene/scene_edit.c b/source/blender/editors/scene/scene_edit.c index c7f04a0e2f9..812f9a736bf 100644 --- a/source/blender/editors/scene/scene_edit.c +++ b/source/blender/editors/scene/scene_edit.c @@ -118,16 +118,20 @@ void ED_scene_exit(bContext *C) ED_object_editmode_exit(C, EM_FREEDATA | EM_DO_UNDO); } +static ViewLayer *scene_change_get_new_view_layer(const WorkSpace *workspace, const Scene *scene_new) +{ + ViewLayer *layer_new = BKE_workspace_view_layer_get(workspace, scene_new); + return layer_new ? layer_new : BKE_view_layer_from_scene_get(scene_new); +} + void ED_scene_changed_update(Main *bmain, bContext *C, Scene *scene_new, const bScreen *active_screen) { - /* XXX Just using active scene render-layer for workspace when switching, - * but workspace should remember the last one set. Could store render-layer - * per window-workspace combination (using WorkSpaceDataRelation) */ - ViewLayer *layer_new = BLI_findlink(&scene_new->view_layers, scene_new->active_view_layer); + WorkSpace *workspace = CTX_wm_workspace(C); + ViewLayer *layer_new = scene_change_get_new_view_layer(workspace, scene_new); Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene_new, layer_new, true); CTX_data_scene_set(C, scene_new); - BKE_workspace_view_layer_set(CTX_wm_workspace(C), layer_new); + BKE_workspace_view_layer_set(workspace, layer_new, scene_new); BKE_scene_set_background(bmain, scene_new); DEG_graph_relations_update(depsgraph, bmain, scene_new, layer_new); DEG_on_visible_update(bmain, false); @@ -186,7 +190,8 @@ bool ED_scene_view_layer_delete( BLI_assert(BLI_listbase_is_empty(&scene->view_layers) == false); scene->active_view_layer = 0; - ED_workspace_view_layer_unset(bmain, layer, scene->view_layers.first); + ED_workspace_view_layer_unset(bmain, scene, layer, scene->view_layers.first); + BKE_workspace_view_layer_remove_references(bmain, layer); view_layer_remove_unset_nodetrees(bmain, scene, layer); BKE_view_layer_free(layer); diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c index d84f256bc32..4c62253bef6 100644 --- a/source/blender/editors/screen/screen_context.c +++ b/source/blender/editors/screen/screen_context.c @@ -91,7 +91,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook); ViewLayer *view_layer = BKE_view_layer_from_workspace_get(scene, workspace); Object *obedit = scene->obedit; - Object *obact = view_layer->basact ? view_layer->basact->object : NULL; + Object *obact = (view_layer && view_layer->basact) ? view_layer->basact->object : NULL; if (CTX_data_dir(member)) { CTX_data_dir_set(result, screen_context_dir); diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c index 84288740df8..00dc1003121 100644 --- a/source/blender/editors/screen/workspace_edit.c +++ b/source/blender/editors/screen/workspace_edit.c @@ -71,15 +71,16 @@ * \{ */ WorkSpace *ED_workspace_add( - Main *bmain, const char *name, ViewLayer *act_view_layer, ViewRender *view_render) + Main *bmain, const char *name, Scene *scene, + ViewLayer *act_view_layer, ViewRender *view_render) { WorkSpace *workspace = BKE_workspace_add(bmain, name); - BKE_workspace_view_layer_set(workspace, act_view_layer); + 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, OB_MODE_OBJECT); + BKE_workspace_object_mode_set(workspace, scene, OB_MODE_OBJECT); #endif return workspace; @@ -94,8 +95,9 @@ static void workspace_change_update_mode( const WorkSpace *workspace_old, const WorkSpace *workspace_new, bContext *C, Object *ob_act, ReportList *reports) { - eObjectMode mode_old = BKE_workspace_object_mode_get(workspace_old); - eObjectMode mode_new = BKE_workspace_object_mode_get(workspace_new); + 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); @@ -105,10 +107,11 @@ static void workspace_change_update_mode( #endif static void workspace_change_update_view_layer( - WorkSpace *workspace_new, const WorkSpace *workspace_old) + WorkSpace *workspace_new, const WorkSpace *workspace_old, + Scene *scene) { - if (!BKE_workspace_view_layer_get(workspace_new)) { - BKE_workspace_view_layer_set(workspace_new, BKE_workspace_view_layer_get(workspace_old)); + if (!BKE_workspace_view_layer_get(workspace_new, scene)) { + BKE_workspace_view_layer_set(workspace_new, BKE_workspace_view_layer_get(workspace_old, scene), scene); } } @@ -117,7 +120,7 @@ static void workspace_change_update( bContext *C, wmWindowManager *wm) { /* needs to be done before changing mode! (to ensure right context) */ - workspace_change_update_view_layer(workspace_new, workspace_old); + 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 @@ -199,7 +202,7 @@ bool ED_workspace_change( screen_changed_update(C, win, screen_new); workspace_change_update(workspace_new, workspace_old, C, wm); - BLI_assert(BKE_workspace_view_layer_get(workspace_new) != NULL); + BLI_assert(BKE_workspace_view_layer_get(workspace_new, CTX_data_scene(C)) != NULL); BLI_assert(CTX_wm_workspace(C) == workspace_new); WM_toolsystem_unlink(C, workspace_old); @@ -220,15 +223,16 @@ WorkSpace *ED_workspace_duplicate( { WorkSpaceLayout *layout_active_old = BKE_workspace_active_layout_get(win->workspace_hook); ListBase *layouts_old = BKE_workspace_layouts_get(workspace_old); + Scene *scene = WM_window_get_active_scene(win); WorkSpace *workspace_new = ED_workspace_add( - bmain, workspace_old->id.name + 2, - BKE_workspace_view_layer_get(workspace_old), + bmain, workspace_old->id.name + 2, scene, + BKE_workspace_view_layer_get(workspace_old, scene), &workspace_old->view_render); 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, BKE_workspace_object_mode_get(workspace_old)); + 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); @@ -279,11 +283,12 @@ void ED_workspace_scene_data_sync( } void ED_workspace_view_layer_unset( - const Main *bmain, const ViewLayer *layer_unset, ViewLayer *layer_new) + const Main *bmain, Scene *scene, + const ViewLayer *layer_unset, ViewLayer *layer_new) { for (WorkSpace *workspace = bmain->workspaces.first; workspace; workspace = workspace->id.next) { - if (BKE_workspace_view_layer_get(workspace) == layer_unset) { - BKE_workspace_view_layer_set(workspace, layer_new); + if (BKE_workspace_view_layer_get(workspace, scene) == layer_unset) { + BKE_workspace_view_layer_set(workspace, layer_new, scene); } } } |