Mirror of Svelto.ECS because we're a fan of it
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

81 líneas
2.3KB

  1. using System;
  2. using System.Runtime.CompilerServices;
  3. using System.Runtime.InteropServices;
  4. #pragma warning disable 660,661
  5. namespace Svelto.ECS
  6. {
  7. /// <summary>
  8. /// Todo: EntityReference shouldn't map EGIDs as dictionaries keys but directly the indices in the EntityDB arrays
  9. /// </summary>
  10. [Serialization.DoNotSerialize]
  11. [Serializable]
  12. [StructLayout(LayoutKind.Explicit)]
  13. public struct EntityReference : IEquatable<EntityReference>
  14. {
  15. [FieldOffset(0)] public readonly uint uniqueID;
  16. [FieldOffset(4)] public readonly uint version;
  17. [FieldOffset(0)] readonly ulong _GID;
  18. internal uint index => uniqueID - 1;
  19. public static bool operator ==(EntityReference obj1, EntityReference obj2)
  20. {
  21. return obj1._GID == obj2._GID;
  22. }
  23. public static bool operator !=(EntityReference obj1, EntityReference obj2)
  24. {
  25. return obj1._GID != obj2._GID;
  26. }
  27. public override int GetHashCode() { return _GID.GetHashCode(); }
  28. public EntityReference(uint uniqueId) : this(uniqueId, 0) {}
  29. public EntityReference(uint uniqueId, uint version) : this()
  30. {
  31. _GID = MAKE_GLOBAL_ID(uniqueId, version);
  32. }
  33. public bool Equals(EntityReference other)
  34. {
  35. return _GID == other._GID;
  36. }
  37. public bool Equals(EntityReference x, EntityReference y)
  38. {
  39. return x._GID == y._GID;
  40. }
  41. public override string ToString()
  42. {
  43. return "id:".FastConcat(uniqueID).FastConcat(" version:").FastConcat(version);
  44. }
  45. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  46. public EGID ToEGID(EntitiesDB entitiesDB)
  47. {
  48. DBC.ECS.Check.Require(this != Invalid, "Invalid Reference Used");
  49. return entitiesDB.GetEGID(this);
  50. }
  51. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  52. public bool ToEGID(EntitiesDB entitiesDB, out EGID egid)
  53. {
  54. DBC.ECS.Check.Require(this != Invalid, "Invalid Reference Used");
  55. return entitiesDB.TryGetEGID(this, out egid);
  56. }
  57. static ulong MAKE_GLOBAL_ID(uint uniqueId, uint version)
  58. {
  59. return (ulong)version << 32 | ((ulong)uniqueId & 0xFFFFFFFF);
  60. }
  61. public static EntityReference Invalid => default;
  62. }
  63. }