[Bf-blender-cvs] [fe520b7] HMD_viewport: Initial side-by-side HMD view support
Julian Eisel
noreply at git.blender.org
Wed Mar 16 16:10:57 CET 2016
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)) {
More information about the Bf-blender-cvs
mailing list