fix broken entity ID lookup on pending components
							parent
							
								
									ccf243ad2d
								
							
						
					
					
						commit
						162dbe52a2
					
				|  | @ -43,6 +43,8 @@ namespace Encompass | |||
|         { | ||||
|             var id = NextID(); | ||||
|             componentAddData.Add((entity, typeof(TComponent), id, component)); | ||||
|             IDToComponent[id] = component; // add these here so entity lookup doesnt break on pending components | ||||
|             componentIDToEntityID[id] = entity.ID; | ||||
|             return id; | ||||
|         } | ||||
| 
 | ||||
|  | @ -55,7 +57,6 @@ namespace Encompass | |||
| 
 | ||||
|         internal void AddComponent(Entity entity, Type type, Guid componentID, IComponent component) | ||||
|         { | ||||
|             IDToComponent[componentID] = component; | ||||
|             componentIDToType[componentID] = type; | ||||
| 
 | ||||
|             if (!typeToComponentIDs.ContainsKey(type)) | ||||
|  | @ -74,8 +75,6 @@ namespace Encompass | |||
|             { | ||||
|                 throw new MultipleComponentOfSameTypeException("Entity {0} cannot have multiple components of type {1}", entity.ID, type.Name); | ||||
|             } | ||||
| 
 | ||||
|             componentIDToEntityID[componentID] = entity.ID; | ||||
|         } | ||||
| 
 | ||||
|         internal void AddMarkedComponents() | ||||
|  |  | |||
|  | @ -124,14 +124,7 @@ namespace Encompass | |||
|             } | ||||
|             componentMessageTypeToComponentIDs[typeof(TComponent)].Add(componentID); | ||||
| 
 | ||||
|             if (!entityToTypeToComponentID[entity].ContainsKey(typeof(TComponent))) | ||||
|             { | ||||
|                 entityToTypeToComponentID[entity].Add(typeof(TComponent), componentID); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 throw new MultipleComponentOfSameTypeException("Entity {0} cannot have multiple components of type {1}", entity.ID, typeof(TComponent).Name); | ||||
|             } | ||||
|             entityToTypeToComponentID[entity][typeof(TComponent)] = componentID; | ||||
|         } | ||||
| 
 | ||||
|         // general component reads by type | ||||
|  |  | |||
|  | @ -546,11 +546,53 @@ namespace Tests | |||
|             worldBuilder.AddComponent(entity, component); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
|             world.Update(0.01f); | ||||
|             world.Update(0.01); | ||||
| 
 | ||||
|             Assert.That(entity, Is.EqualTo(entityFromComponentIDResult)); | ||||
|         } | ||||
| 
 | ||||
|         [Activates(typeof(MockComponent))] | ||||
|         [Reads(typeof(MockComponent))] | ||||
|         class AddAndRemoveMockComponentEngine : Engine | ||||
|         { | ||||
|             public override void Update(double dt) | ||||
|             { | ||||
|                 foreach (var (mockComponentID, mockComponent) in ReadComponents<MockComponent>()) | ||||
|                 { | ||||
|                     var entity = GetEntityByComponentID(mockComponentID); | ||||
|                     RemoveComponent(mockComponentID); | ||||
|                     AddComponent(entity, new MockComponent()); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         [ReadsPending(typeof(MockComponent))] | ||||
|         class GetEntityFromPendingComponentIDEngine : Engine | ||||
|         { | ||||
|             public override void Update(double dt) | ||||
|             { | ||||
|                 foreach (var (mockComponentID, mockComponent) in ReadComponents<MockComponent>()) | ||||
|                 { | ||||
|                     entityFromComponentIDResult = GetEntityByComponentID(mockComponentID); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void GetEntityFromPendingComponentID() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             worldBuilder.AddEngine(new AddAndRemoveMockComponentEngine()); | ||||
|             worldBuilder.AddEngine(new GetEntityFromPendingComponentIDEngine()); | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
|             worldBuilder.AddComponent(entity, new MockComponent()); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             Assert.DoesNotThrow(() => world.Update(0.01)); | ||||
|         } | ||||
| 
 | ||||
|         static MockComponent mockComponentByIDResult; | ||||
| 
 | ||||
|         [Reads(typeof(MockComponent))] | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue