70 lines
2.3 KiB
C#

using System.Collections.Generic;
namespace Syntriax.Engine.Core;
public class UpdateManager : UniverseObject
{
private readonly BehaviourCollector<IFirstFrameUpdate> firstFrameUpdates = new();
private readonly BehaviourCollector<IPreUpdate> preUpdateEntities = new();
private readonly BehaviourCollector<IUpdate> updateEntities = new();
private readonly BehaviourCollector<IPostUpdate> postUpdateEntities = new();
private readonly List<IFirstFrameUpdate> toCallFirstFrameUpdates = [];
protected override void OnEnteringUniverse(IUniverse universe)
{
firstFrameUpdates.Assign(universe);
preUpdateEntities.Assign(universe);
updateEntities.Assign(universe);
postUpdateEntities.Assign(universe);
universe.OnPreUpdate += OnPreUpdate;
universe.OnUpdate += OnUpdate;
universe.OnPostUpdate += OnPostUpdate;
}
protected override void OnExitingUniverse(IUniverse universe)
{
firstFrameUpdates.Unassign();
preUpdateEntities.Unassign();
updateEntities.Unassign();
postUpdateEntities.Unassign();
universe.OnPreUpdate -= OnPreUpdate;
universe.OnUpdate -= OnUpdate;
universe.OnPostUpdate -= OnPostUpdate;
}
private void OnPreUpdate(IUniverse sender, UniverseTime engineTime)
{
for (int i = toCallFirstFrameUpdates.Count - 1; i >= 0; i--)
toCallFirstFrameUpdates[i].FirstActiveFrame();
for (int i = preUpdateEntities.Behaviours.Count - 1; i >= 0; i--)
preUpdateEntities.Behaviours[i].PreUpdate();
}
private void OnUpdate(IUniverse sender, UniverseTime engineTime)
{
for (int i = updateEntities.Behaviours.Count - 1; i >= 0; i--)
updateEntities.Behaviours[i].Update();
}
private void OnPostUpdate(IUniverse sender, UniverseTime engineTime)
{
for (int i = postUpdateEntities.Behaviours.Count - 1; i >= 0; i--)
postUpdateEntities.Behaviours[i].PostUpdate();
}
private void OnFirstFrameCollected(IBehaviourCollector<IFirstFrameUpdate> sender, IFirstFrameUpdate behaviourCollected)
{
toCallFirstFrameUpdates.Add(behaviourCollected);
}
public UpdateManager()
{
firstFrameUpdates.OnCollected += OnFirstFrameCollected;
}
}