[Bf-blender-cvs] [e8c15e0ed15] blender2.8: Workspaces: Store an active view-layer per scene

Julian Eisel noreply at git.blender.org
Fri Dec 1 16:22:54 CET 2017


Commit: e8c15e0ed15f8369d0d0f706b4953fb64e357902
Author: Julian Eisel
Date:   Fri Dec 1 15:47:24 2017 +0100
Branches: blender2.8
https://developer.blender.org/rBe8c15e0ed15f8369d0d0f706b4953fb64e357902

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.

===================================================================

M	release/scripts/startup/bl_ui/space_info.py
M	source/blender/blenkernel/BKE_workspace.h
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenkernel/intern/workspace.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/object/object_edit.c
M	source/blender/editors/object/object_select.c
M	source/blender/editors/scene/scene_edit.c
M	source/blender/editors/screen/screen_context.c
M	source/blender/editors/screen/workspace_edit.c
M	source/blender/makesdna/DNA_workspace_types.h
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/makesrna/intern/rna_workspace.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py
index 8c7fcb29ad2..f032f6a899b 100644
--- a/release/scripts/startup/bl_ui/space_info.py
+++ b/release/scripts/startup/bl_ui/space_info.py
@@ -48,15 +48,16 @@ class INFO_HT_header(Header):
             layout.template_ID(window, "workspace", new="workspace.workspace_add_menu", unlink="workspace.workspace_delete")
             layout.template_search_preview(window, "screen", workspace, "screens", new="screen.new", unlink="screen.delete", rows=2, cols=6)
 
-        if hasattr(workspace, 'object_mode'):
-            act_mode_item = bpy.types.Object.bl_rna.properties['mode'].enum_items[workspace.object_mode]
+        if hasattr(window, 'object_mode'):
+            act_mode_item = bpy.types.Object.bl_rna.properties['mode'].enum_items[window.object_mode]
         else:
             act_mode_item = bpy.types.Object.bl_rna.properties['mode'].enum_items[layer.objects.active.mode]
         layout.operator_menu_enum("object.mode_set", "mode", text=act_mode_item.name, icon=act_mode_item.icon)
 
         row = layout.row()
         row.active = not workspace.use_scene_settings
-        row.template_search(workspace, "view_layer", scene, "view_layers")
+        # Active workspace view-layer is retrieved through window, not through workspace.
+        row.template_search(window, "view_layer", scene, "view_layers")
 
         if view_render.has_multiple_engines:
             row.prop(view_render, "engine", text="")
diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h
index f295af3150a..9f989f7ae8f 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -32,6 +32,7 @@ struct EvaluationContext;
 struct Main;
 struct Scene;
 struct TransformOrientation;
+struct ViewLayer;
 
 /**
  * Plan is to store the object-mode per workspace, not per object anymore.
@@ -62,10 +63,17 @@ void BKE_workspace_layout_remove(
         struct Main *bmain,
         struct WorkSpace *workspace, struct WorkSpaceLayout *layout) ATTR_NONNULL();
 
+void BKE_workspace_relations_free(
+        ListBase *relation_list);
+
 
 /* -------------------------------------------------------------------- */
 /* General Utils */
 
