[Bf-blender-cvs] [b8d2c0d] HMD_viewport: Allow cursor to be in any window without stopping HMD update

Julian Eisel noreply at git.blender.org
Wed Mar 16 16:11:03 CET 2016


Commit: b8d2c0da47edb3d6f0a8d30f5f71a17ebc9c804a
Author: Julian Eisel
Date:   Fri Mar 11 04:18:48 2016 +0100
Branches: HMD_viewport
https://developer.blender.org/rBb8d2c0da47edb3d6f0a8d30f5f71a17ebc9c804a

Allow cursor to be in any window without stopping HMD update

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

M	source/blender/editors/space_view3d/view3d_edit.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/editors/space_view3d/view3d_ops.c

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

diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 0fcda48..082717e 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -4806,37 +4806,60 @@ typedef struct HMDData {
 	float orientation[4];
 } HMDData;
 
-static void hmd_run_exit(wmWindow *win, Scene *scene)
+static void hmd_session_refresh(bContext *C, wmWindow *hmd_win, Scene *scene, HMDData *data)
+{
+	if (scene->r.scemode & R_HMD_IGNORE_ROT)
+		return;
+
+	View3D *v3d = CTX_wm_view3d(C);
+	Object *camera_ob = v3d ? v3d->camera : scene->camera;
+	static float quad[4] = {M_SQRT1_2, M_SQRT1_2, 0.0f, 0.0f};
+
+	mul_qt_qtqt(camera_ob->quat, quad, data->orientation);
+	normalize_qt(camera_ob->quat);
+	loc_quat_size_to_mat4(camera_ob->obmat, camera_ob->loc, camera_ob->quat, camera_ob->size);
+
+	DAG_id_tag_update(&camera_ob->id, 0);  /* sets recalc flags */
+	/* tag hmd region for update */
+	ScrArea *sa = hmd_win->screen->areabase.first;
+	ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
+	ED_region_tag_redraw(ar);
+}
+
+static wmWindow *hmd_window_find(bContext *C)
+{
+	wmWindowManager *wm = CTX_wm_manager(C);
+	wmWindow *hmd_win = CTX_wm_window(C);
+
+	if (hmd_win->screen->flag & SCREEN_FLAG_HMD_SCREEN)
+		return hmd_win;
+
+	for (hmd_win = wm->windows.first; hmd_win; hmd_win = hmd_win->next) {
+		if (hmd_win->screen->flag & SCREEN_FLAG_HMD_SCREEN) {
+			return hmd_win;
+		}
+	}
+
+	return NULL;
+}
+
+static void hmd_run_exit(wmWindow *hmd_win, Scene *scene)
 {
 	scene->flag &= ~SCE_HMD_RUNNING;
-	WM_window_fullscreen_toggle(win, false, true);
+	WM_window_fullscreen_toggle(hmd_win, false, true);
 }
 
 static int hmd_session_run_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
-	wmWindow *win = op->customdata;
+	wmWindow *hmd_win = op->customdata;
 	Scene *scene = CTX_data_scene(C);
 
 	switch (event->type) {
 		case EVT_HMD_TRANSFORM:
-		{
-			if ((scene->r.scemode & R_HMD_IGNORE_ROT) == 0) {
-				View3D *v3d = CTX_wm_view3d(C);
-				Object *camera_ob = v3d ? v3d->camera : scene->camera;
-				HMDData *data = event->customdata;
-				static float quad[4] = {M_SQRT1_2, M_SQRT1_2, 0.0f, 0.0f};
-
-				mul_qt_qtqt(camera_ob->quat, quad, data->orientation);
-				normalize_qt(camera_ob->quat);
-				loc_quat_size_to_mat4(camera_ob->obmat, camera_ob->loc, camera_ob->quat, camera_ob->size);
-
-				DAG_id_tag_update(&camera_ob->id, 0);  /* sets recalc flags */
-				ED_region_tag_redraw(CTX_wm_region(C));
-			}
+			hmd_session_refresh(C, hmd_win, scene, event->customdata);
 			return OPERATOR_RUNNING_MODAL;
-		}
 		case ESCKEY:
-			hmd_run_exit(win, scene);
+			hmd_run_exit(hmd_win, scene);
 			return OPERATOR_FINISHED;
 	}
 
