86 lines
2.4 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|