using System; using Svelto.ECS; using Svelto.ECS.Serialization; using RobocraftX.Common; namespace GamecraftModdingAPI.Persistence { /// /// Simple entity serializer sufficient for simple entity components. /// public class SimpleEntitySerializer : IEntitySerializer where Descriptor : ISerializableEntityDescriptor, new() { /// /// Delegate function called when the serializer needs to know what entities to serialize. /// public delegate EGID[] GetEntitiesToSerialize(EntitiesDB entitiesDB); private GetEntitiesToSerialize getEntitiesToSerialize; protected int serializationType; public IEntityFactory EntityFactory { set; protected get; } public EntitiesDB entitiesDB { set; protected get; } public EntityComponentInitializer BuildDeserializedEntity(EGID egid, ISerializationData serializationData, ISerializableEntityDescriptor entityDescriptor, int serializationType, IEntitySerialization entitySerialization) { EntityComponentInitializer esi = EntityFactory.BuildEntity(egid); entitySerialization.DeserializeEntityComponents(serializationData, entityDescriptor, ref esi, serializationType); return esi; } public bool Deserialize(ref ISerializationData serializationData, IEntitySerialization entitySerializer) { BinaryBufferReader bbr = new BinaryBufferReader(serializationData.data.ToArrayFast(out uint count), serializationData.dataPos); uint entityCount = bbr.ReadUint(); serializationData.dataPos = bbr.Position; for (uint i = 0; i < entityCount; i++) { entitySerializer.DeserializeEntity(serializationData, serializationType); } return true; } public void Ready() { } public bool Serialize(ref ISerializationData serializationData, EntitiesDB entitiesDB, IEntitySerialization entitySerializer) { serializationData.data.ExpandBy(4u); BinaryBufferWriter bbw = new BinaryBufferWriter(serializationData.data.ToArrayFast(out uint count), serializationData.dataPos); EGID[] toSerialize = getEntitiesToSerialize(entitiesDB); bbw.Write((uint)toSerialize.Length); serializationData.dataPos = bbw.Position; for (uint i = 0; i < toSerialize.Length; i++) { entitySerializer.SerializeEntity(toSerialize[i], serializationData, serializationType); } return true; } /// /// Construct the entity serializer. /// /// Provider of entity IDs to serialize. public SimpleEntitySerializer(GetEntitiesToSerialize getEntitiesToSerialize) { this.getEntitiesToSerialize = getEntitiesToSerialize; serializationType = (int)SerializationType.Storage; } } }