encompass-cs/encompass-cs/World.cs

86 lines
2.4 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Encompass
{
public class World
{
private readonly IOrderedEnumerable<IGrouping<int, Engine>> engineGroups;
private readonly EntityManager entityManager;
private readonly ComponentManager componentManager;
private readonly MessageManager messageManager;
private readonly RenderManager renderManager;
internal World(
IOrderedEnumerable<IGrouping<int, Engine>> 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();
}
}
}