[Bf-blender-cvs] [fdb0d37] HMD_viewport: Remove scene level HMDVIEW_SESSION_RUNNING flag

Julian Eisel noreply at git.blender.org
Tue Nov 15 23:31:18 CET 2016


Commit: fdb0d37bdfeaf5f8cb67ccb0abb3829fab30fb69
Author: Julian Eisel
Date:   Tue Nov 15 23:30:05 2016 +0100
Branches: HMD_viewport
https://developer.blender.org/rBfdb0d37bdfeaf5f8cb67ccb0abb3829fab30fb69

Remove scene level HMDVIEW_SESSION_RUNNING flag

Also separated HMD view drawing from stereo3d drawing some more.

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

M	release/scripts/startup/bl_ui/properties_render_layer.py
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesdna/DNA_screen_types.h
M	source/blender/makesrna/intern/rna_scene.c
M	source/blender/makesrna/intern/rna_screen.c
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_draw.c
M	source/blender/windowmanager/intern/wm_operators.c
M	source/blender/windowmanager/intern/wm_stereo.c
M	source/blender/windowmanager/wm.h

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

diff --git a/release/scripts/startup/bl_ui/properties_render_layer.py b/release/scripts/startup/bl_ui/properties_render_layer.py
index a9602cc..16b7662 100644
--- a/release/scripts/startup/bl_ui/properties_render_layer.py
+++ b/release/scripts/startup/bl_ui/properties_render_layer.py
@@ -237,11 +237,11 @@ class RENDERLAYER_PT_hmd(RenderLayerButtonsPanel, Panel):
 
         scene = context.scene
         wm = context.window_manager
+        session_running = wm.is_hmd_session_running;
 
-        running = scene.hmd_running
         text_win = "Close HMD Window" if wm.has_hmd_window else "Open HMD Window"
-        text_run = "Stop Session" if running else "Start Session"
-        icon = 'PAUSE' if running else 'PLAY'
+        text_run = "Stop Session" if session_running else "Start Session"
+        icon = 'PAUSE' if session_running else 'PLAY'
 
         row = layout.row(align=True)
         row.operator("wm.hmd_view_toggle", text=text_win)
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 7a38409..00fe5ea 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -3608,7 +3608,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(C, win, true) == false)
+	if (WM_stereo3d_enabled(win, true) == false)
 		return false;
 
 	if ((v3d->camera == NULL) || (v3d->camera->type != OB_CAMERA) || rv3d->persp != RV3D_CAMOB)
