From e4b4e473273e13e9ec3084c38059e0755e007cd3 Mon Sep 17 00:00:00 2001 From: Evan Hemsley Date: Thu, 13 Jun 2019 22:15:15 -0700 Subject: [PATCH] changing everything to structs --- src/Component.cs | 2 +- src/ComponentManager.cs | 38 +++++++++++++++++--------------------- src/Entity.cs | 12 ++++++------ test/EntityTest.cs | 38 +++++++++++++++++++++++++++++--------- 4 files changed, 53 insertions(+), 37 deletions(-) diff --git a/src/Component.cs b/src/Component.cs index d0660f8..2f7ee8c 100644 --- a/src/Component.cs +++ b/src/Component.cs @@ -1,4 +1,4 @@ namespace Encompass { - public abstract class Component {} + public interface IComponent {} } diff --git a/src/ComponentManager.cs b/src/ComponentManager.cs index 06be097..1153aaa 100644 --- a/src/ComponentManager.cs +++ b/src/ComponentManager.cs @@ -4,49 +4,45 @@ using System.Linq; namespace Encompass { internal class ComponentManager { - private Dictionary> entityIDToComponents = new Dictionary>(); + private Dictionary> entityIDToComponents = new Dictionary>(); - private Dictionary> activeComponents = new Dictionary>(); - private Dictionary> inactiveComponents = new Dictionary>(); + private Dictionary> activeComponents = new Dictionary>(); + private Dictionary> inactiveComponents = new Dictionary>(); - private List componentsToActivate = new List(); - private List componentsToDeactivate = new List(); - private List componentsToRemove = new List(); - - internal TComponent CreateComponent(uint entityID) where TComponent : Component, new() { - var component = new TComponent(); + private List componentsToActivate = new List(); + private List componentsToDeactivate = new List(); + private List componentsToRemove = new List(); + internal void AddComponent(uint entityID, TComponent component) where TComponent : struct, IComponent { if (!entityIDToComponents.ContainsKey(entityID)) { - entityIDToComponents.Add(entityID, new List()); + entityIDToComponents.Add(entityID, new List()); } entityIDToComponents[entityID].Add(component); if (!activeComponents.ContainsKey(typeof(TComponent))) { - activeComponents.Add(typeof(TComponent), new List()); - inactiveComponents.Add(typeof(TComponent), new List()); + activeComponents.Add(typeof(TComponent), new List()); + inactiveComponents.Add(typeof(TComponent), new List()); } MarkForActivation(component); - - return component; } - internal IEnumerable GetComponentsByEntity(uint entityID) { + internal IEnumerable GetComponentsByEntity(uint entityID) { return entityIDToComponents[entityID]; } - internal IEnumerable GetActiveComponentsByType() where TComponent : Component { + internal IEnumerable GetActiveComponentsByType() where TComponent : struct, IComponent { return activeComponents[typeof(TComponent)].Cast(); } - internal IEnumerable GetComponentsByEntityAndType(uint entityID) where TComponent : Component { - var entity_components = GetComponentsByEntity(entityID); + internal IEnumerable GetComponentsByEntityAndType(uint entityID) where TComponent : struct, IComponent { + var entity_components = GetComponentsByEntity(entityID).Cast(); var active_components_by_type = GetActiveComponentsByType(); return entity_components.Intersect(active_components_by_type).Cast(); } - internal bool EntityHasComponentOfType(uint entityID) where TComponent : Component { + internal bool EntityHasComponentOfType(uint entityID) where TComponent : struct, IComponent { return GetComponentsByEntityAndType(entityID).Any(); } @@ -61,11 +57,11 @@ namespace Encompass { entityIDToComponents.Remove(entityID); } - internal void MarkForActivation(Component component) { + internal void MarkForActivation(IComponent component) { componentsToActivate.Add(component); } - internal void MarkForRemoval(Component component) { + internal void MarkForRemoval(IComponent component) { componentsToRemove.Add(component); } diff --git a/src/Entity.cs b/src/Entity.cs index 9b76c5f..abdf8ba 100644 --- a/src/Entity.cs +++ b/src/Entity.cs @@ -4,7 +4,7 @@ using System.Linq; namespace Encompass { - public class Entity + public struct Entity { public readonly uint id; @@ -15,19 +15,19 @@ namespace Encompass this.componentManager = componentManager; } - public TComponent AddComponent() where TComponent : Component, new() { - return componentManager.CreateComponent(id); + public void AddComponent(TComponent component) where TComponent : struct, IComponent { + componentManager.AddComponent(id, component); } - public IEnumerable GetComponents() where TComponent : Component { + public IEnumerable GetComponents() where TComponent : struct, IComponent { return componentManager.GetComponentsByEntityAndType(id); } - public TComponent GetComponent() where TComponent : Component { + public TComponent GetComponent() where TComponent : struct, IComponent { return GetComponents().First(); } - public bool HasComponent() where TComponent : Component { + public bool HasComponent() where TComponent : struct, IComponent { return componentManager.EntityHasComponentOfType(id); } diff --git a/test/EntityTest.cs b/test/EntityTest.cs index 230e11c..dba42e2 100644 --- a/test/EntityTest.cs +++ b/test/EntityTest.cs @@ -4,7 +4,7 @@ using System.Linq; namespace Encompass { namespace Tests { - class MockComponent : Component { + struct MockComponent : IComponent { public string myString; public int myInt; } @@ -17,9 +17,11 @@ namespace Encompass var world = new World(); var entity = world.CreateEntity(); - var mockComponent = entity.AddComponent(); - mockComponent.myString = "hello"; + MockComponent mockComponent; mockComponent.myInt = 3; + mockComponent.myString = "hello"; + + entity.AddComponent(mockComponent); world.Update(); @@ -33,9 +35,21 @@ namespace Encompass var world = new World(); var entity = world.CreateEntity(); - var mockComponentA = entity.AddComponent(); - var mockComponentB = entity.AddComponent(); - var mockComponentC = entity.AddComponent(); + MockComponent mockComponentA; + mockComponentA.myInt = 3; + mockComponentA.myString = "hello"; + + MockComponent mockComponentB; + mockComponentB.myInt = 5; + mockComponentB.myString = "wassup"; + + MockComponent mockComponentC; + mockComponentC.myInt = 1; + mockComponentC.myString = "howdy"; + + entity.AddComponent(mockComponentA); + entity.AddComponent(mockComponentB); + entity.AddComponent(mockComponentC); world.Update(); @@ -50,9 +64,11 @@ namespace Encompass var world = new World(); var entity = world.CreateEntity(); - var mockComponent = entity.AddComponent(); - mockComponent.myString = "hello"; + MockComponent mockComponent; mockComponent.myInt = 3; + mockComponent.myString = "hello"; + + entity.AddComponent(mockComponent); world.Update(); @@ -65,7 +81,11 @@ namespace Encompass var world = new World(); var entity = world.CreateEntity(); - var mockComponent = entity.AddComponent(); + MockComponent mockComponent; + mockComponent.myInt = 3; + mockComponent.myString = "hello"; + + entity.AddComponent(mockComponent); world.Update();