encompass-cs/encompass-cs/Collections/ComponentStore.cs

142 lines
4.4 KiB
C#
Raw Normal View History

2019-12-29 05:39:35 +00:00
using MoonTools.FastCollections;
2019-12-23 00:21:07 +00:00
using System;
using System.Collections.Generic;
namespace Encompass
{
internal class ComponentStore
{
private Dictionary<Type, TypedComponentStore> Stores = new Dictionary<Type, TypedComponentStore>(512);
public ComponentBitSet ComponentBitSet { get; private set; }
2019-12-22 09:15:58 +00:00
public ComponentStore(Dictionary<Type, int> typeToIndex)
{
ComponentBitSet = new ComponentBitSet(typeToIndex);
2019-12-22 09:15:58 +00:00
}
2019-12-05 20:10:33 +00:00
2019-12-05 22:59:55 +00:00
public IEnumerable<(Type, TypedComponentStore)> StoresEnumerable()
2019-12-05 20:10:33 +00:00
{
2019-12-05 22:59:55 +00:00
foreach (var entry in Stores)
2019-12-05 20:10:33 +00:00
{
2019-12-05 22:59:55 +00:00
yield return (entry.Key, entry.Value);
2019-12-05 20:10:33 +00:00
}
}
2019-12-16 07:28:02 +00:00
public void RegisterComponentType<TComponent>() where TComponent : struct, IComponent
{
if (!Stores.ContainsKey(typeof(TComponent)))
{
2019-12-05 20:10:33 +00:00
var store = new TypedComponentStore<TComponent>();
Stores.Add(typeof(TComponent), store);
}
2019-12-16 07:28:02 +00:00
}
private TypedComponentStore<TComponent> Lookup<TComponent>() where TComponent : struct, IComponent
{
//RegisterComponentType<TComponent>();
2019-12-05 20:10:33 +00:00
return Stores[typeof(TComponent)] as TypedComponentStore<TComponent>;
}
public bool Has<TComponent>(int entityID) where TComponent : struct, IComponent
2019-12-05 20:10:33 +00:00
{
return Lookup<TComponent>().Has(entityID);
2019-12-05 20:10:33 +00:00
}
public bool Has(Type type, int entityID)
2019-12-05 20:10:33 +00:00
{
return Stores.ContainsKey(type) && Stores[type].Has(entityID);
2019-12-05 20:10:33 +00:00
}
2019-12-29 05:39:35 +00:00
public BitSet512 EntityBitArray(int entityID)
{
return ComponentBitSet.EntityBitArray(entityID);
}
public TComponent Get<TComponent>(int entityID) where TComponent : struct, IComponent
2019-12-05 20:10:33 +00:00
{
return Lookup<TComponent>().Get(entityID);
2019-12-05 20:10:33 +00:00
}
public void Set<TComponent>(int entityID, TComponent component) where TComponent : struct, IComponent
2019-12-05 20:10:33 +00:00
{
Lookup<TComponent>().Set(entityID, component);
ComponentBitSet.Set<TComponent>(entityID);
}
public bool Set<TComponent>(int entityID, TComponent component, int priority) where TComponent : struct, IComponent
{
if (Lookup<TComponent>().Set(entityID, component, priority))
{
ComponentBitSet.Set<TComponent>(entityID);
return true;
}
return false;
}
public bool Remove<TComponent>(int entityID, int priority) where TComponent : struct, IComponent
{
if (Lookup<TComponent>().Remove(entityID, priority))
{
ComponentBitSet.RemoveComponent<TComponent>(entityID);
return true;
}
return false;
}
public void ForceRemove<TComponent>(int entityID) where TComponent : struct, IComponent
{
Lookup<TComponent>().ForceRemove(entityID);
}
public void Remove(int entityID)
{
2019-12-05 20:10:33 +00:00
foreach (var entry in Stores.Values)
{
entry.ForceRemove(entityID);
2019-12-05 20:10:33 +00:00
}
ComponentBitSet.RemoveEntity(entityID);
}
2019-12-05 20:10:33 +00:00
public bool Any<TComponent>() where TComponent : struct, IComponent
{
2019-12-05 20:10:33 +00:00
return Lookup<TComponent>().Count > 0;
}
public IEnumerable<(int, Type, IComponent)> AllInterfaceTyped()
2019-12-05 22:59:55 +00:00
{
foreach (var store in Stores.Values)
{
foreach (var thing in store.AllInterfaceTyped())
{
yield return thing;
}
}
}
public IEnumerable<(TComponent, int)> All<TComponent>() where TComponent : struct, IComponent
{
2019-12-05 20:10:33 +00:00
return Lookup<TComponent>().All();
}
public void Clear<TComponent>() where TComponent : struct, IComponent
{
Lookup<TComponent>().Clear();
}
public void ClearAll()
{
ComponentBitSet.Clear();
2019-12-05 20:10:33 +00:00
foreach (var store in Stores.Values)
{
2019-12-05 20:10:33 +00:00
store.Clear();
}
}
2019-12-05 22:59:55 +00:00
public void SwapWith(ComponentStore other)
{
(Stores, other.Stores) = (other.Stores, Stores);
(ComponentBitSet, other.ComponentBitSet) = (other.ComponentBitSet, ComponentBitSet);
2019-12-05 22:59:55 +00:00
}
}
}