[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