#nullable enable using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using T3.Core.DataTypes; using T3.Serialization; namespace T3.Core.Animation; internal sealed class CurveState { internal SortedList Table { get; set; } internal CurveUtils.OutsideCurveBehavior PreCurveMapping { get => _preCurveMapping; set { _preCurveMapping = value; PreCurveMapper = CurveUtils.CreateOutsideCurveMapper(value); } } internal CurveUtils.OutsideCurveBehavior PostCurveMapping { get => _postCurveMapping; set { _postCurveMapping = value; PostCurveMapper = CurveUtils.CreateOutsideCurveMapper(value); } } internal IOutsideCurveMapper? PreCurveMapper { get; private set; } internal IOutsideCurveMapper? PostCurveMapper { get; private set; } internal CurveState() { Table = new SortedList(); PreCurveMapping = CurveUtils.OutsideCurveBehavior.Constant; PostCurveMapping = CurveUtils.OutsideCurveBehavior.Constant; } internal CurveState Clone() { var clone = new CurveState { PreCurveMapping = _preCurveMapping, PostCurveMapping = _postCurveMapping }; foreach (var point in Table) clone.Table[point.Key] = point.Value.Clone(); return clone; } internal void Write(JsonTextWriter writer) { lock (this) { writer.WritePropertyName("Curve"); writer.WriteStartObject(); writer.WriteObject("PreCurve", PreCurveMapping); writer.WriteObject("PostCurve", PostCurveMapping); // write keys writer.WritePropertyName("Keys"); writer.WriteStartArray(); foreach (var point in Table) { writer.WriteStartObject(); writer.WriteValue("Time", point.Key); point.Value.Write(writer); writer.WriteEndObject(); } writer.WriteEndArray(); writer.WriteEndObject(); } } internal void Read(JToken inputToken) { var curveToken = inputToken["Curve"]; if (curveToken == null) return; PreCurveMapping = curveToken["PreCurve"].GetEnumValue(); PostCurveMapping = curveToken["PostCurve"].GetEnumValue(); if (curveToken["Keys"] is not JArray array) return; foreach (var keyEntry in array) { var time = keyEntry.Value("Time"); time = Math.Round(time, Curve.TimePrecision); var key = new VDefinition(); key.Read(keyEntry); key.U = time; Table.Add(time, key); } } private CurveUtils.OutsideCurveBehavior _preCurveMapping; private CurveUtils.OutsideCurveBehavior _postCurveMapping; }