// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using Microsoft.MixedReality.Toolkit.CameraSystem; using Microsoft.MixedReality.Toolkit.Utilities; using UnityEngine; #if UNITY_OPENXR using UnityEngine.XR.OpenXR; #endif // UNTIY_OPENXR namespace Microsoft.MixedReality.Toolkit.XRSDK.OpenXR { /// /// Camera settings provider for use with OpenXR and XR SDK. /// [MixedRealityDataProvider( typeof(IMixedRealityCameraSystem), (SupportedPlatforms)(-1), "OpenXR Camera Settings", "OpenXR/Profiles/DefaultOpenXRCameraSettingsProfile.asset", "MixedRealityToolkit.Providers", supportedUnityXRPipelines: SupportedUnityXRPipelines.XRSDK)] public class OpenXRCameraSettings : BaseCameraSettingsProvider { /// /// Constructor. /// /// The instance of the camera system which is managing this provider. /// Friendly name of the provider. /// Provider priority. Used to determine order of instantiation. /// The provider's configuration profile. public OpenXRCameraSettings( IMixedRealityCameraSystem cameraSystem, string name = null, uint priority = DefaultPriority, BaseCameraSettingsProfile profile = null) : base(cameraSystem, name, priority, profile) { } private bool? IsActiveLoader => #if UNITY_OPENXR LoaderHelpers.IsLoaderActive(); #else false; #endif // UNITY_OPENXR private OpenXRCameraSettingsProfile Profile => ConfigurationProfile as OpenXRCameraSettingsProfile; private OpenXRReprojectionUpdater reprojectionUpdater = null; /// public override void Enable() { if (!IsActiveLoader.HasValue) { IsEnabled = false; EnableIfLoaderBecomesActive(); return; } else if (!IsActiveLoader.Value) { IsEnabled = false; return; } InitializeReprojectionUpdater(); base.Enable(); } private async void EnableIfLoaderBecomesActive() { await new WaitUntil(() => IsActiveLoader.HasValue); if (IsActiveLoader.Value) { Enable(); } } /// public override void Disable() { UninitializeReprojectionUpdater(); base.Disable(); } #region IMixedRealityCameraSettings /// public override bool IsOpaque => XRSubsystemHelpers.DisplaySubsystem == null || !XRSubsystemHelpers.DisplaySubsystem.running || XRSubsystemHelpers.DisplaySubsystem.displayOpaque; #endregion IMixedRealityCameraSettings /// /// Adds and initializes the reprojection updater component. /// private void InitializeReprojectionUpdater() { if (reprojectionUpdater == null && Profile != null) { reprojectionUpdater = CameraCache.Main.EnsureComponent(); reprojectionUpdater.ReprojectionMethod = Profile.ReprojectionMethod; } } /// /// Uninitializes and removes the reprojection updater component. /// private void UninitializeReprojectionUpdater() { if (reprojectionUpdater != null) { UnityObjectExtensions.DestroyObject(reprojectionUpdater); reprojectionUpdater = null; } } } }