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.

95 lines
3.6KB

  1. using System;
  2. using Svelto.Common;
  3. using Svelto.ECS.Internal;
  4. namespace Svelto.ECS.Serialization
  5. {
  6. public class SerializableEntityBuilder<T> : EntityBuilder<T>, ISerializableEntityBuilder
  7. where T : unmanaged, IEntityStruct
  8. {
  9. public static readonly uint SIZE = UnsafeUtils.SizeOf<T>();
  10. static SerializableEntityBuilder()
  11. {}
  12. public SerializableEntityBuilder()
  13. {
  14. _serializers = new ISerializer<T>[(int) SerializationType.Length];
  15. for (int i = 0; i < (int) SerializationType.Length; i++)
  16. {
  17. _serializers[i] = new DefaultSerializer<T>();
  18. }
  19. }
  20. public SerializableEntityBuilder(params ValueTuple<SerializationType, ISerializer<T>>[] serializers)
  21. {
  22. _serializers = new ISerializer<T>[(int) SerializationType.Length];
  23. for (int i = 0; i < serializers.Length; i++)
  24. {
  25. ref (SerializationType, ISerializer<T>) s = ref serializers[i];
  26. _serializers[(int) s.Item1] = s.Item2;
  27. }
  28. // Just in case the above are the same type
  29. for (int i = 0; i < (int) SerializationType.Length; i++)
  30. {
  31. if (_serializers[i] == null) _serializers[i] = new DontSerialize<T>();
  32. }
  33. }
  34. public void Serialize(uint entityID, ITypeSafeDictionary dictionary,
  35. ISerializationData serializationData, SerializationType serializationType)
  36. {
  37. ISerializer<T> serializer = _serializers[(int)serializationType];
  38. var safeDictionary = (TypeSafeDictionary<T>) dictionary;
  39. if (safeDictionary.TryFindIndex(entityID, out uint index) == false)
  40. {
  41. throw new ECSException("Entity Serialization failed");
  42. }
  43. T[] values = safeDictionary.GetValuesArray(out _);
  44. ref T val = ref values[index];
  45. serializationData.dataPos = (uint) serializationData.data.Count;
  46. serializationData.data.ExpandBy(serializer.size);
  47. serializer.SerializeSafe(val, serializationData);
  48. }
  49. public void Deserialize(uint entityID, ITypeSafeDictionary dictionary,
  50. ISerializationData serializationData, SerializationType serializationType)
  51. {
  52. ISerializer<T> serializer = _serializers[(int) serializationType];
  53. // Handle the case when an entity struct is gone
  54. var safeDictionary = (TypeSafeDictionary<T>) dictionary;
  55. if (safeDictionary.TryFindIndex(entityID, out uint index) == false)
  56. {
  57. throw new ECSException("Entity Deserialization failed");
  58. }
  59. T[] values = safeDictionary.GetValuesArray(out _);
  60. ref T val = ref values[index];
  61. serializer.DeserializeSafe(ref val, serializationData);
  62. }
  63. public void Deserialize(ISerializationData serializationData
  64. , in EntityStructInitializer initializer, SerializationType serializationType)
  65. {
  66. ISerializer<T> serializer = _serializers[(int) serializationType];
  67. serializer.DeserializeSafe(ref initializer.GetOrCreate<T>(), serializationData);
  68. }
  69. public void CopySerializedEntityStructs(in EntityStructInitializer sourceInitializer,
  70. in EntityStructInitializer destinationInitializer, SerializationType serializationType)
  71. {
  72. if ((_serializers[(int) serializationType] is DontSerialize<T>) == false)
  73. destinationInitializer.CopyFrom(sourceInitializer.Get<T>());
  74. }
  75. readonly ISerializer<T>[] _serializers;
  76. }
  77. }