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:
authorJulian Eisel <eiseljulian@gmail.com>2017-12-01 17:47:24 +0300
committerJulian Eisel <eiseljulian@gmail.com>2017-12-01 18:15:30 +0300
commite8c15e0ed15f8369d0d0f706b4953fb64e357902 (patch)
tree0eb072454c535b438caf8eed3033d27b3c17e99b /source/blender/editors
parent983b1a34783e9600731b973ba52ecc8924bff169 (diff)
Workspaces: Store an active view-layer per scene
Instead of storing a single active view-layer in the workspace, one is stored for each scene the workspace showed before. With this, some things become possible: * Multiple windows in the same workspace but showing different scenes. * Toggling back and forth scene keeps same active view-layer for each scene. * Activating workspace which didn't show current scene before, the current view-layer is kept. A necessary evil for this is that accessing view-layer and object mode from .py can't be done via workspace directly anymore. It has to be done through the window, so RNA can use the correct scene. So instead of `workspace.view_layer`, it's `window.view_layer` now (same with mode) even though it's still workspace data. Fixes T53432.
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/include/ED_screen.h4
-rw-r--r--source/blender/editors/object/object_edit.c8
-rw-r--r--source/blender/editors/object/object_select.c3
-rw-r--r--source/blender/editors/scene/scene_edit.c17
-rw-r--r--source/blender/editors/screen/screen_context.c2
-rw-r--r--source/blender/editors/screen/workspace_edit.c37
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);
}
}
}