apply some sgxrtracker enum parsing improvements
This commit is contained in:
@@ -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!")))
|
||||
|
||||
Reference in New Issue
Block a user