diff options
Diffstat (limited to 'modules/openxr/openxr_interface.cpp')
-rw-r--r-- | modules/openxr/openxr_interface.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/modules/openxr/openxr_interface.cpp b/modules/openxr/openxr_interface.cpp index 66f8192c9e..ceeb1b0278 100644 --- a/modules/openxr/openxr_interface.cpp +++ b/modules/openxr/openxr_interface.cpp @@ -77,6 +77,8 @@ void OpenXRInterface::_bind_methods() { ClassDB::bind_method(D_METHOD("set_motion_range", "hand", "motion_range"), &OpenXRInterface::set_motion_range); ClassDB::bind_method(D_METHOD("get_motion_range", "hand"), &OpenXRInterface::get_motion_range); + ClassDB::bind_method(D_METHOD("get_hand_tracking_source", "hand"), &OpenXRInterface::get_hand_tracking_source); + ClassDB::bind_method(D_METHOD("get_hand_joint_flags", "hand", "joint"), &OpenXRInterface::get_hand_joint_flags); ClassDB::bind_method(D_METHOD("get_hand_joint_rotation", "hand", "joint"), &OpenXRInterface::get_hand_joint_rotation); @@ -97,6 +99,11 @@ void OpenXRInterface::_bind_methods() { BIND_ENUM_CONSTANT(HAND_MOTION_RANGE_CONFORM_TO_CONTROLLER); BIND_ENUM_CONSTANT(HAND_MOTION_RANGE_MAX); + BIND_ENUM_CONSTANT(HAND_TRACKED_SOURCE_UNKNOWN); + BIND_ENUM_CONSTANT(HAND_TRACKED_SOURCE_UNOBSTRUCTED); + BIND_ENUM_CONSTANT(HAND_TRACKED_SOURCE_CONTROLLER); + BIND_ENUM_CONSTANT(HAND_TRACKED_SOURCE_MAX); + BIND_ENUM_CONSTANT(HAND_JOINT_PALM); BIND_ENUM_CONSTANT(HAND_JOINT_WRIST); BIND_ENUM_CONSTANT(HAND_JOINT_THUMB_METACARPAL); @@ -1269,6 +1276,27 @@ OpenXRInterface::HandMotionRange OpenXRInterface::get_motion_range(const Hand p_ return HAND_MOTION_RANGE_MAX; } +OpenXRInterface::HandTrackedSource OpenXRInterface::get_hand_tracking_source(const Hand p_hand) const { + ERR_FAIL_INDEX_V(p_hand, HAND_MAX, HAND_TRACKED_SOURCE_UNKNOWN); + + OpenXRHandTrackingExtension *hand_tracking_ext = OpenXRHandTrackingExtension::get_singleton(); + if (hand_tracking_ext && hand_tracking_ext->get_active()) { + OpenXRHandTrackingExtension::HandTrackedSource source = hand_tracking_ext->get_hand_tracking_source(OpenXRHandTrackingExtension::HandTrackedHands(p_hand)); + switch (source) { + case OpenXRHandTrackingExtension::OPENXR_SOURCE_UNOBSTRUCTED: + return HAND_TRACKED_SOURCE_UNOBSTRUCTED; + case OpenXRHandTrackingExtension::OPENXR_SOURCE_CONTROLLER: + return HAND_TRACKED_SOURCE_CONTROLLER; + case OpenXRHandTrackingExtension::OPENXR_SOURCE_UNKNOWN: + return HAND_TRACKED_SOURCE_UNKNOWN; + default: + ERR_FAIL_V_MSG(HAND_TRACKED_SOURCE_UNKNOWN, "Unknown hand tracking source returned by OpenXR"); + } + } + + return HAND_TRACKED_SOURCE_UNKNOWN; +} + BitField<OpenXRInterface::HandJointFlags> OpenXRInterface::get_hand_joint_flags(Hand p_hand, HandJoints p_joint) const { BitField<OpenXRInterface::HandJointFlags> bits; |