[Bf-blender-cvs] [2d2d44c] HMD_viewport: No need to apply HMD rotation in operator anymore

Julian Eisel noreply at git.blender.org
Fri Oct 28 20:38:06 CEST 2016


Commit: 2d2d44ca71e549b14be875ccd3b502937b6799f6
Author: Julian Eisel
Date:   Fri Oct 28 20:22:44 2016 +0200
Branches: HMD_viewport
https://developer.blender.org/rB2d2d44ca71e549b14be875ccd3b502937b6799f6

No need to apply HMD rotation in operator anymore

Now done by requesting modelview/projection matrices from OpenHMD.

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

M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/intern/wm_operators.c
M	source/blender/windowmanager/intern/wm_window.c

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

diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 07afac2..d915713 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -3494,10 +3494,6 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U
 
 			if (e->subtype == GHOST_kOrientationUpdate) {
 				event.type = EVT_HMD_TRANSFORM;
-				event.customdata = MEM_mallocN(sizeof(e->orientation), "HMD orientation event data");
-				event.customdatafree = true;
-				/* Take care for HMDOrientationData when changing this! */
-				memcpy(event.customdata, e->orientation, sizeof(e->orientation));
 				wm_event_add(win, &event);
 			}
 			break;
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index fe23e24..28c110c 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -4126,28 +4126,6 @@ static void WM_OT_stereo3d_set(wmOperatorType *ot)
 /* ******************************************************* */
 /* Head Mounted Display */
 
-typedef struct HMDOrientationData {
-	float orientation[4];
-} HMDOrientationData;
-
-/**
- * Initial camera rotation (quaternion).
- * A bit ugly, but we need to calculate the rotation delta since session start.
- */
-static float init_rot[4];
-
-static void hmd_view_exit(const bContext *C, Scene *scene)
-{
-	View3D *v3d = CTX_wm_view3d(C);
-	Object *ob = v3d ? v3d->camera : scene->camera;
-
-	if (ob) {
-		/* reset initial camera rotation */
-		BKE_object_quat_to_rot(ob, init_rot);
-		DAG_id_tag_update(&ob->id, OB_RECALC_OB);  /* sets recalc flags */
-	}
-}
-
 static void hmd_view_prepare_screen(bContext *C, Scene *scene, wmWindow *win)
 {
 	ScrArea *sa = win->screen->areabase.first;
@@ -4177,7 +4155,6 @@ static int wm_hmd_view_toggle_invoke(bContext *C, wmOperator *UNUSED(op), const
 	if ((win = wm->win_hmd)) {
 		Scene *sc = CTX_data_scene(C);
 		sc->hmd_settings.flag &= ~HMDVIEW_SESSION_RUNNING;
-		hmd_view_exit(C, sc);
 		wm_window_close(C, wm, win);
 		wm->win_hmd = NULL;
 		/* close HMD */
@@ -4231,14 +4208,12 @@ static int hmd_session_toggle_invoke(bContext *C, wmOperator *UNUSED(op), const
 
 	scene->hmd_settings.flag ^= HMDVIEW_SESSION_RUNNING;
 	if (was_hmd_running) {
-		hmd_view_exit(C, scene);
 		WM_window_fullscreen_toggle(hmd_win, false, true);
 		WM_device_HMD_state_set(U.hmd_device, false);
 		return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
 	}
 	else {
 		ScrArea *sa = hmd_win->screen->areabase.first;
-		View3D *v3d = sa->spacedata.first;
 		BLI_assert(sa->spacetype = SPACE_VIEW3D);
 
 		WM_device_HMD_state_set(U.hmd_device, true);
@@ -4247,11 +4222,6 @@ static int hmd_session_toggle_invoke(bContext *C, wmOperator *UNUSED(op), const
 			WM_device_HMD_IPD_set(scene->hmd_settings.custom_ipd);
 		}
 
-		BLI_assert(v3d->camera == scene->camera);
-		if (scene->camera) {
-			BKE_object_rot_to_quat(scene->camera, init_rot);
-		}
-
 		WM_window_fullscreen_toggle(hmd_win, true, false);
 
 		return OPERATOR_FINISHED;
@@ -4270,40 +4240,23 @@ static void WM_OT_hmd_session_toggle(wmOperatorType *ot)
 	ot->poll = hmd_session_toggle_poll;
 }
 
-static void hmd_session_refresh(bContext *C, wmWindow *hmd_win, Scene *scene, HMDOrientationData *data)
+static int hmd_session_refresh_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event))
 {
-	View3D *v3d = CTX_wm_view3d(C);
-	Object *ob = v3d ? v3d->camera : scene->camera;
-	float quat[4];
+	Scene *scene = CTX_data_scene(C);
 
-	if ((scene->hmd_settings.flag & HMDVIEW_IGNORE_ROT) || !ob) {
-		return;
-	}
-	if (!hmd_win) {
-		BLI_assert(0);
-		scene->hmd_settings.flag &= ~HMDVIEW_SESSION_RUNNING;
-		return;
+	if ((scene->hmd_settings.flag & HMDVIEW_SESSION_RUNNING) == 0) {
+		return OPERATOR_CANCELLED; /* no pass through, we don't need to keep that event in queue */
 	}
 
-	mul_qt_qtqt(quat, init_rot, data->orientation);
-	BKE_object_quat_to_rot(ob, quat);
-
-	DAG_id_tag_update(&ob->id, OB_RECALC_OB);  /* sets recalc flags */
-	/* tag hmd region for update */
+	wmWindowManager *wm = CTX_wm_manager(C);
+	wmWindow *hmd_win = wm->win_hmd;
 	ScrArea *sa = hmd_win->screen->areabase.first;
-	ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
-	ED_region_tag_redraw(ar);
-}
 
-static int hmd_session_refresh_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
-{
-	Scene *scene = CTX_data_scene(C);
-	if ((scene->hmd_settings.flag & HMDVIEW_SESSION_RUNNING) == 0)
-		return OPERATOR_CANCELLED; /* no pass through, we don't need to keep that event in queue */
+	BLI_assert(sa->spacetype == SPACE_VIEW3D);
+	/* Actually the only thing we have to do is ensuring a redraw, we'll then
+	 * get the modelview/projection matrices from HMD device when drawing */
+	ED_area_tag_redraw(sa);
 
-	wmWindowManager *wm = CTX_wm_manager(C);
-	wmWindow *hmd_win = wm->win_hmd;
-	hmd_session_refresh(C, hmd_win, CTX_data_scene(C), event->customdata);
 	return (OPERATOR_FINISHED | OPERATOR_PASS_THROUGH);
 }
 
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index e98f521..bb9b7d1 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -1258,9 +1258,9 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
 #ifdef WITH_INPUT_HMD
 			case GHOST_kEventHMD:
 			{
-				GHOST_TEventOpenHMDData *hmdd = data;
+				GHOST_TEventOpenHMDData *hmd_data = data;
 
-				if (hmdd->subtype == GHOST_kDeviceNumChanged) {
+				if (hmd_data->subtype == GHOST_kDeviceNumChanged) {
 					if (WM_device_HMD_num_devices_get() > 0) {
 						if (U.hmd_device == -1) { /* Only if 'None' item is selected */
 							U.hmd_device = 0; /* last device plugged in */




More information about the Bf-blender-cvs mailing list