From 63e9ca63c036902105457bc0d2714269c4ad14d4 Mon Sep 17 00:00:00 2001 From: Evan Hemsley Date: Fri, 20 Mar 2020 00:58:33 -0700 Subject: [PATCH] get rid of component stores on DrawLayerManager --- encompass-cs/Collections/ComponentStore.cs | 19 ------- .../Collections/TypedComponentStore.cs | 9 ---- encompass-cs/ComponentManager.cs | 4 +- encompass-cs/DrawLayerManager.cs | 52 ++++++++----------- encompass-cs/Engine.cs | 4 +- encompass-cs/RenderManager.cs | 8 +-- encompass-cs/Renderers/OrderedRenderer.cs | 4 +- encompass-cs/WorldBuilder.cs | 6 +-- 8 files changed, 36 insertions(+), 70 deletions(-) diff --git a/encompass-cs/Collections/ComponentStore.cs b/encompass-cs/Collections/ComponentStore.cs index 3a65abe..8f34731 100644 --- a/encompass-cs/Collections/ComponentStore.cs +++ b/encompass-cs/Collections/ComponentStore.cs @@ -14,14 +14,6 @@ namespace Encompass ComponentBitSet = new ComponentBitSet(typeToIndex); } - public IEnumerable<(Type, TypedComponentStore)> StoresEnumerable() - { - foreach (var entry in _stores) - { - yield return (entry.Key, entry.Value); - } - } - public virtual void RegisterComponentType() where TComponent : struct, IComponent { if (!_stores.ContainsKey(typeof(TComponent))) @@ -102,17 +94,6 @@ namespace Encompass return Lookup().Count > 0; } - public IEnumerable<(int, Type, IComponent)> AllInterfaceTyped() - { - foreach (var store in _stores.Values) - { - foreach (var thing in store.AllInterfaceTyped()) - { - yield return thing; - } - } - } - public IEnumerable<(TComponent, int)> All() where TComponent : struct, IComponent { return Lookup().All(); diff --git a/encompass-cs/Collections/TypedComponentStore.cs b/encompass-cs/Collections/TypedComponentStore.cs index 9f3c9af..3f41e56 100644 --- a/encompass-cs/Collections/TypedComponentStore.cs +++ b/encompass-cs/Collections/TypedComponentStore.cs @@ -7,7 +7,6 @@ namespace Encompass internal abstract class TypedComponentStore { public abstract int Count { get; } - public abstract IEnumerable<(int, Type, IComponent)> AllInterfaceTyped(); public abstract bool Has(int entity); public abstract bool Remove(int entity, int priority); public abstract void ForceRemove(int entity); @@ -107,13 +106,5 @@ namespace Encompass yield return (_components[kvp.Value], kvp.Key); } } - - public override IEnumerable<(int, Type, IComponent)> AllInterfaceTyped() - { - foreach (var kvp in _indices) - { - yield return (kvp.Key, typeof(TComponent), (IComponent)_components[kvp.Value]); - } - } } } diff --git a/encompass-cs/ComponentManager.cs b/encompass-cs/ComponentManager.cs index 1e7aa8c..928c9a0 100644 --- a/encompass-cs/ComponentManager.cs +++ b/encompass-cs/ComponentManager.cs @@ -47,9 +47,9 @@ namespace Encompass _upToDateComponentStore.SwapWith(componentStore); } - internal void RegisterDrawableComponent(int entityID, TComponent component, int layer) where TComponent : struct, IComponent + internal void RegisterDrawableComponent(int entityID, int layer) where TComponent : struct, IComponent { - _drawLayerManager.RegisterComponentWithLayer(entityID, component, layer); + _drawLayerManager.RegisterComponentWithLayer(entityID, layer); } internal void WriteComponents() diff --git a/encompass-cs/DrawLayerManager.cs b/encompass-cs/DrawLayerManager.cs index 32bdec3..b8b8653 100644 --- a/encompass-cs/DrawLayerManager.cs +++ b/encompass-cs/DrawLayerManager.cs @@ -9,16 +9,14 @@ namespace Encompass { private readonly SortedList _layerOrder = new SortedList(); - private readonly Dictionary _layerIndexToComponentStore = new Dictionary(512); + private readonly Dictionary>> _layerIndexToComponentStore = new Dictionary>>(); private readonly Dictionary> _layerIndexToGeneralRenderers = new Dictionary>(512); private readonly Dictionary> _typeToEntityToLayer = new Dictionary>(512); - private readonly Dictionary _typeToIndex; public IEnumerable LayerOrder { get { return _layerOrder.Values; } } - public DrawLayerManager(Dictionary typeToIndex) + public DrawLayerManager() { - _typeToIndex = typeToIndex; RegisterDrawLayer(0); } @@ -28,7 +26,7 @@ namespace Encompass { _layerOrder.Add(layer, layer); _layerIndexToGeneralRenderers.Add(layer, new HashSet()); - _layerIndexToComponentStore.Add(layer, new ComponentStore(_typeToIndex)); + _layerIndexToComponentStore.Add(layer, new Dictionary>()); } } @@ -41,7 +39,10 @@ namespace Encompass foreach (var pair in _layerIndexToComponentStore) { - pair.Value.RegisterComponentType(); + if (!pair.Value.ContainsKey(typeof(TComponent))) + { + pair.Value.Add(typeof(TComponent), new HashSet()); + } } } @@ -52,21 +53,7 @@ namespace Encompass set.Add(renderer); } - public void UnregisterGeneralRendererWithLayer(GeneralRenderer renderer, int layer) - { - if (_layerIndexToGeneralRenderers.ContainsKey(layer)) - { - _layerIndexToGeneralRenderers[layer].Remove(renderer); - } - } - - public void AdjustRendererLayer(GeneralRenderer renderer, int oldLayer, int newLayer) - { - UnregisterGeneralRendererWithLayer(renderer, oldLayer); - RegisterGeneralRendererWithLayer(renderer, newLayer); - } - - public void RegisterComponentWithLayer(int entityID, TComponent component, int layer) where TComponent : struct, IComponent + public void RegisterComponentWithLayer(int entityID, int layer) where TComponent : struct, IComponent { if (!_layerIndexToComponentStore.ContainsKey(layer)) { @@ -75,8 +62,8 @@ namespace Encompass if (_typeToEntityToLayer[typeof(TComponent)].ContainsKey(entityID)) { UnRegisterComponentWithLayer(entityID); } - var set = _layerIndexToComponentStore[layer]; - set.Set(entityID, component); + var set = _layerIndexToComponentStore[layer][typeof(TComponent)]; + set.Add(entityID); _typeToEntityToLayer[typeof(TComponent)].Add(entityID, layer); } @@ -88,7 +75,7 @@ namespace Encompass if (_typeToEntityToLayer[typeof(TComponent)].ContainsKey(entityID)) { var layer = _typeToEntityToLayer[typeof(TComponent)][entityID]; - _layerIndexToComponentStore[layer].ForceRemove(entityID); + _layerIndexToComponentStore[layer][typeof(TComponent)].Remove(entityID); } _typeToEntityToLayer[typeof(TComponent)].Remove(entityID); } @@ -97,7 +84,10 @@ namespace Encompass { foreach (var store in _layerIndexToComponentStore.Values) { - store.Remove(entityID); + foreach (var set in store.Values) + { + set.Remove(entityID); + } } } @@ -108,11 +98,15 @@ namespace Encompass Enumerable.Empty(); } - public IEnumerable<(int, Type, IComponent)> AllInLayer(int layer) + public IEnumerable<(int, Type)> AllInLayer(int layer) { - return _layerIndexToComponentStore.ContainsKey(layer) ? - _layerIndexToComponentStore[layer].AllInterfaceTyped() : - Enumerable.Empty<(int, Type, IComponent)>(); + foreach (var kvp in _layerIndexToComponentStore[layer]) + { + foreach (var id in kvp.Value) + { + yield return (id, kvp.Key); + } + } } } } diff --git a/encompass-cs/Engine.cs b/encompass-cs/Engine.cs index c371b50..91b97b7 100644 --- a/encompass-cs/Engine.cs +++ b/encompass-cs/Engine.cs @@ -474,7 +474,7 @@ namespace Encompass if (written && component is IDrawableComponent drawableComponent) { - _componentManager.RegisterDrawableComponent(entity.ID, component, drawableComponent.Layer); + _componentManager.RegisterDrawableComponent(entity.ID, drawableComponent.Layer); } } @@ -505,7 +505,7 @@ namespace Encompass if (component is IDrawableComponent drawableComponent) { - _componentManager.RegisterDrawableComponent(entity.ID, component, drawableComponent.Layer); + _componentManager.RegisterDrawableComponent(entity.ID, drawableComponent.Layer); } } diff --git a/encompass-cs/RenderManager.cs b/encompass-cs/RenderManager.cs index 6469c2f..3f603b4 100644 --- a/encompass-cs/RenderManager.cs +++ b/encompass-cs/RenderManager.cs @@ -8,7 +8,7 @@ namespace Encompass private readonly EntityManager _entityManager; private readonly DrawLayerManager _drawLayerManager; - private readonly Dictionary> _drawComponentTypeToOrderedRenderer = new Dictionary>(256); + private readonly Dictionary> _drawComponentTypeToOrderedRenderer = new Dictionary>(256); public RenderManager(EntityManager entityManager, DrawLayerManager drawLayerManager) { @@ -16,7 +16,7 @@ namespace Encompass _drawLayerManager = drawLayerManager; } - public void RegisterOrderedRenderer(Action renderAction) where TComponent : struct, IComponent + public void RegisterOrderedRenderer(Action renderAction) where TComponent : struct, IComponent { _drawComponentTypeToOrderedRenderer.Add(typeof(TComponent), renderAction); _drawLayerManager.RegisterOrderedDrawable(); @@ -33,12 +33,12 @@ namespace Encompass { var generalRendererSet = _drawLayerManager.GeneralRenderersByLayer(layer); - foreach (var (entityID, componentType, component) in _drawLayerManager.AllInLayer(layer)) + foreach (var (entityID, componentType) in _drawLayerManager.AllInLayer(layer)) { if (_drawComponentTypeToOrderedRenderer.ContainsKey(componentType)) { var internalRenderAction = _drawComponentTypeToOrderedRenderer[componentType]; - internalRenderAction(_entityManager.GetEntity(entityID), component); + internalRenderAction(_entityManager.GetEntity(entityID)); } } diff --git a/encompass-cs/Renderers/OrderedRenderer.cs b/encompass-cs/Renderers/OrderedRenderer.cs index 20ca636..cfeb73b 100644 --- a/encompass-cs/Renderers/OrderedRenderer.cs +++ b/encompass-cs/Renderers/OrderedRenderer.cs @@ -9,9 +9,9 @@ namespace Encompass { public abstract void Render(Entity entity, TComponent drawComponent); - internal void InternalRender(Entity entity, IComponent component) + internal void InternalRender(Entity entity) { - Render(entity, (TComponent)component); + Render(entity, GetComponent(entity)); } } } diff --git a/encompass-cs/WorldBuilder.cs b/encompass-cs/WorldBuilder.cs index bdb9ee1..ad8a5ba 100644 --- a/encompass-cs/WorldBuilder.cs +++ b/encompass-cs/WorldBuilder.cs @@ -45,7 +45,7 @@ namespace Encompass public WorldBuilder(int entityCapacity = 32768) { _entityCapacity = entityCapacity; - _drawLayerManager = new DrawLayerManager(_typeToIndex); + _drawLayerManager = new DrawLayerManager(); _timeManager = new TimeManager(); _trackingManager = new TrackingManager(); _componentManager = new ComponentManager(_drawLayerManager, _typeToIndex); @@ -92,7 +92,7 @@ namespace Encompass if (component is IDrawableComponent drawableComponent) { - _componentManager.RegisterDrawableComponent(entity.ID, component, drawableComponent.Layer); + _componentManager.RegisterDrawableComponent(entity.ID, drawableComponent.Layer); _drawLayerManager.RegisterOrderedDrawable(); } } @@ -406,7 +406,7 @@ namespace Encompass { var dummyTimeManager = new TimeManager(); var dummyMessageManager = new MessageManager(dummyTimeManager); - var dummyDrawLayerManager = new DrawLayerManager(_typeToIndex); + var dummyDrawLayerManager = new DrawLayerManager(); var dummyTrackingManager = new TrackingManager(); var dummyComponentManager = new ComponentManager(dummyDrawLayerManager, _typeToIndex); var dummyEntityManager = new EntityManager(dummyComponentManager, _entityCapacity);