add filter callback system
parent
e4131d58f5
commit
1438188dca
|
@ -23,5 +23,15 @@ namespace MoonTools.ECS
|
||||||
|
|
||||||
// WARNING: this WILL crash if the index is out of range!
|
// WARNING: this WILL crash if the index is out of range!
|
||||||
public Entity NthEntity(int index) => FilterStorage.FilterNthEntity(Signature, index);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,9 @@ namespace MoonTools.ECS
|
||||||
private Dictionary<FilterSignature, IndexableSet<Entity>> filterSignatureToEntityIDs = new Dictionary<FilterSignature, IndexableSet<Entity>>();
|
private Dictionary<FilterSignature, IndexableSet<Entity>> filterSignatureToEntityIDs = new Dictionary<FilterSignature, IndexableSet<Entity>>();
|
||||||
private Dictionary<int, HashSet<FilterSignature>> typeToFilterSignatures = new Dictionary<int, HashSet<FilterSignature>>();
|
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)
|
public FilterStorage(EntityStorage entityStorage, TypeIndices componentTypeIndices)
|
||||||
{
|
{
|
||||||
EntityStorage = entityStorage;
|
EntityStorage = entityStorage;
|
||||||
|
@ -116,6 +119,10 @@ namespace MoonTools.ECS
|
||||||
if (!EntityStorage.HasComponent(entityID, type))
|
if (!EntityStorage.HasComponent(entityID, type))
|
||||||
{
|
{
|
||||||
filterSignatureToEntityIDs[filterSignature].Remove(entityID);
|
filterSignatureToEntityIDs[filterSignature].Remove(entityID);
|
||||||
|
if (removeCallbacks.TryGetValue(filterSignature, out var removeCallback))
|
||||||
|
{
|
||||||
|
removeCallback(entityID);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -125,11 +132,19 @@ namespace MoonTools.ECS
|
||||||
if (EntityStorage.HasComponent(entityID, type))
|
if (EntityStorage.HasComponent(entityID, type))
|
||||||
{
|
{
|
||||||
filterSignatureToEntityIDs[filterSignature].Remove(entityID);
|
filterSignatureToEntityIDs[filterSignature].Remove(entityID);
|
||||||
|
if (removeCallbacks.TryGetValue(filterSignature, out var removeCallback))
|
||||||
|
{
|
||||||
|
removeCallback(entityID);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
filterSignatureToEntityIDs[filterSignature].Add(entityID);
|
filterSignatureToEntityIDs[filterSignature].Add(entityID);
|
||||||
|
if (addCallbacks.TryGetValue(filterSignature, out var addCallback))
|
||||||
|
{
|
||||||
|
addCallback(entityID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveEntity(int entityID, int componentTypeIndex)
|
public void RemoveEntity(int entityID, int componentTypeIndex)
|
||||||
|
@ -139,8 +154,22 @@ namespace MoonTools.ECS
|
||||||
foreach (var filterSignature in filterSignatures)
|
foreach (var filterSignature in filterSignatures)
|
||||||
{
|
{
|
||||||
filterSignatureToEntityIDs[filterSignature].Remove(entityID);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,12 +38,12 @@ namespace MoonTools.ECS
|
||||||
throw new InvalidOperationException("This entity is not valid!");
|
throw new InvalidOperationException("This entity is not valid!");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
ComponentDepot.Set<TComponent>(entity.ID, component);
|
||||||
|
|
||||||
if (EntityStorage.SetComponent(entity.ID, ComponentTypeIndices.GetIndex<TComponent>()))
|
if (EntityStorage.SetComponent(entity.ID, ComponentTypeIndices.GetIndex<TComponent>()))
|
||||||
{
|
{
|
||||||
FilterStorage.Check<TComponent>(entity.ID);
|
FilterStorage.Check<TComponent>(entity.ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
ComponentDepot.Set<TComponent>(entity.ID, component);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Template CreateTemplate()
|
public Template CreateTemplate()
|
||||||
|
|
Loading…
Reference in New Issue