Files
DeltaVR/Assets/Plugins/FMOD/src/Editor/BankRefresher.cs

168 lines
5.0 KiB
C#

using System;
using System.IO;
using UnityEditor;
using UnityEngine;
namespace FMODUnity
{
public class BankRefresher
{
private static string currentWatchPath;
private static FileSystemWatcher sourceFileWatcher;
private static bool sourceFilesChanged = false;
private static float lastSourceFileChange = float.MaxValue;
private static bool autoRefresh = true;
private static float nextFilePollTime = float.MinValue;
private const int FilePollPeriod = 5;
public static void DisableAutoRefresh()
{
autoRefresh = false;
}
public static void Startup()
{
sourceFileWatcher = new FileSystemWatcher();
sourceFileWatcher.IncludeSubdirectories = true;
sourceFileWatcher.NotifyFilter = NotifyFilters.LastWrite;
sourceFileWatcher.Changed += OnSourceFileChanged;
sourceFileWatcher.Created += OnSourceFileChanged;
sourceFileWatcher.Deleted += OnSourceFileChanged;
EditorApplication.update += Update;
}
private static void OnSourceFileChanged(object source, FileSystemEventArgs e)
{
sourceFilesChanged = true;
}
private static void Update()
{
UpdateFileWatcherPath();
CheckSourceFilesChanged();
CheckCacheFileExists();
RefreshBanksIfReady();
}
private static void UpdateFileWatcherPath()
{
string sourceBankPath = Settings.Instance.SourceBankPath;
string pathToWatch;
if (Path.IsPathRooted(sourceBankPath))
{
pathToWatch = Path.GetFullPath(sourceBankPath);
}
else
{
pathToWatch = Path.GetFullPath(Environment.CurrentDirectory + "/" + sourceBankPath);
}
if (currentWatchPath != pathToWatch)
{
currentWatchPath = pathToWatch;
try {
sourceFileWatcher.EnableRaisingEvents = false;
sourceFilesChanged = false;
if (!string.IsNullOrEmpty(sourceBankPath))
{
sourceFileWatcher.Path = pathToWatch;
sourceFileWatcher.EnableRaisingEvents = true;
}
}
catch (ArgumentException e)
{
RuntimeUtils.DebugLogWarningFormat("Error watching {0}: {1}", pathToWatch, e.Message);
}
}
}
private static void CheckSourceFilesChanged()
{
if (sourceFilesChanged)
{
lastSourceFileChange = Time.realtimeSinceStartup;
sourceFilesChanged = false;
if (!BankRefreshWindow.IsVisible)
{
autoRefresh = true;
}
if (IsWindowEnabled())
{
BankRefreshWindow.ShowWindow();
}
}
}
private static void CheckCacheFileExists()
{
if (Time.realtimeSinceStartup >= nextFilePollTime)
{
if (!File.Exists(EventManager.CacheAssetFullName))
{
EventManager.RefreshBanks();
}
nextFilePollTime = Time.realtimeSinceStartup + FilePollPeriod;
}
}
private static void RefreshBanksIfReady()
{
if (TimeUntilBankRefresh() == 0 && BankRefreshWindow.ReadyToRefreshBanks)
{
EventManager.RefreshBanks();
}
}
public static void HandleBankRefresh(string result)
{
lastSourceFileChange = float.MaxValue;
BankRefreshWindow.HandleBankRefresh(result);
}
private static bool IsWindowEnabled()
{
Settings settings = Settings.Instance;
return settings.BankRefreshCooldown == Settings.BankRefreshPrompt
|| (settings.BankRefreshCooldown >= 0 && settings.ShowBankRefreshWindow);
}
public static float TimeSinceSourceFileChange()
{
if (lastSourceFileChange == float.MaxValue)
{
return float.MaxValue;
}
else
{
return Mathf.Max(0, Time.realtimeSinceStartup - lastSourceFileChange);
}
}
public static float TimeUntilBankRefresh()
{
if (!autoRefresh
|| lastSourceFileChange == float.MaxValue
|| Settings.Instance.BankRefreshCooldown < 0)
{
return float.MaxValue;
}
else
{
float nextRefreshTime = lastSourceFileChange + Settings.Instance.BankRefreshCooldown;
return Mathf.Max(0, nextRefreshTime - Time.realtimeSinceStartup);
}
}
}
}