188 lines
7.1 KiB
C#
188 lines
7.1 KiB
C#
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
using Microsoft.MixedReality.OpenXR.Editor;
|
|
using Microsoft.MixedReality.OpenXR.Remoting;
|
|
using System;
|
|
using System.IO;
|
|
using UnityEditor;
|
|
using UnityEditor.XR.OpenXR.Features;
|
|
using UnityEngine;
|
|
using UnityEngine.XR.OpenXR.Features.Interactions;
|
|
|
|
namespace Microsoft.MixedReality.OpenXR
|
|
{
|
|
internal enum ValidationRuleset {
|
|
None,
|
|
Win32Standalone,
|
|
HoloLens2,
|
|
Win32AppRemoting,
|
|
UWPAppRemoting
|
|
}
|
|
|
|
internal static class ValidationRulesetExtensions
|
|
{
|
|
// Example usage: $"This validation is for building {scenario name} apps"
|
|
internal static string GetScenarioName(this ValidationRuleset validationRuleset)
|
|
{
|
|
switch(validationRuleset)
|
|
{
|
|
case ValidationRuleset.Win32Standalone: return "Standalone Win32 XR";
|
|
case ValidationRuleset.HoloLens2: return "HoloLens 2";
|
|
case ValidationRuleset.Win32AppRemoting: return "Holographic Remoting Win32 Remote";
|
|
case ValidationRuleset.UWPAppRemoting: return "Holographic Remoting UWP Remote";
|
|
}
|
|
Debug.LogError($"ScenarioName of ValidationRuleset \"{validationRuleset}\" is not defined.");
|
|
return "";
|
|
}
|
|
|
|
// Example usage: $"loader must be enabled for {platformShortName}"
|
|
internal static string GetPlatformShortName(this ValidationRuleset validationRuleset)
|
|
{
|
|
switch(validationRuleset)
|
|
{
|
|
case ValidationRuleset.Win32Standalone: return "Standalone";
|
|
case ValidationRuleset.HoloLens2: return "UWP";
|
|
case ValidationRuleset.Win32AppRemoting: return "Standalone";
|
|
case ValidationRuleset.UWPAppRemoting: return "UWP";
|
|
}
|
|
Debug.LogError($"PlatformShortName of ValidationRuleset \"{validationRuleset}\" is not defined.");
|
|
return "";
|
|
}
|
|
|
|
internal static BuildTargetGroup GetBuildTargetGroup(this ValidationRuleset validationRuleset)
|
|
{
|
|
switch(validationRuleset)
|
|
{
|
|
case ValidationRuleset.Win32Standalone: return BuildTargetGroup.Standalone;
|
|
case ValidationRuleset.HoloLens2: return BuildTargetGroup.WSA;
|
|
case ValidationRuleset.Win32AppRemoting: return BuildTargetGroup.Standalone;
|
|
case ValidationRuleset.UWPAppRemoting: return BuildTargetGroup.WSA;
|
|
}
|
|
Debug.LogError($"BuildTargetGroup of ValidationRuleset \"{validationRuleset}\" is not defined.");
|
|
return BuildTargetGroup.Unknown;
|
|
}
|
|
|
|
internal static BuildTarget GetBuildTarget(this ValidationRuleset validationRuleset)
|
|
{
|
|
switch(validationRuleset)
|
|
{
|
|
case ValidationRuleset.Win32Standalone: return BuildTarget.StandaloneWindows64;
|
|
case ValidationRuleset.HoloLens2: return BuildTarget.WSAPlayer;
|
|
case ValidationRuleset.Win32AppRemoting: return BuildTarget.StandaloneWindows64;
|
|
case ValidationRuleset.UWPAppRemoting: return BuildTarget.WSAPlayer;
|
|
}
|
|
Debug.LogError($"BuildTarget of ValidationRuleset \"{validationRuleset}\" is not defined.");
|
|
return BuildTarget.StandaloneWindows64;
|
|
}
|
|
|
|
internal static bool GetRemotingEnabled(this ValidationRuleset validationRuleset)
|
|
{
|
|
switch (validationRuleset)
|
|
{
|
|
case ValidationRuleset.Win32Standalone: return false;
|
|
case ValidationRuleset.HoloLens2: return false;
|
|
case ValidationRuleset.Win32AppRemoting: return true;
|
|
case ValidationRuleset.UWPAppRemoting: return true;
|
|
}
|
|
Debug.LogError($"RemotingEnabled of ValidationRuleset \"{validationRuleset}\" is not defined.");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
internal static class ValidationSettings
|
|
{
|
|
private const string SettingsFileName = "MixedRealityOpenXRValidationSettings.asset";
|
|
private static string XRSettingsFolder => Path.Combine(Application.dataPath, "..", "ProjectSettings");
|
|
private static string SettingsAssetPath => Path.Combine(XRSettingsFolder, SettingsFileName);
|
|
|
|
private class SerializableSettings : ScriptableObject {
|
|
[field: SerializeField]
|
|
internal ValidationRuleset Ruleset { get; set; } = ValidationRuleset.None;
|
|
}
|
|
|
|
private static SerializableSettings settingsInstance;
|
|
|
|
private static SerializableSettings CurrentSettings
|
|
{
|
|
get
|
|
{
|
|
if (settingsInstance == null)
|
|
{
|
|
LoadSettings();
|
|
}
|
|
return settingsInstance;
|
|
}
|
|
}
|
|
|
|
internal static ValidationRuleset CurrentRuleset
|
|
{
|
|
get => CurrentSettings.Ruleset;
|
|
set
|
|
{
|
|
if(CurrentSettings.Ruleset != value)
|
|
{
|
|
CurrentSettings.Ruleset = value;
|
|
SaveSettings();
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void LoadSettings()
|
|
{
|
|
settingsInstance = ScriptableObject.CreateInstance<SerializableSettings>();
|
|
|
|
if (File.Exists(SettingsAssetPath))
|
|
{
|
|
using (StreamReader settingsReader = new StreamReader(SettingsAssetPath))
|
|
{
|
|
JsonUtility.FromJsonOverwrite(settingsReader.ReadToEnd(), settingsInstance);
|
|
}
|
|
}
|
|
|
|
// If this file doesn't yet exist, port the old value from MixedRealityFeaturePlugin.
|
|
else
|
|
{
|
|
MixedRealityFeaturePlugin plugin = BuildProcessorHelpers.GetOpenXRFeature<MixedRealityFeaturePlugin>(BuildTargetGroup.WSA, false);
|
|
if (plugin == null)
|
|
{
|
|
FeatureHelpers.RefreshFeatures(BuildTargetGroup.WSA);
|
|
plugin = BuildProcessorHelpers.GetOpenXRFeature<MixedRealityFeaturePlugin>(BuildTargetGroup.WSA, false);
|
|
}
|
|
|
|
if (plugin != null && plugin.validationRuleTarget == MixedRealityFeaturePlugin.ValidationRuleTargetPlatform.HoloLens2)
|
|
{
|
|
settingsInstance.Ruleset = ValidationRuleset.HoloLens2;
|
|
}
|
|
else
|
|
{
|
|
settingsInstance.Ruleset = ValidationRuleset.None;
|
|
}
|
|
SaveSettings();
|
|
}
|
|
}
|
|
|
|
private static void SaveSettings()
|
|
{
|
|
if (settingsInstance == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!Directory.Exists(XRSettingsFolder))
|
|
{
|
|
Directory.CreateDirectory(XRSettingsFolder);
|
|
}
|
|
|
|
using (StreamWriter settingsWriter = new StreamWriter(SettingsAssetPath))
|
|
{
|
|
settingsWriter.Write(JsonUtility.ToJson(settingsInstance, true));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif // UNITY_EDITOR |