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ů.

77 řádky
3.8KB

  1. using Svelto.ECS.Serialization;
  2. namespace Svelto.ECS
  3. {
  4. public partial class EnginesRoot
  5. {
  6. readonly struct SerializableEntityHeader
  7. {
  8. public readonly uint descriptorHash;
  9. public readonly byte entityComponentsCount;
  10. const uint SIZE = 4 + 4 + 4 + 1;
  11. internal SerializableEntityHeader(uint descriptorHash_, EGID egid_, byte entityComponentsCount_)
  12. {
  13. entityComponentsCount = entityComponentsCount_;
  14. descriptorHash = descriptorHash_;
  15. egid = egid_;
  16. }
  17. internal SerializableEntityHeader(ISerializationData serializationData)
  18. {
  19. descriptorHash = (uint)
  20. (serializationData.data[serializationData.dataPos++]
  21. | serializationData.data[serializationData.dataPos++] << 8
  22. | serializationData.data[serializationData.dataPos++] << 16
  23. | serializationData.data[serializationData.dataPos++] << 24);
  24. uint entityID = (uint)
  25. (serializationData.data[serializationData.dataPos++]
  26. | serializationData.data[serializationData.dataPos++] << 8
  27. | serializationData.data[serializationData.dataPos++] << 16
  28. | serializationData.data[serializationData.dataPos++] << 24);
  29. uint groupID = (uint)
  30. (serializationData.data[serializationData.dataPos++]
  31. | serializationData.data[serializationData.dataPos++] << 8
  32. | serializationData.data[serializationData.dataPos++] << 16);
  33. var byteMask = serializationData.data[serializationData.dataPos++];
  34. entityComponentsCount = serializationData.data[serializationData.dataPos++];
  35. egid = new EGID(entityID, new ExclusiveGroupStruct(groupID, byteMask));
  36. }
  37. internal void Copy(ISerializationData serializationData)
  38. {
  39. serializationData.data.IncrementCountBy(SIZE);
  40. // Splitting the descriptorHash_ (uint, 32 bit) into four bytes.
  41. serializationData.data[serializationData.dataPos++] = (byte) (descriptorHash & 0xff);
  42. serializationData.data[serializationData.dataPos++] = (byte) ((descriptorHash >> 8) & 0xff);
  43. serializationData.data[serializationData.dataPos++] = (byte) ((descriptorHash >> 16) & 0xff);
  44. serializationData.data[serializationData.dataPos++] = (byte) ((descriptorHash >> 24) & 0xff);
  45. // Splitting the entityID (uint, 32 bit) into four bytes.
  46. uint entityID = egid.entityID;
  47. serializationData.data[serializationData.dataPos++] = (byte) (entityID & 0xff);
  48. serializationData.data[serializationData.dataPos++] = (byte) ((entityID >> 8) & 0xff);
  49. serializationData.data[serializationData.dataPos++] = (byte) ((entityID >> 16) & 0xff);
  50. serializationData.data[serializationData.dataPos++] = (byte) ((entityID >> 24) & 0xff);
  51. // Splitting the groupID (uint, 32 bit) into four bytes.
  52. var groupID = egid.groupID.ToIDAndBitmask();
  53. serializationData.data[serializationData.dataPos++] = (byte) (groupID & 0xff);
  54. serializationData.data[serializationData.dataPos++] = (byte) ((groupID >> 8) & 0xff);
  55. serializationData.data[serializationData.dataPos++] = (byte) ((groupID >> 16) & 0xff);
  56. serializationData.data[serializationData.dataPos++] = (byte) ((groupID >> 24) & 0xff);
  57. serializationData.data[serializationData.dataPos++] = entityComponentsCount;
  58. }
  59. internal readonly EGID egid; //this can't be used safely!
  60. }
  61. }
  62. }