2025-03-10 09:43:27 +08:00
|
|
|
// Copyright 2023 PICO Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "CoreMinimal.h"
|
|
|
|
|
#include "PICO_MovementFunctionLibrary.h"
|
|
|
|
|
#include "IOpenXRExtensionPlugin.h"
|
|
|
|
|
|
|
|
|
|
class FBodyTrackingPICO : public IOpenXRExtensionPlugin
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
FBodyTrackingPICO();
|
|
|
|
|
virtual ~FBodyTrackingPICO() {}
|
|
|
|
|
|
|
|
|
|
void Register();
|
|
|
|
|
void Unregister();
|
|
|
|
|
|
|
|
|
|
/** IOpenXRExtensionPlugin */
|
|
|
|
|
virtual FString GetDisplayName() override
|
|
|
|
|
{
|
|
|
|
|
return FString(TEXT("BodyTrackingPICO"));
|
|
|
|
|
}
|
|
|
|
|
virtual bool GetRequiredExtensions(TArray<const ANSICHAR*>& OutExtensions) override;
|
2025-07-29 14:53:32 +08:00
|
|
|
virtual bool GetOptionalExtensions(TArray<const ANSICHAR*>& OutExtensions) override;
|
2025-03-10 09:43:27 +08:00
|
|
|
virtual const void* OnGetSystem(XrInstance InInstance, const void* InNext) override;
|
|
|
|
|
virtual void PostGetSystem(XrInstance InInstance, XrSystemId InSystem) override;
|
|
|
|
|
virtual void PostCreateSession(XrSession InSession) override;
|
|
|
|
|
virtual void UpdateDeviceLocations(XrSession InSession, XrTime DisplayTime, XrSpace TrackingSpace) override;
|
|
|
|
|
|
2025-07-21 10:22:56 +08:00
|
|
|
bool TryGetBodyState(FBodyStatePICO& outBodyState, float WorldToMeters = 100.0f, bool QueryAcc = false, bool QueryVel = false, bool QueryPostureFlag = false);
|
2025-03-10 09:43:27 +08:00
|
|
|
bool IsBodyTrackingEnabled();
|
|
|
|
|
bool IsBodyTrackingSupported();
|
|
|
|
|
bool StartBodyTracking(EBodyTrackingModePICO Mode);
|
|
|
|
|
bool StopBodyTracking();
|
|
|
|
|
|
2025-07-21 10:22:56 +08:00
|
|
|
bool StartBodyTrackingCalibApp();
|
|
|
|
|
bool GetBodyTrackingState(EBodyTrackingStatusPICO& Status, EBodyTrackingErrorCodePICO& Error);
|
|
|
|
|
|
2025-03-10 09:43:27 +08:00
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
PFN_xrCreateBodyTrackerBD xrCreateBodyTrackerBD = nullptr;
|
|
|
|
|
PFN_xrDestroyBodyTrackerBD xrDestroyBodyTrackerBD = nullptr;
|
|
|
|
|
PFN_xrLocateBodyJointsBD xrLocateBodyJointsBD = nullptr;
|
|
|
|
|
bool bCurrentDeviceSupportBodyTracking = false;
|
2025-07-21 10:22:56 +08:00
|
|
|
XrInstance Instance;
|
|
|
|
|
XrSession Session;
|
|
|
|
|
XrBodyTrackerBD BodyTracker;
|
|
|
|
|
bool bBodyTrackerIsRunning;
|
2025-07-29 14:53:32 +08:00
|
|
|
bool bSupportBodyTracking2 = false;
|
|
|
|
|
|
2025-07-21 10:22:56 +08:00
|
|
|
XrTime PredictedTime;
|
|
|
|
|
XrSpace BaseSpace;
|
2025-03-10 09:43:27 +08:00
|
|
|
TArray<XrBodyJointLocationBD> Locations;
|
2025-07-21 10:22:56 +08:00
|
|
|
TArray<XrBodyTrackingPosturePICO> PostureFlags;
|
|
|
|
|
TArray<XrBodyJointVelocityPICO> Velocities;
|
|
|
|
|
TArray<XrBodyJointAccelerationPICO> Accelerations;
|
|
|
|
|
PFN_xrStartBodyTrackingCalibrationAppPICO xrStartBodyTrackingCalibrationAppPICO = nullptr;
|
|
|
|
|
PFN_xrGetBodyTrackingStatePICO xrGetBodyTrackingStatePICO = nullptr;
|
2025-03-10 09:43:27 +08:00
|
|
|
};
|