Files
Bachelor-Arbeit-Thomas-Wichert/Assets/Oculus/VR/Editor/OVRPluginInfoOpenXR.cs
2025-07-21 09:11:14 +02:00

133 lines
4.4 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.
*/
#if OVR_UNITY_PACKAGE_MANAGER
using System;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using UnityEditor;
using UnityEngine;
namespace Oculus.VR.Editor
{
[InitializeOnLoad]
public class OVRPluginInfoOpenXR : IOVRPluginInfoSupplier
{
private const string PackageName = "com.meta.xr.sdk.utilities";
private static readonly string PluginsRelPath =
Path.Combine("Packages", PackageName, "Plugins");
private static readonly string PluginRelPathWin64 =
Path.Combine(PluginsRelPath, "Win64OpenXR", "OVRPlugin.dll");
private static readonly string PluginRelPathAndroid =
Path.Combine(PluginsRelPath, "AndroidOpenXR", "OVRPlugin.aar");
private static bool _unityRunningInBatchMode;
private static bool _restartPending;
public bool IsOVRPluginOpenXRActivated() => true;
public bool IsOVRPluginUnityProvidedActivated() => false;
static OVRPluginInfoOpenXR()
{
EditorApplication.delayCall += DelayCall;
}
private static void DelayCall()
{
if (Environment.CommandLine.Contains("-batchmode"))
{
_unityRunningInBatchMode = true;
}
if (_restartPending)
{
return;
}
CheckHasPluginChanged();
}
private static void CheckHasPluginChanged()
{
var projectConfig = OVRProjectConfig.GetProjectConfig();
string md5Win64Actual = GetFileChecksum(Path.GetFullPath(PluginRelPathWin64));
string md5AndroidActual = GetFileChecksum(Path.GetFullPath(PluginRelPathAndroid));
if (projectConfig.ovrPluginMd5Win64 == md5Win64Actual &&
projectConfig.ovrPluginMd5Android == md5AndroidActual)
{
return;
}
bool userAgreedToRestart = EditorUtility.DisplayDialog(
"Restart Unity",
"Changes to OVRPlugin detected. Plugin updates require a restart. Please restart Unity to complete the update.",
"Restart Editor",
"Not Now");
projectConfig.ovrPluginMd5Win64 = md5Win64Actual;
projectConfig.ovrPluginMd5Android = md5AndroidActual;
OVRProjectConfig.CommitProjectConfig(projectConfig);
if (userAgreedToRestart)
{
RestartUnityEditor();
}
else
{
Debug.LogWarning("OVRPlugin not updated. Restart the editor to update.");
}
}
private static string GetFileChecksum(string filePath)
{
using var md5 = new MD5CryptoServiceProvider();
byte[] buffer = md5.ComputeHash(File.ReadAllBytes(filePath));
return string.Join(null, buffer.Select(b => b.ToString("x2")));
}
private static void RestartUnityEditor()
{
if (_unityRunningInBatchMode)
{
Debug.LogWarning("Restarting editor is not supported in batch mode");
return;
}
_restartPending = true;
EditorApplication.OpenProject(GetCurrentProjectPath());
}
private static string GetCurrentProjectPath()
{
DirectoryInfo projectPath = Directory.GetParent(Application.dataPath);
if (projectPath == null)
{
throw new DirectoryNotFoundException("Unable to find project path.");
}
return projectPath.FullName;
}
}
}
#endif