From f43363e89849d2a167fa02f351cf2973697dae48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20K=C3=B6gel?= <koegel@vr.rwth-aachen.de> Date: Tue, 5 Sep 2023 17:10:44 +0200 Subject: [PATCH] Attempted to execute getting the eye tracking data as an asynchronous task. Currently it does not compile, apparently the delegate is not defined correctly? --- .../Private/GazeTracking/SFGazeTracker.cpp | 24 +++++++++++++++---- .../Public/GazeTracking/SFGazeTracker.h | 13 ++++++++-- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Source/StudyFrameworkPlugin/Private/GazeTracking/SFGazeTracker.cpp b/Source/StudyFrameworkPlugin/Private/GazeTracking/SFGazeTracker.cpp index 2f12fff..3001ae0 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 ff0044f..25782c8 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; -- GitLab