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 */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to