Exemple #1
0
        private void LoadAnim(VisibilityAnim vis)
        {
            VisibilityAnim = vis;
            FrameCount     = vis.FrameCount;

            Text = vis.Name;

            if (vis.BaseDataList == null)
            {
                vis.BaseDataList = new bool[0];
            }

            if (vis.Names == null)
            {
                vis.Names = new string[0];
            }

            BaseValues = vis.BaseDataList;

            foreach (var name in vis.Names)
            {
                BoneNames.Add(name);
            }

            for (int curve = 0; curve < vis.Curves.Count; curve++)
            {
                var track = CurveHelper.CreateBooleanTrack(vis.Curves[curve]);
                track.Text = BoneNames[(int)track.AnimDataOffset];
                Values.Add(track);
            }
        }
        public static VisibilityAnim FromJson(string json)
        {
            VisibilityAnim anim = new VisibilityAnim();

            FromJson(anim, json);
            return(anim);
        }
Exemple #3
0
        public void Reload(VisibilityAnim anim)
        {
            Name       = anim.Name;
            FrameCount = anim.FrameCount;
            FrameRate  = 60.0f;
            Loop       = anim.Flags.HasFlag(VisibilityAnimFlags.Looping);

            if (anim.Names == null)
            {
                return;
            }

            AnimGroups.Clear();
            for (int i = 0; i < anim.Names.Count; i++)
            {
                var baseValue = anim.BaseDataList[i];

                BoneAnimGroup group = new BoneAnimGroup();
                group.Name = anim.Names[i];
                AnimGroups.Add(group);

                group.Track.KeyFrames.Add(new STKeyFrame()
                {
                    Frame = 0, Value = baseValue ? 1 : 0
                });

                foreach (var curve in anim.Curves)
                {
                    if (curve.AnimDataOffset == i)
                    {
                        BfresAnimations.GenerateKeys(group.Track, curve);
                    }
                }
            }
        }
Exemple #4
0
        public static void Read(ResFileSwitchLoader loader, VisibilityAnim visibilityAnim)
        {
            if (loader.ResFile.VersionMajor2 == 9)
            {
                visibilityAnim._flags = loader.ReadUInt16();
                loader.ReadUInt16(); //Padding
            }
            else
            {
                loader.LoadHeaderBlock();
            }
            visibilityAnim.Name      = loader.LoadString();
            visibilityAnim.Path      = loader.LoadString();
            visibilityAnim.BindModel = loader.Load <Model>();
            long BindIndicesOffset   = loader.ReadInt64();
            long CurveArrayOffset    = loader.ReadInt64();
            long BaseDataArrayOffset = loader.ReadInt64();
            long NameArrayOffset     = loader.ReadInt64();

            visibilityAnim.UserData = loader.LoadDictValues <UserData>();

            if (loader.ResFile.VersionMajor2 != 9)
            {
                visibilityAnim._flags = loader.ReadUInt16();
            }
            else
            {
                loader.ReadUInt16(); //Idk what this is
            }
            ushort numUserData = loader.ReadUInt16();

            visibilityAnim.FrameCount = loader.ReadInt32();
            ushort numAnim  = loader.ReadUInt16();
            ushort numCurve = loader.ReadUInt16();

            visibilityAnim.BakedSize = loader.ReadUInt32();

            visibilityAnim.BindIndices = loader.LoadCustom(() => loader.ReadUInt16s(numAnim), (uint)BindIndicesOffset);
            visibilityAnim.Names       = loader.LoadCustom(() => loader.LoadStrings(numAnim), (uint)NameArrayOffset); // Offset to name list.
            visibilityAnim.Curves      = loader.LoadList <AnimCurve>(numCurve, (uint)CurveArrayOffset);

            visibilityAnim.baseDataBytes = new List <byte>();
            visibilityAnim.BaseDataList  = loader.LoadCustom(() =>
            {
                bool[] baseData = new bool[numAnim];
                int i           = 0;
                while (i < numAnim)
                {
                    byte b = loader.ReadByte();
                    visibilityAnim.baseDataBytes.Add(b);
                    for (int j = 0; j < 8 && i < numAnim; j++)
                    {
                        baseData[i] = b.GetBit(j);
                    }
                    i++;
                }
                return(baseData);
            }, (uint)BaseDataArrayOffset);
        }
