using System; using System.Collections.Generic; namespace Encompass { internal class ComponentManager { private readonly DrawLayerManager drawLayerManager; private readonly ComponentUpdateManager componentUpdateManager; private readonly ComponentStore componentStore; private readonly HashSet entitiesMarkedForRemoval = new HashSet(); internal ComponentBitSet ComponentBitSet { get { return componentStore.ComponentBitSet; } } public ComponentManager(DrawLayerManager drawLayerManager, ComponentUpdateManager componentUpdateManager, Dictionary typeToIndex) { this.drawLayerManager = drawLayerManager; this.componentUpdateManager = componentUpdateManager; componentStore = new ComponentStore(typeToIndex); } public void RegisterComponentType() where TComponent : struct, IComponent { componentStore.RegisterComponentType(); } internal void SetComponentStore(ComponentStore componentStore) { this.componentStore.SwapWith(componentStore); } internal void RegisterDrawableComponent(Entity entity, TComponent component, int layer) where TComponent : struct, IComponent { drawLayerManager.RegisterComponentWithLayer(entity.ID, component, layer); } internal void AddComponent(Entity entity, TComponent component) where TComponent : struct, IComponent { componentStore.Set(entity.ID, component); } internal void WriteComponents() { componentStore.SwapWith(componentUpdateManager.UpToDateComponentStore); } internal IEnumerable<(TComponent, int)> GetComponentsIncludingEntity() where TComponent : struct, IComponent { return componentStore.All(); } internal IEnumerable GetComponentsByType() where TComponent : struct, IComponent { foreach (var pair in componentStore.All()) { yield return pair.Item1; } } internal TComponent GetComponentByEntityAndType(Entity entity) where TComponent : struct, IComponent { return componentStore.Get(entity.ID); } internal bool EntityHasComponentOfType(Entity entity) where TComponent : struct, IComponent { return componentStore.Has(entity.ID); } internal bool ComponentOfTypeExists() where TComponent : struct, IComponent { return componentStore.Any(); } internal void MarkAllComponentsOnEntityForRemoval(Entity entity) { entitiesMarkedForRemoval.Add(entity.ID); } internal void RemoveMarkedComponents() { foreach (var entityID in entitiesMarkedForRemoval) { componentStore.Remove(entityID); drawLayerManager.UnRegisterEntityWithLayer(entityID); } entitiesMarkedForRemoval.Clear(); } public bool RemoveImmediate(Entity entity, int priority) where TComponent : struct, IComponent { if (componentUpdateManager.RemoveImmediate(entity, priority)) { drawLayerManager.UnRegisterComponentWithLayer(entity.ID); return true; } return false; } public void Remove(Entity entity, int priority) where TComponent : struct, IComponent { if (componentUpdateManager.Remove(entity, priority)) { drawLayerManager.UnRegisterComponentWithLayer(entity.ID); } } } }