using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Encompass { public class World { private readonly IOrderedEnumerable> engineGroups; private readonly EntityManager entityManager; private readonly ComponentManager componentManager; private readonly MessageManager messageManager; private readonly RenderManager renderManager; internal World( IOrderedEnumerable> engineGroups, EntityManager entityManager, ComponentManager componentManager, MessageManager messageManager, RenderManager renderManager ) { this.engineGroups = engineGroups; this.entityManager = entityManager; this.componentManager = componentManager; this.messageManager = messageManager; this.renderManager = renderManager; } public void Update(double dt) { foreach (var engineGroup in engineGroups) { foreach (var engine in engineGroup) { engine.Update(dt); } } PostUpdate(); } public void ParallelUpdate(double dt) { foreach (var engineGroup in engineGroups) { try { Parallel.ForEach(engineGroup, engine => engine.Update(dt)); } catch (System.AggregateException e) { if (e.InnerException != null) { throw e.InnerException; } else { throw e; } } } PostUpdate(); } private void PostUpdate() { messageManager.ClearMessages(); entityManager.DestroyMarkedEntities(); componentManager.PerformComponentUpdates(); componentManager.DeactivateMarkedComponents(); componentManager.RemoveMarkedComponents(); entityManager.CheckEntitiesWithAddedComponents(); entityManager.CheckEntitiesWithRemovedComponents(); } public void Draw() { renderManager.Draw(); } } }