add filter callback system

pull/4/head
cosmonaut 2023-01-26 16:34:15 -08:00
parent e4131d58f5
commit 1438188dca
3 changed files with 41 additions and 2 deletions

View File

@ -23,5 +23,15 @@ namespace MoonTools.ECS
// WARNING: this WILL crash if the index is out of range!
public Entity NthEntity(int index) => FilterStorage.FilterNthEntity(Signature, index);
public void RegisterAddCallback(Action<Entity> callback)
{
FilterStorage.RegisterAddCallback(Signature, callback);
}
public void RegisterRemoveCallback(Action<Entity> callback)
{
FilterStorage.RegisterRemoveCallback(Signature, callback);
}
}
}

View File

@ -10,6 +10,9 @@ namespace MoonTools.ECS
private Dictionary<FilterSignature, IndexableSet<Entity>> filterSignatureToEntityIDs = new Dictionary<FilterSignature, IndexableSet<Entity>>();
private Dictionary<int, HashSet<FilterSignature>> typeToFilterSignatures = new Dictionary<int, HashSet<FilterSignature>>();
private Dictionary<FilterSignature, Action<Entity>> addCallbacks = new Dictionary<FilterSignature, Action<Entity>>();
private Dictionary<FilterSignature, Action<Entity>> removeCallbacks = new Dictionary<FilterSignature, Action<Entity>>();
public FilterStorage(EntityStorage entityStorage, TypeIndices componentTypeIndices)
{
EntityStorage = entityStorage;
@ -116,6 +119,10 @@ namespace MoonTools.ECS
if (!EntityStorage.HasComponent(entityID, type))
{
filterSignatureToEntityIDs[filterSignature].Remove(entityID);
if (removeCallbacks.TryGetValue(filterSignature, out var removeCallback))
{
removeCallback(entityID);
}
return;
}
}
@ -125,11 +132,19 @@ namespace MoonTools.ECS
if (EntityStorage.HasComponent(entityID, type))
{
filterSignatureToEntityIDs[filterSignature].Remove(entityID);
if (removeCallbacks.TryGetValue(filterSignature, out var removeCallback))
{
removeCallback(entityID);
}
return;
}
}
filterSignatureToEntityIDs[filterSignature].Add(entityID);
if (addCallbacks.TryGetValue(filterSignature, out var addCallback))
{
addCallback(entityID);
}
}
public void RemoveEntity(int entityID, int componentTypeIndex)
@ -139,8 +154,22 @@ namespace MoonTools.ECS
foreach (var filterSignature in filterSignatures)
{
filterSignatureToEntityIDs[filterSignature].Remove(entityID);
if (removeCallbacks.TryGetValue(filterSignature, out var removeCallback))
{
removeCallback(entityID);
}
}
}
}
public void RegisterAddCallback(FilterSignature filterSignature, Action<Entity> callback)
{
addCallbacks.Add(filterSignature, callback);
}
public void RegisterRemoveCallback(FilterSignature filterSignature, Action<Entity> callback)
{
removeCallbacks.Add(filterSignature, callback);
}
}
}

View File

@ -38,12 +38,12 @@ namespace MoonTools.ECS
throw new InvalidOperationException("This entity is not valid!");
}
#endif
ComponentDepot.Set<TComponent>(entity.ID, component);
if (EntityStorage.SetComponent(entity.ID, ComponentTypeIndices.GetIndex<TComponent>()))
{
FilterStorage.Check<TComponent>(entity.ID);
}
ComponentDepot.Set<TComponent>(entity.ID, component);
}
public Template CreateTemplate()