2022-04-08 05:52:03 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2022-03-05 02:01:44 +00:00
|
|
|
|
|
2022-04-08 05:52:03 +00:00
|
|
|
|
namespace MoonTools.ECS
|
2022-03-05 02:01:44 +00:00
|
|
|
|
{
|
2022-04-08 05:52:03 +00:00
|
|
|
|
public abstract class EntityComponentReader
|
2022-03-05 02:01:44 +00:00
|
|
|
|
{
|
2022-05-15 19:16:49 +00:00
|
|
|
|
internal readonly World World;
|
2022-05-03 04:51:11 +00:00
|
|
|
|
internal EntityStorage EntityStorage => World.EntityStorage;
|
|
|
|
|
internal ComponentDepot ComponentDepot => World.ComponentDepot;
|
|
|
|
|
internal RelationDepot RelationDepot => World.RelationDepot;
|
2022-04-08 05:52:03 +00:00
|
|
|
|
protected FilterBuilder FilterBuilder => new FilterBuilder(ComponentDepot);
|
2022-03-05 02:01:44 +00:00
|
|
|
|
|
2022-05-03 04:51:11 +00:00
|
|
|
|
public EntityComponentReader(World world)
|
2022-04-08 05:52:03 +00:00
|
|
|
|
{
|
2022-05-03 04:51:11 +00:00
|
|
|
|
World = world;
|
2022-04-08 05:52:03 +00:00
|
|
|
|
}
|
2022-03-05 02:01:44 +00:00
|
|
|
|
|
2022-05-03 04:51:11 +00:00
|
|
|
|
protected ReadOnlySpan<TComponent> ReadComponents<TComponent>() where TComponent : unmanaged
|
2022-04-08 05:52:03 +00:00
|
|
|
|
{
|
|
|
|
|
return ComponentDepot.ReadComponents<TComponent>();
|
|
|
|
|
}
|
2022-03-05 02:01:44 +00:00
|
|
|
|
|
2022-05-03 04:51:11 +00:00
|
|
|
|
protected bool Has<TComponent>(in Entity entity) where TComponent : unmanaged
|
2022-04-08 05:52:03 +00:00
|
|
|
|
{
|
|
|
|
|
return ComponentDepot.Has<TComponent>(entity.ID);
|
|
|
|
|
}
|
2022-03-05 02:01:44 +00:00
|
|
|
|
|
2022-05-03 04:51:11 +00:00
|
|
|
|
protected bool Some<TComponent>() where TComponent : unmanaged
|
2022-04-08 05:52:03 +00:00
|
|
|
|
{
|
|
|
|
|
return ComponentDepot.Some<TComponent>();
|
|
|
|
|
}
|
2022-03-21 23:21:42 +00:00
|
|
|
|
|
2022-05-03 04:51:11 +00:00
|
|
|
|
protected ref readonly TComponent Get<TComponent>(in Entity entity) where TComponent : unmanaged
|
2022-04-08 05:52:03 +00:00
|
|
|
|
{
|
|
|
|
|
return ref ComponentDepot.Get<TComponent>(entity.ID);
|
|
|
|
|
}
|
2022-03-21 23:21:42 +00:00
|
|
|
|
|
2022-05-03 04:51:11 +00:00
|
|
|
|
protected ref readonly TComponent GetSingleton<TComponent>() where TComponent : unmanaged
|
2022-04-08 05:52:03 +00:00
|
|
|
|
{
|
|
|
|
|
return ref ComponentDepot.Get<TComponent>();
|
|
|
|
|
}
|
2022-03-31 23:15:30 +00:00
|
|
|
|
|
2022-05-03 04:51:11 +00:00
|
|
|
|
protected Entity GetSingletonEntity<TComponent>() where TComponent : unmanaged
|
2022-04-08 05:52:03 +00:00
|
|
|
|
{
|
|
|
|
|
return ComponentDepot.GetSingletonEntity<TComponent>();
|
|
|
|
|
}
|
2022-04-06 19:53:50 +00:00
|
|
|
|
|
2022-04-08 05:52:03 +00:00
|
|
|
|
protected bool Exists(in Entity entity)
|
|
|
|
|
{
|
|
|
|
|
return EntityStorage.Exists(entity);
|
|
|
|
|
}
|
2022-04-06 19:53:50 +00:00
|
|
|
|
|
2022-05-03 04:51:11 +00:00
|
|
|
|
protected IEnumerable<(Entity, Entity, TRelationKind)> Relations<TRelationKind>() where TRelationKind : unmanaged
|
2022-04-08 05:52:03 +00:00
|
|
|
|
{
|
|
|
|
|
return RelationDepot.Relations<TRelationKind>();
|
|
|
|
|
}
|
2022-04-07 03:08:28 +00:00
|
|
|
|
|
2022-05-03 04:51:11 +00:00
|
|
|
|
protected bool Related<TRelationKind>(in Entity a, in Entity b) where TRelationKind : unmanaged
|
2022-04-08 05:52:03 +00:00
|
|
|
|
{
|
|
|
|
|
return RelationDepot.Related<TRelationKind>(a.ID, b.ID);
|
|
|
|
|
}
|
2022-04-06 19:53:50 +00:00
|
|
|
|
|
2022-08-09 21:41:31 +00:00
|
|
|
|
// relations go A->B, so given A, will give all outgoing B relations.
|
|
|
|
|
protected IEnumerable<(Entity, TRelationKind)> OutRelations<TRelationKind>(in Entity entity) where TRelationKind : unmanaged
|
2022-04-08 05:52:03 +00:00
|
|
|
|
{
|
2022-08-09 21:41:31 +00:00
|
|
|
|
return RelationDepot.OutRelations<TRelationKind>(entity.ID);
|
2022-04-08 05:52:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-08-09 21:41:31 +00:00
|
|
|
|
protected (Entity, TRelationKind) OutRelationSingleton<TRelationKind>(in Entity entity) where TRelationKind : unmanaged
|
2022-04-08 05:52:03 +00:00
|
|
|
|
{
|
2022-08-09 21:41:31 +00:00
|
|
|
|
return RelationDepot.OutRelationSingleton<TRelationKind>(entity.ID);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected bool HasOutRelation<TRelationKind>(in Entity entity) where TRelationKind : unmanaged
|
|
|
|
|
{
|
|
|
|
|
return RelationDepot.HasOutRelation<TRelationKind>(entity.ID);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected int OutRelationCount<TRelationKind>(in Entity entity) where TRelationKind : unmanaged
|
|
|
|
|
{
|
|
|
|
|
return RelationDepot.OutRelationCount<TRelationKind>(entity.ID);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Relations go A->B, so given B, will give all incoming A relations.
|
|
|
|
|
protected IEnumerable<(Entity, TRelationKind)> InRelations<TRelationKind>(in Entity entity) where TRelationKind : unmanaged
|
|
|
|
|
{
|
|
|
|
|
return RelationDepot.InRelations<TRelationKind>(entity.ID);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected (Entity, TRelationKind) InRelationSingleton<TRelationKind>(in Entity entity) where TRelationKind : unmanaged
|
|
|
|
|
{
|
|
|
|
|
return RelationDepot.InRelationSingleton<TRelationKind>(entity.ID);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected bool HasInRelation<TRelationKind>(in Entity entity) where TRelationKind : unmanaged
|
|
|
|
|
{
|
|
|
|
|
return RelationDepot.HasInRelation<TRelationKind>(entity.ID);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected int InRelationCount<TRelationKind>(in Entity entity) where TRelationKind : unmanaged
|
|
|
|
|
{
|
|
|
|
|
return RelationDepot.InRelationCount<TRelationKind>(entity.ID);
|
2022-04-08 05:52:03 +00:00
|
|
|
|
}
|
2022-04-06 19:53:50 +00:00
|
|
|
|
}
|
2022-03-05 02:01:44 +00:00
|
|
|
|
}
|