EntitySubscription.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System;
  2. using MonoGame.Extended.Collections;
  3. namespace MonoGame.Extended.ECS
  4. {
  5. internal class EntitySubscription : IDisposable
  6. {
  7. private readonly Bag<int> _activeEntities;
  8. private readonly EntityManager _entityManager;
  9. private readonly Aspect _aspect;
  10. private bool _rebuildActives;
  11. internal EntitySubscription(EntityManager entityManager, Aspect aspect)
  12. {
  13. _entityManager = entityManager;
  14. _aspect = aspect;
  15. _activeEntities = new Bag<int>(entityManager.Capacity);
  16. _rebuildActives = true;
  17. _entityManager.EntityAdded += OnEntityAdded;
  18. _entityManager.EntityRemoved += OnEntityRemoved;
  19. _entityManager.EntityChanged += OnEntityChanged;
  20. }
  21. private void OnEntityAdded(int entityId)
  22. {
  23. if (_aspect.IsInterested(_entityManager.GetComponentBits(entityId)))
  24. _activeEntities.Add(entityId);
  25. }
  26. private void OnEntityRemoved(int entityId) => _rebuildActives = true;
  27. private void OnEntityChanged(int entityId) => _rebuildActives = true;
  28. public void Dispose()
  29. {
  30. _entityManager.EntityAdded -= OnEntityAdded;
  31. _entityManager.EntityRemoved -= OnEntityRemoved;
  32. }
  33. public Bag<int> ActiveEntities
  34. {
  35. get
  36. {
  37. if (_rebuildActives)
  38. RebuildActives();
  39. return _activeEntities;
  40. }
  41. }
  42. private void RebuildActives()
  43. {
  44. _activeEntities.Clear();
  45. foreach (var entity in _entityManager.Entities)
  46. OnEntityAdded(entity);
  47. _rebuildActives = false;
  48. }
  49. }
  50. }