From 2d929e46655e5c16f26afef477fdc83fcb646ece Mon Sep 17 00:00:00 2001 From: Evan Hemsley Date: Fri, 12 Jul 2019 17:37:31 -0700 Subject: [PATCH] adds EntityExists method + fixes crash when destroying an entity that has no components --- encompass-cs/ComponentManager.cs | 10 ++++---- encompass-cs/Engine.cs | 5 ++++ encompass-cs/EntityManager.cs | 6 +++++ encompass-cs/RenderManager.cs | 2 +- encompass-cs/Renderer.cs | 5 ++++ test/EngineTest.cs | 39 ++++++++++++++++++++++++++++++++ 6 files changed, 61 insertions(+), 6 deletions(-) diff --git a/encompass-cs/ComponentManager.cs b/encompass-cs/ComponentManager.cs index a9ff095..ea5e2fc 100644 --- a/encompass-cs/ComponentManager.cs +++ b/encompass-cs/ComponentManager.cs @@ -37,6 +37,11 @@ namespace Encompass this.entitiesWithRemovedComponents = entitiesWithRemovedComponents; } + internal void RegisterEntity(Guid entityID) + { + entityIDToComponentIDs.Add(entityID, new List()); + } + internal Guid AddComponent(Guid entityID, TComponent component) where TComponent : struct, IComponent { var componentID = Guid.NewGuid(); @@ -51,11 +56,6 @@ namespace Encompass typeToComponentIDs[typeof(TComponent)].Add(componentID); - if (!entityIDToComponentIDs.ContainsKey(entityID)) - { - entityIDToComponentIDs.Add(entityID, new List()); - } - entityIDToComponentIDs[entityID].Add(componentID); componentIDToEntityID[componentID] = entityID; diff --git a/encompass-cs/Engine.cs b/encompass-cs/Engine.cs index 89aa8db..027830e 100644 --- a/encompass-cs/Engine.cs +++ b/encompass-cs/Engine.cs @@ -59,6 +59,11 @@ namespace Encompass return entityManager.CreateEntity(); } + protected bool EntityExists(Guid entityID) + { + return entityManager.EntityExists(entityID); + } + protected Entity GetEntity(Guid entityID) { return entityManager.GetEntity(entityID); diff --git a/encompass-cs/EntityManager.cs b/encompass-cs/EntityManager.cs index 3f0d107..a8266da 100644 --- a/encompass-cs/EntityManager.cs +++ b/encompass-cs/EntityManager.cs @@ -33,9 +33,15 @@ namespace Encompass var id = NextID(); var entity = new Entity(id, componentManager); IDToEntity[id] = entity; + componentManager.RegisterEntity(id); return entity; } + public bool EntityExists(Guid id) + { + return IDToEntity.ContainsKey(id); + } + public Entity GetEntity(Guid id) { return IDToEntity[id]; diff --git a/encompass-cs/RenderManager.cs b/encompass-cs/RenderManager.cs index 093c5e1..6d0e9a8 100644 --- a/encompass-cs/RenderManager.cs +++ b/encompass-cs/RenderManager.cs @@ -54,7 +54,7 @@ namespace Encompass var renderer = drawComponentTypeToEntityRenderer[componentType]; var entityID = componentManager.GetEntityIDByComponentID(componentID); - if (renderer.IsTracking(entityID)) + if (renderer.IsTracking(entityID) && entityManager.EntityExists(entityID)) { var entity = entityManager.GetEntity(entityID); renderer.Render(entity); diff --git a/encompass-cs/Renderer.cs b/encompass-cs/Renderer.cs index 9f4c860..d2d82d6 100644 --- a/encompass-cs/Renderer.cs +++ b/encompass-cs/Renderer.cs @@ -19,6 +19,11 @@ namespace Encompass this.componentManager = componentManager; } + protected bool EntityExists(Guid entityID) + { + return entityManager.EntityExists(entityID); + } + protected Entity GetEntity(Guid entityID) { return entityManager.GetEntity(entityID); diff --git a/test/EngineTest.cs b/test/EngineTest.cs index d9397bc..4c844d3 100644 --- a/test/EngineTest.cs +++ b/test/EngineTest.cs @@ -556,5 +556,44 @@ namespace Tests Assert.Throws(() => world.Update(0.01f)); } + + struct EntityIDComponent : IComponent { public Guid entityID; } + static bool hasEntity; + class HasEntityTestEngine : Engine + { + public override void Update(double dt) + { + foreach (var (mockComponentID, mockComponent) in ReadComponents()) + { + hasEntity = EntityExists(mockComponent.entityID); + if (hasEntity) { Destroy(mockComponent.entityID); } + } + } + } + + [Test] + public void EntityExists() + { + var worldBuilder = new WorldBuilder(); + worldBuilder.AddEngine(new HasEntityTestEngine()); + + var entity = worldBuilder.CreateEntity(); + var entityTwo = worldBuilder.CreateEntity(); + + EntityIDComponent entityIDComponent; + entityIDComponent.entityID = entityTwo.id; + + entity.AddComponent(entityIDComponent); + + var world = worldBuilder.Build(); + + world.Update(0.01); + + Assert.IsTrue(hasEntity); + + world.Update(0.01); + + Assert.IsFalse(hasEntity); + } } }