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.

SerializableComponentBuilder.cs 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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, IEntityComponent
  13. {
  14. public static readonly uint SIZE = (uint) MemoryUtilities.SizeOf<T>();
  15. public void Serialize
  16. (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.ExpandBy(componentSerializer.size);
  28. componentSerializer.SerializeSafe(val, serializationData);
  29. }
  30. public void Deserialize
  31. (uint entityID, ITypeSafeDictionary dictionary, ISerializationData serializationData
  32. , int serializationType)
  33. {
  34. IComponentSerializer<T> componentSerializer = _serializers[(int) serializationType];
  35. // Handle the case when an entity struct is gone
  36. var safeDictionary = (ITypeSafeDictionary<T>) dictionary;
  37. if (safeDictionary.TryFindIndex(entityID, out uint index) == false)
  38. {
  39. throw new ECSException("Entity Deserialization failed");
  40. }
  41. ref T val = ref safeDictionary.GetDirectValueByRef(index);
  42. componentSerializer.DeserializeSafe(ref val, serializationData);
  43. }
  44. public void Deserialize
  45. (ISerializationData serializationData, in EntityComponentInitializer initializer
  46. , int serializationType)
  47. {
  48. IComponentSerializer<T> componentSerializer = _serializers[(int) serializationType];
  49. componentSerializer.DeserializeSafe(ref initializer.GetOrCreate<T>(), serializationData);
  50. }
  51. public void Deserialize
  52. (ISerializationData serializationData, ref T entityComponent, int serializationType)
  53. {
  54. IComponentSerializer<T> componentSerializer = _serializers[(int) serializationType];
  55. componentSerializer.DeserializeSafe(ref entityComponent, serializationData);
  56. }
  57. private protected IComponentSerializer<T>[] _serializers;
  58. }
  59. public class SerializableComponentBuilder<SerializationType, T> : SerializableComponentBuilder<T>
  60. where T : unmanaged, IEntityComponent where SerializationType : Enum
  61. {
  62. static SerializableComponentBuilder() { }
  63. public SerializableComponentBuilder(params ValueTuple<int, IComponentSerializer<T>>[] serializers)
  64. {
  65. var length = new SerializersInfo<SerializationType>().numberOfSerializationTypes;
  66. _serializers = new IComponentSerializer<T>[(int)length];
  67. for (int i = 0; i < serializers.Length; i++)
  68. {
  69. ref (int, IComponentSerializer<T>) s = ref serializers[i];
  70. _serializers[(int) s.Item1] = s.Item2;
  71. }
  72. // Just in case the above are the same type
  73. if (serializers.Length > 0)
  74. {
  75. for (int i = 0; i < (int) length; i++)
  76. {
  77. if (_serializers[i] == null)
  78. _serializers[i] = new DontSerialize<T>();
  79. }
  80. }
  81. else
  82. for (int i = 0; i < (int) length; i++)
  83. {
  84. _serializers[i] = new DefaultSerializer<T>();
  85. }
  86. }
  87. }
  88. }