accidentally destroyed every pooled dictionary when an entity was destroyed LOOOL
							parent
							
								
									fa27ed850a
								
							
						
					
					
						commit
						dbe6cc4f53
					
				|  | @ -69,6 +69,7 @@ namespace Encompass | |||
|             return componentID; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         internal IEnumerable<Guid> GetComponentIDsByEntityID(Guid entityID) | ||||
|         { | ||||
|             HashSet<Guid> idSet; | ||||
|  | @ -201,10 +202,7 @@ namespace Encompass | |||
|         { | ||||
|             entityIDToComponentIDs.Remove(entityID); | ||||
| 
 | ||||
|             foreach (var pooledDictionary in entityIDToComponentTypeToComponentIDs.Values) | ||||
|             { | ||||
|                 pooledDictionary.Dispose(); | ||||
|             } | ||||
|             entityIDToComponentTypeToComponentIDs[entityID].Dispose(); | ||||
|             entityIDToComponentTypeToComponentIDs.Remove(entityID); | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -17,6 +17,25 @@ namespace Encompass | |||
|         private readonly Dictionary<Entity, PooledDictionary<Type, HashSet<Guid>>> entityToTypeToPendingComponentIDs = new Dictionary<Entity, PooledDictionary<Type, HashSet<Guid>>>(); | ||||
|         private readonly Dictionary<Entity, PooledDictionary<Type, HashSet<Guid>>> entityToTypeToComponentIDs = new Dictionary<Entity, PooledDictionary<Type, HashSet<Guid>>>(); | ||||
| 
 | ||||
|         internal void RegisterEntity(Entity entity) | ||||
|         { | ||||
|             entityToTypeToComponentIDs[entity] = new PooledDictionary<Type, HashSet<Guid>>(); | ||||
|             entityToTypeToPendingComponentIDs[entity] = new PooledDictionary<Type, HashSet<Guid>>(); | ||||
|             entityToTypeToExistingComponentIDs[entity] = new PooledDictionary<Type, HashSet<Guid>>(); | ||||
|         } | ||||
| 
 | ||||
|         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<TComponent>(ComponentMessage<TComponent> 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<Type, HashSet<Guid>>()); | ||||
|             } | ||||
|             if (!entityToTypeToExistingComponentIDs[componentMessage.entity].ContainsKey(typeof(TComponent))) | ||||
|             { | ||||
|                 entityToTypeToExistingComponentIDs[componentMessage.entity].Add(typeof(TComponent), new HashSet<Guid>()); | ||||
|  | @ -116,10 +110,6 @@ namespace Encompass | |||
| 
 | ||||
|             componentMessageTypeToPendingComponentIDs[typeof(TComponent)].Add(pendingComponentMessage.componentID); | ||||
| 
 | ||||
|             if (!entityToTypeToPendingComponentIDs.ContainsKey(pendingComponentMessage.entity)) | ||||
|             { | ||||
|                 entityToTypeToPendingComponentIDs.Add(pendingComponentMessage.entity, new PooledDictionary<Type, HashSet<Guid>>()); | ||||
|             } | ||||
|             if (!entityToTypeToPendingComponentIDs[pendingComponentMessage.entity].ContainsKey(typeof(TComponent))) | ||||
|             { | ||||
|                 entityToTypeToPendingComponentIDs[pendingComponentMessage.entity].Add(typeof(TComponent), new HashSet<Guid>()); | ||||
|  | @ -138,10 +128,6 @@ namespace Encompass | |||
|             } | ||||
|             componentMessageTypeToComponentIDs[typeof(TComponent)].Add(componentID); | ||||
| 
 | ||||
|             if (!entityToTypeToComponentIDs.ContainsKey(entity)) | ||||
|             { | ||||
|                 entityToTypeToComponentIDs.Add(entity, new PooledDictionary<Type, HashSet<Guid>>()); | ||||
|             } | ||||
|             if (!entityToTypeToComponentIDs[entity].ContainsKey(typeof(TComponent))) | ||||
|             { | ||||
|                 entityToTypeToComponentIDs[entity].Add(typeof(TComponent), new HashSet<Guid>()); | ||||
|  |  | |||
|  | @ -78,6 +78,7 @@ namespace Encompass | |||
|                 var layer = componentIDToLayerIndex[id]; | ||||
|                 layerIndexToComponentIDs[layer].Remove(id); | ||||
|             } | ||||
|             componentIDToLayerIndex.Remove(id); | ||||
|         } | ||||
| 
 | ||||
|         public void AdjustComponentLayer(Guid id, int layer) | ||||
|  |  | |||
|  | @ -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<TComponent>))) | ||||
|             { | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ namespace Encompass | |||
|             var entity = new Entity(id); | ||||
|             IDToEntity[id] = entity; | ||||
|             componentManager.RegisterEntity(id); | ||||
|             componentMessageManager.RegisterEntity(entity); | ||||
|             return entity; | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -438,14 +438,14 @@ namespace Tests | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         static IEnumerable<ValueTuple<Guid, MockComponent>> results; | ||||
|         static List<(Guid, MockComponent)> results; | ||||
| 
 | ||||
|         [Reads(typeof(MockComponent))] | ||||
|         class ReaderEngine : Engine | ||||
|         { | ||||
|             public override void Update(double dt) | ||||
|             { | ||||
|                 results = ReadComponents<MockComponent>(); | ||||
|                 results = ReadComponents<MockComponent>().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))] | ||||
|  |  | |||
|  | @ -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<TestDrawComponent>()) | ||||
|                 { | ||||
|                     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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue