// Copyright (c) Meta Platforms, Inc. and affiliates. #pragma once #include "GameFramework/Actor.h" #include "OculusXRRoomLayoutManagerComponent.h" #include "Dom/JsonValue.h" #include "OculusXRAnchorsRequests.h" #include "MRUtilityKitData.generated.h" /** * Actor to help finding the localization of actors. * It gets a list of all anchor queries that should be localized * and checks every tick if the anchor localization is there. * When the localization is complete, it will emit the event OnComplete. * * NOTE: Normally this should be a async task. However, the anchor data * can only be queried in game thread. */ UCLASS(ClassGroup = MRUtilityKit, Hidden) class MRUTILITYKIT_API AMRUKLocalizer : public AActor { GENERATED_BODY() public: DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnComplete, bool, Success); /** * Event that gets fired when all anchors have been localized. */ UPROPERTY(BlueprintAssignable, Category = "MR Utility Kit") FOnComplete OnComplete; TArray AnchorsData; AMRUKLocalizer(); void Tick(float DeltaTime) override; }; /** * A datastrcture to hold the data of a single anchor. It also provides functions to load the data from device or json. */ UCLASS(ClassGroup = MRUtilityKit, Hidden) class MRUTILITYKIT_API UMRUKAnchorData : public UObject { GENERATED_BODY() public: FOculusXRAnchorsDiscoverResult SpaceQuery; FTransform Transform; FBox2D PlaneBounds; FBox VolumeBounds; TArray SemanticClassifications; TArray PlaneBoundary2D; bool NeedAnchorLocalization = false; void LoadFromDevice(const FOculusXRAnchorsDiscoverResult& AnchorsDiscoverResult); void LoadFromJson(const FJsonValue& Value); }; /** * Load room data from device. * When all room data has been loaded, the OnComplete event will be fired. */ UCLASS(ClassGroup = MRUtilityKit, Hidden) class MRUTILITYKIT_API UMRUKRoomData : public UObject { GENERATED_BODY() public: DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnComplete, bool, Success); /** * Event that gets fired after all room data has been loaded. */ UPROPERTY(BlueprintAssignable, Category = "MR Utility Kit") FOnComplete OnComplete; FOculusXRAnchorsDiscoverResult SpaceQuery; FOculusXRRoomLayout RoomLayout; UPROPERTY() TArray> AnchorsData; UPROPERTY() AMRUKLocalizer* LocalizationActor = nullptr; class UMRUKSceneData* SceneData; void LoadFromDevice(UMRUKSceneData* Data, const FOculusXRAnchorsDiscoverResult& AnchorsDiscoverResult); void LoadFromJson(UMRUKSceneData* Data, const FJsonValue& Value); private: void FinishQuery(bool Success); void RoomDataLoadedComplete(EOculusXRAnchorResult::Type Result); void RoomDataLoadedIncrementalResults(const TArray& DiscoverResults); UFUNCTION() void AnchorsInitialized(bool Success); }; /** * Load scene data from device. * When all scene data has been loaded, the OnComplete event will be fired. */ UCLASS(ClassGroup = MRUtilityKit, Hidden) class MRUTILITYKIT_API UMRUKSceneData : public UObject { GENERATED_BODY() public: DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnComplete, bool, Success); /** * Event that gets fired after all scene data has been loaded. */ UPROPERTY(BlueprintAssignable, Category = "MR Utility Kit") FOnComplete OnComplete; UPROPERTY() TArray> RoomsData; void LoadFromDevice(); void LoadFromJson(const FString& Json); private: int32 NumRoomsLeftToInitialize = 0; bool AnyRoomFailed = false; void FinishQuery(bool Success); void SceneDataLoadedResult(EOculusXRAnchorResult::Type Result); void SceneDataLoadedComplete(const TArray& DiscoverResults); UFUNCTION() void RoomQueryComplete(bool Success); };