diff --git a/encompass-cs/Collections/ComponentDeltaStore.cs b/encompass-cs/Collections/ComponentDeltaStore.cs index 9b212d0..d59d97a 100644 --- a/encompass-cs/Collections/ComponentDeltaStore.cs +++ b/encompass-cs/Collections/ComponentDeltaStore.cs @@ -3,39 +3,43 @@ using System.Collections.Generic; namespace Encompass { - internal class ComponentDeltaStore : ComponentStore + internal class ComponentDeltaStore { + private readonly ComponentStore _store; private readonly Dictionary _replayers = new Dictionary(); private readonly HashSet _currentReplayers = new HashSet(); public IEnumerable CurrentReplayers { get { return _currentReplayers; } } - public ComponentDeltaStore(Dictionary typeToIndex) : base(typeToIndex) + public ComponentDeltaStore(Dictionary typeToIndex) { + _store = new ComponentStore(typeToIndex); } - public override void RegisterComponentType() + public void RegisterComponentType() where TComponent : struct { - base.RegisterComponentType(); + _store.RegisterComponentType(); if (!_replayers.ContainsKey(typeof(TComponent))) { _replayers.Add(typeof(TComponent), new Replayer(this)); } } - public override void Set(int entityID, TComponent component) + public void Set(int entityID, TComponent component) where TComponent : struct { - base.Set(entityID, component); + _store.Set(entityID, component); + RegisterComponentType(); var replayer = _replayers[typeof(TComponent)]; _currentReplayers.Add(replayer); replayer.UnMarkRemoval(entityID); } - public override bool Set(int entityID, TComponent component, int priority) + public bool Set(int entityID, TComponent component, int priority) where TComponent : struct { - var result = base.Set(entityID, component, priority); + var result = _store.Set(entityID, component, priority); if (result) { + RegisterComponentType(); var replayer = _replayers[typeof(TComponent)]; _currentReplayers.Add(replayer); replayer.UnMarkRemoval(entityID); @@ -43,9 +47,9 @@ namespace Encompass return result; } - public override bool Remove(int entityID, int priority) + public bool Remove(int entityID, int priority) where TComponent : struct { - var result = base.Remove(entityID, priority); + var result = _store.Remove(entityID, priority); if (result) { var replayer = _replayers[typeof(TComponent)]; @@ -55,18 +59,23 @@ namespace Encompass return result; } - public override void Remove(int entityID) + public void Remove(int entityID) { - base.Remove(entityID); + _store.Remove(entityID); foreach (var replayer in CurrentReplayers) { replayer.MarkRemoval(entityID); } } - public override void ClearAll() + public IEnumerable<(TComponent, int)> All() where TComponent : struct { - base.ClearAll(); + return _store.All(); + } + + public void ClearAll() + { + _store.ClearAll(); foreach (var replayer in _currentReplayers) { replayer.Clear(); diff --git a/encompass-cs/Collections/ComponentStore.cs b/encompass-cs/Collections/ComponentStore.cs index 719180d..a0fbcb0 100644 --- a/encompass-cs/Collections/ComponentStore.cs +++ b/encompass-cs/Collections/ComponentStore.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; namespace Encompass { - internal class ComponentStore + internal sealed class ComponentStore { private Dictionary _stores = new Dictionary(512); public ComponentBitSet ComponentBitSet { get; private set; } @@ -16,7 +16,7 @@ namespace Encompass ComponentBitSet = new ComponentBitSet(typeToIndex); } - public virtual void RegisterComponentType() where TComponent : struct + public void RegisterComponentType() where TComponent : struct { if (!_stores.ContainsKey(typeof(TComponent))) { @@ -53,13 +53,13 @@ namespace Encompass return ref Lookup().Get(entityID); } - public virtual void Set(int entityID, TComponent component) where TComponent : struct + public void Set(int entityID, TComponent component) where TComponent : struct { Lookup().Set(entityID, component); ComponentBitSet.Set(entityID); } - public virtual bool Set(int entityID, TComponent component, int priority) where TComponent : struct + public bool Set(int entityID, TComponent component, int priority) where TComponent : struct { if (Lookup().Set(entityID, component, priority)) { @@ -69,7 +69,7 @@ namespace Encompass return false; } - public virtual bool Remove(int entityID, int priority) where TComponent : struct + public bool Remove(int entityID, int priority) where TComponent : struct { if (Lookup().Remove(entityID, priority)) { @@ -85,7 +85,7 @@ namespace Encompass ComponentBitSet.RemoveComponent(entityID); } - public virtual void Remove(int entityID) + public void Remove(int entityID) { foreach (var entry in _stores.Values) { @@ -109,7 +109,7 @@ namespace Encompass Lookup().Clear(); } - public virtual void ClearAllPriorities() + public void ClearAllPriorities() { foreach (var store in _stores.Values) { @@ -117,7 +117,7 @@ namespace Encompass } } - public virtual void ClearAll() + public void ClearAll() { ComponentBitSet.Clear(); foreach (var store in _stores.Values) diff --git a/encompass-cs/DrawLayerManager.cs b/encompass-cs/DrawLayerManager.cs index 71eaec0..571ac20 100644 --- a/encompass-cs/DrawLayerManager.cs +++ b/encompass-cs/DrawLayerManager.cs @@ -60,12 +60,25 @@ namespace Encompass throw new UndefinedLayerException("Layer {0} is not defined. Use WorldBuilder.RegisterDrawLayer to register the layer.", layer); } - if (_typeToEntityToLayer[typeof(TComponent)].ContainsKey(entityID)) { UnRegisterComponentWithLayer(entityID); } + if (_typeToEntityToLayer[typeof(TComponent)].ContainsKey(entityID)) + { + if (_typeToEntityToLayer[typeof(TComponent)][entityID] != layer) + { + UnRegisterComponentWithLayer(entityID); - var set = _layerIndexToTypeToID[layer][typeof(TComponent)]; - set.Add(entityID); + var set = _layerIndexToTypeToID[layer][typeof(TComponent)]; + set.Add(entityID); - _typeToEntityToLayer[typeof(TComponent)].Add(entityID, layer); + _typeToEntityToLayer[typeof(TComponent)].Add(entityID, layer); + } + } + else + { + var set = _layerIndexToTypeToID[layer][typeof(TComponent)]; + set.Add(entityID); + + _typeToEntityToLayer[typeof(TComponent)].Add(entityID, layer); + } } public void UnRegisterComponentWithLayer(int entityID) where TComponent : struct