add support for htc vive wrist trackers on android
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user