#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