[Bf-blender-cvs] [5a8e1c2] HMD_viewport: Reset camera on HMD session end

Julian Eisel noreply at git.blender.org
Thu Mar 17 22:51:08 CET 2016


Commit: 5a8e1c28c8347fa0a551b9710bad4e6d39823238
Author: Julian Eisel
Date:   Thu Mar 17 22:50:00 2016 +0100
Branches: HMD_viewport
https://developer.blender.org/rB5a8e1c28c8347fa0a551b9710bad4e6d39823238

Reset camera on HMD session end

Added utility functions for getting/setting rotation from quaterion.

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

M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/windowmanager/intern/wm_operators.c

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

diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 7d60964..21b5371 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -118,6 +118,8 @@ void BKE_object_obdata_size_init(struct Object *ob, const float scale);
 void BKE_object_scale_to_mat3(struct Object *ob, float mat[3][3]);
 void BKE_object_rot_to_mat3(struct Object *ob, float mat[3][3], bool use_drot);
 void BKE_object_mat3_to_rot(struct Object *ob, float mat[3][3], bool use_compat);
+void BKE_object_rot_to_quat(struct Object *ob, float r_quat[4]);
+void BKE_object_quat_to_rot(struct Object *ob, float quat[4]);
 void BKE_object_to_mat3(struct Object *ob, float mat[3][3]);
 void BKE_object_to_mat4(struct Object *ob, float mat[4][4]);
 void BKE_object_apply_mat4(struct Object *ob, float mat[4][4], const bool use_compat, const bool use_parent);
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index f81f13e..79a4b36 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1998,6 +1998,32 @@ void BKE_object_mat3_to_rot(Object *ob, float mat[3][3], bool use_compat)
 	}
 }
 
+void BKE_object_rot_to_quat(Object *ob, float r_quat[4])
+{
+	if (ob->rotmode == ROT_MODE_QUAT) {
+		copy_qt_qt(r_quat, ob->quat);
+	}
+	else if (ob->rotmode == ROT_MODE_AXISANGLE) {
+		axis_angle_to_quat(r_quat, ob->rotAxis, ob->rotAngle);
+	}
+	else {
+		eulO_to_quat(r_quat, ob->rot, ob->rotmode);
+	}
+}
+
+void BKE_object_quat_to_rot(Object *ob, float quat[4])
+{
+	if (ob->rotmode == ROT_MODE_QUAT) {
+		copy_qt_qt(ob->quat, quat);
+	}
+	else if (ob->rotmode == ROT_MODE_AXISANGLE) {
+		quat_to_axis_angle(ob->rotAxis, &ob->rotAngle, quat);
+	}
+	else {
+		quat_to_eulO(ob->rot, ob->rotmode, quat);
+	}
+}
+
 void BKE_object_tfm_protected_backup(const Object *ob,
                                      ObjectTfmProtectedChannels *obtfm)
 {
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index a71bb5f..212425a 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -90,6 +90,7 @@
 #include "BKE_screen.h" /* BKE_ST_MAXNAME */
 #include "BKE_unit.h"
 #include "BKE_utildefines.h"
+#include "BKE_object.h"
 
 #include "BKE_idcode.h"
 
@@ -5164,7 +5165,12 @@ static int hmd_session_run_invoke(bContext *C, wmOperator *UNUSED(op), const wmE
 
 	scene->flag ^= SCE_HMD_RUNNING;
 	if (was_hmd_running) {
+		View3D *v3d = CTX_wm_view3d(C);
+		Object *ob = v3d ? v3d->camera : scene->camera;
 		WM_window_fullscreen_toggle(hmd_win, false, true);
+		/* reset initial camera rotation */
+		BKE_object_quat_to_rot(ob, init_rot);
+		DAG_id_tag_update(&ob->id, OB_RECALC_OB);  /* sets recalc flags */
 		return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
 	}
 	else {
@@ -5196,15 +5202,7 @@ static int hmd_session_run_invoke(bContext *C, wmOperator *UNUSED(op), const wmE
 			if (v3d->camera)
 				rv3d->persp = RV3D_CAMOB;
 
-			if (ob->rotmode == ROT_MODE_QUAT) {
-				copy_qt_qt(init_rot, ob->quat);
-			}
-			else if (ob->rotmode == ROT_MODE_AXISANGLE) {
-				axis_angle_to_quat(init_rot, ob->rotAxis, ob->rotAngle);
-			}
-			else {
-				eulO_to_quat(init_rot, v3d->camera->rot, v3d->camera->rotmode);
-			}
+			BKE_object_rot_to_quat(v3d->camera, init_rot);
 		}
 
 		WM_window_fullscreen_toggle(hmd_win, true, false);
@@ -5239,15 +5237,7 @@ static void hmd_session_refresh(bContext *C, wmWindow *hmd_win, Scene *scene, HM
 	float quat[4];
 
 	mul_qt_qtqt(quat, init_rot, data->orientation);
-	if (ob->rotmode == ROT_MODE_QUAT) {
-		copy_qt_qt(ob->quat, quat);
-	}
-	else if (ob->rotmode == ROT_MODE_AXISANGLE) {
-		quat_to_axis_angle(ob->rotAxis, &ob->rotAngle, quat);
-	}
-	else {
-		quat_to_eulO(ob->rot, ob->rotmode, quat);
-	}
+	BKE_object_quat_to_rot(ob, quat);
 
 	DAG_id_tag_update(&ob->id, OB_RECALC_OB);  /* sets recalc flags */
 	/* tag hmd region for update */




More information about the Bf-blender-cvs mailing list