/// <summary> /// /// </summary> private void LoadDemoAnimationFiles() { // attempt to automatically locate files var modelFile = MainForm.Instance.FilePath.Replace(".dat", "Nr.dat"); var path = Path.GetDirectoryName(MainForm.Instance.FilePath); var fighterKey = Path.GetFileNameWithoutExtension(MainForm.Instance.FilePath).Replace("Pl", ""); var fighterName = _node.Parent.Text.Replace("ftData", ""); ResultFilePath = Path.Combine(path, $"GmRstM{fighterKey}.dat"); WaitFilePath = Path.Combine(path, $"Pl{fighterKey}DViWaitAJ.dat"); IntroFilePath = Path.Combine(path, $"ftDemoIntroMotionFile{fighterName}.dat"); EndingFilePath = Path.Combine(path, $"ftDemoEndingMotionFile{fighterName}.dat"); if (!File.Exists(modelFile)) { modelFile = FileIO.OpenFile("Fighter Model (Pl**Nr.dat)|*.dat", $"Pl{fighterKey}Nr.dat"); } if (string.IsNullOrEmpty(modelFile)) { return; } if (!File.Exists(ResultFilePath)) { ResultFilePath = FileIO.OpenFile("Fighter Result Anim (GmRstM**.dat)|*.dat", $"GmRstM{fighterKey}.dat"); } if (!File.Exists(WaitFilePath)) { WaitFilePath = FileIO.OpenFile("Fighter Wait Anim (Pl**DViWaitAJ.dat)|*.dat", $"Pl{fighterKey}DViWaitAJ.dat"); } if (!File.Exists(IntroFilePath)) { IntroFilePath = FileIO.OpenFile("Fighter Intro Anim Bank (ftDemoIntroMotionFile**.dat)|*.dat", $"ftDemoIntroMotionFile{fighterName}.dat"); } if (!File.Exists(EndingFilePath)) { EndingFilePath = FileIO.OpenFile("Fighter Ending Anim Bank (ftDemoEndingMotionFile**.dat)|*.dat", $"ftDemoEndingMotionFile{fighterName}.dat"); } // load animation data AJManager = new FighterAJManager(); ResultSymbol = AJManager.ScanAJFile(ResultFilePath); WaitSymbol = AJManager.ScanAJFile(WaitFilePath); IntroSymbol = AJManager.ScanAJFile(IntroFilePath); EndingSymbol = AJManager.ScanAJFile(EndingFilePath); MessageBox.Show($"Loaded:\nResultBank: {ResultFilePath}\nWaitBank: {WaitFilePath}\nIntroBank: {IntroFilePath}\nEndingBank: {EndingFilePath}"); // load model LoadModel(modelFile); // shared rendering init InitRendering(); }
/// <summary> /// /// </summary> /// <param name="ftdat"></param> /// <param name="ajdat"></param> /// <param name="editAnim"></param> public static void EditFighterAnimations(string ftdat, string ajdat, EditAnimation editAnim) { FighterAJManager manager = new FighterAJManager(File.ReadAllBytes(ajdat)); foreach (var symbol in manager.GetAnimationSymbols()) { if (symbol.Contains("Taro")) { continue; } var ftFile = new HSDRawFile(manager.GetAnimationData(symbol)); if (ftFile[symbol] != null) { var ft = ftFile[symbol].Data as HSD_FigaTree; editAnim(ft, symbol); ftFile[symbol].Data = ft; using (MemoryStream stream = new MemoryStream()) { ftFile.Save(stream); manager.SetAnimation(symbol, stream.ToArray()); } } } var newAJFile = manager.RebuildAJFile(manager.GetAnimationSymbols().ToArray(), true); HSDRawFile ftfile = new HSDRawFile(ftdat); if (ftfile.Roots[0].Data is SBM_FighterData data) { var sa = data.FighterActionTable.Commands; foreach (var action in sa) { if (action.SymbolName != null && !string.IsNullOrEmpty(action.SymbolName.Value)) { var sizeOffset = manager.GetOffsetSize(action.SymbolName.Value); action.AnimationOffset = sizeOffset.Item1; action.AnimationSize = sizeOffset.Item2; } } data.FighterActionTable.Commands = sa; ftfile.TrimData(); ftfile.Save(ftdat); File.WriteAllBytes(ajdat, newAJFile); } }
/// <summary> /// /// </summary> private void LoadFighterAnimationFiles() { var aFile = MainForm.Instance.FilePath.Replace(".dat", "AJ.dat"); var cFile = MainForm.Instance.FilePath.Replace(".dat", "Nr.dat"); // try to automatically locate files bool openFiles = true; if (File.Exists(aFile) && File.Exists(cFile)) { var r = MessageBox.Show($"Load {System.IO.Path.GetFileName(aFile)} and {System.IO.Path.GetFileName(cFile)}", "Open Files", MessageBoxButtons.YesNoCancel); if (r == DialogResult.Cancel) { return; } if (r == DialogResult.Yes) { openFiles = false; } } // find files to open if (openFiles) { cFile = FileIO.OpenFile("Fighter Costume (Pl**Nr.dat)|*.dat"); if (cFile == null) { return; } aFile = FileIO.OpenFile("Fighter Animation (Pl**AJ.dat)|*.dat"); if (aFile == null) { return; } } // load animation data AJFilePath = aFile; AJManager = new FighterAJManager(File.ReadAllBytes(aFile)); // load model LoadModel(cFile); // shared rendering init InitRendering(); }
public bool DoIt(string[] args) { if (args.Length >= 3) { // parse args var plxxfile = Path.GetFullPath(args[1]); var plxxajfile = Path.GetFullPath(args[2]); var plxxnrfile = Path.GetFullPath(args[3]); var anim_pathfile = Path.GetFullPath(args[4]); var symbol = args[5]; HSD_FigaTree anim_to_inject = null; // rendering files not loaded if (string.IsNullOrEmpty(plxxfile) || string.IsNullOrEmpty(plxxajfile) || string.IsNullOrEmpty(anim_pathfile)) { return(false); } // check if anim is maya anim if (Path.GetExtension(anim_pathfile).ToLower().Contains("anim")) { // todo: joint map anim_to_inject = Tools.ConvMayaAnim.ImportFromMayaAnim(anim_pathfile, null); // optimize var nodes = anim_to_inject.Nodes; var joints = (new HSDRawFile(plxxnrfile).Roots[0].Data as HSD_JOBJ).BreathFirstList; int nodeIndex = 0; foreach (var n in nodes) { var joint = joints[nodeIndex]; var tracks = n.Tracks.Select(e => new FOBJ_Player(e.ToFOBJ())).ToList(); AnimationKeyCompressor.OptimizeJointTracks(joint, ref tracks); n.Tracks = tracks.Select(e => { var tr = new HSD_Track(); tr.FromFOBJ(e.ToFobj()); return(tr); }).ToList(); nodeIndex++; } anim_to_inject.Nodes = nodes; } else { // check if anim if figatree try { HSDRawFile f = new HSDRawFile(anim_pathfile); if (f.Roots.Count < 1) { return(false); } if (f.Roots[0].Data is HSD_FigaTree ani) { anim_to_inject = ani; } else { return(false); } } catch { return(false); } } // make sure anim isn't null if (anim_to_inject == null) { return(false); } try { var plxx = new HSDRawFile(plxxfile); FighterAJManager animManager = new FighterAJManager(); animManager.ScanAJFile(plxxajfile); var newAnim = new HSDRawFile(); newAnim.Roots.Add(new HSDRootNode() { Name = symbol, Data = anim_to_inject }); using (MemoryStream stream = new MemoryStream()) { // set new animation newAnim.Save(stream); animManager.SetAnimation(symbol, stream.ToArray()); var ftdata = plxx.Roots[0].Data as SBM_FighterData; var commands = ftdata.FighterActionTable.Commands; var symbols = commands.Select(e => e.SymbolName.Value).ToArray(); var rebuild = animManager.RebuildAJFile(symbols, true); foreach (var c in commands) { if (c.SymbolName != null && !string.IsNullOrEmpty(c.SymbolName.Value)) { var sizeoffset = animManager.GetOffsetSize(c.SymbolName.Value); c.AnimationOffset = sizeoffset.Item1; c.AnimationSize = sizeoffset.Item2; } } // save files plxx.Save(plxxfile); File.WriteAllBytes(plxxajfile, rebuild); } } catch { return(false); } return(true); } return(false); }