add support for htc vive wrist trackers on android

This commit is contained in:
Mamadou Babaei
2025-02-14 12:11:14 +01:00
parent 251dbb4840
commit 079fe14613
7 changed files with 155 additions and 35 deletions
@@ -60,6 +60,7 @@
#include "SGTypes/SGCoreTypes.h"
#include "SGTypes/SGTrackingTypes.h"
#include "SGUtils/SGEngineUtils.h"
#include "SGUtils/SGPluginUtils.h"
#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION <= 3
void EnumerateOpenXRApiLayers(TArray<XrApiLayerProperties>& OutProperties)
@@ -100,6 +101,9 @@ struct FSGXRTracker::FImpl
static FName GetControllerHandEnumName(const EControllerHand ControllerHand);
static FName GetOpenXRPositionalTrackingProviderEnumName(
const ESGOpenXRPositionalTrackingProvider OpenXRPositionalTrackingProvider);
FORCEINLINE static bool ShouldFallbackToHandTrackingIfNoGloveDetected()
{
const USGSettings* Settings{USGSettings::GetInstance()};
@@ -658,6 +662,8 @@ struct FSGXRTracker::FImpl
bool UpdateXRHandTrackingData(FSGXRHandState& OutHandState, const XrHandJointsLocateInfoEXT& LocateInfo) const;
FName GetTargetOpenXRPositionalTrackingProviderName() const;
bool GetControllerTransform(const FName MotionSource, const float WorldToMetersScale,
FTransform& OutTransform, bool& bOutMotionSourceHandTracking) const;
@@ -732,6 +738,24 @@ FName FSGXRTracker::FImpl::GetControllerHandEnumName(const EControllerHand Contr
return ParsedName;
}
FName FSGXRTracker::FImpl::GetOpenXRPositionalTrackingProviderEnumName(
const ESGOpenXRPositionalTrackingProvider OpenXRPositionalTrackingProvider)
{
static UEnum* EnumPtr{StaticEnum<ESGOpenXRPositionalTrackingProvider>()};
ensureAlwaysMsgf(EnumPtr, TEXT("Failed to find the ESGOpenXRPositionalTrackingProvider enum!"));
static const int32 EnumNameLength = FString{TEXT("ESGOpenXRPositionalTrackingProvider::")}.Len();
const FName EnumItemName{
EnumPtr->GetNameByValue(static_cast<int64>(OpenXRPositionalTrackingProvider))
};
const FString EnumItemString{EnumItemName.ToString()};
const int32 EnumItemStringLength = EnumItemString.Len();
const int32 EnumItemNameLength = EnumItemStringLength - EnumNameLength;
const FName ParsedName{*EnumItemString.Right(EnumItemNameLength)};
return ParsedName;
}
ESGPositionalTrackingHardware FSGXRTracker::FImpl::GetPositionalTrackingHardware()
{
ESGPositionalTrackingHardware TrackerHardware = GetWristTrackingSettings().TrackingHardware;
@@ -2091,6 +2115,55 @@ bool FSGXRTracker::FImpl::UpdateXRHandTrackingData(
return true;
}
FName FSGXRTracker::FImpl::GetTargetOpenXRPositionalTrackingProviderName() const
{
const FSGWristTrackingSettings& WristTrackingSettings{GetWristTrackingSettings()};
ESGOpenXRPositionalTrackingProvider PositionalTrackingProvider =
WristTrackingSettings.OpenXRPositionalTrackingProvider;
if (PositionalTrackingProvider == ESGOpenXRPositionalTrackingProvider::None)
{
const bool bIsAHtcViveDevice = FSGHMDTracker::IsAHtcViveDevice();
if (bIsAHtcViveDevice)
{
#if PLATFORM_ANDROID
PositionalTrackingProvider = ESGOpenXRPositionalTrackingProvider::OpenXRViveWristTracker;
#else /* PLATFORM_ANDROID */
// TODO
// Revisit this later!
// For now only `Emulate VIVE Wrist Tracker as VIVE Tracker` option in VBE works on Windows
// const bool bIsViveOpenXRPluginLoaded = FSGPluginUtils::IsViveOpenXRPluginAvailable();
// if (bIsViveOpenXRPluginLoaded)
// {
// if (WristTrackingSettings.TrackingHardware == ESGPositionalTrackingHardware::ViveFocus3WristTracker)
// {
// PositionalTrackingProvider = ESGOpenXRPositionalTrackingProvider::OpenXRViveWristTracker;
// }
// else
// {
// PositionalTrackingProvider = ESGOpenXRPositionalTrackingProvider::OpenXRViveTracker;
// }
// }
// else
// {
// PositionalTrackingProvider = ESGOpenXRPositionalTrackingProvider::OpenXRViveTracker;
// }
PositionalTrackingProvider = ESGOpenXRPositionalTrackingProvider::OpenXRViveTracker;
#endif /* PLATFORM_ANDROID */
}
else
{
PositionalTrackingProvider = ESGOpenXRPositionalTrackingProvider::OpenXR;
}
}
const FName PositionalTrackingProviderName{
GetOpenXRPositionalTrackingProviderEnumName(PositionalTrackingProvider)
};
return PositionalTrackingProviderName;
}
bool FSGXRTracker::FImpl::GetControllerTransform(
const FName MotionSource, const float WorldToMetersScale,
FTransform& OutTransform, bool& bOutMotionSourceHandTracking) const
@@ -2111,9 +2184,6 @@ bool FSGXRTracker::FImpl::GetControllerTransform(
return false;
}
static const FName OpenXRName{TEXT("OpenXR")};
static const FName OpenXRViveTrackerName{TEXT("OpenXRViveTracker")};
const FSGWristTrackingSettings& WristTrackingSettings{GetWristTrackingSettings()};
const FName& PositionalTrackingHardwareMotionSource{
bRight
@@ -2125,26 +2195,15 @@ bool FSGXRTracker::FImpl::GetControllerTransform(
if (MotionSource == PositionalTrackingHardwareMotionSource)
{
const FName TargetPositionalTrackingProviderName{
GetTargetOpenXRPositionalTrackingProviderName()
};
const TArray<IMotionController*> MotionControllers{
IModularFeatures::Get().GetModularFeatureImplementations<IMotionController>(
IMotionController::GetModularFeatureName())
};
bool bLookingForViveTrackers = false;
if (WristTrackingSettings.TrackingHardware == ESGPositionalTrackingHardware::ViveTracker
|| WristTrackingSettings.TrackingHardware == ESGPositionalTrackingHardware::ViveFocus3WristTracker)
{
bLookingForViveTrackers = true;
}
else if (WristTrackingSettings.TrackingHardware == ESGPositionalTrackingHardware::None)
{
const bool bIsAHtcViveDevice = FSGHMDTracker::IsAHtcViveDevice();
if (bIsAHtcViveDevice)
{
bLookingForViveTrackers = true;
}
}
for (const IMotionController* MotionController: MotionControllers)
{
if (!MotionController)
@@ -2159,22 +2218,13 @@ bool FSGXRTracker::FImpl::GetControllerTransform(
continue;
}
if (bLookingForViveTrackers)
const FName DeviceTypeName{MotionController->GetMotionControllerDeviceTypeName()};
SGLOG("SGVIVEDEBUG", DeviceTypeName, TargetPositionalTrackingProviderName);
if (DeviceTypeName != TargetPositionalTrackingProviderName)
{
const FName DeviceTypeName{MotionController->GetMotionControllerDeviceTypeName()};
if (DeviceTypeName != OpenXRViveTrackerName)
{
continue;
}
}
else
{
const FName DeviceTypeName{MotionController->GetMotionControllerDeviceTypeName()};
if (DeviceTypeName != OpenXRName)
{
continue;
}
continue;
}
SGLOG("SGVIVEDEBUG", DeviceTypeName, TargetPositionalTrackingProviderName, "Matched");
FRotator Orientation;
FVector Position;