// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System; using System.Reflection; using UnityEditor; using UnityEngine; #if !UNITY_2020_1_OR_NEWER using Microsoft.MixedReality.Toolkit.Utilities.Editor; #endif // !UNITY_2020_1_OR_NEWER namespace Microsoft.MixedReality.Toolkit.Utilities { public static class MixedRealityOptimizeUtils { public static bool IsOptimalRenderingPath() #if UNITY_ANDROID => PlayerSettings.stereoRenderingPath == StereoRenderingPath.SinglePass; #else => PlayerSettings.stereoRenderingPath == StereoRenderingPath.Instancing; #endif public static void SetOptimalRenderingPath() #if UNITY_ANDROID => PlayerSettings.stereoRenderingPath = StereoRenderingPath.SinglePass; #else => PlayerSettings.stereoRenderingPath = StereoRenderingPath.Instancing; #endif /// /// Checks if the project has depth buffer sharing enabled. /// /// True if the project has depth buffer sharing enabled, false otherwise. public static bool IsDepthBufferSharingEnabled() { #if !UNITY_2020_1_OR_NEWER if (IsBuildTargetOpenVR()) { // Ensure compatibility with the pre-2019.3 XR architecture for customers / platforms // with legacy requirements. #pragma warning disable 0618 if (PlayerSettings.VROculus.sharedDepthBuffer) #pragma warning restore 0618 { return true; } } else if (IsBuildTargetUWP()) { #if UNITY_2019_1_OR_NEWER // Ensure compatibility with the pre-2019.3 XR architecture for customers / platforms // with legacy requirements. #pragma warning disable 0618 if (PlayerSettings.VRWindowsMixedReality.depthBufferSharingEnabled) #pragma warning restore 0618 { return true; } #else var playerSettings = GetSettingsObject("PlayerSettings"); var property = playerSettings?.FindProperty("vrSettings.hololens.depthBufferSharingEnabled"); if (property != null && property.boolValue) { return true; } #endif // UNITY_2019_1_OR_NEWER } #endif // !UNITY_2020_1_OR_NEWER return true; } public static void SetDepthBufferSharing(bool enableDepthBuffer) { #if !UNITY_2020_1_OR_NEWER if (IsBuildTargetOpenVR()) { // Ensure compatibility with the pre-2019.3 XR architecture for customers / platforms // with legacy requirements. #pragma warning disable 0618 PlayerSettings.VROculus.sharedDepthBuffer = enableDepthBuffer; #pragma warning restore 0618 } else if (IsBuildTargetUWP()) { #if UNITY_2019_1_OR_NEWER // Ensure compatibility with the pre-2019.3 XR architecture for customers / platforms // with legacy requirements. #pragma warning disable 0618 PlayerSettings.VRWindowsMixedReality.depthBufferSharingEnabled = enableDepthBuffer; #pragma warning restore 0618 #else var playerSettings = GetSettingsObject("PlayerSettings"); ChangeProperty(playerSettings, "vrSettings.hololens.depthBufferSharingEnabled", property => property.boolValue = enableDepthBuffer); #endif // UNITY_2019_1_OR_NEWER } #endif // !UNITY_2020_1_OR_NEWER } public static bool IsWMRDepthBufferFormat16bit() { #if !UNITY_2020_1_OR_NEWER if (XRSettingsUtilities.XREnabled) { #if UNITY_2019_1_OR_NEWER // Ensure compatibility with the pre-2019.3 XR architecture for customers / platforms // with legacy requirements. #pragma warning disable 0618 return PlayerSettings.VRWindowsMixedReality.depthBufferFormat == PlayerSettings.VRWindowsMixedReality.DepthBufferFormat.DepthBufferFormat16Bit; #pragma warning restore 0618 #else var playerSettings = GetSettingsObject("PlayerSettings"); var property = playerSettings?.FindProperty("vrSettings.hololens.depthFormat"); return property != null && property.intValue == 0; #endif // UNITY_2019_1_OR_NEWER } #endif // !UNITY_2020_1_OR_NEWER return true; } public static void SetDepthBufferFormat(bool set16BitDepthBuffer) { int depthFormat = set16BitDepthBuffer ? 0 : 1; #if !UNITY_2020_1_OR_NEWER // Ensure compatibility with the pre-2019.3 XR architecture for customers / platforms // with legacy requirements. #pragma warning disable 0618 PlayerSettings.VRCardboard.depthFormat = depthFormat; PlayerSettings.VRDaydream.depthFormat = depthFormat; #pragma warning restore 0618 var playerSettings = GetSettingsObject("PlayerSettings"); #if UNITY_2019_1_OR_NEWER // Ensure compatibility with the pre-2019.3 XR architecture for customers / platforms // with legacy requirements. #pragma warning disable 0618 PlayerSettings.VRWindowsMixedReality.depthBufferFormat = set16BitDepthBuffer ? PlayerSettings.VRWindowsMixedReality.DepthBufferFormat.DepthBufferFormat16Bit : PlayerSettings.VRWindowsMixedReality.DepthBufferFormat.DepthBufferFormat24Bit; #pragma warning restore 0618 ChangeProperty(playerSettings, "vrSettings.lumin.depthFormat", property => property.intValue = depthFormat); #else ChangeProperty(playerSettings, "vrSettings.hololens.depthFormat", property => property.intValue = depthFormat); #endif // UNITY_2019_1_OR_NEWER #endif // !UNITY_2020_1_OR_NEWER } public static bool IsRealtimeGlobalIlluminationEnabled() { var lightmapSettings = GetLightmapSettings(); var property = lightmapSettings?.FindProperty("m_GISettings.m_EnableRealtimeLightmaps"); return property != null && property.boolValue; } public static void SetRealtimeGlobalIlluminationEnabled(bool enabled) { var lightmapSettings = GetLightmapSettings(); ChangeProperty(lightmapSettings, "m_GISettings.m_EnableRealtimeLightmaps", property => property.boolValue = enabled); } public static bool IsBakedGlobalIlluminationEnabled() { var lightmapSettings = GetLightmapSettings(); var property = lightmapSettings?.FindProperty("m_GISettings.m_EnableBakedLightmaps"); return property != null && property.boolValue; } public static void SetBakedGlobalIlluminationEnabled(bool enabled) { var lightmapSettings = GetLightmapSettings(); ChangeProperty(lightmapSettings, "m_GISettings.m_EnableBakedLightmaps", property => property.boolValue = enabled); } public static bool IsBuildTargetOpenVR() { return EditorUserBuildSettings.activeBuildTarget == BuildTarget.StandaloneWindows || EditorUserBuildSettings.activeBuildTarget == BuildTarget.StandaloneWindows64; } public static bool IsBuildTargetUWP() { return EditorUserBuildSettings.activeBuildTarget == BuildTarget.WSAPlayer; } public static bool IsBuildTargetAndroid() { return EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android; } public static bool IsBuildTargetIOS() { return EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS; } public static void ChangeProperty(SerializedObject target, string name, Action changer) { var prop = target.FindProperty(name); if (prop != null) { changer(prop); target.ApplyModifiedProperties(); } else Debug.LogError("property not found: " + name); } public static SerializedObject GetSettingsObject(string className) { var settings = Unsupported.GetSerializedAssetInterfaceSingleton(className); return new SerializedObject(settings); } public static SerializedObject GetLightmapSettings() { var getLightmapSettingsMethod = typeof(LightmapEditorSettings).GetMethod("GetLightmapSettings", BindingFlags.Static | BindingFlags.NonPublic); var lightmapSettings = getLightmapSettingsMethod.Invoke(null, null) as UnityEngine.Object; return new SerializedObject(lightmapSettings); } } }