diff options
Diffstat (limited to 'Plugins/MonoGame.Extended/source/MonoGame.Extended.Entities/EntitySubscription.cs')
-rw-r--r-- | Plugins/MonoGame.Extended/source/MonoGame.Extended.Entities/EntitySubscription.cs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/Plugins/MonoGame.Extended/source/MonoGame.Extended.Entities/EntitySubscription.cs b/Plugins/MonoGame.Extended/source/MonoGame.Extended.Entities/EntitySubscription.cs new file mode 100644 index 0000000..6766b0f --- /dev/null +++ b/Plugins/MonoGame.Extended/source/MonoGame.Extended.Entities/EntitySubscription.cs @@ -0,0 +1,61 @@ +using System; +using MonoGame.Extended.Collections; + +namespace MonoGame.Extended.Entities +{ + internal class EntitySubscription : IDisposable + { + private readonly Bag<int> _activeEntities; + private readonly EntityManager _entityManager; + private readonly Aspect _aspect; + private bool _rebuildActives; + + internal EntitySubscription(EntityManager entityManager, Aspect aspect) + { + _entityManager = entityManager; + _aspect = aspect; + _activeEntities = new Bag<int>(entityManager.Capacity); + _rebuildActives = true; + + _entityManager.EntityAdded += OnEntityAdded; + _entityManager.EntityRemoved += OnEntityRemoved; + _entityManager.EntityChanged += OnEntityChanged; + } + + private void OnEntityAdded(int entityId) + { + if (_aspect.IsInterested(_entityManager.GetComponentBits(entityId))) + _activeEntities.Add(entityId); + } + + private void OnEntityRemoved(int entityId) => _rebuildActives = true; + private void OnEntityChanged(int entityId) => _rebuildActives = true; + + public void Dispose() + { + _entityManager.EntityAdded -= OnEntityAdded; + _entityManager.EntityRemoved -= OnEntityRemoved; + } + + public Bag<int> ActiveEntities + { + get + { + if (_rebuildActives) + RebuildActives(); + + return _activeEntities; + } + } + + private void RebuildActives() + { + _activeEntities.Clear(); + + foreach (var entity in _entityManager.Entities) + OnEntityAdded(entity); + + _rebuildActives = false; + } + } +}
\ No newline at end of file |