Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        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));
        }