encompass-cs/encompass-cs/ComponentManager.cs

88 lines
3.1 KiB
C#
Raw Normal View History

using System.Collections.Generic;
using System.Linq;
2019-06-16 01:05:56 +00:00
namespace Encompass
{
internal class ComponentManager
{
2019-06-20 17:46:15 +00:00
private readonly DrawLayerManager drawLayerManager;
private readonly ComponentUpdateManager componentUpdateManager;
2019-12-05 20:10:33 +00:00
private readonly ComponentStore componentStore = new ComponentStore();
private readonly HashSet<Entity> entitiesMarkedForRemoval = new HashSet<Entity>();
2019-07-18 01:53:31 +00:00
public ComponentManager(DrawLayerManager drawLayerManager, ComponentUpdateManager componentUpdateManager)
2019-06-19 23:13:02 +00:00
{
this.drawLayerManager = drawLayerManager;
this.componentUpdateManager = componentUpdateManager;
2019-06-19 23:13:02 +00:00
}
2019-12-05 22:59:55 +00:00
internal void SetComponentStore(ComponentStore componentStore)
2019-06-16 01:05:56 +00:00
{
2019-12-05 22:59:55 +00:00
this.componentStore.SwapWith(componentStore);
}
2019-12-05 22:59:55 +00:00
internal void RegisterDrawableComponent<TComponent>(Entity entity, TComponent component, int layer) where TComponent : struct, IComponent
{
2019-12-05 22:59:55 +00:00
drawLayerManager.RegisterComponentWithLayer(entity, component, layer);
}
2019-12-05 20:10:33 +00:00
internal void AddComponent<TComponent>(Entity entity, TComponent component) where TComponent : struct, IComponent
{
componentStore.Set(entity, component);
}
internal void WriteComponents()
{
componentStore.SwapWith(componentUpdateManager.UpToDateComponentStore);
2019-12-05 22:59:55 +00:00
}
2019-12-05 22:59:55 +00:00
internal IEnumerable<(TComponent, Entity)> GetComponentsIncludingEntity<TComponent>() where TComponent : struct, IComponent
{
return componentStore.All<TComponent>().Select(pair => (pair.Item2, pair.Item1));
}
2019-12-05 20:10:33 +00:00
internal IEnumerable<TComponent> GetComponentsByType<TComponent>() where TComponent : struct, IComponent
2019-06-19 21:14:44 +00:00
{
2019-12-05 20:10:33 +00:00
return componentStore.All<TComponent>().Select(pair => pair.Item2);
2019-06-19 21:14:44 +00:00
}
2019-12-05 20:10:33 +00:00
internal TComponent GetComponentByEntityAndType<TComponent>(Entity entity) where TComponent : struct, IComponent
2019-06-16 01:05:56 +00:00
{
2019-12-05 20:10:33 +00:00
return componentStore.Get<TComponent>(entity);
}
internal bool EntityHasComponentOfType<TComponent>(Entity entity) where TComponent : struct, IComponent
2019-06-19 21:14:44 +00:00
{
2019-12-05 20:10:33 +00:00
return componentStore.Has<TComponent>(entity);
2019-06-19 23:13:02 +00:00
}
2019-08-01 23:44:29 +00:00
internal bool ComponentOfTypeExists<TComponent>() where TComponent : struct, IComponent
2019-06-16 01:05:56 +00:00
{
2019-12-05 20:10:33 +00:00
return componentStore.Any<TComponent>();
}
2019-12-05 20:10:33 +00:00
internal void MarkAllComponentsOnEntityForRemoval(Entity entity)
{
2019-12-05 20:10:33 +00:00
entitiesMarkedForRemoval.Add(entity);
}
internal void RemoveMarkedComponents()
{
2019-12-05 20:10:33 +00:00
foreach (var entity in entitiesMarkedForRemoval)
{
2019-12-05 20:10:33 +00:00
componentStore.Remove(entity);
2019-12-05 22:59:55 +00:00
drawLayerManager.UnRegisterEntityWithLayer(entity);
}
2019-12-05 20:10:33 +00:00
entitiesMarkedForRemoval.Clear();
}
2019-12-05 20:10:33 +00:00
public void Remove<TComponent>(Entity entity) where TComponent : struct, IComponent
2019-06-16 01:05:56 +00:00
{
componentUpdateManager.Remove<TComponent>(entity);
drawLayerManager.UnRegisterComponentWithLayer<TComponent>(entity);
}
}
}