143 lines
3.8 KiB
C#
143 lines
3.8 KiB
C#
#if UNITY_EDITOR
|
|
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
|
|
namespace TMPro
|
|
{
|
|
public class TMP_EditorResourceManager
|
|
{
|
|
private static TMP_EditorResourceManager s_Instance;
|
|
|
|
private readonly List<Object> m_ObjectUpdateQueue = new List<Object>();
|
|
private Dictionary<int, int> m_ObjectUpdateQueueLookup = new Dictionary<int, int>();
|
|
|
|
private readonly List<Object> m_ObjectReImportQueue = new List<Object>();
|
|
private Dictionary<int, int> m_ObjectReImportQueueLookup = new Dictionary<int, int>();
|
|
|
|
/// <summary>
|
|
/// Get a singleton instance of the manager.
|
|
/// </summary>
|
|
public static TMP_EditorResourceManager instance
|
|
{
|
|
get
|
|
{
|
|
if (s_Instance == null)
|
|
s_Instance = new TMP_EditorResourceManager();
|
|
|
|
return s_Instance;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Register to receive rendering callbacks.
|
|
/// </summary>
|
|
private TMP_EditorResourceManager()
|
|
{
|
|
Camera.onPostRender += OnCameraPostRender;
|
|
}
|
|
|
|
|
|
void OnCameraPostRender(Camera cam)
|
|
{
|
|
// Exclude the PreRenderCamera
|
|
if (cam.cameraType == CameraType.Preview)
|
|
return;
|
|
|
|
DoUpdates();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Register resource for re-import.
|
|
/// </summary>
|
|
/// <param name="obj"></param>
|
|
internal static void RegisterResourceForReimport(Object obj)
|
|
{
|
|
instance.InternalRegisterResourceForReimport(obj);
|
|
}
|
|
|
|
private void InternalRegisterResourceForReimport(Object obj)
|
|
{
|
|
int id = obj.GetInstanceID();
|
|
|
|
if (m_ObjectReImportQueueLookup.ContainsKey(id))
|
|
return;
|
|
|
|
m_ObjectReImportQueueLookup[id] = id;
|
|
m_ObjectReImportQueue.Add(obj);
|
|
|
|
return;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Register resource to be updated.
|
|
/// </summary>
|
|
/// <param name="textObject"></param>
|
|
internal static void RegisterResourceForUpdate(Object obj)
|
|
{
|
|
instance.InternalRegisterResourceForUpdate(obj);
|
|
}
|
|
|
|
private void InternalRegisterResourceForUpdate(Object obj)
|
|
{
|
|
int id = obj.GetInstanceID();
|
|
|
|
if (m_ObjectUpdateQueueLookup.ContainsKey(id))
|
|
return;
|
|
|
|
m_ObjectUpdateQueueLookup[id] = id;
|
|
m_ObjectUpdateQueue.Add(obj);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
void DoUpdates()
|
|
{
|
|
// Handle objects that need updating
|
|
int objUpdateCount = m_ObjectUpdateQueue.Count;
|
|
|
|
for (int i = 0; i < objUpdateCount; i++)
|
|
{
|
|
Object obj = m_ObjectUpdateQueue[i];
|
|
if (obj != null)
|
|
{
|
|
EditorUtility.SetDirty(obj);
|
|
}
|
|
}
|
|
|
|
if (objUpdateCount > 0)
|
|
{
|
|
//Debug.Log("Saving assets");
|
|
//AssetDatabase.SaveAssets();
|
|
|
|
m_ObjectUpdateQueue.Clear();
|
|
m_ObjectUpdateQueueLookup.Clear();
|
|
}
|
|
|
|
// Handle objects that need re-importing
|
|
int objReImportCount = m_ObjectReImportQueue.Count;
|
|
|
|
for (int i = 0; i < objReImportCount; i++)
|
|
{
|
|
Object obj = m_ObjectReImportQueue[i];
|
|
if (obj != null)
|
|
{
|
|
//Debug.Log("Re-importing [" + obj.name + "]");
|
|
AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(obj));
|
|
}
|
|
}
|
|
|
|
if (objReImportCount > 0)
|
|
{
|
|
m_ObjectReImportQueue.Clear();
|
|
m_ObjectReImportQueueLookup.Clear();
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
#endif
|