// // /*===============================================================================
// // Copyright (C) 2025 PhantomsXR Ltd. All Rights Reserved.
// //
// // This file is part of the Phantom.XRMOD.QuestModule.Runtime.
// //
// // The XR-MOD cannot be copied, distributed, or made available to
// // third-parties for commercial purposes without written permission of PhantomsXR Ltd.
// //
// // Contact nswell@phantomsxr.com for licensing requests.
// // ===============================================================================*/
using System.Collections.Generic;
using System.Linq;
using Phantom.XRMOD.Core.Runtime;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
using UnityEngine.XR.OpenXR.Features.Meta;
namespace Phantom.XRMOD.QuestModule.Runtime
{
///
/// Feature decorator for Meta Quest Occlusion.
///
/// Configures settings such as environment depth and human segmentation
/// based on the runtime configuration.
///
///
public class MetaQuestOcclusionDecorator : BaseMetaQuestFeatureDecorator
{
MetaOpenXROcclusionSubsystem metaOpenXROcclusionSubsystem;
AROcclusionManager occlusionManager;
///
/// Starts the occlusion algorithm.
///
/// Retrives the Meta OpenXR Occlusion subsystem and applies settings (Depth Mode, Human Segmentation, etc.)
/// from the .
///
///
public override void StartAlgorithm()
{
base.StartAlgorithm();
var tmp_XRConfiguresModel = IocContainer.GetIoc.Resolve();
List tmp_Subsystems = new();
SubsystemManager.GetSubsystems(tmp_Subsystems);
if (tmp_Subsystems.Count > 0 &&
tmp_Subsystems.FirstOrDefault() is MetaOpenXROcclusionSubsystem tmp_MetaOpenXROcclusionSubsystem)
{
metaOpenXROcclusionSubsystem = tmp_MetaOpenXROcclusionSubsystem;
}
if (metaOpenXROcclusionSubsystem != null)
{
metaOpenXROcclusionSubsystem.TrySetHandRemovalEnabled(tmp_XRConfiguresModel.EnableHandRemoval);
}
occlusionManager = IocContainer.GetIoc.Resolve().OcclusionManager;
occlusionManager.requestedEnvironmentDepthMode = tmp_XRConfiguresModel.EnvironmentDepthMode;
occlusionManager.requestedHumanDepthMode = tmp_XRConfiguresModel.HumanSegmentationDepthMode;
occlusionManager.requestedHumanStencilMode = tmp_XRConfiguresModel.HumanSegmentationStencilMode;
occlusionManager.environmentDepthTemporalSmoothingRequested = tmp_XRConfiguresModel.TemporalSmoothing;
occlusionManager.requestedOcclusionPreferenceMode = tmp_XRConfiguresModel.OcclusionPreferenceMode;
occlusionManager.gameObject.SetActive(tmp_XRConfiguresModel.UseOcclusion);
}
///
/// Determines if this feature is supported.
///
/// True if the Meta OpenXR Occlusion subsystem is available.
public override bool SupportThisFeature()
{
return metaOpenXROcclusionSubsystem != null;
}
///
/// Pauses the algorithm.
///
public override void PauseAlgorithm()
{
}
///
/// Stops the occlusion algorithm.
///
public override void StopAlgorithm()
{
occlusionManager.gameObject.SetActive(false);
}
}
}