[Bf-blender-cvs] [adfc9b8] workspaces: Make window-level scene switching work

Julian Eisel noreply at git.blender.org
Thu Dec 8 20:24:54 CET 2016


Commit: adfc9b85509e15e3204c796b6a8a7d2c4cf21489
Author: Julian Eisel
Date:   Thu Dec 8 20:21:31 2016 +0100
Branches: workspaces
https://developer.blender.org/rBadfc9b85509e15e3204c796b6a8a7d2c4cf21489

Make window-level scene switching work

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

M	source/blender/blenkernel/intern/scene.c
M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/include/ED_util.h
M	source/blender/editors/screen/screen_edit.c
M	source/blender/editors/screen/screen_ops.c
M	source/blender/editors/space_outliner/outliner_select.c
M	source/blender/editors/space_outliner/outliner_tools.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/editors/util/ed_util.c
M	source/blender/makesrna/intern/rna_main_api.c
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_window.c
M	source/blenderplayer/bad_level_call_stubs/stubs.c

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

diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 46e0f6b..109863f 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -827,7 +827,7 @@ Base *BKE_scene_base_find(Scene *scene, Object *ob)
 /**
  * Sets the active scene, mainly used when running in background mode (``--scene`` command line argument).
  * This is also called to set the scene directly, bypassing windowing code.
- * Otherwise #ED_screen_set_scene is used when changing scenes by the user.
+ * Otherwise #WM_window_set_active_scene is used when changing scenes by the user.
  */
 void BKE_scene_set_background(Main *bmain, Scene *scene)
 {
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index b58efc1..3501005 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -106,7 +106,7 @@ void    ED_screen_draw(struct wmWindow *win);
 void    ED_screen_refresh(struct wmWindowManager *wm, struct wmWindow *win);
 void    ED_screen_do_listen(struct bContext *C, struct wmNotifier *note);
 bool    ED_screen_set(struct bContext *C, struct bScreen *sc);
-void    ED_screen_set_scene(struct bContext *C, struct bScreen *screen, struct Scene *scene);
+void    ED_screen_update_after_scene_change(const struct bScreen *screen, struct Scene *scene_new);
 bool    ED_screen_delete_scene(struct bContext *C, struct Scene *scene);
 void    ED_screen_set_subwinactive(struct bContext *C, struct wmEvent *event);
 void    ED_screen_exit(struct bContext *C, struct wmWindow *window, struct bScreen *screen);
diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h
index a4afa95..4188f0a 100644
--- a/source/blender/editors/include/ED_util.h
+++ b/source/blender/editors/include/ED_util.h
@@ -43,6 +43,11 @@ void    ED_editors_exit(struct bContext *C);
 
 bool    ED_editors_flush_edits(const struct bContext *C, bool for_render);
 
+/* editor level scene utils, could move these into own file */
+void    ED_scene_exit(struct bContext *C);
+void    ED_scene_changed_update(struct Main *bmain, struct bContext *C, struct Scene *scene_new,
+                                const struct bScreen *active_screen);
+
 void    ED_spacedata_id_remap(struct ScrArea *sa, struct SpaceLink *sl, struct ID *old_id, struct ID *new_id);
 
 void    ED_OT_flush_edits(struct wmOperatorType *ot);
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 4caa3fb..0d73428 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -1611,36 +1611,13 @@ bool ED_screen_set(bContext *C, bScreen *sc)
 	return true;
 }
 
