[Bf-blender-cvs] [9b1d3182226] vr_scene_inspection: Expose VR view rotation in the RNA/BPY

Julian Eisel noreply at git.blender.org
Fri Jan 10 17:00:17 CET 2020


Commit: 9b1d318222664e4a86e7b6065921daf80dd59737
Author: Julian Eisel
Date:   Fri Jan 10 16:59:26 2020 +0100
Branches: vr_scene_inspection
https://developer.blender.org/rB9b1d318222664e4a86e7b6065921daf80dd59737

Expose VR view rotation in the RNA/BPY

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

M	source/blender/makesrna/intern/rna_xr.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_xr.c

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

diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index 705aaf92c37..20d9252ad07 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -42,14 +42,29 @@ static bool rna_XrSessionState_is_running(bContext *C)
   return WM_xr_is_session_running(&wm->xr);
 }
 
-static void rna_XrSessionState_viewer_location_get(PointerRNA *ptr, float *values)
+static wmXrData *rna_XrSessionState_wm_xr_data_get(PointerRNA *ptr)
 {
-  /* Could also get bXrSessionState pointer through ptr->data, but prefer if we just consistently
-   * pass wmXrData pointers to the WM_xr_xxx() API. */
-  const wmWindowManager *wm = (wmWindowManager *)ptr->owner_id;
+  /* Callers could also get bXrSessionState pointer through ptr->data, but prefer if we just
+   * consistently pass wmXrData pointers to the WM_xr_xxx() API. */
+
+  BLI_assert(ptr->type == &RNA_XrSessionState);
+
+  wmWindowManager *wm = (wmWindowManager *)ptr->owner_id;
   BLI_assert(wm && (GS(wm->id.name) == ID_WM));
 
-  WM_xr_session_state_viewer_location_get(&wm->xr, values);
+  return &wm->xr;
+}
+
+static void rna_XrSessionState_viewer_location_get(PointerRNA *ptr, float *values)
+{
+  const wmXrData *xr = rna_XrSessionState_wm_xr_data_get(ptr);
+  WM_xr_session_state_viewer_location_get(xr, values);
+}
+
+static void rna_XrSessionState_viewer_rotation_get(PointerRNA *ptr, float *values)
+{
+  const wmXrData *xr = rna_XrSessionState_wm_xr_data_get(ptr);
+  WM_xr_session_state_viewer_rotation_get(xr, values);
 }
 
 #else /* RNA_RUNTIME */
@@ -124,6 +139,15 @@ static void rna_def_xr_session_state(BlenderRNA *brna)
       prop,
       "Viewer Location",
       "Last known location of the viewer (centroid of the eyes) in world space");
+
+  prop = RNA_def_property(srna, "viewer_rotation", PROP_FLOAT, PROP_QUATERNION);
+  RNA_def_property_array(prop, 4);
+  RNA_def_property_float_funcs(prop, "rna_XrSessionState_viewer_rotation_get", NULL, NULL);
+  RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+  RNA_def_property_ui_text(
+      prop,
+      "Viewer Rotation",
+      "Last known Rotation of the viewer (centroid of the eyes) in world space");
 }
 
 void RNA_def_xr(BlenderRNA *brna)
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index b12b4a76c9a..bc7fe1f4c2b 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -857,6 +857,7 @@ void WM_generic_user_data_free(struct wmGenericUserData *user_data);
 /* wm_xr.c */
 bool WM_xr_is_session_running(const wmXrData *xr);
 void WM_xr_session_state_viewer_location_get(const wmXrData *xr, float location[3]);
+void WM_xr_session_state_viewer_rotation_get(const wmXrData *xr, float rotation[4]);
 #endif
 
 #ifdef __cplusplus
diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index 158f9d33523..bced6717173 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -235,6 +235,10 @@ static void wm_xr_runtime_session_state_update(bXrRuntimeSessionState *state,
     }
   }
 
+  mul_qt_qtqt(state->viewer_pose.orientation_quat,
+              state->final_reference_pose.orientation_quat,
+              draw_view->local_pose.orientation_quat);
+
   copy_v3_v3(state->viewer_pose.position, state->final_reference_pose.position);
   if (use_position_tracking) {
     state->viewer_pose.position[0] += draw_view->local_pose.position[0];
@@ -254,6 +258,15 @@ void WM_xr_session_state_viewer_location_get(const wmXrData *xr, float location[
   copy_v3_v3(location, xr->session_state->viewer_pose.position);
 }
 
+void WM_xr_session_state_viewer_rotation_get(const wmXrData *xr, float rotation[4])
+{
+  if (!WM_xr_is_session_running(xr)) {
+    return;
+  }
+
+  copy_v4_v4(rotation, xr->session_state->viewer_pose.orientation_quat);
+}
+
 /** \} */ /* XR Runtime Session State */
 
 /* -------------------------------------------------------------------- */



More information about the Bf-blender-cvs mailing list