diff --git a/Source/StudyFrameworkPlugin/Private/GazeTracking/SFGazeTracker.cpp b/Source/StudyFrameworkPlugin/Private/GazeTracking/SFGazeTracker.cpp index 2f12fff78360300096ec0539400deb5c5c12a669..3001ae07ed838fa7a63e844ec0a9eb61fb4eff48 100644 --- a/Source/StudyFrameworkPlugin/Private/GazeTracking/SFGazeTracker.cpp +++ b/Source/StudyFrameworkPlugin/Private/GazeTracking/SFGazeTracker.cpp @@ -22,17 +22,26 @@ bool USFGazeTracker::Tick(float DeltaTime) TimeSinceLastEyeDataGather = 0.0f; - if(bEyeTrackingStarted) + if(bEyeTrackingStarted && !bIsAsyncEyeTrackingTaskRunning) { #ifdef WITH_SRANIPAL - ViveSR::anipal::Eye::GetEyeData_v2(&SranipalEyeData); - bDataLogged = false; + bIsAsyncEyeTrackingTaskRunning = true; + ViveSR::anipal::Eye::EyeData_v2 TempEyeData; + AsyncTask(ENamedThreads::AnyThread, [TempEyeDataAddr = MoveTemp(&TempEyeData), OnEyeTrackingDataReceived]() + { + ViveSR::anipal::Eye::GetEyeData_v2(TempEyeDataAddr); + + AsyncTask(ENamedThreads::GameThread, [TempEyeDataAddr = MoveTemp(TempEyeDataAddr), OnEyeTrackingDataReceived]() mutable + { + OnEyeTrackingDataReceived.ExecuteIfBound(*TempEyeDataAddr); + }); + + }); #endif } return true; } - void USFGazeTracker::Init(EGazeTrackerMode Mode, bool IgnoreNonGazeTargetActors, float DataGatheringsPerSecond) { bIgnoreNonGazeTargetActors = IgnoreNonGazeTargetActors; @@ -238,6 +247,13 @@ float USFGazeTracker::GetPupilDiameter() return 0.0f; } +void USFGazeTracker::OnEyeTrackingDataReceived(ViveSR::anipal::Eye::EyeData_v2 EyeData) +{ + bIsAsyncEyeTrackingTaskRunning = false; + SranipalEyeData = EyeData; + bDataLogged = false; +} + FGazeRay USFGazeTracker::GetSranipalGazeRayFromData() { FGazeRay GazeRay; diff --git a/Source/StudyFrameworkPlugin/Public/GazeTracking/SFGazeTracker.h b/Source/StudyFrameworkPlugin/Public/GazeTracking/SFGazeTracker.h index ff0044f7e4085d69a6fe3d03ce261ce21dd9c031..25782c8e8604887d40a8f76d15a05b3a705b2bcd 100644 --- a/Source/StudyFrameworkPlugin/Public/GazeTracking/SFGazeTracker.h +++ b/Source/StudyFrameworkPlugin/Public/GazeTracking/SFGazeTracker.h @@ -1,7 +1,7 @@ #pragma once #include "CoreMinimal.h" - +#include "Async/Async.h" #ifdef WITH_SRANIPAL #include "Eye/SRanipal_API_Eye.h" @@ -9,6 +9,11 @@ #include "SFGazeTracker.generated.h" +#ifdef WITH_SRANIPAL +//Use this to broadcast the data from async thread to game thread for logging +DECLARE_DYNAMIC_DELEGATE_OneParam(FOnEyeTrackingDataReceived, const ViveSR::anipal::Eye::EyeData_v2, EyeData); +#endif + UENUM() enum class EGazeTrackerMode : uint8 { @@ -76,13 +81,17 @@ public: bool bDebugRenderRayTraces = false; - +#ifdef WITH_SRANIPAL + FOnEyeTrackingDataReceived& OnEyeTrackingDataReceived; + void OnEyeTrackingDataReceived(ViveSR::anipal::Eye::EyeData_v2 EyeData); +#endif private: FGazeRay GetSranipalGazeRayFromData(); bool bEyeTrackingStarted = false; + bool bIsAsyncEyeTrackingTaskRunning = false; bool bIgnoreNonGazeTargetActors = false; UPROPERTY() TArray<AActor*> ActorsToIgnore;