entity tag system
parent
2a2d8efc5f
commit
d3c4c12605
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
public abstract class EntityComponentReader
|
public abstract class EntityComponentReader
|
||||||
{
|
{
|
||||||
protected World World;
|
protected readonly World World;
|
||||||
public FilterBuilder FilterBuilder => World.FilterBuilder;
|
public FilterBuilder FilterBuilder => World.FilterBuilder;
|
||||||
|
|
||||||
protected EntityComponentReader(World world)
|
protected EntityComponentReader(World world)
|
||||||
|
@ -10,6 +10,8 @@ public abstract class EntityComponentReader
|
||||||
World = world;
|
World = world;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected string GetTag(in EntityId entity) => World.GetTag(entity);
|
||||||
|
|
||||||
protected bool Has<T>(in EntityId entityId) where T : unmanaged => World.Has<T>(entityId);
|
protected bool Has<T>(in EntityId entityId) where T : unmanaged => World.Has<T>(entityId);
|
||||||
protected bool Some<T>() where T : unmanaged => World.Some<T>();
|
protected bool Some<T>() where T : unmanaged => World.Some<T>();
|
||||||
protected ref T Get<T>(in EntityId entityId) where T : unmanaged => ref World.Get<T>(entityId);
|
protected ref T Get<T>(in EntityId entityId) where T : unmanaged => ref World.Get<T>(entityId);
|
||||||
|
|
|
@ -5,6 +5,7 @@ public class Manipulator : EntityComponentReader
|
||||||
public Manipulator(World world) : base(world) { }
|
public Manipulator(World world) : base(world) { }
|
||||||
|
|
||||||
protected EntityId CreateEntity(string tag = "") => World.CreateEntity(tag);
|
protected EntityId CreateEntity(string tag = "") => World.CreateEntity(tag);
|
||||||
|
protected void Tag(in EntityId entity, string tag) => World.Tag(entity, tag);
|
||||||
protected void Set<TComponent>(in EntityId entity, in TComponent component) where TComponent : unmanaged => World.Set<TComponent>(entity, component);
|
protected void Set<TComponent>(in EntityId entity, in TComponent component) where TComponent : unmanaged => World.Set<TComponent>(entity, component);
|
||||||
protected void Remove<TComponent>(in EntityId entity) where TComponent : unmanaged => World.Remove<TComponent>(entity);
|
protected void Remove<TComponent>(in EntityId entity) where TComponent : unmanaged => World.Remove<TComponent>(entity);
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ using MoonTools.ECS.Collections;
|
||||||
|
|
||||||
namespace MoonTools.ECS.Rev2;
|
namespace MoonTools.ECS.Rev2;
|
||||||
|
|
||||||
|
// TODO: we should implement a NativeDictionary that can be memcopied
|
||||||
public class Snapshot
|
public class Snapshot
|
||||||
{
|
{
|
||||||
private Dictionary<ArchetypeSignature, ArchetypeSnapshot> ArchetypeSnapshots =
|
private Dictionary<ArchetypeSignature, ArchetypeSnapshot> ArchetypeSnapshots =
|
||||||
|
@ -17,6 +18,8 @@ public class Snapshot
|
||||||
private Dictionary<EntityId, IndexableSet<TypeId>> EntityRelationIndex =
|
private Dictionary<EntityId, IndexableSet<TypeId>> EntityRelationIndex =
|
||||||
new Dictionary<EntityId, IndexableSet<TypeId>>();
|
new Dictionary<EntityId, IndexableSet<TypeId>>();
|
||||||
|
|
||||||
|
private Dictionary<EntityId, string> EntityTags = new Dictionary<EntityId, string>();
|
||||||
|
|
||||||
private IdAssigner EntityIdAssigner = new IdAssigner();
|
private IdAssigner EntityIdAssigner = new IdAssigner();
|
||||||
|
|
||||||
public int Count
|
public int Count
|
||||||
|
@ -71,6 +74,11 @@ public class Snapshot
|
||||||
world.EntityRelationIndex[id].Add(typeId);
|
world.EntityRelationIndex[id].Add(typeId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var (id, s) in EntityTags)
|
||||||
|
{
|
||||||
|
world.EntityTags[id] = s;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Take(World world)
|
public void Take(World world)
|
||||||
|
@ -113,6 +121,11 @@ public class Snapshot
|
||||||
EntityRelationIndex[id].Add(typeId);
|
EntityRelationIndex[id].Add(typeId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var (id, s) in world.EntityTags)
|
||||||
|
{
|
||||||
|
EntityTags[id] = s;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TakeArchetypeSnapshot(Archetype archetype)
|
private void TakeArchetypeSnapshot(Archetype archetype)
|
||||||
|
|
|
@ -27,6 +27,9 @@ public class World : IDisposable
|
||||||
// Going from EntityId to Archetype and storage row
|
// Going from EntityId to Archetype and storage row
|
||||||
internal Dictionary<EntityId, Record> EntityIndex = new Dictionary<EntityId, Record>();
|
internal Dictionary<EntityId, Record> EntityIndex = new Dictionary<EntityId, Record>();
|
||||||
|
|
||||||
|
// TODO: can we make the tag an inline array of chars at some point?
|
||||||
|
internal Dictionary<EntityId, string> EntityTags = new Dictionary<EntityId, string>();
|
||||||
|
|
||||||
// Relation Storages
|
// Relation Storages
|
||||||
internal Dictionary<TypeId, RelationStorage> RelationIndex =
|
internal Dictionary<TypeId, RelationStorage> RelationIndex =
|
||||||
new Dictionary<TypeId, RelationStorage>();
|
new Dictionary<TypeId, RelationStorage>();
|
||||||
|
@ -87,9 +90,21 @@ public class World : IDisposable
|
||||||
EntityRelationIndex.Add(entityId, new IndexableSet<TypeId>());
|
EntityRelationIndex.Add(entityId, new IndexableSet<TypeId>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EntityTags[entityId] = tag;
|
||||||
|
|
||||||
return entityId;
|
return entityId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Tag(in EntityId entityId, string tag)
|
||||||
|
{
|
||||||
|
EntityTags[entityId] = tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetTag(in EntityId entityId)
|
||||||
|
{
|
||||||
|
return EntityTags[entityId];
|
||||||
|
}
|
||||||
|
|
||||||
internal TypeId GetTypeId<T>() where T : unmanaged
|
internal TypeId GetTypeId<T>() where T : unmanaged
|
||||||
{
|
{
|
||||||
if (TypeToId.ContainsKey(typeof(T)))
|
if (TypeToId.ContainsKey(typeof(T)))
|
||||||
|
|
Loading…
Reference in New Issue