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.

111 line
4.3KB

  1. using System;
  2. using Svelto.Common;
  3. using Svelto.ECS.Internal;
  4. namespace Svelto.ECS.Serialization
  5. {
  6. public struct SerializersInfo<SerializationEnum> where SerializationEnum:Enum
  7. {
  8. public uint numberOfSerializationTypes => (uint) length;
  9. static readonly int length = Enum.GetNames(typeof(SerializationEnum)).Length;
  10. }
  11. public class SerializableComponentBuilder<T> : ComponentBuilder<T>, ISerializableComponentBuilder
  12. where T : unmanaged, IBaseEntityComponent
  13. {
  14. public static readonly uint SIZE = (uint) MemoryUtilities.SizeOf<T>();
  15. public void Serialize(uint entityID, ITypeSafeDictionary dictionary, ISerializationData serializationData
  16. , int serializationType)
  17. {
  18. IComponentSerializer<T> componentSerializer = _serializers[serializationType];
  19. var safeDictionary = (ITypeSafeDictionary<T>) dictionary;
  20. if (safeDictionary.TryFindIndex(entityID, out uint index) == false)
  21. {
  22. throw new ECSException("Entity Serialization failed");
  23. }
  24. ref T val = ref safeDictionary.GetDirectValueByRef(index);
  25. serializationData.dataPos = (uint) serializationData.data.count;
  26. serializationData.data.IncrementCountBy(componentSerializer.size);
  27. componentSerializer.SerializeSafe(val, serializationData);
  28. }
  29. public void Deserialize(uint entityID, ITypeSafeDictionary dictionary, ISerializationData serializationData
  30. , int serializationType)
  31. {
  32. IComponentSerializer<T> componentSerializer = _serializers[(int) serializationType];
  33. // Handle the case when an entity struct is gone
  34. var safeDictionary = (ITypeSafeDictionary<T>) dictionary;
  35. if (safeDictionary.TryFindIndex(entityID, out uint index) == false)
  36. {
  37. throw new ECSException("Entity Deserialization failed");
  38. }
  39. ref T val = ref safeDictionary.GetDirectValueByRef(index);
  40. componentSerializer.DeserializeSafe(ref val, serializationData);
  41. }
  42. public void Deserialize
  43. (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 uint Size(int serializationType)
  50. {
  51. return _serializers[(int) serializationType].size;
  52. }
  53. public void Deserialize
  54. (ISerializationData serializationData, ref T entityComponent, int serializationType)
  55. {
  56. IComponentSerializer<T> componentSerializer = _serializers[(int) serializationType];
  57. componentSerializer.DeserializeSafe(ref entityComponent, serializationData);
  58. }
  59. private protected IComponentSerializer<T>[] _serializers;
  60. }
  61. public class SerializableComponentBuilder<SerializationType, T> : SerializableComponentBuilder<T>
  62. where T : unmanaged, IBaseEntityComponent 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. }