Mirror of Svelto.ECS because we're a fan of it
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

106 wiersze
3.6KB

  1. #if SVELTO_LEGACY_FILTERS
  2. using Svelto.DataStructures;
  3. using Svelto.DataStructures.Native;
  4. namespace Svelto.ECS
  5. {
  6. public struct LegacyGroupFilters
  7. {
  8. internal LegacyGroupFilters(SharedSveltoDictionaryNative<int, LegacyFilterGroup> legacyFilters, ExclusiveGroupStruct group)
  9. {
  10. this._legacyFilters = legacyFilters;
  11. _group = @group;
  12. }
  13. public ref LegacyFilterGroup GetFilter(int filterIndex)
  14. {
  15. #if DEBUG && !PROFILE_SVELTO
  16. if (_legacyFilters.isValid == false)
  17. throw new ECSException($"trying to fetch not existing filters {filterIndex} group {_group.ToName()}");
  18. if (_legacyFilters.ContainsKey(filterIndex) == false)
  19. throw new ECSException($"trying to fetch not existing filters {filterIndex} group {_group.ToName()}");
  20. #endif
  21. return ref _legacyFilters.GetValueByRef(filterIndex);
  22. }
  23. public bool HasFilter(int filterIndex) { return _legacyFilters.ContainsKey(filterIndex); }
  24. public void ClearFilter(int filterIndex)
  25. {
  26. if (_legacyFilters.TryFindIndex(filterIndex, out var index))
  27. _legacyFilters.GetValues(out _)[index].Clear();
  28. }
  29. public void ClearFilters()
  30. {
  31. foreach (var filter in _legacyFilters)
  32. filter.value.Clear();
  33. }
  34. public bool TryGetFilter(int filterIndex, out LegacyFilterGroup legacyFilter)
  35. {
  36. return _legacyFilters.TryGetValue(filterIndex, out legacyFilter);
  37. }
  38. public SveltoDictionaryKeyValueEnumerator<int, LegacyFilterGroup, NativeStrategy<SveltoDictionaryNode<int>>, NativeStrategy<LegacyFilterGroup>
  39. , NativeStrategy<int>> GetEnumerator()
  40. {
  41. return _legacyFilters.GetEnumerator();
  42. }
  43. //Note the following methods are internal because I was pondering the idea to be able to return
  44. //the list of LegacyGroupFilters linked to a specific filter ID. However this would mean to be able to
  45. //maintain a revers map which at this moment seems too much and also would need the following
  46. //method to be for ever internal (at this point in time I am not sure it's a good idea)
  47. internal void DisposeFilter(int filterIndex)
  48. {
  49. if (_legacyFilters.TryFindIndex(filterIndex, out var index))
  50. {
  51. ref var filterGroup = ref _legacyFilters.GetValues(out _)[index];
  52. filterGroup.Dispose();
  53. _legacyFilters.Remove(filterIndex);
  54. }
  55. }
  56. internal void DisposeFilters()
  57. {
  58. //must release the native buffers!
  59. foreach (var filter in _legacyFilters)
  60. filter.value.Dispose();
  61. _legacyFilters.Clear();
  62. }
  63. internal ref LegacyFilterGroup CreateOrGetFilter(int filterID)
  64. {
  65. if (_legacyFilters.TryFindIndex(filterID, out var index) == false)
  66. {
  67. var orGetFilterForGroup = new LegacyFilterGroup(_group, filterID);
  68. _legacyFilters[filterID] = orGetFilterForGroup;
  69. return ref _legacyFilters.GetValueByRef(filterID);
  70. }
  71. return ref _legacyFilters.GetValues(out _)[index];
  72. }
  73. internal void Dispose()
  74. {
  75. foreach (var filter in _legacyFilters)
  76. {
  77. filter.value.Dispose();
  78. }
  79. _legacyFilters.Dispose();
  80. }
  81. readonly ExclusiveGroupStruct _group;
  82. //filterID, filter
  83. SharedSveltoDictionaryNative<int, LegacyFilterGroup> _legacyFilters;
  84. }
  85. }
  86. #endif