Mirror of Svelto.ECS because we're a fan of it
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

103 řádky
3.0KB

  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 static implicit operator CombinedFilterID((int filterID, FilterContextID contextID) data)
  26. {
  27. return new CombinedFilterID(data.filterID, data.contextID);
  28. }
  29. }
  30. readonly struct CombinedFilterComponentID: IEquatable<CombinedFilterComponentID>
  31. {
  32. //filter (32) | contextID (16) | component type (16)
  33. internal readonly long id;
  34. //a context ID is 16bit
  35. public FilterContextID contextID
  36. {
  37. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  38. get
  39. {
  40. return new FilterContextID((ushort)((id & 0xFFFF0000) >> 16));
  41. }
  42. }
  43. public uint filterID
  44. {
  45. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  46. get
  47. {
  48. return (uint)(id >> 32);
  49. }
  50. }
  51. public uint contextComponentID
  52. {
  53. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  54. get
  55. {
  56. return (uint)(id & 0xFFFF);
  57. }
  58. }
  59. public CombinedFilterComponentID(int filterID, FilterContextID contextID)
  60. {
  61. id = (long)filterID << 32 | (uint)contextID.id << 16;
  62. }
  63. public CombinedFilterComponentID(uint filterIdFilterId, FilterContextID filterIdContextId, ComponentID componentid)
  64. {
  65. id = (long)filterIdFilterId << 32 | (long)filterIdContextId.id << 16 | (long)(uint)componentid;
  66. }
  67. public bool Equals(CombinedFilterComponentID other)
  68. {
  69. return id == other.id;
  70. }
  71. public override int GetHashCode()
  72. {
  73. return id.GetHashCode();
  74. }
  75. }
  76. public static class CombinedFilterIDExtensions
  77. {
  78. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  79. internal static CombinedFilterComponentID CombineComponent<T>(this CombinedFilterID filterID)
  80. where T : struct, _IInternalEntityComponent
  81. {
  82. var componentid = ComponentTypeID<T>.id;
  83. DBC.ECS.Check.Require(componentid < ushort.MaxValue, "too many component types registered, HOW :)");
  84. return new CombinedFilterComponentID(filterID.filterID, filterID.contextID, componentid);
  85. }
  86. }
  87. }