55 lines
1.9 KiB
C#
55 lines
1.9 KiB
C#
using System.Collections.Generic;
|
|
|
|
namespace Engine.Core;
|
|
|
|
public class DrawManager : Behaviour
|
|
{
|
|
// We use Descending order because draw calls are running from last to first
|
|
private static Comparer<int> SortByDescendingPriority() => Comparer<int>.Create((x, y) => y.CompareTo(x));
|
|
private static System.Func<IBehaviour, int> GetPriority() => (b) => b.Priority;
|
|
|
|
private readonly ActiveBehaviourCollectorOrdered<int, IPreDraw> preDrawEntities = new(GetPriority(), SortByDescendingPriority());
|
|
private readonly ActiveBehaviourCollectorOrdered<int, IDraw> drawEntities = new(GetPriority(), SortByDescendingPriority());
|
|
private readonly ActiveBehaviourCollectorOrdered<int, IPostDraw> postDrawEntities = new(GetPriority(), SortByDescendingPriority());
|
|
|
|
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 OnEnteredUniverse(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 OnExitedUniverse(IUniverse universe)
|
|
{
|
|
preDrawEntities.Unassign();
|
|
drawEntities.Unassign();
|
|
postDrawEntities.Unassign();
|
|
|
|
universe.OnPreDraw.RemoveListener(OnPreDraw);
|
|
universe.OnDraw.RemoveListener(OnDraw);
|
|
universe.OnPostDraw.RemoveListener(OnPostDraw);
|
|
}
|
|
}
|