Guest User

Untitled

a guest
Jan 20th, 2019
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.43 KB | None | 0 0
  1.     internal class EntityManager
  2.     {
  3.         #region Constructor
  4.  
  5.         public EntityManager()
  6.         {
  7.             activeEntities = new List<Guid>();
  8.             componentPools = new Dictionary<Type, object>();
  9.             Systems = new KeyedByTypeCollection<ISystem>();
  10.         }
  11.  
  12.         #endregion Constructor
  13.  
  14.         #region Variables
  15.  
  16.         private List<Guid> activeEntities;
  17.  
  18.         private Dictionary<Type, object> componentPools;
  19.  
  20.         #endregion Variables
  21.  
  22.         #region Properties
  23.  
  24.         public KeyedByTypeCollection<ISystem> Systems { get; }
  25.  
  26.         public IReadOnlyList<Guid> ActiveEntities { get { return activeEntities; } }
  27.  
  28.         #endregion Properties
  29.  
  30.         #region Methods
  31.  
  32.         #region Core Methods
  33.  
  34.         #region Entity Management
  35.  
  36.         public Guid CreateEntity()
  37.         {
  38.             Guid entityId = Guid.NewGuid();
  39.             activeEntities.Add(entityId);
  40.  
  41.             foreach (ISystem system in Systems)
  42.             {
  43.                 if (system.ComponentRequirements.Count < 1)
  44.                 {
  45.                     system.EntityCache.Add(entityId);
  46.                 }
  47.             }
  48.  
  49.             return entityId;
  50.         }
  51.  
  52.         public void DestroyEntity(Guid entityId)
  53.         {
  54.             activeEntities.Remove(entityId);
  55.  
  56.             foreach (KeyValuePair<Type, object> componentPool in componentPools)
  57.             {
  58.                 Dictionary<Guid, object> typedTargetPool = (Dictionary<Guid, object>)componentPool.Value;
  59.                 typedTargetPool.Remove(entityId);
  60.             }
  61.  
  62.             foreach (ISystem system in Systems)
  63.             {
  64.                 system.EntityCache.Remove(entityId);
  65.             }
  66.         }
  67.  
  68.         public void AddComponentToEntity<TComponent>(Guid entityId, TComponent component) where TComponent : IComponent
  69.         {
  70.             GetComponentPoolByType<TComponent>().Add(entityId, component);
  71.  
  72.             foreach (ISystem system in Systems)
  73.             {
  74.  
  75.                 Type[] componentTypes = ; // MISSING PART HERE
  76.  
  77.                 if (system.ComponentRequirements.ValidateEntity(componentTypes))
  78.                 {
  79.                     system.EntityCache.Add(entityId);
  80.                 }
  81.             }
  82.         }
  83.  
  84.         public void RemoveComponentFromEntity<TComponent>(Guid entityId) where TComponent : IComponent
  85.         {
  86.             GetComponentPoolByType<TComponent>().Remove(entityId);
  87.  
  88.             foreach (ISystem system in Systems)
  89.             {
  90.                 if (system.ComponentRequirements.RequiresComponent<TComponent>())
  91.                 {
  92.                     system.EntityCache.Remove(entityId);
  93.                 }
  94.             }
  95.         }
  96.  
  97.         #endregion Entity Management
  98.  
  99.         #region Pool Management
  100.  
  101.         public Dictionary<Guid, TComponent> GetComponentPool<TComponent>() where TComponent : IComponent
  102.         {
  103.             return GetComponentPoolByType<TComponent>();
  104.         }
  105.  
  106.         public void AddComponentPool<TComponent>() where TComponent : IComponent
  107.         {
  108.             componentPools.Add(typeof(TComponent), new Dictionary<Guid, TComponent>());
  109.         }
  110.  
  111.         public void RemoveComponentPool<TComponent>() where TComponent : IComponent
  112.         {
  113.             if (!Systems.Any(system => system.ComponentRequirements.RequiresComponent<TComponent>()))
  114.             {
  115.                 List<Guid> entitiesToRemoveFromSystemCaches = GetComponentPoolByType<TComponent>().Keys.ToList();
  116.  
  117.                 componentPools.Remove(typeof(TComponent));
  118.  
  119.                 foreach (ISystem system in Systems)
  120.                 {
  121.                     if (system.ComponentRequirements.RequiresComponent<TComponent>())
  122.                     {
  123.                         for (int i = 0; i < entitiesToRemoveFromSystemCaches.Count; i++)
  124.                         {
  125.                             system.EntityCache.Remove(entitiesToRemoveFromSystemCaches[i]);
  126.                         }
  127.                     }
  128.                 }
  129.             }
  130.         }
  131.  
  132.         #endregion Pool Management
  133.  
  134.         #endregion Core Methods
  135.  
  136.         #region Helper Methods
  137.  
  138.         private Dictionary<Guid, TComponent> GetComponentPoolByType<TComponent>() where TComponent : IComponent
  139.         {
  140.             object targetPool = componentPools[typeof(TComponent)];
  141.             return (Dictionary<Guid, TComponent>)targetPool;
  142.         }
  143.  
  144.         #endregion Helper Methods
  145.  
  146.         #endregion Methods
  147.     }
Advertisement
Add Comment
Please, Sign In to add comment