[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