using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UI.Collections;
using System.Collections;
using System.Collections.Generic;
namespace TMPro
{
///
/// Class for handling and scheduling text object updates.
///
public class TMP_UpdateRegistry
{
private static TMP_UpdateRegistry s_Instance;
private readonly List m_LayoutRebuildQueue = new List();
private HashSet m_LayoutQueueLookup = new HashSet();
private readonly List m_GraphicRebuildQueue = new List();
private HashSet m_GraphicQueueLookup = new HashSet();
//private bool m_PerformingLayoutUpdate;
//private bool m_PerformingGraphicUpdate;
///
/// Get a singleton instance of the registry
///
public static TMP_UpdateRegistry instance
{
get
{
if (TMP_UpdateRegistry.s_Instance == null)
TMP_UpdateRegistry.s_Instance = new TMP_UpdateRegistry();
return TMP_UpdateRegistry.s_Instance;
}
}
///
/// Register to receive callback from the Canvas System.
///
protected TMP_UpdateRegistry()
{
//Debug.Log("Adding WillRenderCanvases");
Canvas.willRenderCanvases += PerformUpdateForCanvasRendererObjects;
}
///
/// Function to register elements which require a layout rebuild.
///
///
public static void RegisterCanvasElementForLayoutRebuild(ICanvasElement element)
{
TMP_UpdateRegistry.instance.InternalRegisterCanvasElementForLayoutRebuild(element);
}
private bool InternalRegisterCanvasElementForLayoutRebuild(ICanvasElement element)
{
int id = (element as Object).GetInstanceID();
if (m_LayoutQueueLookup.Contains(id))
return false;
m_LayoutQueueLookup.Add(id);
m_LayoutRebuildQueue.Add(element);
return true;
}
///
/// Function to register elements which require a graphic rebuild.
///
///
public static void RegisterCanvasElementForGraphicRebuild(ICanvasElement element)
{
TMP_UpdateRegistry.instance.InternalRegisterCanvasElementForGraphicRebuild(element);
}
private bool InternalRegisterCanvasElementForGraphicRebuild(ICanvasElement element)
{
int id = (element as Object).GetInstanceID();
if (m_GraphicQueueLookup.Contains(id))
return false;
m_GraphicQueueLookup.Add(id);
m_GraphicRebuildQueue.Add(element);
return true;
}
///
/// Method to handle objects that need updating.
///
private void PerformUpdateForCanvasRendererObjects()
{
//Debug.Log("Performing update of CanvasRenderer objects at Frame: " + Time.frameCount);
// Processing elements that require a layout rebuild.
//this.m_PerformingLayoutUpdate = true;
for (int index = 0; index < m_LayoutRebuildQueue.Count; index++)
{
ICanvasElement element = TMP_UpdateRegistry.instance.m_LayoutRebuildQueue[index];
element.Rebuild(CanvasUpdate.Prelayout);
}
if (m_LayoutRebuildQueue.Count > 0)
{
m_LayoutRebuildQueue.Clear();
m_LayoutQueueLookup.Clear();
}
// Update font assets before graphic rebuild
// Processing elements that require a graphic rebuild.
for (int index = 0; index < m_GraphicRebuildQueue.Count; index++)
{
ICanvasElement element = TMP_UpdateRegistry.instance.m_GraphicRebuildQueue[index];
element.Rebuild(CanvasUpdate.PreRender);
}
// If there are no objects in the queue, we don't need to clear the lists again.
if (m_GraphicRebuildQueue.Count > 0)
{
m_GraphicRebuildQueue.Clear();
m_GraphicQueueLookup.Clear();
}
}
///
/// Method to handle objects that need updating.
///
private void PerformUpdateForMeshRendererObjects()
{
Debug.Log("Perform update of MeshRenderer objects.");
}
///
/// Function to unregister elements which no longer require a rebuild.
///
///
public static void UnRegisterCanvasElementForRebuild(ICanvasElement element)
{
TMP_UpdateRegistry.instance.InternalUnRegisterCanvasElementForLayoutRebuild(element);
TMP_UpdateRegistry.instance.InternalUnRegisterCanvasElementForGraphicRebuild(element);
}
private void InternalUnRegisterCanvasElementForLayoutRebuild(ICanvasElement element)
{
int id = (element as Object).GetInstanceID();
//element.LayoutComplete();
TMP_UpdateRegistry.instance.m_LayoutRebuildQueue.Remove(element);
m_GraphicQueueLookup.Remove(id);
}
private void InternalUnRegisterCanvasElementForGraphicRebuild(ICanvasElement element)
{
int id = (element as Object).GetInstanceID();
//element.GraphicUpdateComplete();
TMP_UpdateRegistry.instance.m_GraphicRebuildQueue.Remove(element);
m_LayoutQueueLookup.Remove(id);
}
}
}