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.

75 lines
3.7KB

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