2019-06-14 03:28:26 +00:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
2019-07-18 01:53:31 +00:00
|
|
|
using Encompass.Exceptions;
|
2019-08-02 01:56:52 +00:00
|
|
|
using Collections.Pooled;
|
2019-06-14 03:28:26 +00:00
|
|
|
|
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;
|
2019-06-20 00:40:01 +00:00
|
|
|
|
2019-12-05 20:10:33 +00:00
|
|
|
private readonly ComponentStore componentStore = new ComponentStore();
|
2019-06-14 03:28:26 +00:00
|
|
|
|
2019-12-05 20:10:33 +00:00
|
|
|
private readonly Dictionary<(Entity, Type), IComponent> componentWriteData = new Dictionary<(Entity, Type), IComponent>();
|
2019-08-21 22:13:48 +00:00
|
|
|
private readonly Dictionary<(Entity, Type), int> componentWritePriorities = new Dictionary<(Entity, Type), int>();
|
2019-12-05 20:10:33 +00:00
|
|
|
private readonly HashSet<Entity> entitiesMarkedForRemoval = new HashSet<Entity>();
|
2019-07-18 01:53:31 +00:00
|
|
|
|
2019-08-01 22:06:19 +00:00
|
|
|
public ComponentManager(DrawLayerManager drawLayerManager)
|
2019-06-19 23:13:02 +00:00
|
|
|
{
|
2019-06-20 00:40:01 +00:00
|
|
|
this.drawLayerManager = drawLayerManager;
|
2019-06-19 23:13:02 +00:00
|
|
|
}
|
|
|
|
|
2019-12-05 20:10:33 +00:00
|
|
|
internal void MarkComponentForWrite<TComponent>(Entity entity, TComponent component, int priority) where TComponent : struct, IComponent
|
2019-06-16 01:05:56 +00:00
|
|
|
{
|
2019-12-05 20:10:33 +00:00
|
|
|
componentStore.RegisterComponentType<TComponent>();
|
2019-08-21 02:25:59 +00:00
|
|
|
|
2019-08-21 22:13:48 +00:00
|
|
|
if (componentWriteData.ContainsKey((entity, typeof(TComponent))))
|
2019-08-21 02:25:59 +00:00
|
|
|
{
|
|
|
|
var currentPriority = componentWritePriorities[(entity, typeof(TComponent))];
|
|
|
|
if (priority < currentPriority)
|
|
|
|
{
|
2019-12-05 20:10:33 +00:00
|
|
|
componentWriteData[(entity, typeof(TComponent))] = component;
|
2019-08-21 02:25:59 +00:00
|
|
|
componentWritePriorities[(entity, typeof(TComponent))] = priority;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-12-05 20:10:33 +00:00
|
|
|
componentWriteData.Add((entity, typeof(TComponent)), component);
|
2019-08-21 02:25:59 +00:00
|
|
|
componentWritePriorities[(entity, typeof(TComponent))] = priority;
|
|
|
|
}
|
2019-08-11 00:34:00 +00:00
|
|
|
}
|
|
|
|
|
2019-11-21 03:26:44 +00:00
|
|
|
internal void RegisterDrawableComponent<TComponent>(Guid componentID, TComponent component) where TComponent : IDrawableComponent
|
2019-08-11 00:34:00 +00:00
|
|
|
{
|
2019-11-21 03:26:44 +00:00
|
|
|
drawLayerManager.RegisterComponentWithLayer(componentID, component.Layer);
|
2019-08-11 00:34:00 +00:00
|
|
|
}
|
|
|
|
|
2019-12-05 20:10:33 +00:00
|
|
|
internal void AddComponent<TComponent>(Entity entity, TComponent component) where TComponent : struct, IComponent
|
2019-08-21 22:13:48 +00:00
|
|
|
{
|
2019-12-05 20:10:33 +00:00
|
|
|
componentStore.Set<TComponent>(entity, component);
|
2019-06-20 05:38:56 +00:00
|
|
|
}
|
2019-06-20 00:40:01 +00:00
|
|
|
|
2019-08-21 02:25:59 +00:00
|
|
|
internal void WriteComponents()
|
2019-06-20 05:38:56 +00:00
|
|
|
{
|
2019-08-21 22:13:48 +00:00
|
|
|
foreach (var keyValuePair in componentWriteData)
|
2019-08-11 00:34:00 +00:00
|
|
|
{
|
2019-08-21 22:13:48 +00:00
|
|
|
var (entity, type) = keyValuePair.Key;
|
2019-12-05 20:10:33 +00:00
|
|
|
var component = keyValuePair.Value;
|
2019-08-21 22:13:48 +00:00
|
|
|
|
2019-12-05 20:10:33 +00:00
|
|
|
AddComponent(entity, component);
|
2019-08-11 00:34:00 +00:00
|
|
|
}
|
2019-06-14 03:28:26 +00:00
|
|
|
|
2019-08-21 02:25:59 +00:00
|
|
|
componentWriteData.Clear();
|
|
|
|
componentWritePriorities.Clear();
|
2019-08-11 00:34:00 +00:00
|
|
|
}
|
2019-08-02 06:09:41 +00:00
|
|
|
|
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);
|
2019-06-14 03:28:26 +00:00
|
|
|
}
|
|
|
|
|
2019-08-11 00:34:00 +00:00
|
|
|
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-07-18 01:12:29 +00:00
|
|
|
}
|
|
|
|
|
2019-12-05 20:10:33 +00:00
|
|
|
internal void MarkAllComponentsOnEntityForRemoval(Entity entity)
|
2019-07-18 01:12:29 +00:00
|
|
|
{
|
2019-12-05 20:10:33 +00:00
|
|
|
entitiesMarkedForRemoval.Add(entity);
|
2019-07-18 01:12:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
internal void RemoveMarkedComponents()
|
|
|
|
{
|
2019-12-05 20:10:33 +00:00
|
|
|
foreach (var entity in entitiesMarkedForRemoval)
|
2019-07-18 01:12:29 +00:00
|
|
|
{
|
2019-12-05 20:10:33 +00:00
|
|
|
componentStore.Remove(entity);
|
|
|
|
drawLayerManager.UnRegisterComponentWithLayer(entity);
|
2019-07-18 01:12:29 +00:00
|
|
|
}
|
|
|
|
|
2019-12-05 20:10:33 +00:00
|
|
|
entitiesMarkedForRemoval.Clear();
|
2019-07-18 01:12:29 +00:00
|
|
|
}
|
|
|
|
|
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
|
|
|
{
|
2019-12-05 20:10:33 +00:00
|
|
|
componentStore.Remove<TComponent>(entity);
|
2019-06-14 03:28:26 +00:00
|
|
|
}
|
2019-06-20 03:37:46 +00:00
|
|
|
|
2019-12-05 20:10:33 +00:00
|
|
|
private void Remove(Entity entity)
|
2019-06-20 03:37:46 +00:00
|
|
|
{
|
2019-12-05 20:10:33 +00:00
|
|
|
componentStore.Remove(entity);
|
2019-06-20 03:37:46 +00:00
|
|
|
}
|
2019-06-14 03:28:26 +00:00
|
|
|
}
|
|
|
|
}
|