// Copyright (c) Meta Platforms, Inc. and affiliates. #pragma once #include "OculusXRMovementXRIncludes.h" #include "IOpenXRExtensionPlugin.h" #include "OculusXRMovementTypes.h" #define LOCTEXT_NAMESPACE "OculusXRMovement" class FOpenXRHMD; namespace XRMovement { extern PFN_xrCreateEyeTrackerFB xrCreateEyeTrackerFB; extern PFN_xrDestroyEyeTrackerFB xrDestroyEyeTrackerFB; extern PFN_xrGetEyeGazesFB xrGetEyeGazesFB; class FEyeTrackingXR : public IOpenXRExtensionPlugin { public: // IOculusXROpenXRHMDPlugin virtual bool GetRequiredExtensions(TArray& OutExtensions) override; virtual bool GetOptionalExtensions(TArray& OutExtensions) override; virtual const void* OnCreateInstance(class IOpenXRHMDModule* InModule, const void* InNext) override; virtual const void* OnCreateSession(XrInstance InInstance, XrSystemId InSystem, const void* InNext) override; virtual void OnDestroySession(XrSession InSession) override; virtual void* OnWaitFrame(XrSession InSession, void* InNext) override; public: FEyeTrackingXR(); virtual ~FEyeTrackingXR(); void RegisterAsOpenXRExtension(); bool IsEyeTrackingSupported() const { return bExtEyeTrackingEnabled; } bool IsEyeTrackingEnabled() const { return EyeTracker != XR_NULL_HANDLE; } XrResult StartEyeTracking(); XrResult StopEyeTracking(); XrResult GetCachedEyeState(FOculusXREyeGazesState& OutState); private: void InitOpenXRFunctions(XrInstance InInstance); void Update_GameThread(XrSession InSession); bool bExtEyeTrackingEnabled; FOpenXRHMD* OpenXRHMD; FOculusXREyeGazesState CachedEyeState; XrEyeTrackerFB EyeTracker = XR_NULL_HANDLE; }; } // namespace XRMovement #undef LOCTEXT_NAMESPACE