apply some sgxrtracker enum parsing improvements

This commit is contained in:
Mamadou Babaei
2024-07-12 20:37:31 +02:00
parent 72f56ac9ff
commit c662af475d
@@ -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<EHandKeypoint>(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<EHandKeypoint>()};
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<int64>(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<EControllerHand>()};
ensureAlwaysMsgf(EnumPtr, TEXT("Failed to find the EControllerHand enum!"));
static const int32 EnumNameLength = FString{TEXT("EControllerHand::")}.Len();
const FName EnumName{
StaticEnum<EControllerHand>()->GetNameByValue(static_cast<int64>(ControllerHand))
const FName EnumItemName{
EnumPtr->GetNameByValue(static_cast<int64>(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<FMotionControllerSource>& SourcesOut)
SourcesOut.Reserve(SourcesOut.Num() + (EHandKeypointCount * 2));
const UEnum* EnumPtr{
FindObject<UEnum>(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<UEnum>(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<EHandKeypoint>(e);
const FString EnumName{EnumPtr->GetNameStringByValue(e)};
const EHandKeypoint EnumValue = static_cast<EHandKeypoint>(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!")))