October3d55/Matain/ViveOpenXR/Source/ViveOpenXREyeTracker/Private/ViveOpenXREyeTracker.h

117 lines
4.9 KiB
C
Raw Normal View History

2025-03-10 09:43:27 +08:00
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "IViveOpenXREyeTrackerModule.h"
#include "IEyeTracker.h"
#include "IOpenXRExtensionPlugin.h"
#include "HTCEyeTrackerTypes.h"
DECLARE_LOG_CATEGORY_EXTERN(LogViveOpenXREyeTracker, Log, All);
class AHUD;
class FDebugDisplayInfo;
class UCanvas;
struct FHTCEyeTrackerExtesionDispatchTable
{
PFN_xrGetSystemProperties xrGetSystemProperties;
PFN_xrCreateEyeTrackerHTC xrCreateEyeTrackerHTC;
PFN_xrDestroyEyeTrackerHTC xrDestroyEyeTrackerHTC;
PFN_xrGetEyeGazeDataHTC xrGetEyeGazeDataHTC;
PFN_xrGetEyePupilDataHTC xrGetEyePupilDataHTC;
PFN_xrGetEyeGeometricDataHTC xrGetEyeGeometricDataHTC;
};
class FViveOpenXREyeTracker : public IEyeTracker, public IOpenXRExtensionPlugin
{
public:
FViveOpenXREyeTracker();
virtual ~FViveOpenXREyeTracker();
/************************************************************************/
/* IEyeTracker */
/************************************************************************/
void Destroy();
virtual void SetEyeTrackedPlayer(APlayerController* PlayerController) override {};
virtual bool GetEyeTrackerGazeData(FEyeTrackerGazeData& OutGazeData) const override;
virtual bool GetEyeTrackerStereoGazeData(FEyeTrackerStereoGazeData& OutGazeData) const override;
virtual EEyeTrackerStatus GetEyeTrackerStatus() const override;
virtual bool IsStereoGazeDataAvailable() const override;
/************************************************************************/
/* IOpenXRExtensionPlugin */
/************************************************************************/
virtual FString GetDisplayName() override
{
return FString(TEXT("ViveOpenXREyeTracker"));
}
virtual bool GetRequiredExtensions(TArray<const ANSICHAR*>& OutExtensions) override;
virtual void PostCreateInstance(XrInstance InInstance) override;
virtual bool GetInteractionProfile(XrInstance InInstance, FString& OutKeyPrefix, XrPath& OutPath, bool& OutHasHaptics) override;
virtual void AttachActionSets(TSet<XrActionSet>& OutActionSets) override;
virtual void PostGetSystem(XrInstance InInstance, XrSystemId InSystem) override;
virtual void PostCreateSession(XrSession InSession) override;
virtual const void* OnCreateSession(XrInstance InInstance, XrSystemId InSystem, const void* InNext) override;
virtual const void* OnBeginSession(XrSession InSession, const void* InNext) override;
virtual void OnDestroySession(XrSession InSession) override;
virtual void GetActiveActionSetsForSync(TArray<XrActiveActionSet>& OutActiveSets) override;
virtual void PostSyncActions(XrSession InSession) override;
virtual void UpdateDeviceLocations(XrSession InSession, XrTime DisplayTime, XrSpace TrackingSpace) override;
void DrawDebug(AHUD* HUD, UCanvas* Canvas, const FDebugDisplayInfo& DisplayInfo, float& YL, float& YPos);
public:
XrEyeTrackerHTC EyeTrackerHTC = XR_NULL_HANDLE;
XrEyeGazeDataHTC EyeGazesHTC{ XR_TYPE_EYE_GAZE_DATA_HTC, nullptr };
XrEyePupilDataHTC PupilDatasHTC{ XR_TYPE_EYE_PUPIL_DATA_HTC, nullptr };
XrEyeGeometricDataHTC EyeGeometricDatasHTC{ XR_TYPE_EYE_GEOMETRIC_DATA_HTC, nullptr };
FXrGazeDataHTC GetEyeGazeValidDatas();
FXrPupilDataHTC GetPupilDatas();
FXrEyeGeometricDataHTC GetEyeGeometricDatas();
private:
bool isHTCEyeTrackerSupported = false;
class IXRTrackingSystem* XRTrackingSystem = nullptr;
XrInstance Instance = XR_NULL_HANDLE;
XrSession Session = XR_NULL_HANDLE;
XrSystemId SystemId;
bool bSessionStarted = false;
XrActionsSyncInfo SyncInfo{ XR_TYPE_ACTIONS_SYNC_INFO };
XrAction EyeTrackerAction = XR_NULL_HANDLE;
XrActionSet EyeTrackerActionSet = XR_NULL_HANDLE;
XrSpace GazeActionSpace = XR_NULL_HANDLE;
XrActionStatePose ActionStatePose{ XR_TYPE_ACTION_STATE_POSE };
// EyeTracker cached data
XrSpaceLocation EyeTrackerSpaceLocation{ XR_TYPE_SPACE_LOCATION };
FHTCEyeTrackerExtesionDispatchTable FHTCEyeTracker_ext{};
};
class FViveOpenXREyeTrackerModule : public IViveOpenXREyeTrackerModule
{
/************************************************************************/
/* IInputDeviceModule */
/************************************************************************/
public:
FViveOpenXREyeTrackerModule();
virtual void StartupModule() override;
virtual void ShutdownModule() override;
virtual TSharedPtr< class IEyeTracker, ESPMode::ThreadSafe > CreateEyeTracker() override;
/************************************************************************/
/* IEyeTrackerModule */
/************************************************************************/
virtual bool IsEyeTrackerConnected() const override;
private:
TSharedPtr<FViveOpenXREyeTracker, ESPMode::ThreadSafe> EyeTracker;
FDelegateHandle OnDrawDebugHandle;
void OnDrawDebug(AHUD* HUD, UCanvas* Canvas, const FDebugDisplayInfo& DisplayInfo, float& YL, float& YPos);
};