using System; using System.Collections.Generic; using System.Linq; using Engine.Core; using Engine.Core.Serialization; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Serialization; namespace Engine.Serializers.Yaml; public class UniverseConverter : EngineTypeYamlSerializerBase { public override IUniverse? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f); ProgressionTracker.Set(isTrackingController ? 0.1f : ProgressionTracker.Progression, "Reading universe"); string id; IUniverse universe; IStateEnable stateEnable; IUniverseObject rootUniverseObject; parser.Consume(); if (parser.Consume().Value.CompareTo(nameof(IUniverse.Id)) != 0) throw new(); id = parser.Consume().Value; if (parser.Consume().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0) throw new(); SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!; ProgressionTracker.Set(isTrackingController ? .2f : ProgressionTracker.Progression, $"Creating {instanceSerializedClass.Type}"); universe = (IUniverse)instanceSerializedClass.CreateInstance(IdentifiableRegistry); if (parser.Consume().Value.CompareTo(nameof(IUniverse.StateEnable)) != 0) throw new(); stateEnable = (IStateEnable)rootDeserializer(typeof(IStateEnable))!; ProgressionTracker.Set(isTrackingController ? .5f : ProgressionTracker.Progression, $"Reading universe objects"); if (parser.Consume().Value.CompareTo(nameof(IUniverse.Root)) != 0) throw new(); rootUniverseObject = (IUniverseObject)rootDeserializer(typeof(IUniverseObject))!; parser.Consume(); universe.Id = id; stateEnable.Assign(universe); universe.Assign(stateEnable); ProgressionTracker.Set(isTrackingController ? .9f : ProgressionTracker.Progression, "Registering root universe object"); for (int i = rootUniverseObject.Children.Count - 1; i >= 0; i--) { IUniverseObject uo = rootUniverseObject.Children[i]; ProgressionTracker.Set(isTrackingController ? .9f + .1f * ((float)i / rootUniverseObject.Children.Count) : ProgressionTracker.Progression, $"Registering {uo.Name}"); universe.Root.AddChild(uo); } ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Created {instanceSerializedClass.Type}"); return universe; } public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { IUniverse universe = (IUniverse)value!; bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f); ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Serializing universe"); IUniverseObject rootUniverseObject = universe.Root; emitter.Emit(new MappingStart()); emitter.Emit(new Scalar(nameof(IUniverse.Id))); emitter.Emit(new Scalar(universe.Id)); emitter.Emit(new Scalar(SERIALIZED_SCALAR_NAME)); serializer(new SerializedClass(universe)); emitter.Emit(new Scalar(nameof(IUniverse.StateEnable))); serializer(universe.StateEnable); emitter.Emit(new Scalar(nameof(IUniverse.Root))); serializer(rootUniverseObject); ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Serialized universe"); emitter.Emit(new MappingEnd()); } }