world transfer determinism
parent
1ef141422c
commit
a2a81bf477
|
@ -13,12 +13,9 @@ namespace MoonTools.ECS
|
|||
{
|
||||
}
|
||||
|
||||
protected IEnumerable<dynamic> Debug_GetAllComponents(Entity entity)
|
||||
protected ComponentEnumerator Debug_GetAllComponents(Entity entity)
|
||||
{
|
||||
foreach (var typeIndex in EntityStorage.ComponentTypeIndices(entity.ID))
|
||||
{
|
||||
yield return ComponentDepot.Debug_Get(entity.ID, typeIndex);
|
||||
}
|
||||
return new ComponentEnumerator(ComponentDepot, entity, EntityStorage.ComponentTypeIndices(entity.ID));
|
||||
}
|
||||
|
||||
protected IEnumerable<Entity> Debug_GetEntities(Type componentType)
|
||||
|
@ -39,6 +36,28 @@ namespace MoonTools.ECS
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ref struct ComponentEnumerator
|
||||
{
|
||||
private ComponentDepot ComponentDepot;
|
||||
private Entity Entity;
|
||||
private ReverseSpanEnumerator<int> ComponentTypeIndices;
|
||||
|
||||
public ComponentEnumerator GetEnumerator() => this;
|
||||
|
||||
internal ComponentEnumerator(
|
||||
ComponentDepot componentDepot,
|
||||
Entity entity,
|
||||
Collections.IndexableSet<int> componentTypeIndices
|
||||
) {
|
||||
ComponentDepot = componentDepot;
|
||||
Entity = entity;
|
||||
ComponentTypeIndices = componentTypeIndices.GetEnumerator();
|
||||
}
|
||||
|
||||
public bool MoveNext() => ComponentTypeIndices.MoveNext();
|
||||
public object Current => ComponentDepot.Debug_Get(Entity.ID, ComponentTypeIndices.Current);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System.Collections.Generic;
|
||||
using MoonTools.ECS.Collections;
|
||||
|
||||
namespace MoonTools.ECS
|
||||
{
|
||||
|
@ -10,8 +11,8 @@ namespace MoonTools.ECS
|
|||
// FIXME: this is only needed in debug mode
|
||||
private readonly HashSet<int> availableIDHash = new HashSet<int>();
|
||||
|
||||
private Dictionary<int, HashSet<int>> EntityToComponentTypeIndices = new Dictionary<int, HashSet<int>>();
|
||||
private Dictionary<int, HashSet<int>> EntityToRelationTypeIndices = new Dictionary<int, HashSet<int>>();
|
||||
private Dictionary<int, IndexableSet<int>> EntityToComponentTypeIndices = new Dictionary<int, IndexableSet<int>>();
|
||||
private Dictionary<int, IndexableSet<int>> EntityToRelationTypeIndices = new Dictionary<int, IndexableSet<int>>();
|
||||
|
||||
public int Count => nextID - availableIDs.Count;
|
||||
|
||||
|
@ -23,12 +24,12 @@ namespace MoonTools.ECS
|
|||
|
||||
if (!EntityToComponentTypeIndices.ContainsKey(entity.ID))
|
||||
{
|
||||
EntityToComponentTypeIndices.Add(entity.ID, new HashSet<int>());
|
||||
EntityToComponentTypeIndices.Add(entity.ID, new IndexableSet<int>());
|
||||
}
|
||||
|
||||
if (!EntityToRelationTypeIndices.ContainsKey(entity.ID))
|
||||
{
|
||||
EntityToRelationTypeIndices.Add(entity.ID, new HashSet<int>());
|
||||
EntityToRelationTypeIndices.Add(entity.ID, new IndexableSet<int>());
|
||||
}
|
||||
|
||||
Tags[entity.ID] = tag;
|
||||
|
@ -86,12 +87,12 @@ namespace MoonTools.ECS
|
|||
return Tags[entityID];
|
||||
}
|
||||
|
||||
public HashSet<int> ComponentTypeIndices(int entityID)
|
||||
public IndexableSet<int> ComponentTypeIndices(int entityID)
|
||||
{
|
||||
return EntityToComponentTypeIndices[entityID];
|
||||
}
|
||||
|
||||
public HashSet<int> RelationTypeIndices(int entityID)
|
||||
public IndexableSet<int> RelationTypeIndices(int entityID)
|
||||
{
|
||||
return EntityToRelationTypeIndices[entityID];
|
||||
}
|
||||
|
|
|
@ -22,8 +22,6 @@ namespace MoonTools.ECS
|
|||
|
||||
public bool Equals(FilterSignature other)
|
||||
{
|
||||
// workaround for HashSet<T>.SetEquals generating garbage
|
||||
// maybe fixed in .NET 8?
|
||||
foreach (var included in Included)
|
||||
{
|
||||
if (!other.Included.Contains(included))
|
||||
|
|
|
@ -148,10 +148,12 @@ namespace MoonTools.ECS
|
|||
}
|
||||
}
|
||||
|
||||
filterSignatureToEntityIDs[filterSignature].Add(entityID);
|
||||
if (addCallbacks.TryGetValue(filterSignature, out var addCallback))
|
||||
if (filterSignatureToEntityIDs[filterSignature].Add(entityID))
|
||||
{
|
||||
addCallback(entityID);
|
||||
if (addCallbacks.TryGetValue(filterSignature, out var addCallback))
|
||||
{
|
||||
addCallback(entityID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue