October3d55/M/PICOOpenXR/Source/PICOOpenXRMR/Private/PICO_MRAsyncActions.cpp

718 lines
21 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright® 2015-2023 PICO Technology Co., Ltd. All rights reserved.
// This plugin incorporates portions of the Unreal® Engine. Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere.
// Unreal® Engine, Copyright 1998 2023, Epic Games, Inc. All rights reserved.
#include "PICO_MRAsyncActions.h"
#include "PICOOpenXRRuntimeSettings.h"
#include "PICO_MR.h"
#include "PICO_SceneCapture.h"
#include "PICO_SpatialAnchor.h"
#include "PICO_SpatialMesh.h"
#include "Async/Async.h"
#include "Engine/World.h"
void URequestSpatialMeshPICO_AsyncAction::Activate()
{
EResultPICO Result = EResultPICO::XR_Error_Unknown_PICO;
const bool bStarted = FSpatialMeshExtensionPICO::GetInstance()->RequestSpatialTriangleMesh
(
FPICOPollFutureDelegate::CreateUObject(this, &URequestSpatialMeshPICO_AsyncAction::HandleRequestSpatialMeshComplete),Result
);
if (!bStarted)
{
OnFailure.Broadcast(Result);
}
}
void URequestSceneCapturesPICO_AsyncAction::Activate()
{
EResultPICO OutResult = EResultPICO::XR_Error_RuntimeFailure;
const bool bStarted = FSceneCaptureExtensionPICO::GetInstance()->RequestSpatialSceneInfos
(
SceneLoadInfo,
FPICOPollFutureDelegate::CreateUObject(this, &URequestSceneCapturesPICO_AsyncAction::HandleRequestSpatialSceneComplete),
OutResult
);
if (!bStarted)
{
OnFailure.Broadcast(OutResult);
}
}
URequestSceneCapturesPICO_AsyncAction* URequestSceneCapturesPICO_AsyncAction::RequestSceneCapturesPICO_Async(const FSceneLoadInfoPICO& InSceneLoadInfo)
{
URequestSceneCapturesPICO_AsyncAction* Action = NewObject<URequestSceneCapturesPICO_AsyncAction>();
Action->SceneLoadInfo = InSceneLoadInfo;
Action->RegisterWithGameInstance(GWorld);
return Action;
}
void URequestSceneCapturesPICO_AsyncAction::HandleRequestSpatialSceneComplete(const XrFutureEXT& FutureHandle)
{
EResultPICO OutResult = EResultPICO::XR_Error_Unknown_PICO;
TArray<FMRSceneInfoPICO> SceneLoadInfos;
if (FSceneCaptureExtensionPICO::GetInstance()->GetSpatialSceneInfos(FutureHandle, SceneLoadInfos, OutResult))
{
OnSuccess.Broadcast(OutResult, SceneLoadInfos);
}
else
{
OnFailure.Broadcast(OutResult);
}
SetReadyToDestroy();
}
URequestSpatialMeshPICO_AsyncAction* URequestSpatialMeshPICO_AsyncAction::RequestSpatialMeshInfosPICO_Async()
{
URequestSpatialMeshPICO_AsyncAction* Action = NewObject<URequestSpatialMeshPICO_AsyncAction>();
Action->RegisterWithGameInstance(GWorld);
return Action;
}
void URequestSpatialMeshPICO_AsyncAction::HandleRequestSpatialMeshComplete(const XrFutureEXT& FutureHandle)
{
AsyncTask(ENamedThreads::AnyBackgroundThreadNormalTask, [FutureHandle,this]()
{
TArray<FSpatialMeshInfoPICO> MeshInfos;
TSet<FSpatialUUIDPICO> NeedDeleteEntitySet;
EResultPICO OutResult = EResultPICO::XR_Error_Unknown_PICO;
if (FSpatialMeshExtensionPICO::GetInstance()->GetSpatialTriangleMeshInfos(FutureHandle,MeshInfos, OutResult))
{
OnSuccess.Broadcast(OutResult, MeshInfos);
}
else
{
OnFailure.Broadcast(OutResult);
}
SetReadyToDestroy();
});
}
void ULaunchSpatialMeshScanningPICO_AsyncAction::Activate()
{
if(!FSpatialMeshExtensionPICO::GetInstance()->IsHandleValid())
{
const UPICOOpenXRRuntimeSettings* Settings = GetDefault<UPICOOpenXRRuntimeSettings>();
if (Settings->bEnableMesh)
{
FSenseDataProviderCreateInfoMeshPICO cFPICOSenseDataProviderCreateInfoMesh = {};
cFPICOSenseDataProviderCreateInfoMesh.Lod = Settings->MeshLod;
if (Settings->bSemanticsAlignWithTriangle)
{
cFPICOSenseDataProviderCreateInfoMesh.ConfigArray.Add(ESpatialMeshConfigPICO::Spatial_Mesh_Config_Semantic);
}
else if (Settings->bSemanticsAlignWithVertex)
{
cFPICOSenseDataProviderCreateInfoMesh.ConfigArray.Add(ESpatialMeshConfigPICO::Spatial_Mesh_Config_Semantic);
cFPICOSenseDataProviderCreateInfoMesh.ConfigArray.Add(ESpatialMeshConfigPICO::Spatial_Mesh_Config_Semantic_Align_With_Vertex);
}
EResultPICO OutResult=EResultPICO::XR_Error_Unknown_PICO;
FSpatialMeshExtensionPICO::GetInstance()->CreateProvider(cFPICOSenseDataProviderCreateInfoMesh,OutResult);
}
}
EResultPICO Result=EResultPICO::XR_Error_Unknown_PICO;
const bool bStarted = FSpatialMeshExtensionPICO::GetInstance()->StartProvider
(
FPICOPollFutureDelegate::CreateUObject(this,
&ULaunchSpatialMeshScanningPICO_AsyncAction::HandleLaunchMeshScanningComplete)
,Result
);
if (!bStarted)
{
OnFailure.Broadcast(Result);
}
}
ULaunchSpatialMeshScanningPICO_AsyncAction* ULaunchSpatialMeshScanningPICO_AsyncAction::LaunchSpatialMeshScanningPICO_Async()
{
ULaunchSpatialMeshScanningPICO_AsyncAction* Action = NewObject<ULaunchSpatialMeshScanningPICO_AsyncAction>();
Action->RegisterWithGameInstance(GWorld);
return Action;
}
void ULaunchSpatialMeshScanningPICO_AsyncAction::HandleLaunchMeshScanningComplete(const XrFutureEXT& FutureHandle)
{
FSenseDataProviderStartCompletionPICO SenseDataProviderStartCompletion;
EResultPICO OutResult = EResultPICO::XR_Error_Unknown_PICO;
if (FSpatialSensingExtensionPICO::GetInstance()->StartSenseDataProviderComplete(FutureHandle, SenseDataProviderStartCompletion,OutResult))
{
if (PXR_SUCCESS(SenseDataProviderStartCompletion.FutureResult))
{
OnSuccess.Broadcast(SenseDataProviderStartCompletion.FutureResult);
}
else
{
OnFailure.Broadcast(SenseDataProviderStartCompletion.FutureResult);
}
}
else
{
OnFailure.Broadcast(OutResult);
}
SetReadyToDestroy();
}
void ULaunchSpatialAnchorServicePICO_AsyncAction::Activate()
{
if(!FSpatialAnchorExtensionPICO::GetInstance()->IsHandleValid())
{
const UPICOOpenXRRuntimeSettings* Settings = GetDefault<UPICOOpenXRRuntimeSettings>();
if (Settings->bEnableAnchor)
{
FSenseDataProviderCreateInfoAnchorPICO cFPICOSenseDataProviderCreateInfoAnchor = {};
EResultPICO OutResult=EResultPICO::XR_Error_Unknown_PICO;
FSpatialAnchorExtensionPICO::GetInstance()->CreateProvider(cFPICOSenseDataProviderCreateInfoAnchor,OutResult);
}
}
EResultPICO Result=EResultPICO::XR_Error_Unknown_PICO;
const bool bStarted = FSpatialAnchorExtensionPICO::GetInstance()->StartProvider(
FPICOPollFutureDelegate::CreateUObject(
this,
&ULaunchSpatialAnchorServicePICO_AsyncAction::HandleLaunchSpatialAnchorServiceComplete),
Result
);
if (!bStarted)
{
OnFailure.Broadcast(Result);
}
}
ULaunchSpatialAnchorServicePICO_AsyncAction* ULaunchSpatialAnchorServicePICO_AsyncAction::LaunchSpatialAnchorServicePICO_Async()
{
ULaunchSpatialAnchorServicePICO_AsyncAction* Action = NewObject<ULaunchSpatialAnchorServicePICO_AsyncAction>();
Action->RegisterWithGameInstance(GWorld);
return Action;
}
void ULaunchSpatialAnchorServicePICO_AsyncAction::HandleLaunchSpatialAnchorServiceComplete(const XrFutureEXT& FutureHandle)
{
FSenseDataProviderStartCompletionPICO SenseDataProviderStartCompletion;
EResultPICO OutResult = EResultPICO::XR_Error_Unknown_PICO;
if (FSpatialSensingExtensionPICO::GetInstance()->StartSenseDataProviderComplete(FutureHandle, SenseDataProviderStartCompletion,OutResult))
{
if (PXR_SUCCESS(SenseDataProviderStartCompletion.FutureResult))
{
OnSuccess.Broadcast(SenseDataProviderStartCompletion.FutureResult);
}
else
{
OnFailure.Broadcast(SenseDataProviderStartCompletion.FutureResult);
}
}
else
{
OnFailure.Broadcast(OutResult);
}
SetReadyToDestroy();
}
void ULaunchSceneCaptureServicePICO_AsyncAction::Activate()
{
if(!FSceneCaptureExtensionPICO::GetInstance()->IsHandleValid())
{
const UPICOOpenXRRuntimeSettings* Settings = GetDefault<UPICOOpenXRRuntimeSettings>();
if (Settings->bEnableSceneCapture)
{
FSenseDataProviderCreateInfoSceneCapturePICO cSenseDataProviderCreateInfoSceneCapture = {};
EResultPICO OutResult=EResultPICO::XR_Error_Unknown_PICO;
FSceneCaptureExtensionPICO::GetInstance()->CreateProvider(cSenseDataProviderCreateInfoSceneCapture,OutResult);
}
}
EResultPICO Result=EResultPICO::XR_Error_Unknown_PICO;
const bool bStarted = FSceneCaptureExtensionPICO::GetInstance()->StartProvider(
FPICOPollFutureDelegate::CreateUObject(this,
&ULaunchSceneCaptureServicePICO_AsyncAction::HandleLaunchSceneCaptureServiceComplete)
, Result);
if (!bStarted)
{
OnFailure.Broadcast(Result);
}
}
ULaunchSceneCaptureServicePICO_AsyncAction* ULaunchSceneCaptureServicePICO_AsyncAction::LaunchSceneCaptureServicePICO_Async()
{
ULaunchSceneCaptureServicePICO_AsyncAction* Action = NewObject<ULaunchSceneCaptureServicePICO_AsyncAction>();
Action->RegisterWithGameInstance(GWorld);
return Action;
}
void ULaunchSceneCaptureServicePICO_AsyncAction::HandleLaunchSceneCaptureServiceComplete(const XrFutureEXT& FutureHandle)
{
FSenseDataProviderStartCompletionPICO SenseDataProviderStartCompletion;
EResultPICO OutResult = EResultPICO::XR_Error_Unknown_PICO;
if (FSpatialSensingExtensionPICO::GetInstance()->StartSenseDataProviderComplete(FutureHandle, SenseDataProviderStartCompletion,OutResult))
{
if (PXR_SUCCESS(SenseDataProviderStartCompletion.FutureResult))
{
OnSuccess.Broadcast(SenseDataProviderStartCompletion.FutureResult);
}
else
{
OnFailure.Broadcast(SenseDataProviderStartCompletion.FutureResult);
}
}
else
{
OnFailure.Broadcast(OutResult);
}
SetReadyToDestroy();
}
void ULaunchSceneCaptureAppPICO_AsyncAction::HandleLaunchSceneCaptureAppComplete(const XrFutureEXT& FutureHandle)
{
FSceneCaptureStartCompletionPICO cPICOSceneCaptureStartCompletion;
EResultPICO OutResult = EResultPICO::XR_Error_Unknown_PICO;
if (FSceneCaptureExtensionPICO::GetInstance()->StartSceneCaptureComplete(FutureHandle, cPICOSceneCaptureStartCompletion,OutResult))
{
if (PXR_SUCCESS(cPICOSceneCaptureStartCompletion.FutureResult))
{
OnSuccess.Broadcast(cPICOSceneCaptureStartCompletion.FutureResult);
}
else
{
OnFailure.Broadcast(cPICOSceneCaptureStartCompletion.FutureResult);
}
}
else
{
OnFailure.Broadcast(OutResult);
}
SetReadyToDestroy();
}
ULaunchSceneCaptureAppPICO_AsyncAction* ULaunchSceneCaptureAppPICO_AsyncAction::LaunchSceneCaptureAppPICO_Async()
{
ULaunchSceneCaptureAppPICO_AsyncAction* Action = NewObject<ULaunchSceneCaptureAppPICO_AsyncAction>();
Action->RegisterWithGameInstance(GWorld);
return Action;
}
void ULaunchSceneCaptureAppPICO_AsyncAction::Activate()
{
EResultPICO Result = EResultPICO::XR_Error_Unknown_PICO;
bool bStarted = FSceneCaptureExtensionPICO::GetInstance()->StartSceneCaptureAsync
(
FPICOPollFutureDelegate::CreateUObject(this, &ULaunchSceneCaptureAppPICO_AsyncAction::HandleLaunchSceneCaptureAppComplete),
Result
);
if (!bStarted)
{
OnFailure.Broadcast(Result);
}
}
//////////////////////////////////////////////////////////////////////////
/// Create Anchor Entity
//////////////////////////////////////////////////////////////////////////
void UCreateSpatialAnchorPICO_AsyncAction::Activate()
{
if (!IsValid(BoundActor) || !IsValid(BoundActor->GetWorld()))
{
OnFailure.Broadcast(EResultPICO::XR_Error_ValidationFailure);
return;
}
EResultPICO Result = EResultPICO::XR_Error_Unknown_PICO;
bool bStarted = FSpatialAnchorExtensionPICO::GetInstance()->CreateSpatialAnchorAsync
(
FPICOPollFutureDelegate::CreateUObject(this, &UCreateSpatialAnchorPICO_AsyncAction::HandleCreateSpatialAnchorComplete)
, SpatialAnchorTransform
,Result
);
if (!bStarted)
{
OnFailure.Broadcast(Result);
}
}
UCreateSpatialAnchorPICO_AsyncAction* UCreateSpatialAnchorPICO_AsyncAction::CreateSpatialAnchorPICO_Async(AActor* BoundActor, const FTransform& InSpatialAnchorTransform)
{
UCreateSpatialAnchorPICO_AsyncAction* Action = NewObject<UCreateSpatialAnchorPICO_AsyncAction>();
Action->BoundActor = BoundActor;
Action->SpatialAnchorTransform = InSpatialAnchorTransform;
if (IsValid(BoundActor))
{
Action->RegisterWithGameInstance(BoundActor->GetWorld());
}
else
{
Action->RegisterWithGameInstance(GWorld);
}
return Action;
}
void UCreateSpatialAnchorPICO_AsyncAction::HandleCreateSpatialAnchorComplete(const XrFutureEXT& FutureHandle)
{
FSpatialAnchorCreateCompletionPICO SpatialAnchorCreateCompletion;
EResultPICO OutResult = EResultPICO::XR_Error_Unknown_PICO;
if(FSpatialAnchorExtensionPICO::GetInstance()->CreateSpatialAnchorComplete(FutureHandle, SpatialAnchorCreateCompletion,OutResult))
{
UAnchorComponentPICO* AnchorComponent = Cast<UAnchorComponentPICO>(BoundActor->GetComponentByClass(UAnchorComponentPICO::StaticClass()));
if (!AnchorComponent)
{
AnchorComponent = Cast<UAnchorComponentPICO>(BoundActor->AddComponentByClass(UAnchorComponentPICO::StaticClass(), false, FTransform::Identity, false));
}
AnchorComponent->SetAnchorHandle(SpatialAnchorCreateCompletion.AnchorHandle);
if(PXR_SUCCESS(SpatialAnchorCreateCompletion.FutureResult))
{
OnSuccess.Broadcast(SpatialAnchorCreateCompletion.FutureResult,AnchorComponent);
}
else
{
OnFailure.Broadcast(SpatialAnchorCreateCompletion.FutureResult);
}
}
else
{
OnFailure.Broadcast(OutResult);
}
SetReadyToDestroy();
}
//////////////////////////////////////////////////////////////////////////
/// Persist Anchor Entity
//////////////////////////////////////////////////////////////////////////
void UPersistSpatialAnchorPICO_AsyncAction::Activate()
{
if (!IsValid(BoundActor))
{
OnFailure.Broadcast(EResultPICO::XR_Error_ValidationFailure);
return;
}
EResultPICO Result = EResultPICO::XR_Error_Unknown_PICO;
bool bStarted = false;
switch (PersistLocation)
{
case EPersistLocationPICO::PersistLocation_Local:
{
bStarted = FSpatialAnchorExtensionPICO::GetInstance()->PersistSpatialAnchorAsync
(
BoundActor,
PersistLocation,
FPICOPollFutureDelegate::CreateUObject(this, &UPersistSpatialAnchorPICO_AsyncAction::HandlePersistSpatialAnchorComplete),
Result
);
}
break;
case EPersistLocationPICO::PersistLocation_Shared:
{
bStarted = FSpatialAnchorExtensionPICO::GetInstance()->ShareSpatialAnchorAsync
(
BoundActor,
FPICOPollFutureDelegate::CreateUObject(this, &UPersistSpatialAnchorPICO_AsyncAction::HandleShareSpatialAnchorComplete),
Result
);
}
break;
default: ;
}
if (!bStarted)
{
OnFailure.Broadcast(Result);
}
}
UPersistSpatialAnchorPICO_AsyncAction* UPersistSpatialAnchorPICO_AsyncAction::PersistSpatialAnchorPICO_Async(AActor* InBoundActor, EPersistLocationPICO InPersistLocation)
{
UPersistSpatialAnchorPICO_AsyncAction* Action = NewObject<UPersistSpatialAnchorPICO_AsyncAction>();
Action->BoundActor = InBoundActor;
Action->PersistLocation = InPersistLocation;
if (IsValid(InBoundActor))
{
Action->RegisterWithGameInstance(InBoundActor->GetWorld());
}
else
{
Action->RegisterWithGameInstance(GWorld);
}
return Action;
}
void UPersistSpatialAnchorPICO_AsyncAction::HandlePersistSpatialAnchorComplete(const XrFutureEXT& FutureHandle)
{
FSpatialAnchorPersistCompletionPICO SpatialAnchorPersistCompletion;
EResultPICO OutResult = EResultPICO::XR_Error_Unknown_PICO;
if (FSpatialAnchorExtensionPICO::GetInstance()->PersistSpatialAnchorComplete(FutureHandle, SpatialAnchorPersistCompletion,OutResult))
{
UAnchorComponentPICO* AnchorComponent = Cast<UAnchorComponentPICO>(BoundActor->GetComponentByClass(UAnchorComponentPICO::StaticClass()));
if (IsValid(AnchorComponent) && AnchorComponent->IsAnchorValid())
{
if(PXR_SUCCESS(SpatialAnchorPersistCompletion.FutureResult))
{
OnSuccess.Broadcast(SpatialAnchorPersistCompletion.FutureResult,AnchorComponent);
}
else
{
OnFailure.Broadcast(SpatialAnchorPersistCompletion.FutureResult);
}
}
else
{
OnFailure.Broadcast(EResultPICO::XR_Error_ValidationFailure);
}
}
else
{
OnFailure.Broadcast(OutResult);
}
SetReadyToDestroy();
}
void UPersistSpatialAnchorPICO_AsyncAction::HandleShareSpatialAnchorComplete(const XrFutureEXT& FutureHandle)
{
FSpatialAnchorShareCompletionPICO SpatialAnchorShareCompletion;
EResultPICO OutResult = EResultPICO::XR_Error_Unknown_PICO;
if (FSpatialAnchorExtensionPICO::GetInstance()->ShareSpatialAnchorComplete(FutureHandle, SpatialAnchorShareCompletion,OutResult))
{
UAnchorComponentPICO* AnchorComponent = Cast<UAnchorComponentPICO>(BoundActor->GetComponentByClass(UAnchorComponentPICO::StaticClass()));
if (IsValid(AnchorComponent) && AnchorComponent->IsAnchorValid())
{
if(PXR_SUCCESS(SpatialAnchorShareCompletion.FutureResult))
{
OnSuccess.Broadcast(SpatialAnchorShareCompletion.FutureResult,AnchorComponent);
}
else
{
OnFailure.Broadcast(SpatialAnchorShareCompletion.FutureResult);
}
}
else
{
OnFailure.Broadcast(EResultPICO::XR_Error_ValidationFailure);
}
}
else
{
OnFailure.Broadcast(OutResult);
}
SetReadyToDestroy();
}
//////////////////////////////////////////////////////////////////////////
/// Unpersist Anchor Entity
//////////////////////////////////////////////////////////////////////////
void UUnpersistSpatialAnchorPICO_AsyncAction::Activate()
{
if (!IsValid(BoundActor))
{
OnFailure.Broadcast(EResultPICO::XR_Error_ValidationFailure);
return;
}
bool bStarted=false;
EResultPICO Result = EResultPICO::XR_Error_Unknown_PICO;
bStarted = FSpatialAnchorExtensionPICO::GetInstance()->UnpersistSpatialAnchorAsync(
BoundActor,
FPICOPollFutureDelegate::CreateUObject(this, &UUnpersistSpatialAnchorPICO_AsyncAction::HandleUnpersistSpatialAnchorComplete),
Result
);
if (!bStarted)
{
OnFailure.Broadcast(Result);
}
}
UUnpersistSpatialAnchorPICO_AsyncAction* UUnpersistSpatialAnchorPICO_AsyncAction::UnpersistSpatialAnchorPICO_Async(AActor* BoundActor, EPersistLocationPICO InPersistLocation)
{
UUnpersistSpatialAnchorPICO_AsyncAction* Action = NewObject<UUnpersistSpatialAnchorPICO_AsyncAction>();
Action->BoundActor = BoundActor;
Action->PersistLocation = InPersistLocation;
if (IsValid(BoundActor))
{
Action->RegisterWithGameInstance(BoundActor->GetWorld());
}
else
{
Action->RegisterWithGameInstance(GWorld);
}
return Action;
}
void UUnpersistSpatialAnchorPICO_AsyncAction::HandleUnpersistSpatialAnchorComplete(const XrFutureEXT& FutureHandle)
{
FSpatialAnchorUnpersistCompletionPICO SpatialAnchorUnpersistCompletion;
EResultPICO OutResult = EResultPICO::XR_Error_Unknown_PICO;
if(FSpatialAnchorExtensionPICO::GetInstance()->UnpersistSpatialAnchorComplete(FutureHandle, SpatialAnchorUnpersistCompletion,OutResult))
{
UAnchorComponentPICO* AnchorComponent = Cast<UAnchorComponentPICO>(BoundActor->GetComponentByClass(UAnchorComponentPICO::StaticClass()));
if (IsValid(AnchorComponent) && AnchorComponent->IsAnchorValid())
{
if(PXR_SUCCESS(SpatialAnchorUnpersistCompletion.FutureResult))
{
OnSuccess.Broadcast(SpatialAnchorUnpersistCompletion.FutureResult,AnchorComponent);
}
else
{
OnFailure.Broadcast(SpatialAnchorUnpersistCompletion.FutureResult);
}
}
else
{
OnFailure.Broadcast(EResultPICO::XR_Error_ValidationFailure);
}
}
else
{
OnFailure.Broadcast(OutResult);
}
SetReadyToDestroy();
}
//////////////////////////////////////////////////////////////////////////
/// Load Anchor Entity
//////////////////////////////////////////////////////////////////////////
void URequestSpatialAnchorsPICO_AsyncAction::Activate()
{
bool bStarted = false;
EResultPICO Result = EResultPICO::XR_Error_Unknown_PICO;
FutureHandleSet.Empty();
switch (LoadInfo.PersistLocation)
{
case EPersistLocationPICO::PersistLocation_Local:
{
bStarted = FSpatialAnchorExtensionPICO::GetInstance()->LoadAnchorEntityAsync
(
LoadInfo,
FPICOPollFutureDelegate::CreateUObject(this, &URequestSpatialAnchorsPICO_AsyncAction::HandleLoadSpatialAnchorsComplete),
Result
);
}
break;
case EPersistLocationPICO::PersistLocation_Shared:
{
bStarted = FSpatialAnchorExtensionPICO::GetInstance()->DownloadSharedSpatialAnchorsAsync
(
LoadInfo,
FPICOPollFutureDelegate::CreateUObject(this,&URequestSpatialAnchorsPICO_AsyncAction::HandleDownloadSharedAnchorsComplete),
FutureHandleSet,
Result
);
}
break;
default: ;
}
if (!bStarted)
{
OnFailure.Broadcast(Result);
}
}
URequestSpatialAnchorsPICO_AsyncAction* URequestSpatialAnchorsPICO_AsyncAction::LoadSpatialAnchorPICO_Async(const FAnchorLoadInfoPICO& InLoadInfo)
{
URequestSpatialAnchorsPICO_AsyncAction* Action = NewObject<URequestSpatialAnchorsPICO_AsyncAction>();
Action->LoadInfo = InLoadInfo;
Action->RegisterWithGameInstance(GWorld);
return Action;
}
void URequestSpatialAnchorsPICO_AsyncAction::HandleLoadSpatialAnchorsComplete(const XrFutureEXT& FutureHandle)
{
EResultPICO LoadResult=EResultPICO::XR_Error_Unknown_PICO;
TArray<FAnchorLoadResultPICO> AnchorLoadResults;
if (FSpatialAnchorExtensionPICO::GetInstance()->GetAnchorLoadResults(FutureHandle,AnchorLoadResults,LoadResult))
{
OnSuccess.Broadcast(LoadResult,AnchorLoadResults);
}
else
{
OnFailure.Broadcast(LoadResult);
}
SetReadyToDestroy();
}
void URequestSpatialAnchorsPICO_AsyncAction::HandleDownloadSharedAnchorsComplete(const XrFutureEXT& FutureHandle)
{
EResultPICO OutResult = EResultPICO::XR_Error_Unknown_PICO;
FSharedSpatialAnchorDownloadCompletionPICO SharedSpatialAnchorDownloadCompletion;
FutureHandleSet.Remove(FutureHandle);
if(FSpatialAnchorExtensionPICO::GetInstance()->DownloadSharedSpatialAnchorsComplete(FutureHandle, SharedSpatialAnchorDownloadCompletion,OutResult))
{
if(PXR_SUCCESS(SharedSpatialAnchorDownloadCompletion.FutureResult))
{
if (!FutureHandleSet.Num())
{
if(!FSpatialAnchorExtensionPICO::GetInstance()->LoadAnchorEntityAsync(
LoadInfo,
FPICOPollFutureDelegate::CreateUObject(this, &URequestSpatialAnchorsPICO_AsyncAction::HandleLoadSpatialAnchorsComplete),
OutResult
))
{
OnFailure.Broadcast(OutResult);
}
}
}
else
{
OnFailure.Broadcast(SharedSpatialAnchorDownloadCompletion.FutureResult);
}
}
else
{
OnFailure.Broadcast(OutResult);
}
SetReadyToDestroy();
}