[Bf-blender-cvs] [026ac65831f] blender2.8: WorkSpace: Restore saved object-modes again

Campbell Barton noreply at git.blender.org
Thu Feb 22 05:51:13 CET 2018


Commit: 026ac65831f340c4517903d2b7a377a957b55c0a
Author: Campbell Barton
Date:   Thu Feb 22 15:52:30 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB026ac65831f340c4517903d2b7a377a957b55c0a

WorkSpace: Restore saved object-modes again

Was temporarily removed when moving object mode to workspace.

Note: there is an issue where eval_ctx->view_layer is NULL on load,
for now pass a view layer argument, we might wan't to set the value
instead.

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

M	source/blender/blenkernel/intern/scene.c
M	source/blender/editors/util/ed_util.c

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

diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 899a911270f..7032541f90d 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -1376,7 +1376,10 @@ static bool check_rendered_viewport_visible(Main *bmain)
 	return false;
 }
 
-static void prepare_mesh_for_viewport_render(Main *bmain, const EvaluationContext *eval_ctx)
+/* TODO(campbell): shouldn't we be able to use 'eval_ctx->view_layer' here?
+ * Currently this is NULL on load, so don't. */
+static void prepare_mesh_for_viewport_render(
+        Main *bmain, const EvaluationContext *eval_ctx, const ViewLayer *view_layer)
 {
 	/* This is needed to prepare mesh to be used by the render
 	 * engine from the viewport rendering. We do loading here
@@ -1387,7 +1390,8 @@ static void prepare_mesh_for_viewport_render(Main *bmain, const EvaluationContex
 	 * call loading of the edit data for the mesh objects.
 	 */
 
-	Object *obedit = OBEDIT_FROM_EVAL_CTX(eval_ctx);
+	/* Expanded 'OBEDIT_FROM_EVAL_CTX' */
+	Object *obedit = (eval_ctx->object_mode & OB_MODE_EDIT) ? OBACT(view_layer) : NULL;
 	if (obedit) {
 		Mesh *mesh = obedit->data;
 		if ((obedit->type == OB_MESH) &&
@@ -1429,7 +1433,7 @@ void BKE_scene_graph_update_tagged(EvaluationContext *eval_ctx,
 	/* Uncomment this to check if graph was properly tagged for update. */
 	// DEG_debug_graph_relations_validate(depsgraph, bmain, scene);
 	/* Flush editing data if needed. */
-	prepare_mesh_for_viewport_render(bmain, eval_ctx);
+	prepare_mesh_for_viewport_render(bmain, eval_ctx, view_layer);
 	/* Flush recalc flags to dependencies. */
 	DEG_graph_flush_update(bmain, depsgraph);
 	/* Update all objects: drivers, matrices, displists, etc. flags set
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index a5a26cf4d57..562ba2c42b3 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -60,6 +60,8 @@
 #include "BKE_packedFile.h"
 #include "BKE_paint.h"
 #include "BKE_screen.h"
+#include "BKE_workspace.h"
+#include "BKE_layer.h"
 
 #include "ED_armature.h"
 #include "ED_buttons.h"
@@ -90,7 +92,6 @@
 void ED_editors_init(bContext *C)
 {
 	wmWindowManager *wm = CTX_wm_manager(C);
-	Scene *sce = CTX_data_scene(C);
 
 	/* This is called during initialization, so we don't want to store any reports */
 	ReportList *reports = CTX_wm_reports(C);
@@ -98,9 +99,45 @@ 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. */
+	{
+		wmWindow *win_orig = CTX_wm_window(C);
+		CTX_wm_window_set(C, NULL);
+		for (wmWindow *win = wm->windows.first; win; win = win->next) {
+			WorkSpace *workspace = WM_window_get_active_workspace(win);
+			Scene *scene = WM_window_get_active_scene(win);
+			ViewLayer *view_layer = BKE_view_layer_from_workspace_get(scene, workspace);
+			Object *obact = view_layer ? OBACT(view_layer) : NULL;
+			eObjectMode object_mode = workspace->object_mode;
+			workspace->object_mode = OB_MODE_OBJECT;
+			if (view_layer && obact) {
+				const ID *data = obact->data;
+				if (!ELEM(object_mode, OB_MODE_OBJECT, OB_MODE_POSE)) {
+					if (!ID_IS_LINKED(obact) && !(data && ID_IS_LINKED(data))) {
+						CTX_wm_window_set(C, win);
+						ED_object_toggle_modes(C, object_mode);
+						CTX_wm_window_set(C, NULL);
+					}
+				}
+				else if (object_mode == OB_MODE_POSE) {
+					if (!ID_IS_LINKED(obact) && (obact->type == OB_ARMATURE)) {
+						workspace->object_mode = object_mode;
+					}
+				}
+			}
+		}
+		CTX_wm_window_set(C, win_orig);
+	}
+
 	/* image editor paint mode */
-	if (sce) {
-		ED_space_image_paint_update(wm, sce);
+	{
+		Scene *sce = CTX_data_scene(C);
+		if (sce) {
+			ED_space_image_paint_update(wm, sce);
+		}
 	}
 
 	SWAP(int, reports->flag, reports_flag_prev);



More information about the Bf-blender-cvs mailing list