[Bf-blender-cvs] [e951f4becf5] vr_scene_inspection: Allow querying VR session viewer location from Python

Julian Eisel noreply at git.blender.org
Fri Dec 13 14:13:41 CET 2019


Commit: e951f4becf51b748a5a415474eb2fbe65b93195a
Author: Julian Eisel
Date:   Fri Dec 13 13:08:33 2019 +0100
Branches: vr_scene_inspection
https://developer.blender.org/rBe951f4becf51b748a5a415474eb2fbe65b93195a

Allow querying VR session viewer location from Python

Not 100% sure if the output coordinates are correct, only did quick
testing of that. I'm just slowly working towards the virtual camera
feature for a regular viewport.

Also fix compile in Windows error with previous commit.

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

M	intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
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/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp b/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
index dd3d477ef8c..ff1c8cc4b62 100644
--- a/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
+++ b/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
@@ -116,6 +116,8 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
     oxr_binding.glx.glxDrawable = ctx_glx->m_window;
     oxr_binding.glx.glxContext = ctx_glx->m_context;
     oxr_binding.glx.visualid = visual_info->visualid;
+
+    XFree(visual_info);
 #elif defined(WIN32)
     GHOST_ContextWGL *ctx_wgl = static_cast<GHOST_ContextWGL *>(ghost_ctx);
 
@@ -126,8 +128,6 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
 
     /* Generate a framebuffer to use for blitting into the texture. */
     glGenFramebuffers(1, &m_fbo);
-
-    XFree(visual_info);
   }
 
   bool chooseSwapchainFormat(const std::vector<int64_t> &runtime_formats,
diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index c57f8b92f52..705aaf92c37 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -42,6 +42,16 @@ 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)
+{
+  /* 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;
+  BLI_assert(wm && (GS(wm->id.name) == ID_WM));
+
+  WM_xr_session_state_viewer_location_get(&wm->xr, values);
+}
+
 #else /* RNA_RUNTIME */
 
 static void rna_def_xr_session_settings(BlenderRNA *brna)
@@ -92,7 +102,7 @@ static void rna_def_xr_session_state(BlenderRNA *brna)
 {
   StructRNA *srna;
   FunctionRNA *func;
-  PropertyRNA *parm;
+  PropertyRNA *parm, *prop;
 
   srna = RNA_def_struct(brna, "XrSessionState", NULL);
   RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
@@ -105,6 +115,15 @@ static void rna_def_xr_session_state(BlenderRNA *brna)
   RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
   parm = RNA_def_boolean(func, "result", 0, "Result", "");
   RNA_def_function_return(func, parm);
+
+  prop = RNA_def_property(srna, "viewer_location", PROP_FLOAT, PROP_TRANSLATION);
+  RNA_def_property_array(prop, 3);
+  RNA_def_property_float_funcs(prop, "rna_XrSessionState_viewer_location_get", NULL, NULL);
+  RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+  RNA_def_property_ui_text(
+      prop,
+      "Viewer Location",
+      "Last known location 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 16e70dcbad5..71ba33bcf90 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -850,7 +850,8 @@ void WM_generic_user_data_free(struct wmGenericUserData *user_data);
 
 #ifdef WITH_OPENXR
 /* wm_xr.c */
-bool WM_xr_is_session_running(const struct wmXrData *xr);
+bool WM_xr_is_session_running(const wmXrData *xr);
+void WM_xr_session_state_viewer_location_get(const wmXrData *xr, float location[3]);
 #endif
 
 #ifdef __cplusplus
diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index 831403b6731..158f9d33523 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -75,6 +75,9 @@ typedef struct bXrRuntimeSessionState {
    * it also contains a location delta from the moment the option was toggled. */
   GHOST_XrPose final_reference_pose;
 
+  /** Last known viewer location (centroid of eyes, in world space) stored for queries. */
+  GHOST_XrPose viewer_pose;
+
   /** Copy of bXrSessionSettings.flag created on the last draw call,  */
   int prev_settings_flag;
 } bXrRuntimeSessionState;
@@ -216,6 +219,7 @@ static void wm_xr_runtime_session_state_update(bXrRuntimeSessionState *state,
   const bool position_tracking_toggled = (state->prev_settings_flag &
                                           XR_SESSION_USE_POSITION_TRACKING) !=
                                          (settings->flag & XR_SESSION_USE_POSITION_TRACKING);
+  const bool use_position_tracking = settings->flag & XR_SESSION_USE_POSITION_TRACKING;
 
   copy_v4_v4(state->final_reference_pose.orientation_quat, state->reference_pose.orientation_quat);
 
@@ -223,7 +227,7 @@ static void wm_xr_runtime_session_state_update(bXrRuntimeSessionState *state,
     copy_v3_v3(state->final_reference_pose.position, state->reference_pose.position);
 
     /* Update reference pose to the current position. */
-    if ((settings->flag & XR_SESSION_USE_POSITION_TRACKING) == 0) {
+    if (use_position_tracking == false) {
       /* OpenXR/Ghost-XR returns the local pose in local space, we need it in world space. */
       state->final_reference_pose.position[0] += draw_view->local_pose.position[0];
       state->final_reference_pose.position[1] -= draw_view->local_pose.position[2];
@@ -231,9 +235,25 @@ static void wm_xr_runtime_session_state_update(bXrRuntimeSessionState *state,
     }
   }
 
+  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];
+    state->viewer_pose.position[1] -= draw_view->local_pose.position[2];
+    state->viewer_pose.position[2] += draw_view->local_pose.position[1];
+  }
+
   state->prev_settings_flag = settings->flag;
 }
 
+void WM_xr_session_state_viewer_location_get(const wmXrData *xr, float location[3])
+{
+  if (!WM_xr_is_session_running(xr)) {
+    return;
+  }
+
+  copy_v3_v3(location, xr->session_state->viewer_pose.position);
+}
+
 /** \} */ /* XR Runtime Session State */
 
 /* -------------------------------------------------------------------- */



More information about the Bf-blender-cvs mailing list