using System;
using System.IO;
using System.Runtime.InteropServices;
using UnityEngine;
#if UNITY_XR_MANAGEMENT
using UnityEngine.XR.Management;
#endif
namespace Unity.XR.OpenVR
{
#if UNITY_XR_MANAGEMENT
[XRConfigurationData("OpenVR", "Unity.XR.OpenVR.Settings")]
#endif
[System.Serializable]
public class OpenVRSettings : ScriptableObject
{
public enum StereoRenderingModes
{
MultiPass = 0,
SinglePassInstanced
}
public enum InitializationTypes
{
Scene = 1,
Overlay = 2,
}
public enum MirrorViewModes
{
None = 0,
Left,
Right,
OpenVR,
}
[SerializeField, Tooltip("This will check the package version and the latest on github and prompt you to upgrade once per project load.")]
public bool PromptToUpgradePackage = true;
[SerializeField, Tooltip("This will check the package version and the latest on github and prompt you to upgrade once per project load.")]
public bool PromptToUpgradePreviewPackages = true;
[SerializeField, Tooltip("This allows developers to skip upgrade prompts for just this version.")]
public string SkipPromptForVersion = null;
[SerializeField, Tooltip("Set the Stereo Rendering Method")]
public StereoRenderingModes StereoRenderingMode = StereoRenderingModes.SinglePassInstanced;
[SerializeField, Tooltip("Most applications initialize as type Scene")]
public InitializationTypes InitializationType = InitializationTypes.Scene;
[SerializeField, Tooltip("A generated unique identifier for your application while in the editor")]
public string EditorAppKey = null;
[SerializeField, Tooltip("Internal value that tells the system what the relative path is to the manifest")]
public string ActionManifestFileRelativeFilePath;
[SerializeField, Tooltip("Which eye to use when rendering the headset view to the main window (none, left, right, or a composite of both + OpenVR overlays)")]
public MirrorViewModes MirrorView = MirrorViewModes.Right;
public const string StreamingAssetsFolderName = "SteamVR";
public const string ActionManifestFileName = "legacy_manifest.json";
public static string GetStreamingSteamVRPath(bool create = true)
{
string path = System.IO.Path.Combine(Application.streamingAssetsPath, StreamingAssetsFolderName);
if (create)
{
CreateDirectory(new DirectoryInfo(path));
}
return path;
}
private static void CreateDirectory(DirectoryInfo directory)
{
if (directory.Parent.Exists == false)
CreateDirectory(directory.Parent);
if (directory.Exists == false)
directory.Create();
}
[SerializeField, Tooltip("Internal value that tells the system if we have copied the default binding files yet.")]
public bool HasCopiedDefaults = false;
public ushort GetStereoRenderingMode()
{
return (ushort)StereoRenderingMode;
}
public ushort GetInitializationType()
{
return (ushort)InitializationType;
}
public MirrorViewModes GetMirrorViewMode()
{
return MirrorView;
}
///
/// Sets the mirror view mode (left, right, composite of both + openvr overlays) at runtime.
///
/// left, right, composite of both + openvr overlays
public void SetMirrorViewMode(MirrorViewModes newMode)
{
MirrorView = newMode;
SetMirrorViewMode((ushort)newMode);
}
public string GenerateEditorAppKey()
{
return string.Format("application.generated.unity.{0}.{1}.exe", CleanProductName(), ((int)(UnityEngine.Random.value * int.MaxValue)).ToString());
}
private static string CleanProductName()
{
string productName = Application.productName;
if (string.IsNullOrEmpty(productName))
productName = "unnamed_product";
else
{
productName = System.Text.RegularExpressions.Regex.Replace(Application.productName, "[^\\w\\._]", "");
productName = productName.ToLower();
}
return productName;
}
public static OpenVRSettings GetSettings(bool create = true)
{
OpenVRSettings settings = null;
#if UNITY_EDITOR
UnityEditor.EditorBuildSettings.TryGetConfigObject("Unity.XR.OpenVR.Settings", out settings);
#else
settings = OpenVRSettings.s_Settings;
#endif
if (settings == null && create)
settings = OpenVRSettings.CreateInstance();
return settings;
}
[DllImport("XRSDKOpenVR", CharSet = CharSet.Auto)]
public static extern void SetMirrorViewMode(ushort mirrorViewMode);
public bool InitializeActionManifestFileRelativeFilePath()
{
string oldPath = ActionManifestFileRelativeFilePath;
string newPath;
if (OpenVRHelpers.IsUsingSteamVRInput())
{
newPath = System.IO.Path.Combine(OpenVRSettings.GetStreamingSteamVRPath(false), OpenVRHelpers.GetActionManifestNameFromPlugin());
string fullpath = System.IO.Path.GetFullPath(".");
newPath = newPath.Remove(0, fullpath.Length + 1);
if (newPath.StartsWith("Assets"))
newPath = newPath.Remove(0, "Assets".Length + 1);
}
else
{
newPath = null;
}
#if UNITY_EDITOR
if (newPath != oldPath)
{
ActionManifestFileRelativeFilePath = newPath;
UnityEditor.EditorUtility.SetDirty(this);
UnityEditor.AssetDatabase.SaveAssets();
return true;
}
#endif
return false;
}
#if UNITY_EDITOR
public void Awake()
{
if (string.IsNullOrEmpty(this.EditorAppKey))
{
this.EditorAppKey = this.GenerateEditorAppKey();
}
this.InitializeActionManifestFileRelativeFilePath();
}
#else
public static OpenVRSettings s_Settings;
public void Awake()
{
s_Settings = this;
}
#endif
}
}