private void ScanAllAnimations() { //if (MODEL.IS_PLAYER) // return; //todo //lock (_lock_AdditiveOverlays) //{ // _additiveBlendOverlays = new List<NewHavokAnimation>(); // _additiveBlendOverlayNames = new List<string>(); //} List <string> allAnimNames = new List <string>(); lock (_lock_animDict) { foreach (var kvp in animHKXsToLoad) { allAnimNames.Add(kvp.Key); } } LoadingTaskMan.DoLoadingTaskSynchronous("ScanningAllAnimations", "Loading animations...", prog => { for (int i = 0; i < allAnimNames.Count; i++) { prog?.Report(1.0 * i / allAnimNames.Count); CurrentAnimationName = allAnimNames[i]; } CurrentAnimationName = null; prog?.Report(1.0); }); }
public static Model LoadObject(string id) { Model obj = null; LoadingTaskMan.DoLoadingTaskSynchronous($"LOAD_OBJ_{id}", $"Loading object {id}...", progress => { if (GameType == GameTypes.DS3) { var chrbnd = BND4.Read($@"{InterrootPath}\obj\{id}.objbnd.dcx"); obj = new Model(progress, id, chrbnd, 0, null, null); } else if (GameType == GameTypes.DS1) { var chrbnd = BND3.Read($@"{InterrootPath}\obj\{id}.objbnd"); obj = new Model(progress, id, chrbnd, 0, null, null); } else if (GameType == GameTypes.DS1R) { var chrbnd = BND4.Read($@"{InterrootPath}\obj\{id}.objbnd.dcx"); obj = new Model(progress, id, chrbnd, 0, null, null); } else if (GameType == GameTypes.BB) { var chrbnd = BND4.Read($@"{InterrootPath}\obj\{id}.objbnd.dcx"); obj = new Model(progress, id, chrbnd, 0, null, null); } Scene.AddModel(obj); var texturesToLoad = obj.MainMesh.GetAllTexNamesToLoad(); LoadingTaskMan.DoLoadingTask($"LOAD_OBJ_{id}_TEX", "Loading additional object textures...", innerProgress => { if (GameType == GameTypes.DS1) { foreach (var tex in texturesToLoad) { TexturePool.AddTpfFromPath($@"{InterrootPath}\map\tx\{tex}.tpf"); } } else if (GameType == GameTypes.DS3) { int objGroup = int.Parse(id.Substring(1)) / 1_0000; var tpfBnds = System.IO.Directory.GetFiles($@"{InterrootPath}\map\m{objGroup:D2}", "*.tpfbhd"); foreach (var t in tpfBnds) { TexturePool.AddSpecificTexturesFromBinder(t, texturesToLoad, directEntryNameMatch: true); } } obj.MainMesh.TextureReloadQueued = true; }); }); return(obj); }
//public enum MapModelSearchType //{ // CHR, // OBJ, // MAP //} //public static string GetMapThatModelIsIn(string modelName, MapModelSearchType searchType) //{ // if (GameType == GameTypes.DS3) // { // foreach (var msbName in System.IO.Directory.GetFiles(GetInterrootPath($@"map\MapStudio", "*.msb.dcx"))) // { // var shortMsbName = Utils.GetShortIngameFileName(msbName); // var msb = MSB3.Read(msbName); // if (searchType == MapModelSearchType.CHR) // { // foreach (var m in msb.Models.Enemies) // if (m.Name == modelName) // return shortMsbName; // } // else if (searchType == MapModelSearchType.OBJ) // { // foreach (var m in msb.Models.Objects) // if (m.Name == modelName) // return shortMsbName; // } // else if (searchType == MapModelSearchType.MAP) // { // foreach (var m in msb.Models.MapPieces) // if (m.Name == modelName) // return shortMsbName; // } // } // } //} public static void LoadSystex() { LoadingTaskMan.DoLoadingTask("LoadSystex", "Loading SYSTEX textures...", progress => { if (GameType == GameTypes.DS1) { TexturePool.AddTpfsFromPaths(new List <string> { GetInterrootPath($@"other\SYSTEX_TEX.tpf"), GetInterrootPath($@"other\envlight.tpf"), GetInterrootPath($@"other\lensflare.tpf"), }, progress); } else if (GameType == GameTypes.DS1R) { TexturePool.AddTpfsFromPaths(new List <string> { GetInterrootPath($@"other\SYSTEX_TEX.tpf.dcx"), GetInterrootPath($@"other\envlight.tpf.dcx"), GetInterrootPath($@"other\lensflare.tpf.dcx"), }, progress); } else if (GameType == GameTypes.DS3) { TexturePool.AddTpfsFromPaths(new List <string> { GetInterrootPath($@"other\systex.tpf.dcx"), GetInterrootPath($@"other\bloodtex.tpf.dcx"), GetInterrootPath($@"other\decaltex.tpf.dcx"), GetInterrootPath($@"other\sysenvtex.tpf.dcx"), GetInterrootPath($@"parts\common_body.tpf.dcx"), }, progress); } else if (GameType == GameTypes.BB) { // TODO: completely confirm these because I just // copied them from a BB network test file list. TexturePool.AddTpfsFromPaths(new List <string> { GetInterrootPath($@"other\SYSTEX.tpf.dcx"), GetInterrootPath($@"other\decalTex.tpf.dcx"), GetInterrootPath($@"other\bloodTex.tpf.dcx"), }, progress); } else if (GameType == GameTypes.SDT) { TexturePool.AddTpfsFromPaths(new List <string> { GetInterrootPath($@"other\systex.tpf.dcx"), GetInterrootPath($@"other\maptex.tpf.dcx"), GetInterrootPath($@"other\decaltex.tpf.dcx"), GetInterrootPath($@"parts\common_body.tpf.dcx"), }, progress); } }); }
private void buttonImport_Click(object sender, EventArgs e) { if (!(GameDataManager.GameType == SoulsAssetPipeline.SoulsGames.DS1 || GameDataManager.GameType == SoulsAssetPipeline.SoulsGames.DS1R || GameDataManager.GameType == SoulsAssetPipeline.SoulsGames.DS3)) { ImguiOSD.DialogManager.DialogOK("Not Supported", "Only supported on DS1 PTDE, DS1R, and DS3 for now."); return; } LoadingTaskMan.DoLoadingTask("SoulsAssetPipeline_AnimFBXImport", "Importing Animation To Current...", prog => { Invoke(new Action(() => { buttonImport.Enabled = false; buttonImportToLooseHKX.Enabled = false; })); try { var finalHkxDataToImport = ImportAnimToHKX(); MainScreen.FileContainer.AddNewHKX(Utils.GetFileNameWithoutAnyExtensions(Scene.MainModel.AnimContainer.CurrentAnimationName), finalHkxDataToImport, out byte[] dataForAnimContainer); MainScreen.Graph.ViewportInteractor.CurrentModel.AnimContainer.AddNewHKXToLoad(Scene.MainModel.AnimContainer.CurrentAnimationName, dataForAnimContainer); MainScreen.ReselectCurrentAnimation(); MainScreen.HardReset(); Invoke(new Action(() => { Main.WinForm.Focus(); })); } catch (Exception ex) { ImguiOSD.DialogManager.DialogOK("Import Failed", $"Failed to import animation. Error below:\n\n{ex}"); } finally { Invoke(new Action(() => { buttonImport.Enabled = true; buttonImportToLooseHKX.Enabled = true; })); } }, disableProgressBarByDefault: true, isUnimportant: true); }
private void buttonSaveImportedData_Click(object sender, EventArgs e) { if (DoSaveImport == null) { System.Windows.Forms.MessageBox.Show("Nothing to save."); } else { GameDataManager.CreateCharacterModelBackup(Scene.MainModel.Name); LoadingTaskMan.DoLoadingTask("SapFlver2SaveImportedData", "Saving imported model and textures...", prog => { for (int i = 0; i < DoSaveImport.Count; i++) { DoSaveImport[i]?.Invoke(); prog?.Report(1.0 * (i + 1) / DoSaveImport.Count); } System.Windows.Forms.MessageBox.Show("Saved file."); }, isUnimportant: true); } }
private void PopulateAdditiveBlendOverlays() { //if (MODEL.IS_PLAYER) // return; //todo lock (_lock_AdditiveOverlays) { _additiveBlendOverlays = new List <NewHavokAnimation>(); List <string> allAnimNames = new List <string>(); lock (_lock_animDict) { foreach (var kvp in animHKXsToLoad) { allAnimNames.Add(kvp.Key); } } LoadingTaskMan.DoLoadingTaskSynchronous("ScanningAllAnimations", "Loading animations...", prog => { for (int i = 0; i < allAnimNames.Count; i++) { prog?.Report(1.0 * i / allAnimNames.Count); CurrentAnimationName = allAnimNames[i]; if (CurrentAnimation != null) { if (CurrentAnimation.IsAdditiveBlend) { var clone = NewHavokAnimation.Clone(CurrentAnimation); clone.Weight = -1; _additiveBlendOverlays.Add(clone); } } } CurrentAnimationName = null; prog?.Report(1.0); }); } }
private void buttonImportDirectlyTest_Click(object sender, EventArgs e) { LoadingTaskMan.DoLoadingTask("SoulsAssetPipeline_AnimFBXImport", "Importing Animation To Current...", prog => { Invoke(new Action(() => { buttonImport.Enabled = false; buttonImportToLooseHKX.Enabled = false; })); try { var anim = ImportAnim(); Scene.MainModel.AnimContainer.AddNewAnimation(Scene.MainModel.AnimContainer.CurrentAnimationName, new NewHavokAnimation(anim, Scene.MainModel.AnimContainer.Skeleton, Scene.MainModel.AnimContainer)); MainScreen.ReselectCurrentAnimation(); MainScreen.HardReset(); Invoke(new Action(() => { Main.WinForm.Focus(); })); } catch (Exception ex) { ImguiOSD.DialogManager.DialogOK("Import Failed", $"Failed to import animation. Error below:\n\n{ex}"); } finally { Invoke(new Action(() => { buttonImport.Enabled = true; buttonImportToLooseHKX.Enabled = true; })); } }, disableProgressBarByDefault: true, isUnimportant: true); }
public static Model LoadCharacter(string id) { Model chr = null; LoadingTaskMan.DoLoadingTaskSynchronous($"LOAD_CHR_{id}", $"Loading character {id}...", progress => { if (GameType == GameTypes.DS3) { var chrbnd = BND4.Read($@"{InterrootPath}\chr\{id}.chrbnd.dcx"); IBinder texbnd = null; IBinder extraTexbnd = null; IBinder anibnd = null; if (System.IO.File.Exists($@"{InterrootPath}\chr\{id}.texbnd.dcx")) { texbnd = BND4.Read($@"{InterrootPath}\chr\{id}.texbnd.dcx"); } if (System.IO.File.Exists($@"{InterrootPath}\chr\{id.Substring(0, 4)}9.texbnd.dcx")) { extraTexbnd = BND4.Read($@"{InterrootPath}\chr\{id.Substring(0, 4)}9.texbnd.dcx"); } if (System.IO.File.Exists($@"{InterrootPath}\chr\{id}.anibnd.dcx")) { anibnd = BND4.Read($@"{InterrootPath}\chr\{id}.anibnd.dcx"); } chr = new Model(progress, id, chrbnd, 0, anibnd, texbnd, ignoreStaticTransforms: true, additionalTexbnd: extraTexbnd); } else if (GameType == GameTypes.DS1) { var chrbnd = BND3.Read($@"{InterrootPath}\chr\{id}.chrbnd"); IBinder anibnd = null; IBinder texbnd = null; IBinder extraTexbnd = null; if (System.IO.File.Exists($@"{InterrootPath}\chr\{id}.anibnd")) { anibnd = BND3.Read($@"{InterrootPath}\chr\{id}.anibnd"); } if (System.IO.File.Exists($@"{InterrootPath}\chr\{id.Substring(0, 4)}9.chrbnd")) { extraTexbnd = BND3.Read($@"{InterrootPath}\chr\{id.Substring(0, 4)}9.chrbnd"); } if (System.IO.File.Exists($@"{InterrootPath}\chr\{id}.chrtpfbdt")) { var chrtpfbhd = chrbnd.Files.FirstOrDefault(fi => fi.Name.ToLower().EndsWith(".chrtpfbhd")); if (chrtpfbhd != null) { texbnd = BXF3.Read(chrtpfbhd.Bytes, $@"{InterrootPath}\chr\{id}.chrtpfbdt"); } } chr = new Model(progress, id, chrbnd, 0, anibnd, texbnd, possibleLooseTpfFolder: $@"{InterrootPath}\chr\{id}\", ignoreStaticTransforms: true, additionalTexbnd: extraTexbnd); } else if (GameType == GameTypes.DS1R) { var chrbnd = BND3.Read($@"{InterrootPath}\chr\{id}.chrbnd.dcx"); IBinder anibnd = null; IBinder texbnd = null; IBinder extraTexbnd = null; if (System.IO.File.Exists($@"{InterrootPath}\chr\{id}.anibnd.dcx")) { anibnd = BND3.Read($@"{InterrootPath}\chr\{id}.anibnd.dcx"); } if (System.IO.File.Exists($@"{InterrootPath}\chr\{id.Substring(0, 4)}9.chrbnd.dcx")) { extraTexbnd = BND3.Read($@"{InterrootPath}\chr\{id.Substring(0, 4)}9.chrbnd.dcx"); } if (System.IO.File.Exists($@"{InterrootPath}\chr\{id}.chrtpfbdt")) { var chrtpfbhd = chrbnd.Files.FirstOrDefault(fi => fi.Name.ToLower().EndsWith(".chrtpfbhd")); if (chrtpfbhd != null) { texbnd = BXF3.Read(chrtpfbhd.Bytes, $@"{InterrootPath}\chr\{id}.chrtpfbdt"); } } chr = new Model(progress, id, chrbnd, 0, anibnd, texbnd, possibleLooseTpfFolder: $@"{InterrootPath}\chr\{id}\", ignoreStaticTransforms: true, additionalTexbnd: extraTexbnd); } else if (GameType == GameTypes.BB) { var chrbnd = BND4.Read($@"{InterrootPath}\chr\{id}.chrbnd.dcx"); IBinder anibnd = null; IBinder extraTexbnd = null; if (System.IO.File.Exists($@"{InterrootPath}\chr\{id}.anibnd.dcx")) { anibnd = BND4.Read($@"{InterrootPath}\chr\{id}.anibnd.dcx"); } if (System.IO.File.Exists($@"{InterrootPath}\chr\{id.Substring(0, 4)}9.chrbnd.dcx")) { extraTexbnd = BND4.Read($@"{InterrootPath}\chr\{id.Substring(0, 4)}9.chrbnd.dcx"); } chr = new Model(progress, id, chrbnd, 0, anibnd, texbnd: null, additionalTpfNames: new List <string> { $@"{InterrootPath}\chr\{id}_2.tpf.dcx" }, possibleLooseTpfFolder: $@"{InterrootPath}\chr\{id}\", ignoreStaticTransforms: true, additionalTexbnd: extraTexbnd); } Scene.AddModel(chr); }); if (id == "c0000") { chr.IS_PLAYER = true; LoadingTaskMan.DoLoadingTask("c0000_ANIBNDs", "Loading additional player ANIBNDs...", progress => { string[] anibnds = System.IO.Directory.GetFiles($@"{InterrootPath}\chr", GameType == GameTypes.DS1 ? "c0000_*.anibnd" : "c0000_*.anibnd.dcx") .OrderBy(fn => { var fnCheck = fn.ToLower(); if (fnCheck.Contains("lo")) { return(0); } else if (fnCheck.Contains("md")) { return(1); } else if (fnCheck.Contains("hi")) { return(2); } else { return(3); } }).ToArray(); for (int i = 0; i < anibnds.Length; i++) { IBinder anibnd = null; if (BND3.Is(anibnds[i])) { anibnd = BND3.Read(anibnds[i]); } else { anibnd = BND4.Read(anibnds[i]); } chr.AnimContainer.LoadAdditionalANIBND(anibnd, null); progress.Report(1.0 * i / anibnds.Length); } progress.Report(1); }); } else { var additionalAnibnds = System.IO.Directory.GetFiles($@"{InterrootPath}\chr", $"{id}_*.anibnd*"); if (additionalAnibnds.Length > 0) { LoadingTaskMan.DoLoadingTask($"{id}_ANIBNDs", "Loading additional character ANIBNDs...", progress => { for (int i = 0; i < additionalAnibnds.Length; i++) { IBinder anibnd = null; if (BND3.Is(additionalAnibnds[i])) { anibnd = BND3.Read(additionalAnibnds[i]); } else { anibnd = BND4.Read(additionalAnibnds[i]); } chr.AnimContainer.LoadAdditionalANIBND(anibnd, null); progress.Report(1.0 * i / additionalAnibnds.Length); } }); } } return(chr); }
public Model(IProgress <double> loadingProgress, string name, IBinder chrbnd, int modelIndex, IBinder anibnd, IBinder texbnd = null, List <string> additionalTpfNames = null, string possibleLooseTpfFolder = null, int baseDmyPolyID = 0, bool ignoreStaticTransforms = false, IBinder additionalTexbnd = null) : this() { Name = name; List <BinderFile> flverFileEntries = new List <BinderFile>(); List <TPF> tpfsUsed = new List <TPF>(); if (additionalTpfNames != null) { foreach (var t in additionalTpfNames) { if (File.Exists(t)) { tpfsUsed.Add(TPF.Read(t)); } } } FLVER2 flver = null; foreach (var f in chrbnd.Files) { var nameCheck = f.Name.ToLower(); if (flver == null && (nameCheck.EndsWith(".flver") || FLVER2.Is(f.Bytes))) { if (nameCheck.EndsWith($"_{modelIndex}.flver") || modelIndex == 0) { flver = FLVER2.Read(f.Bytes); } } else if (nameCheck.EndsWith(".tpf") || TPF.Is(f.Bytes)) { tpfsUsed.Add(TPF.Read(f.Bytes)); } else if (anibnd == null && nameCheck.EndsWith(".anibnd")) { if (nameCheck.EndsWith($"_{modelIndex}.anibnd") || modelIndex == 0) { if (BND3.Is(f.Bytes)) { anibnd = BND3.Read(f.Bytes); } else { anibnd = BND4.Read(f.Bytes); } } } } if (flver == null) { throw new ArgumentException("No FLVERs found within CHRBND."); } LoadFLVER2(flver, useSecondUV: false, baseDmyPolyID, ignoreStaticTransforms); loadingProgress.Report(1.0 / 4.0); AnimContainer = new NewAnimationContainer(this); if (anibnd != null) { LoadingTaskMan.DoLoadingTaskSynchronous($"{Name}_ANIBND", $"Loading ANIBND for {Name}...", innerProg => { AnimContainer.LoadBaseANIBND(anibnd, innerProg); }); } else { // This just messes up the model cuz they're already in // reference pose, whoops //Skeleton.ApplyBakedFlverReferencePose(); } loadingProgress.Report(2.0 / 3.0); if (tpfsUsed.Count > 0) { LoadingTaskMan.DoLoadingTaskSynchronous($"{Name}_TPFs", $"Loading TPFs for {Name}...", innerProg => { for (int i = 0; i < tpfsUsed.Count; i++) { TexturePool.AddTpf(tpfsUsed[i]); MainMesh.TextureReloadQueued = true; innerProg.Report(1.0 * i / tpfsUsed.Count); } MainMesh.TextureReloadQueued = true; }); } loadingProgress.Report(3.0 / 4.0); if (texbnd != null) { LoadingTaskMan.DoLoadingTaskSynchronous($"{Name}_TEXBND", $"Loading TEXBND for {Name}...", innerProg => { TexturePool.AddTextureBnd(texbnd, innerProg); MainMesh.TextureReloadQueued = true; }); } loadingProgress.Report(3.5 / 4.0); if (additionalTexbnd != null) { LoadingTaskMan.DoLoadingTaskSynchronous($"{Name}_AdditionalTEXBND", $"Loading extra TEXBND for {Name}...", innerProg => { TexturePool.AddTextureBnd(additionalTexbnd, innerProg); MainMesh.TextureReloadQueued = true; }); } loadingProgress.Report(3.9 / 4.0); if (possibleLooseTpfFolder != null && Directory.Exists(possibleLooseTpfFolder)) { TexturePool.AddTPFFolder(possibleLooseTpfFolder); MainMesh.TextureReloadQueued = true; } MainMesh.TextureReloadQueued = true; loadingProgress.Report(1.0); }
private void buttonImportToLooseHKX_Click(object sender, EventArgs e) { if (!(GameDataManager.GameType == SoulsAssetPipeline.SoulsGames.DS1 || GameDataManager.GameType == SoulsAssetPipeline.SoulsGames.DS1R || GameDataManager.GameType == SoulsAssetPipeline.SoulsGames.DS3)) { ImguiOSD.DialogManager.DialogOK("Not Supported", "Only supported on DS1 PTDE, DS1R, and DS3 for now."); return; } LoadingTaskMan.DoLoadingTask("SoulsAssetPipeline_AnimFBXImport", "Importing Animation To Current...", prog => { Invoke(new Action(() => { buttonImport.Enabled = false; buttonImportToLooseHKX.Enabled = false; })); try { var finalHkxDataToImport = ImportAnimToHKX(); var dlg = new SaveFileDialog() { Filter = "Havok Animation File (*.HKX)|*.HKX", Title = "Save Havok Animation File", }; if (!string.IsNullOrWhiteSpace(ImportConfig.AssetPath)) { string potentialDefaultDir = Path.GetDirectoryName(ImportConfig.AssetPath); if (Directory.Exists(potentialDefaultDir)) { dlg.InitialDirectory = potentialDefaultDir; } } if (GameDataManager.GameType == SoulsAssetPipeline.SoulsGames.DS1) { dlg.Filter = "HKX 2010 x32 - For DS1: PTDE (*.HKX)|*.HKX"; dlg.Title = "Save Dark Souls: PTDE Format Animation File"; } else if (GameDataManager.GameType == SoulsAssetPipeline.SoulsGames.DS1R) { dlg.Filter = "HKX 2015 x64 - For DS1R (*.HKX)|*.HKX"; dlg.Title = "Save Dark Souls Remastered Format Animation File"; } else if (GameDataManager.GameType == SoulsAssetPipeline.SoulsGames.DS3) { dlg.Filter = "HKX 2014 x64 - For DS3 (*.HKX)|*.HKX"; dlg.Title = "Save Dark Souls III Format Animation File"; } else { throw new NotImplementedException($"Current GameType not supported by the save loose HKX code: '{GameDataManager.GameType}'"); } if (!string.IsNullOrWhiteSpace(ImportConfig.AssetPath)) { dlg.InitialDirectory = Path.GetDirectoryName(ImportConfig.AssetPath); } if (dlg.ShowDialog() == DialogResult.OK) { File.WriteAllBytes(dlg.FileName, finalHkxDataToImport); } } catch (Exception ex) { ImguiOSD.DialogManager.DialogOK("Import Failed", $"Failed to import animation. Error below:\n\n{ex}"); } finally { Invoke(new Action(() => { buttonImport.Enabled = true; buttonImportToLooseHKX.Enabled = true; })); } }, disableProgressBarByDefault: true, isUnimportant: true); }
private void buttonImport_Click(object sender, EventArgs e) { LoadingTaskMan.DoLoadingTask("SoulsAssetPipeline_FLVER2Import", "Importing Model...", prog => { SaveValuesToConfig(); Main.SaveConfig(); var cfg = new FLVER2Importer.FLVER2ImportSettings(); cfg.Game = GameDataManager.GameType; cfg.FlverHeader = Scene.MainModel.MainMesh.Flver2Header; cfg.AssetPath = ImportConfig.AssetPath; cfg.ConvertFromZUp = ImportConfig.ConvertFromZUp; cfg.SceneScale = ImportConfig.SceneScale; SoulsAssetPipeline.FLVERImporting.FLVER2Importer.ImportedFLVER2Model importedFlver = null; using (var importer = new SoulsAssetPipeline.FLVERImporting.FLVER2Importer()) { importedFlver = importer.ImportFBX(textBoxFBX.Text, cfg); } List <Action> doImport = new List <Action>(); #if DEBUG byte[] flver = importedFlver.Flver.Write(); File.WriteAllBytes($"{Scene.MainModel.Name}.flver", flver); #endif var importedAnimStudioModel = GameDataManager.LoadCharacter(Scene.MainModel.Name, importedFlver, doImport, ImportConfig); DoSaveImport = doImport; var oldMainModel = Scene.MainModel; lock (Scene._lock_ModelLoad_Draw) { importedAnimStudioModel.NpcParam = oldMainModel.NpcParam; importedAnimStudioModel.DefaultDrawMask = oldMainModel.DefaultDrawMask; importedAnimStudioModel.DrawMask = oldMainModel.DrawMask; importedAnimStudioModel.NpcParam.ApplyToNpcModel(importedAnimStudioModel); Scene.Models.Remove(oldMainModel); oldMainModel?.Dispose(); importedAnimStudioModel.AnimContainer.CurrentAnimationName = null; } Main.TAE_EDITOR.Graph.ViewportInteractor.InitializeForCurrentModel(); Main.TAE_EDITOR.ReselectCurrentAnimation(); Main.TAE_EDITOR.HardReset(); Invoke(new Action(() => { buttonSaveImportedData.Enabled = true; })); //foreach (var tex in importedFlver.Textures) //{ // TexturePool.AddFetchDDS(tex.Value, tex.Key); //} //Dictionary<string, int> boneIndexRemap = new Dictionary<string, int>(); //for (int i = 0; i < Scene.MainModel.Skeleton.FlverSkeleton.Count; i++) //{ // if (!boneIndexRemap.ContainsKey(Scene.MainModel.Skeleton.FlverSkeleton[i].Name)) // boneIndexRemap.Add(Scene.MainModel.Skeleton.FlverSkeleton[i].Name, i); //} //var oldMainMesh = Scene.MainModel.MainMesh; //var newMainMesh = new NewMesh(importedFlver.Flver, false, boneIndexRemap); //lock (Scene._lock_ModelLoad_Draw) //{ // Scene.MainModel.MainMesh = newMainMesh; //} //oldMainMesh?.Dispose(); Scene.ForceTextureReloadImmediate(); }, disableProgressBarByDefault: true, isUnimportant: true); Main.WinForm.Focus(); }
public void UpdateGuiLockout() { SetGuiLock(LoadingTaskMan.AnyTasksRunning()); }