You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
5.4 KiB
184 lines
5.4 KiB
#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 HashSet<int> m_ObjectUpdateQueueLookup = new HashSet<int>(); |
|
|
|
private readonly List<Object> m_ObjectReImportQueue = new List<Object>(); |
|
private HashSet<int> m_ObjectReImportQueueLookup = new HashSet<int>(); |
|
|
|
private readonly List<TMP_FontAsset> m_FontAssetDefinitionRefreshQueue = new List<TMP_FontAsset>(); |
|
private HashSet<int> m_FontAssetDefinitionRefreshQueueLookup = new HashSet<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; |
|
Canvas.willRenderCanvases += OnPreRenderCanvases; |
|
} |
|
|
|
void OnCameraPostRender(Camera cam) |
|
{ |
|
// Exclude the PreRenderCamera |
|
if (cam.cameraType != CameraType.SceneView) |
|
return; |
|
|
|
DoPostRenderUpdates(); |
|
} |
|
|
|
void OnPreRenderCanvases() |
|
{ |
|
DoPreRenderUpdates(); |
|
} |
|
|
|
/// <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.Contains(id)) |
|
return; |
|
|
|
m_ObjectReImportQueueLookup.Add(id); |
|
m_ObjectReImportQueue.Add(obj); |
|
} |
|
|
|
/// <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.Contains(id)) |
|
return; |
|
|
|
m_ObjectUpdateQueueLookup.Add(id); |
|
m_ObjectUpdateQueue.Add(obj); |
|
} |
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
/// <param name="fontAsset"></param> |
|
internal static void RegisterFontAssetForDefinitionRefresh(TMP_FontAsset fontAsset) |
|
{ |
|
instance.InternalRegisterFontAssetForDefinitionRefresh(fontAsset); |
|
} |
|
|
|
private void InternalRegisterFontAssetForDefinitionRefresh(TMP_FontAsset fontAsset) |
|
{ |
|
int id = fontAsset.GetInstanceID(); |
|
|
|
if (m_FontAssetDefinitionRefreshQueueLookup.Contains(id)) |
|
return; |
|
|
|
m_FontAssetDefinitionRefreshQueueLookup.Add(id); |
|
m_FontAssetDefinitionRefreshQueue.Add(fontAsset); |
|
} |
|
|
|
void DoPostRenderUpdates() |
|
{ |
|
// 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) |
|
{ |
|
AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(obj)); |
|
} |
|
} |
|
|
|
if (objReImportCount > 0) |
|
{ |
|
m_ObjectReImportQueue.Clear(); |
|
m_ObjectReImportQueueLookup.Clear(); |
|
} |
|
} |
|
|
|
void DoPreRenderUpdates() |
|
{ |
|
// Handle Font Asset Definition Refresh |
|
for (int i = 0; i < m_FontAssetDefinitionRefreshQueue.Count; i++) |
|
{ |
|
TMP_FontAsset fontAsset = m_FontAssetDefinitionRefreshQueue[i]; |
|
|
|
if (fontAsset != null) |
|
{ |
|
fontAsset.ReadFontAssetDefinition(); |
|
TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, fontAsset); |
|
} |
|
} |
|
|
|
if (m_FontAssetDefinitionRefreshQueue.Count > 0) |
|
{ |
|
m_FontAssetDefinitionRefreshQueue.Clear(); |
|
m_FontAssetDefinitionRefreshQueueLookup.Clear(); |
|
} |
|
} |
|
} |
|
} |
|
#endif
|
|
|