world transfer determinism

pull/5/head
cosmonaut 2023-10-10 11:59:28 -07:00
parent 1ef141422c
commit a2a81bf477
4 changed files with 36 additions and 16 deletions

View File

@ -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

View File

@ -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];
}

View File

@ -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))

View File

@ -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);
}
}
}