[Bf-blender-cvs] [5ec1249] HMD_viewport: Store HMD Window in Window Manager, avoids lookups and screen flag

Julian Eisel noreply at git.blender.org
Wed Mar 16 16:53:11 CET 2016


Commit: 5ec12497697fa9356256b7ea957f46a11fbf7f42
Author: Julian Eisel
Date:   Fri Mar 11 16:25:27 2016 +0100
Branches: HMD_viewport
https://developer.blender.org/rB5ec12497697fa9356256b7ea957f46a11fbf7f42

Store HMD Window in Window Manager, avoids lookups and screen flag

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

M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_edit.c
M	source/blender/makesdna/DNA_screen_types.h
M	source/blender/makesdna/DNA_windowmanager_types.h
M	source/blender/windowmanager/intern/wm_operators.c
M	source/blender/windowmanager/intern/wm_stereo.c

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

diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index b943774..f17006b 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -4028,14 +4028,14 @@ static void view3d_main_region_draw_info(const bContext *C, Scene *scene,
 void view3d_main_region_draw(const bContext *C, ARegion *ar)
 {
 	Scene *scene = CTX_data_scene(C);
-	wmWindow *win = CTX_wm_window(C);
+	wmWindowManager *wm = CTX_wm_manager(C);
 	View3D *v3d = CTX_wm_view3d(C);
 	const char *grid_unit = NULL;
 	rcti border_rect;
 	bool render_border, clip_border;
-	const bool HMD_view = (scene->r.views_format == SCE_VIEWS_FORMAT_HMD) &&
-	                      (scene->flag & SCE_HMD_RUNNING) &&
-	                      (win->screen->flag & SCREEN_FLAG_HMD_SCREEN);
+	const bool HMD_view = ((wm->win_hmd == CTX_wm_window(C)) &&
+	                       (scene->r.views_format == SCE_VIEWS_FORMAT_HMD) &&
+	                       (scene->flag & SCE_HMD_RUNNING));
 
 	/* if we only redraw render border area, skip opengl draw and also
 	 * don't do scissor because it's already set */
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index a4a5135..5c1fc5f 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -4826,23 +4826,6 @@ static void hmd_session_refresh(bContext *C, wmWindow *hmd_win, Scene *scene, HM
 	ED_region_tag_redraw(ar);
 }
 
-static wmWindow *hmd_window_find(const bContext *C)
-{
-	wmWindowManager *wm = CTX_wm_manager(C);
-	wmWindow *hmd_win = CTX_wm_window(C);
-
-	if (hmd_win->screen->flag & SCREEN_FLAG_HMD_SCREEN)
-		return hmd_win;
-
-	for (hmd_win = wm->windows.first; hmd_win; hmd_win = hmd_win->next) {
-		if (hmd_win->screen->flag & SCREEN_FLAG_HMD_SCREEN) {
-			return hmd_win;
-		}
-	}
-
-	return NULL;
-}
-
 static void hmd_run_exit(wmWindow *hmd_win, Scene *scene)
 {
 	scene->flag &= ~SCE_HMD_RUNNING;
@@ -4851,12 +4834,13 @@ static void hmd_run_exit(wmWindow *hmd_win, Scene *scene)
 
 static int hmd_session_run_poll(bContext *C)
 {
-	return (hmd_window_find(C) != NULL);
+	return (CTX_wm_manager(C)->win_hmd != NULL);
 }
 
-static int hmd_session_run_modal(bContext *C, wmOperator *op, const wmEvent *event)
+static int hmd_session_run_modal(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
 {
-	wmWindow *hmd_win = op->customdata;
+	wmWindowManager *wm = CTX_wm_manager(C);
+	wmWindow *hmd_win = wm->win_hmd;
 	Scene *scene = CTX_data_scene(C);
 
 	switch (event->type) {
@@ -4874,7 +4858,8 @@ static int hmd_session_run_modal(bContext *C, wmOperator *op, const wmEvent *eve
 static int hmd_session_run_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
 {
 	Scene *scene = CTX_data_scene(C);
-	wmWindow *hmd_win = hmd_window_find(C);
+	wmWindowManager *wm = CTX_wm_manager(C);
+	wmWindow *hmd_win = wm->win_hmd;
 	const bool was_hmd_running = (scene->flag & SCE_HMD_RUNNING);
 
 	if (!hmd_win) {
@@ -4917,7 +4902,6 @@ static int hmd_session_run_invoke(bContext *C, wmOperator *op, const wmEvent *UN
 				rv3d->persp = RV3D_CAMOB;
 		}
 
-		op->customdata = hmd_win;
 		WM_window_fullscreen_toggle(hmd_win, true, false);
 
 		WM_event_add_modal_handler(C, op);
@@ -4944,7 +4928,8 @@ static int hmd_session_refresh_invoke(bContext *C, wmOperator *UNUSED(op), const
 	if ((scene->flag & SCE_HMD_RUNNING) == 0)
 		return OPERATOR_CANCELLED; /* no pass through, we don't need to keep that event in queue */
 
-	wmWindow *hmd_win = hmd_window_find(C);
+	wmWindowManager *wm = CTX_wm_manager(C);
+	wmWindow *hmd_win = wm->win_hmd;
 	hmd_session_refresh(C, hmd_win, CTX_data_scene(C), event->customdata);
 	return OPERATOR_FINISHED;
 }
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 548e80a..1c11350 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -69,8 +69,7 @@ typedef struct bScreen {
 	char swap;							/* indicator to survive swap-exchange systems */
 	char skip_handling;					/* set to delay screen handling after switching back from maximized area */
 	char scrubbing;						/* set when scrubbing to avoid some costly updates */
-	short flag;
-	char pad[4];
+	char pad[6];
 	
 	short mainwin;						/* screensize subwindow, for screenedges and global menus */
 	short subwinactive;					/* active subwindow */
@@ -79,10 +78,6 @@ typedef struct bScreen {
 	void *context;						/* context callback */
 } bScreen;
 
-enum eScreenFlag {
-	SCREEN_FLAG_HMD_SCREEN = (1 << 0),
-};
-
 typedef struct ScrVert {
 	struct ScrVert *next, *prev, *newv;
 	vec2s vec;
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index 14400c8..30980e9 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -128,6 +128,7 @@ typedef struct wmWindowManager {
 	ID id;
 
 	struct wmWindow *windrawable, *winactive;  /* separate active from drawable */
+	struct wmWindow *win_hmd;         /* HMD (virtual reality) window */
 	ListBase windows;
 
 	int initialized;                  /* set on file read */
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 9768673..655e4ed 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -5099,17 +5099,12 @@ static void WM_OT_stereo3d_set(wmOperatorType *ot)
 
 static int wm_hmd_view_open_poll(bContext *C)
 {
-	wmWindowManager *wm = CTX_wm_manager(C);
-	for (wmWindow *win = wm->windows.first; win; win = win->next) {
-		if (UNLIKELY(win->screen->flag & SCREEN_FLAG_HMD_SCREEN)) {
-			return false;
-		}
-	}
-	return true;
+	return (CTX_wm_manager(C)->win_hmd == NULL);
 }
 
 static int wm_hmd_view_open_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event))
 {
+	wmWindowManager *wm = CTX_wm_manager(C);
 	wmWindow *win = wm_window_copy_test(C, CTX_wm_window(C));
 	ScrArea *sa;
 
@@ -5124,6 +5119,7 @@ static int wm_hmd_view_open_invoke(bContext *C, wmOperator *UNUSED(op), const wm
 		BLI_assert(0);
 		return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
 	}
+	wm->win_hmd = win;
 	wmWindow *prevwin = CTX_wm_window(C);
 	ScrArea *prevsa = CTX_wm_area(C);
 	ARegion *prevar = CTX_wm_region(C);
@@ -5134,7 +5130,6 @@ static int wm_hmd_view_open_invoke(bContext *C, wmOperator *UNUSED(op), const wm
 	ED_screen_state_toggle(C, win, sa, SCREENFULL);
 
 	ED_area_tag_redraw(sa);
-	win->screen->flag |= SCREEN_FLAG_HMD_SCREEN;
 
 	/* It is possible that new layers becomes visible. */
 	if (sa->spacetype == SPACE_VIEW3D) {
diff --git a/source/blender/windowmanager/intern/wm_stereo.c b/source/blender/windowmanager/intern/wm_stereo.c
index b4f1b6a..3f3f6eb 100644
--- a/source/blender/windowmanager/intern/wm_stereo.c
+++ b/source/blender/windowmanager/intern/wm_stereo.c
@@ -308,18 +308,18 @@ static void wm_method_draw_stereo3d_hmd(wmWindow *win)
 	}
 }
 
-BLI_INLINE bool wm_stere3d_is_hmd_view(const wmWindow *win, const Scene *scene)
+BLI_INLINE bool wm_stere3d_is_hmd_view(const wmWindowManager *wm, const wmWindow *win, const Scene *scene)
 {
-	return ((scene->r.views_format == SCE_VIEWS_FORMAT_HMD) &&
-	        (scene->flag & SCE_HMD_RUNNING) &&
-	        (win->screen->flag & SCREEN_FLAG_HMD_SCREEN));
+	return ((wm->win_hmd == win) &&
+	        (scene->r.views_format == SCE_VIEWS_FORMAT_HMD) &&
+	        (scene->flag & SCE_HMD_RUNNING));
 }
 
 void wm_method_draw_stereo3d(const bContext *C, wmWindow *win)
 {
 	Scene *scene = CTX_data_scene(C);
 
-	if (wm_stere3d_is_hmd_view(win, scene)) {
+	if (wm_stere3d_is_hmd_view(CTX_wm_manager(C), win, scene)) {
 		wm_method_draw_stereo3d_hmd(win);
 		return;
 	}
@@ -363,7 +363,7 @@ bool WM_stereo3d_enabled(const bContext *C, wmWindow *win, bool skip_stereo3d_ch
 {
 	bScreen *screen = win->screen;
 
-	if (wm_stere3d_is_hmd_view(win, CTX_data_scene(C)))
+	if (wm_stere3d_is_hmd_view(CTX_wm_manager(C), win, CTX_data_scene(C)))
 		return true;
 
 	/* some 3d methods change the window arrangement, thus they shouldn't




More information about the Bf-blender-cvs mailing list