|
|
- /************************************************************************************
-
- Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
-
- Licensed under the Oculus SDK License Version 3.4.1 (the "License");
- you may not use the Oculus SDK except in compliance with the License,
- which is provided at the time of installation or download, or which
- otherwise accompanies this software in either electronic or hard copy form.
-
- You may obtain a copy of the License at
-
- https://developer.oculus.com/licenses/sdk-3.4.1
-
- Unless required by applicable law or agreed to in writing, the Oculus SDK
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
- ************************************************************************************/
-
- using UnityEngine;
- using UnityEditor;
- using UnityEditor.Callbacks;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text.RegularExpressions;
- using System.IO;
- using System.Diagnostics;
-
- [InitializeOnLoad]
- class ONSPAudioPluginUpdater
- {
- private static bool restartPending = false;
- private static bool unityRunningInBatchmode = false;
-
- private static System.Version invalidVersion = new System.Version("0.0.0");
-
- static ONSPAudioPluginUpdater()
- {
- EditorApplication.delayCall += OnDelayCall;
- }
-
- static void OnDelayCall()
- {
- if (System.Environment.CommandLine.Contains("-batchmode"))
- {
- unityRunningInBatchmode = true;
- }
-
- if (ShouldAttemptPluginUpdate())
- {
- AttemptSpatializerPluginUpdate(true);
- }
- }
-
- private static string GetCurrentProjectPath()
- {
- return Directory.GetParent(Application.dataPath).FullName;
- }
-
- private static string GetUtilitiesRootPath()
- {
- var so = ScriptableObject.CreateInstance(typeof(ONSPAudioPluginUpdaterStub));
- var script = MonoScript.FromScriptableObject(so);
- string assetPath = AssetDatabase.GetAssetPath(script);
- string editorDir = Directory.GetParent(assetPath).FullName;
- string ovrDir = Directory.GetParent(editorDir).FullName;
-
- return ovrDir;
- }
-
- public static string GetVersionDescription(System.Version version)
- {
- bool isVersionValid = (version != invalidVersion);
- return isVersionValid ? version.ToString() : "(Unknown)";
- }
-
- private static bool ShouldAttemptPluginUpdate()
- {
- if (unityRunningInBatchmode)
- {
- return false;
- }
- else
- {
- return (autoUpdateEnabled && !restartPending && !Application.isPlaying);
- }
- }
-
- private static readonly string autoUpdateEnabledKey = "Oculus_Utilities_ONSPAudioPluginUpdater_AutoUpdate_" + 1.0;//PASOVRManager.utilitiesVersion;
- private static bool autoUpdateEnabled
- {
- get
- {
- return PlayerPrefs.GetInt(autoUpdateEnabledKey, 1) == 1;
- }
-
- set
- {
- PlayerPrefs.SetInt(autoUpdateEnabledKey, value ? 1 : 0);
- }
- }
-
- [MenuItem("Oculus/Tools/Update Spatializer Plugin")]
- private static void RunSpatializerPluginUpdate()
- {
- autoUpdateEnabled = true;
- AttemptSpatializerPluginUpdate(false);
- }
-
- // Separate entry point needed since "-executeMethod" does not support parameters or default parameter values
- private static void BatchmodePluginUpdate()
- {
- OnDelayCall(); // manually invoke when running editor in batchmode
- AttemptSpatializerPluginUpdate(false);
- }
-
- private static string GetSpatializerPluginsRootPath()
- {
- string ovrPath = GetUtilitiesRootPath();
- string spatializerPluginsPath = Path.GetFullPath(Path.Combine(ovrPath, "../Spatializer/Plugins"));
- return spatializerPluginsPath;
- }
-
- private static bool RenameSpatializerPluginToOld(string currentPluginPath)
- {
- if (File.Exists(currentPluginPath))
- {
- int index = 0;
- string targetPluginPath;
- string targetPluginMetaPath;
- for (; ; )
- {
- targetPluginPath = currentPluginPath + ".old" + index.ToString();
- targetPluginMetaPath = targetPluginPath + ".meta";
- if (!File.Exists(targetPluginPath) && !File.Exists(targetPluginPath))
- break;
- ++index;
- }
- try
- {
- File.Move(currentPluginPath, targetPluginPath);
- File.Move(currentPluginPath + ".meta", targetPluginMetaPath);
- UnityEngine.Debug.LogFormat("Spatializer plugin renamed: {0} to {1}", currentPluginPath, targetPluginPath);
- return true;
- }
- catch (Exception e)
- {
- UnityEngine.Debug.LogWarningFormat("Unable to rename spatializer plugin: {0}, exception {1}", currentPluginPath, e.Message);
- return false;
- }
- }
- return false;
- }
-
- private static void AttemptSpatializerPluginUpdate(bool triggeredByAutoUpdate)
- {
- // We use a simplified path to update spatializer plugins:
- // If there is a new AudioPluginOculusSpatializer.dll.new, we'll rename the original one to .old, and the new one to .dll, and restart the editor
-
- string pluginsPath = GetSpatializerPluginsRootPath();
- string newX86PluginPath = Path.GetFullPath(Path.Combine(pluginsPath, "x86/AudioPluginOculusSpatializer.dll.new"));
- string newX64PluginPath = Path.GetFullPath(Path.Combine(pluginsPath, "x86_64/AudioPluginOculusSpatializer.dll.new"));
- if (File.Exists(newX86PluginPath) || File.Exists(newX64PluginPath))
- {
- bool userAcceptsUpdate = false;
-
- if (unityRunningInBatchmode)
- {
- userAcceptsUpdate = true;
- }
- else
- {
- int dialogResult = EditorUtility.DisplayDialogComplex("Update Spatializer Plugins",
- "New spatializer plugin found. Do you want to upgrade? If you choose 'Upgrade', the old plugin will be renamed to AudioPluginOculusSpatializer.old",
- "Upgrade", "Don't upgrade", "Delete new plugin");
- if (dialogResult == 0)
- {
- userAcceptsUpdate = true;
- }
- else if (dialogResult == 1)
- {
- // do nothing
- }
- else if (dialogResult == 2)
- {
- try
- {
- File.Delete(newX86PluginPath);
- File.Delete(newX86PluginPath + ".meta");
- File.Delete(newX64PluginPath);
- File.Delete(newX64PluginPath + ".meta");
- }
- catch (Exception e)
- {
- UnityEngine.Debug.LogWarning("Exception happened when deleting new spatializer plugin: " + e.Message);
- }
- }
- }
-
- if (userAcceptsUpdate)
- {
- bool upgradeDone = false;
- string curX86PluginPath = Path.Combine(pluginsPath, "x86/AudioPluginOculusSpatializer.dll");
- if (File.Exists(newX86PluginPath))
- {
- RenameSpatializerPluginToOld(curX86PluginPath);
- try
- {
- File.Move(newX86PluginPath, curX86PluginPath);
- File.Move(newX86PluginPath + ".meta", curX86PluginPath + ".meta");
-
- // fix the platform
- string curX86PluginPathRel = "Assets/Oculus/Spatializer/Plugins/x86/AudioPluginOculusSpatializer.dll";
- UnityEngine.Debug.Log("path = " + curX86PluginPathRel);
- AssetDatabase.ImportAsset(curX86PluginPathRel, ImportAssetOptions.ForceUpdate);
- PluginImporter pi = PluginImporter.GetAtPath(curX86PluginPathRel) as PluginImporter;
- pi.SetCompatibleWithEditor(false);
- pi.SetCompatibleWithAnyPlatform(false);
- pi.SetCompatibleWithPlatform(BuildTarget.Android, false);
- pi.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows64, false);
- #if UNITY_2017_3_OR_NEWER
- pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSX, false);
- #else
- pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXUniversal, false);
- pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXIntel, false);
- pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXIntel64, false);
- #endif
- pi.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows, true);
- pi.SetCompatibleWithEditor(true);
- pi.SetEditorData("CPU", "X86");
- pi.SetEditorData("OS", "Windows");
- pi.SetPlatformData("Editor", "CPU", "X86");
- pi.SetPlatformData("Editor", "OS", "Windows");
-
- AssetDatabase.ImportAsset(curX86PluginPathRel, ImportAssetOptions.ForceUpdate);
- AssetDatabase.Refresh();
- AssetDatabase.SaveAssets();
-
- upgradeDone = true;
- }
- catch (Exception e)
- {
- UnityEngine.Debug.LogWarning("Unable to rename the new spatializer plugin: " + e.Message);
- }
- }
- string curX64PluginPath = Path.Combine(pluginsPath, "x86_64/AudioPluginOculusSpatializer.dll");
- if (File.Exists(newX64PluginPath))
- {
- RenameSpatializerPluginToOld(curX64PluginPath);
- try
- {
- File.Move(newX64PluginPath, curX64PluginPath);
- File.Move(newX64PluginPath + ".meta", curX64PluginPath + ".meta");
-
- // fix the platform
- string curX64PluginPathRel = "Assets/Oculus/Spatializer/Plugins/x86_64/AudioPluginOculusSpatializer.dll";
- UnityEngine.Debug.Log("path = " + curX64PluginPathRel);
- AssetDatabase.ImportAsset(curX64PluginPathRel, ImportAssetOptions.ForceUpdate);
- PluginImporter pi = PluginImporter.GetAtPath(curX64PluginPathRel) as PluginImporter;
- pi.SetCompatibleWithEditor(false);
- pi.SetCompatibleWithAnyPlatform(false);
- pi.SetCompatibleWithPlatform(BuildTarget.Android, false);
- pi.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows, false);
- #if UNITY_2017_3_OR_NEWER
- pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSX, false);
- #else
- pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXUniversal, false);
- pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXIntel, false);
- pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXIntel64, false);
- #endif
- pi.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows64, true);
- pi.SetCompatibleWithEditor(true);
- pi.SetEditorData("CPU", "X86_64");
- pi.SetEditorData("OS", "Windows");
- pi.SetPlatformData("Editor", "CPU", "X86_64");
- pi.SetPlatformData("Editor", "OS", "Windows");
-
- AssetDatabase.ImportAsset(curX64PluginPathRel, ImportAssetOptions.ForceUpdate);
- AssetDatabase.Refresh();
- AssetDatabase.SaveAssets();
-
- upgradeDone = true;
- }
- catch (Exception e)
- {
- UnityEngine.Debug.LogWarning("Unable to rename the new spatializer plugin: " + e.Message);
- }
- }
-
- if (upgradeDone)
- {
- if (unityRunningInBatchmode
- || EditorUtility.DisplayDialog("Restart Unity",
- "Spatializer plugins has been upgraded."
- + "\n\nPlease restart the Unity Editor to complete the update process."
- #if !UNITY_2017_1_OR_NEWER
- + " You may need to manually relaunch Unity if you are using Unity 5.6 and higher."
- #endif
- ,
- "Restart",
- "Not Now"))
- {
- RestartUnityEditor();
- }
- }
- }
- }
- else
- {
- UnityEngine.Debug.Log("No new spatializer plugin(s) found");
- }
- }
-
- private static void RestartUnityEditor()
- {
- if (unityRunningInBatchmode)
- {
- EditorApplication.Exit(0);
- }
- else
- {
- restartPending = true;
- EditorApplication.OpenProject(GetCurrentProjectPath());
- }
- }
- }
|