Mirror of Svelto.ECS because we're a fan of it
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

111 Zeilen
4.2KB

  1. using System;
  2. using Svelto.Common;
  3. using Svelto.ECS.Internal;
  4. namespace Svelto.ECS.Serialization
  5. {
  6. public struct SerializersInfo<SerializationEnum>
  7. where SerializationEnum : Enum
  8. {
  9. public uint numberOfSerializationTypes => (uint)length;
  10. static readonly int length = Enum.GetNames(typeof(SerializationEnum)).Length;
  11. }
  12. public class SerializableComponentBuilder<T>: ComponentBuilder<T>, ISerializableComponentBuilder
  13. where T : unmanaged, IEntityComponent
  14. {
  15. public static uint SIZE => (uint)MemoryUtilities.SizeOf<T>();
  16. public void Serialize(uint entityID, ITypeSafeDictionary dictionary, ISerializationData serializationData
  17. , int serializationType)
  18. {
  19. IComponentSerializer<T> componentSerializer = _serializers[serializationType];
  20. var safeDictionary = (ITypeSafeDictionary<T>)dictionary;
  21. if (safeDictionary.TryFindIndex(entityID, out uint index) == false)
  22. {
  23. throw new ECSException("Entity Serialization failed");
  24. }
  25. ref T val = ref safeDictionary.GetDirectValueByRef(index);
  26. serializationData.dataPos = (uint)serializationData.data.count;
  27. serializationData.data.IncrementCountBy((uint)componentSerializer.size);
  28. componentSerializer.SerializeSafe(val, serializationData);
  29. }
  30. public void Deserialize(uint entityID, ITypeSafeDictionary dictionary, ISerializationData serializationData
  31. , int serializationType)
  32. {
  33. IComponentSerializer<T> componentSerializer = _serializers[(int)serializationType];
  34. // Handle the case when an entity struct is gone
  35. var safeDictionary = (ITypeSafeDictionary<T>)dictionary;
  36. if (safeDictionary.TryFindIndex(entityID, out uint index) == false)
  37. {
  38. throw new ECSException("Entity Deserialization failed");
  39. }
  40. ref T val = ref safeDictionary.GetDirectValueByRef(index);
  41. componentSerializer.DeserializeSafe(ref val, serializationData);
  42. }
  43. public void Deserialize(ISerializationData serializationData, in EntityInitializer initializer
  44. , int serializationType)
  45. {
  46. IComponentSerializer<T> componentSerializer = _serializers[(int)serializationType];
  47. componentSerializer.DeserializeSafe(ref initializer.GetOrAdd<T>(), serializationData);
  48. }
  49. public int Size(int serializationType)
  50. {
  51. return (int)_serializers[(int)serializationType].size;
  52. }
  53. public void Deserialize(ISerializationData serializationData, ref T entityComponent, int serializationType)
  54. {
  55. IComponentSerializer<T> componentSerializer = _serializers[(int)serializationType];
  56. componentSerializer.DeserializeSafe(ref entityComponent, serializationData);
  57. }
  58. private protected IComponentSerializer<T>[] _serializers;
  59. }
  60. public class SerializableComponentBuilder<SerializationType, T>: SerializableComponentBuilder<T>
  61. where T : unmanaged, IEntityComponent
  62. where SerializationType : Enum
  63. {
  64. static SerializableComponentBuilder() { }
  65. public SerializableComponentBuilder(params ValueTuple<int, IComponentSerializer<T>>[] serializers)
  66. {
  67. var length = new SerializersInfo<SerializationType>().numberOfSerializationTypes;
  68. _serializers = new IComponentSerializer<T>[(int)length];
  69. for (int i = 0; i < serializers.Length; i++)
  70. {
  71. ref (int, IComponentSerializer<T>) s = ref serializers[i];
  72. _serializers[(int)s.Item1] = s.Item2;
  73. }
  74. // Just in case the above are the same type
  75. if (serializers.Length > 0)
  76. {
  77. for (int i = 0; i < (int)length; i++)
  78. {
  79. if (_serializers[i] == null)
  80. _serializers[i] = new DontSerialize<T>();
  81. }
  82. }
  83. else
  84. for (int i = 0; i < (int)length; i++)
  85. {
  86. _serializers[i] = new DefaultSerializer<T>();
  87. }
  88. }
  89. }
  90. }