Exemple #5
0
        public static void Write(ResFileSwitchSaver saver, VisibilityAnim visibilityAnim)
        {
            if (saver.ResFile.VersionMajor2 == 9)
            {
                saver.Write(visibilityAnim._flags);
                saver.Write((ushort)0);
            }
            else
            {
                saver.SaveHeaderBlock();
            }

            saver.SaveString(visibilityAnim.Name);
            saver.SaveString(visibilityAnim.Path);
            saver.Write(0L); //Bind Model
            visibilityAnim.PosBindIndicesOffset  = saver.SaveOffset();
            visibilityAnim.PosCurvesOffset       = saver.SaveOffset();
            visibilityAnim.PosBaseDataOffset     = saver.SaveOffset();
            visibilityAnim.PosNamesOffset        = saver.SaveOffset();
            visibilityAnim.PosUserDataOffset     = saver.SaveOffset();
            visibilityAnim.PosUserDataDictOffset = saver.SaveOffset();
            if (saver.ResFile.VersionMajor2 != 9)
            {
                saver.Write(visibilityAnim._flags);
            }
            else
            {
                saver.Write((ushort)0);
            }
            saver.Write((ushort)visibilityAnim.UserData.Count);
            saver.Write(visibilityAnim.FrameCount);
            if (visibilityAnim.Names != null)
            {
                saver.Write((ushort)visibilityAnim.Names.Count);
            }
            else
            {
                saver.Write((ushort)0);
            }
            saver.Write((ushort)visibilityAnim.Curves.Count);
            saver.Write(visibilityAnim.BakedSize);
        }
        public static string ToJson(VisibilityAnim anim)
        {
            BoneVisibilityAnimStruct animConv = new BoneVisibilityAnimStruct();

            animConv.Name       = anim.Name;
            animConv.Path       = anim.Path;
            animConv.Loop       = anim.Loop;
            animConv.Baked      = anim.Baked;
            animConv.FrameCount = anim.FrameCount;
            animConv.Groups     = new List <VisAnimGroupStruct>();

            for (int i = 0; i < anim.Names?.Count; i++)
            {
                VisAnimGroupStruct groupConv = new VisAnimGroupStruct();
                groupConv.Curves      = new List <CurveAnimHelper>();
                groupConv.BaseVisible = anim.BaseDataList[i];
                groupConv.Name        = anim.Names[i];
                animConv.Groups.Add(groupConv);

                foreach (var curve in anim.Curves)
                {
                    if (curve.AnimDataOffset == i)
                    {
                        groupConv.Curves.Add(CurveAnimHelper.FromCurve(curve, "", false));
                    }
                }
            }

            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));
        }
        public static void FromJson(VisibilityAnim anim, string json)
        {
            JsonConvert.DefaultSettings = () =>
            {
                var settings = new JsonSerializerSettings();
                return(settings);
            };

            var animJson = JsonConvert.DeserializeObject <BoneVisibilityAnimStruct>(json);

            anim.Name        = animJson.Name;
            anim.Baked       = animJson.Baked;
            anim.Loop        = animJson.Loop;
            anim.FrameCount  = animJson.FrameCount;
            anim.Baked       = animJson.Baked;
            anim.BindIndices = new ushort[animJson.Groups.Count];
            anim.UserData    = UserDataConvert.Convert(animJson.UserData);

            foreach (var groupAnimJson in animJson.Groups)
            {
                var curve = groupAnimJson.Curves;
            }
        }
Exemple #8
0
 public void Read(VisibilityAnim vis)
 {
     VisibilityAnim = vis;
 }
Exemple #9
0
 public FVIS(VisibilityAnim anim)
 {
     Initialize(); LoadAnim(anim);
 }
        public static void Read(ResFileSwitchLoader loader, VisibilityAnim visibilityAnim)
        {
            if (loader.ResFile.VersionMajor2 == 9)
            {
                visibilityAnim._flags = loader.ReadUInt16();
                loader.ReadUInt16(); //Padding
            }
            else
            {
                loader.LoadHeaderBlock();
            }
            visibilityAnim.Name      = loader.LoadString();
            visibilityAnim.Path      = loader.LoadString();
            visibilityAnim.BindModel = loader.Load <Model>();
            long BindIndicesOffset   = loader.ReadInt64();
            long CurveArrayOffset    = loader.ReadInt64();
            long BaseDataArrayOffset = loader.ReadInt64();
            long NameArrayOffset     = loader.ReadInt64();

            visibilityAnim.UserData = loader.LoadDictValues <UserData>();

            if (loader.ResFile.VersionMajor2 != 9)
            {
                visibilityAnim._flags = loader.ReadUInt16();
            }
            else
            {
                loader.ReadUInt16(); //Idk what this is
            }
            ushort numUserData = loader.ReadUInt16();

            visibilityAnim.FrameCount = loader.ReadInt32();
            ushort numAnim  = loader.ReadUInt16();
            ushort numCurve = loader.ReadUInt16();

            visibilityAnim.BakedSize = loader.ReadUInt32();

            visibilityAnim.BindIndices = loader.LoadCustom(() => loader.ReadUInt16s(numAnim), (uint)BindIndicesOffset);
            visibilityAnim.Names       = loader.LoadCustom(() => loader.LoadStrings(numAnim), (uint)NameArrayOffset); // Offset to name list.
            visibilityAnim.Curves      = loader.LoadList <AnimCurve>(numCurve, (uint)CurveArrayOffset);

            visibilityAnim.baseDataBytes = new List <byte>();
            visibilityAnim.BaseDataList  = loader.LoadCustom(() =>
            {
                bool[] baseData = new bool[numAnim];
                int keyIndex    = 0;
                for (int i = 0; i < numAnim; i++)
                {
                    if (numAnim <= keyIndex)
                    {
                        break;
                    }

                    int value = loader.ReadInt32();

                    //Bit shift each key value
                    for (int j = 0; j < 32; j++)
                    {
                        if (numAnim <= keyIndex)
                        {
                            break;
                        }

                        bool set = (value & 0x1) != 0;
                        value  >>= 1;

                        baseData[keyIndex] = set;
                        keyIndex++;
                    }
                }
                return(baseData);
            }, (uint)BaseDataArrayOffset);
        }
Exemple #11
0
 public BfresVisibilityAnim(VisibilityAnim anim, string name)
 {
     ModelName = name;
     CanPlay   = false; //Default all animations to not play unless toggled in list
     Reload(anim);
 }