2019-12-20 19:10:42 +00:00
|
|
|
using System;
|
2019-06-14 03:28:26 +00:00
|
|
|
using System.Collections.Generic;
|
|
|
|
|
2019-06-16 01:05:56 +00:00
|
|
|
namespace Encompass
|
|
|
|
{
|
|
|
|
internal class ComponentManager
|
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
private readonly DrawLayerManager _drawLayerManager;
|
2019-06-20 00:40:01 +00:00
|
|
|
|
2020-03-20 07:09:57 +00:00
|
|
|
private readonly ComponentStore _existingComponentStore;
|
|
|
|
private readonly ComponentStore _immediateComponentStore;
|
|
|
|
private readonly ComponentDeltaStore _replayStore;
|
|
|
|
private readonly ComponentStore _upToDateComponentStore;
|
2019-12-29 21:24:51 +00:00
|
|
|
|
|
|
|
public Dictionary<Type, int> TypeToIndex { get; }
|
|
|
|
|
2020-03-20 07:09:57 +00:00
|
|
|
private readonly HashSet<int> _entitiesMarkedForRemoval = new HashSet<int>();
|
2019-07-18 01:53:31 +00:00
|
|
|
|
2020-03-20 07:09:57 +00:00
|
|
|
internal ComponentBitSet ImmediateBits { get { return _immediateComponentStore.ComponentBitSet; } }
|
|
|
|
internal ComponentBitSet ExistingBits { get { return _existingComponentStore.ComponentBitSet; } }
|
2019-12-28 21:53:02 +00:00
|
|
|
|
2019-12-29 21:24:51 +00:00
|
|
|
public ComponentManager(DrawLayerManager drawLayerManager, Dictionary<Type, int> typeToIndex)
|
2019-06-19 23:13:02 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
this._drawLayerManager = drawLayerManager;
|
|
|
|
_existingComponentStore = new ComponentStore(typeToIndex);
|
|
|
|
_immediateComponentStore = new ComponentStore(typeToIndex);
|
|
|
|
_replayStore = new ComponentDeltaStore(typeToIndex);
|
|
|
|
_upToDateComponentStore = new ComponentStore(typeToIndex);
|
2019-12-29 21:24:51 +00:00
|
|
|
TypeToIndex = typeToIndex;
|
2019-06-19 23:13:02 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 00:38:35 +00:00
|
|
|
public void RegisterComponentType<TComponent>() where TComponent : struct
|
2019-12-16 07:28:02 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
_existingComponentStore.RegisterComponentType<TComponent>();
|
|
|
|
_immediateComponentStore.RegisterComponentType<TComponent>();
|
|
|
|
_replayStore.RegisterComponentType<TComponent>();
|
|
|
|
_upToDateComponentStore.RegisterComponentType<TComponent>();
|
2019-12-16 07:28:02 +00:00
|
|
|
}
|
|
|
|
|
2019-12-30 01:37:19 +00:00
|
|
|
internal void SetExistingComponentStore(ComponentStore componentStore)
|
2019-06-16 01:05:56 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
_existingComponentStore.SwapWith(componentStore);
|
2019-08-11 00:34:00 +00:00
|
|
|
}
|
|
|
|
|
2019-12-30 01:37:19 +00:00
|
|
|
internal void SetUpToDateComponentStore(ComponentStore componentStore)
|
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
_upToDateComponentStore.SwapWith(componentStore);
|
2019-12-30 01:37:19 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 00:38:35 +00:00
|
|
|
internal void RegisterDrawableComponent<TComponent>(int entityID, int layer) where TComponent : struct
|
2019-08-11 00:34:00 +00:00
|
|
|
{
|
2020-03-20 07:58:33 +00:00
|
|
|
_drawLayerManager.RegisterComponentWithLayer<TComponent>(entityID, layer);
|
2019-08-11 00:34:00 +00:00
|
|
|
}
|
|
|
|
|
2019-12-29 21:24:51 +00:00
|
|
|
internal void WriteComponents()
|
2019-08-21 22:13:48 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
_existingComponentStore.UpdateUsing(_replayStore);
|
|
|
|
_existingComponentStore.ClearAllPriorities();
|
|
|
|
_upToDateComponentStore.ClearAllPriorities();
|
|
|
|
_immediateComponentStore.ClearAll();
|
|
|
|
_replayStore.ClearAll();
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 05:19:31 +00:00
|
|
|
internal bool AddImmediateComponent<TComponent>(int entityID, in TComponent component, int priority) where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
if (_immediateComponentStore.Set(entityID, component, priority))
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
_replayStore.Set(entityID, component);
|
|
|
|
_upToDateComponentStore.Set(entityID, component);
|
2019-12-29 21:24:51 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-03-22 05:19:31 +00:00
|
|
|
internal void AddImmediateComponent<TComponent>(int entityID, in TComponent component) where TComponent : struct
|
2020-03-17 22:29:16 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
_immediateComponentStore.Set(entityID, component);
|
|
|
|
_replayStore.Set(entityID, component);
|
|
|
|
_upToDateComponentStore.Set(entityID, component);
|
2020-03-17 22:29:16 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 05:19:31 +00:00
|
|
|
internal bool UpdateComponent<TComponent>(int entityID, in TComponent component, int priority) where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
var result = _upToDateComponentStore.Set(entityID, component, priority);
|
2019-12-30 03:08:32 +00:00
|
|
|
if (result)
|
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
_replayStore.Set(entityID, component);
|
2019-12-30 03:08:32 +00:00
|
|
|
}
|
|
|
|
return result;
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 05:19:31 +00:00
|
|
|
internal void AddComponent<TComponent>(int entityID, in TComponent component) where TComponent : struct
|
2020-03-17 22:29:16 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
_upToDateComponentStore.Set(entityID, component);
|
|
|
|
_replayStore.Set(entityID, component);
|
2020-03-17 22:29:16 +00:00
|
|
|
}
|
|
|
|
|
2019-12-29 21:24:51 +00:00
|
|
|
// existing or immediate reads
|
|
|
|
|
2020-11-16 07:21:51 +00:00
|
|
|
internal ReadOnlySpan<TComponent> ReadExistingAndImmediateComponentsByType<TComponent>() where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _upToDateComponentStore.All<TComponent>();
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2020-03-23 02:10:28 +00:00
|
|
|
internal ref readonly TComponent ExistingOrImmediateSingular<TComponent>() where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-23 02:10:28 +00:00
|
|
|
return ref _upToDateComponentStore.Singular<TComponent>();
|
|
|
|
}
|
|
|
|
|
2020-11-16 07:21:51 +00:00
|
|
|
internal ReadOnlySpan<Entity> GetExistingAndImmediateEntities<TComponent>() where TComponent : struct
|
2020-03-23 02:10:28 +00:00
|
|
|
{
|
|
|
|
return _upToDateComponentStore.AllEntities<TComponent>();
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2020-03-23 02:20:55 +00:00
|
|
|
internal ref readonly Entity ExistingOrImmediateSingularEntity<TComponent>() where TComponent : struct
|
|
|
|
{
|
|
|
|
return ref _upToDateComponentStore.SingularEntity<TComponent>();
|
|
|
|
}
|
|
|
|
|
2020-03-22 00:38:35 +00:00
|
|
|
internal bool SomeExistingOrImmediateComponent<TComponent>() where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _upToDateComponentStore.Any<TComponent>();
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// existing reads
|
|
|
|
|
2020-11-16 07:21:51 +00:00
|
|
|
internal ReadOnlySpan<TComponent> GetExistingComponents<TComponent>() where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-23 02:10:28 +00:00
|
|
|
return _existingComponentStore.All<TComponent>();
|
|
|
|
}
|
|
|
|
|
|
|
|
internal ref readonly TComponent ExistingSingular<TComponent>() where TComponent : struct
|
|
|
|
{
|
|
|
|
return ref _existingComponentStore.Singular<TComponent>();
|
|
|
|
}
|
|
|
|
|
2020-11-16 07:21:51 +00:00
|
|
|
internal ReadOnlySpan<Entity> GetExistingEntities<TComponent>() where TComponent : struct
|
2020-03-23 02:10:28 +00:00
|
|
|
{
|
|
|
|
return _existingComponentStore.AllEntities<TComponent>();
|
|
|
|
}
|
|
|
|
|
2020-11-16 07:21:51 +00:00
|
|
|
internal IEnumerable<Entity> GetExistingEntitiesAsEnumerable<TComponent>() where TComponent : struct
|
|
|
|
{
|
|
|
|
return _existingComponentStore.AllEntitiesAsEnumerable<TComponent>();
|
|
|
|
}
|
|
|
|
|
2020-03-23 02:20:55 +00:00
|
|
|
internal ref readonly Entity ExistingSingularEntity<TComponent>() where TComponent : struct
|
2020-03-23 02:10:28 +00:00
|
|
|
{
|
|
|
|
return ref _existingComponentStore.SingularEntity<TComponent>();
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 00:38:35 +00:00
|
|
|
internal bool SomeExistingComponent<TComponent>() where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _existingComponentStore.Any<TComponent>();
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// immediate reads
|
|
|
|
|
2020-11-16 07:21:51 +00:00
|
|
|
internal ReadOnlySpan<TComponent> ReadImmediateComponentsByType<TComponent>() where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _immediateComponentStore.All<TComponent>();
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2020-03-23 02:20:55 +00:00
|
|
|
internal ref readonly TComponent ImmediateSingular<TComponent>() where TComponent : struct
|
|
|
|
{
|
|
|
|
return ref _immediateComponentStore.Singular<TComponent>();
|
|
|
|
}
|
|
|
|
|
2020-11-16 07:21:51 +00:00
|
|
|
internal ReadOnlySpan<Entity> GetImmediateEntities<TComponent>() where TComponent : struct
|
2020-03-23 02:10:28 +00:00
|
|
|
{
|
|
|
|
return _immediateComponentStore.AllEntities<TComponent>();
|
|
|
|
}
|
|
|
|
|
2020-03-23 02:20:55 +00:00
|
|
|
internal ref readonly Entity ImmediateSingularEntity<TComponent>() where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-23 02:20:55 +00:00
|
|
|
return ref _immediateComponentStore.SingularEntity<TComponent>();
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 00:38:35 +00:00
|
|
|
internal bool SomeImmediateComponent<TComponent>() where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _immediateComponentStore.Any<TComponent>();
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// component getters
|
|
|
|
|
2020-03-22 05:19:31 +00:00
|
|
|
internal ref TComponent ReadImmediateOrExistingComponentByEntityAndType<TComponent>(int entityID) where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return ref _upToDateComponentStore.Get<TComponent>(entityID);
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 05:19:31 +00:00
|
|
|
internal ref TComponent ReadExistingComponentByEntityAndType<TComponent>(int entityID) where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return ref _existingComponentStore.Get<TComponent>(entityID);
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 05:19:31 +00:00
|
|
|
internal ref TComponent ReadImmediateComponentByEntityAndType<TComponent>(int entityID) where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return ref _immediateComponentStore.Get<TComponent>(entityID);
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// has checkers
|
|
|
|
|
2020-03-22 00:38:35 +00:00
|
|
|
internal bool HasExistingOrImmediateComponent<TComponent>(int entityID) where TComponent : struct
|
2019-06-20 05:38:56 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _upToDateComponentStore.Has<TComponent>(entityID);
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2019-12-29 21:54:08 +00:00
|
|
|
internal bool HasExistingOrImmediateComponent(int entityID, Type type)
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _upToDateComponentStore.Has(type, entityID);
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 00:38:35 +00:00
|
|
|
internal bool HasExistingComponent<TComponent>(int entityID) where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _existingComponentStore.Has<TComponent>(entityID);
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2019-12-29 21:54:08 +00:00
|
|
|
internal bool HasExistingComponent(int entityID, Type type)
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _existingComponentStore.Has(type, entityID);
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 00:38:35 +00:00
|
|
|
internal bool HasImmediateComponent<TComponent>(int entityID) where TComponent : struct
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _immediateComponentStore.Has<TComponent>(entityID);
|
2019-12-29 21:24:51 +00:00
|
|
|
}
|
|
|
|
|
2019-12-29 21:54:08 +00:00
|
|
|
internal bool HasImmediateComponent(int entityID, Type type)
|
2019-12-29 21:24:51 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _immediateComponentStore.Has(type, entityID);
|
2019-12-05 22:59:55 +00:00
|
|
|
}
|
2019-06-14 03:28:26 +00:00
|
|
|
|
2020-11-16 07:21:51 +00:00
|
|
|
internal ReadOnlySpan<TComponent> GetComponentsByType<TComponent>() where TComponent : struct
|
2019-12-05 22:59:55 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _existingComponentStore.All<TComponent>();
|
2019-08-11 00:34:00 +00:00
|
|
|
}
|
2019-08-02 06:09:41 +00:00
|
|
|
|
2020-11-16 07:21:51 +00:00
|
|
|
internal IEnumerable<TComponent> GetComponentsByTypeEnumerable<TComponent>() where TComponent : struct
|
|
|
|
{
|
|
|
|
return _existingComponentStore.AllAsEnumerable<TComponent>();
|
|
|
|
}
|
|
|
|
|
2020-03-22 00:38:35 +00:00
|
|
|
internal ref readonly TComponent GetComponentByEntityAndType<TComponent>(int entityID) where TComponent : struct
|
2019-06-16 01:05:56 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return ref _existingComponentStore.Get<TComponent>(entityID);
|
2019-06-14 03:28:26 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 00:38:35 +00:00
|
|
|
internal bool EntityHasComponentOfType<TComponent>(int entityID) where TComponent : struct
|
2019-06-19 21:14:44 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _existingComponentStore.Has<TComponent>(entityID);
|
2019-07-18 01:12:29 +00:00
|
|
|
}
|
|
|
|
|
2019-12-29 21:54:08 +00:00
|
|
|
internal void MarkAllComponentsOnEntityForRemoval(int entityID)
|
2019-07-18 01:12:29 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
_entitiesMarkedForRemoval.Add(entityID);
|
2019-07-18 01:12:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
internal void RemoveMarkedComponents()
|
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
foreach (var entityID in _entitiesMarkedForRemoval)
|
2019-07-18 01:12:29 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
_existingComponentStore.Remove(entityID);
|
|
|
|
_immediateComponentStore.Remove(entityID);
|
|
|
|
_replayStore.Remove(entityID);
|
|
|
|
_upToDateComponentStore.Remove(entityID);
|
|
|
|
_drawLayerManager.UnRegisterEntityWithLayer(entityID);
|
2019-07-18 01:12:29 +00:00
|
|
|
}
|
|
|
|
|
2020-03-20 07:09:57 +00:00
|
|
|
_entitiesMarkedForRemoval.Clear();
|
2019-07-18 01:12:29 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 00:38:35 +00:00
|
|
|
public bool RemoveImmediate<TComponent>(int entityID, int priority) where TComponent : struct
|
2019-06-16 01:05:56 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
if (_immediateComponentStore.Remove<TComponent>(entityID, priority))
|
2019-12-24 02:01:49 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
_replayStore.Remove<TComponent>(entityID, priority);
|
|
|
|
_upToDateComponentStore.Remove<TComponent>(entityID, priority);
|
|
|
|
_drawLayerManager.UnRegisterComponentWithLayer<TComponent>(entityID);
|
2019-12-24 02:01:49 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-03-22 00:38:35 +00:00
|
|
|
public void Remove<TComponent>(int entityID, int priority) where TComponent : struct
|
2019-12-24 02:01:49 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
if (_upToDateComponentStore.Remove<TComponent>(entityID, priority))
|
2019-12-24 02:01:49 +00:00
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
_replayStore.Remove<TComponent>(entityID, priority);
|
|
|
|
_drawLayerManager.UnRegisterComponentWithLayer<TComponent>(entityID);
|
2019-12-24 02:01:49 +00:00
|
|
|
}
|
2019-06-14 03:28:26 +00:00
|
|
|
}
|
2020-03-18 00:40:11 +00:00
|
|
|
|
|
|
|
public bool UpToDateEntityIsEmpty(int entityID)
|
|
|
|
{
|
2020-03-20 07:09:57 +00:00
|
|
|
return _upToDateComponentStore.EntityBitArray(entityID).AllFalse();
|
2020-03-18 00:40:11 +00:00
|
|
|
}
|
2019-06-14 03:28:26 +00:00
|
|
|
}
|
|
|
|
}
|