Android build settings + metaxr
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_SCENE_SUPPORTED_PLATFORMS (PLATFORM_WINDOWS && WINVER > 0x0502) || (PLATFORM_ANDROID_ARM || PLATFORM_ANDROID_ARM64 || PLATFORM_ANDROID_X64)
|
||||
|
||||
/**
|
||||
* The public interface to this module. In most cases, this interface is only public to sibling modules
|
||||
* within this plugin.
|
||||
*/
|
||||
class IOculusXRSceneModule : 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 IOculusXRSceneModule& Get()
|
||||
{
|
||||
return FModuleManager::LoadModuleChecked<IOculusXRSceneModule>("OculusXRScene");
|
||||
}
|
||||
|
||||
/**
|
||||
* 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("OculusXRScene");
|
||||
}
|
||||
};
|
||||
@@ -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 OCULUSXRSCENE_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);
|
||||
}
|
||||
}
|
||||
};
|
||||
32
Plugins/MetaXR/Source/OculusXRScene/Public/OculusXRScene.h
Normal file
32
Plugins/MetaXR/Source/OculusXRScene/Public/OculusXRScene.h
Normal file
@@ -0,0 +1,32 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "OculusXRSceneFunctions.h"
|
||||
#include "OculusXRAnchorTypes.h"
|
||||
#include "OculusXRSceneTypes.h"
|
||||
|
||||
namespace OculusXRScene
|
||||
{
|
||||
struct OCULUSXRSCENE_API FOculusXRScene
|
||||
{
|
||||
static EOculusXRAnchorResult::Type GetScenePlane(uint64 AnchorHandle, FVector& OutPos, FVector& OutSize);
|
||||
static EOculusXRAnchorResult::Type GetSceneVolume(uint64 AnchorHandle, FVector& OutPos, FVector& OutSize);
|
||||
static EOculusXRAnchorResult::Type GetSemanticClassification(uint64 AnchorHandle, TArray<FString>& OutSemanticClassifications);
|
||||
static EOculusXRAnchorResult::Type GetBoundary2D(uint64 AnchorHandle, TArray<FVector2f>& OutVertices);
|
||||
|
||||
static EOculusXRAnchorResult::Type RequestSceneCapture(uint64& OutRequestID);
|
||||
static EOculusXRAnchorResult::Type GetRoomLayout(uint64 AnchorHandle, const uint32 MaxWallsCapacity, FOculusXRUUID& OutCeilingUuid, FOculusXRUUID& OutFloorUuid, TArray<FOculusXRUUID>& OutWallsUuid);
|
||||
static EOculusXRAnchorResult::Type GetTriangleMesh(uint64 AnchorHandle, TArray<FVector>& Vertices, TArray<int32>& Triangles);
|
||||
|
||||
// Requests to change the current boundary visibility
|
||||
static EOculusXRAnchorResult::Type RequestBoundaryVisibility(EOculusXRBoundaryVisibility NewVisibilityRequest);
|
||||
|
||||
// Gets the current boundary visibility
|
||||
static EOculusXRAnchorResult::Type GetBoundaryVisibility(EOculusXRBoundaryVisibility& OutVisibility);
|
||||
|
||||
private:
|
||||
static TSharedPtr<IOculusXRSceneFunctions> GetOculusXRSceneFunctionsImpl();
|
||||
static TSharedPtr<IOculusXRSceneFunctions> SceneFunctionsImpl;
|
||||
};
|
||||
} // namespace OculusXRScene
|
||||
184
Plugins/MetaXR/Source/OculusXRScene/Public/OculusXRSceneActor.h
Normal file
184
Plugins/MetaXR/Source/OculusXRScene/Public/OculusXRSceneActor.h
Normal file
@@ -0,0 +1,184 @@
|
||||
// @lint-ignore-every LICENSELINT
|
||||
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||
#pragma once
|
||||
|
||||
#include "GameFramework/Actor.h"
|
||||
#include "OculusXRRoomLayoutManagerComponent.h"
|
||||
#include "OculusXRAnchorComponent.h"
|
||||
#include "OculusXRFunctionLibrary.h"
|
||||
#include "OculusXRSceneAnchorComponent.h"
|
||||
#include "OculusXRSceneTypes.h"
|
||||
#include "OculusXRSceneActor.generated.h"
|
||||
|
||||
/** EOculusXRLaunchCaptureFlowWhenMissingScene
|
||||
* Used to dictate whether the actor should launch the Capture Flow application when a scene is not detected on the device.
|
||||
* The Actor will check if a scene capture is either non-existent or invalid (ie. missing walls/ceiling/floor) before checking if Capture Flow
|
||||
* should be launched.
|
||||
*
|
||||
* NEVER: will never launch Flow Capture.
|
||||
* ONCE: will only launch it once. If the actor still doesn't detect that a scene was captured, it will not launch Capture Flow again.
|
||||
* ALWAYS: will always re-launch Flow Capture if a scene was not detected on the device.
|
||||
*/
|
||||
UENUM(BlueprintType)
|
||||
enum EOculusXRLaunchCaptureFlowWhenMissingScene
|
||||
{
|
||||
NEVER UMETA(DisplayName = "Never"),
|
||||
ONCE UMETA(DisplayName = "Once"),
|
||||
ALWAYS UMETA(DisplayName = "Always")
|
||||
};
|
||||
|
||||
/** FOculusXRSpawnedSceneAnchorProperties
|
||||
* Properties/Components that a spawned scene anchor will use.
|
||||
*/
|
||||
USTRUCT(BlueprintType)
|
||||
struct OCULUSXRSCENE_API FOculusXRSpawnedSceneAnchorProperties
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, Category = "Spawned Scene Anchor Properties")
|
||||
TSoftClassPtr<UOculusXRSceneAnchorComponent> ActorComponent = TSoftClassPtr<UOculusXRSceneAnchorComponent>(FSoftClassPath(UOculusXRSceneAnchorComponent::StaticClass()));
|
||||
|
||||
UPROPERTY(EditAnywhere, Category = "Spawned Scene Anchor Properties")
|
||||
TSoftObjectPtr<UStaticMesh> StaticMesh;
|
||||
|
||||
UPROPERTY(EditAnywhere, Category = "Spawned Scene Anchor Properties", Meta = (DeprecatedProperty, DeprecationMessage = "This property is deprecated. Alignment is done automatically at lower level."))
|
||||
bool ForceParallelToFloor = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, Category = "Spawned Scene Anchor Properties")
|
||||
FVector AddOffset = FVector::ZeroVector;
|
||||
};
|
||||
|
||||
/**
|
||||
* AOculusXRSceneActor
|
||||
*
|
||||
* DEPRECATED: AOculusXRSceneActor and associated classes are deprecated (v65), please use MR Utility Kit instead
|
||||
* (https://developer.oculus.com/documentation/unreal/unreal-mr-utility-kit-overview)
|
||||
*
|
||||
* The purpose of this actor is to be able to spawn "scene anchor" actors.
|
||||
*
|
||||
* Each actor type (based on their semantic label) can be configured to be spawned with a specific mesh and actor component.
|
||||
*
|
||||
* Overall, it provides a simple interface to be able to quickly get a captured scene from Capture Flow populated at runtime.
|
||||
* It also provides a basic and flexible template to making use of the OculusAnchorSDK and UOculusXRRoomLayoutManagerComponent
|
||||
* to drive the actor's logic. This removes the need for the developer to implement a system from scratch that makes use of
|
||||
* the native methods and components.
|
||||
*
|
||||
* TLDR:
|
||||
* - This actor populates a captured scene (created in Capture Flow) by spawning child actors with predefined actor and mesh components.
|
||||
* - Can be used as is, or can be derived or modified as needed depending on the application's needs.
|
||||
*/
|
||||
UCLASS(ClassGroup = OculusXRScene)
|
||||
class OCULUSXRSCENE_API AOculusXRSceneActor : public AActor
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene Actor")
|
||||
void LaunchCaptureFlow();
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene Actor")
|
||||
bool IsScenePopulated();
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene Actor", Meta = (DeprecatedFunction, DeprecationMessage = "Is Room Layout Valid is deprecated and no longer returns any value but true. Please validate your room configuration in the way your application requires."))
|
||||
bool IsRoomLayoutValid();
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene Actor")
|
||||
void PopulateScene();
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene Actor")
|
||||
void ClearScene();
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene Actor")
|
||||
void SetVisibilityToAllSceneAnchors(const bool bIsVisible);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene Actor")
|
||||
void SetVisibilityToSceneAnchorsBySemanticLabel(const FString SemanticLabel, const bool bIsVisible);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene Actor")
|
||||
TArray<AActor*> GetActorsBySemanticLabel(const FString SemanticLabel);
|
||||
|
||||
UFUNCTION(BlueprintPure, BlueprintCallable, Category = "OculusXR|Scene Actor")
|
||||
TArray<FOculusXRRoomLayout> GetRoomLayouts() const;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "OculusXR|Scene Actor")
|
||||
TEnumAsByte<EOculusXRLaunchCaptureFlowWhenMissingScene> LauchCaptureFlowWhenMissingScene = EOculusXRLaunchCaptureFlowWhenMissingScene::ALWAYS;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "OculusXR|Scene Actor", meta = (UIMin = 1, ClampMin = 1, UIMax = 1024, ClampMax = 1024))
|
||||
int32 MaxQueries = 64;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "OculusXR|Scene Actor")
|
||||
bool bPopulateSceneOnBeginPlay = true;
|
||||
|
||||
// If true then when the scene model is loaded we will only attempt to populate the room the user is standing in.
|
||||
// Otherwise all rooms and all scene anchors will be loaded.
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "OculusXR|Scene Actor")
|
||||
bool bActiveRoomOnly = true;
|
||||
|
||||
UPROPERTY(EditAnywhere, Category = "OculusXR|Scene Actor")
|
||||
TMap<FString, FOculusXRSpawnedSceneAnchorProperties> ScenePlaneSpawnedSceneAnchorProperties;
|
||||
|
||||
UPROPERTY(EditAnywhere, Category = "OculusXR|Scene Actor")
|
||||
TMap<FString, FOculusXRSpawnedSceneAnchorProperties> SceneVolumeSpawnedSceneAnchorProperties;
|
||||
|
||||
public:
|
||||
AOculusXRSceneActor(const FObjectInitializer& ObjectInitializer);
|
||||
|
||||
virtual void BeginPlay() override;
|
||||
virtual void EndPlay(EEndPlayReason::Type Reason) override;
|
||||
virtual void Tick(float DeltaTime) override;
|
||||
|
||||
virtual void PostLoad() override;
|
||||
|
||||
private:
|
||||
EOculusXRAnchorResult::Type QueryAllRooms();
|
||||
void RoomLayoutDiscoveryResultsAvailable(const TArray<FOculusXRAnchorsDiscoverResult>& QueryResults);
|
||||
void ProcessRoomQueryResult(FOculusXRUInt64 AnchorHandle, FOculusXRUUID UUID);
|
||||
|
||||
EOculusXRAnchorResult::Type QueryRoomUUIDs(const FOculusXRUInt64 RoomSpaceID, const TArray<FOculusXRUUID>& RoomUUIDs);
|
||||
void SceneRoomDiscoveryResultsAvailable(const TArray<FOculusXRAnchorsDiscoverResult>& QueryResults, const FOculusXRUInt64 RoomSpaceID);
|
||||
void ProcessRoomElementsResult(FOculusXRUInt64 AnchorHandle, const FOculusXRUInt64 RoomSpaceID);
|
||||
|
||||
void StartSingleRoomQuery(FOculusXRUInt64 RoomSpaceID, FOculusXRRoomLayout RoomLayout);
|
||||
EOculusXRAnchorResult::Type QueryFloorForActiveRoom(FOculusXRUInt64 RoomSpaceID, FOculusXRRoomLayout RoomLayout);
|
||||
void ActiveRoomFloorDiscoveryResultsAvailable(const TArray<FOculusXRAnchorsDiscoverResult>& QueryResults, FOculusXRUInt64 RoomSpaceID, FOculusXRRoomLayout RoomLayout);
|
||||
|
||||
bool CheckFloorBounds(FOculusXRUInt64 AnchorHandle, FOculusXRUUID UUID, FOculusXRUInt64 RoomAnchorHandle);
|
||||
|
||||
bool PointInPolygon2D(FVector2f PointToTest, const TArray<FVector2f>& PolyVerts) const;
|
||||
|
||||
void GetSemanticClassifications(uint64 Space, TArray<FString>& OutSemanticLabels) const;
|
||||
|
||||
// Scene capture event handler
|
||||
void SceneCaptureComplete_Handler(FOculusXRUInt64 RequestId, bool bResult);
|
||||
|
||||
// Launches Capture Flow if (based on LauchCaptureFlowWhenMissingScene member value)
|
||||
void LaunchCaptureFlowIfNeeded();
|
||||
|
||||
// Resets states of the Actor
|
||||
void ResetStates();
|
||||
|
||||
// Validates UUID
|
||||
bool IsValidUuid(const FOculusXRUUID& Uuid);
|
||||
|
||||
// Helper method to spawn an actor for anchor
|
||||
AActor* SpawnActorWithSceneComponent(const FOculusXRUInt64& Space, const FOculusXRUInt64& RoomSpaceID, const TArray<FString>& SemanticClassifications, UClass* sceneAnchorComponentInstanceClass);
|
||||
|
||||
// Spawns a scene anchor
|
||||
AActor* SpawnOrUpdateSceneAnchor(AActor* Anchor, const FOculusXRUInt64& Space, const FOculusXRUInt64& RoomSpaceID, const FVector& BoundedPos, const FVector& BoundedSize, const TArray<FString>& SemanticClassifications, const EOculusXRSpaceComponentType AnchorComponentType);
|
||||
|
||||
// Components for room layout and spatial anchors functionalities
|
||||
UOculusXRRoomLayoutManagerComponent* RoomLayoutManagerComponent = nullptr;
|
||||
|
||||
class UOculusXRSceneGlobalMeshComponent* SceneGlobalMeshComponent = nullptr;
|
||||
|
||||
// Whether Capture Flow was already launched once
|
||||
bool bCaptureFlowWasLaunched;
|
||||
|
||||
// Whether last room layout was valid
|
||||
bool bRoomLayoutIsValid;
|
||||
|
||||
// Whether we found a captured scene
|
||||
bool bFoundCapturedScene;
|
||||
|
||||
UPROPERTY(Transient)
|
||||
TMap<FOculusXRUInt64, FOculusXRRoomLayout> RoomLayouts;
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "OculusXRAnchorComponent.h"
|
||||
#include "OculusXRSceneAnchorComponent.generated.h"
|
||||
|
||||
/**
|
||||
* DEPRECATED: AOculusXRSceneActor and associated classes are deprecated (v65), please use MR Utility Kit instead
|
||||
* (https://developer.oculus.com/documentation/unreal/unreal-mr-utility-kit-overview)
|
||||
*/
|
||||
UCLASS(meta = (DisplayName = "OculusXR Scene Anchor Component", BlueprintSpawnableComponent))
|
||||
class OCULUSXRSCENE_API UOculusXRSceneAnchorComponent : public UOculusXRAnchorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
|
||||
|
||||
public:
|
||||
UOculusXRSceneAnchorComponent(const FObjectInitializer& ObjectInitializer);
|
||||
|
||||
UPROPERTY(Transient, BlueprintReadOnly, Category = "OculusXR|Scene Anchor Component")
|
||||
TArray<FString> SemanticClassifications;
|
||||
|
||||
UPROPERTY(Transient, BlueprintReadOnly, Category = "OculusXR|Scene Anchor Component")
|
||||
FOculusXRUInt64 RoomSpaceID = 0;
|
||||
};
|
||||
@@ -0,0 +1,73 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
#include "UObject/Class.h"
|
||||
#include "OculusXRAnchorComponents.h"
|
||||
#include "OculusXRSceneComponents.generated.h"
|
||||
|
||||
UCLASS(Blueprintable)
|
||||
class OCULUSXRSCENE_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 OCULUSXRSCENE_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 OCULUSXRSCENE_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 OCULUSXRSCENE_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 OCULUSXRSCENE_API UOculusXRTriangleMeshAnchorComponent : public UOculusXRBaseAnchorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRTriangleMeshAnchorComponent()
|
||||
{
|
||||
Type = EOculusXRSpaceComponentType::TriangleMesh;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,18 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreTypes.h"
|
||||
#include "OculusXRAnchorTypes.h"
|
||||
#include "OculusXRSceneTypes.h"
|
||||
#include "Delegates/Delegate.h"
|
||||
|
||||
class OCULUSXRSCENE_API FOculusXRSceneEventDelegates
|
||||
{
|
||||
public:
|
||||
DECLARE_MULTICAST_DELEGATE_OneParam(FOculusXRBoundaryVisibilityChanged, EOculusXRBoundaryVisibility /*Visibility*/);
|
||||
static FOculusXRBoundaryVisibilityChanged OculusBoundaryVisibilityChanged;
|
||||
|
||||
DECLARE_MULTICAST_DELEGATE_TwoParams(FOculusXRSceneCaptureCompleteDelegate, FOculusXRUInt64 /*RequestId*/, bool /*Success*/);
|
||||
static FOculusXRSceneCaptureCompleteDelegate OculusSceneCaptureComplete;
|
||||
};
|
||||
@@ -0,0 +1,19 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Subsystems/EngineSubsystem.h>
|
||||
#include "OculusXRSceneTypes.h"
|
||||
#include "OculusXRAnchorTypes.h"
|
||||
#include "OculusXRSceneEventDelegates.generated.h"
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOculusXRScene_BoundaryVisibilityChanged, EOculusXRBoundaryVisibility, BoundaryVisibility);
|
||||
|
||||
UCLASS()
|
||||
class OCULUSXRSCENE_API UOculusXRSceneEventDelegates : public UEngineSubsystem
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXRScene_BoundaryVisibilityChanged OnBoundaryVisibilityChanged;
|
||||
};
|
||||
@@ -0,0 +1,31 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "OculusXRAnchorTypes.h"
|
||||
#include "Kismet/BlueprintFunctionLibrary.h"
|
||||
|
||||
#include "OculusXRSceneFunctionLibrary.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class OCULUSXRSCENE_API UOculusXRSceneFunctionLibrary : public UBlueprintFunctionLibrary
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
// Returns the current boundary visibility
|
||||
UFUNCTION(BlueprintPure, Category = "OculusXR|Scene", meta = (WorldContext = "WorldContext"))
|
||||
static bool GetBoundaryVisibility(const UObject* WorldContext, EOculusXRBoundaryVisibility& OutVisibility);
|
||||
|
||||
// Returns the requested boundary visibility state
|
||||
UFUNCTION(BlueprintPure, Category = "OculusXR|Scene", meta = (WorldContext = "WorldContext"))
|
||||
static bool GetRequestedBoundaryVisibility(const UObject* WorldContext, EOculusXRBoundaryVisibility& OutVisibility);
|
||||
|
||||
// Requests to change the current boundary visibility
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene", meta = (WorldContext = "WorldContext"))
|
||||
static bool RequestBoundaryVisibility(const UObject* WorldContext, EOculusXRBoundaryVisibility NewVisibilityRequest);
|
||||
|
||||
// Returns the room layout for the specified anchor handle that contains a RoomLayout component
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene")
|
||||
static bool GetRoomLayout(FOculusXRUInt64 AnchorHandle, FOculusXRRoomLayout& RoomLayoutOut, int32 MaxWallsCapacity = 64);
|
||||
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "OculusXRAnchorTypes.h"
|
||||
#include "OculusXRSceneTypes.h"
|
||||
|
||||
namespace OculusXRScene
|
||||
{
|
||||
struct OCULUSXRSCENE_API IOculusXRSceneFunctions
|
||||
{
|
||||
virtual EOculusXRAnchorResult::Type GetScenePlane(uint64 AnchorHandle, FVector& OutPos, FVector& OutSize) = 0;
|
||||
virtual EOculusXRAnchorResult::Type GetSceneVolume(uint64 AnchorHandle, FVector& OutPos, FVector& OutSize) = 0;
|
||||
virtual EOculusXRAnchorResult::Type GetSemanticClassification(uint64 AnchorHandle, TArray<FString>& OutSemanticClassifications) = 0;
|
||||
virtual EOculusXRAnchorResult::Type GetBoundary2D(uint64 AnchorHandle, TArray<FVector2f>& OutVertices) = 0;
|
||||
|
||||
virtual EOculusXRAnchorResult::Type RequestSceneCapture(uint64& OutRequestID) = 0;
|
||||
virtual EOculusXRAnchorResult::Type GetRoomLayout(uint64 AnchorHandle, const uint32 MaxWallsCapacity, FOculusXRUUID& OutCeilingUuid, FOculusXRUUID& OutFloorUuid, TArray<FOculusXRUUID>& OutWallsUuid) = 0;
|
||||
virtual EOculusXRAnchorResult::Type GetTriangleMesh(uint64 AnchorHandle, TArray<FVector>& Vertices, TArray<int32>& Triangles) = 0;
|
||||
|
||||
// Requests to change the current boundary visibility
|
||||
virtual EOculusXRAnchorResult::Type RequestBoundaryVisibility(EOculusXRBoundaryVisibility NewVisibilityRequest) = 0;
|
||||
|
||||
// Gets the current boundary visibility
|
||||
virtual EOculusXRAnchorResult::Type GetBoundaryVisibility(EOculusXRBoundaryVisibility& OutVisibility) = 0;
|
||||
|
||||
};
|
||||
} // namespace OculusXRScene
|
||||
@@ -0,0 +1,53 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "OculusXRSceneAnchorComponent.h"
|
||||
#include "Engine/CollisionProfile.h"
|
||||
#include "OculusXRRoomLayoutManagerComponent.h"
|
||||
#include "OculusXRSceneGlobalMeshComponent.generated.h"
|
||||
|
||||
class UMaterialInterface;
|
||||
|
||||
/**
|
||||
* DEPRECATED: AOculusXRSceneActor and associated classes are deprecated (v65), please use MR Utility Kit instead
|
||||
* (https://developer.oculus.com/documentation/unreal/unreal-mr-utility-kit-overview)
|
||||
*/
|
||||
UCLASS(meta = (DisplayName = "OculusXR Scene Global Mesh Component", BlueprintSpawnableComponent))
|
||||
class OCULUSXRSCENE_API UOculusXRSceneGlobalMeshComponent : public UActorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
|
||||
|
||||
public:
|
||||
UOculusXRSceneGlobalMeshComponent(const FObjectInitializer& ObjectInitializer);
|
||||
|
||||
void CreateMeshComponent(const FOculusXRUInt64& Space, AActor* GlobalMeshAnchor, const UOculusXRRoomLayoutManagerComponent* RoomLayoutManagerComponent) const;
|
||||
|
||||
static const FString GlobalMeshSemanticLabel;
|
||||
|
||||
public:
|
||||
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "OculusXR")
|
||||
bool Collision = false;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "OculusXR")
|
||||
FCollisionProfileName CollisionProfileName;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "OculusXR")
|
||||
bool Visible = false;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "OculusXR")
|
||||
UMaterialInterface* Material = nullptr;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "OculusXR")
|
||||
TSoftClassPtr<UOculusXRSceneAnchorComponent> SceneAnchorComponent = TSoftClassPtr<UOculusXRSceneAnchorComponent>(FSoftClassPath(UOculusXRSceneAnchorComponent::StaticClass()));
|
||||
|
||||
public:
|
||||
bool HasCollision() const;
|
||||
|
||||
bool IsVisible() const;
|
||||
|
||||
UClass* GetAnchorComponentClass() const;
|
||||
};
|
||||
@@ -0,0 +1,33 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Kismet/BlueprintAsyncActionBase.h"
|
||||
#include "Templates/SharedPointer.h"
|
||||
#include "OculusXRSceneTypes.h"
|
||||
#include "OculusXRSceneLatentActions.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class OCULUSXRSCENE_API UOculusXRAsyncAction_LaunchCaptureFlow : public UBlueprintAsyncActionBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOculusXRAsyncAction_CaptureFlowFinished);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|SpatialAnchor", meta = (WorldContext = "WorldContext", BlueprintInternalUseOnly = "true"))
|
||||
static UOculusXRAsyncAction_LaunchCaptureFlow* LaunchCaptureFlowAsync(const UObject* WorldContext);
|
||||
|
||||
void Activate() override;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXRAsyncAction_CaptureFlowFinished Success;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FOculusXRAsyncAction_CaptureFlowFinished Failure;
|
||||
|
||||
private:
|
||||
uint64 RequestId = 0;
|
||||
|
||||
UFUNCTION(CallInEditor)
|
||||
void OnCaptureFinish(FOculusXRUInt64 Id, bool bSuccess);
|
||||
};
|
||||
@@ -0,0 +1,45 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "OculusXRSceneTypes.h"
|
||||
#include <Subsystems/GameInstanceSubsystem.h>
|
||||
#include <Tickable.h>
|
||||
|
||||
#include "OculusXRSceneSubsystem.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class OCULUSXRSCENE_API UOculusXRSceneSubsystem : public UGameInstanceSubsystem, public FTickableGameObject
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UOculusXRSceneSubsystem();
|
||||
|
||||
virtual bool ShouldCreateSubsystem(UObject* Outer) const override;
|
||||
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
|
||||
virtual void Deinitialize() override;
|
||||
|
||||
// FTickableGameObject implementation Begin
|
||||
virtual ETickableTickType GetTickableTickType() const override;
|
||||
virtual bool IsAllowedToTick() const override final;
|
||||
virtual void Tick(float DeltaTime) override;
|
||||
virtual TStatId GetStatId() const override { RETURN_QUICK_DECLARE_CYCLE_STAT(UOculusXRSceneSubsystem, STATGROUP_Tickables); }
|
||||
// FTickableGameObject implementation End
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene")
|
||||
EOculusXRBoundaryVisibility GetBoundaryVisibility();
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene")
|
||||
EOculusXRBoundaryVisibility GetRequestedBoundaryVisibility();
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "OculusXR|Scene")
|
||||
void SetRequestedBoundaryVisibility(EOculusXRBoundaryVisibility Visibility);
|
||||
|
||||
private:
|
||||
void OnBoundaryVisibilityChanged(EOculusXRBoundaryVisibility visibility);
|
||||
void UpdateBoundary();
|
||||
|
||||
EOculusXRBoundaryVisibility requestedVisibilityState_;
|
||||
FDelegateHandle visChangedEventHandle_;
|
||||
bool bInitialized;
|
||||
};
|
||||
@@ -0,0 +1,20 @@
|
||||
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "OculusXRSceneTypes.generated.h"
|
||||
|
||||
USTRUCT()
|
||||
struct OCULUSXRSCENE_API FSceneTypesPlaceholder
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
};
|
||||
|
||||
UENUM(BlueprintType)
|
||||
enum class EOculusXRBoundaryVisibility : uint8
|
||||
{
|
||||
Invalid = 0,
|
||||
NotSuppressed = 1,
|
||||
Suppressed = 2
|
||||
};
|
||||
Reference in New Issue
Block a user