53 lines
1.8 KiB
C#

using System.Collections.Generic;
namespace Syntriax.Engine.Core;
public class DrawManager : UniverseObject
{
private static Comparer<IBehaviour> SortByAscendingPriority() => Comparer<IBehaviour>.Create((x, y) => x.Priority.CompareTo(y.Priority));
private readonly ActiveBehaviourCollectorSorted<IPreDraw> preDrawEntities = new() { SortBy = SortByAscendingPriority() };
private readonly ActiveBehaviourCollectorSorted<IDraw> drawEntities = new() { SortBy = SortByAscendingPriority() };
private readonly ActiveBehaviourCollectorSorted<IPostDraw> postDrawEntities = new() { SortBy = SortByAscendingPriority() };
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);
}
}