[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