// // /*=============================================================================== // // 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); } } }