WithEntity message getters
parent
8ec2780356
commit
9eb4b947f0
|
@ -24,16 +24,31 @@ internal class MessageDepot
|
||||||
return Lookup<TMessage>().Some();
|
return Lookup<TMessage>().Some();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReadOnlySpan<TMessage> ReadAll<TMessage>() where TMessage : struct
|
public ReadOnlySpan<TMessage> All<TMessage>() where TMessage : struct
|
||||||
{
|
{
|
||||||
return Lookup<TMessage>().All();
|
return Lookup<TMessage>().All();
|
||||||
}
|
}
|
||||||
|
|
||||||
public TMessage ReadFirst<TMessage>() where TMessage : struct
|
public TMessage First<TMessage>() where TMessage : struct
|
||||||
{
|
{
|
||||||
return Lookup<TMessage>().First();
|
return Lookup<TMessage>().First();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IEnumerable<TMessage> WithEntity<TMessage>(int entityID) where TMessage : struct, IHasEntity
|
||||||
|
{
|
||||||
|
return Lookup<TMessage>().WithEntity(entityID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ref readonly TMessage FirstWithEntity<TMessage>(int entityID) where TMessage : struct, IHasEntity
|
||||||
|
{
|
||||||
|
return ref Lookup<TMessage>().FirstWithEntity(entityID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool SomeWithEntity<TMessage>(int entityID) where TMessage : struct, IHasEntity
|
||||||
|
{
|
||||||
|
return Lookup<TMessage>().SomeWithEntity(entityID);
|
||||||
|
}
|
||||||
|
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
foreach (var storage in storages.Values)
|
foreach (var storage in storages.Values)
|
||||||
|
|
|
@ -10,6 +10,7 @@ internal class MessageStorage<TMessage> : MessageStorage where TMessage : struct
|
||||||
private int count = 0;
|
private int count = 0;
|
||||||
private int capacity = 128;
|
private int capacity = 128;
|
||||||
private TMessage[] messages;
|
private TMessage[] messages;
|
||||||
|
private Dictionary<int, List<int>> entityToIndices = new Dictionary<int, List<int>>();
|
||||||
|
|
||||||
public MessageStorage()
|
public MessageStorage()
|
||||||
{
|
{
|
||||||
|
@ -25,6 +26,17 @@ internal class MessageStorage<TMessage> : MessageStorage where TMessage : struct
|
||||||
}
|
}
|
||||||
|
|
||||||
messages[count] = message;
|
messages[count] = message;
|
||||||
|
|
||||||
|
if (message is IHasEntity entityMessage)
|
||||||
|
{
|
||||||
|
if (!entityToIndices.ContainsKey(entityMessage.Entity.ID))
|
||||||
|
{
|
||||||
|
entityToIndices.Add(entityMessage.Entity.ID, new List<int>());
|
||||||
|
}
|
||||||
|
|
||||||
|
entityToIndices[entityMessage.Entity.ID].Add(count);
|
||||||
|
}
|
||||||
|
|
||||||
count += 1;
|
count += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,8 +55,33 @@ internal class MessageStorage<TMessage> : MessageStorage where TMessage : struct
|
||||||
return messages[0];
|
return messages[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IEnumerable<TMessage> WithEntity(int entityID)
|
||||||
|
{
|
||||||
|
if (entityToIndices.ContainsKey(entityID))
|
||||||
|
{
|
||||||
|
foreach (var index in entityToIndices[entityID])
|
||||||
|
{
|
||||||
|
yield return messages[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ref readonly TMessage FirstWithEntity(int entityID)
|
||||||
|
{
|
||||||
|
return ref messages[entityToIndices[entityID][0]];
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool SomeWithEntity(int entityID)
|
||||||
|
{
|
||||||
|
return entityToIndices.ContainsKey(entityID) && entityToIndices[entityID].Count > 0;
|
||||||
|
}
|
||||||
|
|
||||||
public override void Clear()
|
public override void Clear()
|
||||||
{
|
{
|
||||||
count = 0;
|
count = 0;
|
||||||
|
foreach (var set in entityToIndices.Values)
|
||||||
|
{
|
||||||
|
set.Clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,12 +38,12 @@ public abstract class System : EntityComponentReader
|
||||||
|
|
||||||
protected ReadOnlySpan<TMessage> ReadMessages<TMessage>() where TMessage : struct
|
protected ReadOnlySpan<TMessage> ReadMessages<TMessage>() where TMessage : struct
|
||||||
{
|
{
|
||||||
return MessageDepot.ReadAll<TMessage>();
|
return MessageDepot.All<TMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected TMessage ReadMessage<TMessage>() where TMessage : struct
|
protected TMessage ReadMessage<TMessage>() where TMessage : struct
|
||||||
{
|
{
|
||||||
return MessageDepot.ReadFirst<TMessage>();
|
return MessageDepot.First<TMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected bool SomeMessage<TMessage>() where TMessage : struct
|
protected bool SomeMessage<TMessage>() where TMessage : struct
|
||||||
|
@ -51,6 +51,21 @@ public abstract class System : EntityComponentReader
|
||||||
return MessageDepot.Some<TMessage>();
|
return MessageDepot.Some<TMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected IEnumerable<TMessage> ReadMessagesWithEntity<TMessage>(in Entity entity) where TMessage : struct, IHasEntity
|
||||||
|
{
|
||||||
|
return MessageDepot.WithEntity<TMessage>(entity.ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ref readonly TMessage ReadMessageWithEntity<TMessage>(in Entity entity) where TMessage : struct, IHasEntity
|
||||||
|
{
|
||||||
|
return ref MessageDepot.FirstWithEntity<TMessage>(entity.ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bool SomeMessageWithEntity<TMessage>(in Entity entity) where TMessage : struct, IHasEntity
|
||||||
|
{
|
||||||
|
return MessageDepot.SomeWithEntity<TMessage>(entity.ID);
|
||||||
|
}
|
||||||
|
|
||||||
protected void Send<TMessage>(in TMessage message) where TMessage : struct
|
protected void Send<TMessage>(in TMessage message) where TMessage : struct
|
||||||
{
|
{
|
||||||
MessageDepot.Add(message);
|
MessageDepot.Add(message);
|
||||||
|
|
Loading…
Reference in New Issue