using System.Collections.Generic; namespace Syntriax.Engine.Core; public class DrawManager : UniverseObject { private static Comparer SortByPriority() => Comparer.Create((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.AddListener(OnPreDraw); universe.OnDraw.AddListener(OnDraw); universe.OnPostDraw.AddListener(OnPostDraw); } protected override void OnExitingUniverse(IUniverse universe) { preDrawEntities.Unassign(); drawEntities.Unassign(); postDrawEntities.Unassign(); universe.OnPreDraw.RemoveListener(OnPreDraw); universe.OnDraw.RemoveListener(OnDraw); universe.OnPostDraw.RemoveListener(OnPostDraw); } }