Commit: fe520b76885486b1962e5e61e8584455d5ca83bf
Author: Julian Eisel
Date:   Fri Mar 11 01:32:07 2016 +0100
Branches: HMD_viewport
https://developer.blender.org/rBfe520b76885486b1962e5e61e8584455d5ca83bf

Initial side-by-side HMD view support

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

M       source/blender/editors/space_view3d/view3d_draw.c
M       source/blender/windowmanager/WM_api.h
M       source/blender/windowmanager/intern/wm_draw.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 9b4b934..7f8bac1 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -3731,7 +3731,7 @@ static bool view3d_stereo3d_active(const bContext *C, 
Scene *scene, View3D *v3d,
        if ((scene->r.scemode & R_MULTIVIEW) == 0)
                return false;
 
-       if (WM_stereo3d_enabled(win, true) == false)
+       if (WM_stereo3d_enabled(C, win, true) == false)
                return false;
 
        if ((v3d->camera == NULL) || (v3d->camera->type != OB_CAMERA) || 
rv3d->persp != RV3D_CAMOB)
@@ -4035,10 +4035,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);
        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);
 
        /* if we only redraw render border area, skip opengl draw and also
         * don't do scissor because it's already set */
@@ -4056,6 +4060,10 @@ void view3d_main_region_draw(const bContext *C, ARegion 
*ar)
                        draw_sim_debug_data(scene, v3d, ar);
 
                ED_region_pixelspace(ar);
+
+               if (HMD_view) {
+                       return;
+               }
        }
 
        /* draw viewport using external renderer */
diff --git a/source/blender/windowmanager/WM_api.h 
b/source/blender/windowmanager/WM_api.h
index 58ce7aa..eba411b 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -104,7 +104,7 @@ struct wmWindow *WM_window_open_temp(struct bContext *C, 
const struct rcti *rect
                        /* returns true if draw method is triple buffer */
 bool           WM_is_draw_triple(struct wmWindow *win);
 
-bool           WM_stereo3d_enabled(struct wmWindow *win, bool 
only_fullscreen_test);
+bool           WM_stereo3d_enabled(const struct bContext *C, struct wmWindow 
*win, bool only_fullscreen_test);
 
 
                        /* files */
diff --git a/source/blender/windowmanager/intern/wm_draw.c 
b/source/blender/windowmanager/intern/wm_draw.c
index d20cffe..ba301b9 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -954,7 +954,7 @@ void wm_draw_update(bContext *C)
                        else if (drawmethod == USER_DRAW_OVERLAP_FLIP)
                                wm_method_draw_overlap_all(C, win, 1);
                        else { /* USER_DRAW_TRIPLE */
-                               if ((WM_stereo3d_enabled(win, false)) == false) 
{
+                               if ((WM_stereo3d_enabled(C, win, false)) == 
false) {
                                        wm_method_draw_triple(C, win);
                                }
                                else {
diff --git a/source/blender/windowmanager/intern/wm_stereo.c 
b/source/blender/windowmanager/intern/wm_stereo.c
index 5576a10..b4f1b6a 100644
--- a/source/blender/windowmanager/intern/wm_stereo.c
+++ b/source/blender/windowmanager/intern/wm_stereo.c
@@ -290,9 +290,40 @@ static void wm_method_draw_stereo3d_topbottom(wmWindow 
*win)
                glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
        }
 }
+static void wm_method_draw_stereo3d_hmd(wmWindow *win)
+{
+       wmDrawData *drawdata;
+       int view;
 
-void wm_method_draw_stereo3d(const bContext *UNUSED(C), wmWindow *win)
+       for (view = 0; view < 1; view ++) {
+               drawdata = BLI_findlink(&win->drawdata, (view * 2) + 1);
+               glScissor(0, 0, WM_window_pixels_x(win) * 0.5f, 
WM_window_pixels_y(win));
+               if (view == 0) {
+                       glTranslatef(-WM_window_pixels_x(win) / 2.0f, 0.0f, 
0.0f);
+               }
+               else {
+                       glTranslatef(WM_window_pixels_x(win) / 2.0f, 0.0f, 
0.0f);
+               }
+               wm_triple_draw_textures(win, drawdata->triple, 0.5f);
+       }
+}
+
+BLI_INLINE bool wm_stere3d_is_hmd_view(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));
+}
+
+void wm_method_draw_stereo3d(const bContext *C, wmWindow *win)
 {
+       Scene *scene = CTX_data_scene(C);
+
+       if (wm_stere3d_is_hmd_view(win, scene)) {
+               wm_method_draw_stereo3d_hmd(win);
+               return;
+       }
+
        switch (win->stereo3d_format->display_mode) {
                case S3D_DISPLAY_ANAGLYPH:
                        wm_method_draw_stereo3d_anaglyph(win);
@@ -328,10 +359,13 @@ static bool 
wm_stereo3d_is_fullscreen_required(eStereoDisplayMode stereo_display
                    S3D_DISPLAY_TOPBOTTOM);
 }
 
-bool WM_stereo3d_enabled(wmWindow *win, bool skip_stereo3d_check)
+bool WM_stereo3d_enabled(const bContext *C, wmWindow *win, bool 
skip_stereo3d_check)
 {
        bScreen *screen = win->screen;
 
+       if (wm_stere3d_is_hmd_view(win, CTX_data_scene(C)))
+               return true;
+
        /* some 3d methods change the window arrangement, thus they shouldn't
         * toggle on/off just because there is no 3d elements being drawn */
        if 
(wm_stereo3d_is_fullscreen_required(win->stereo3d_format->display_mode)) {

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

Reply via email to