[Bf-blender-cvs] [5ff399d] HMD_viewport: Let button to open HMD window close the win if it's already opened

Julian Eisel noreply at git.blender.org
Wed Mar 16 16:53:13 CET 2016


Commit: 5ff399d69a65217ea73e5a0f15cdfa371c36a56f
Author: Julian Eisel
Date:   Fri Mar 11 18:10:18 2016 +0100
Branches: HMD_viewport
https://developer.blender.org/rB5ff399d69a65217ea73e5a0f15cdfa371c36a56f

Let button to open HMD window close the win if it's already opened

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

M	release/scripts/startup/bl_ui/properties_render_layer.py
M	source/blender/editors/space_view3d/view3d_edit.c
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/windowmanager/intern/wm_operators.c

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

diff --git a/release/scripts/startup/bl_ui/properties_render_layer.py b/release/scripts/startup/bl_ui/properties_render_layer.py
index d51a5d7..2ac0913 100644
--- a/release/scripts/startup/bl_ui/properties_render_layer.py
+++ b/release/scripts/startup/bl_ui/properties_render_layer.py
@@ -225,14 +225,17 @@ class RENDERLAYER_PT_views(RenderLayerButtonsPanel, Panel):
             row.label(text="Camera Suffix:")
             row.prop(rv, "camera_suffix", text="")
         else:
+            wm = context.window_manager
+
             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'
 
             col = layout.column()
 
             row = col.row(align=True)
-            row.operator("wm.hmd_view_open", text="Open HMD Window")
+            row.operator("wm.hmd_view_open", text=text_win)
             row.operator("view3d.hmd_session_run", text=text_run, icon=icon)
 
             col.prop(rd, "hmd_camlock")
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 5c1fc5f..f21d8d7 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -4810,6 +4810,10 @@ static void hmd_session_refresh(bContext *C, wmWindow *hmd_win, Scene *scene, HM
 {
 	if (scene->r.scemode & R_HMD_IGNORE_ROT)
 		return;
+	if (!hmd_win) {
+		scene->flag &= ~SCE_HMD_RUNNING;
+		return;
+	}
 
 	View3D *v3d = CTX_wm_view3d(C);
 	Object *camera_ob = v3d ? v3d->camera : scene->camera;
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 51c410e..d5cda2c 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -934,6 +934,12 @@ static void rna_wmClipboard_set(PointerRNA *UNUSED(ptr), const char *value)
 	WM_clipboard_text_set((void *) value, false);
 }
 
+static int rna_has_hmd_window_get(PointerRNA *ptr)
+{
+	wmWindowManager *wm = ptr->data;
+	return (wm->win_hmd != NULL);
+}
+
 #ifdef WITH_PYTHON
 static void rna_Operator_unregister(struct Main *bmain, StructRNA *type)
 {
@@ -1974,6 +1980,10 @@ static void rna_def_windowmanager(BlenderRNA *brna)
 	RNA_def_property_string_funcs(prop, "rna_wmClipboard_get", "rna_wmClipboard_length", "rna_wmClipboard_set");
 	RNA_def_property_ui_text(prop, "Text Clipboard", "");
 
+	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);
+
 	RNA_api_wm(srna);
 }
 
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index b8fe153..8ab02d4 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -5097,51 +5097,57 @@ static void WM_OT_stereo3d_set(wmOperatorType *ot)
 	RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 }
 
-static int wm_hmd_view_open_poll(bContext *C)
-{
-	return (CTX_wm_manager(C)->win_hmd == NULL);
-}
-
 static int wm_hmd_view_open_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event))
 {
 	wmWindowManager *wm = CTX_wm_manager(C);
-	wmWindow *win = wm_window_copy_test(C, CTX_wm_window(C));
-	ScrArea *sa;
+	wmWindow *win;
 
-	/* XXX this is assuming there's already a 3d view, we should create a new one instead */
-	for (sa = win->screen->areabase.first; sa; sa = sa->next) {
-		if (sa->spacetype == SPACE_VIEW3D) {
-			break;
-		}
+	/* close */
+	if ((win = wm->win_hmd)) {
+		wm_window_close(C, wm, win);
+		wm->win_hmd = NULL;
 	}
+	/* open */
+	else {
+		ScrArea *sa;
 
-	if (!sa) {
-		BLI_assert(0);
-		return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
-	}
+		win = wm_window_copy_test(C, CTX_wm_window(C));
+
+		/* XXX this is assuming there's already a 3d view, we should create a new one instead */
+		for (sa = win->screen->areabase.first; sa; sa = sa->next) {
+			if (sa->spacetype == SPACE_VIEW3D) {
+				break;
+			}
+		}
 
-	wm->win_hmd = win;
-	wm_window_title(wm, win, "Blender HMD View");
+		if (!sa) {
+			BLI_assert(0);
+			return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
+		}
 
-	wmWindow *prevwin = CTX_wm_window(C);
-	ScrArea *prevsa = CTX_wm_area(C);
-	ARegion *prevar = CTX_wm_region(C);
+		wm->win_hmd = win;
+		wm_window_title(wm, win, "Blender HMD View");
 
-	CTX_wm_window_set(C, win);
-	CTX_wm_area_set(C, sa);
-	CTX_wm_region_set(C, NULL);
-	ED_screen_state_toggle(C, win, sa, SCREENFULL);
+		wmWindow *prevwin = CTX_wm_window(C);
+		ScrArea *prevsa = CTX_wm_area(C);
+		ARegion *prevar = CTX_wm_region(C);
 
-	ED_area_tag_redraw(sa);
+		CTX_wm_window_set(C, win);
+		CTX_wm_area_set(C, sa);
+		CTX_wm_region_set(C, NULL);
+		ED_screen_state_toggle(C, win, sa, SCREENFULL);
 
-	/* It is possible that new layers becomes visible. */
-	if (sa->spacetype == SPACE_VIEW3D) {
-		DAG_on_visible_update(CTX_data_main(C), false);
-	}
+		ED_area_tag_redraw(sa);
 
-	CTX_wm_window_set(C, prevwin);
-	CTX_wm_area_set(C, prevsa);
-	CTX_wm_region_set(C, prevar);
+		/* It is possible that new layers becomes visible. */
+		if (sa->spacetype == SPACE_VIEW3D) {
+			DAG_on_visible_update(CTX_data_main(C), false);
+		}
+
+		CTX_wm_window_set(C, prevwin);
+		CTX_wm_area_set(C, prevsa);
+		CTX_wm_region_set(C, prevar);
+	}
 
 	return OPERATOR_FINISHED;
 }
@@ -5153,7 +5159,6 @@ static void WM_OT_hmd_view_open(wmOperatorType *ot)
 	ot->description = "Open a separate window for a head mounted display";
 
 	ot->invoke = wm_hmd_view_open_invoke;
-	ot->poll = wm_hmd_view_open_poll;
 }
 
 /* ******************************************************* */




More information about the Bf-blender-cvs mailing list