forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			325 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			325 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 | 
						|
 * All rights reserved.
 | 
						|
 *
 | 
						|
 * Licensed under the Oculus SDK License Agreement (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/oculussdk/
 | 
						|
 *
 | 
						|
 * 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();
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    private static void RestartUnityEditor()
 | 
						|
    {
 | 
						|
        if (unityRunningInBatchmode)
 | 
						|
        {
 | 
						|
            EditorApplication.Exit(0);
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            restartPending = true;
 | 
						|
            EditorApplication.OpenProject(GetCurrentProjectPath());
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |