From d6c84b950ab7b997c30d6a2a64e93a4e2a1dc4ec Mon Sep 17 00:00:00 2001 From: Evan Hemsley <2342303+ehemsley@users.noreply.github.com> Date: Wed, 31 Jul 2019 10:35:17 -0700 Subject: [PATCH] remove activation concept from components and entities --- encompass-cs/ComponentManager.cs | 61 +-------- encompass-cs/Engine.cs | 24 +--- encompass-cs/Renderer.cs | 4 +- encompass-cs/Utility/EntityTracker.cs | 27 +--- encompass-cs/World.cs | 1 - encompass-cs/WorldBuilder.cs | 6 - test/ComponentTest.cs | 188 +------------------------- test/EngineTest.cs | 8 +- test/EntityRendererTest.cs | 28 ---- 9 files changed, 14 insertions(+), 333 deletions(-) diff --git a/encompass-cs/ComponentManager.cs b/encompass-cs/ComponentManager.cs index e137355..7884881 100644 --- a/encompass-cs/ComponentManager.cs +++ b/encompass-cs/ComponentManager.cs @@ -16,11 +16,6 @@ namespace Encompass private readonly Dictionary> typeToComponentIDs = new Dictionary>(); - private readonly List activeComponents = new List(); - private readonly List inactiveComponents = new List(); - - private readonly HashSet componentsMarkedForActivation = new HashSet(); - private readonly HashSet componentsMarkedForDeactivation = new HashSet(); private readonly HashSet componentsMarkedForRemoval = new HashSet(); private readonly Dictionary pendingUpdates = new Dictionary(); @@ -65,8 +60,6 @@ namespace Encompass entityIDToComponentIDs[entity.ID].Add(componentID); componentIDToEntityID[componentID] = entity.ID; - activeComponents.Add(componentID); - entitiesWithAddedComponents.Add(entity.ID); return componentID; @@ -88,34 +81,34 @@ namespace Encompass internal IEnumerable> GetComponentsByEntity(Guid entityID) { - return GetComponentIDsByEntityID(entityID).Intersect(activeComponents).Select((id) => new ValueTuple(id, IDToComponent[id])); + return GetComponentIDsByEntityID(entityID).Select((id) => new ValueTuple(id, IDToComponent[id])); } - internal IEnumerable> GetActiveComponentsByType() where TComponent : struct, IComponent + internal IEnumerable> GetComponentsByType() where TComponent : struct, IComponent { return typeToComponentIDs.ContainsKey(typeof(TComponent)) ? - typeToComponentIDs[typeof(TComponent)].Intersect(activeComponents).Select((id) => new ValueTuple(GetEntityIDByComponentID(id), id, (TComponent)IDToComponent[id])) : + typeToComponentIDs[typeof(TComponent)].Select((id) => new ValueTuple(GetEntityIDByComponentID(id), id, (TComponent)IDToComponent[id])) : Enumerable.Empty>(); } - internal IEnumerable> GetActiveComponentsByType(Type type) + internal IEnumerable> GetComponentsByType(Type type) { return typeToComponentIDs.ContainsKey(type) ? - typeToComponentIDs[type].Intersect(activeComponents).Select((id) => new ValueTuple(id, IDToComponent[id])) : + typeToComponentIDs[type].Select((id) => new ValueTuple(id, IDToComponent[id])) : Enumerable.Empty>(); } internal IEnumerable> GetComponentsByEntityAndType(Guid entityID) where TComponent : struct, IComponent { var entityComponentsByType = GetComponentsByEntity(entityID).Where((pair) => componentIDToType[pair.Item1] == typeof(TComponent)).Select((pair) => new ValueTuple(pair.Item1, (TComponent)pair.Item2)); - var activeComponentsByType = GetActiveComponentsByType(); + var activeComponentsByType = GetComponentsByType(); return activeComponentsByType.Select((triple) => (triple.Item2, triple.Item3)).Intersect(entityComponentsByType); } internal IEnumerable> GetComponentsByEntityAndType(Guid entityID, Type type) { var entityComponents = GetComponentsByEntity(entityID); - var activeComponentsByType = GetActiveComponentsByType(type); + var activeComponentsByType = GetComponentsByType(type); return entityComponents.Intersect(activeComponentsByType); } @@ -177,43 +170,6 @@ namespace Encompass } } - internal void Activate(Guid componentID) - { - if (inactiveComponents.Remove(componentID)) - { - activeComponents.Add(componentID); - } - - var entityID = GetEntityIDByComponentID(componentID); - entitiesWithAddedComponents.Add(entityID); - } - - internal void MarkForDeactivation(Guid componentID) - { - componentsMarkedForDeactivation.Add(componentID); - } - - internal void DeactivateMarkedComponents() - { - foreach (var componentID in componentsMarkedForDeactivation) - { - Deactivate(componentID); - } - - componentsMarkedForDeactivation.Clear(); - } - - private void Deactivate(Guid componentID) - { - if (activeComponents.Remove(componentID)) - { - inactiveComponents.Add(componentID); - } - - var entityID = GetEntityIDByComponentID(componentID); - entitiesWithRemovedComponents.Add(entityID); - } - internal void MarkForRemoval(Guid componentID) { componentsMarkedForRemoval.Add(componentID); @@ -234,9 +190,6 @@ namespace Encompass var component = IDToComponent[componentID]; var type = componentIDToType[componentID]; - activeComponents.Remove(componentID); - inactiveComponents.Remove(componentID); - var entityID = componentIDToEntityID[componentID]; if (entityIDToComponentIDs.ContainsKey(entityID)) { diff --git a/encompass-cs/Engine.cs b/encompass-cs/Engine.cs index ab8db3e..ae798cf 100644 --- a/encompass-cs/Engine.cs +++ b/encompass-cs/Engine.cs @@ -108,7 +108,7 @@ namespace Encompass internal IEnumerable> ReadComponentsFromWorld() where TComponent : struct, IComponent { - return componentManager.GetActiveComponentsByType().Select((triple) => (GetEntity(triple.Item1), triple.Item2, triple.Item3)); + return componentManager.GetComponentsByType().Select((triple) => (GetEntity(triple.Item1), triple.Item2, triple.Item3)); } protected Guid AddComponent(Entity entity, TComponent component) where TComponent : struct, IComponent @@ -147,28 +147,6 @@ namespace Encompass return componentID; } - protected void ActivateComponent(Guid componentID) where TComponent : struct, IComponent - { - var entity = GetEntity(componentManager.GetEntityIDByComponentID(componentID)); - var component = GetComponentByID(componentID); - - if (sendTypes.Contains(typeof(PendingComponentMessage))) - { - PendingComponentMessage newComponentMessage; - newComponentMessage.entity = entity; - newComponentMessage.componentID = componentID; - newComponentMessage.component = component; - SendMessage(newComponentMessage); - - componentManager.Activate(componentID); - } - } - - protected void DeactivateComponent(Guid componentID) - { - componentManager.MarkForDeactivation(componentID); - } - private IEnumerable> ExistingComponents() where TComponent : struct, IComponent { return ReadMessages>().Select((message) => (message.entity, message.componentID, message.component)); diff --git a/encompass-cs/Renderer.cs b/encompass-cs/Renderer.cs index 800ffb9..dafc707 100644 --- a/encompass-cs/Renderer.cs +++ b/encompass-cs/Renderer.cs @@ -41,7 +41,7 @@ namespace Encompass protected IEnumerable> ReadComponents() where TComponent : struct, IComponent { - return componentManager.GetActiveComponentsByType().Select((triple) => (triple.Item2, triple.Item3)); + return componentManager.GetComponentsByType().Select((triple) => (triple.Item2, triple.Item3)); } protected ValueTuple ReadComponent() where TComponent : struct, IComponent @@ -66,7 +66,7 @@ namespace Encompass protected bool SomeComponent() where TComponent : struct, IComponent { - return componentManager.GetActiveComponentsByType().Any(); + return componentManager.GetComponentsByType().Any(); } } } diff --git a/encompass-cs/Utility/EntityTracker.cs b/encompass-cs/Utility/EntityTracker.cs index dd5ddca..827393a 100644 --- a/encompass-cs/Utility/EntityTracker.cs +++ b/encompass-cs/Utility/EntityTracker.cs @@ -7,18 +7,12 @@ namespace Encompass internal class EntityTracker { private readonly HashSet trackedEntityIDs = new HashSet(); - private readonly HashSet deactivatedEntityIDs = new HashSet(); public IEnumerable TrackedEntityIDs { get { return trackedEntityIDs; } } - public IEnumerable DeactivatedEntityIds - { - get { return deactivatedEntityIDs; } - } - public void TrackEntity(Guid entityID) { trackedEntityIDs.Add(entityID); @@ -26,26 +20,7 @@ namespace Encompass public void UntrackEntity(Guid entityID) { - if (trackedEntityIDs.Remove(entityID)) - { - deactivatedEntityIDs.Remove(entityID); - } - } - - public void ActivateEntity(Guid entityID) - { - if (deactivatedEntityIDs.Remove(entityID)) - { - trackedEntityIDs.Add(entityID); - } - } - - public void DeactivateEntity(Guid entityID) - { - if (trackedEntityIDs.Remove(entityID)) - { - deactivatedEntityIDs.Add(entityID); - } + trackedEntityIDs.Remove(entityID); } public bool IsTracking(Guid entityID) diff --git a/encompass-cs/World.cs b/encompass-cs/World.cs index a17623c..6357968 100644 --- a/encompass-cs/World.cs +++ b/encompass-cs/World.cs @@ -36,7 +36,6 @@ namespace Encompass entityManager.DestroyMarkedEntities(); componentManager.PerformComponentUpdates(); - componentManager.DeactivateMarkedComponents(); componentManager.RemoveMarkedComponents(); entityManager.CheckEntitiesWithAddedComponents(); diff --git a/encompass-cs/WorldBuilder.cs b/encompass-cs/WorldBuilder.cs index 7c41418..49c5ff7 100644 --- a/encompass-cs/WorldBuilder.cs +++ b/encompass-cs/WorldBuilder.cs @@ -58,11 +58,6 @@ namespace Encompass return componentManager.AddDrawComponent(entity, componentID, component, layer); } - public void DeactivateComponent(Guid componentID) - { - componentManager.MarkForDeactivation(componentID); - } - internal void RegisterComponent(Type componentType) { registeredComponentTypes.Add(componentType); @@ -265,7 +260,6 @@ namespace Encompass ); componentManager.PerformComponentUpdates(); - componentManager.DeactivateMarkedComponents(); componentManager.RemoveMarkedComponents(); entityManager.CheckEntitiesWithAddedComponents(); diff --git a/test/ComponentTest.cs b/test/ComponentTest.cs index 4c69056..82977a7 100644 --- a/test/ComponentTest.cs +++ b/test/ComponentTest.cs @@ -218,7 +218,7 @@ namespace Tests var componentBID = worldBuilder.AddComponent(entity, mockComponentB); var componentCID = worldBuilder.AddComponent(entity, mockComponentC); - worldBuilder.AddEngine(new GetMockComponentsEngine( + worldBuilder.AddEngine(new GetMockComponentsEngine( entity, componentAID, mockComponentA, @@ -303,48 +303,6 @@ namespace Tests world.Update(0.01); } - struct HasComponentWhenInactiveTestMessage : IMessage - { - public Entity entity; - } - - [Receives(typeof(HasComponentWhenInactiveTestMessage))] - [Reads(typeof(MockComponent))] - class HasComponentWhenInactiveTestEngine : Engine - { - public override void Update(double dt) - { - foreach (var hasComponentTestEngine in ReadMessages()) - { - Assert.IsFalse(HasComponent(hasComponentTestEngine.entity)); - } - } - } - - [Test] - public void HasComponentWhenInactive() - { - var worldBuilder = new WorldBuilder(); - worldBuilder.AddEngine(new HasComponentWhenInactiveTestEngine()); - var entity = worldBuilder.CreateEntity(); - - MockComponent mockComponent; - mockComponent.myInt = 3; - mockComponent.myString = "hello"; - - var componentID = worldBuilder.AddComponent(entity, mockComponent); - - HasComponentWhenInactiveTestMessage testMessage; - testMessage.entity = entity; - worldBuilder.SendMessage(testMessage); - - worldBuilder.DeactivateComponent(componentID); - - var world = worldBuilder.Build(); - - world.Update(0.01f); - } - struct RemoveComponentTestMessage : IMessage { public Entity entity; @@ -432,54 +390,12 @@ namespace Tests world.Update(0.01f); } - struct ActivateComponentMessage : IMessage - { - public Entity entity; - public Guid componentID; - } - - [Activates(typeof(MockComponent))] - [Receives(typeof(ActivateComponentMessage))] - class ActivateComponentEngine : Engine - { - public override void Update(double dt) - { - foreach (var activateComponentMessage in ReadMessages()) - { - ActivateComponent(activateComponentMessage.componentID); - } - } - } - struct CheckHasMockComponentMessage : IMessage { public Entity entity; public bool shouldHaveComponent; } - [Receives(typeof(ActivateComponentMessage))] - [Sends(typeof(CheckHasMockComponentMessage))] - class DoActivateCheckEngine : Engine - { - private Entity entity; - - public DoActivateCheckEngine(Entity entity) - { - this.entity = entity; - } - - public override void Update(double dt) - { - if (SomeMessage()) - { - CheckHasMockComponentMessage checkHasMockComponentMessage; - checkHasMockComponentMessage.entity = entity; - checkHasMockComponentMessage.shouldHaveComponent = true; - SendMessage(checkHasMockComponentMessage); - } - } - } - [Receives(typeof(CheckHasMockComponentMessage))] [ReadsPending(typeof(MockComponent))] class CheckHasPendingMockComponentEngine : Engine @@ -492,107 +408,5 @@ namespace Tests } } } - - [Test] - public void ActivateComponent() - { - var worldBuilder = new WorldBuilder(); - var entity = worldBuilder.CreateEntity(); - - worldBuilder.AddEngine(new ActivateComponentEngine()); - worldBuilder.AddEngine(new CheckHasPendingMockComponentEngine()); - worldBuilder.AddEngine(new DoActivateCheckEngine(entity)); - - MockComponent mockComponent; - mockComponent.myInt = 3; - mockComponent.myString = "hello"; - - var componentID = worldBuilder.AddComponent(entity, mockComponent); - - worldBuilder.DeactivateComponent(componentID); - - ActivateComponentMessage activateMessage; - activateMessage.entity = entity; - activateMessage.componentID = componentID; - worldBuilder.SendMessage(activateMessage); - - var world = worldBuilder.Build(); - - world.Update(0.01); - } - - struct DeactivateComponentMessage : IMessage - { - public Entity entity; - public Guid componentID; - } - - [Receives(typeof(DeactivateComponentMessage))] - class DeactivateComponentEngine : Engine - { - public override void Update(double dt) - { - foreach (var deactivateComponentMessage in ReadMessages()) - { - DeactivateComponent(deactivateComponentMessage.componentID); - } - } - } - - [Receives(typeof(DeactivateComponentMessage))] - [Sends(typeof(CheckHasMockComponentMessage))] - class DoDeactivateCheckEngine : Engine - { - private Entity entity; - - public DoDeactivateCheckEngine(Entity entity) - { - this.entity = entity; - } - - public override void Update(double dt) - { - if (SomeMessage()) - { - CheckHasMockComponentMessage checkHasMockComponentMessage; - checkHasMockComponentMessage.entity = entity; - checkHasMockComponentMessage.shouldHaveComponent = true; - SendMessage(checkHasMockComponentMessage); - } - else - { - CheckHasMockComponentMessage checkHasMockComponentMessage; - checkHasMockComponentMessage.entity = entity; - checkHasMockComponentMessage.shouldHaveComponent = false; - SendMessage(checkHasMockComponentMessage); - } - } - } - - [Test] - public void DeactivateComponent() - { - var worldBuilder = new WorldBuilder(); - var entity = worldBuilder.CreateEntity(); - - worldBuilder.AddEngine(new DeactivateComponentEngine()); - worldBuilder.AddEngine(new CheckHasMockComponentEngine()); - worldBuilder.AddEngine(new DoDeactivateCheckEngine(entity)); - - MockComponent mockComponent; - mockComponent.myInt = 3; - mockComponent.myString = "hello"; - - var componentID = worldBuilder.AddComponent(entity, mockComponent); - - DeactivateComponentMessage deactivateComponentMessage; - deactivateComponentMessage.entity = entity; - deactivateComponentMessage.componentID = componentID; - worldBuilder.SendMessage(deactivateComponentMessage); - - var world = worldBuilder.Build(); - - world.Update(0.01); - } } } diff --git a/test/EngineTest.cs b/test/EngineTest.cs index 060383a..51444db 100644 --- a/test/EngineTest.cs +++ b/test/EngineTest.cs @@ -11,7 +11,7 @@ using Encompass.Exceptions; namespace Tests { struct MockComponent : IComponent - { + { public int myInt; public string myString; } @@ -60,9 +60,6 @@ namespace Tests var componentAID = worldBuilder.AddComponent(entity, mockComponent); var componentBID = worldBuilder.AddComponent(entity, mockComponentB); - var inactiveComponentAID = worldBuilder.AddComponent(entity, mockComponent); - - worldBuilder.DeactivateComponent(inactiveComponentAID); var world = worldBuilder.Build(); @@ -71,7 +68,6 @@ namespace Tests var resultComponentValues = resultComponents.Select((kv) => kv.Item2); resultComponentValues.Should().Contain(mockComponent); resultComponentValues.Should().Contain(mockComponentB); - resultComponents.Should().NotContain((inactiveComponentAID, mockComponent)); } [Test] @@ -139,7 +135,7 @@ namespace Tests public void UpdateComponent() { var worldBuilder = new WorldBuilder(); - + worldBuilder.AddEngine(new UpdateComponentTestEngine()); worldBuilder.AddEngine(new ReadComponentTestEngine()); diff --git a/test/EntityRendererTest.cs b/test/EntityRendererTest.cs index b85f09f..66835b5 100644 --- a/test/EntityRendererTest.cs +++ b/test/EntityRendererTest.cs @@ -62,34 +62,6 @@ namespace Tests } } - [Test] - public void InactiveDrawComponent() - { - var worldBuilder = new WorldBuilder(); - var renderer = worldBuilder.AddEntityRenderer(new TestRenderer()); - - AComponent aComponent; - BComponent bComponent; - TestDrawComponent testDrawComponent = default(TestDrawComponent); - - var entity = worldBuilder.CreateEntity(); - worldBuilder.AddComponent(entity, aComponent); - worldBuilder.AddComponent(entity, bComponent); - var testDrawComponentID = worldBuilder.AddDrawComponent(entity, testDrawComponent, 1); - - worldBuilder.DeactivateComponent(testDrawComponentID); - - var world = worldBuilder.Build(); - - world.Update(0.01f); - - Assert.IsFalse(renderer.IsTracking(entity.ID)); - - world.Draw(); - - Assert.IsFalse(called); - } - static bool calledOnDraw = false; static IEnumerable> resultComponents; [Renders(typeof(TestDrawComponent), typeof(AComponent), typeof(CComponent))]