@@ -3626,10 +3626,10 @@ static bool view3d_stereo3d_active(const bContext *C, Scene *scene, View3D *v3d,
 
 #ifdef WITH_INPUT_HMD
 
-static bool view3d_hmd_view_active(wmWindowManager *wm, wmWindow *win, Scene *scene)
+static bool view3d_hmd_view_active(wmWindowManager *wm, wmWindow *win)
 {
 	return ((wm->win_hmd == win) &&
-	        (scene->hmd_settings.flag & HMDVIEW_SESSION_RUNNING) &&
+	        (wm->win_hmd->screen->is_hmd_running) &&
 	        (U.hmd_settings.device > -1));
 }
 
@@ -3774,7 +3774,7 @@ static void view3d_main_region_draw_objects(
 
 	/* setup the view matrix */
 #ifdef WITH_INPUT_HMD
-	if (view3d_hmd_view_active(CTX_wm_manager(C), win, scene)) {
+	if (view3d_hmd_view_active(CTX_wm_manager(C), win)) {
 		view3d_hmd_view_setup(scene, v3d, ar);
 	}
 	else
@@ -3984,7 +3984,7 @@ void view3d_main_region_draw(const bContext *C, ARegion *ar)
 		ED_region_pixelspace(ar);
 
 #ifdef WITH_INPUT_HMD
-		if (view3d_hmd_view_active(CTX_wm_manager(C), CTX_wm_window(C), scene)) {
+		if (view3d_hmd_view_active(CTX_wm_manager(C), CTX_wm_window(C))) {
 			return;
 		}
 #endif
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index d8e80be..765dd73 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1581,12 +1581,7 @@ typedef struct DisplaySafeAreas {
  */
 struct HMDViewSettings {
 	char view_shade; /* rna_enum_viewport_shade_items */
-	char flag, pad[2];
-};
-
-/* HMDViewSettings.flag */
-enum {
-	HMDVIEW_SESSION_RUNNING = (1 << 0),
+	char pad[3];
 };
 
 /* *************************************************************** */
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index e208ef3..2a5845c 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -69,7 +69,8 @@ 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 */
-	char pad[6];
+	char is_hmd_running;				/* is this screen running an HMD session? */
+	char pad[5];
 	
 	short mainwin;						/* screensize subwindow, for screenedges and global menus */
 	short subwinactive;					/* active subwindow */
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 75144b7..276b5b3 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -7301,12 +7301,6 @@ void RNA_def_scene(BlenderRNA *brna)
 	RNA_def_property_ui_text(prop, "Dependency Graph", "Dependencies in the scene data");
 
 #ifdef WITH_INPUT_HMD
-	prop = RNA_def_property(srna, "hmd_running", PROP_BOOLEAN, PROP_NONE);
-	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-	RNA_def_property_boolean_sdna(prop, NULL, "hmd_settings.flag", HMDVIEW_SESSION_RUNNING);
-	RNA_def_property_ui_text(prop, "HMD Running", "");
-	RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
-
 	prop = RNA_def_property(srna, "hmd_view_shade", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_sdna(prop, NULL, "hmd_settings.view_shade");
 	RNA_def_property_enum_items(prop, rna_enum_viewport_shade_items);
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index 43d5cda..6367c58 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -402,6 +402,12 @@ static void rna_def_screen(BlenderRNA *brna)
 	RNA_def_property_boolean_funcs(prop, "rna_Screen_fullscreen_get", NULL);
 	RNA_def_property_ui_text(prop, "Maximize", "An area is maximized, filling this screen");
 
+#ifdef WITH_INPUT_HMD
+	prop = RNA_def_property(srna, "is_hmd_running", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	RNA_def_property_ui_text(prop, "HMD Session Running", "This screen is running an HMD session");
+#endif
+
 	/* Define Anim Playback Areas */
 	prop = RNA_def_property(srna, "use_play_top_left_3d_editor", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_REGION);
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 2e08a3d..37fe1f5 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -939,11 +939,19 @@ static void rna_wmClipboard_set(PointerRNA *UNUSED(ptr), const char *value)
 }
 
 #ifdef WITH_INPUT_HMD
+
 static int rna_has_hmd_window_get(PointerRNA *ptr)
 {
 	wmWindowManager *wm = ptr->data;
 	return (wm->win_hmd != NULL);
 }
+
+static int rna_is_hmd_session_running_get(PointerRNA *ptr)
+{
+	wmWindowManager *wm = ptr->data;
+	return (wm->win_hmd && wm->win_hmd->screen->is_hmd_running == true);
+}
+
 #endif /* WITH_INPUT_HMD */
 
 #ifdef WITH_PYTHON
@@ -2027,6 +2035,10 @@ static void rna_def_windowmanager(BlenderRNA *brna)
 	prop = RNA_def_property(srna, "has_hmd_window", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 	RNA_def_property_boolean_funcs(prop, "rna_has_hmd_window_get", NULL);
+
+	prop = RNA_def_property(srna, "is_hmd_session_running", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	RNA_def_property_boolean_funcs(prop, "rna_is_hmd_session_running_get", NULL);
 #endif
 
 	RNA_api_wm(srna);
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 6e34377..458866a 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -109,7 +109,7 @@ void WM_window_fullscreen_toggle(const struct wmWindow *win, const bool force_fu
 			/* returns true if draw method is triple buffer */
 bool		WM_is_draw_triple(struct wmWindow *win);
 
-bool		WM_stereo3d_enabled(const struct bContext *C, struct wmWindow *win, bool only_fullscreen_test);
+bool		WM_stereo3d_enabled(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 b1520e7..63cbdd1 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -810,6 +810,61 @@ static void wm_method_draw_triple_multiview(bContext *C, wmWindow *win, StereoVi
 	wm_triple_copy_textures(win, triple_all);
 }
 
+#ifdef WITH_INPUT_HMD
+
+static void wm_method_draw_triple_hmd_view(wmWindow *win)
+{
+	wmDrawData *drawdata;
+	int view;
+
+	for (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);
+		wm_triple_draw_textures(win, drawdata->triple, 1.0f);
+	}
+}
+
+#endif /* WITH_INPUT_HMD */
+
+static void wm_method_draw_triple_all(bContext *C, wmWindow *win)
+{
+	wmWindowManager *wm = CTX_wm_manager(C);
+	const bool is_stereo3d_enabled = WM_stereo3d_enabled(win, false);
+	const bool is_hmd_view =
+#ifdef WITH_INPUT_HMD
+	        wm->win_hmd == win && win->screen->is_hmd_running;
+#else
+	        false;
+#endif
+	const bool draw_multiview_lr = is_stereo3d_enabled || is_hmd_view;
+
+
+	if (draw_multiview_lr) {
+		wm_method_draw_triple_multiview(C, win, STEREO_LEFT_ID);
+		wm_method_draw_triple_multiview(C, win, STEREO_RIGHT_ID);
+	}
+
+	if (is_stereo3d_enabled) {
+		wm_method_draw_stereo3d(win);
+	}
+	else if (is_hmd_view) {
+#ifdef WITH_INPUT_HMD
+		wm_method_draw_triple_hmd_view(win);
+#else
+		UNUSED_VARS(wm);
+#endif
+	}
+	else {
+		wm_method_draw_triple(C, win);
+	}
+}
+
 /****************** main update call **********************/
 
 /* quick test to prevent changing window drawable */
@@ -949,23 +1004,21 @@ void wm_draw_update(bContext *C)
 
 			drawmethod = wm_automatic_draw_method(win);
 
-			if (win->drawfail)
+			if (win->drawfail) {
 				wm_method_draw_overlap_all(C, win, 0);
-			else if (drawmethod == USER_DRAW_FULL)
+			}
+			else if (drawmethod == USER_DRAW_FULL) {
 				wm_method_draw_full(C, win);
-			else if (drawmethod == USER_DRAW_OVERLAP)
+			}
+			else if (drawmethod == USER_DRAW_OVERLAP) {
 				wm_method_draw_overlap_all(C, win, 0);
-			else if (drawmethod == USER_DRAW_OVERLAP_FLIP)
+			}
+			else if (drawmethod == USER_DRAW_OVERLAP_FLIP) {
 		

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list