Mirror of Svelto.ECS because we're a fan of it
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.2KB

  1. using System;
  2. using System.Runtime.CompilerServices;
  3. using Svelto.ECS.Internal;
  4. namespace Svelto.ECS
  5. {
  6. public readonly struct CombinedFilterID
  7. {
  8. //filter (32) | contextID (16) | component type (16)
  9. readonly long id;
  10. //a context ID is 16bit
  11. public FilterContextID contextID
  12. {
  13. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  14. get => new FilterContextID((ushort)((id & 0xFFFF0000) >> 16));
  15. }
  16. public uint filterID
  17. {
  18. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  19. get => (uint)(id >> 32);
  20. }
  21. public CombinedFilterID(int filterID, FilterContextID contextID)
  22. {
  23. id = (long)filterID << 32 | (long)contextID.id << 16;
  24. }
  25. public CombinedFilterID(uint filterID, FilterContextID contextID)
  26. {
  27. id = (long)filterID << 32 | (long)contextID.id << 16;
  28. }
  29. public static implicit operator CombinedFilterID((int filterID, FilterContextID contextID) data)
  30. {
  31. return new CombinedFilterID(data.filterID, data.contextID);
  32. }
  33. }
  34. readonly struct CombinedFilterComponentID: IEquatable<CombinedFilterComponentID>
  35. {
  36. //filter (32) | contextID (16) | component type (16)
  37. internal readonly long id;
  38. //a context ID is 16bit
  39. public FilterContextID contextID
  40. {
  41. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  42. get
  43. {
  44. return new FilterContextID((ushort)((id & 0xFFFF0000) >> 16));
  45. }
  46. }
  47. public uint filterID
  48. {
  49. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  50. get
  51. {
  52. return (uint)(id >> 32);
  53. }
  54. }
  55. public uint contextComponentID
  56. {
  57. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  58. get
  59. {
  60. return (uint)(id & 0xFFFF);
  61. }
  62. }
  63. public CombinedFilterComponentID(int filterID, FilterContextID contextID)
  64. {
  65. id = (long)filterID << 32 | (uint)contextID.id << 16;
  66. }
  67. public CombinedFilterComponentID(uint filterIdFilterId, FilterContextID filterIdContextId, ComponentID componentid)
  68. {
  69. id = (long)filterIdFilterId << 32 | (long)filterIdContextId.id << 16 | (long)(uint)componentid;
  70. }
  71. public bool Equals(CombinedFilterComponentID other)
  72. {
  73. return id == other.id;
  74. }
  75. public override int GetHashCode()
  76. {
  77. return id.GetHashCode();
  78. }
  79. }
  80. public static class CombinedFilterIDExtensions
  81. {
  82. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  83. internal static CombinedFilterComponentID CombineComponent<T>(this CombinedFilterID filterID)
  84. where T : struct, _IInternalEntityComponent
  85. {
  86. var componentid = ComponentTypeID<T>.id;
  87. DBC.ECS.Check.Require(componentid < ushort.MaxValue, "too many component types registered, HOW :)");
  88. return new CombinedFilterComponentID(filterID.filterID, filterID.contextID, componentid);
  89. }
  90. }
  91. }