From d0c932444a9657c77052a51265f1809010965d34 Mon Sep 17 00:00:00 2001 From: Mamadou Babaei Date: Fri, 12 Jul 2024 20:37:31 +0200 Subject: [PATCH] apply some sgxrtracker enum parsing improvements --- .../Private/SGTracking/SGXRTracker.cpp | 79 +++++++++++-------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/Source/SenseGloveTracking/Private/SGTracking/SGXRTracker.cpp b/Source/SenseGloveTracking/Private/SGTracking/SGXRTracker.cpp index 0c65ae21..7430146a 100644 --- a/Source/SenseGloveTracking/Private/SGTracking/SGXRTracker.cpp +++ b/Source/SenseGloveTracking/Private/SGTracking/SGXRTracker.cpp @@ -92,9 +92,14 @@ struct FSGXRTracker::FImpl /** * Parses the enum name removing the prefix. */ - static FName ParseEOpenXRHandKeypointEnumName(const FName& EnumName); + static FName GetHandKeypointEnumName(const EHandKeypoint HandKeypoint); - static FName GetEControllerHandEnumName(const EControllerHand ControllerHand); + FORCEINLINE static FName GetHandKeypointEnumName(const int32 HandKeypointIndex) + { + return GetHandKeypointEnumName(static_cast(HandKeypointIndex)); + } + + static FName GetControllerHandEnumName(const EControllerHand ControllerHand); FORCEINLINE static bool ShouldFallbackToHandTrackingIfNoGloveDetected() { @@ -290,7 +295,7 @@ struct FSGXRTracker::FImpl FORCEINLINE static FName GetLeftPositionalTrackingHardwareMotionSourceName() { const FName Name{ - GetEControllerHandEnumName(GetWristTrackingSettings().LeftHandMotionSource) + GetControllerHandEnumName(GetWristTrackingSettings().LeftHandMotionSource) }; return Name; } @@ -298,7 +303,7 @@ struct FSGXRTracker::FImpl FORCEINLINE static FName GetRightPositionalTrackingHardwareMotionSourceName() { const FName Name{ - GetEControllerHandEnumName(GetWristTrackingSettings().RightHandMotionSource) + GetControllerHandEnumName(GetWristTrackingSettings().RightHandMotionSource) }; return Name; } @@ -698,22 +703,37 @@ struct FSGXRTracker::FImpl bool UpdateSGHandState(bool bRight, FSGXRHandState& OutHandState) const; }; -FName FSGXRTracker::FImpl::ParseEOpenXRHandKeypointEnumName(const FName& EnumName) +FName FSGXRTracker::FImpl::GetHandKeypointEnumName(const EHandKeypoint HandKeypoint) { + static UEnum* EnumPtr{StaticEnum()}; + ensureAlwaysMsgf(EnumPtr, TEXT("Failed to find the EHandKeypoint enum!")); static const int32 EnumNameLength = FString{TEXT("EHandKeypoint::")}.Len(); - const FString EnumString{EnumName.ToString()}; - const FName ParsedName{*EnumString.Right(EnumString.Len() - EnumNameLength)}; + + const FName EnumItemName{ + EnumPtr->GetNameByValue(static_cast(HandKeypoint)) + }; + const FString EnumItemString{EnumItemName.ToString()}; + const int32 EnumItemStringLength = EnumItemString.Len(); + const int32 EnumItemNameLength = EnumItemStringLength - EnumNameLength; + + const FName ParsedName{*EnumItemString.Right(EnumItemNameLength)}; return ParsedName; } -FName FSGXRTracker::FImpl::GetEControllerHandEnumName(const EControllerHand ControllerHand) +FName FSGXRTracker::FImpl::GetControllerHandEnumName(const EControllerHand ControllerHand) { + static UEnum* EnumPtr{StaticEnum()}; + ensureAlwaysMsgf(EnumPtr, TEXT("Failed to find the EControllerHand enum!")); static const int32 EnumNameLength = FString{TEXT("EControllerHand::")}.Len(); - const FName EnumName{ - StaticEnum()->GetNameByValue(static_cast(ControllerHand)) + + const FName EnumItemName{ + EnumPtr->GetNameByValue(static_cast(ControllerHand)) }; - const FString EnumString{EnumName.ToString()}; - const FName ParsedName{*EnumString.Right(EnumString.Len() - EnumNameLength)}; + const FString EnumItemString{EnumItemName.ToString()}; + const int32 EnumItemStringLength = EnumItemString.Len(); + const int32 EnumItemNameLength = EnumItemStringLength - EnumNameLength; + + const FName ParsedName{*EnumItemString.Right(EnumItemNameLength)}; return ParsedName; } @@ -1455,17 +1475,13 @@ void FSGXRTracker::EnumerateSources(TArray& SourcesOut) SourcesOut.Reserve(SourcesOut.Num() + (EHandKeypointCount * 2)); - const UEnum* EnumPtr{ - FindObject(nullptr, TEXT("/Script/HeadMountedDisplay.EHandKeypoint"), true) - }; - ensureAlwaysMsgf(EnumPtr, TEXT("Failed to find the HMD hand keypoint!")); - const FName& Left(FImpl::GetLeftHandTrackingMotionSourceName()); const FName& Right(FImpl::GetRightHandTrackingMotionSourceName()); for (int32 Keypoint = 0; Keypoint < EHandKeypointCount; Keypoint++) { - const FString EnumString{FImpl::ParseEOpenXRHandKeypointEnumName(EnumPtr->GetNameByValue(Keypoint)).ToString()}; + const FName EnumName{FImpl::GetHandKeypointEnumName(Keypoint)}; + const FString EnumString{EnumName.ToString()}; const FString StringLeft{FString::Printf(TEXT("%s%s"), *Left.ToString(), *EnumString)}; const FString StringRight{FString::Printf(TEXT("%s%s"), *Right.ToString(), *EnumString)}; FName SourceL(*(StringLeft)); @@ -1637,6 +1653,8 @@ FSGXRTracker::FImpl::~FImpl() = default; void FSGXRTracker::FImpl::BuildMotionSourceToKeypointMap() { + ensureAlwaysMsgf(IsInGameThread(), TEXT("Is not in the game thread!")); + if (!MotionSourceToKeypointMap.IsEmpty()) { return; @@ -1649,23 +1667,18 @@ void FSGXRTracker::FImpl::BuildMotionSourceToKeypointMap() // We also have the option of using more specific motion sources of the form HandTracking[Left|Right][Keypoint]. // This is useful if one wishes to use hand tracking and controllers simultaneously. // We also may support more generic legacy motion sources, by default we do support this. - const UEnum* EnumPtr{ - FindObject(nullptr, TEXT("/Script/HeadMountedDisplay.EHandKeypoint"), true) - }; - ensureAlwaysMsgf(EnumPtr, TEXT("Failed to find the HMD hand keypoint!")); - - ensureAlwaysMsgf(IsInGameThread(), TEXT("Is not in the game thread!")); const FName& Left(GetLeftHandTrackingMotionSourceName()); const FName& Right(GetRightHandTrackingMotionSourceName()); - for (int64 e = 0; e < EHandKeypointCount; ++e) + for (int32 KeypointIndex = 0; KeypointIndex < EHandKeypointCount; ++KeypointIndex) { - const EHandKeypoint EnumValue = static_cast(e); - const FString EnumName{EnumPtr->GetNameStringByValue(e)}; + const EHandKeypoint EnumValue = static_cast(KeypointIndex); + const FName EnumName{GetHandKeypointEnumName(KeypointIndex)}; + const FString EnumString{EnumName.ToString()}; - FName LeftName(Left.ToString() + EnumName); - FName RightName(Right.ToString() + EnumName); + FName LeftName(Left.ToString() + EnumString); + FName RightName(Right.ToString() + EnumString); MotionSourceToKeypointMap.Add(MoveTemp(LeftName), FSGMotionSourceInfo(EnumValue, true)); MotionSourceToKeypointMap.Add(MoveTemp(RightName), FSGMotionSourceInfo(EnumValue, false)); } @@ -1684,10 +1697,10 @@ void FSGXRTracker::FImpl::BuildMotionSourceToKeypointMap() const FSGWristTrackingSettings& WristTrackingSettings{GetWristTrackingSettings()}; const FName LeftHandSGMotionSourceName{ - GetEControllerHandEnumName(WristTrackingSettings.LeftHandMotionSource) + GetControllerHandEnumName(WristTrackingSettings.LeftHandMotionSource) }; const FName RightHandSGMotionSourceName{ - GetEControllerHandEnumName(WristTrackingSettings.RightHandMotionSource) + GetControllerHandEnumName(WristTrackingSettings.RightHandMotionSource) }; MotionSourceToKeypointMap.Add( LeftHandSGMotionSourceName, FSGMotionSourceInfo(EHandKeypoint::Wrist, true)); @@ -1781,7 +1794,7 @@ bool FSGXRTracker::FImpl::GetControllerTransform( ? WristTrackingSettings.RightHandMotionSource : WristTrackingSettings.LeftHandMotionSource; const FName& PositionalTrackingHardwareMotionSource{ - GetEControllerHandEnumName(PositionalTrackingHardwareHand) + GetControllerHandEnumName(PositionalTrackingHardwareHand) }; bool bTracked = false; @@ -1885,7 +1898,7 @@ bool FSGXRTracker::FImpl::GetWristTransform(const bool bRight, FTransform& OutTr ? WristTrackingSettings.RightHandMotionSource : WristTrackingSettings.LeftHandMotionSource; const FName& MotionSource{ - GetEControllerHandEnumName(PositionalTrackingHardwareHand) + GetControllerHandEnumName(PositionalTrackingHardwareHand) }; if (!ensureAlwaysMsgf(XRTrackingSystem, TEXT("Invalid XR tracking system!")))