using System;
using System.Collections.Generic;
using Unity.Profiling;
namespace UnityEngine.U2D.IK
{
///
/// Class used for checking visibility of SpriteSkins' bones.
///
[ExecuteInEditMode]
internal class CullingManager : MonoBehaviour
{
static CullingManager s_Instance;
public static CullingManager instance
{
get
{
if (s_Instance == null)
{
var managers = FindObjectsByType(FindObjectsSortMode.None);
s_Instance = managers.Length > 0 ? managers[0] : CreateNewManager();
s_Instance.Initialize();
}
return s_Instance;
}
}
static CullingManager CreateNewManager()
{
var newGameObject = new GameObject("Culling Manager")
{
hideFlags = HideFlags.HideAndDontSave
};
#if !UNITY_EDITOR
GameObject.DontDestroyOnLoad(newGameObject);
#endif
var cullingManager = newGameObject.AddComponent();
return cullingManager;
}
ProfilerMarker m_ProfilerMarker = new($"{nameof(CullingManager)}.{nameof(OnUpdate)}");
Dictionary m_CullingStrategies;
void Initialize()
{
m_CullingStrategies = new Dictionary();
AddCullingStrategy(new AlwaysUpdateCullingStrategy());
AddCullingStrategy(new SpriteSkinVisibilityCullingStrategy());
}
void Update()
{
OnUpdate();
}
void OnUpdate()
{
m_ProfilerMarker.Begin();
if (m_CullingStrategies != null)
{
foreach (var cullingStrategy in m_CullingStrategies.Values)
{
if (cullingStrategy.enabled)
cullingStrategy.Update();
}
}
m_ProfilerMarker.End();
}
public void AddCullingStrategy(BaseCullingStrategy newCullingStrategy)
{
var strategyType = newCullingStrategy.GetType();
if (m_CullingStrategies.ContainsKey(strategyType))
return;
m_CullingStrategies[newCullingStrategy.GetType()] = newCullingStrategy;
}
public void RemoveCullingStrategy(BaseCullingStrategy strategyToRemove)
{
var strategyType = strategyToRemove.GetType();
if (!m_CullingStrategies.ContainsKey(strategyType))
return;
var cullingStrategy = m_CullingStrategies[strategyType];
if (cullingStrategy == strategyToRemove)
m_CullingStrategies.Remove(strategyType);
}
public T GetCullingStrategy() where T : BaseCullingStrategy
{
var requestedType = typeof(T);
if (!m_CullingStrategies.ContainsKey(requestedType))
return null;
return (T)m_CullingStrategies[requestedType];
}
}
}