summaryrefslogtreecommitdiffstats
path: root/modules/openxr/extensions/openxr_eye_gaze_interaction.cpp
diff options
context:
space:
mode:
authorBastiaan Olij <mux213@gmail.com>2024-03-26 12:57:26 +1100
committerBastiaan Olij <mux213@gmail.com>2024-05-03 17:20:30 +1000
commit9042ddf19f33445abbb69a8330fff7e98fcda2dc (patch)
tree6e3fc77e57d3b032d525e9d02dd753cc99ac65af /modules/openxr/extensions/openxr_eye_gaze_interaction.cpp
parent34b5e8f55cb7d09977074b1486bbdf00d5c16a01 (diff)
downloadredot-engine-9042ddf19f33445abbb69a8330fff7e98fcda2dc.tar.gz
Improvements to VRS/Foveated rendering
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;
+}