using System; using System.Collections.Generic; using System.Linq; namespace Encompass { internal class ComponentManager { private Dictionary> entityIDToComponents = new Dictionary>(); private Dictionary> activeComponents = new Dictionary>(); private Dictionary> inactiveComponents = new Dictionary>(); private List componentsToActivate = new List(); private List componentsToDeactivate = new List(); private List componentsToRemove = new List(); internal TComponent CreateComponent(uint entityID) where TComponent : Component, new() { var component = new TComponent(); if (!entityIDToComponents.ContainsKey(entityID)) { entityIDToComponents.Add(entityID, new List()); } entityIDToComponents[entityID].Add(component); if (!activeComponents.ContainsKey(typeof(TComponent))) { activeComponents.Add(typeof(TComponent), new List()); inactiveComponents.Add(typeof(TComponent), new List()); } MarkForActivation(component); return component; } internal IEnumerable GetComponentsByEntity(uint entityID) { return entityIDToComponents[entityID]; } internal IEnumerable GetActiveComponentsByType() where TComponent : Component { return activeComponents[typeof(TComponent)].Cast(); } internal IEnumerable GetComponentsByEntityAndType(uint entityID) where TComponent : Component { var entity_components = GetComponentsByEntity(entityID); var active_components_by_type = GetActiveComponentsByType(); return entity_components.Intersect(active_components_by_type).Cast(); } internal bool EntityHasComponentOfType(uint entityID) where TComponent : Component { return GetComponentsByEntityAndType(entityID).Any(); } internal void RemoveAllComponentsFromEntity(uint entityID) { var components = GetComponentsByEntity(entityID); foreach (var component in components) { activeComponents[component.GetType()].Remove(component); inactiveComponents[component.GetType()].Remove(component); } entityIDToComponents.Remove(entityID); } internal void MarkForActivation(Component component) { componentsToActivate.Add(component); } internal void MarkForRemoval(Component component) { componentsToRemove.Add(component); } internal void ActivateComponents() { foreach (var component in componentsToActivate) { activeComponents[component.GetType()].Add(component); inactiveComponents[component.GetType()].Remove(component); } componentsToActivate.Clear(); } internal void RemoveComponents() { foreach (var component in componentsToRemove) { activeComponents[component.GetType()].Remove(component); inactiveComponents[component.GetType()].Remove(component); } componentsToRemove.Clear(); } } }