using System.Collections.Generic; using Microsoft.Xna.Framework; using Syntriax.Engine.Core; namespace Syntriax.Engine.Integration.MonoGame; public class TriangleBatcher : BehaviourBase, ITriangleBatch, IFirstFrameUpdate, IDraw { private static Comparer SortByAscendingPriority() => Comparer.Create((x, y) => x.Priority.CompareTo(y.Priority)); private TriangleBatch triangleBatch = null!; private MonoGameCamera2DBehaviour camera2D = null!; private readonly ActiveBehaviourCollectorSorted drawableShapes = new() { SortBy = SortByAscendingPriority() }; public void FirstActiveFrame() { MonoGameWindowContainer windowContainer = BehaviourController.UniverseObject.Universe.FindRequiredBehaviour(); camera2D = BehaviourController.UniverseObject.Universe.FindRequiredBehaviour(); triangleBatch = new(windowContainer.Window.GraphicsDevice); drawableShapes.Unassign(); drawableShapes.Assign(BehaviourController.UniverseObject.Universe); } public void Draw() { triangleBatch.Begin(camera2D.MatrixTransform); for (int i = 0; i < drawableShapes.Count; i++) drawableShapes[i].Draw(triangleBatch); triangleBatch.End(); } public void Begin(Matrix? view = null, Matrix? projection = null) => triangleBatch.Begin(view, projection); public void Draw(Triangle triangle, ColorRGBA colorRGBA) => triangleBatch.Draw(triangle, colorRGBA); public void End() => triangleBatch.End(); }