// 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& OutExtensions) override; 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; bool TryGetBodyState(FBodyStatePICO& outBodyState, float WorldToMeters = 100.0f); bool IsBodyTrackingEnabled(); bool IsBodyTrackingSupported(); bool StartBodyTracking(EBodyTrackingModePICO Mode); bool StopBodyTracking(); private: PFN_xrCreateBodyTrackerBD xrCreateBodyTrackerBD = nullptr; PFN_xrDestroyBodyTrackerBD xrDestroyBodyTrackerBD = nullptr; PFN_xrLocateBodyJointsBD xrLocateBodyJointsBD = nullptr; bool bCurrentDeviceSupportBodyTracking = false; XrInstance Instance = XR_NULL_HANDLE; XrSession Session = XR_NULL_HANDLE; XrBodyTrackerBD BodyTracker = XR_NULL_HANDLE; bool bBodyTrackerIsRunning = false; XrTime PredictedTime = 0; XrSpace BaseSpace = XR_NULL_HANDLE; TArray Locations; };