diff --git a/encompass-cs/Engine.cs b/encompass-cs/Engine.cs index ca188b6..0cc8d45 100644 --- a/encompass-cs/Engine.cs +++ b/encompass-cs/Engine.cs @@ -13,7 +13,7 @@ namespace Encompass /// public abstract class Engine : IEquatable { - public Guid ID; + internal Guid ID; internal readonly HashSet sendTypes = new HashSet(); internal readonly HashSet receiveTypes = new HashSet(); @@ -123,7 +123,7 @@ namespace Encompass /// /// Returns true if an Entity with the specified ID exists. /// - protected bool EntityExists(Guid entityID) + internal bool EntityExists(Guid entityID) { return entityManager.EntityExists(entityID); } @@ -134,7 +134,7 @@ namespace Encompass /// /// Thrown when an Entity with the given ID does not exist. /// - protected Entity GetEntity(Guid entityID) + internal Entity GetEntity(Guid entityID) { return entityManager.GetEntity(entityID); } @@ -142,7 +142,7 @@ namespace Encompass /// /// Returns the Entity ID associated with the specified Component Type and ID. /// - protected Guid GetEntityIDByComponentID(Guid componentID) where TComponent : struct, IComponent + private Guid GetEntityIDByComponentID(Guid componentID) where TComponent : struct, IComponent { var pendingRead = receiveTypes.Contains(typeof(PendingComponentMessage)); var existingRead = receiveTypes.Contains(typeof(ComponentMessage)); @@ -158,7 +158,7 @@ namespace Encompass /// /// Returns the Entity associated with the specified Component Type and ID. /// - protected Entity GetEntityByComponentID(Guid componentID) where TComponent : struct, IComponent + private Entity GetEntityByComponentID(Guid componentID) where TComponent : struct, IComponent { return GetEntity(GetEntityIDByComponentID(componentID)); } @@ -168,7 +168,7 @@ namespace Encompass /// protected Entity ReadEntity() where TComponent : struct, IComponent { - var (id, component) = ReadComponent(); + var (id, component) = ReadComponentHelper(); return GetEntityByComponentID(id); } @@ -177,7 +177,7 @@ namespace Encompass /// protected IEnumerable ReadEntities() where TComponent : struct, IComponent { - foreach (var (id, component) in ReadComponents()) + foreach (var (id, _) in ReadComponentsHelper()) { yield return GetEntityByComponentID(id); } @@ -186,7 +186,7 @@ namespace Encompass /// /// Returns the Component struct with the specified Component Type and ID. /// - protected TComponent GetComponentByID(Guid componentID) where TComponent : struct, IComponent + internal TComponent GetComponentByID(Guid componentID) where TComponent : struct, IComponent { var pendingRead = receiveTypes.Contains(typeof(PendingComponentMessage)); var existingRead = receiveTypes.Contains(typeof(ComponentMessage)); @@ -216,10 +216,7 @@ namespace Encompass return GetEntity(componentManager.GetEntityIDByComponentID(componentID)); } - /// - /// Returns all of the Components with the specified Component Type. - /// - protected IEnumerable<(Guid, TComponent)> ReadComponents() where TComponent : struct, IComponent + private IEnumerable<(Guid, TComponent)> ReadComponentsHelper() where TComponent : struct, IComponent { var pendingRead = receiveTypes.Contains(typeof(PendingComponentMessage)); var existingRead = receiveTypes.Contains(typeof(ComponentMessage)); @@ -242,17 +239,22 @@ namespace Encompass } /// - /// Returns all of the components of the specified type including an Entity reference for each Component. + /// Returns all of the Components with the specified Component Type. /// - protected IEnumerable<(Guid, TComponent, Entity)> ReadComponentsIncludingEntity() where TComponent : struct, IComponent + protected IEnumerable ReadComponents() where TComponent : struct, IComponent { - return ReadComponents().Select((tuple) => (tuple.Item1, tuple.Item2, GetEntityByComponentID(tuple.Item1))); + return ReadComponentsHelper().Select(tuple => tuple.Item2); } /// - /// Returns a Component with the specified Component Type. If multiples exist, an arbitrary Component is returned. + /// Returns all of the components of the specified type including an Entity reference for each Component. /// - protected (Guid, TComponent) ReadComponent() where TComponent : struct, IComponent + protected IEnumerable<(TComponent, Entity)> ReadComponentsIncludingEntity() where TComponent : struct, IComponent + { + return ReadComponentsHelper().Select((tuple) => (tuple.Item2, GetEntityByComponentID(tuple.Item1))); + } + + private (Guid, TComponent) ReadComponentHelper() where TComponent : struct, IComponent { var pendingRead = receiveTypes.Contains(typeof(PendingComponentMessage)); var existingRead = receiveTypes.Contains(typeof(ComponentMessage)); @@ -274,13 +276,21 @@ namespace Encompass } } + /// + /// Returns a Component with the specified Component Type. If multiples exist, an arbitrary Component is returned. + /// + protected TComponent ReadComponent() where TComponent : struct, IComponent + { + return ReadComponentHelper().Item2; + } + /// /// Returns a component of the specified type including its Entity reference. If multiples exist, an arbitrary Component is returned. /// - protected (Guid, TComponent, Entity) ReadComponentIncludingEntity() where TComponent : struct, IComponent + protected (TComponent, Entity) ReadComponentIncludingEntity() where TComponent : struct, IComponent { - var (id, component) = ReadComponent(); - return (id, component, GetEntityByComponentID(id)); + var (id, component) = ReadComponentHelper(); + return (component, GetEntityByComponentID(id)); } /// @@ -308,16 +318,7 @@ namespace Encompass } } - /// - /// Returns a Component with the specified Type that exists on the Entity. - /// - /// - /// Thrown when the Entity does not have a Component of the specified Type - /// - /// - /// Thrown when the Engine does not declare that it reads the given Component Type. - /// - protected (Guid, TComponent) GetComponent(Entity entity) where TComponent : struct, IComponent + private (Guid, TComponent) GetComponentHelper(Entity entity) where TComponent : struct, IComponent { var pendingRead = receiveTypes.Contains(typeof(PendingComponentMessage)); var existingRead = receiveTypes.Contains(typeof(ComponentMessage)); @@ -359,7 +360,12 @@ namespace Encompass /// /// Thrown when the Engine does not declare that it reads the given Component Type. /// - protected (Guid, IComponent) GetComponent(Entity entity, Type type) + protected TComponent GetComponent(Entity entity) where TComponent : struct, IComponent + { + return GetComponentHelper(entity).Item2; + } + + private (Guid, IComponent) GetComponentHelper(Entity entity, Type type) { var pending = typeof(PendingComponentMessage<>).MakeGenericType(type); var existing = typeof(ComponentMessage<>).MakeGenericType(type); @@ -396,6 +402,20 @@ namespace Encompass } } + /// + /// Returns a Component with the specified Type that exists on the Entity. + /// + /// + /// Thrown when the Entity does not have a Component of the specified Type + /// + /// + /// Thrown when the Engine does not declare that it reads the given Component Type. + /// + protected IComponent GetComponent(Entity entity, Type type) + { + return GetComponentHelper(entity, type).Item2; + } + /// /// Returns true if the Entity has a Component of the given Type. /// @@ -463,7 +483,7 @@ namespace Encompass /// /// Thrown when the Engine does not declare that it Writes the given Component Type. /// - protected Guid SetComponent(Entity entity, TComponent component) where TComponent : struct, IComponent + protected void SetComponent(Entity entity, TComponent component) where TComponent : struct, IComponent { var priority = writePriorities.ContainsKey(typeof(TComponent)) ? writePriorities[typeof(TComponent)] : 0; @@ -483,16 +503,14 @@ namespace Encompass newComponentMessage.priority = priority; SendPendingComponentMessage(newComponentMessage); } - - return componentID; } /// /// Overwrites Component struct data associated with the specified Component ID. /// - protected Guid SetComponent(Guid componentID, TComponent component) where TComponent : struct, IComponent + internal void SetComponent(Guid componentID, TComponent component) where TComponent : struct, IComponent { - return SetComponent(GetEntityByComponentID(componentID), component); + SetComponent(GetEntityByComponentID(componentID), component); } /// @@ -503,7 +521,7 @@ namespace Encompass /// /// Thrown when the Engine does not declare that it Writes the given Component Type. /// - protected Guid SetDrawComponent(Entity entity, TComponent component, int layer = 0) where TComponent : struct, IComponent, IDrawComponent + protected void SetDrawComponent(Entity entity, TComponent component, int layer = 0) where TComponent : struct, IComponent, IDrawComponent { var priority = writePriorities.ContainsKey(typeof(TComponent)) ? writePriorities[typeof(TComponent)] : 0; @@ -523,8 +541,6 @@ namespace Encompass newComponentMessage.priority = priority; SendPendingComponentMessage(newComponentMessage); } - - return componentID; } /// @@ -622,7 +638,7 @@ namespace Encompass /// Destroys the Entity with the specified ID. This also removes all of the Components associated with the Entity. /// Entity destruction takes place after all the Engines have been processed by World Update. /// - protected void Destroy(Guid entityID) + internal void Destroy(Guid entityID) { entityManager.MarkForDestroy(entityID); } @@ -660,17 +676,22 @@ namespace Encompass /// /// Removes a Component with the specified type from the given Entity. /// Note that the Engine must Read the Component type that is being removed. + /// If a Component with the specified type does not exist on the Entity, returns false and does not mutate the Entity. /// - protected void RemoveComponent(Entity entity) where TComponent : struct, IComponent + protected bool RemoveComponent(Entity entity) where TComponent : struct, IComponent { - var (componentID, _) = GetComponent(entity); + if (!HasComponent(entity)) { return false; } + + var (componentID, _) = GetComponentHelper(entity); RemoveComponent(componentID); + + return true; } /// /// Removes the Component with the specified ID from its Entity. /// - protected void RemoveComponent(Guid componentID) + private void RemoveComponent(Guid componentID) { componentManager.MarkForRemoval(componentID); } diff --git a/encompass-cs/RenderManager.cs b/encompass-cs/RenderManager.cs index 12f2a58..35c2405 100644 --- a/encompass-cs/RenderManager.cs +++ b/encompass-cs/RenderManager.cs @@ -8,19 +8,22 @@ namespace Encompass { private readonly ComponentManager componentManager; private readonly DrawLayerManager drawLayerManager; + private readonly EntityManager entityManager; - private readonly Dictionary> drawComponentTypeToOrderedRenderer = new Dictionary>(); + private readonly Dictionary> drawComponentTypeToOrderedRenderer = new Dictionary>(); public RenderManager( ComponentManager componentManager, - DrawLayerManager drawLayerManager + DrawLayerManager drawLayerManager, + EntityManager entityManager ) { this.componentManager = componentManager; this.drawLayerManager = drawLayerManager; + this.entityManager = entityManager; } - public void RegisterOrderedRenderer(Action renderAction) where TComponent : struct, IComponent + public void RegisterOrderedRenderer(Action renderAction) where TComponent : struct, IComponent { drawComponentTypeToOrderedRenderer.Add(typeof(TComponent), renderAction); } @@ -41,11 +44,13 @@ namespace Encompass { var component = componentManager.GetComponentByID(componentID); var componentType = componentManager.GetComponentTypeByID(componentID); + var entityID = componentManager.GetEntityIDByComponentID(componentID); + var entity = entityManager.GetEntity(entityID); if (drawComponentTypeToOrderedRenderer.ContainsKey(componentType)) { var internalRenderAction = drawComponentTypeToOrderedRenderer[componentType]; - internalRenderAction(componentID, component); + internalRenderAction(entity, component); } } diff --git a/encompass-cs/Renderer.cs b/encompass-cs/Renderer.cs index aa83f96..922876f 100644 --- a/encompass-cs/Renderer.cs +++ b/encompass-cs/Renderer.cs @@ -19,39 +19,39 @@ namespace Encompass this.componentManager = componentManager; } - protected bool EntityExists(Guid entityID) - { - return entityManager.EntityExists(entityID); - } - - protected Entity GetEntity(Guid entityID) - { - return entityManager.GetEntity(entityID); - } - - protected Guid GetEntityIDByComponentID(Guid componentID) + internal Guid GetEntityIDByComponentID(Guid componentID) { return componentManager.GetEntityIDByComponentID(componentID); } - protected Entity GetEntityByComponentID(Guid componentID) + internal Entity GetEntity(Guid entityID) { - return GetEntity(GetEntityIDByComponentID(componentID)); + return entityManager.GetEntity(entityID); } - protected IEnumerable> ReadComponents() where TComponent : struct, IComponent + protected IEnumerable ReadComponents() where TComponent : struct, IComponent { - return componentManager.GetComponentsByType(); + return componentManager.GetComponentsByType().Select(tuple => tuple.Item2); } - protected ValueTuple ReadComponent() where TComponent : struct, IComponent + protected IEnumerable<(TComponent, Entity)> ReadComponentsIncludingEntity() where TComponent : struct, IComponent + { + return componentManager.GetComponentsByType().Select(tuple => (tuple.Item2, GetEntity(GetEntityIDByComponentID(tuple.Item1)))); + } + + protected TComponent ReadComponent() where TComponent : struct, IComponent { return ReadComponents().First(); } - protected ValueTuple GetComponent(Entity entity) where TComponent : struct, IComponent + protected (TComponent, Entity) ReadComponentIncludingEntity() where TComponent : struct, IComponent { - return componentManager.GetComponentByEntityAndType(entity); + return ReadComponentsIncludingEntity().First(); + } + + protected TComponent GetComponent(Entity entity) where TComponent : struct, IComponent + { + return componentManager.GetComponentByEntityAndType(entity).Item2; } protected bool HasComponent(Entity entity) where TComponent : struct, IComponent diff --git a/encompass-cs/Renderers/OrderedRenderer.cs b/encompass-cs/Renderers/OrderedRenderer.cs index 011a6c2..12f650f 100644 --- a/encompass-cs/Renderers/OrderedRenderer.cs +++ b/encompass-cs/Renderers/OrderedRenderer.cs @@ -7,11 +7,11 @@ namespace Encompass /// public abstract class OrderedRenderer : Renderer where TComponent : struct, IComponent, IDrawComponent { - public abstract void Render(Guid drawComponentID, TComponent drawComponent); + public abstract void Render(Entity entity, TComponent drawComponent); - internal void InternalRender(Guid drawComponentId, IComponent component) + internal void InternalRender(Entity entity, IComponent component) { - Render(drawComponentId, (TComponent)component); + Render(entity, (TComponent)component); } } } diff --git a/encompass-cs/WorldBuilder.cs b/encompass-cs/WorldBuilder.cs index b8c21c4..97433f0 100644 --- a/encompass-cs/WorldBuilder.cs +++ b/encompass-cs/WorldBuilder.cs @@ -42,7 +42,7 @@ namespace Encompass messageManager = new MessageManager(); componentMessageManager = new ComponentMessageManager(); entityManager = new EntityManager(componentManager, componentMessageManager); - renderManager = new RenderManager(componentManager, drawLayerManager); + renderManager = new RenderManager(componentManager, drawLayerManager, entityManager); } /// @@ -72,18 +72,18 @@ namespace Encompass /// /// Sets Component data for the specified Component Type on the specified Entity. /// - public Guid SetComponent(Entity entity, TComponent component, int priority = 0) where TComponent : struct, IComponent + public void SetComponent(Entity entity, TComponent component, int priority = 0) where TComponent : struct, IComponent { - return componentManager.MarkComponentForWrite(entity, component, priority); + componentManager.MarkComponentForWrite(entity, component, priority); } /// /// Sets Draw Component data for the specified Component Type on the specified Entity. /// This method must be used for the Draw Component to be readable by an OrderedRenderer. /// - public Guid SetDrawComponent(Entity entity, TComponent component, int priority = 0, int layer = 0) where TComponent : struct, IComponent, IDrawComponent + public void SetDrawComponent(Entity entity, TComponent component, int priority = 0, int layer = 0) where TComponent : struct, IComponent, IDrawComponent { - return componentManager.MarkDrawComponentForWrite(entity, component, priority, layer); + componentManager.MarkDrawComponentForWrite(entity, component, priority, layer); } internal void RegisterComponent(Type componentType) diff --git a/test/ComponentTest.cs b/test/ComponentTest.cs index cdc124c..e7c5c54 100644 --- a/test/ComponentTest.cs +++ b/test/ComponentTest.cs @@ -23,7 +23,7 @@ namespace Tests public Entity entity; } - static (Guid, MockComponent) gottenMockComponentIDPair; + static MockComponent gottenMockComponent; [Receives(typeof(EntityMessage))] [Reads(typeof(MockComponent))] @@ -33,7 +33,7 @@ namespace Tests { foreach (var entityMessage in ReadMessages()) { - gottenMockComponentIDPair = GetComponent(entityMessage.entity); + gottenMockComponent = GetComponent(entityMessage.entity); } } } @@ -53,7 +53,7 @@ namespace Tests foreach (var addComponentTestMessage in ReadMessages()) { Assert.IsTrue(HasComponent(addComponentTestMessage.entity)); - Assert.That(GetComponent(addComponentTestMessage.entity).Item2, Is.EqualTo(addComponentTestMessage.mockComponent)); + Assert.That(GetComponent(addComponentTestMessage.entity), Is.EqualTo(addComponentTestMessage.mockComponent)); } } } @@ -97,8 +97,8 @@ namespace Tests world.Update(0.01); - Assert.That(gottenMockComponentIDPair.Item2.myInt, Is.EqualTo(50)); - Assert.That(gottenMockComponentIDPair.Item2.myString, Is.EqualTo("hi")); + Assert.That(gottenMockComponent.myInt, Is.EqualTo(50)); + Assert.That(gottenMockComponent.myString, Is.EqualTo("hi")); } [Reads(typeof(MockComponent))] @@ -108,10 +108,8 @@ namespace Tests { public override void Update(double dt) { - foreach (var (mockComponentID, mockComponent) in ReadComponents()) + foreach (var (mockComponent, entity) in ReadComponentsIncludingEntity()) { - var entity = GetEntityByComponentID(mockComponentID); - SetComponent(entity, new MockComponent { myInt = 420 }); } } @@ -123,7 +121,7 @@ namespace Tests { public override void Update(double dt) { - gottenMockComponentIDPair = ReadComponent(); + gottenMockComponent = ReadComponent(); } } @@ -140,7 +138,7 @@ namespace Tests var world = worldBuilder.Build(); world.Update(0.01); - Assert.That(gottenMockComponentIDPair.Item2.myInt, Is.EqualTo(420)); + Assert.That(gottenMockComponent.myInt, Is.EqualTo(420)); } [Reads(typeof(MockComponent))] @@ -149,11 +147,10 @@ namespace Tests { public override void Update(double dt) { - foreach (var (mockComponentID, mockComponent) in ReadComponents()) + foreach (var (mockComponent, entity) in ReadComponentsIncludingEntity()) { - var entity = GetEntityByComponentID(mockComponentID); SetComponent(entity, mockComponent); - RemoveComponent(mockComponentID); + RemoveComponent(entity); } } } @@ -258,7 +255,7 @@ namespace Tests mockComponent.myInt = 3; mockComponent.myString = "hello"; - var componentID = worldBuilder.SetComponent(entity, mockComponent); + worldBuilder.SetComponent(entity, mockComponent); EntityMessage entityMessage; entityMessage.entity = entity; @@ -268,7 +265,7 @@ namespace Tests world.Update(0.01); - Assert.AreEqual((componentID, mockComponent), gottenMockComponentIDPair); + Assert.AreEqual(mockComponent, gottenMockComponent); } [Receives(typeof(EntityMessage))] @@ -279,7 +276,7 @@ namespace Tests { foreach (var entityMessage in ReadMessages()) { - gottenMockComponentIDPair = ((Guid, MockComponent))GetComponent(entityMessage.entity, typeof(MockComponent)); + gottenMockComponent = (MockComponent)GetComponent(entityMessage.entity, typeof(MockComponent)); } } } @@ -296,7 +293,7 @@ namespace Tests mockComponent.myInt = 3; mockComponent.myString = "hello"; - var componentID = worldBuilder.SetComponent(entity, mockComponent); + worldBuilder.SetComponent(entity, mockComponent); EntityMessage entityMessage; entityMessage.entity = entity; @@ -306,7 +303,7 @@ namespace Tests world.Update(0.01); - Assert.AreEqual((componentID, mockComponent), gottenMockComponentIDPair); + Assert.AreEqual(mockComponent, gottenMockComponent); } struct HasComponentTestMessage : IMessage @@ -389,9 +386,9 @@ namespace Tests struct RemoveComponentTestMessage : IMessage { public Entity entity; - public Guid componentID; } + [Reads(typeof(MockComponent))] [Receives(typeof(RemoveComponentTestMessage))] class RemoveComponentTestEngine : Engine { @@ -399,7 +396,7 @@ namespace Tests { foreach (var removeComponentMessage in ReadMessages()) { - RemoveComponent(removeComponentMessage.componentID); + RemoveComponent(removeComponentMessage.entity); } } } @@ -461,11 +458,10 @@ namespace Tests mockComponent.myInt = 3; mockComponent.myString = "hello"; - var componentID = worldBuilder.SetComponent(entity, mockComponent); + worldBuilder.SetComponent(entity, mockComponent); RemoveComponentTestMessage removeComponentMessage; removeComponentMessage.entity = entity; - removeComponentMessage.componentID = componentID; worldBuilder.SendMessage(removeComponentMessage); var world = worldBuilder.Build(); diff --git a/test/EngineTest.cs b/test/EngineTest.cs index 5e44883..b42ba35 100644 --- a/test/EngineTest.cs +++ b/test/EngineTest.cs @@ -18,7 +18,7 @@ namespace Tests public class EngineTest { - static List> resultComponents; + static List resultComponents; static MockComponent resultComponent; static List resultMessages = new List(); @@ -32,8 +32,8 @@ namespace Tests } } - static List<(Guid, MockComponent, Entity)> resultComponentsIncludingEntity; - static (Guid, MockComponent, Entity) resultComponentIncludingEntity; + static List<(MockComponent, Entity)> resultComponentsIncludingEntity; + static (MockComponent, Entity) resultComponentIncludingEntity; [Reads(typeof(MockComponent))] public class ReadComponentsIncludingEntityEngine : Engine @@ -49,7 +49,7 @@ namespace Tests { public override void Update(double dt) { - resultComponent = ReadComponent().Item2; + resultComponent = ReadComponent(); } } @@ -79,16 +79,15 @@ namespace Tests mockComponentB.myInt = 1; mockComponentB.myString = "howdy"; - var componentAID = worldBuilder.SetComponent(entity, mockComponent); - var componentBID = worldBuilder.SetComponent(entityB, mockComponentB); + worldBuilder.SetComponent(entity, mockComponent); + worldBuilder.SetComponent(entityB, mockComponentB); var world = worldBuilder.Build(); world.Update(0.01f); - var resultComponentValues = resultComponents.Select((kv) => kv.Item2); - resultComponentValues.Should().Contain(mockComponent); - resultComponentValues.Should().Contain(mockComponentB); + resultComponents.Should().Contain(mockComponent); + resultComponents.Should().Contain(mockComponentB); } [Test] @@ -108,23 +107,23 @@ namespace Tests mockComponentB.myInt = 1; mockComponentB.myString = "howdy"; - var componentAID = worldBuilder.SetComponent(entity, mockComponent); - var componentBID = worldBuilder.SetComponent(entityB, mockComponentB); + worldBuilder.SetComponent(entity, mockComponent); + worldBuilder.SetComponent(entityB, mockComponentB); var world = worldBuilder.Build(); world.Update(0.01f); - var resultComponentValues = resultComponentsIncludingEntity.Select((kv) => kv.Item2); + var resultComponentValues = resultComponentsIncludingEntity.Select((kv) => kv.Item1); resultComponentValues.Should().Contain(mockComponent); resultComponentValues.Should().Contain(mockComponentB); - var resultEntities = resultComponentsIncludingEntity.Select((kv) => kv.Item3); + var resultEntities = resultComponentsIncludingEntity.Select((kv) => kv.Item2); resultEntities.Should().Contain(entity); resultEntities.Should().Contain(entityB); - resultComponentsIncludingEntity.Should().Contain((componentAID, mockComponent, entity)); - resultComponentsIncludingEntity.Should().Contain((componentBID, mockComponentB, entityB)); + resultComponentsIncludingEntity.Should().Contain((mockComponent, entity)); + resultComponentsIncludingEntity.Should().Contain((mockComponentB, entityB)); } [Test] @@ -187,13 +186,13 @@ namespace Tests mockComponent.myInt = 0; mockComponent.myString = "hello"; - var componentID = worldBuilder.SetComponent(entity, mockComponent); + worldBuilder.SetComponent(entity, mockComponent); var world = worldBuilder.Build(); world.Update(0.01f); - (componentID, mockComponent, entity).Should().BeEquivalentTo(resultComponentIncludingEntity); + (mockComponent, entity).Should().BeEquivalentTo(resultComponentIncludingEntity); } [Reads(typeof(MockComponent))] @@ -202,11 +201,11 @@ namespace Tests { public override void Update(double dt) { - (var componentID, var component) = ReadComponent(); + var (component, entity) = ReadComponentIncludingEntity(); component.myInt = 420; component.myString = "blaze it"; - SetComponent(GetEntityByComponentID(componentID), component); + SetComponent(entity, component); } } @@ -242,13 +241,13 @@ namespace Tests { public override void Update(double dt) { - (var componentID, var component) = ReadComponent(); + var (component, entity) = ReadComponentIncludingEntity(); component.myInt = 420; component.myString = "blaze it"; - SetComponent(componentID, component); + SetComponent(entity, component); - component = ReadComponent().Item2; + component = ReadComponent(); } } @@ -437,22 +436,22 @@ namespace Tests world.Update(0.01); } - static ValueTuple pairA; - static ValueTuple pairB; + static (MockComponent, Entity) pairA; + static (MockComponent, Entity) pairB; [Reads(typeof(MockComponent))] class SameValueComponentReadEngine : Engine { public override void Update(double dt) { - var components = ReadComponents(); + var components = ReadComponentsIncludingEntity(); pairA = components.First(); pairB = components.Last(); } } - // Tests that components with identical values should be distinguishable by ID + // Tests that components with identical values should be distinguishable by their entities [Test] public void SameValueComponents() { @@ -476,18 +475,18 @@ namespace Tests var world = worldBuilder.Build(); world.Update(0.01f); - Assert.That(pairA, Is.Not.EqualTo(pairB)); - Assert.That(pairA.Item2, Is.EqualTo(pairB.Item2)); + Assert.That(EngineTest.pairA, Is.Not.EqualTo(EngineTest.pairB)); + Assert.That(EngineTest.pairA.Item1, Is.EqualTo(EngineTest.pairB.Item1)); } - static IEnumerable> emptyComponentReadResult; + static IEnumerable<(MockComponent, Entity)> emptyComponentReadResult; [Reads(typeof(MockComponent))] class ReadEmptyMockComponentsEngine : Engine { public override void Update(double dt) { - emptyComponentReadResult = ReadComponents(); + emptyComponentReadResult = ReadComponentsIncludingEntity(); } } @@ -510,23 +509,21 @@ namespace Tests { public override void Update(double dt) { - foreach (var componentPair in ReadComponents()) + foreach (var (component, entity) in ReadComponentsIncludingEntity()) { - var componentID = componentPair.Item1; - var entityID = GetEntityIDByComponentID(componentID); - Destroy(entityID); + Destroy(entity); } } } - static List<(Guid, MockComponent)> results; + static List<(MockComponent, Entity)> results; [Reads(typeof(MockComponent))] class ReaderEngine : Engine { public override void Update(double dt) { - results = ReadComponents().ToList(); + results = ReadComponentsIncludingEntity().ToList(); } } @@ -547,21 +544,21 @@ namespace Tests mockComponent.myString = "blah"; worldBuilder.SetComponent(entity, destroyerComponent); - var componentID = worldBuilder.SetComponent(entity, mockComponent); + worldBuilder.SetComponent(entity, mockComponent); worldBuilder.SetComponent(entityB, destroyerComponent); - var componentBID = worldBuilder.SetComponent(entityB, mockComponent); + worldBuilder.SetComponent(entityB, mockComponent); - var componentCID = worldBuilder.SetComponent(entityC, mockComponent); + worldBuilder.SetComponent(entityC, mockComponent); var world = worldBuilder.Build(); 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))); + Assert.That(results, Does.Not.Contain((mockComponent, entity))); + Assert.That(results, Does.Not.Contain((mockComponent, entity))); + Assert.That(results, Does.Contain((mockComponent, entityC))); } [Receives(typeof(DestroyComponentMessage))] @@ -586,14 +583,14 @@ namespace Tests var mockComponent = new MockComponent { }; var entity = worldBuilder.CreateEntity(); - var componentID = worldBuilder.SetComponent(entity, mockComponent); + worldBuilder.SetComponent(entity, mockComponent); worldBuilder.SendMessage(new DestroyComponentMessage { entity = entity }); var world = worldBuilder.Build(); world.Update(0.01); Assert.DoesNotThrow(() => world.Update(0.01)); - Assert.That(results, Does.Not.Contain((componentID, mockComponent))); + Assert.That(results, Does.Not.Contain((mockComponent, entity))); } [Reads(typeof(DestroyerComponent), typeof(MockComponent))] @@ -601,13 +598,10 @@ namespace Tests { public override void Update(double dt) { - foreach (var componentPair in ReadComponents()) + foreach (var (componentPair, entity) in ReadComponentsIncludingEntity()) { - var componentID = componentPair.Item1; - var entity = GetEntityByComponentID(componentID); - var (id, _) = GetComponent(entity); - RemoveComponent(id); - Destroy(entity.ID); + RemoveComponent(entity); + Destroy(entity); } } } @@ -629,37 +623,6 @@ namespace Tests Assert.DoesNotThrow(() => world.Update(0.01)); } - static Entity entityFromComponentIDResult; - - [Reads(typeof(MockComponent))] - class GetEntityFromComponentIDEngine : Engine - { - public override void Update(double dt) - { - var componentID = ReadComponent().Item1; - entityFromComponentIDResult = GetEntityByComponentID(componentID); - } - } - - [Test] - public void GetEntityFromComponentID() - { - var worldBuilder = new WorldBuilder(); - worldBuilder.AddEngine(new GetEntityFromComponentIDEngine()); - - MockComponent component; - component.myInt = 2; - component.myString = "howdy"; - - var entity = worldBuilder.CreateEntity(); - worldBuilder.SetComponent(entity, component); - - var world = worldBuilder.Build(); - world.Update(0.01); - - Assert.That(entity, Is.EqualTo(entityFromComponentIDResult)); - } - [Reads(typeof(MockComponent))] [WritesPending(typeof(MockComponent))] [Writes(typeof(MockComponent))] @@ -667,24 +630,22 @@ namespace Tests { public override void Update(double dt) { - foreach (var (mockComponentID, mockComponent) in ReadComponents()) + foreach (var (mockComponent, entity) in ReadComponentsIncludingEntity()) { - var entity = GetEntityByComponentID(mockComponentID); - RemoveComponent(mockComponentID); + RemoveComponent(entity); SetComponent(entity, new MockComponent()); } } } + static Entity entityResult; + [ReadsPending(typeof(MockComponent))] - class GetEntityFromPendingComponentIDEngine : Engine + class GetEntityFromPendingReadComponents : Engine { public override void Update(double dt) { - foreach (var (mockComponentID, mockComponent) in ReadComponents()) - { - entityFromComponentIDResult = GetEntityByComponentID(mockComponentID); - } + var (_, entity) = ReadComponentIncludingEntity(); } } @@ -693,7 +654,7 @@ namespace Tests { var worldBuilder = new WorldBuilder(); worldBuilder.AddEngine(new AddAndRemoveMockComponentEngine()); - worldBuilder.AddEngine(new GetEntityFromPendingComponentIDEngine()); + worldBuilder.AddEngine(new GetEntityFromPendingReadComponents()); var entity = worldBuilder.CreateEntity(); worldBuilder.SetComponent(entity, new MockComponent()); @@ -703,186 +664,14 @@ namespace Tests Assert.DoesNotThrow(() => world.Update(0.01)); } - [ReadsPending(typeof(MockComponent))] - class GetPendingComponentFromIDEngine : Engine - { - public override void Update(double dt) - { - foreach (var (mockComponentID, mockComponent) in ReadComponents()) - { - GetComponentByID(mockComponentID); - } - } - } - - [Test] - public void GetComponentFromID() - { - var worldBuilder = new WorldBuilder(); - worldBuilder.AddEngine(new AddAndRemoveMockComponentEngine()); - worldBuilder.AddEngine(new GetPendingComponentFromIDEngine()); - - var entity = worldBuilder.CreateEntity(); - worldBuilder.SetComponent(entity, new MockComponent()); - - var world = worldBuilder.Build(); - - Assert.DoesNotThrow(() => world.Update(0.01)); - } - - static MockComponent mockComponentByIDResult; - - [Reads(typeof(MockComponent))] - class GetComponentByIDEngine : Engine - { - public override void Update(double dt) - { - var componentID = ReadComponent().Item1; - mockComponentByIDResult = GetComponentByID(componentID); - } - } - [Test] - public void GetComponentByID() - { - var worldBuilder = new WorldBuilder(); - worldBuilder.AddEngine(new GetComponentByIDEngine()); - - MockComponent component; - component.myInt = 2; - component.myString = "howdy"; - - var entity = worldBuilder.CreateEntity(); - worldBuilder.SetComponent(entity, component); - - var world = worldBuilder.Build(); - world.Update(0.01f); - - Assert.That(component, Is.EqualTo(mockComponentByIDResult)); - } - - struct OtherComponent : IComponent { } - - [Reads(typeof(MockComponent), typeof(OtherComponent))] - class GetComponentByIDWithTypeMismatchEngine : Engine - { - public override void Update(double dt) - { - var componentID = ReadComponent().Item1; - GetComponentByID(componentID); - } - } - - [Test] - public void GetComponentByIDWithTypeMismatch() - { - var worldBuilder = new WorldBuilder(); - worldBuilder.AddEngine(new GetComponentByIDWithTypeMismatchEngine()); - - MockComponent component; - component.myInt = 2; - component.myString = "howdy"; - - var entity = worldBuilder.CreateEntity(); - worldBuilder.SetComponent(entity, component); - - var world = worldBuilder.Build(); - - Assert.Throws(() => world.Update(0.01f)); - } - - struct EntityIDComponent : IComponent { public Guid entityID; } - static bool hasEntity; - - [Reads(typeof(EntityIDComponent))] - 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; - - worldBuilder.SetComponent(entity, entityIDComponent); - - var world = worldBuilder.Build(); - - world.Update(0.01); - - Assert.IsTrue(hasEntity); - - world.Update(0.01); - - Assert.IsFalse(hasEntity); - } - - struct MockComponentUpdateMessage : IMessage - { - public Guid componentID; - public MockComponent mockComponent; - } - - [Reads(typeof(MockComponent))] - [Receives(typeof(MockComponentUpdateMessage))] - [Writes(typeof(MockComponent))] - class UpdateByComponentIDEngine : Engine - { - public override void Update(double dt) - { - foreach (var mockComponentUpdateMessage in ReadMessages()) - { - SetComponent(mockComponentUpdateMessage.componentID, mockComponentUpdateMessage.mockComponent); - SetComponent(mockComponentUpdateMessage.componentID, mockComponentUpdateMessage.mockComponent); - } - } - } - - [Test] - public void EngineUpdateByComponentID() - { - var worldBuilder = new WorldBuilder(); - worldBuilder.AddEngine(new UpdateByComponentIDEngine()); - - var entity = worldBuilder.CreateEntity(); - - MockComponent mockComponent; - mockComponent.myInt = 1; - mockComponent.myString = "5"; - - var mockComponentID = worldBuilder.SetComponent(entity, mockComponent); - - MockComponentUpdateMessage mockComponentUpdateMessage; - mockComponentUpdateMessage.componentID = mockComponentID; - mockComponentUpdateMessage.mockComponent = mockComponent; - worldBuilder.SendMessage(mockComponentUpdateMessage); - - var world = worldBuilder.Build(); - Assert.DoesNotThrow(() => world.Update(0.01)); - } - [Reads(typeof(MockComponent))] class DelayedMessageEngine : Engine { public override void Update(double dt) { - foreach (var (componentID, component) in ReadComponents()) + foreach (var (component, entity) in ReadComponentsIncludingEntity()) { - RemoveComponent(componentID); + RemoveComponent(entity); SendMessageDelayed(new MockMessage { }, 1); } } @@ -936,9 +725,9 @@ namespace Tests { public override void Update(double dt) { - foreach (var (componentID, component) in ReadComponents()) + foreach (var entity in ReadEntities()) { - RemoveComponent(componentID); + RemoveComponent(entity); } } } @@ -965,42 +754,13 @@ namespace Tests { public override void Update(double dt) { - foreach (var (componentID, component) in ReadComponents()) + foreach (var entity in ReadEntities()) { - SetComponent(componentID, new MockComponent { }); + SetComponent(entity, new MockComponent { }); } } } - [Receives(typeof(DestroyComponentMessage))] - class DestroyEntityByIDEngine : Engine - { - public override void Update(double dt) - { - foreach (var message in ReadMessages()) - { - Destroy(message.entity.ID); - } - } - } - - [Test] - public void EngineSetComponentAndDestroyEntitySameFrame() - { - var worldBuilder = new WorldBuilder(); - worldBuilder.AddEngine(new AddComponentEngine()); - worldBuilder.AddEngine(new DestroyEntityByIDEngine()); - - var entity = worldBuilder.CreateEntity(); - worldBuilder.SetComponent(entity, new MockComponent { }); - worldBuilder.SendMessage(new DestroyComponentMessage { entity = entity }); - - var world = worldBuilder.Build(); - world.Update(0.01); - - Assert.DoesNotThrow(() => world.Update(0.01)); - } - static Entity readEntity; [Reads(typeof(MockComponent))] @@ -1123,7 +883,7 @@ namespace Tests { public override void Update(double dt) { - foreach (var (_, _, entity) in ReadComponentsIncludingEntity()) + foreach (var (_, entity) in ReadComponentsIncludingEntity()) { RemoveComponent(entity); } diff --git a/test/GeneralRendererTest.cs b/test/GeneralRendererTest.cs index a508bab..8fa01d5 100644 --- a/test/GeneralRendererTest.cs +++ b/test/GeneralRendererTest.cs @@ -1,8 +1,4 @@ using NUnit.Framework; - -using System; -using System.Collections.Generic; - using Encompass; namespace Tests @@ -13,13 +9,13 @@ namespace Tests public class SingletonRead { - static ValueTuple result; + static (AComponent, Entity) result; class TestRenderer : GeneralRenderer { public override void Render() { - result = ReadComponent(); + result = ReadComponentIncludingEntity(); } } @@ -32,14 +28,14 @@ namespace Tests AComponent aComponent; var entity = worldBuilder.CreateEntity(); - var componentID = worldBuilder.SetComponent(entity, aComponent); + worldBuilder.SetComponent(entity, aComponent); var world = worldBuilder.Build(); world.Update(0.01f); world.Draw(); - Assert.That(result, Is.EqualTo(new ValueTuple(componentID, aComponent))); + Assert.That(result, Is.EqualTo((aComponent, entity))); } [Test] @@ -52,17 +48,17 @@ namespace Tests AComponent aComponentTwo; var entity = worldBuilder.CreateEntity(); - var componentID = worldBuilder.SetComponent(entity, aComponent); + worldBuilder.SetComponent(entity, aComponent); var entityB = worldBuilder.CreateEntity(); - var componentTwoID = worldBuilder.SetComponent(entityB, aComponentTwo); + worldBuilder.SetComponent(entityB, aComponentTwo); var world = worldBuilder.Build(); world.Update(0.01f); world.Draw(); - Assert.That(result, Is.EqualTo((componentID, aComponent)).Or.EqualTo((componentTwoID, aComponentTwo))); + Assert.That(result, Is.EqualTo((aComponent, entity)).Or.EqualTo((aComponentTwo, entityB))); } } } diff --git a/test/OrderedRendererTest.cs b/test/OrderedRendererTest.cs index 413ad3c..c113988 100644 --- a/test/OrderedRendererTest.cs +++ b/test/OrderedRendererTest.cs @@ -17,26 +17,26 @@ namespace Tests class TestRenderer : OrderedRenderer { - public override void Render(Guid drawComponentID, TestDrawComponent testDrawComponent) { } + public override void Render(Entity entity, TestDrawComponent testDrawComponent) { } } static bool called = false; class DeactivatedRenderer : TestRenderer { - public override void Render(Guid drawComponentID, TestDrawComponent testDrawComponent) + public override void Render(Entity entity, TestDrawComponent testDrawComponent) { called = true; } } static bool calledOnDraw = false; - static ValueTuple resultComponent; + static (TestDrawComponent, Entity) resultComponent; class CalledRenderer : OrderedRenderer { - public override void Render(Guid drawComponentID, TestDrawComponent testDrawComponent) + public override void Render(Entity entity, TestDrawComponent testDrawComponent) { - resultComponent = (drawComponentID, testDrawComponent); + resultComponent = (testDrawComponent, entity); calledOnDraw = true; } } @@ -54,7 +54,7 @@ namespace Tests var entity = worldBuilder.CreateEntity(); worldBuilder.SetComponent(entity, aComponent); worldBuilder.SetComponent(entity, cComponent); - var testDrawComponentID = worldBuilder.SetDrawComponent(entity, testDrawComponent, 2); + worldBuilder.SetDrawComponent(entity, testDrawComponent, 2); var world = worldBuilder.Build(); @@ -62,7 +62,7 @@ namespace Tests world.Draw(); Assert.IsTrue(calledOnDraw); - resultComponent.Should().BeEquivalentTo((testDrawComponentID, testDrawComponent)); + resultComponent.Should().BeEquivalentTo((testDrawComponent, entity)); } [Reads(typeof(TestDrawComponent))] @@ -70,9 +70,9 @@ namespace Tests { public override void Update(double dt) { - foreach (var (componentID, component) in ReadComponents()) + foreach (var entity in ReadEntities()) { - Destroy(GetEntityIDByComponentID(componentID)); + Destroy(entity); } } } @@ -88,7 +88,7 @@ namespace Tests TestDrawComponent testDrawComponent; var entity = worldBuilder.CreateEntity(); - var testDrawComponentID = worldBuilder.SetDrawComponent(entity, testDrawComponent, 1); + worldBuilder.SetDrawComponent(entity, testDrawComponent, 1); var world = worldBuilder.Build(); diff --git a/test/WorldBuilderTest.cs b/test/WorldBuilderTest.cs index d154697..e58b665 100644 --- a/test/WorldBuilderTest.cs +++ b/test/WorldBuilderTest.cs @@ -186,7 +186,7 @@ namespace Tests { public override void Update(double dt) { - resultComponent = ReadComponent().Item2; + resultComponent = ReadComponent(); } } @@ -257,7 +257,7 @@ namespace Tests { public override void Update(double dt) { - resultComponent = ReadComponent().Item2; + resultComponent = ReadComponent(); } } diff --git a/test/WorldTest.cs b/test/WorldTest.cs index ae2ffa2..abfe7c3 100644 --- a/test/WorldTest.cs +++ b/test/WorldTest.cs @@ -18,9 +18,9 @@ namespace Tests class TestEntityRenderer : OrderedRenderer { - public override void Render(Guid drawComponentID, TestDrawComponent testDrawComponent) + public override void Render(Entity entity, TestDrawComponent testDrawComponent) { - drawOrder.Add(drawComponentID); + drawOrder.Add(entity); } } @@ -44,32 +44,32 @@ namespace Tests var entity = worldBuilder.CreateEntity(); worldBuilder.SetComponent(entity, testComponent); - var testDrawComponentOneID = worldBuilder.SetDrawComponent(entity, testDrawComponent, 3); + worldBuilder.SetDrawComponent(entity, testDrawComponent, 3); TestDrawComponent testDrawComponentTwo = default(TestDrawComponent); var entityTwo = worldBuilder.CreateEntity(); worldBuilder.SetComponent(entityTwo, testComponent); - var testDrawComponentTwoID = worldBuilder.SetDrawComponent(entityTwo, testDrawComponentTwo, 1); + worldBuilder.SetDrawComponent(entityTwo, testDrawComponentTwo, 1); TestDrawComponent testDrawComponentThree = default(TestDrawComponent); var entityThree = worldBuilder.CreateEntity(); worldBuilder.SetComponent(entityThree, testComponent); - var testDrawComponentThreeID = worldBuilder.SetDrawComponent(entityThree, testDrawComponentThree, 5); + worldBuilder.SetDrawComponent(entityThree, testDrawComponentThree, 5); TestDrawComponent testDrawComponentFour = default(TestDrawComponent); var entityFour = worldBuilder.CreateEntity(); worldBuilder.SetComponent(entityFour, testComponent); - var testDrawComponentFourID = worldBuilder.SetDrawComponent(entityFour, testDrawComponentFour, -5); + worldBuilder.SetDrawComponent(entityFour, testDrawComponentFour, -5); var world = worldBuilder.Build(); world.Update(0.01f); world.Draw(); - drawOrder.Should().BeEquivalentTo(testDrawComponentFourID, testDrawComponentTwoID, testDrawComponentOneID, testDrawComponentThreeID, testGeneralRenderer); + drawOrder.Should().BeEquivalentTo(entityFour, entityTwo, entity, entityThree, testGeneralRenderer); } } }