initial template system
parent
7c6410275f
commit
f045335881
|
@ -15,7 +15,7 @@ namespace MoonTools.ECS
|
|||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void Register<TComponent>(int index) where TComponent : unmanaged
|
||||
internal void Register<TComponent>(int index) where TComponent : unmanaged
|
||||
{
|
||||
if (index >= storages.Length)
|
||||
{
|
||||
|
@ -47,12 +47,11 @@ namespace MoonTools.ECS
|
|||
return ref Lookup<TComponent>().Get(entityID);
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
public object Debug_Get(int entityID, int componentTypeIndex)
|
||||
// used for debugging and template instantiation
|
||||
internal object UntypedGet(int entityID, int componentTypeIndex)
|
||||
{
|
||||
return storages[componentTypeIndex].Debug_Get(entityID);
|
||||
return storages[componentTypeIndex].UntypedGet(entityID);
|
||||
}
|
||||
#endif
|
||||
|
||||
public ref readonly TComponent GetFirst<TComponent>() where TComponent : unmanaged
|
||||
{
|
||||
|
@ -64,6 +63,11 @@ namespace MoonTools.ECS
|
|||
Lookup<TComponent>().Set(entityID, component);
|
||||
}
|
||||
|
||||
internal void Set(int entityID, int componentTypeIndex, object component)
|
||||
{
|
||||
storages[componentTypeIndex].Set(entityID, component);
|
||||
}
|
||||
|
||||
public Entity GetSingletonEntity<TComponent>() where TComponent : unmanaged
|
||||
{
|
||||
return Lookup<TComponent>().FirstEntity();
|
||||
|
|
|
@ -6,14 +6,14 @@ namespace MoonTools.ECS
|
|||
{
|
||||
internal abstract class ComponentStorage
|
||||
{
|
||||
internal abstract void Set(int entityID, object component);
|
||||
public abstract bool Remove(int entityID);
|
||||
public abstract ComponentStorageState CreateState();
|
||||
public abstract void Save(ComponentStorageState state);
|
||||
public abstract void Load(ComponentStorageState state);
|
||||
|
||||
#if DEBUG
|
||||
public abstract object Debug_Get(int entityID);
|
||||
#endif
|
||||
// used for debugging and template instantiation
|
||||
internal abstract object UntypedGet(int entityID);
|
||||
}
|
||||
|
||||
internal class ComponentStorage<TComponent> : ComponentStorage where TComponent : unmanaged
|
||||
|
@ -33,6 +33,11 @@ namespace MoonTools.ECS
|
|||
return ref components[entityIDToStorageIndex[entityID]];
|
||||
}
|
||||
|
||||
internal override object UntypedGet(int entityID)
|
||||
{
|
||||
return components[entityIDToStorageIndex[entityID]];
|
||||
}
|
||||
|
||||
public ref readonly TComponent GetFirst()
|
||||
{
|
||||
#if DEBUG
|
||||
|
@ -64,6 +69,11 @@ namespace MoonTools.ECS
|
|||
components[entityIDToStorageIndex[entityID]] = component;
|
||||
}
|
||||
|
||||
internal override void Set(int entityID, object component)
|
||||
{
|
||||
Set(entityID, (TComponent) component);
|
||||
}
|
||||
|
||||
// Returns true if the entity had this component.
|
||||
public override bool Remove(int entityID)
|
||||
{
|
||||
|
@ -151,12 +161,5 @@ namespace MoonTools.ECS
|
|||
|
||||
nextID = state.Count;
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
public override object Debug_Get(int entityID)
|
||||
{
|
||||
return components[entityIDToStorageIndex[entityID]];
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,9 +9,7 @@ namespace MoonTools.ECS
|
|||
{
|
||||
public abstract class DebugSystem : System
|
||||
{
|
||||
#if DEBUG
|
||||
private Dictionary<Type, Filter> singleComponentFilters = new Dictionary<Type, Filter>();
|
||||
#endif
|
||||
|
||||
protected DebugSystem(World world) : base(world)
|
||||
{
|
||||
|
@ -21,7 +19,7 @@ namespace MoonTools.ECS
|
|||
{
|
||||
foreach (var typeIndex in EntityStorage.ComponentTypeIndices(entity.ID))
|
||||
{
|
||||
yield return ComponentDepot.Debug_Get(entity.ID, typeIndex);
|
||||
yield return ComponentDepot.UntypedGet(entity.ID, typeIndex);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -13,6 +13,8 @@ namespace MoonTools.ECS
|
|||
internal FilterStorage FilterStorage => World.FilterStorage;
|
||||
internal TypeIndices ComponentTypeIndices => World.ComponentTypeIndices;
|
||||
internal TypeIndices RelationTypeIndices => World.RelationTypeIndices;
|
||||
internal TemplateStorage TemplateStorage => World.TemplateStorage;
|
||||
internal ComponentDepot TemplateComponentDepot => World.TemplateComponentDepot;
|
||||
|
||||
public EntityComponentReader(World world)
|
||||
{
|
||||
|
|
|
@ -33,20 +33,20 @@ namespace MoonTools.ECS
|
|||
}
|
||||
|
||||
// Returns true if the component is new.
|
||||
public bool SetComponent(int entityID, int storageIndex)
|
||||
public bool SetComponent(int entityID, int componentTypeIndex)
|
||||
{
|
||||
return EntityToComponentTypeIndices[entityID].Add(storageIndex);
|
||||
return EntityToComponentTypeIndices[entityID].Add(componentTypeIndex);
|
||||
}
|
||||
|
||||
public bool HasComponent(int entityID, int storageIndex)
|
||||
public bool HasComponent(int entityID, int componentTypeIndex)
|
||||
{
|
||||
return EntityToComponentTypeIndices[entityID].Contains(storageIndex);
|
||||
return EntityToComponentTypeIndices[entityID].Contains(componentTypeIndex);
|
||||
}
|
||||
|
||||
// Returns true if the component existed.
|
||||
public bool RemoveComponent(int entityID, int storageIndex)
|
||||
public bool RemoveComponent(int entityID, int componentTypeIndex)
|
||||
{
|
||||
return EntityToComponentTypeIndices[entityID].Remove(storageIndex);
|
||||
return EntityToComponentTypeIndices[entityID].Remove(componentTypeIndex);
|
||||
}
|
||||
|
||||
public void AddRelation(int entityID, int relationIndex)
|
||||
|
|
|
@ -42,6 +42,28 @@ namespace MoonTools.ECS
|
|||
}
|
||||
}
|
||||
|
||||
protected void Set<TComponent>(in Template template, in TComponent component) where TComponent : unmanaged
|
||||
{
|
||||
var componentTypeIndex = ComponentTypeIndices.GetIndex<TComponent>();
|
||||
TemplateStorage.SetComponent(template.ID, componentTypeIndex);
|
||||
TemplateComponentDepot.Set(template.ID, component);
|
||||
ComponentDepot.Register<TComponent>(componentTypeIndex);
|
||||
}
|
||||
|
||||
protected Entity Instantiate(in Template template)
|
||||
{
|
||||
var entity = EntityStorage.Create();
|
||||
|
||||
foreach (var componentTypeIndex in TemplateStorage.ComponentTypeIndices(template.ID))
|
||||
{
|
||||
EntityStorage.SetComponent(entity.ID, componentTypeIndex);
|
||||
FilterStorage.Check(entity.ID, componentTypeIndex);
|
||||
ComponentDepot.Set(entity.ID, componentTypeIndex, TemplateComponentDepot.UntypedGet(template.ID, componentTypeIndex));
|
||||
}
|
||||
|
||||
return entity;
|
||||
}
|
||||
|
||||
protected ReadOnlySpan<TMessage> ReadMessages<TMessage>() where TMessage : unmanaged
|
||||
{
|
||||
return MessageDepot.All<TMessage>();
|
||||
|
|
|
@ -1,14 +1,29 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
namespace MoonTools.ECS
|
||||
{
|
||||
public class TemplateStorage
|
||||
{
|
||||
private int nextID = 0;
|
||||
|
||||
private Dictionary<int, HashSet<int>> TemplateToComponentTypeIndices = new Dictionary<int, HashSet<int>>();
|
||||
|
||||
public Template Create()
|
||||
{
|
||||
TemplateToComponentTypeIndices.Add(nextID, new HashSet<int>());
|
||||
return new Template(NextID());
|
||||
}
|
||||
|
||||
public bool SetComponent(int templateID, int componentTypeIndex)
|
||||
{
|
||||
return TemplateToComponentTypeIndices[templateID].Add(componentTypeIndex);
|
||||
}
|
||||
|
||||
public IEnumerable<int> ComponentTypeIndices(int templateID)
|
||||
{
|
||||
return TemplateToComponentTypeIndices[templateID];
|
||||
}
|
||||
|
||||
private int NextID()
|
||||
{
|
||||
var id = nextID;
|
||||
|
|
21
src/World.cs
21
src/World.cs
|
@ -10,16 +10,16 @@
|
|||
internal readonly RelationDepot RelationDepot;
|
||||
internal readonly FilterStorage FilterStorage;
|
||||
|
||||
/*
|
||||
internal readonly TemplateStorage TemplateStorage = new TemplateStorage();
|
||||
internal readonly ComponentDepot TemplateComponentDepot = new ComponentDepot();
|
||||
*/
|
||||
internal readonly ComponentDepot TemplateComponentDepot;
|
||||
|
||||
|
||||
public World()
|
||||
{
|
||||
ComponentDepot = new ComponentDepot(ComponentTypeIndices);
|
||||
RelationDepot = new RelationDepot(RelationTypeIndices);
|
||||
FilterStorage = new FilterStorage(EntityStorage, ComponentTypeIndices);
|
||||
TemplateComponentDepot = new ComponentDepot(ComponentTypeIndices);
|
||||
}
|
||||
|
||||
public Entity CreateEntity()
|
||||
|
@ -37,22 +37,29 @@
|
|||
ComponentDepot.Set<TComponent>(entity.ID, component);
|
||||
}
|
||||
|
||||
/*
|
||||
public Template CreateTemplate()
|
||||
{
|
||||
return TemplateStorage.Create();
|
||||
}
|
||||
|
||||
public void Set<TComponent>(Template template, in TComponent component) where TComponent : unmanaged
|
||||
public void Set<TComponent>(in Template template, in TComponent component) where TComponent : unmanaged
|
||||
{
|
||||
TemplateStorage.SetComponent(template.ID, ComponentTypeIndices.GetIndex<TComponent>());
|
||||
TemplateComponentDepot.Set(template.ID, component);
|
||||
}
|
||||
*/
|
||||
|
||||
public Entity Instantiate(Template template)
|
||||
// TODO: TEST ME!!!
|
||||
public Entity Instantiate(in Template template)
|
||||
{
|
||||
var entity = EntityStorage.Create();
|
||||
|
||||
foreach (var componentTypeIndex in TemplateStorage.ComponentTypeIndices(template.ID))
|
||||
{
|
||||
EntityStorage.SetComponent(entity.ID, componentTypeIndex);
|
||||
FilterStorage.Check(entity.ID, componentTypeIndex);
|
||||
ComponentDepot.Set(entity.ID, componentTypeIndex, TemplateComponentDepot.UntypedGet(template.ID, componentTypeIndex));
|
||||
}
|
||||
|
||||
return entity;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue