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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to