diff --git a/encompass-cs/ComponentManager.cs b/encompass-cs/ComponentManager.cs index cac8503..2b7119b 100644 --- a/encompass-cs/ComponentManager.cs +++ b/encompass-cs/ComponentManager.cs @@ -69,6 +69,7 @@ namespace Encompass return componentID; } + internal IEnumerable GetComponentIDsByEntityID(Guid entityID) { HashSet idSet; @@ -201,10 +202,7 @@ namespace Encompass { entityIDToComponentIDs.Remove(entityID); - foreach (var pooledDictionary in entityIDToComponentTypeToComponentIDs.Values) - { - pooledDictionary.Dispose(); - } + entityIDToComponentTypeToComponentIDs[entityID].Dispose(); entityIDToComponentTypeToComponentIDs.Remove(entityID); } } diff --git a/encompass-cs/ComponentMessageManager.cs b/encompass-cs/ComponentMessageManager.cs index c2e828f..df1fca2 100644 --- a/encompass-cs/ComponentMessageManager.cs +++ b/encompass-cs/ComponentMessageManager.cs @@ -17,6 +17,25 @@ namespace Encompass private readonly Dictionary>> entityToTypeToPendingComponentIDs = new Dictionary>>(); private readonly Dictionary>> entityToTypeToComponentIDs = new Dictionary>>(); + internal void RegisterEntity(Entity entity) + { + entityToTypeToComponentIDs[entity] = new PooledDictionary>(); + entityToTypeToPendingComponentIDs[entity] = new PooledDictionary>(); + entityToTypeToExistingComponentIDs[entity] = new PooledDictionary>(); + } + + internal void RegisterDestroyedEntity(Entity entity) + { + entityToTypeToComponentIDs[entity].Dispose(); + entityToTypeToComponentIDs.Remove(entity); + + entityToTypeToPendingComponentIDs[entity].Dispose(); + entityToTypeToPendingComponentIDs.Remove(entity); + + entityToTypeToExistingComponentIDs[entity].Dispose(); + entityToTypeToExistingComponentIDs.Remove(entity); + } + internal void ClearMessages() { componentIDToComponent.Clear(); @@ -61,27 +80,6 @@ namespace Encompass } } - internal void RegisterDestroyedEntity(Entity entity) - { - foreach (var pooledDictionary in entityToTypeToComponentIDs.Values) - { - pooledDictionary.Dispose(); - } - entityToTypeToComponentIDs.Remove(entity); - - foreach (var pooledDictionary in entityToTypeToPendingComponentIDs.Values) - { - pooledDictionary.Dispose(); - } - entityToTypeToPendingComponentIDs.Remove(entity); - - foreach (var pooledDictionary in entityToTypeToExistingComponentIDs.Values) - { - pooledDictionary.Dispose(); - } - entityToTypeToExistingComponentIDs.Remove(entity); - } - internal void AddExistingComponentMessage(ComponentMessage componentMessage) where TComponent : struct, IComponent { RegisterExistingOrPendingComponentMessage(componentMessage.entity, componentMessage.componentID, componentMessage.component); @@ -93,10 +91,6 @@ namespace Encompass componentMessageTypeToExistingComponentIDs[typeof(TComponent)].Add(componentMessage.componentID); - if (!entityToTypeToExistingComponentIDs.ContainsKey(componentMessage.entity)) - { - entityToTypeToExistingComponentIDs.Add(componentMessage.entity, new PooledDictionary>()); - } if (!entityToTypeToExistingComponentIDs[componentMessage.entity].ContainsKey(typeof(TComponent))) { entityToTypeToExistingComponentIDs[componentMessage.entity].Add(typeof(TComponent), new HashSet()); @@ -116,10 +110,6 @@ namespace Encompass componentMessageTypeToPendingComponentIDs[typeof(TComponent)].Add(pendingComponentMessage.componentID); - if (!entityToTypeToPendingComponentIDs.ContainsKey(pendingComponentMessage.entity)) - { - entityToTypeToPendingComponentIDs.Add(pendingComponentMessage.entity, new PooledDictionary>()); - } if (!entityToTypeToPendingComponentIDs[pendingComponentMessage.entity].ContainsKey(typeof(TComponent))) { entityToTypeToPendingComponentIDs[pendingComponentMessage.entity].Add(typeof(TComponent), new HashSet()); @@ -138,10 +128,6 @@ namespace Encompass } componentMessageTypeToComponentIDs[typeof(TComponent)].Add(componentID); - if (!entityToTypeToComponentIDs.ContainsKey(entity)) - { - entityToTypeToComponentIDs.Add(entity, new PooledDictionary>()); - } if (!entityToTypeToComponentIDs[entity].ContainsKey(typeof(TComponent))) { entityToTypeToComponentIDs[entity].Add(typeof(TComponent), new HashSet()); diff --git a/encompass-cs/DrawLayerManager.cs b/encompass-cs/DrawLayerManager.cs index d6082dc..e8f3418 100644 --- a/encompass-cs/DrawLayerManager.cs +++ b/encompass-cs/DrawLayerManager.cs @@ -78,6 +78,7 @@ namespace Encompass var layer = componentIDToLayerIndex[id]; layerIndexToComponentIDs[layer].Remove(id); } + componentIDToLayerIndex.Remove(id); } public void AdjustComponentLayer(Guid id, int layer) diff --git a/encompass-cs/Engine.cs b/encompass-cs/Engine.cs index e8884d0..f61b9f4 100644 --- a/encompass-cs/Engine.cs +++ b/encompass-cs/Engine.cs @@ -140,7 +140,7 @@ namespace Encompass { var componentID = componentManager.NextID(); - componentManager.AddDrawComponent(entity, componentID, component); + componentManager.AddDrawComponent(entity, componentID, component, layer); if (sendTypes.Contains(typeof(PendingComponentMessage))) { diff --git a/encompass-cs/EntityManager.cs b/encompass-cs/EntityManager.cs index 87f4b77..107918f 100644 --- a/encompass-cs/EntityManager.cs +++ b/encompass-cs/EntityManager.cs @@ -24,6 +24,7 @@ namespace Encompass var entity = new Entity(id); IDToEntity[id] = entity; componentManager.RegisterEntity(id); + componentMessageManager.RegisterEntity(entity); return entity; } diff --git a/test/EngineTest.cs b/test/EngineTest.cs index 215ad7c..a9b0d54 100644 --- a/test/EngineTest.cs +++ b/test/EngineTest.cs @@ -438,14 +438,14 @@ namespace Tests } } - static IEnumerable> results; + static List<(Guid, MockComponent)> results; [Reads(typeof(MockComponent))] class ReaderEngine : Engine { public override void Update(double dt) { - results = ReadComponents(); + results = ReadComponents().ToList(); } } @@ -458,6 +458,7 @@ namespace Tests var entity = worldBuilder.CreateEntity(); var entityB = worldBuilder.CreateEntity(); + var entityC = worldBuilder.CreateEntity(); DestroyerComponent destroyerComponent; MockComponent mockComponent; @@ -470,12 +471,16 @@ namespace Tests worldBuilder.AddComponent(entityB, destroyerComponent); var componentBID = worldBuilder.AddComponent(entityB, mockComponent); + var componentCID = worldBuilder.AddComponent(entityC, mockComponent); + var world = worldBuilder.Build(); - world.Update(0.01f); + world.Update(0.01); + world.Update(0.01); Assert.That(results, Does.Not.Contain((componentID, mockComponent))); Assert.That(results, Does.Not.Contain((componentBID, mockComponent))); + Assert.That(results, Does.Contain((componentCID, mockComponent))); } [Reads(typeof(DestroyerComponent), typeof(MockComponent))] diff --git a/test/OrderedRendererTest.cs b/test/OrderedRendererTest.cs index e5ec692..84f3870 100644 --- a/test/OrderedRendererTest.cs +++ b/test/OrderedRendererTest.cs @@ -64,5 +64,38 @@ namespace Tests Assert.IsTrue(calledOnDraw); resultComponent.Should().BeEquivalentTo((testDrawComponentID, testDrawComponent)); } + + [Reads(typeof(TestDrawComponent))] + class DestroyerEngine : Engine + { + public override void Update(double dt) + { + foreach (var (componentID, component) in ReadComponents()) + { + Destroy(GetEntityIDByComponentID(componentID)); + } + } + } + [Test] + public void RenderMethodNotCalledAfterDestroy() + { + calledOnDraw = false; + + var worldBuilder = new WorldBuilder(); + worldBuilder.AddEngine(new DestroyerEngine()); + var renderer = worldBuilder.AddOrderedRenderer(new CalledRenderer()); + + TestDrawComponent testDrawComponent; + + var entity = worldBuilder.CreateEntity(); + var testDrawComponentID = worldBuilder.AddDrawComponent(entity, testDrawComponent, 1); + + var world = worldBuilder.Build(); + + world.Update(0.01); + world.Draw(); + + Assert.IsFalse(calledOnDraw); + } } }