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); }
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); } } } }
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); }
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; } }
public void Read(VisibilityAnim vis) { VisibilityAnim = vis; }
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); }
public BfresVisibilityAnim(VisibilityAnim anim, string name) { ModelName = name; CanPlay = false; //Default all animations to not play unless toggled in list Reload(anim); }