using System.Collections.Generic; using Engine.Core; namespace Engine.Systems.Graphics; public class TriangleBatcher : Behaviour, IFirstFrameUpdate, ILastFrameUpdate, IDraw { private static Comparer SortByAscendingPriority() => Comparer.Create((x, y) => x.CompareTo(y)); private static System.Func GetPriority() => (b) => b.Priority; private readonly BehaviourCollector triangleBatches = new(); private readonly ActiveBehaviourCollectorOrdered drawableShapes = new(GetPriority(), SortByAscendingPriority()); public void FirstActiveFrame() { drawableShapes.Assign(Universe); triangleBatches.Assign(Universe); } public void Draw() { for (int i = 0; i < triangleBatches.Count; i++) { ITriangleBatch triangleBatch = triangleBatches[i]; triangleBatch.Begin(); for (int j = 0; j < drawableShapes.Count; j++) drawableShapes[j].Draw(triangleBatch); triangleBatch.End(); } } public void LastActiveFrame() { triangleBatches.Unassign(); drawableShapes.Unassign(); } }