-static bool ed_screen_used(wmWindowManager *wm, bScreen *sc)
-{
-	wmWindow *win;
-
-	for (win = wm->windows.first; win; win = win->next) {
-		const bScreen *win_screen = WM_window_get_active_screen(win);
-
-		if (win_screen == sc) {
-			return true;
-		}
-
-		if (ELEM(win_screen->state, SCREENMAXIMIZED, SCREENFULL)) {
-			const ScrArea *sa = win_screen->areabase.first;
-
-			if (sa->full == sc) {
-				return true;
-			}
-		}
-	}
-
-	return false;
-}
-
-static void ed_screen_set_3dview_camera(Scene *scene, bScreen *sc, ScrArea *sa, View3D *v3d)
+static void screen_set_3dview_camera(Scene *scene, ScrArea *sa, View3D *v3d)
 {
 	/* fix any cameras that are used in the 3d view but not in the scene */
 	BKE_screen_view3d_sync(v3d, scene);
 
 	if (!v3d->camera || !BKE_scene_base_find(scene, v3d->camera)) {
-		v3d->camera = BKE_scene_camera_find(sc->scene);
+		v3d->camera = BKE_scene_camera_find(scene);
 		// XXX if (sc == curscreen) handle_view3d_lock();
 		if (!v3d->camera) {
 			ARegion *ar;
@@ -1664,65 +1641,16 @@ static void ed_screen_set_3dview_camera(Scene *scene, bScreen *sc, ScrArea *sa,
 	}
 }
 
-/* only call outside of area/region loops */
-void ED_screen_set_scene(bContext *C, bScreen *screen, Scene *scene)
+void ED_screen_update_after_scene_change(const bScreen *screen, Scene *scene_new)
 {
-	Main *bmain = CTX_data_main(C);
-	bScreen *sc;
-
-	if (screen == NULL)
-		return;
-	
-	if (ed_screen_used(CTX_wm_manager(C), screen))
-		ED_object_editmode_exit(C, EM_FREEDATA | EM_DO_UNDO);
-
-	for (sc = bmain->screen.first; sc; sc = sc->id.next) {
-		if ((U.flag & USER_SCENEGLOBAL) || sc == screen) {
-			
-			if (scene != sc->scene) {
-				/* all areas endlocalview */
-				// XXX	ScrArea *sa = sc->areabase.first;
-				//	while (sa) {
-				//		endlocalview(sa);
-				//		sa = sa->next;
-				//	}
-				sc->scene = scene;
-			}
-			
-		}
-	}
-	
-	//  copy_view3d_lock(0);	/* space.c */
-	
-	/* are there cameras in the views that are not in the scene? */
-	for (sc = bmain->screen.first; sc; sc = sc->id.next) {
-		if ((U.flag & USER_SCENEGLOBAL) || sc == screen) {
-			ScrArea *sa = sc->areabase.first;
-			while (sa) {
-				SpaceLink *sl = sa->spacedata.first;
-				while (sl) {
-					if (sl->spacetype == SPACE_VIEW3D) {
-						View3D *v3d = (View3D *) sl;
-						ed_screen_set_3dview_camera(scene, sc, sa, v3d);
-
-					}
-					sl = sl->next;
-				}
-				sa = sa->next;
+	for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+		for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
+			if (sl->spacetype == SPACE_VIEW3D) {
+				View3D *v3d = (View3D *)sl;
+				screen_set_3dview_camera(scene_new, sa, v3d);
 			}
 		}
 	}
-	
-	CTX_data_scene_set(C, scene);
-	BKE_scene_set_background(bmain, scene);
-	DAG_on_visible_update(bmain, false);
-	
-	ED_render_engine_changed(bmain);
-	ED_update_for_newframe(bmain, scene, 1);
-	
-	/* complete redraw */
-	WM_event_add_notifier(C, NC_WINDOW, NULL);
-	
 }
 
 /**
@@ -1732,6 +1660,7 @@ void ED_screen_set_scene(bContext *C, bScreen *screen, Scene *scene)
 bool ED_screen_delete_scene(bContext *C, Scene *scene)
 {
 	Main *bmain = CTX_data_main(C);
+	wmWindow *win = CTX_wm_window(C);
 	Scene *newscene;
 
 	if (scene->id.prev)
@@ -1741,7 +1670,7 @@ bool ED_screen_delete_scene(bContext *C, Scene *scene)
 	else
 		return false;
 
-	ED_screen_set_scene(C, CTX_wm_screen(C), newscene);
+	WM_window_set_active_scene(bmain, C, win, newscene);
 
 	BKE_libblock_remap(bmain, scene, newscene, ID_REMAP_SKIP_INDIRECT_USAGE | ID_REMAP_SKIP_NEVER_NULL_USAGE);
 
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 46c1dc3..a0df01a 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -3930,6 +3930,7 @@ static int scene_new_exec(bContext *C, wmOperator *op)
 {
 	Scene *newscene, *scene = CTX_data_scene(C);
 	Main *bmain = CTX_data_main(C);
+	wmWindow *win = CTX_wm_window(C);
 	int type = RNA_enum_get(op->ptr, "type");
 
 	if (type == SCE_COPY_NEW) {
@@ -3947,9 +3948,9 @@ static int scene_new_exec(bContext *C, wmOperator *op)
 			ED_object_single_users(bmain, newscene, true, true);
 		}
 	}
-	
-	ED_screen_set_scene(C, CTX_wm_screen(C), newscene);
-	
+
+	WM_window_set_active_scene(bmain, C, win, newscene);
+
 	WM_event_add_notifier(C, NC_SCENE | ND_SCENEBROWSE, newscene);
 	
 	return OPERATOR_FINISHED;
diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c
index a9f834c..a1c0ff1 100644
--- a/source/blender/editors/space_outliner/outliner_select.c
+++ b/source/blender/editors/space_outliner/outliner_select.c
@@ -159,7 +159,7 @@ static eOLDrawState tree_element_set_active_object(
 	
 	sce = (Scene *)outliner_search_back(soops, te, ID_SCE);
 	if (sce && scene != sce) {
-		ED_screen_set_scene(C, CTX_wm_screen(C), sce);
+		WM_window_set_active_scene(CTX_data_main(C), C, CTX_wm_window(C), sce);
 		scene = sce;
 	}
 	
@@ -391,7 +391,7 @@ static eOLDrawState tree_element_active_world(
 	if (set != OL_SETSEL_NONE) {
 		/* make new scene active */
 		if (sce && scene != sce) {
-			ED_screen_set_scene(C, CTX_wm_screen(C), sce);
+			WM_window_set_active_scene(CTX_data_main(C), C, CTX_wm_window(C), sce);
 		}
 	}
 	
@@ -841,7 +841,7 @@ static void outliner_item_activate(
 		/* editmode? */
 		if (te->idcode == ID_SCE) {
 			if (scene != (Scene *)tselem->id) {
-				ED_screen_set_scene(C, CTX_wm_screen(C), (Scene *)tselem->id);
+				WM_window_set_active_scene(CTX_data_main(C), C, CTX_wm_window(C), (Scene *)tselem->id);
 			}
 		}
 		else if (te->idcode == ID_GR) {
diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c
index d6300b7..320079a 100644
--- a/source/blender/editors/space_outliner/outliner_tools.c
+++ b/source/blender/editors/space_outliner/outliner_tools.c
@@ -561,7 +561,7 @@ void outliner_do_object_operation_ex(
 				// when objects selected in other scenes... dunno if that should be allowed
 				Scene *scene_owner = (Scene *)outliner_search_back(soops, te, ID_SCE);
 				if (scene_owner && scene_act != scene_owner) {
-					ED_screen_set_scene(C, CTX_wm_screen(C), scene_owner);
+					WM_window_set_active_scene(CTX_data_main(C), C, CTX_wm_window(C), scene_owner);
 				}
 				/* important to use 'scene_owner' not scene_act else deleting objects can crash.
 				 * only use 'scene_act' when 'scene_owner' is NULL, which can happen when the
@@ -915,6 +915,7 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op)
 {
 	Main *bmain = CTX_data_main(C);
 	Scene *scene = CTX_data_scene(C);
+	wmWindow *win = CTX_wm_window(C);
 	SpaceOops *soops = CTX_wm_space_outliner(C);
 	int event;
 	const char *str = NULL;
@@ -929,7 +930,7 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op)
 		Scene *sce = scene;  // to be able to delete, scenes are set...
 		outliner_do_object_operation(C, op->reports, scene, soops, &soops->tree, object_select_cb);
 		if (scene != sce) {
-			ED_screen_set_scene(C, CTX_wm_screen(C), sce);
+			WM_window_set_active_scene(bmain, C, win, sce);
 		}
 		
 		str = "Select Objects";
@@ -939,8 +940,8 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op)
 		Scene *sce = scene;  // to be able to delete, scenes are set...
 		outliner_do_object_operation_ex(C, op->reports, scene, soops, &soops-

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list