namespace Syntriax.Engine.Core; public class DrawManager : UniverseObject { private static System.Comparison SortByPriority() => (x, y) => y.Priority.CompareTo(x.Priority); private readonly ActiveBehaviourCollectorSorted preDrawEntities = new() { SortBy = SortByPriority() }; private readonly ActiveBehaviourCollectorSorted drawEntities = new() { SortBy = SortByPriority() }; private readonly ActiveBehaviourCollectorSorted postDrawEntities = new() { SortBy = SortByPriority() }; private void OnPreDraw(IUniverse sender) { for (int i = preDrawEntities.Count - 1; i >= 0; i--) preDrawEntities[i].PreDraw(); } private void OnDraw(IUniverse sender) { for (int i = drawEntities.Count - 1; i >= 0; i--) drawEntities[i].Draw(); } private void OnPostDraw(IUniverse sender) { for (int i = postDrawEntities.Count - 1; i >= 0; i--) postDrawEntities[i].PostDraw(); } protected override void OnEnteringUniverse(IUniverse universe) { preDrawEntities.Assign(universe); drawEntities.Assign(universe); postDrawEntities.Assign(universe); universe.OnPreDraw += OnPreDraw; universe.OnDraw += OnDraw; universe.OnPostDraw += OnPostDraw; } protected override void OnExitingUniverse(IUniverse universe) { preDrawEntities.Unassign(); drawEntities.Unassign(); postDrawEntities.Unassign(); universe.OnPreDraw -= OnPreDraw; universe.OnDraw -= OnDraw; universe.OnPostDraw -= OnPostDraw; } }