From 3ee258effe979d832ead11ff31780ac94e0f90fb Mon Sep 17 00:00:00 2001 From: Logan Lang Date: Tue, 13 Feb 2024 16:13:56 -0600 Subject: [PATCH] enable getting suggested tracker names from OpenXR extensions --- .../OpenXRExtensionWrapperExtension.xml | 6 +++++ .../extensions/openxr_extension_wrapper.h | 3 +++ .../openxr_extension_wrapper_extension.cpp | 11 +++++++++ .../openxr_extension_wrapper_extension.h | 4 ++++ .../openxr_eye_gaze_interaction.cpp | 5 ++++ .../extensions/openxr_eye_gaze_interaction.h | 2 ++ .../openxr_htc_vive_tracker_extension.cpp | 19 +++++++++++++++ .../openxr_htc_vive_tracker_extension.h | 2 ++ modules/openxr/openxr_interface.cpp | 23 ++++--------------- 9 files changed, 56 insertions(+), 19 deletions(-) diff --git a/modules/openxr/doc_classes/OpenXRExtensionWrapperExtension.xml b/modules/openxr/doc_classes/OpenXRExtensionWrapperExtension.xml index b923d9244d69..ee2aa33108e4 100644 --- a/modules/openxr/doc_classes/OpenXRExtensionWrapperExtension.xml +++ b/modules/openxr/doc_classes/OpenXRExtensionWrapperExtension.xml @@ -23,6 +23,12 @@ - If the [code]bool *[/code] points to a boolean, the boolean will be updated to [code]true[/code] if the extension is enabled. + + + + Returns a [PackedStringArray] of positional tracker names that are used within the extension wrapper. + + diff --git a/modules/openxr/extensions/openxr_extension_wrapper.h b/modules/openxr/extensions/openxr_extension_wrapper.h index b9c9247bee4c..ad326472ab16 100644 --- a/modules/openxr/extensions/openxr_extension_wrapper.h +++ b/modules/openxr/extensions/openxr_extension_wrapper.h @@ -35,6 +35,7 @@ #include "core/math/projection.h" #include "core/templates/hash_map.h" #include "core/templates/rid.h" +#include "core/variant/variant.h" #include @@ -62,6 +63,8 @@ public: virtual void *set_swapchain_create_info_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; } // Add additional data structures when creating OpenXR swap chains. virtual void *set_hand_joint_locations_and_get_next_pointer(int p_hand_index, void *p_next_pointer) { return p_next_pointer; } + virtual PackedStringArray get_suggested_tracker_names() { return PackedStringArray(); } + // `on_register_metadata` allows extensions to register additional controller metadata. // This function is called even when OpenXRApi is not constructured as the metadata // needs to be available to the editor. diff --git a/modules/openxr/extensions/openxr_extension_wrapper_extension.cpp b/modules/openxr/extensions/openxr_extension_wrapper_extension.cpp index 5ad7a97eca71..05f120b0d84b 100644 --- a/modules/openxr/extensions/openxr_extension_wrapper_extension.cpp +++ b/modules/openxr/extensions/openxr_extension_wrapper_extension.cpp @@ -40,6 +40,7 @@ void OpenXRExtensionWrapperExtension::_bind_methods() { GDVIRTUAL_BIND(_set_swapchain_create_info_and_get_next_pointer, "next_pointer"); GDVIRTUAL_BIND(_set_hand_joint_locations_and_get_next_pointer, "hand_index", "next_pointer"); GDVIRTUAL_BIND(_get_composition_layer); + GDVIRTUAL_BIND(_get_suggested_tracker_names); GDVIRTUAL_BIND(_on_register_metadata); GDVIRTUAL_BIND(_on_before_instance_created); GDVIRTUAL_BIND(_on_instance_created, "instance"); @@ -129,6 +130,16 @@ void *OpenXRExtensionWrapperExtension::set_hand_joint_locations_and_get_next_poi return nullptr; } +PackedStringArray OpenXRExtensionWrapperExtension::get_suggested_tracker_names() { + PackedStringArray ret; + + if (GDVIRTUAL_CALL(_get_suggested_tracker_names, ret)) { + return ret; + } + + return PackedStringArray(); +} + XrCompositionLayerBaseHeader *OpenXRExtensionWrapperExtension::get_composition_layer() { uint64_t pointer; diff --git a/modules/openxr/extensions/openxr_extension_wrapper_extension.h b/modules/openxr/extensions/openxr_extension_wrapper_extension.h index 4d8b19f4fd95..d673a3bd8ff9 100644 --- a/modules/openxr/extensions/openxr_extension_wrapper_extension.h +++ b/modules/openxr/extensions/openxr_extension_wrapper_extension.h @@ -69,6 +69,10 @@ public: GDVIRTUAL2R(uint64_t, _set_hand_joint_locations_and_get_next_pointer, int, GDExtensionPtr); GDVIRTUAL0R(uint64_t, _get_composition_layer); + virtual PackedStringArray get_suggested_tracker_names() override; + + GDVIRTUAL0R(PackedStringArray, _get_suggested_tracker_names); + virtual void on_register_metadata() override; virtual void on_before_instance_created() override; virtual void on_instance_created(const XrInstance p_instance) override; diff --git a/modules/openxr/extensions/openxr_eye_gaze_interaction.cpp b/modules/openxr/extensions/openxr_eye_gaze_interaction.cpp index 59bdec5c8e36..e57491e7c671 100644 --- a/modules/openxr/extensions/openxr_eye_gaze_interaction.cpp +++ b/modules/openxr/extensions/openxr_eye_gaze_interaction.cpp @@ -69,6 +69,11 @@ void *OpenXREyeGazeInteractionExtension::set_system_properties_and_get_next_poin return &properties; } +PackedStringArray OpenXREyeGazeInteractionExtension::get_suggested_tracker_names() { + PackedStringArray arr = { "/user/eyes_ext" }; + return arr; +} + bool OpenXREyeGazeInteractionExtension::is_available() { return available; } diff --git a/modules/openxr/extensions/openxr_eye_gaze_interaction.h b/modules/openxr/extensions/openxr_eye_gaze_interaction.h index 704940ad2636..2b99f8edff0b 100644 --- a/modules/openxr/extensions/openxr_eye_gaze_interaction.h +++ b/modules/openxr/extensions/openxr_eye_gaze_interaction.h @@ -43,6 +43,8 @@ public: virtual HashMap get_requested_extensions() override; virtual void *set_system_properties_and_get_next_pointer(void *p_next_pointer) override; + PackedStringArray get_suggested_tracker_names() override; + bool is_available(); bool supports_eye_gaze_interaction(); diff --git a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp index 8b8c6c535388..bb60f7adef3d 100644 --- a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp +++ b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp @@ -42,6 +42,25 @@ HashMap OpenXRHTCViveTrackerExtension::get_requested_extensions( return request_extensions; } +PackedStringArray OpenXRHTCViveTrackerExtension::get_suggested_tracker_names() { + PackedStringArray arr = { + "/user/vive_tracker_htcx/role/handheld_object", + "/user/vive_tracker_htcx/role/left_foot", + "/user/vive_tracker_htcx/role/right_foot", + "/user/vive_tracker_htcx/role/left_shoulder", + "/user/vive_tracker_htcx/role/right_shoulder", + "/user/vive_tracker_htcx/role/left_elbow", + "/user/vive_tracker_htcx/role/right_elbow", + "/user/vive_tracker_htcx/role/left_knee", + "/user/vive_tracker_htcx/role/right_knee", + "/user/vive_tracker_htcx/role/waist", + "/user/vive_tracker_htcx/role/chest", + "/user/vive_tracker_htcx/role/camera", + "/user/vive_tracker_htcx/role/keyboard", + }; + return arr; +} + bool OpenXRHTCViveTrackerExtension::is_available() { return available; } diff --git a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h index b51398fd4e8f..e9c3d338ab62 100644 --- a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h +++ b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h @@ -37,6 +37,8 @@ class OpenXRHTCViveTrackerExtension : public OpenXRExtensionWrapper { public: virtual HashMap get_requested_extensions() override; + PackedStringArray get_suggested_tracker_names() override; + bool is_available(); virtual void on_register_metadata() override; diff --git a/modules/openxr/openxr_interface.cpp b/modules/openxr/openxr_interface.cpp index 05c53ad52fb2..956e5ed3f318 100644 --- a/modules/openxr/openxr_interface.cpp +++ b/modules/openxr/openxr_interface.cpp @@ -156,27 +156,12 @@ PackedStringArray OpenXRInterface::get_suggested_tracker_names() const { "left_hand", // /user/hand/left is mapped to our defaults "right_hand", // /user/hand/right is mapped to our defaults "/user/treadmill", - - // Even though these are only available if you have the tracker extension, - // we add these as we may be deploying on a different platform than our - // editor is running on. - "/user/vive_tracker_htcx/role/handheld_object", - "/user/vive_tracker_htcx/role/left_foot", - "/user/vive_tracker_htcx/role/right_foot", - "/user/vive_tracker_htcx/role/left_shoulder", - "/user/vive_tracker_htcx/role/right_shoulder", - "/user/vive_tracker_htcx/role/left_elbow", - "/user/vive_tracker_htcx/role/right_elbow", - "/user/vive_tracker_htcx/role/left_knee", - "/user/vive_tracker_htcx/role/right_knee", - "/user/vive_tracker_htcx/role/waist", - "/user/vive_tracker_htcx/role/chest", - "/user/vive_tracker_htcx/role/camera", - "/user/vive_tracker_htcx/role/keyboard", - - "/user/eyes_ext", }; + for (OpenXRExtensionWrapper *wrapper : OpenXRAPI::get_singleton()->get_registered_extension_wrappers()) { + arr.append_array(wrapper->get_suggested_tracker_names()); + } + return arr; }