OverviewFilesCommitsIssuesDocsReleasesPeers

ifsrenderer-linux / IFSEngine / Serialization / IteratorConverter.cs

33 lines · csharp ref:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;

using IFSEngine.Model;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace IFSEngine.Serialization;

public class IteratorConverter : JsonConverter<Iterator>
{
    public override Iterator ReadJson(JsonReader reader, Type objectType, /*[AllowNullAttribute]*/ Iterator existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        var tf = jo["Transform"].ToObject<TransformPlugin>(serializer);
        var realParams = jo[nameof(Iterator.RealParams)].ToObject<Dictionary<string, double>>(serializer);
        var vec3Params = jo[nameof(Iterator.Vec3Params)].ToObject<Dictionary<string, Vector3>>(serializer);
        var iterator = jo.ToObject<Iterator>();
        iterator.SetTransform(tf);
        foreach (var k in iterator.RealParams.Keys.Union(tf.RealParams.Keys).ToList())
            iterator.RealParams[k] = realParams.TryGetValue(k, out double val) ? val : tf.RealParams[k];
        foreach (var k in iterator.Vec3Params.Keys.Union(tf.Vec3Params.Keys).ToList())
            iterator.Vec3Params[k] = vec3Params.TryGetValue(k, out Vector3 val) ? val : tf.Vec3Params[k];
        return iterator;
    }

    public override bool CanWrite => false;//use default
    public override void WriteJson(JsonWriter writer, /*[AllowNullAttribute]*/ Iterator value, JsonSerializer serializer) => throw new NotImplementedException();
}