feat: entity register for serialized entity references
This commit is contained in:
parent
4c41870732
commit
d2ca85568f
35
Engine.Core/Serialization/EntityReference.cs
Normal file
35
Engine.Core/Serialization/EntityReference.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
|
public record class EntityReference(string? Id = null);
|
||||||
|
|
||||||
|
public class EntityRegistry
|
||||||
|
{
|
||||||
|
public event EntityRegisteredEventHandler? OnEntityRegistered = null!;
|
||||||
|
|
||||||
|
private readonly Dictionary<string, Action<IEntity>?> assignCallbacks = [];
|
||||||
|
private readonly Dictionary<string, IEntity> registeredEntities = [];
|
||||||
|
public IReadOnlyDictionary<string, IEntity> RegisteredEntities => registeredEntities;
|
||||||
|
|
||||||
|
public void Add(IEntity entity)
|
||||||
|
{
|
||||||
|
if (registeredEntities.TryAdd(entity.Id, entity))
|
||||||
|
OnEntityRegistered?.InvokeSafe(this, entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void QueueAssign(string id, Action<IEntity> setMethod)
|
||||||
|
{
|
||||||
|
assignCallbacks.TryAdd(id, null);
|
||||||
|
assignCallbacks[id] = assignCallbacks[id] + setMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AssignAll()
|
||||||
|
{
|
||||||
|
foreach ((string id, Action<IEntity>? action) in assignCallbacks)
|
||||||
|
action?.InvokeSafe(registeredEntities[id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public delegate void EntityRegisteredEventHandler(EntityRegistry sender, IEntity entity);
|
||||||
|
}
|
@ -104,17 +104,54 @@ public class SerializedClass
|
|||||||
object instance = TypeFactory.Get(type);
|
object instance = TypeFactory.Get(type);
|
||||||
|
|
||||||
foreach ((string key, object? value) in Private)
|
foreach ((string key, object? value) in Private)
|
||||||
if (type.GetField(key, PRIVATE_BINDING_FLAGS) is FieldInfo fieldInfo)
|
AssignVariable(key, type, instance, value, PRIVATE_BINDING_FLAGS);
|
||||||
fieldInfo.SetValue(instance, value);
|
|
||||||
else if (type.GetProperty(key, PRIVATE_BINDING_FLAGS) is PropertyInfo propertyInfo)
|
|
||||||
propertyInfo.SetValue(instance, value);
|
|
||||||
|
|
||||||
foreach ((string key, object? value) in Public)
|
foreach ((string key, object? value) in Public)
|
||||||
if (type.GetField(key, PUBLIC_BINDING_FLAGS) is FieldInfo fieldInfo)
|
AssignVariable(key, type, instance, value, PUBLIC_BINDING_FLAGS);
|
||||||
fieldInfo.SetValue(instance, value);
|
|
||||||
else if (type.GetProperty(key, PUBLIC_BINDING_FLAGS) is PropertyInfo propertyInfo)
|
|
||||||
propertyInfo.SetValue(instance, value);
|
|
||||||
|
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public object CreateInstance(EntityRegistry? entityRegistry)
|
||||||
|
{
|
||||||
|
if (entityRegistry is null)
|
||||||
|
return CreateInstance();
|
||||||
|
|
||||||
|
Type type = TypeFactory.GetType(Type);
|
||||||
|
object instance = TypeFactory.Get(type);
|
||||||
|
|
||||||
|
foreach ((string key, object? value) in Private)
|
||||||
|
AssignVariable(key, type, instance, value, PRIVATE_BINDING_FLAGS, entityRegistry);
|
||||||
|
|
||||||
|
foreach ((string key, object? value) in Public)
|
||||||
|
AssignVariable(key, type, instance, value, PUBLIC_BINDING_FLAGS, entityRegistry);
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AssignVariable(string key, Type type, object instance, object? value, BindingFlags bindingFlags, EntityRegistry entityRegistry)
|
||||||
|
{
|
||||||
|
if (type.GetField(key, bindingFlags) is FieldInfo fieldInfo)
|
||||||
|
{
|
||||||
|
if (typeof(IEntity).IsAssignableFrom(fieldInfo.FieldType))
|
||||||
|
entityRegistry.QueueAssign(value?.ToString() ?? "", (entity) => fieldInfo.SetValue(instance, entity));
|
||||||
|
else
|
||||||
|
fieldInfo.SetValue(instance, value);
|
||||||
|
}
|
||||||
|
else if (type.GetProperty(key, bindingFlags) is PropertyInfo propertyInfo)
|
||||||
|
{
|
||||||
|
if (typeof(IEntity).IsAssignableFrom(propertyInfo.PropertyType))
|
||||||
|
entityRegistry.QueueAssign(value?.ToString() ?? "", (entity) => propertyInfo.SetValue(instance, entity));
|
||||||
|
else
|
||||||
|
propertyInfo.SetValue(instance, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AssignVariable(string key, Type type, object instance, object? value, BindingFlags bindingFlags)
|
||||||
|
{
|
||||||
|
if (type.GetField(key, bindingFlags) is FieldInfo fieldInfo)
|
||||||
|
fieldInfo.SetValue(instance, value);
|
||||||
|
else if (type.GetProperty(key, bindingFlags) is PropertyInfo propertyInfo)
|
||||||
|
propertyInfo.SetValue(instance, value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,14 +23,16 @@ public static class Serializer
|
|||||||
return serializerBuilder.Build();
|
return serializerBuilder.Build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static readonly IDeserializer deserializer = GetDeserializer();
|
private static IDeserializer GetDeserializer(EntityRegistry entityRegistry)
|
||||||
private static IDeserializer GetDeserializer()
|
|
||||||
{
|
{
|
||||||
DeserializerBuilder serializerBuilder = new DeserializerBuilder()
|
DeserializerBuilder serializerBuilder = new DeserializerBuilder()
|
||||||
.WithNamingConvention(PascalCaseNamingConvention.Instance);
|
.WithNamingConvention(PascalCaseNamingConvention.Instance);
|
||||||
|
|
||||||
foreach (IEngineTypeYamlSerializer typeConverter in GetEngineYamlTypeConverters())
|
foreach (IEngineTypeYamlSerializer typeConverter in GetEngineYamlTypeConverters())
|
||||||
|
{
|
||||||
|
typeConverter.EntityRegistry = entityRegistry;
|
||||||
serializerBuilder = serializerBuilder.WithTypeConverter(typeConverter);
|
serializerBuilder = serializerBuilder.WithTypeConverter(typeConverter);
|
||||||
|
}
|
||||||
|
|
||||||
return serializerBuilder.Build();
|
return serializerBuilder.Build();
|
||||||
}
|
}
|
||||||
@ -48,16 +50,25 @@ public static class Serializer
|
|||||||
|
|
||||||
public static object Deserialize(string yaml)
|
public static object Deserialize(string yaml)
|
||||||
{
|
{
|
||||||
return deserializer.Deserialize(yaml)!;
|
EntityRegistry entityRegistry = new();
|
||||||
|
object result = GetDeserializer(entityRegistry).Deserialize(yaml)!;
|
||||||
|
entityRegistry.AssignAll();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static object Deserialize(string yaml, Type type)
|
public static object Deserialize(string yaml, Type type)
|
||||||
{
|
{
|
||||||
return deserializer.Deserialize(yaml, type)!;
|
EntityRegistry entityRegistry = new();
|
||||||
|
object result = GetDeserializer(entityRegistry).Deserialize(yaml, type)!;
|
||||||
|
entityRegistry.AssignAll();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static T Deserialize<T>(string yaml)
|
public static T Deserialize<T>(string yaml)
|
||||||
{
|
{
|
||||||
return deserializer.Deserialize<T>(yaml);
|
EntityRegistry entityRegistry = new();
|
||||||
|
T result = GetDeserializer(entityRegistry).Deserialize<T>(yaml);
|
||||||
|
entityRegistry.AssignAll();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,4 +2,7 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public interface IEngineTypeYamlSerializer : IYamlTypeConverter;
|
public interface IEngineTypeYamlSerializer : IYamlTypeConverter
|
||||||
|
{
|
||||||
|
EntityRegistry EntityRegistry { get; set; }
|
||||||
|
}
|
||||||
|
@ -8,14 +8,11 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class BehaviourControllerSerializer : IEngineTypeYamlSerializer
|
public class BehaviourControllerSerializer : EngineTypeYamlSerializerBase<IBehaviourController>
|
||||||
{
|
{
|
||||||
private const string SERIALIZED_SCALAR_NAME = "Properties";
|
|
||||||
private const string BEHAVIOURS_SCALAR_NAME = "Behaviours";
|
private const string BEHAVIOURS_SCALAR_NAME = "Behaviours";
|
||||||
|
|
||||||
public bool Accepts(Type type) => typeof(IBehaviourController).IsAssignableFrom(type);
|
public override IBehaviourController? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
string id;
|
string id;
|
||||||
|
|
||||||
@ -32,7 +29,7 @@ public class BehaviourControllerSerializer : IEngineTypeYamlSerializer
|
|||||||
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
||||||
behaviourController = (IBehaviourController)instanceSerializedClass.CreateInstance();
|
behaviourController = (IBehaviourController)instanceSerializedClass.CreateInstance(EntityRegistry);
|
||||||
|
|
||||||
string value = parser.Consume<Scalar>().Value;
|
string value = parser.Consume<Scalar>().Value;
|
||||||
if (value.CompareTo(nameof(IBehaviourController.StateEnable)) != 0)
|
if (value.CompareTo(nameof(IBehaviourController.StateEnable)) != 0)
|
||||||
@ -56,7 +53,7 @@ public class BehaviourControllerSerializer : IEngineTypeYamlSerializer
|
|||||||
return behaviourController;
|
return behaviourController;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
IBehaviourController behaviourController = (IBehaviourController)value!;
|
IBehaviourController behaviourController = (IBehaviourController)value!;
|
||||||
|
|
||||||
|
@ -6,13 +6,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class BehaviourSerializer : IEngineTypeYamlSerializer
|
public class BehaviourSerializer : EngineTypeYamlSerializerBase<IBehaviour>
|
||||||
{
|
{
|
||||||
private const string SERIALIZED_SCALAR_NAME = "Properties";
|
public override IBehaviour? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public bool Accepts(Type type) => typeof(IBehaviour).IsAssignableFrom(type);
|
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
string id;
|
string id;
|
||||||
int priority;
|
int priority;
|
||||||
@ -33,7 +29,7 @@ public class BehaviourSerializer : IEngineTypeYamlSerializer
|
|||||||
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
||||||
behaviour = (IBehaviour)instanceSerializedClass.CreateInstance();
|
behaviour = (IBehaviour)instanceSerializedClass.CreateInstance(EntityRegistry);
|
||||||
|
|
||||||
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IBehaviour.StateEnable)) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IBehaviour.StateEnable)) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
@ -50,7 +46,7 @@ public class BehaviourSerializer : IEngineTypeYamlSerializer
|
|||||||
return behaviour;
|
return behaviour;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
IBehaviour behaviour = (IBehaviour)value!;
|
IBehaviour behaviour = (IBehaviour)value!;
|
||||||
|
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
using YamlDotNet.Core;
|
||||||
|
using YamlDotNet.Serialization;
|
||||||
|
|
||||||
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
|
public abstract class EngineTypeYamlSerializerBase<T> : IEngineTypeYamlSerializer
|
||||||
|
{
|
||||||
|
protected const string SERIALIZED_SCALAR_NAME = "Properties";
|
||||||
|
|
||||||
|
public EntityRegistry EntityRegistry { get; set; } = null!;
|
||||||
|
|
||||||
|
public bool Accepts(Type type) => typeof(T).IsAssignableFrom(type);
|
||||||
|
|
||||||
|
public abstract T? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer);
|
||||||
|
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
{
|
||||||
|
T? result = Read(parser, type, rootDeserializer);
|
||||||
|
|
||||||
|
if (result is IEntity entity)
|
||||||
|
EntityRegistry.Add(entity);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer);
|
||||||
|
}
|
@ -6,11 +6,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class AABBSerializer : IEngineTypeYamlSerializer
|
public class AABBSerializer : EngineTypeYamlSerializerBase<AABB>
|
||||||
{
|
{
|
||||||
public bool Accepts(Type type) => type == typeof(AABB);
|
public override AABB Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
parser.Consume<MappingStart>();
|
parser.Consume<MappingStart>();
|
||||||
|
|
||||||
@ -27,7 +25,7 @@ public class AABBSerializer : IEngineTypeYamlSerializer
|
|||||||
return new AABB(lowerBoundary, upperBoundary);
|
return new AABB(lowerBoundary, upperBoundary);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
AABB aabb = (AABB)value!;
|
AABB aabb = (AABB)value!;
|
||||||
|
|
||||||
@ -38,4 +36,5 @@ public class AABBSerializer : IEngineTypeYamlSerializer
|
|||||||
serializer(aabb.UpperBoundary, typeof(Vector2D));
|
serializer(aabb.UpperBoundary, typeof(Vector2D));
|
||||||
emitter.Emit(new MappingEnd());
|
emitter.Emit(new MappingEnd());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,11 +6,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class CircleSerializer : IEngineTypeYamlSerializer
|
public class CircleSerializer : EngineTypeYamlSerializerBase<Circle>
|
||||||
{
|
{
|
||||||
public bool Accepts(Type type) => type == typeof(Circle);
|
public override Circle Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
parser.Consume<MappingStart>();
|
parser.Consume<MappingStart>();
|
||||||
|
|
||||||
@ -27,7 +25,7 @@ public class CircleSerializer : IEngineTypeYamlSerializer
|
|||||||
return new Circle(lowerBoundary, radius);
|
return new Circle(lowerBoundary, radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
Circle circle = (Circle)value!;
|
Circle circle = (Circle)value!;
|
||||||
|
|
||||||
|
@ -6,11 +6,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class Line2DEquationSerializer : IEngineTypeYamlSerializer
|
public class Line2DEquationSerializer : EngineTypeYamlSerializerBase<Line2DEquation>
|
||||||
{
|
{
|
||||||
public bool Accepts(Type type) => type == typeof(Line2DEquation);
|
public override Line2DEquation Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
parser.Consume<MappingStart>();
|
parser.Consume<MappingStart>();
|
||||||
|
|
||||||
@ -27,7 +25,7 @@ public class Line2DEquationSerializer : IEngineTypeYamlSerializer
|
|||||||
return new Line2DEquation(slope, offset);
|
return new Line2DEquation(slope, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
Line2DEquation line2DEquation = (Line2DEquation)value!;
|
Line2DEquation line2DEquation = (Line2DEquation)value!;
|
||||||
|
|
||||||
|
@ -6,11 +6,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class Line2DSerializer : IEngineTypeYamlSerializer
|
public class Line2DSerializer : EngineTypeYamlSerializerBase<Line2D>
|
||||||
{
|
{
|
||||||
public bool Accepts(Type type) => type == typeof(Line2D);
|
public override Line2D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
parser.Consume<MappingStart>();
|
parser.Consume<MappingStart>();
|
||||||
|
|
||||||
@ -27,7 +25,7 @@ public class Line2DSerializer : IEngineTypeYamlSerializer
|
|||||||
return new Line2D(from, to);
|
return new Line2D(from, to);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
Line2D line2D = (Line2D)value!;
|
Line2D line2D = (Line2D)value!;
|
||||||
|
|
||||||
|
@ -6,11 +6,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class Projection1DSerializer : IEngineTypeYamlSerializer
|
public class Projection1DSerializer : EngineTypeYamlSerializerBase<Projection1D>
|
||||||
{
|
{
|
||||||
public bool Accepts(Type type) => type == typeof(Projection1D);
|
public override Projection1D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
parser.Consume<MappingStart>();
|
parser.Consume<MappingStart>();
|
||||||
|
|
||||||
@ -27,7 +25,7 @@ public class Projection1DSerializer : IEngineTypeYamlSerializer
|
|||||||
return new Projection1D(min, max);
|
return new Projection1D(min, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
Projection1D projection1D = (Projection1D)value!;
|
Projection1D projection1D = (Projection1D)value!;
|
||||||
|
|
||||||
|
@ -6,13 +6,11 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class QuaternionSerializer : IEngineTypeYamlSerializer
|
public class QuaternionSerializer : EngineTypeYamlSerializerBase<Quaternion>
|
||||||
{
|
{
|
||||||
private static readonly int SUBSTRING_START_LENGTH = nameof(Quaternion).Length + 1;
|
private static readonly int SUBSTRING_START_LENGTH = nameof(Quaternion).Length + 1;
|
||||||
|
|
||||||
public bool Accepts(Type type) => type == typeof(Quaternion);
|
public override Quaternion Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
string value = parser.Consume<Scalar>().Value;
|
string value = parser.Consume<Scalar>().Value;
|
||||||
string insideParenthesis = value[SUBSTRING_START_LENGTH..^1];
|
string insideParenthesis = value[SUBSTRING_START_LENGTH..^1];
|
||||||
@ -20,7 +18,7 @@ public class QuaternionSerializer : IEngineTypeYamlSerializer
|
|||||||
return new Quaternion(float.Parse(values[0]), float.Parse(values[1]), float.Parse(values[2]), float.Parse(values[3]));
|
return new Quaternion(float.Parse(values[0]), float.Parse(values[1]), float.Parse(values[2]), float.Parse(values[3]));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
Quaternion quaternion = (Quaternion)value!;
|
Quaternion quaternion = (Quaternion)value!;
|
||||||
emitter.Emit(new Scalar($"{nameof(Quaternion)}({quaternion.X}, {quaternion.Y}, {quaternion.Z}, {quaternion.W})"));
|
emitter.Emit(new Scalar($"{nameof(Quaternion)}({quaternion.X}, {quaternion.Y}, {quaternion.Z}, {quaternion.W})"));
|
||||||
|
@ -7,11 +7,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class Shape2DSerializer : IEngineTypeYamlSerializer
|
public class Shape2DSerializer : EngineTypeYamlSerializerBase<Shape2D>
|
||||||
{
|
{
|
||||||
public bool Accepts(Type type) => type == typeof(Shape2D);
|
public override Shape2D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
parser.Consume<MappingStart>();
|
parser.Consume<MappingStart>();
|
||||||
|
|
||||||
@ -33,7 +31,7 @@ public class Shape2DSerializer : IEngineTypeYamlSerializer
|
|||||||
return new Shape2D(vertices);
|
return new Shape2D(vertices);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
Shape2D shape2D = (Shape2D)value!;
|
Shape2D shape2D = (Shape2D)value!;
|
||||||
|
|
||||||
|
@ -6,11 +6,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class TriangleSerializer : IEngineTypeYamlSerializer
|
public class TriangleSerializer : EngineTypeYamlSerializerBase<Triangle>
|
||||||
{
|
{
|
||||||
public bool Accepts(Type type) => type == typeof(Triangle);
|
public override Triangle Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
parser.Consume<MappingStart>();
|
parser.Consume<MappingStart>();
|
||||||
|
|
||||||
@ -31,7 +29,7 @@ public class TriangleSerializer : IEngineTypeYamlSerializer
|
|||||||
return new Triangle(a, b, c);
|
return new Triangle(a, b, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
Triangle aabb = (Triangle)value!;
|
Triangle aabb = (Triangle)value!;
|
||||||
|
|
||||||
|
@ -6,13 +6,11 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class Vector2DSerializer : IEngineTypeYamlSerializer
|
public class Vector2DSerializer : EngineTypeYamlSerializerBase<Vector2D>
|
||||||
{
|
{
|
||||||
private static readonly int SUBSTRING_START_LENGTH = nameof(Vector2D).Length + 1;
|
private static readonly int SUBSTRING_START_LENGTH = nameof(Vector2D).Length + 1;
|
||||||
|
|
||||||
public bool Accepts(Type type) => type == typeof(Vector2D);
|
public override Vector2D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
string value = parser.Consume<Scalar>().Value;
|
string value = parser.Consume<Scalar>().Value;
|
||||||
string insideParenthesis = value[SUBSTRING_START_LENGTH..^1];
|
string insideParenthesis = value[SUBSTRING_START_LENGTH..^1];
|
||||||
@ -20,7 +18,7 @@ public class Vector2DSerializer : IEngineTypeYamlSerializer
|
|||||||
return new Vector2D(float.Parse(values[0]), float.Parse(values[1]));
|
return new Vector2D(float.Parse(values[0]), float.Parse(values[1]));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
Vector2D vector2D = (Vector2D)value!;
|
Vector2D vector2D = (Vector2D)value!;
|
||||||
emitter.Emit(new Scalar($"{nameof(Vector2D)}({vector2D.X}, {vector2D.Y})"));
|
emitter.Emit(new Scalar($"{nameof(Vector2D)}({vector2D.X}, {vector2D.Y})"));
|
||||||
|
@ -6,13 +6,11 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class Vector3DSerializer : IEngineTypeYamlSerializer
|
public class Vector3DSerializer : EngineTypeYamlSerializerBase<Vector3D>
|
||||||
{
|
{
|
||||||
private static readonly int SUBSTRING_START_LENGTH = nameof(Vector3D).Length + 1;
|
private static readonly int SUBSTRING_START_LENGTH = nameof(Vector3D).Length + 1;
|
||||||
|
|
||||||
public bool Accepts(Type type) => type == typeof(Vector3D);
|
public override Vector3D Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
string value = parser.Consume<Scalar>().Value;
|
string value = parser.Consume<Scalar>().Value;
|
||||||
string insideParenthesis = value[SUBSTRING_START_LENGTH..^1];
|
string insideParenthesis = value[SUBSTRING_START_LENGTH..^1];
|
||||||
@ -20,7 +18,7 @@ public class Vector3DSerializer : IEngineTypeYamlSerializer
|
|||||||
return new Vector3D(float.Parse(values[0]), float.Parse(values[1]), float.Parse(values[2]));
|
return new Vector3D(float.Parse(values[0]), float.Parse(values[1]), float.Parse(values[2]));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
Vector3D vector3D = (Vector3D)value!;
|
Vector3D vector3D = (Vector3D)value!;
|
||||||
emitter.Emit(new Scalar($"{nameof(Vector3D)}({vector3D.X}, {vector3D.Y}, {vector3D.Z})"));
|
emitter.Emit(new Scalar($"{nameof(Vector3D)}({vector3D.X}, {vector3D.Y}, {vector3D.Z})"));
|
||||||
|
@ -10,11 +10,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class SerializedClassSerializer : IEngineTypeYamlSerializer
|
public class SerializedClassSerializer : EngineTypeYamlSerializerBase<SerializedClass>
|
||||||
{
|
{
|
||||||
public bool Accepts(Type type) => type == typeof(SerializedClass);
|
public override SerializedClass? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
SerializedClass serializedClass = new();
|
SerializedClass serializedClass = new();
|
||||||
Dictionary<string, TypeContainer> publicDictionary = [];
|
Dictionary<string, TypeContainer> publicDictionary = [];
|
||||||
@ -43,7 +41,7 @@ public class SerializedClassSerializer : IEngineTypeYamlSerializer
|
|||||||
return serializedClass;
|
return serializedClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
SerializedClass serializedClass = (SerializedClass)value!;
|
SerializedClass serializedClass = (SerializedClass)value!;
|
||||||
|
|
||||||
|
@ -6,13 +6,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class StateEnableSerializer : IEngineTypeYamlSerializer
|
public class StateEnableSerializer : EngineTypeYamlSerializerBase<IStateEnable>
|
||||||
{
|
{
|
||||||
private const string SERIALIZED_SCALAR_NAME = "Properties";
|
public override IStateEnable? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public bool Accepts(Type type) => typeof(IStateEnable).IsAssignableFrom(type);
|
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
bool enabled;
|
bool enabled;
|
||||||
|
|
||||||
@ -27,7 +23,7 @@ public class StateEnableSerializer : IEngineTypeYamlSerializer
|
|||||||
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
||||||
stateEnable = (IStateEnable)instanceSerializedClass.CreateInstance();
|
stateEnable = (IStateEnable)instanceSerializedClass.CreateInstance(EntityRegistry);
|
||||||
|
|
||||||
parser.Consume<MappingEnd>();
|
parser.Consume<MappingEnd>();
|
||||||
|
|
||||||
@ -36,7 +32,7 @@ public class StateEnableSerializer : IEngineTypeYamlSerializer
|
|||||||
return stateEnable;
|
return stateEnable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
IStateEnable stateEnable = (IStateEnable)value!;
|
IStateEnable stateEnable = (IStateEnable)value!;
|
||||||
|
|
||||||
|
@ -8,11 +8,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class TypeContainerSerializer : IEngineTypeYamlSerializer
|
public class TypeContainerSerializer : EngineTypeYamlSerializerBase<TypeContainer>
|
||||||
{
|
{
|
||||||
public bool Accepts(Type type) => type == typeof(TypeContainer);
|
public override TypeContainer Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
parser.Consume<MappingStart>();
|
parser.Consume<MappingStart>();
|
||||||
|
|
||||||
@ -30,7 +28,7 @@ public class TypeContainerSerializer : IEngineTypeYamlSerializer
|
|||||||
return new TypeContainer() { Type = typeFullName, Value = value };
|
return new TypeContainer() { Type = typeFullName, Value = value };
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
TypeContainer? typeContainer = (TypeContainer)value!;
|
TypeContainer? typeContainer = (TypeContainer)value!;
|
||||||
|
|
||||||
|
@ -8,13 +8,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class UniverseObjectSerializer : IEngineTypeYamlSerializer
|
public class UniverseObjectSerializer : EngineTypeYamlSerializerBase<IUniverseObject>
|
||||||
{
|
{
|
||||||
private const string SERIALIZED_SCALAR_NAME = "Properties";
|
public override IUniverseObject? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public bool Accepts(Type type) => typeof(IUniverseObject).IsAssignableFrom(type);
|
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
string name;
|
string name;
|
||||||
string id;
|
string id;
|
||||||
@ -37,7 +33,7 @@ public class UniverseObjectSerializer : IEngineTypeYamlSerializer
|
|||||||
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
||||||
universeObject = (IUniverseObject)instanceSerializedClass.CreateInstance();
|
universeObject = (IUniverseObject)instanceSerializedClass.CreateInstance(EntityRegistry);
|
||||||
|
|
||||||
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverseObject.StateEnable)) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverseObject.StateEnable)) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
@ -68,7 +64,7 @@ public class UniverseObjectSerializer : IEngineTypeYamlSerializer
|
|||||||
return universeObject;
|
return universeObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
IUniverseObject universeObject = (IUniverseObject)value!;
|
IUniverseObject universeObject = (IUniverseObject)value!;
|
||||||
|
|
||||||
|
@ -8,13 +8,9 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core.Serialization;
|
namespace Syntriax.Engine.Core.Serialization;
|
||||||
|
|
||||||
public class UniverseSerializer : IEngineTypeYamlSerializer
|
public class UniverseSerializer : EngineTypeYamlSerializerBase<IUniverse>
|
||||||
{
|
{
|
||||||
private const string SERIALIZED_SCALAR_NAME = "Properties";
|
public override IUniverse? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
||||||
|
|
||||||
public bool Accepts(Type type) => typeof(IUniverse).IsAssignableFrom(type);
|
|
||||||
|
|
||||||
public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
|
|
||||||
{
|
{
|
||||||
string id;
|
string id;
|
||||||
|
|
||||||
@ -31,7 +27,7 @@ public class UniverseSerializer : IEngineTypeYamlSerializer
|
|||||||
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
|
||||||
universe = (IUniverse)instanceSerializedClass.CreateInstance();
|
universe = (IUniverse)instanceSerializedClass.CreateInstance(EntityRegistry);
|
||||||
|
|
||||||
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverse.StateEnable)) != 0)
|
if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverse.StateEnable)) != 0)
|
||||||
throw new();
|
throw new();
|
||||||
@ -54,7 +50,7 @@ public class UniverseSerializer : IEngineTypeYamlSerializer
|
|||||||
return universe;
|
return universe;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
IUniverse universe = (IUniverse)value!;
|
IUniverse universe = (IUniverse)value!;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user