public static CurveAnimStruct FromCurve(AnimCurve curve, string target, bool useDegrees) { var convCurve = new CurveAnimStruct(); convCurve.KeyFrames = new Dictionary<float, object>(); convCurve.Target = target; convCurve.Scale = curve.Scale; convCurve.Offset = curve.Offset; convCurve.WrapMode = $"{curve.PreWrap}, {curve.PostWrap}"; convCurve.Interpolation = curve.CurveType; convCurve.FrameType = curve.FrameType; convCurve.KeyType = curve.KeyType; float valueScale = curve.Scale > 0 ? curve.Scale : 1; for (int i = 0; i < curve.Frames.Length; i++) { var frame = curve.Frames[i]; switch (curve.CurveType) { case AnimCurveType.Cubic: { var coef0 = curve.Keys[i, 0] * valueScale + curve.Offset; var slopes = CurveConvert.GetSlopes(curve, i); if (useDegrees) { coef0 *= CurveConvert.Rad2Deg; slopes[0] *= CurveConvert.Rad2Deg; slopes[1] *= CurveConvert.Rad2Deg; } convCurve.KeyFrames.Add(frame, new HermiteKey() { Value = coef0, In = slopes[0], Out = slopes[1], }); } break; case AnimCurveType.StepBool: convCurve.KeyFrames.Add(frame, new BooleanKey() { Value = curve.KeyStepBoolData[i], }); break; case AnimCurveType.StepInt: convCurve.KeyFrames.Add(frame, new KeyFrame() { Value = (int)curve.Keys[i, 0] + (int)curve.Offset }); break; default: var value = curve.Keys[i, 0] * valueScale + curve.Offset; convCurve.KeyFrames.Add(frame, new KeyFrame() { Value = value }); break; } } return convCurve; }
public static void FromJson(SkeletalAnim anim, string json) { JsonConvert.DefaultSettings = () => { var settings = new JsonSerializerSettings(); return(settings); }; var animJson = JsonConvert.DeserializeObject <SkeletalAnimStruct>(json); anim.Name = animJson.Name; anim.Baked = animJson.Baked; anim.Loop = animJson.Loop; anim.FrameCount = animJson.FrameCount; anim.Baked = animJson.Baked; anim.FlagsRotate = animJson.FlagsRotate; anim.FlagsScale = animJson.FlagsScale; anim.BoneAnims = new List <BoneAnim>(); anim.BindIndices = new ushort[animJson.BoneAnims.Count]; foreach (var boneAnimJson in animJson.BoneAnims) { BoneAnim boneAnim = new BoneAnim(); anim.BoneAnims.Add(boneAnim); //Always these indices boneAnim.Name = boneAnimJson.Name; boneAnim.BeginRotate = 3; boneAnim.BeginTranslate = 6; boneAnim.BeginBaseTranslate = 7; boneAnim.BaseData = boneAnimJson.BaseData; boneAnim.FlagsTransform |= BoneAnimFlagsTransform.Identity; if (boneAnimJson.UseBaseTranslation) { boneAnim.FlagsBase |= BoneAnimFlagsBase.Translate; } if (boneAnimJson.UseBaseRotation) { boneAnim.FlagsBase |= BoneAnimFlagsBase.Rotate; } if (boneAnimJson.UseBaseScale) { boneAnim.FlagsBase |= BoneAnimFlagsBase.Scale; } foreach (var curveJson in boneAnimJson.Curves) { var target = (AnimTarget)Enum.Parse(typeof(AnimTarget), curveJson.Target); var curve = CurveConvert.GenerateCurve(curveJson, (uint)target, curveJson.Target.Contains("Rotate") && animJson.UseDegrees); boneAnim.Curves.Add(curve); boneAnim.FlagsCurve = SetCurveTarget(target); } boneAnim.CalculateTransformFlags(); boneAnim.ApplySegmentScaleCompensate = boneAnimJson.SegmentScaleCompensate; } }
public static string ToJson(SkeletalAnim anim) { SkeletalAnimStruct animConv = new SkeletalAnimStruct(); animConv.Name = anim.Name; animConv.Path = anim.Path; animConv.Loop = anim.Loop; animConv.Baked = anim.Baked; animConv.FrameCount = anim.FrameCount; animConv.FlagsScale = anim.FlagsScale; animConv.FlagsRotate = anim.FlagsRotate; animConv.BoneAnims = new List <BoneAnimStruct>(); foreach (var boneAnim in anim.BoneAnims) { BoneAnimStruct boneAnimConv = new BoneAnimStruct(); boneAnimConv.Curves = new List <CurveAnimStruct>(); boneAnimConv.Name = boneAnim.Name; boneAnimConv.BaseData = boneAnim.BaseData; boneAnimConv.SegmentScaleCompensate = boneAnim.ApplySegmentScaleCompensate; boneAnimConv.UseBaseTranslation = boneAnim.FlagsBase.HasFlag(BoneAnimFlagsBase.Translate); boneAnimConv.UseBaseRotation = boneAnim.FlagsBase.HasFlag(BoneAnimFlagsBase.Rotate); boneAnimConv.UseBaseScale = boneAnim.FlagsBase.HasFlag(BoneAnimFlagsBase.Scale); animConv.BoneAnims.Add(boneAnimConv); foreach (var curve in boneAnim.Curves) { string target = ((AnimTarget)curve.AnimDataOffset).ToString(); var convCurve = CurveConvert.FromCurve(curve, target, target.Contains("Rotate") && animConv.UseDegrees); boneAnimConv.Curves.Add(convCurve); } } foreach (var param in anim.UserData.Values) { animConv.UserData.Add($"{param.Type}|{param.Name}", param.GetData()); } JsonConvert.DefaultSettings = () => { var settings = new JsonSerializerSettings(); return(settings); }; return(JsonConvert.SerializeObject(animConv, Formatting.Indented)); }