// Copyright (c) Meta Platforms, Inc. and affiliates. #include "OculusXRPassthroughSubsystem.h" #include "Engine/World.h" #include "Engine/GameInstance.h" #include "OculusXRPersistentPassthroughInstance.h" #include "OculusXRHMDRuntimeSettings.h" #include "OculusXRHMD.h" #include "OculusXRPassthroughEventHandling.h" #include "OculusXRPassthroughModule.h" #include "Engine/World.h" #include "Engine/Texture2D.h" #include "Rendering/Texture2DResource.h" UOculusXRPassthroughSubsystem* UOculusXRPassthroughSubsystem::GetPassthroughSubsystem(const UWorld* InWorld) { if (InWorld) { return UGameInstance::GetSubsystem(InWorld->GetGameInstance()); } return nullptr; } UOculusXRPassthroughSubsystem::UOculusXRPassthroughSubsystem() { } bool UOculusXRPassthroughSubsystem::ShouldCreateSubsystem(UObject* Outer) const { // return true if "Passthrough Enabled" is checked in MetaXR plugin's settings. return GetDefault()->bInsightPassthroughEnabled; } void UOculusXRPassthroughSubsystem::Initialize(FSubsystemCollectionBase& Collection) { DelegateHandleLayerResumed = OculusXRPassthrough::FOculusXRPassthroughEventDelegates::OculusPassthroughLayerResumed.AddLambda([this](int layerID) { UE_LOG(LogOculusXRPassthrough, Log, TEXT("UOculusXRPassthroughSubsystem - Received layer #%d resumed event"), layerID); OnAnyLayerResumed.Broadcast(layerID); }); } void UOculusXRPassthroughSubsystem::Deinitialize() { OculusXRPassthrough::FOculusXRPassthroughEventDelegates::OculusPassthroughLayerResumed.Remove(DelegateHandleLayerResumed); } UOculusXRPersistentPassthroughInstance* UOculusXRPassthroughSubsystem::InitializePersistentPassthrough(FOculusXRPersistentPassthroughParameters Parameters, const FOculusXRPassthrough_LayerResumed_Single& LayerResumed) { if (IsValid(PPTInstance)) { PPTInstance->AddLayerResumedSingleDelegate(LayerResumed); PPTInstance->UpdateParameters(Parameters); return PPTInstance; } PPTInstance = NewObject(this, "PersistentPassthroughInstance", RF_NoFlags); PPTInstance->AddLayerResumedSingleDelegate(LayerResumed); PPTInstance->InitLayer(Parameters); OnAnyLayerResumed.AddDynamic(PPTInstance, &UOculusXRPersistentPassthroughInstance::OnAnyLayerResumedEvent); return PPTInstance; } void UOculusXRPassthroughSubsystem::DestroyPersistentPassthrough() { if (!IsValid(PPTInstance)) { return; } OnAnyLayerResumed.RemoveDynamic(PPTInstance, &UOculusXRPersistentPassthroughInstance::OnAnyLayerResumedEvent); PPTInstance->ConditionalBeginDestroy(); PPTInstance = nullptr; } UOculusXRPersistentPassthroughInstance* UOculusXRPassthroughSubsystem::GetPersistentPassthrough() const { return PPTInstance; }