using System.Collections.Generic; namespace Syntriax.Engine.Core; public class UpdateManager : UniverseObject { private static System.Comparison SortByPriority() => (x, y) => y.Priority.CompareTo(x.Priority); private readonly ActiveBehaviourCollectorSorted firstFrameUpdates = new() { SortBy = SortByPriority() }; private readonly ActiveBehaviourCollectorSorted preUpdateEntities = new() { SortBy = SortByPriority() }; private readonly ActiveBehaviourCollectorSorted updateEntities = new() { SortBy = SortByPriority() }; private readonly ActiveBehaviourCollectorSorted postUpdateEntities = new() { SortBy = SortByPriority() }; private readonly List 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(); toCallFirstFrameUpdates.RemoveAt(i); } 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 sender, IFirstFrameUpdate behaviourCollected) { toCallFirstFrameUpdates.Add(behaviourCollected); } public UpdateManager() { firstFrameUpdates.OnCollected += OnFirstFrameCollected; } }