@@ -4846,34 +4869,27 @@ static int hmd_session_run_modal(bContext *C, wmOperator *op, const wmEvent *eve
 static int hmd_session_run_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
 {
 	Scene *scene = CTX_data_scene(C);
-	wmWindow *win = CTX_wm_window(C);
+	wmWindow *hmd_win = hmd_window_find(C);
 	const bool was_hmd_running = (scene->flag & SCE_HMD_RUNNING);
 
-	if (!win->screen->flag & SCREEN_FLAG_HMD_SCREEN) {
-		wmWindowManager *wm = CTX_wm_manager(C);
-		for (win = wm->windows.first; win; win = win->next) {
-			if (win->screen->flag & SCREEN_FLAG_HMD_SCREEN) {
-				break;
-			}
-		}
-	}
-	if (!win) {
+	if (!hmd_win) {
 		return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
 	}
 
 	scene->flag ^= SCE_HMD_RUNNING;
 	if (was_hmd_running) {
-		WM_window_fullscreen_toggle(win, false, true);
+		WM_window_fullscreen_toggle(hmd_win, false, true);
 		BLI_assert(0);
 		return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
 	}
 	else {
-		ScrArea *sa = win->screen->areabase.first;
+		ScrArea *sa = hmd_win->screen->areabase.first;
 		ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
 		View3D *v3d = sa->spacedata.first;
 		RegionView3D *rv3d = ar->regiondata;
 		BLI_assert(sa->spacetype = SPACE_VIEW3D);
 
+		/* XXX duplicated code from viewnumpad_exec */
 		if (rv3d->persp != RV3D_CAMOB) {
 			Object *ob = OBACT;
 			/* first get the default camera for the view lock type */
@@ -4896,21 +4912,10 @@ static int hmd_session_run_invoke(bContext *C, wmOperator *op, const wmEvent *UN
 				rv3d->persp = RV3D_CAMOB;
 		}
 
-		op->customdata = win;
-		WM_window_fullscreen_toggle(win, true, false);
+		op->customdata = hmd_win;
+		WM_window_fullscreen_toggle(hmd_win, true, false);
 
-		{
-			wmWindow *win_store = CTX_wm_window(C);
-			ScrArea *sa_store = CTX_wm_area(C);
-			ARegion *ar_store = CTX_wm_region(C);
-			CTX_wm_window_set(C, win);
-			CTX_wm_area_set(C, sa);
-			CTX_wm_region_set(C, ar);
-			WM_event_add_modal_handler(C, op);
-			CTX_wm_region_set(C, ar_store);
-			CTX_wm_area_set(C, sa_store);
-			CTX_wm_window_set(C, win_store);
-		}
+		WM_event_add_modal_handler(C, op);
 		return OPERATOR_RUNNING_MODAL;
 	}
 }
@@ -4925,6 +4930,28 @@ void VIEW3D_OT_hmd_session_run(wmOperatorType *ot)
 	/* api callbacks */
 	ot->invoke = hmd_session_run_invoke;
 	ot->modal = hmd_session_run_modal;
+}
+
+static int hmd_session_refresh_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
+{
+	wmWindow *hmd_win = hmd_window_find(C);
+	hmd_session_refresh(C, hmd_win, CTX_data_scene(C), event->customdata);
+	return OPERATOR_FINISHED;
+}
+
+/**
+ * Only needed since VIEW3D_OT_hmd_session_run modal can only update while
+ * mouse is inside initial window. For other windows, this is called.
+ */
+void VIEW3D_OT_hmd_session_refresh(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Refresh HMD Session";
+	ot->description = "Refresh data for a head mounted display (virtual reality) session";
+	ot->idname = "VIEW3D_OT_hmd_session_refresh";
+
+	/* api callbacks */
+	ot->invoke = hmd_session_refresh_invoke;
 
 	/* flags */
 	ot->flag = OPTYPE_INTERNAL;
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index e6f9904..9240952 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -104,6 +104,7 @@ void VIEW3D_OT_render_border(struct wmOperatorType *ot);
 void VIEW3D_OT_clear_render_border(struct wmOperatorType *ot);
 void VIEW3D_OT_zoom_border(struct wmOperatorType *ot);
 void VIEW3D_OT_hmd_session_run(struct wmOperatorType *ot);
+void VIEW3D_OT_hmd_session_refresh(struct wmOperatorType *ot);
 
 void view3d_boxview_copy(ScrArea *sa, ARegion *ar);
 
diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c
index 6dc4894..ec31981 100644
--- a/source/blender/editors/space_view3d/view3d_ops.c
+++ b/source/blender/editors/space_view3d/view3d_ops.c
@@ -219,6 +219,7 @@ void view3d_operatortypes(void)
 	WM_operatortype_append(VIEW3D_OT_snap_cursor_to_selected);
 	WM_operatortype_append(VIEW3D_OT_snap_cursor_to_active);
 	WM_operatortype_append(VIEW3D_OT_hmd_session_run);
+	WM_operatortype_append(VIEW3D_OT_hmd_session_refresh);
 
 	transform_operatortypes();
 }
@@ -504,7 +505,9 @@ void view3d_keymap(wmKeyConfig *keyconf)
 	WM_keymap_add_item(keymap, "VIEW3D_OT_object_as_camera", PAD0, KM_PRESS, KM_CTRL, 0);
 	
 	WM_keymap_add_menu(keymap, "VIEW3D_MT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
-	
+
+	WM_keymap_add_item(keymap, "VIEW3D_OT_hmd_session_refresh", EVT_HMD_TRANSFORM, 0, KM_ANY, 0);
+
 #ifdef __APPLE__
 	WM_keymap_add_item(keymap, "VIEW3D_OT_copybuffer", CKEY, KM_PRESS, KM_OSKEY, 0);
 	WM_keymap_add_item(keymap, "VIEW3D_OT_pastebuffer", VKEY, KM_PRESS, KM_OSKEY, 0);




More information about the Bf-blender-cvs mailing list