summaryrefslogtreecommitdiffstats
path: root/modules/openxr/extensions/openxr_eye_gaze_interaction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/openxr/extensions/openxr_eye_gaze_interaction.cpp')
-rw-r--r--modules/openxr/extensions/openxr_eye_gaze_interaction.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/modules/openxr/extensions/openxr_eye_gaze_interaction.cpp b/modules/openxr/extensions/openxr_eye_gaze_interaction.cpp
index 477a1c2609..eea996edd9 100644
--- a/modules/openxr/extensions/openxr_eye_gaze_interaction.cpp
+++ b/modules/openxr/extensions/openxr_eye_gaze_interaction.cpp
@@ -34,6 +34,7 @@
#include "core/os/os.h"
#include "../action_map/openxr_interaction_profile_metadata.h"
+#include "../openxr_api.h"
OpenXREyeGazeInteractionExtension *OpenXREyeGazeInteractionExtension::singleton = nullptr;
@@ -106,3 +107,38 @@ void OpenXREyeGazeInteractionExtension::on_register_metadata() {
metadata->register_interaction_profile("Eye gaze", "/interaction_profiles/ext/eye_gaze_interaction", XR_EXT_EYE_GAZE_INTERACTION_EXTENSION_NAME);
metadata->register_io_path("/interaction_profiles/ext/eye_gaze_interaction", "Gaze pose", "/user/eyes_ext", "/user/eyes_ext/input/gaze_ext/pose", "", OpenXRAction::OPENXR_ACTION_POSE);
}
+
+bool OpenXREyeGazeInteractionExtension::get_eye_gaze_pose(double p_dist, Vector3 &r_eye_pose) {
+ OpenXRAPI *openxr_api = OpenXRAPI::get_singleton();
+ ERR_FAIL_NULL_V(openxr_api, false);
+
+ if (!init_eye_gaze_pose) {
+ init_eye_gaze_pose = true;
+
+ eye_tracker = openxr_api->find_tracker("/user/eyes_ext");
+ if (eye_tracker.is_null()) {
+ WARN_PRINT("Couldn't obtain eye tracker");
+ }
+
+ eye_action = openxr_api->find_action("eye_gaze_pose");
+ if (eye_action.is_null()) {
+ WARN_PRINT("Couldn't obtain pose action for `eye_gaze_pose`, make sure to add this to your action map.");
+ }
+ }
+
+ if (eye_tracker.is_null() || eye_action.is_null()) {
+ return false;
+ }
+
+ Transform3D eye_transform;
+ Vector3 linear_velocity;
+ Vector3 angular_velocity;
+ XRPose::TrackingConfidence confidence = openxr_api->get_action_pose(eye_action, eye_tracker, eye_transform, linear_velocity, angular_velocity);
+ if (confidence == XRPose::XR_TRACKING_CONFIDENCE_NONE) {
+ return false;
+ }
+
+ r_eye_pose = eye_transform.origin + eye_transform.basis[2] * p_dist;
+
+ return true;
+}