Started the project... finally...
Started the project. This right now only includes Meta XR and Android setup with VR template. More improvements to come!
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
// @lint-ignore-every LICENSELINT
|
||||
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||
|
||||
#pragma once
|
||||
#include "Modules/ModuleManager.h"
|
||||
|
||||
#define OCULUS_ANCHORS_SUPPORTED_PLATFORMS (PLATFORM_WINDOWS && WINVER > 0x0502) || (PLATFORM_ANDROID_ARM || PLATFORM_ANDROID_ARM64)
|
||||
|
||||
/**
|
||||
* The public interface to this module. In most cases, this interface is only public to sibling modules
|
||||
* within this plugin.
|
||||
*/
|
||||
class IOculusXRAnchorsModule : public IModuleInterface
|
||||
{
|
||||
|
||||
public:
|
||||
/**
|
||||
* Singleton-like access to this module's interface. This is just for convenience!
|
||||
* Beware of calling this during the shutdown phase, though. Your module might have been unloaded already.
|
||||
*
|
||||
* @return Returns singleton instance, loading the module on demand if needed
|
||||
*/
|
||||
static inline IOculusXRAnchorsModule& Get()
|
||||
{
|
||||
return FModuleManager::LoadModuleChecked<IOculusXRAnchorsModule>("OculusXRAnchors");
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks to see if this module is loaded and ready. It is only valid to call Get() if IsAvailable() returns true.
|
||||
*
|
||||
* @return True if the module is loaded and ready to use
|
||||
*/
|
||||
static inline bool IsAvailable()
|
||||
{
|
||||
return FModuleManager::Get().IsModuleLoaded("OculusXRAnchors");
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,56 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Kismet/BlueprintFunctionLibrary.h"
|
||||
#include "Kismet/BlueprintAsyncActionBase.h"
|
||||
#include "OculusXRAnchorTypes.h"
|
||||
#include "OculusXRAnchorComponents.h"
|
||||
#include "OculusXRAnchorBPFunctionLibrary.generated.h"
|
||||
|
||||
//Helper
|
||||
UCLASS()
|
||||
class OCULUSXRANCHORS_API UOculusXRAnchorBPFunctionLibrary : public UBlueprintFunctionLibrary
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UFUNCTION(BlueprintCallable, meta = (DisplayName = "Spawn Oculus Anchor Actor", WorldContext = "WorldContextObject", UnsafeDuringActorConstruction = "true"), Category = "OculusXR|SpatialAnchor")
|
||||
static AActor* SpawnActorWithAnchorHandle(UObject* WorldContextObject, FOculusXRUInt64 Handle, FOculusXRUUID UUID, EOculusXRSpaceStorageLocation AnchorLocation, UClass* ActorClass, AActor* Owner, APawn* Instigator, ESpawnActorCollisionHandlingMethod CollisionHandlingMethod);
|
||||
|
||||
UFUNCTION(BlueprintCallable, meta = (DisplayName = "Spawn Oculus Anchor Actor From Query", WorldContext = "WorldContextObject", UnsafeDuringActorConstruction = "true"), Category = "OculusXR|SpatialAnchor")
|
||||
static AActor* SpawnActorWithAnchorQueryResults(UObject* WorldContextObject, const FOculusXRSpaceQueryResult& QueryResult, UClass* ActorClass, AActor* Owner, APawn* Instigator, ESpawnActorCollisionHandlingMethod CollisionHandlingMethod);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
static bool GetAnchorComponentStatus(AActor* TargetActor, EOculusXRSpaceComponentType ComponentType, bool& bIsEnabled);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
static bool GetAnchorTransformByHandle(const FOculusXRUInt64& Handle, FTransform& OutTransform);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
static bool TryGetAnchorTransformByHandle(const FOculusXRUInt64& Handle, FTransform& OutTransform, FOculusXRAnchorLocationFlags& OutLocationFlags);
|
||||
|
||||
UFUNCTION(BlueprintPure, meta = (DisplayName = "FOculusXRUInt64 To String", CompactNodeTitle = "->", BlueprintAutocast), Category = "OculusXR|SpatialAnchor")
|
||||
static FString AnchorHandleToString(const FOculusXRUInt64 Value);
|
||||
|
||||
UFUNCTION(BlueprintPure, meta = (DisplayName = "FOculusXRUUID To String", CompactNodeTitle = "->", BlueprintAutocast), Category = "OculusXR|SpatialAnchor")
|
||||
static FString AnchorUUIDToString(const FOculusXRUUID& Value);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
static FOculusXRUUID StringToAnchorUUID(const FString& Value);
|
||||
|
||||
UFUNCTION(BlueprintPure, meta = (DisplayName = "FOculusXRUInt64 equal", CompactNodeTitle = "==", Keywords = "equal", BlueprintAutocast), Category = "OculusXR|SpatialAnchor")
|
||||
static bool IsEqual_FOculusXRUInt64(const FOculusXRUInt64 Left, const FOculusXRUInt64 Right) { return Left == Right; };
|
||||
|
||||
UFUNCTION(BlueprintPure, meta = (DisplayName = "FOculusXRUUID equal", CompactNodeTitle = "==", Keywords = "equal", BlueprintAutocast), Category = "OculusXR|SpatialAnchor")
|
||||
static bool IsEqual_FOculusXRUUID(const FOculusXRUUID& Left, const FOculusXRUUID& Right) { return Left.IsEqual(Right); };
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
static bool IsAnchorResultSuccess(EOculusXRAnchorResult::Type result);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
static const UOculusXRBaseAnchorComponent* GetAnchorComponent(const FOculusXRSpaceQueryResult& QueryResult, EOculusXRSpaceComponentType ComponentType, UObject* Outer);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
static bool GetRoomLayout(FOculusXRUInt64 Space, FOculusXRRoomLayout& RoomLayoutOut, int32 MaxWallsCapacity = 64);
|
||||
|
||||
};
|
||||
@@ -0,0 +1,56 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "OculusXRAnchorTypes.h"
|
||||
#include "Components/ActorComponent.h"
|
||||
#include "OculusXRAnchorComponent.generated.h"
|
||||
|
||||
UCLASS(meta = (DisplayName = "Oculus Anchor Component"))
|
||||
class OCULUSXRANCHORS_API UOculusXRAnchorComponent : public UActorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRAnchorComponent(const FObjectInitializer& ObjectInitializer);
|
||||
|
||||
virtual void BeginPlay() override;
|
||||
virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
|
||||
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "OculusXR|Anchor", meta = (DefaultToSelf = Target))
|
||||
FOculusXRUInt64 GetHandle() const;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Anchor", meta = (DefaultToSelf = Target))
|
||||
void SetHandle(FOculusXRUInt64 Handle);
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "OculusXR|Anchor", meta = (DefaultToSelf = Target))
|
||||
bool HasValidHandle() const;
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "OculusXR|Anchor", meta = (DefaultToSelf = Target))
|
||||
FOculusXRUUID GetUUID() const;
|
||||
|
||||
void SetUUID(FOculusXRUUID NewUUID);
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "OculusXR|Anchor", meta = (DefaultToSelf = Target))
|
||||
bool IsStoredAtLocation(EOculusXRSpaceStorageLocation Location) const;
|
||||
|
||||
// Not exposed to BP because this is managed in code
|
||||
void SetStoredLocation(EOculusXRSpaceStorageLocation Location, bool Stored);
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "OculusXR|Anchor", meta = (DefaultToSelf = Target))
|
||||
bool IsSaved() const;
|
||||
|
||||
protected:
|
||||
bool bUpdateHeadSpaceTransform;
|
||||
|
||||
private:
|
||||
FOculusXRUInt64 AnchorHandle;
|
||||
FOculusXRUUID AnchorUUID;
|
||||
int32 StorageLocations;
|
||||
|
||||
UPROPERTY()
|
||||
class APlayerCameraManager* PlayerCameraManager;
|
||||
|
||||
void UpdateAnchorTransform() const;
|
||||
bool ToWorldSpacePose(FTransform CameraTransform, FTransform& OutTrackingSpaceTransform) const;
|
||||
};
|
||||
@@ -0,0 +1,149 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
#include "UObject/Class.h"
|
||||
#include "OculusXRAnchorTypes.h"
|
||||
#include "OculusXRAnchorComponents.generated.h"
|
||||
|
||||
UCLASS(Blueprintable)
|
||||
class OCULUSXRANCHORS_API UOculusXRBaseAnchorComponent : public UObject
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
template <typename T>
|
||||
static T* FromSpace(uint64 space, UObject* Outer)
|
||||
{
|
||||
T* Component = NewObject<T>(Outer);
|
||||
Component->Space = space;
|
||||
return Component;
|
||||
}
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
bool IsComponentEnabled() const;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
EOculusXRSpaceComponentType GetType() const;
|
||||
|
||||
uint64 GetSpace() const;
|
||||
|
||||
protected:
|
||||
uint64 Space;
|
||||
EOculusXRSpaceComponentType Type = EOculusXRSpaceComponentType::Undefined;
|
||||
};
|
||||
|
||||
UCLASS(Blueprintable)
|
||||
class OCULUSXRANCHORS_API UOculusXRLocatableAnchorComponent : public UOculusXRBaseAnchorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRLocatableAnchorComponent()
|
||||
{
|
||||
Type = EOculusXRSpaceComponentType::Locatable;
|
||||
}
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
bool GetTransform(FTransform& outTransform) const;
|
||||
};
|
||||
|
||||
UCLASS(Blueprintable)
|
||||
class OCULUSXRANCHORS_API UOculusXRPlaneAnchorComponent : public UOculusXRBaseAnchorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRPlaneAnchorComponent()
|
||||
{
|
||||
Type = EOculusXRSpaceComponentType::ScenePlane;
|
||||
}
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
bool GetPositionAndSize(FVector& outPosition, FVector& outSize) const;
|
||||
};
|
||||
|
||||
UCLASS(Blueprintable)
|
||||
class OCULUSXRANCHORS_API UOculusXRVolumeAnchorComponent : public UOculusXRBaseAnchorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRVolumeAnchorComponent()
|
||||
{
|
||||
Type = EOculusXRSpaceComponentType::SceneVolume;
|
||||
}
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
bool GetPositionAndSize(FVector& outPosition, FVector& outSize) const;
|
||||
};
|
||||
|
||||
UCLASS(Blueprintable)
|
||||
class OCULUSXRANCHORS_API UOculusXRSemanticClassificationAnchorComponent : public UOculusXRBaseAnchorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRSemanticClassificationAnchorComponent()
|
||||
{
|
||||
Type = EOculusXRSpaceComponentType::SemanticClassification;
|
||||
}
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
bool GetSemanticClassifications(TArray<FString>& outClassifications) const;
|
||||
};
|
||||
|
||||
UCLASS(Blueprintable)
|
||||
class OCULUSXRANCHORS_API UOculusXRRoomLayoutAnchorComponent : public UOculusXRBaseAnchorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRRoomLayoutAnchorComponent()
|
||||
{
|
||||
Type = EOculusXRSpaceComponentType::RoomLayout;
|
||||
}
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
bool GetRoomLayout(FOculusXRUUID& outFloorUUID, FOculusXRUUID& outCeilingUUID, TArray<FOculusXRUUID>& outWallsUUIDs) const;
|
||||
};
|
||||
|
||||
UCLASS(Blueprintable)
|
||||
class OCULUSXRANCHORS_API UOculusXRSpaceContainerAnchorComponent : public UOculusXRBaseAnchorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRSpaceContainerAnchorComponent()
|
||||
{
|
||||
Type = EOculusXRSpaceComponentType::SpaceContainer;
|
||||
}
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor")
|
||||
bool GetUUIDs(TArray<FOculusXRUUID>& outUUIDs) const;
|
||||
};
|
||||
|
||||
UCLASS(Blueprintable)
|
||||
class OCULUSXRANCHORS_API UOculusXRSharableAnchorComponent : public UOculusXRBaseAnchorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRSharableAnchorComponent()
|
||||
{
|
||||
Type = EOculusXRSpaceComponentType::Sharable;
|
||||
}
|
||||
};
|
||||
|
||||
UCLASS(Blueprintable)
|
||||
class OCULUSXRANCHORS_API UOculusXRStorableAnchorComponent : public UOculusXRBaseAnchorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRStorableAnchorComponent()
|
||||
{
|
||||
Type = EOculusXRSpaceComponentType::Storable;
|
||||
}
|
||||
};
|
||||
|
||||
UCLASS(Blueprintable)
|
||||
class OCULUSXRANCHORS_API UOculusXRTriangleMeshAnchorComponent : public UOculusXRBaseAnchorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRTriangleMeshAnchorComponent()
|
||||
{
|
||||
Type = EOculusXRSpaceComponentType::TriangleMesh;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,122 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreTypes.h"
|
||||
#include "OculusXRAnchorTypes.h"
|
||||
#include "Delegates/Delegate.h"
|
||||
|
||||
class FOculusXRAnchorEventDelegates
|
||||
{
|
||||
public:
|
||||
/* ovrpEventType_SpatialAnchorCreateComplete
|
||||
*
|
||||
* SpatialAnchorCreateComplete
|
||||
* Prefix:
|
||||
* FOculusXRSpatialAnchorCreateComplete
|
||||
* Suffix:
|
||||
* FOculusXRSpatialAnchorCreateCompleteDelegate
|
||||
*/
|
||||
DECLARE_MULTICAST_DELEGATE_FourParams(FOculusXRSpatialAnchorCreateCompleteDelegate, FOculusXRUInt64 /*requestId*/, int /*result*/, FOculusXRUInt64 /*space*/, FOculusXRUUID /*uuid*/);
|
||||
static OCULUSXRANCHORS_API FOculusXRSpatialAnchorCreateCompleteDelegate OculusSpatialAnchorCreateComplete;
|
||||
|
||||
/* ovrpEventType_SpaceSetComponentStatusComplete
|
||||
*
|
||||
* SpaceSetComponentStatusComplete
|
||||
* Prefix:
|
||||
* FOculusXRSpaceSetComponentStatusComplete
|
||||
* Suffix:
|
||||
* FOculusXRSpaceSetComponentStatusCompleteDelegate
|
||||
*/
|
||||
DECLARE_MULTICAST_DELEGATE_SixParams(FOculusXRSpaceSetComponentStatusCompleteDelegate, FOculusXRUInt64 /*requestId*/, int /*result*/, FOculusXRUInt64 /*space*/, FOculusXRUUID /*uuid*/, EOculusXRSpaceComponentType /*componenttype */, bool /*enabled*/);
|
||||
static OCULUSXRANCHORS_API FOculusXRSpaceSetComponentStatusCompleteDelegate OculusSpaceSetComponentStatusComplete;
|
||||
|
||||
/* ovrpEventType_SpaceQueryResults
|
||||
*
|
||||
* SpaceQueryResults
|
||||
* Prefix:
|
||||
* FOculusXRSpaceQueryResults
|
||||
* Suffix:
|
||||
* FOculusXRSpaceQueryResultsDelegate
|
||||
*/
|
||||
DECLARE_MULTICAST_DELEGATE_OneParam(FOculusXRSpaceQueryResultsDelegate, FOculusXRUInt64 /*requestId*/);
|
||||
static OCULUSXRANCHORS_API FOculusXRSpaceQueryResultsDelegate OculusSpaceQueryResults;
|
||||
|
||||
/* SpaceQueryResult (no ovrp event type)
|
||||
*
|
||||
* SpaceQueryResult
|
||||
* Prefix:
|
||||
* FOculusXRSpaceQueryResult
|
||||
* Suffix:
|
||||
* FOculusXRSpaceQueryResultDelegate
|
||||
*/
|
||||
DECLARE_MULTICAST_DELEGATE_ThreeParams(FOculusXRSpaceQueryResultDelegate, FOculusXRUInt64 /*requestId*/, FOculusXRUInt64 /* space*/, FOculusXRUUID /*uuid*/);
|
||||
static OCULUSXRANCHORS_API FOculusXRSpaceQueryResultDelegate OculusSpaceQueryResult;
|
||||
|
||||
/* ovrpEventType_SpaceQueryComplete
|
||||
*
|
||||
* SpaceQueryComplete
|
||||
* Prefix:
|
||||
* FOculusXRSpaceQueryComplete
|
||||
* Suffix:
|
||||
* FOculusXRSpaceQueryCompleteDelegate
|
||||
*/
|
||||
DECLARE_MULTICAST_DELEGATE_TwoParams(FOculusXRSpaceQueryCompleteDelegate, FOculusXRUInt64 /*requestId*/, int /*result*/);
|
||||
static OCULUSXRANCHORS_API FOculusXRSpaceQueryCompleteDelegate OculusSpaceQueryComplete;
|
||||
|
||||
/* ovrpEventType_SpaceSaveComplete
|
||||
*
|
||||
* SpaceSaveComplete
|
||||
* Prefix:
|
||||
* FOculusXRSpaceSaveComplete
|
||||
* Suffix:
|
||||
* FOculusXRSpaceSaveCompleteDelegate
|
||||
*/
|
||||
DECLARE_MULTICAST_DELEGATE_FiveParams(FOculusXRSpaceSaveCompleteDelegate, FOculusXRUInt64 /*requestId*/, FOculusXRUInt64 /* space*/, bool /* sucess*/, int /*result*/, FOculusXRUUID /*uuid*/);
|
||||
static OCULUSXRANCHORS_API FOculusXRSpaceSaveCompleteDelegate OculusSpaceSaveComplete;
|
||||
|
||||
/* ovrpEventType_SpaceListSaveResult
|
||||
*
|
||||
* SpaceListSaveComplete
|
||||
* Prefix:
|
||||
* FOculusSpaceListSaveComplete
|
||||
* Suffix:
|
||||
* FOculusSpaceListSaveCompleteDelegate
|
||||
*/
|
||||
DECLARE_MULTICAST_DELEGATE_TwoParams(FOculusXRSpaceListSaveCompleteDelegate, FOculusXRUInt64 /*requestId*/, int /*result*/);
|
||||
static OCULUSXRANCHORS_API FOculusXRSpaceListSaveCompleteDelegate OculusSpaceListSaveComplete;
|
||||
|
||||
/* ovrpEventType_SpaceEraseComplete
|
||||
*
|
||||
* SpaceEraseComplete
|
||||
* Prefix:
|
||||
* FOculusXRSpaceEraseComplete
|
||||
* Suffix:
|
||||
* FOculusXRSpaceEraseCompleteDelegate
|
||||
*/
|
||||
DECLARE_MULTICAST_DELEGATE_FourParams(FOculusXRSpaceEraseCompleteDelegate, FOculusXRUInt64 /*requestId*/, int /* result*/, FOculusXRUUID /*uuid*/, EOculusXRSpaceStorageLocation /*location*/);
|
||||
static OCULUSXRANCHORS_API FOculusXRSpaceEraseCompleteDelegate OculusSpaceEraseComplete;
|
||||
|
||||
/* ovrpEventType_SpaceShareSpaceResult
|
||||
*
|
||||
* SpaceShareComplete
|
||||
* Prefix:
|
||||
* FOculusSpaceShareSpacesComplete
|
||||
* Suffix:
|
||||
* FOculusSpaceShareSpacesCompleteDelegate
|
||||
*/
|
||||
DECLARE_MULTICAST_DELEGATE_TwoParams(FOculusXRSpaceShareCompleteDelegate, FOculusXRUInt64 /*requestId*/, int /*result*/);
|
||||
static OCULUSXRANCHORS_API FOculusXRSpaceShareCompleteDelegate OculusSpaceShareComplete;
|
||||
|
||||
/* ovrpEventType_SceneCaptureComplete
|
||||
*
|
||||
* SceneCaptureComplete
|
||||
* Prefix:
|
||||
* FOculusXRSceneCaptureComplete
|
||||
* Suffix:
|
||||
* FOculusXRSceneCaptureCompleteDelegate
|
||||
*/
|
||||
DECLARE_MULTICAST_DELEGATE_TwoParams(FOculusXRSceneCaptureCompleteDelegate, FOculusXRUInt64 /*requestId*/, bool /*success*/);
|
||||
static OCULUSXRANCHORS_API FOculusXRSceneCaptureCompleteDelegate OculusSceneCaptureComplete;
|
||||
|
||||
};
|
||||
@@ -0,0 +1,298 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Kismet/BlueprintAsyncActionBase.h"
|
||||
#include "Templates/SharedPointer.h"
|
||||
#include "OculusXRAnchorTypes.h"
|
||||
#include "OculusXRAnchorComponent.h"
|
||||
#include "OculusXRAnchorComponents.h"
|
||||
#include "OculusXRAnchorLatentActions.generated.h"
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOculusXR_LatentAction_CreateSpatialAnchor_Success, UOculusXRAnchorComponent*, Anchor, EOculusXRAnchorResult::Type, Result);
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOculusXR_LatentAction_CreateSpatialAnchor_Failure, EOculusXRAnchorResult::Type, Result);
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOculusXR_LatentAction_EraseAnchor_Success, AActor*, Actor, FOculusXRUUID, UUID, EOculusXRAnchorResult::Type, Result);
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOculusXR_LatentAction_EraseAnchor_Failure, EOculusXRAnchorResult::Type, Result);
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOculusXR_LatentAction_SaveAnchor_Success, UOculusXRAnchorComponent*, Anchor, EOculusXRAnchorResult::Type, Result);
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOculusXR_LatentAction_SaveAnchor_Failure, EOculusXRAnchorResult::Type, Result);
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOculusXR_LatentAction_SaveAnchorList_Success, const TArray<UOculusXRAnchorComponent*>&, Anchors, EOculusXRAnchorResult::Type, Result);
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOculusXR_LatentAction_SaveAnchorList_Failure, EOculusXRAnchorResult::Type, Result);
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOculusXR_LatentAction_QueryAnchors_Success, const TArray<FOculusXRSpaceQueryResult>&, QueryResults, EOculusXRAnchorResult::Type, Result);
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOculusXR_LatentAction_QueryAnchors_Failure, EOculusXRAnchorResult::Type, Result);
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FOculusXR_LatentAction_SetComponentStatus_Success, UOculusXRAnchorComponent*, Anchor, EOculusXRSpaceComponentType, ComponentType, bool, Enabled, EOculusXRAnchorResult::Type, Result);
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOculusXR_LatentAction_SetComponentStatus_Failure, EOculusXRAnchorResult::Type, Result);
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOculusXR_LatentAction_SetAnchorComponentStatus_Success, UOculusXRBaseAnchorComponent*, Component, EOculusXRAnchorResult::Type, Result);
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOculusXR_LatentAction_SetAnchorComponentStatus_Failure, EOculusXRAnchorResult::Type, Result);
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOculusXR_LatentAction_ShareAnchors_Success, const TArray<UOculusXRAnchorComponent*>&, SharedAnchors, const TArray<FString>&, UserIds, EOculusXRAnchorResult::Type, Result);
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOculusXR_LatentAction_ShareAnchors_Failure, EOculusXRAnchorResult::Type, Result);
|
||||
|
||||
|
||||
//
|
||||
// Create Anchor
|
||||
//
|
||||
UCLASS()
|
||||
class OCULUSXRANCHORS_API UOculusXRAsyncAction_CreateSpatialAnchor : public UBlueprintAsyncActionBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
virtual void Activate() override;
|
||||
|
||||
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
|
||||
static UOculusXRAsyncAction_CreateSpatialAnchor* OculusXRAsyncCreateSpatialAnchor(AActor* TargetActor, const FTransform& AnchorTransform);
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_CreateSpatialAnchor_Success Success;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_CreateSpatialAnchor_Failure Failure;
|
||||
|
||||
// Target actor
|
||||
UPROPERTY(Transient)
|
||||
AActor* TargetActor;
|
||||
|
||||
FTransform AnchorTransform;
|
||||
|
||||
private:
|
||||
void HandleCreateComplete(EOculusXRAnchorResult::Type CreateResult, UOculusXRAnchorComponent* Anchor);
|
||||
};
|
||||
|
||||
//
|
||||
// Erase Anchor
|
||||
//
|
||||
UCLASS()
|
||||
class OCULUSXRANCHORS_API UOculusXRAsyncAction_EraseAnchor : public UBlueprintAsyncActionBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
virtual void Activate() override;
|
||||
|
||||
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
|
||||
static UOculusXRAsyncAction_EraseAnchor* OculusXRAsyncEraseAnchor(AActor* TargetActor);
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_EraseAnchor_Success Success;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_EraseAnchor_Failure Failure;
|
||||
|
||||
// Target actor
|
||||
UPROPERTY(Transient)
|
||||
AActor* TargetActor;
|
||||
|
||||
FOculusXRUInt64 DeleteRequestId;
|
||||
|
||||
private:
|
||||
void HandleEraseAnchorComplete(EOculusXRAnchorResult::Type EraseResult, FOculusXRUUID UUID);
|
||||
};
|
||||
|
||||
//
|
||||
// Save Anchor
|
||||
//
|
||||
UCLASS()
|
||||
class OCULUSXRANCHORS_API UOculusXRAsyncAction_SaveAnchor : public UBlueprintAsyncActionBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
virtual void Activate() override;
|
||||
|
||||
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
|
||||
static UOculusXRAsyncAction_SaveAnchor* OculusXRAsyncSaveAnchor(AActor* TargetActor, EOculusXRSpaceStorageLocation StorageLocation);
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_SaveAnchor_Success Success;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_SaveAnchor_Failure Failure;
|
||||
|
||||
// Target actor
|
||||
UPROPERTY(Transient)
|
||||
AActor* TargetActor;
|
||||
|
||||
EOculusXRSpaceStorageLocation StorageLocation;
|
||||
|
||||
private:
|
||||
void HandleSaveAnchorComplete(EOculusXRAnchorResult::Type SaveResult, UOculusXRAnchorComponent* Anchor);
|
||||
};
|
||||
|
||||
//
|
||||
// Save Anchor List
|
||||
//
|
||||
UCLASS()
|
||||
class OCULUSXRANCHORS_API UOculusXRAsyncAction_SaveAnchorList : public UBlueprintAsyncActionBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
virtual void Activate() override;
|
||||
|
||||
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
|
||||
static UOculusXRAsyncAction_SaveAnchorList* OculusXRAsyncSaveAnchorList(const TArray<AActor*>& TargetActors, EOculusXRSpaceStorageLocation StorageLocation);
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_SaveAnchorList_Success Success;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_SaveAnchorList_Failure Failure;
|
||||
|
||||
UPROPERTY(Transient)
|
||||
TArray<UOculusXRAnchorComponent*> TargetAnchors;
|
||||
|
||||
EOculusXRSpaceStorageLocation StorageLocation;
|
||||
|
||||
private:
|
||||
void HandleSaveAnchorListComplete(EOculusXRAnchorResult::Type SaveResult, const TArray<UOculusXRAnchorComponent*>& SavedSpaces);
|
||||
};
|
||||
|
||||
//
|
||||
// Query Anchors
|
||||
//
|
||||
UCLASS()
|
||||
class OCULUSXRANCHORS_API UOculusXRAsyncAction_QueryAnchors : public UBlueprintAsyncActionBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
virtual void Activate() override;
|
||||
|
||||
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
|
||||
static UOculusXRAsyncAction_QueryAnchors* OculusXRAsyncQueryAnchors(EOculusXRSpaceStorageLocation Location, const TArray<FOculusXRUUID>& UUIDs);
|
||||
|
||||
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
|
||||
static UOculusXRAsyncAction_QueryAnchors* OculusXRAsyncQueryAnchorsAdvanced(const FOculusXRSpaceQueryInfo& QueryInfo);
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_QueryAnchors_Success Success;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_QueryAnchors_Failure Failure;
|
||||
|
||||
FOculusXRSpaceQueryInfo QueryInfo;
|
||||
TArray<FOculusXRSpaceQueryResult> QueryResults;
|
||||
|
||||
private:
|
||||
void HandleQueryAnchorsResults(EOculusXRAnchorResult::Type QueryResult, const TArray<FOculusXRSpaceQueryResult>& Results);
|
||||
};
|
||||
|
||||
//
|
||||
// Set Component Status
|
||||
//
|
||||
UCLASS()
|
||||
class OCULUSXRANCHORS_API UOculusXRAsyncAction_SetAnchorComponentStatus : public UBlueprintAsyncActionBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
virtual void Activate() override;
|
||||
|
||||
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
|
||||
static UOculusXRAsyncAction_SetAnchorComponentStatus* OculusXRAsyncSetAnchorComponentStatus(AActor* TargetActor, EOculusXRSpaceComponentType ComponentType, bool bEnabled);
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_SetComponentStatus_Success Success;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_SetComponentStatus_Failure Failure;
|
||||
|
||||
// Target actor
|
||||
UPROPERTY(Transient)
|
||||
AActor* TargetActor;
|
||||
|
||||
UPROPERTY(Transient)
|
||||
UOculusXRAnchorComponent* TargetAnchorComponent;
|
||||
|
||||
EOculusXRSpaceComponentType ComponentType;
|
||||
bool bEnabled;
|
||||
|
||||
private:
|
||||
void HandleSetComponentStatusComplete(EOculusXRAnchorResult::Type SetStatusResult, uint64 AnchorHandle, EOculusXRSpaceComponentType SpaceComponentType, bool bResultEnabled);
|
||||
};
|
||||
|
||||
//
|
||||
// Set Anchor Component Status
|
||||
//
|
||||
UCLASS()
|
||||
class OCULUSXRANCHORS_API UOculusXRAsyncAction_SetComponentStatus : public UBlueprintAsyncActionBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
virtual void Activate() override;
|
||||
|
||||
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
|
||||
static UOculusXRAsyncAction_SetComponentStatus* OculusXRAsyncSetComponentStatus(UOculusXRBaseAnchorComponent* Component, bool bEnabled);
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_SetAnchorComponentStatus_Success Success;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_SetAnchorComponentStatus_Failure Failure;
|
||||
|
||||
// Target actor
|
||||
UPROPERTY(Transient)
|
||||
UOculusXRBaseAnchorComponent* Component;
|
||||
bool bEnabled;
|
||||
|
||||
private:
|
||||
void HandleSetComponentStatusComplete(EOculusXRAnchorResult::Type SetStatusResult, uint64 AnchorHandle, EOculusXRSpaceComponentType SpaceComponentType, bool bResultEnabled);
|
||||
};
|
||||
|
||||
//
|
||||
// Share Anchors
|
||||
//
|
||||
UCLASS()
|
||||
class OCULUSXRANCHORS_API UOculusXRAsyncAction_ShareAnchors : public UBlueprintAsyncActionBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
virtual void Activate() override;
|
||||
|
||||
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
|
||||
static UOculusXRAsyncAction_ShareAnchors* OculusXRAsyncShareAnchors(const TArray<AActor*>& TargetActors, const TArray<FString>& ToShareWithIds);
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_ShareAnchors_Success Success;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXR_LatentAction_ShareAnchors_Failure Failure;
|
||||
|
||||
// Target Spaces
|
||||
UPROPERTY(Transient)
|
||||
TArray<UOculusXRAnchorComponent*> TargetAnchors;
|
||||
|
||||
// Users to share with
|
||||
TArray<uint64> ToShareWithIds;
|
||||
|
||||
FOculusXRUInt64 ShareSpacesRequestId;
|
||||
|
||||
private:
|
||||
void HandleShareAnchorsComplete(EOculusXRAnchorResult::Type ShareResult, const TArray<UOculusXRAnchorComponent*>& TargetAnchors, const TArray<uint64>& OculusUserIds);
|
||||
};
|
||||
|
||||
|
||||
UCLASS()
|
||||
class OCULUSXRANCHORS_API UOculusXRAnchorLaunchCaptureFlow : public UBlueprintAsyncActionBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOculusXRAnchorCaptureFlowFinished);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor", meta = (WorldContext = "WorldContext", BlueprintInternalUseOnly = "true"))
|
||||
static UOculusXRAnchorLaunchCaptureFlow* LaunchCaptureFlowAsync(const UObject* WorldContext);
|
||||
|
||||
void Activate() override;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXRAnchorCaptureFlowFinished Success;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXRAnchorCaptureFlowFinished Failure;
|
||||
|
||||
private:
|
||||
uint64 Request = 0;
|
||||
|
||||
UFUNCTION(CallInEditor)
|
||||
void OnCaptureFinish(FOculusXRUInt64 RequestId, bool bSuccess);
|
||||
};
|
||||
@@ -0,0 +1,293 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
#include <memory>
|
||||
#include "OculusXRAnchorTypes.generated.h"
|
||||
|
||||
#define OCULUSXR_UUID_SIZE 16
|
||||
|
||||
typedef uint8 ovrpXRUuidArray[OCULUSXR_UUID_SIZE];
|
||||
|
||||
UENUM(BlueprintType)
|
||||
namespace EOculusXRAnchorResult
|
||||
{
|
||||
enum Type
|
||||
{
|
||||
Success = 0,
|
||||
Success_EventUnavailable = 1,
|
||||
Success_Pending = 2,
|
||||
|
||||
/// Failure
|
||||
Failure = -1000,
|
||||
Failure_InvalidParameter = -1001,
|
||||
Failure_NotInitialized = -1002,
|
||||
Failure_InvalidOperation = -1003,
|
||||
Failure_Unsupported = -1004,
|
||||
Failure_NotYetImplemented = -1005,
|
||||
Failure_OperationFailed = -1006,
|
||||
Failure_InsufficientSize = -1007,
|
||||
Failure_DataIsInvalid = -1008,
|
||||
Failure_DeprecatedOperation = -1009,
|
||||
Failure_ErrorLimitReached = -1010,
|
||||
Failure_ErrorInitializationFailed = -1011,
|
||||
|
||||
/// Space error cases
|
||||
Failure_SpaceCloudStorageDisabled = -2000,
|
||||
Failure_SpaceMappingInsufficient = -2001,
|
||||
Failure_SpaceLocalizationFailed = -2002,
|
||||
Failure_SpaceNetworkTimeout = -2003,
|
||||
Failure_SpaceNetworkRequestFailed = -2004,
|
||||
|
||||
|
||||
|
||||
};
|
||||
} // namespace EOculusXRAnchorResult
|
||||
|
||||
UENUM(BlueprintType, meta = (Bitflags))
|
||||
enum class EOculusLocationFlags : uint8
|
||||
{
|
||||
None = 0, // required for the metadata generation
|
||||
OrientationValid = (1 << 0),
|
||||
PositionValid = (1 << 1),
|
||||
OrientationTracked = (1 << 2),
|
||||
PositionTracked = (1 << 3)
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct OCULUSXRANCHORS_API FOculusXRAnchorLocationFlags
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
FOculusXRAnchorLocationFlags(uint32 InFlags = 0)
|
||||
: Flags(InFlags) {}
|
||||
|
||||
bool OrientationValid() const
|
||||
{
|
||||
return Flags & static_cast<uint32>(EOculusLocationFlags::OrientationValid);
|
||||
}
|
||||
|
||||
bool PositionValid() const
|
||||
{
|
||||
return Flags & static_cast<uint32>(EOculusLocationFlags::PositionValid);
|
||||
}
|
||||
|
||||
bool OrientationTracked() const
|
||||
{
|
||||
return Flags & static_cast<uint32>(EOculusLocationFlags::OrientationTracked);
|
||||
}
|
||||
|
||||
bool PositionTracked() const
|
||||
{
|
||||
return Flags & static_cast<uint32>(EOculusLocationFlags::PositionTracked);
|
||||
}
|
||||
|
||||
bool IsValid() const
|
||||
{
|
||||
return OrientationValid() && PositionValid();
|
||||
}
|
||||
|
||||
private:
|
||||
UPROPERTY(BlueprintReadOnly, Category = "OculusXR|SpatialAnchor", meta = (AllowPrivateAccess = "true", Bitmask, BitmaskEnum = "EOculusLocationFlags"))
|
||||
int32 Flags;
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct OCULUSXRANCHORS_API FOculusXRUUID
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
FOculusXRUUID();
|
||||
FOculusXRUUID(const ovrpXRUuidArray& UuidArray);
|
||||
|
||||
bool operator==(const FOculusXRUUID& Other) const;
|
||||
bool operator!=(const FOculusXRUUID& Other) const;
|
||||
|
||||
bool IsValidUUID() const;
|
||||
|
||||
bool IsEqual(const FOculusXRUUID& Other) const;
|
||||
friend uint32 GetTypeHash(const FOculusXRUUID& Other);
|
||||
bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess);
|
||||
|
||||
OCULUSXRANCHORS_API friend FArchive& operator<<(FArchive& Ar, FOculusXRUUID& UUID);
|
||||
bool Serialize(FArchive& Ar);
|
||||
|
||||
FString ToString() const;
|
||||
|
||||
uint8 UUIDBytes[OCULUSXR_UUID_SIZE];
|
||||
};
|
||||
|
||||
template <>
|
||||
struct TStructOpsTypeTraits<FOculusXRUUID> : public TStructOpsTypeTraitsBase2<FOculusXRUUID>
|
||||
{
|
||||
enum
|
||||
{
|
||||
WithIdenticalViaEquality = true,
|
||||
WithNetSerializer = true,
|
||||
WithSerializer = true
|
||||
};
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct OCULUSXRANCHORS_API FOculusXRUInt64
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
FOculusXRUInt64()
|
||||
: FOculusXRUInt64(0) {}
|
||||
FOculusXRUInt64(const uint64& Value) { this->Value = Value; }
|
||||
|
||||
operator uint64() const { return Value; }
|
||||
bool operator==(const FOculusXRUInt64& Right) const;
|
||||
bool operator!=(const FOculusXRUInt64& Right) const;
|
||||
|
||||
UPROPERTY()
|
||||
uint64 Value;
|
||||
|
||||
bool IsEqual(const FOculusXRUInt64& Other) const
|
||||
{
|
||||
return Other.Value == Value;
|
||||
}
|
||||
|
||||
friend uint32 GetTypeHash(const FOculusXRUInt64& Other)
|
||||
{
|
||||
return FCrc::MemCrc_DEPRECATED(&Other.Value, sizeof(Other.Value));
|
||||
}
|
||||
|
||||
uint64 GetValue() const { return Value; };
|
||||
|
||||
void SetValue(const uint64 Val) { Value = Val; };
|
||||
};
|
||||
|
||||
template <>
|
||||
struct TStructOpsTypeTraits<FOculusXRUInt64> : public TStructOpsTypeTraitsBase2<FOculusXRUInt64>
|
||||
{
|
||||
enum
|
||||
{
|
||||
WithIdenticalViaEquality = true,
|
||||
};
|
||||
};
|
||||
|
||||
UENUM(BlueprintType)
|
||||
enum class EOculusXRSpaceQueryFilterType : uint8
|
||||
{
|
||||
None = 0 UMETA(DisplayName = "No Filter"),
|
||||
FilterByIds = 1 UMETA(DisplayName = "Filter queries by UUIDs"),
|
||||
FilterByComponentType = 2 UMETA(DisplayName = "Filter queries by component type"),
|
||||
};
|
||||
|
||||
// This is used as a bit-mask
|
||||
UENUM(BlueprintType)
|
||||
enum class EOculusXRSpaceStorageLocation : uint8
|
||||
{
|
||||
Invalid = 0 UMETA(DisplayName = "Invalid"),
|
||||
Local = 1 << 0 UMETA(DisplayName = "Local"),
|
||||
Cloud = 1 << 1 UMETA(DisplayName = "Cloud")
|
||||
};
|
||||
|
||||
UENUM(BlueprintType)
|
||||
enum class EOculusXRSpaceStoragePersistenceMode : uint8
|
||||
{
|
||||
Invalid = 0 UMETA(Hidden),
|
||||
Indefinite = 1 UMETA(DisplayName = "Indefinite"),
|
||||
};
|
||||
|
||||
UENUM(BlueprintType)
|
||||
enum class EOculusXRSpaceComponentType : uint8
|
||||
{
|
||||
Locatable = 0 UMETA(DisplayName = "Locatable"),
|
||||
Storable = 1 UMETA(DisplayName = "Storable"),
|
||||
Sharable = 2 UMETA(DisplayName = "Sharable"),
|
||||
ScenePlane = 3 UMETA(DisplayName = "ScenePlane"),
|
||||
SceneVolume = 4 UMETA(DisplayName = "SceneVolume"),
|
||||
SemanticClassification = 5 UMETA(DisplayName = "SemanticClassification"),
|
||||
RoomLayout = 6 UMETA(DisplayName = "RoomLayout"),
|
||||
SpaceContainer = 7 UMETA(DisplayName = "SpaceContainer"),
|
||||
Undefined = 8 UMETA(DisplayName = "Not defined"),
|
||||
TriangleMesh = 9 UMETA(DisplayName = "TriangleMesh"),
|
||||
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct OCULUSXRANCHORS_API FOculusXRSpaceQueryInfo
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
FOculusXRSpaceQueryInfo()
|
||||
: MaxQuerySpaces(1024), Timeout(0), Location(EOculusXRSpaceStorageLocation::Local), FilterType(EOculusXRSpaceQueryFilterType::None)
|
||||
{
|
||||
}
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, Category = "OculusXR|SpatialAnchor")
|
||||
int MaxQuerySpaces;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, Category = "OculusXR|SpatialAnchor")
|
||||
float Timeout;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, Category = "OculusXR|SpatialAnchor")
|
||||
EOculusXRSpaceStorageLocation Location;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, Category = "OculusXR|SpatialAnchor")
|
||||
EOculusXRSpaceQueryFilterType FilterType;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, Category = "OculusXR|SpatialAnchor")
|
||||
TArray<FOculusXRUUID> IDFilter;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, Category = "OculusXR|SpatialAnchor")
|
||||
TArray<EOculusXRSpaceComponentType> ComponentFilter;
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct OCULUSXRANCHORS_API FOculusXRSpaceQueryResult
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
FOculusXRSpaceQueryResult()
|
||||
: Space(0), UUID(), Location(EOculusXRSpaceStorageLocation::Invalid) {}
|
||||
FOculusXRSpaceQueryResult(FOculusXRUInt64 SpaceHandle, FOculusXRUUID ID, EOculusXRSpaceStorageLocation SpaceLocation)
|
||||
: Space(SpaceHandle), UUID(ID), Location(SpaceLocation) {}
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, Category = "OculusXR|SpatialAnchor")
|
||||
FOculusXRUInt64 Space;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, Category = "OculusXR|SpatialAnchor")
|
||||
FOculusXRUUID UUID;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, Category = "OculusXR|SpatialAnchor")
|
||||
EOculusXRSpaceStorageLocation Location;
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct OCULUSXRANCHORS_API FOculusXRSpaceQueryFilterValues
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
TArray<FOculusXRUUID> Uuids; // used if filtering by UUIDs
|
||||
TArray<EOculusXRSpaceComponentType> ComponentTypes; // used if filtering by component types
|
||||
};
|
||||
|
||||
|
||||
// Represents a room layout within a specific space
|
||||
USTRUCT(BlueprintType)
|
||||
struct OCULUSXRANCHORS_API FOculusXRRoomLayout
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UPROPERTY(BlueprintReadOnly, Category = "OculusXR|Anchors")
|
||||
FOculusXRUInt64 RoomAnchorHandle;
|
||||
|
||||
UPROPERTY(BlueprintReadOnly, Category = "OculusXR|Anchors")
|
||||
FOculusXRUUID RoomUuid;
|
||||
|
||||
|
||||
UPROPERTY(BlueprintReadOnly, Category = "OculusXR|Anchors")
|
||||
FOculusXRUUID FloorUuid;
|
||||
|
||||
UPROPERTY(BlueprintReadOnly, Category = "OculusXR|Anchors")
|
||||
FOculusXRUUID CeilingUuid;
|
||||
|
||||
UPROPERTY(BlueprintReadOnly, Category = "OculusXR|Anchors")
|
||||
TArray<FOculusXRUUID> WallsUuid;
|
||||
|
||||
UPROPERTY(BlueprintReadOnly, Category = "OculusXR|Anchors")
|
||||
TArray<FOculusXRUUID> RoomObjectUUIDs;
|
||||
};
|
||||
@@ -0,0 +1,146 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "OculusXRAnchorComponent.h"
|
||||
#include "OculusXRAnchorTypes.h"
|
||||
|
||||
DECLARE_DELEGATE_TwoParams(FOculusXRSpatialAnchorCreateDelegate, EOculusXRAnchorResult::Type /*Result*/, UOculusXRAnchorComponent* /*Anchor*/);
|
||||
DECLARE_DELEGATE_TwoParams(FOculusXRAnchorEraseDelegate, EOculusXRAnchorResult::Type /*Result*/, FOculusXRUUID /*AnchorUUID*/);
|
||||
DECLARE_DELEGATE_FourParams(FOculusXRAnchorSetComponentStatusDelegate, EOculusXRAnchorResult::Type /*Result*/, uint64 /*AnchorHandle*/, EOculusXRSpaceComponentType /*ComponentType*/, bool /*Enabled*/);
|
||||
DECLARE_DELEGATE_TwoParams(FOculusXRAnchorSaveDelegate, EOculusXRAnchorResult::Type /*Result*/, UOculusXRAnchorComponent* /*Anchor*/);
|
||||
DECLARE_DELEGATE_TwoParams(FOculusXRAnchorSaveListDelegate, EOculusXRAnchorResult::Type /*Result*/, const TArray<UOculusXRAnchorComponent*>& /*SavedAnchors*/);
|
||||
DECLARE_DELEGATE_TwoParams(FOculusXRAnchorQueryDelegate, EOculusXRAnchorResult::Type /*Result*/, const TArray<FOculusXRSpaceQueryResult>& /*Results*/);
|
||||
DECLARE_DELEGATE_ThreeParams(FOculusXRAnchorShareDelegate, EOculusXRAnchorResult::Type /*Result*/, const TArray<UOculusXRAnchorComponent*>& /*Anchors*/, const TArray<uint64>& /*Users*/);
|
||||
|
||||
namespace OculusXRAnchors
|
||||
{
|
||||
|
||||
struct OCULUSXRANCHORS_API FOculusXRAnchors
|
||||
{
|
||||
void Initialize();
|
||||
void Teardown();
|
||||
|
||||
static FOculusXRAnchors* GetInstance();
|
||||
|
||||
static bool CreateSpatialAnchor(const FTransform& InTransform, AActor* TargetActor, const FOculusXRSpatialAnchorCreateDelegate& ResultCallback, EOculusXRAnchorResult::Type& OutResult);
|
||||
static bool EraseAnchor(UOculusXRAnchorComponent* Anchor, const FOculusXRAnchorEraseDelegate& ResultCallback, EOculusXRAnchorResult::Type& OutResult);
|
||||
static bool DestroyAnchor(uint64 AnchorHandle, EOculusXRAnchorResult::Type& OutResult);
|
||||
|
||||
static bool SetAnchorComponentStatus(UOculusXRAnchorComponent* Anchor, EOculusXRSpaceComponentType SpaceComponentType, bool Enable, float Timeout, const FOculusXRAnchorSetComponentStatusDelegate& ResultCallback, EOculusXRAnchorResult::Type& OutResult);
|
||||
static bool GetAnchorComponentStatus(UOculusXRAnchorComponent* Anchor, EOculusXRSpaceComponentType SpaceComponentType, bool& OutEnabled, bool& OutChangePending, EOculusXRAnchorResult::Type& OutResult);
|
||||
static bool GetAnchorSupportedComponents(UOculusXRAnchorComponent* Anchor, TArray<EOculusXRSpaceComponentType>& OutSupportedComponents, EOculusXRAnchorResult::Type& OutResult);
|
||||
|
||||
static bool SetComponentStatus(uint64 Space, EOculusXRSpaceComponentType SpaceComponentType, bool Enable, float Timeout, const FOculusXRAnchorSetComponentStatusDelegate& ResultCallback, EOculusXRAnchorResult::Type& OutResult);
|
||||
static bool GetComponentStatus(uint64 AnchorHandle, EOculusXRSpaceComponentType SpaceComponentType, bool& OutEnabled, bool& OutChangePending, EOculusXRAnchorResult::Type& OutResult);
|
||||
static bool GetSupportedComponents(uint64 AnchorHandle, TArray<EOculusXRSpaceComponentType>& OutSupportedComponents, EOculusXRAnchorResult::Type& OutResult);
|
||||
|
||||
static bool SaveAnchor(UOculusXRAnchorComponent* Anchor, EOculusXRSpaceStorageLocation StorageLocation, const FOculusXRAnchorSaveDelegate& ResultCallback, EOculusXRAnchorResult::Type& OutResult);
|
||||
static bool SaveAnchorList(const TArray<UOculusXRAnchorComponent*>& Anchors, EOculusXRSpaceStorageLocation StorageLocation, const FOculusXRAnchorSaveListDelegate& ResultCallback, EOculusXRAnchorResult::Type& OutResult);
|
||||
|
||||
static bool QueryAnchors(const TArray<FOculusXRUUID>& AnchorUUIDs, EOculusXRSpaceStorageLocation Location, const FOculusXRAnchorQueryDelegate& ResultCallback, EOculusXRAnchorResult::Type& OutResult);
|
||||
static bool QueryAnchorsAdvanced(const FOculusXRSpaceQueryInfo& QueryInfo, const FOculusXRAnchorQueryDelegate& ResultCallback, EOculusXRAnchorResult::Type& OutResult);
|
||||
|
||||
static bool ShareAnchors(const TArray<UOculusXRAnchorComponent*>& Anchors, const TArray<uint64>& OculusUserIDs, const FOculusXRAnchorShareDelegate& ResultCallback, EOculusXRAnchorResult::Type& OutResult);
|
||||
|
||||
static bool GetSpaceContainerUUIDs(uint64 Space, TArray<FOculusXRUUID>& OutUUIDs, EOculusXRAnchorResult::Type& OutResult);
|
||||
static bool GetSpaceScenePlane(uint64 Space, FVector& OutPos, FVector& OutSize, EOculusXRAnchorResult::Type& OutResult);
|
||||
static bool GetSpaceSceneVolume(uint64 Space, FVector& OutPos, FVector& OutSize, EOculusXRAnchorResult::Type& OutResult);
|
||||
static bool GetSpaceSemanticClassification(uint64 Space, TArray<FString>& OutSemanticClassifications, EOculusXRAnchorResult::Type& OutResult);
|
||||
static bool GetSpaceBoundary2D(uint64 Space, TArray<FVector2f>& OutVertices, EOculusXRAnchorResult::Type& OutResult);
|
||||
|
||||
|
||||
|
||||
private:
|
||||
void HandleSpatialAnchorCreateComplete(FOculusXRUInt64 RequestId, int Result, FOculusXRUInt64 Space, FOculusXRUUID UUID);
|
||||
void HandleAnchorEraseComplete(FOculusXRUInt64 RequestId, int Result, FOculusXRUUID UUID, EOculusXRSpaceStorageLocation Location);
|
||||
|
||||
void HandleSetComponentStatusComplete(FOculusXRUInt64 RequestId, int Result, FOculusXRUInt64 Space, FOculusXRUUID UUID, EOculusXRSpaceComponentType ComponentType, bool Enabled);
|
||||
|
||||
void HandleAnchorSaveComplete(FOculusXRUInt64 RequestId, FOculusXRUInt64 Space, bool Success, int Result, FOculusXRUUID UUID);
|
||||
void HandleAnchorSaveListComplete(FOculusXRUInt64 RequestId, int Result);
|
||||
|
||||
void HandleAnchorQueryResultsBegin(FOculusXRUInt64 RequestId);
|
||||
void HandleAnchorQueryResultElement(FOculusXRUInt64 RequestId, FOculusXRUInt64 Space, FOculusXRUUID UUID);
|
||||
void HandleAnchorQueryComplete(FOculusXRUInt64 RequestId, int Result);
|
||||
|
||||
void HandleAnchorSharingComplete(FOculusXRUInt64 RequestId, int Result);
|
||||
|
||||
|
||||
struct EraseAnchorBinding
|
||||
{
|
||||
FOculusXRUInt64 RequestId;
|
||||
FOculusXRAnchorEraseDelegate Binding;
|
||||
TWeakObjectPtr<UOculusXRAnchorComponent> Anchor;
|
||||
};
|
||||
|
||||
struct SetComponentStatusBinding
|
||||
{
|
||||
FOculusXRUInt64 RequestId;
|
||||
FOculusXRAnchorSetComponentStatusDelegate Binding;
|
||||
uint64 AnchorHandle;
|
||||
};
|
||||
|
||||
struct CreateAnchorBinding
|
||||
{
|
||||
FOculusXRUInt64 RequestId;
|
||||
FOculusXRSpatialAnchorCreateDelegate Binding;
|
||||
TWeakObjectPtr<AActor> Actor;
|
||||
};
|
||||
|
||||
struct SaveAnchorBinding
|
||||
{
|
||||
FOculusXRUInt64 RequestId;
|
||||
FOculusXRAnchorSaveDelegate Binding;
|
||||
EOculusXRSpaceStorageLocation Location;
|
||||
TWeakObjectPtr<UOculusXRAnchorComponent> Anchor;
|
||||
};
|
||||
|
||||
struct SaveAnchorListBinding
|
||||
{
|
||||
FOculusXRUInt64 RequestId;
|
||||
FOculusXRAnchorSaveListDelegate Binding;
|
||||
EOculusXRSpaceStorageLocation Location;
|
||||
TArray<TWeakObjectPtr<UOculusXRAnchorComponent>> SavedAnchors;
|
||||
};
|
||||
|
||||
struct AnchorQueryBinding
|
||||
{
|
||||
FOculusXRUInt64 RequestId;
|
||||
FOculusXRAnchorQueryDelegate Binding;
|
||||
EOculusXRSpaceStorageLocation Location;
|
||||
TArray<FOculusXRSpaceQueryResult> Results;
|
||||
};
|
||||
|
||||
struct ShareAnchorsBinding
|
||||
{
|
||||
FOculusXRUInt64 RequestId;
|
||||
FOculusXRAnchorShareDelegate Binding;
|
||||
TArray<TWeakObjectPtr<UOculusXRAnchorComponent>> SharedAnchors;
|
||||
TArray<uint64> OculusUserIds;
|
||||
};
|
||||
|
||||
|
||||
// Delegate bindings
|
||||
TMap<uint64, CreateAnchorBinding> CreateSpatialAnchorBindings;
|
||||
TMap<uint64, EraseAnchorBinding> EraseAnchorBindings;
|
||||
TMap<uint64, SetComponentStatusBinding> SetComponentStatusBindings;
|
||||
TMap<uint64, SaveAnchorBinding> AnchorSaveBindings;
|
||||
TMap<uint64, SaveAnchorListBinding> AnchorSaveListBindings;
|
||||
TMap<uint64, AnchorQueryBinding> AnchorQueryBindings;
|
||||
TMap<uint64, ShareAnchorsBinding> ShareAnchorsBindings;
|
||||
|
||||
// Delegate handles
|
||||
FDelegateHandle DelegateHandleAnchorCreate;
|
||||
FDelegateHandle DelegateHandleAnchorErase;
|
||||
FDelegateHandle DelegateHandleSetComponentStatus;
|
||||
FDelegateHandle DelegateHandleAnchorSave;
|
||||
FDelegateHandle DelegateHandleAnchorSaveList;
|
||||
FDelegateHandle DelegateHandleQueryResultsBegin;
|
||||
FDelegateHandle DelegateHandleQueryResultElement;
|
||||
FDelegateHandle DelegateHandleQueryComplete;
|
||||
FDelegateHandle DelegateHandleAnchorShare;
|
||||
};
|
||||
|
||||
} // namespace OculusXRAnchors
|
||||
@@ -0,0 +1,64 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "OculusXRSpatialAnchorComponent.h"
|
||||
#include "OculusXRAnchorBPFunctionLibrary.h"
|
||||
#include "OculusXRRoomLayoutManagerComponent.generated.h"
|
||||
|
||||
UCLASS(meta = (DisplayName = "OculusXR Room Layout Manager Component", BlueprintSpawnableComponent))
|
||||
class OCULUSXRANCHORS_API UOculusXRRoomLayoutManagerComponent : public UActorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
UOculusXRRoomLayoutManagerComponent(const FObjectInitializer& ObjectInitializer);
|
||||
|
||||
virtual void InitializeComponent() override;
|
||||
virtual void UninitializeComponent() override;
|
||||
|
||||
virtual void OnRegister() override;
|
||||
virtual void OnUnregister() override;
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOculusXRRoomLayoutSceneCaptureCompleteDelegate,
|
||||
FOculusXRUInt64, requestId,
|
||||
bool, result);
|
||||
|
||||
DECLARE_MULTICAST_DELEGATE_TwoParams(FOculusXRRoomLayoutSceneCompleteNativeDelegate, FOculusXRUInt64 /*requestId*/, bool /*success*/);
|
||||
FOculusXRRoomLayoutSceneCompleteNativeDelegate OculusXRRoomLayoutSceneCaptureCompleteNative;
|
||||
|
||||
UPROPERTY(BlueprintAssignable, Category = "OculusXR|Room Layout Manager")
|
||||
FOculusXRRoomLayoutSceneCaptureCompleteDelegate OculusXRRoomLayoutSceneCaptureComplete;
|
||||
|
||||
// Requests to launch Capture Flow
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Room Layout Manager")
|
||||
bool LaunchCaptureFlow();
|
||||
|
||||
// Gets room layout for a specific space
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Room Layout Manager")
|
||||
bool GetRoomLayout(FOculusXRUInt64 Space, UPARAM(ref) FOculusXRRoomLayout& RoomLayoutOut, int32 MaxWallsCapacity = 64);
|
||||
|
||||
// Loads mesh data (vertices, indeces) associated with the space into UProceduralMeshComponent
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Room Layout Manager")
|
||||
bool LoadTriangleMesh(FOculusXRUInt64 Space, class UProceduralMeshComponent* Mesh, bool CreateCollision) const;
|
||||
|
||||
protected:
|
||||
UPROPERTY(Transient)
|
||||
TSet<uint64> EntityRequestList;
|
||||
|
||||
UPROPERTY(Transient)
|
||||
TMap<FOculusXRUInt64, FOculusXRRoomLayout> RoomLayouts;
|
||||
|
||||
private:
|
||||
UFUNCTION()
|
||||
void OculusRoomLayoutSceneCaptureComplete_Handler(FOculusXRUInt64 RequestId, bool bSuccess)
|
||||
{
|
||||
if (EntityRequestList.Find(RequestId.Value) != nullptr)
|
||||
{
|
||||
OculusXRRoomLayoutSceneCaptureComplete.Broadcast(RequestId, bSuccess);
|
||||
OculusXRRoomLayoutSceneCaptureCompleteNative.Broadcast(RequestId, bSuccess);
|
||||
EntityRequestList.Remove(RequestId.Value);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,25 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "OculusXRAnchorComponent.h"
|
||||
#include "OculusXRAnchors.h"
|
||||
#include "OculusXRSpatialAnchorComponent.generated.h"
|
||||
|
||||
DECLARE_LOG_CATEGORY_EXTERN(LogOculusSpatialAnchor, Log, All);
|
||||
|
||||
UCLASS(meta = (DisplayName = "Oculus Spatial Anchor Component", BlueprintSpawnableComponent))
|
||||
class OCULUSXRANCHORS_API UOculusXRSpatialAnchorComponent : public UOculusXRAnchorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRSpatialAnchorComponent(const FObjectInitializer& ObjectInitializer);
|
||||
|
||||
static bool Create(const FTransform& NewAnchorTransform, AActor* OwningActor, const FOculusXRSpatialAnchorCreateDelegate& Callback);
|
||||
|
||||
bool Erase(const FOculusXRAnchorEraseDelegate& Callback);
|
||||
bool Save(EOculusXRSpaceStorageLocation Location, const FOculusXRAnchorSaveDelegate& Callback);
|
||||
|
||||
private:
|
||||
};
|
||||
Reference in New Issue
Block a user