October3d55/Matain/ViveOpenXR/Source/ViveOpenXRAnchor/Private/ViveOpenXRAnchorModule.h

137 lines
7.2 KiB
C++

// Copyright HTC Corporation. All Rights Reserved.
#pragma once
// Must include earlier than Unreal's OpenXR header
#include "ViveOpenXRWrapper.h"
#include "IOpenXRExtensionPlugin.h"
#include "OpenXRHMD.h"
#include "ViveOpenXRFuture.h"
DECLARE_LOG_CATEGORY_EXTERN(ViveOXRAnchor, Log, All);
class VIVEOPENXRANCHOR_API FViveOpenXRAnchor : public IModuleInterface, public IOpenXRExtensionPlugin, public IOpenXRCustomAnchorSupport
{
public:
FViveOpenXRAnchor() {}
virtual ~FViveOpenXRAnchor() {}
static FOpenXRHMD* HMD();
static FViveOpenXRAnchor* Instance();
/* IModuleInterface */
virtual void StartupModule() override;
virtual void ShutdownModule() override;
/** IOpenXRExtensionPlugin implementation */
virtual FString GetDisplayName() override;
virtual bool GetRequiredExtensions(TArray<const ANSICHAR*>& OutExtensions) override;
virtual bool GetOptionalExtensions(TArray<const ANSICHAR*>& OutExtensions) override;
virtual const void* OnCreateSession(XrInstance InInstance, XrSystemId InSystem, const void* InNext) override;
virtual void PostCreateSession(XrSession InSession) override;
virtual IOpenXRCustomAnchorSupport* GetCustomAnchorSupport() override;
virtual void OnStartARSession(class UARSessionConfig* SessionConfig) override;
/** Stop the AR system but leave its internal state intact. */
virtual void OnPauseARSession() override;
/** Stop the AR system and reset its internal state; this task must succeed. */
virtual void OnStopARSession() override;
/** IOpenXRCustomAnchorSupport implementation */
virtual bool OnPinComponent(class UARPin* Pin, XrSession InSession, XrSpace TrackingSpace, XrTime DisplayTime, float worldToMeterScale) override;
virtual void OnRemovePin(class UARPin* Pin) override;
virtual void OnUpdatePin(class UARPin* Pin, XrSession InSession, XrSpace TrackingSpace, XrTime DisplayTime, float worldToMeterScale) override;
virtual bool IsLocalPinSaveSupported() const override;
virtual bool ArePinsReadyToLoad() override;
virtual void LoadARPins(XrSession InSession, TFunction<UARPin* (FName)> OnCreatePin) override;
virtual bool SaveARPin(XrSession InSession, FName InName, UARPin* InPin) override;
virtual void RemoveSavedARPin(XrSession InSession, FName InName) override;
virtual void RemoveAllSavedARPins(XrSession InSession) override;
public:
// Space functions
XrResult LocateSpace(XrSpace space, XrSpace baseSpace, XrTime time, XrSpaceLocation* location);
XrResult DestroySpace(XrSpace space);
// Extension functions
bool CreateSpatialAnchor(const XrSpatialAnchorCreateInfoHTC* createInfo, XrSpace* anchor);
bool GetSpatialAnchorName(XrSpace anchor, XrSpatialAnchorNameHTC* name);
// Persisted Anchor functions
XrResult AcquirePersistedAnchorCollectionAsync(XrFutureEXT* future);
XrResult AcquirePersistedAnchorCollectionComplete(XrFutureEXT future, XrPersistedAnchorCollectionAcquireCompletionHTC* completion);
XrResult ReleasePersistedAnchorCollection(XrPersistedAnchorCollectionHTC collection);
XrResult PersistSpatialAnchorAsync(XrPersistedAnchorCollectionHTC collection, const XrSpatialAnchorPersistInfoHTC* info, XrFutureEXT* future);
XrResult PersistSpatialAnchorComplete(XrFutureEXT future, XrFutureCompletionEXT* completion);
XrResult UnpersistSpatialAnchor(XrPersistedAnchorCollectionHTC collection, const XrSpatialAnchorNameHTC* name);
XrResult EnumeratePersistedAnchorNames(XrPersistedAnchorCollectionHTC collection, uint32_t nameCapacity, uint32_t* nameCount, XrSpatialAnchorNameHTC* names);
XrResult CreateSpatialAnchorFromPersistedAnchorAsync(const XrSpatialAnchorFromPersistedAnchorCreateInfoHTC* info, XrFutureEXT* future);
XrResult CreateSpatialAnchorFromPersistedAnchorComplete(XrFutureEXT future, XrSpatialAnchorFromPersistedAnchorCreateCompletionHTC* completion);
XrResult ClearPersistedAnchors(XrPersistedAnchorCollectionHTC collection);
XrResult GetPersistedAnchorProperties(XrPersistedAnchorCollectionHTC collection, XrPersistedAnchorPropertiesGetInfoHTC* properties);
XrResult ExportPersistedAnchor(XrPersistedAnchorCollectionHTC collection, const XrSpatialAnchorNameHTC* name, uint32_t dataCapacity, uint32_t* dataCount, char* data);
XrResult ImportPersistedAnchor(XrPersistedAnchorCollectionHTC collection, uint32_t dataCount, const char* data);
XrResult GetPersistedAnchorNameFromBuffer(XrPersistedAnchorCollectionHTC collection, uint32_t bufferCount, const char* buffer, XrSpatialAnchorNameHTC* name);
public:
// Helper functions
XrSpatialAnchorCreateInfoHTC MakeCreateInfo(const FVector& InLocation, const FQuat& InRotation, XrSpace baseSpace, FString name, float worldToMeterScale);
bool LocateAnchor(XrSpace anchor, FRotator& rotation, FVector& translation);
inline bool IsSupported() const { return isAnchorSupported; }
inline bool IsPersistenceSupported() const { return isAnchorPersistenceSupported; }
inline void* GetARCollection() { return paCollectionAR; }
XrSpatialAnchorFromPersistedAnchorCreateInfoHTC MakeSpatialAnchorFromPersistedAnchorCreateInfo(XrPersistedAnchorCollectionHTC collection, const FString persistedAnchorName, const FString anchorName);
static FString GenerateAnchorName(FString prefix);
static FString ToFString(const XrSpatialAnchorNameHTC& name);
static XrSpatialAnchorNameHTC FromFString(const FString& name);
void CheckPersistedAnchorCollectionAR();
private:
static FOpenXRHMD* hmd;
static FViveOpenXRAnchor* instance;
bool m_bEnableAnchor = false;
bool m_bExtAnchorEnabled = false;
bool m_bExtAnchorPersistenceEnabled = false;
XrSession m_Session = XR_NULL_HANDLE;
bool isAnchorSupported = false;
bool isAnchorPersistenceSupported = false;
XrPersistedAnchorCollectionHTC paCollectionAR = nullptr;
XrFutureEXT pacFuture = nullptr;
bool isARRequestedPersistedAnchorCollection = false;
double timeSinceARStarted;
/* OpenXR Function Ptrs */
PFN_xrLocateSpace xrLocateSpace = nullptr;
PFN_xrDestroySpace xrDestroySpace = nullptr;
PFN_xrCreateSpatialAnchorHTC xrCreateSpatialAnchorHTC = nullptr;
PFN_xrGetSpatialAnchorNameHTC xrGetSpatialAnchorNameHTC = nullptr;
// New function pointers for persisted anchors
PFN_xrAcquirePersistedAnchorCollectionAsyncHTC xrAcquirePersistedAnchorCollectionAsyncHTC = nullptr;
PFN_xrAcquirePersistedAnchorCollectionCompleteHTC xrAcquirePersistedAnchorCollectionCompleteHTC = nullptr;
PFN_xrReleasePersistedAnchorCollectionHTC xrReleasePersistedAnchorCollectionHTC = nullptr;
PFN_xrPersistSpatialAnchorAsyncHTC xrPersistSpatialAnchorAsyncHTC = nullptr;
PFN_xrPersistSpatialAnchorCompleteHTC xrPersistSpatialAnchorCompleteHTC = nullptr;
PFN_xrUnpersistSpatialAnchorHTC xrUnpersistSpatialAnchorHTC = nullptr;
PFN_xrEnumeratePersistedAnchorNamesHTC xrEnumeratePersistedAnchorNamesHTC = nullptr;
PFN_xrCreateSpatialAnchorFromPersistedAnchorAsyncHTC xrCreateSpatialAnchorFromPersistedAnchorAsyncHTC = nullptr;
PFN_xrCreateSpatialAnchorFromPersistedAnchorCompleteHTC xrCreateSpatialAnchorFromPersistedAnchorCompleteHTC = nullptr;
PFN_xrClearPersistedAnchorsHTC xrClearPersistedAnchorsHTC = nullptr;
PFN_xrGetPersistedAnchorPropertiesHTC xrGetPersistedAnchorPropertiesHTC = nullptr;
PFN_xrExportPersistedAnchorHTC xrExportPersistedAnchorHTC = nullptr;
PFN_xrImportPersistedAnchorHTC xrImportPersistedAnchorHTC = nullptr;
PFN_xrGetPersistedAnchorNameFromBufferHTC xrGetPersistedAnchorNameFromBufferHTC = nullptr;
};