+void BKE_workspace_view_layer_remove_references(
+        const struct Main *bmain,
+        const struct ViewLayer *view_layer) ATTR_NONNULL();
+
 void BKE_workspace_transform_orientation_remove(
         struct WorkSpace *workspace, struct TransformOrientation *orientation) ATTR_NONNULL();
 struct TransformOrientation *BKE_workspace_transform_orientation_find(
@@ -98,14 +106,24 @@ void             BKE_workspace_active_layout_set(struct WorkSpaceInstanceHook *h
 struct bScreen *BKE_workspace_active_screen_get(const struct WorkSpaceInstanceHook *hook) GETTER_ATTRS;
 void            BKE_workspace_active_screen_set(
         struct WorkSpaceInstanceHook *hook, struct WorkSpace *workspace, struct bScreen *screen) SETTER_ATTRS;
-enum eObjectMode BKE_workspace_object_mode_get(const struct WorkSpace *workspace) GETTER_ATTRS;
 #ifdef USE_WORKSPACE_MODE
-void            BKE_workspace_object_mode_set(struct WorkSpace *workspace, const enum eObjectMode mode) SETTER_ATTRS;
+enum eObjectMode BKE_workspace_object_mode_get(
+        const struct WorkSpace *workspace,
+        const struct Scene *scene) GETTER_ATTRS;
+void BKE_workspace_object_mode_set(
+        struct WorkSpace *workspace,
+        struct Scene *scene,
+        const enum eObjectMode mode) SETTER_ATTRS;
 #endif
-struct Base *BKE_workspace_active_base_get(const struct WorkSpace *workspace);
+struct Base *BKE_workspace_active_base_get(const struct WorkSpace *workspace, const struct Scene *scene);
 struct ListBase *BKE_workspace_transform_orientations_get(struct WorkSpace *workspace) GETTER_ATTRS;
-struct ViewLayer *BKE_workspace_view_layer_get(const struct WorkSpace *workspace) GETTER_ATTRS;
-void               BKE_workspace_view_layer_set(struct WorkSpace *workspace, struct ViewLayer *layer) SETTER_ATTRS;
+struct ViewLayer *BKE_workspace_view_layer_get(
+        const struct WorkSpace *workspace,
+        const struct Scene *scene) GETTER_ATTRS;
+void BKE_workspace_view_layer_set(
+        struct WorkSpace *workspace,
+        struct ViewLayer *layer,
+        struct Scene *scene) SETTER_ATTRS;
 struct ListBase *BKE_workspace_layouts_get(struct WorkSpace *workspace) GETTER_ATTRS;
 
 const char *BKE_workspace_layout_name_get(const struct WorkSpaceLayout *layout) GETTER_ATTRS;
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 01d8b180344..f841181f7c4 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -89,7 +89,7 @@ ViewLayer *BKE_view_layer_from_workspace_get(const struct Scene *scene, const st
 		return BKE_view_layer_from_scene_get(scene);
 	}
 	else {
-		return BKE_workspace_view_layer_get(workspace);
+		return BKE_workspace_view_layer_get(workspace, scene);
 	}
 }
 
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index 785fd71df69..b6b7d936c76 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -113,6 +113,18 @@ static void *workspace_relation_get_data_matching_parent(
 	}
 }
 
+static void workspace_relation_remove_from_value(
+        ListBase *relation_list, const void *value)
+{
+	for (WorkSpaceDataRelation *relation = relation_list->first, *relation_next; relation; relation = relation_next) {
+		relation_next = relation->next;
+
+		if (relation->value == value) {
+			workspace_relation_remove(relation_list, relation);
+		}
+	}
+}
+
 /**
  * Checks if \a screen is already used within any workspace. A screen should never be assigned to multiple
  * WorkSpaceLayouts, but that should be ensured outside of the BKE_workspace module and without such checks.
@@ -151,15 +163,12 @@ WorkSpace *BKE_workspace_add(Main *bmain, const char *name)
  */
 void BKE_workspace_free(WorkSpace *workspace)
 {
-	for (WorkSpaceDataRelation *relation = workspace->hook_layout_relations.first, *relation_next;
-	     relation;
-	     relation = relation_next)
-	{
-		relation_next = relation->next;
-		workspace_relation_remove(&workspace->hook_layout_relations, relation);
-	}
+	BKE_workspace_relations_free(&workspace->hook_layout_relations);
+	BKE_workspace_relations_free(&workspace->scene_viewlayer_relations);
+
 	BLI_freelistN(&workspace->layouts);
 	BLI_freelistN(&workspace->transform_orientations);
+
 	BKE_viewrender_free(&workspace->view_render);
 }
 
