Mirror of Svelto.ECS because we're a fan of it
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

72 lignes
1.9KB

  1. using Svelto.DataStructures;
  2. using Svelto.ECS.Internal;
  3. namespace Svelto.ECS
  4. {
  5. interface ITypeSafeStream
  6. {
  7. void Dispose();
  8. }
  9. public class EntityStream<T> : ITypeSafeStream where T : unmanaged, _IInternalEntityComponent
  10. {
  11. readonly ThreadSafeFasterList<Consumer<T>> _consumers;
  12. internal EntityStream()
  13. {
  14. _consumers = new ThreadSafeFasterList<Consumer<T>>();
  15. }
  16. ~EntityStream()
  17. {
  18. for (var i = 0; i < _consumers.count; i++)
  19. _consumers[i].Free();
  20. }
  21. public void Dispose()
  22. { }
  23. internal void PublishEntity(ref T entity, EGID egid)
  24. {
  25. for (var i = 0; i < _consumers.count; i++)
  26. unsafe
  27. {
  28. if (*(bool*) _consumers[i].mustBeDisposed)
  29. {
  30. _consumers[i].Free();
  31. _consumers.UnorderedRemoveAt((uint) i);
  32. --i;
  33. continue;
  34. }
  35. if (_consumers[i].hasGroup)
  36. {
  37. if (egid.groupID == _consumers[i].@group)
  38. _consumers[i].Enqueue(entity, egid);
  39. }
  40. else
  41. {
  42. _consumers[i].Enqueue(entity, egid);
  43. }
  44. }
  45. }
  46. internal Consumer<T> GenerateConsumer(string name, uint capacity)
  47. {
  48. var consumer = new Consumer<T>(name, capacity);
  49. _consumers.Add(consumer);
  50. return consumer;
  51. }
  52. internal Consumer<T> GenerateConsumer(ExclusiveGroupStruct group, string name, uint capacity)
  53. {
  54. var consumer = new Consumer<T>(group, name, capacity);
  55. _consumers.Add(consumer);
  56. return consumer;
  57. }
  58. }
  59. }