diff --git a/encompass-cs/ComponentManager.cs b/encompass-cs/ComponentManager.cs index 7884881..360712b 100644 --- a/encompass-cs/ComponentManager.cs +++ b/encompass-cs/ComponentManager.cs @@ -14,6 +14,8 @@ namespace Encompass private readonly Dictionary> entityIDToComponentIDs = new Dictionary>(); private readonly Dictionary componentIDToEntityID = new Dictionary(); + private readonly Dictionary>> entityIDToComponentTypeToComponentIDs = new Dictionary>>(); + private readonly Dictionary> typeToComponentIDs = new Dictionary>(); private readonly HashSet componentsMarkedForRemoval = new HashSet(); @@ -38,6 +40,7 @@ namespace Encompass internal void RegisterEntity(Guid entityID) { entityIDToComponentIDs.Add(entityID, new HashSet()); + entityIDToComponentTypeToComponentIDs.Add(entityID, new Dictionary>()); } internal Guid NextID() @@ -58,6 +61,11 @@ namespace Encompass typeToComponentIDs[typeof(TComponent)].Add(componentID); entityIDToComponentIDs[entity.ID].Add(componentID); + if (!entityIDToComponentTypeToComponentIDs[entity.ID].ContainsKey(typeof(TComponent))) { + entityIDToComponentTypeToComponentIDs[entity.ID].Add(typeof(TComponent), new HashSet()); + } + entityIDToComponentTypeToComponentIDs[entity.ID][typeof(TComponent)].Add(componentID); + componentIDToEntityID[componentID] = entity.ID; entitiesWithAddedComponents.Add(entity.ID); @@ -100,16 +108,16 @@ namespace Encompass internal IEnumerable> GetComponentsByEntityAndType(Guid entityID) where TComponent : struct, IComponent { - var entityComponentsByType = GetComponentsByEntity(entityID).Where((pair) => componentIDToType[pair.Item1] == typeof(TComponent)).Select((pair) => new ValueTuple(pair.Item1, (TComponent)pair.Item2)); - var activeComponentsByType = GetComponentsByType(); - return activeComponentsByType.Select((triple) => (triple.Item2, triple.Item3)).Intersect(entityComponentsByType); + return entityIDToComponentTypeToComponentIDs[entityID].ContainsKey(typeof(TComponent)) ? + entityIDToComponentTypeToComponentIDs[entityID][typeof(TComponent)].Select(id => (id, (TComponent)GetComponentByID(id))) : + Enumerable.Empty<(Guid, TComponent)>(); } internal IEnumerable> GetComponentsByEntityAndType(Guid entityID, Type type) { - var entityComponents = GetComponentsByEntity(entityID); - var activeComponentsByType = GetComponentsByType(type); - return entityComponents.Intersect(activeComponentsByType); + return entityIDToComponentTypeToComponentIDs[entityID].ContainsKey(type) ? + entityIDToComponentTypeToComponentIDs[entityID][type].Select(id => (id, GetComponentByID(id))) : + Enumerable.Empty<(Guid, IComponent)>(); } internal IEnumerable GetAllComponentTypesOfEntity(Guid entityID) @@ -209,6 +217,7 @@ namespace Encompass public void RegisterDestroyedEntity(Guid entityID) { entityIDToComponentIDs.Remove(entityID); + entityIDToComponentTypeToComponentIDs.Remove(entityID); } } }