[Bf-blender-cvs] [af3917049b] HMD_viewport: Refactor split-view drawing to make popups readable

Julian Eisel noreply at git.blender.org
Mon Mar 6 21:04:53 CET 2017


Commit: af3917049ba345c05c6408024af839d15e6c11f2
Author: Julian Eisel
Date:   Mon Mar 6 20:57:57 2017 +0100
Branches: HMD_viewport
https://developer.blender.org/rBaf3917049ba345c05c6408024af839d15e6c11f2

Refactor split-view drawing to make popups readable

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

M	source/blender/editors/screen/area.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/windowmanager/intern/wm_draw.c

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

diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index a1a96fbf36..226852bcfa 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -473,19 +473,53 @@ void ED_region_set(const bContext *C, ARegion *ar)
 	ED_region_pixelspace(ar);
 }
 
+static void region_draw_view_setup(wmWindowManager *wm, wmWindow *win, ARegion *ar, bool is_popup)
+{
+#ifdef WITH_INPUT_HMD
+	if (!(wm->hmd_view.hmd_win == win && win->screen->is_hmd_running) || is_popup) {
+		/* pass */
+	}
+	else if ((wm->hmd_view.hmd_win == win) && win->screen->is_hmd_running) {
+		ar->winx /= 2;
+		ar->winrct.xmax -= ar->winx;
+		wm_subwindow_rect_set(win, ar->swinid, &ar->winrct);
+	}
+#else
+	UNUSED_VARS(wm, win, ar, is_popup);
+#endif
+}
+static void region_draw_view_reset(wmWindowManager *wm, wmWindow *win, ARegion *ar, bool is_popup)
+{
+#ifdef WITH_INPUT_HMD
+	if (!(wm->hmd_view.hmd_win == win && win->screen->is_hmd_running) || is_popup) {
+		/* pass */
+	}
+	else if ((wm->hmd_view.hmd_win == win) && win->screen->is_hmd_running) {
+		ar->winrct.xmax += ar->winx;
+		ar->winx *= 2;
+		wm_subwindow_rect_set(win, ar->swinid, &ar->winrct);
+	}
+#else
+	UNUSED_VARS(wm, win, ar, is_popup);
+#endif
+}
 
 /* only exported for WM */
 void ED_region_do_draw(bContext *C, ARegion *ar)
 {
+	wmWindowManager *wm = CTX_wm_manager(C);
 	wmWindow *win = CTX_wm_window(C);
 	ScrArea *sa = CTX_wm_area(C);
 	ARegionType *at = ar->type;
+	const bool is_popup = ar == CTX_wm_menu(C);
 	bool scissor_pad;
 
 	/* see BKE_spacedata_draw_locks() */
 	if (at->do_lock)
 		return;
 
+	region_draw_view_setup(wm, win, ar, is_popup);
+
 	/* if no partial draw rect set, full rect */
 	if (ar->drawrct.xmin == ar->drawrct.xmax) {
 		ar->drawrct = ar->winrct;
@@ -545,6 +579,8 @@ void ED_region_do_draw(bContext *C, ARegion *ar)
 			region_draw_emboss(ar, &ar->winrct);
 		}
 	}
+
+	region_draw_view_reset(wm, win, ar, is_popup);
 }
 
 /* **********************************
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 557ba00bd4..84523fc828 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -3715,9 +3715,6 @@ static void view3d_hmd_view_setup(Scene *scene, View3D *v3d, ARegion *ar)
 	float projmat[4][4];
 	float modelviewmat[4][4];
 
-	/* hmd view uses half screen width, this makes sure winmatrix is calculated correctly for that */
-	ar->winx /= 2;
-
 	/* update 3d view matrices before applying matrices from HMD */
 	view3d_viewmatrix_set(scene, v3d, rv3d);
 	view3d_winmatrix_set(ar, v3d, NULL);
@@ -3726,8 +3723,6 @@ static void view3d_hmd_view_setup(Scene *scene, View3D *v3d, ARegion *ar)
 
 	/* setup view with adjusted matrices */
 	view3d_main_region_setup_view(scene, v3d, ar, modelviewmat, projmat);
-
-	ar->winx *= 2;
 }
 
 static void view3d_hmd_view_mirrored_setup(wmWindowManager *wm, Scene *scene, View3D *v3d, ARegion *ar)
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index 7a9fe99a3e..dbdd7d0384 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -826,18 +826,16 @@ static void wm_method_draw_triple_multiview(bContext *C, wmWindow *win, StereoVi
 static void wm_method_draw_triple_hmd_view(wmWindow *win)
 {
 	wmDrawData *drawdata;
-	int view;
 
-	for (view = 0; view < 2; view++) {
+	for (int view = 0; view < 2; view++) {
 		const int win_x_h = WM_window_pixels_x(win) / 2;
-		const int win_y = WM_window_pixels_y(win);
 
 		drawdata = BLI_findlink(&win->drawdata, (view * 2) + 1);
 
-		/* OpenHMD sends us matrices for one eye (half screen), but we draw viewport over
-		 * entire screen. Using glViewport compensates that and prevents streched view. */
-		glViewport(view * win_x_h, 0, win_x_h, win_y);
+		glPushMatrix();
+		glTranslatef(view * win_x_h, 0.0f, 0.0f);
 		wm_triple_draw_textures(win, drawdata->triple, 1.0f, false);
+		glPopMatrix();
 	}
 }




More information about the Bf-blender-cvs mailing list