Original Behaviour was using old methods for detecting entering/exiting universe, they are now all under the same hood and the original is kept for UniverseEntranceManager because it needs to enter the universe without itself. The internal behaviour kept under a subnamespace of "Core.Internal" for the purpose that it might come in handy for other use cases.
41 lines
1.6 KiB
C#
41 lines
1.6 KiB
C#
using System.Collections.Generic;
|
|
|
|
using Microsoft.Xna.Framework;
|
|
|
|
using Engine.Core;
|
|
|
|
namespace Engine.Integration.MonoGame;
|
|
|
|
public class TriangleBatcher : Behaviour, ITriangleBatch, IFirstFrameUpdate, IDraw
|
|
{
|
|
private static Comparer<int> SortByAscendingPriority() => Comparer<int>.Create((x, y) => x.CompareTo(y));
|
|
private static System.Func<IBehaviour, int> GetPriority() => (b) => b.Priority;
|
|
|
|
private TriangleBatch triangleBatch = null!;
|
|
private MonoGameCamera2D camera2D = null!;
|
|
|
|
private readonly ActiveBehaviourCollectorOrdered<int, IDrawableTriangle> drawableShapes = new(GetPriority(), SortByAscendingPriority());
|
|
|
|
public void FirstActiveFrame()
|
|
{
|
|
MonoGameWindowContainer windowContainer = BehaviourController.UniverseObject.Universe.FindRequiredBehaviour<MonoGameWindowContainer>();
|
|
camera2D = BehaviourController.UniverseObject.Universe.FindRequiredBehaviour<MonoGameCamera2D>();
|
|
|
|
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();
|
|
}
|