diff --git a/encompass-cs/ComponentMessageManager.cs b/encompass-cs/ComponentMessageManager.cs index 6685d07..0464b4e 100644 --- a/encompass-cs/ComponentMessageManager.cs +++ b/encompass-cs/ComponentMessageManager.cs @@ -9,7 +9,10 @@ namespace Encompass class ComponentMessageManager { private readonly Dictionary componentIDToComponent = new Dictionary(); + private readonly Dictionary componentIDToType = new Dictionary(); + private readonly Dictionary componentIDToEntityID = new Dictionary(); + private readonly Dictionary> componentMessageTypeToExistingComponentIDs = new Dictionary>(); private readonly Dictionary> componentMessageTypeToPendingComponentIDs = new Dictionary>(); private readonly Dictionary> componentMessageTypeToComponentIDs = new Dictionary>(); @@ -40,6 +43,8 @@ namespace Encompass internal void ClearMessages() { componentIDToComponent.Clear(); + componentIDToType.Clear(); + componentIDToEntityID.Clear(); foreach (var set in componentMessageTypeToExistingComponentIDs.Values) { @@ -117,7 +122,9 @@ namespace Encompass private void RegisterExistingOrPendingComponentMessage(Entity entity, Guid componentID, TComponent component) where TComponent: struct, IComponent { componentIDToComponent[componentID] = component; - + componentIDToEntityID[componentID] = entity.ID; + componentIDToType[componentID] = typeof(TComponent); + if (!componentMessageTypeToComponentIDs.ContainsKey(typeof(TComponent))) { componentMessageTypeToComponentIDs.Add(typeof(TComponent), new HashSet()); @@ -250,5 +257,20 @@ namespace Encompass { return entityToTypeToPendingComponentID.ContainsKey(entity) && entityToTypeToPendingComponentID[entity].ContainsKey(typeof(TComponent)); } + + internal IComponent GetComponentByID(Guid componentID) + { + return componentIDToComponent[componentID]; + } + + internal Type GetComponentTypeByID(Guid componentID) + { + return componentIDToType[componentID]; + } + + internal Guid GetEntityIDByComponentID(Guid componentID) + { + return componentIDToEntityID[componentID]; + } } } diff --git a/encompass-cs/Engine.cs b/encompass-cs/Engine.cs index 6ea51d0..88dce98 100644 --- a/encompass-cs/Engine.cs +++ b/encompass-cs/Engine.cs @@ -12,8 +12,8 @@ namespace Encompass internal readonly HashSet receiveTypes = new HashSet(); private EntityManager entityManager; - private ComponentManager componentManager; private MessageManager messageManager; + private ComponentManager componentManager; private ComponentMessageManager componentMessageManager; protected Engine() @@ -94,7 +94,7 @@ namespace Encompass protected Guid GetEntityIDByComponentID(Guid componentID) { - return componentManager.GetEntityIDByComponentID(componentID); + return componentMessageManager.GetEntityIDByComponentID(componentID); } protected Entity GetEntityByComponentID(Guid componentID) @@ -104,12 +104,12 @@ namespace Encompass protected TComponent GetComponentByID(Guid componentID) where TComponent : struct, IComponent { - if (componentManager.GetComponentTypeByID(componentID) != typeof(TComponent)) + if (componentMessageManager.GetComponentTypeByID(componentID) != typeof(TComponent)) { - throw new ComponentTypeMismatchException("Expected Component to be of type {0} but was actually of type {1}", typeof(TComponent).Name, componentManager.GetComponentTypeByID(componentID).Name); + throw new ComponentTypeMismatchException("Expected Component to be of type {0} but was actually of type {1}", typeof(TComponent).Name, componentMessageManager.GetComponentTypeByID(componentID).Name); } - return (TComponent)componentManager.GetComponentByID(componentID); + return (TComponent)componentMessageManager.GetComponentByID(componentID); } internal IEnumerable<(Guid, TComponent)> ReadComponentsFromWorld() where TComponent : struct, IComponent @@ -117,6 +117,11 @@ namespace Encompass return componentManager.GetComponentsByType(); } + internal Entity ReadEntityFromWorld(Guid componentID) + { + return GetEntity(componentManager.GetEntityIDByComponentID(componentID)); + } + protected Guid AddComponent(Entity entity, TComponent component) where TComponent : struct, IComponent { var componentID = componentManager.MarkComponentForAdd(entity, component); diff --git a/encompass-cs/Engines/ComponentMessageEmitter.cs b/encompass-cs/Engines/ComponentMessageEmitter.cs index 0d124fa..27bec22 100644 --- a/encompass-cs/Engines/ComponentMessageEmitter.cs +++ b/encompass-cs/Engines/ComponentMessageEmitter.cs @@ -14,7 +14,7 @@ namespace Encompass.Engines foreach (var (componentID, component) in ReadComponentsFromWorld()) { ComponentMessage componentMessage; - componentMessage.entity = GetEntityByComponentID(componentID); + componentMessage.entity = ReadEntityFromWorld(componentID); componentMessage.componentID = componentID; componentMessage.component = component; SendMessage(componentMessage);