@@ -237,9 +246,28 @@ void BKE_workspace_layout_remove(
 	BLI_freelinkN(&workspace->layouts, layout);
 }
 
+void BKE_workspace_relations_free(
+        ListBase *relation_list)
+{
+	for (WorkSpaceDataRelation *relation = relation_list->first, *relation_next; relation; relation = relation_next) {
+		relation_next = relation->next;
+		workspace_relation_remove(relation_list, relation);
+	}
+}
+
+
 /* -------------------------------------------------------------------- */
 /* General Utils */
 
+void BKE_workspace_view_layer_remove_references(
+        const Main *bmain,
+        const ViewLayer *view_layer)
+{
+	for (WorkSpace *workspace = bmain->workspaces.first; workspace; workspace = workspace->id.next) {
+		workspace_relation_remove_from_value(&workspace->scene_viewlayer_relations, view_layer);
+	}
+}
+
 void BKE_workspace_transform_orientation_remove(
         WorkSpace *workspace, TransformOrientation *orientation)
 {
@@ -386,23 +414,24 @@ void BKE_workspace_active_screen_set(WorkSpaceInstanceHook *hook, WorkSpace *wor
 }
 
 #ifdef USE_WORKSPACE_MODE
-eObjectMode BKE_workspace_object_mode_get(const WorkSpace *workspace)
+eObjectMode BKE_workspace_object_mode_get(const WorkSpace *workspace, const Scene *scene)
 {
-	Base *active_base = BKE_workspace_active_base_get(workspace);
+	Base *active_base = BKE_workspace_active_base_get(workspace, scene);
 	return active_base ? active_base->object->mode : OB_MODE_OBJECT;
 }
-void BKE_workspace_object_mode_set(WorkSpace *workspace, const eObjectMode mode)
+void BKE_workspace_object_mode_set(WorkSpace *workspace, Scene *scene, const eObjectMode mode)
 {
-	Base *active_base = BKE_workspace_active_base_get(workspace);
+	Base *active_base = BKE_workspace_active_base_get(workspace, scene);
 	if (active_base) {
 		active_base->object->mode = mode;
 	}
 }
 #endif
 
-Base *BKE_workspace_active_base_get(const WorkSpace *workspace)
+Base *BKE_workspace_active_base_get(const WorkSpace *workspace, const Scene *scene)
 {
-	return workspace->view_layer->basact;
+	ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene);
+	return view_layer->basact;
 }
 
 ListBase *BKE_workspace_transform_orientations_get(WorkSpace *workspace)
@@ -410,13 +439,14 @@ ListBase *BKE_workspace_transform_orientations_get(WorkSpace *workspace)
 	return &workspace->transform_orientations;
 }
 
-ViewLayer *BKE_workspace_view_layer_get(const WorkSpace *workspace)
+ViewLayer *BKE_workspace_view_layer_get(const WorkSpace *workspace, const Scene *scene)
 {
-	return workspace->view_layer;
+	return workspace_relation_get_data_matching_parent(&workspace->scene_viewlayer_relations, scene);
 }
-void BKE_workspace_view_layer_set(WorkSpace *workspace, ViewLayer *layer)
+void BKE_workspace_view_layer_set(WorkSpace *workspace, ViewLayer *layer, Scene *scene)
 {
 	workspace->view_layer = layer;
+	workspace_relation_ensure_updated(&workspace->scene_viewlayer_relations, scene, layer);
 }
 
 ListBase *BKE_workspace_layouts_get(WorkSpace *workspace)
@@ -486,7 +516,7 @@ void BKE_workspace_update_tagged(struct EvaluationContext *eval_ctx,
                                  WorkSpace *workspace,
                                  Scene *scene)
 {
-	ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace);
+	ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene);
 	struct Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene,
 	                                                      view_layer,
 	                                                      true);
diff --git a/so

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list