feat: monogame content loader interface added

This commit is contained in:
Syntriax 2025-07-25 21:40:57 +03:00
parent 200e8ae7da
commit ad365dc722
3 changed files with 66 additions and 0 deletions

View File

@ -0,0 +1,10 @@
using Microsoft.Xna.Framework.Content;
using Syntriax.Engine.Core;
namespace Syntriax.Engine.Integration.MonoGame;
public interface ILoadContent : IBehaviour
{
void LoadContent(ContentManager content);
}

View File

@ -0,0 +1,53 @@
using System.Collections.Generic;
using Syntriax.Engine.Core;
namespace Syntriax.Engine.Integration.MonoGame;
public class LoadContentManager : Behaviour, IFirstFrameUpdate
{
// We use Ascending order because we are using reverse for loop to call them
private static Comparer<IBehaviour> SortByAscendingPriority() => Comparer<IBehaviour>.Create((x, y) => x.Priority.CompareTo(y.Priority));
private readonly ActiveBehaviourCollectorSorted<ILoadContent> loadContents = new() { SortBy = SortByAscendingPriority() };
private readonly List<ILoadContent> toCallLoadContents = new(32);
private MonoGameWindowContainer monoGameWindowContainer = null!;
public void FirstActiveFrame()
{
monoGameWindowContainer = Universe.FindRequiredBehaviour<MonoGameWindowContainer>();
}
protected override void OnEnteredUniverse(IUniverse universe)
{
loadContents.Assign(universe);
universe.OnPreUpdate.AddListener(OnPreUpdate);
}
protected override void OnExitedUniverse(IUniverse universe)
{
loadContents.Unassign();
universe.OnPreUpdate.RemoveListener(OnPreUpdate);
}
private void OnPreUpdate(IUniverse sender, IUniverse.UpdateArguments args)
{
for (int i = toCallLoadContents.Count - 1; i >= 0; i--)
{
toCallLoadContents[i].LoadContent(monoGameWindowContainer.Window.Content);
toCallLoadContents.RemoveAt(i);
}
}
private void OnFirstFrameCollected(IBehaviourCollector<ILoadContent> sender, IBehaviourCollector<ILoadContent>.BehaviourCollectedArguments args)
{
toCallLoadContents.Add(args.BehaviourCollected);
}
public LoadContentManager()
{
loadContents.OnCollected.AddListener(OnFirstFrameCollected);
}
}

View File

@ -21,6 +21,9 @@ public class MonoGameWindow : Game
Universe.InstantiateUniverseObject().SetUniverseObject("Window Container")
.BehaviourController.AddBehaviour<MonoGameWindowContainer>(this);
Universe.InstantiateUniverseObject().SetUniverseObject("Content Loader")
.BehaviourController.AddBehaviour<LoadContentManager>();
}
protected override void Initialize()