[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