예제 #1
0
        private void LoadAnim(ShapeAnim shapeAnim)
        {
            Initialize();
            Text = shapeAnim.Name;

            ShapeAnim = shapeAnim;
        }
예제 #2
0
        internal static void Read(ResFileSwitchLoader loader, ShapeAnim shapeAnim)
        {
            if (loader.ResFile.VersionMajor2 == 9)
            {
                shapeAnim.Flags = (ShapeAnimFlags)loader.ReadUInt32();
            }
            else
            {
                loader.LoadHeaderBlock();
            }

            shapeAnim.Name      = loader.LoadString();
            shapeAnim.Path      = loader.LoadString();
            shapeAnim.BindModel = loader.Load <Model>();
            uint BindIndicesOffset           = loader.ReadOffset();
            uint VertexShapeAnimsArrayOffset = loader.ReadOffset();

            shapeAnim.UserData = loader.LoadDictValues <UserData>();
            if (loader.ResFile.VersionMajor2 < 9)
            {
                shapeAnim.Flags = (ShapeAnimFlags)loader.ReadInt16();
            }
            ushort numUserData        = loader.ReadUInt16();
            ushort numVertexShapeAnim = loader.ReadUInt16();
            ushort numKeyShapeAnim    = loader.ReadUInt16();

            shapeAnim.FrameCount = loader.ReadInt32();
            shapeAnim.BakedSize  = loader.ReadUInt32();
            ushort numCurve = loader.ReadUInt16();

            shapeAnim.BindIndices      = loader.LoadCustom(() => loader.ReadUInt16s(numVertexShapeAnim), BindIndicesOffset);
            shapeAnim.VertexShapeAnims = loader.LoadList <VertexShapeAnim>(numVertexShapeAnim, VertexShapeAnimsArrayOffset);
        }
        public void Reload(ShapeAnim anim)
        {
            Name       = anim.Name;
            FrameCount = anim.FrameCount;
            FrameRate  = 60.0f;
            Loop       = anim.Flags.HasFlag(ShapeAnimFlags.Looping);

            AnimGroups.Clear();
            foreach (var shapeAnim in anim.VertexShapeAnims)
            {
                var group = new ShapeAnimGroup();
                AnimGroups.Add(group);
                group.Name = shapeAnim.Name;

                //Get the shape keys used for animating
                int baseIndex = 0;
                for (int i = 0; i < shapeAnim.KeyShapeAnimInfos.Count; i++)
                {
                    int startBaseIndex = shapeAnim.KeyShapeAnimInfos.Count - shapeAnim.BaseDataList.Length;

                    var keyShapeInfo = shapeAnim.KeyShapeAnimInfos[i];

                    //Get the curve index for animated indices
                    int curveIndex = keyShapeInfo.CurveIndex;

                    //Make a new sampler track using step interpolation
                    var track = new KeyShapeTrack();
                    track.InterpolationType = STInterpoaltionType.Step;
                    track.Name = keyShapeInfo.Name;

                    if (group.BaseTarget == null && curveIndex == -1)
                    {
                        group.BaseTarget = track;
                    }

                    if (curveIndex != -1)
                    {
                        BfresAnimations.GenerateKeys(track, shapeAnim.Curves[curveIndex]);
                    }
                    else if (i >= startBaseIndex)
                    {
                        float baseWeight = shapeAnim.BaseDataList[baseIndex];
                        track.KeyFrames.Add(new STKeyFrame(0, baseWeight));
                        baseIndex++;
                    }

                    group.Tracks.Add(track);
                }
            }
        }
예제 #4
0
        public static void Write(ResFileSwitchSaver saver, ShapeAnim shapeAnim)
        {
            if (saver.ResFile.VersionMajor2 == 9)
            {
                saver.Write((uint)shapeAnim.Flags);
            }
            else
            {
                saver.SaveHeaderBlock();
            }

            saver.SaveString(shapeAnim.Name);
            saver.SaveString(shapeAnim.Path);
        }
예제 #5
0
            public PerShapeAnim(BFRES.MTA mta, ShapeAnim vis)
            {
                mta.Text             = vis.Name;
                mta.ImageKey         = "mesh";
                mta.SelectedImageKey = "mesh";

                mta.FrameCount = (uint)vis.FrameCount;


                foreach (VertexShapeAnim vtxanim in vis.VertexShapeAnims)
                {
                    BFRES.MatAnimEntry mat = new BFRES.MatAnimEntry();

                    mat.ImageKey         = "bone";
                    mat.SelectedImageKey = "bone";


                    //First set the data then iterpolate
                    mat.Text = vtxanim.Name;
                    foreach (AnimCurve cr in vtxanim.Curves)
                    {
                        mat.Interpolate(cr);
                    }

                    for (int Frame = 0; Frame < vis.FrameCount; Frame++)
                    {
                        foreach (BFRES.MatAnimData track in mat.matCurves)
                        {
                            BFRES.AnimKey left  = track.GetLeft(Frame);
                            BFRES.AnimKey right = track.GetRight(Frame);



                            track.Value = Animation.Hermite(Frame, left.frame, right.frame, 0, 0, left.unk1, right.unk1);
                        }
                    }
                    mta.matEntries.Add(mat);
                }
            }
 public BfresShapeAnim(ShapeAnim anim, string name)
 {
     ModelName = name;
     CanPlay   = true; //Default all animations to not play unless toggled in list
     Reload(anim);
 }
예제 #7
0
 public void Read(ShapeAnim shapeAnim)
 {
     ShapeAnim = shapeAnim;
 }
예제 #8
0
 public FSHA(ShapeAnim anim)
 {
     LoadAnim(anim);
 }
예제 #9
0
        private void LoadAnim(ShapeAnim shapeAnim)
        {
            Text = shapeAnim.Name;

            ShapeAnim = shapeAnim;
        }