private void listBox1_SelectedIndexChanged_1(object sender, EventArgs e) { int n = listBox1.SelectedIndex; if (n == -1) { return; } n = Objects[n]; lODToolStripMenuItem.Visible = false; UnCheckLODs(); stm = null; skm = null; preview?.Dispose(); preview = null; MaterialBox.Visible = false; MaterialApplyButton.Visible = false; MaterialIndexBox.Visible = false; MaterialIndexApplyButton.Visible = false; if (Pcc.getExport(n).ClassName == "StaticMesh") { LoadStaticMesh(n); } if (Pcc.getExport(n).ClassName == "SkeletalMesh") { LoadSkeletalMesh(n); } }
/// <summary> /// Do not remove this method - it is used by ME3Tweaks Rebuilding TFC Guide /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dEBUGEnsureFolderOfPackageFilesHasANameToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog d = new OpenFileDialog { Filter = "ME2/ME3 Package files|*.pcc" }; if (d.ShowDialog() == DialogResult.OK) { var pccs = Directory.GetFiles(Path.GetDirectoryName(d.FileName), "*pcc"); if (pccs.Count() > 0) { string input = "Enter a name. This name will be added to every PCC in this folder if it does not already exist."; string name = PromptDialog.Prompt(null, input, "Enter name"); if (name != null) { foreach (string pccPath in pccs) { LoadMEPackage(pccPath); int numNames = Pcc.Names.Count; Pcc.FindNameOrAdd(name); int afternumNames = Pcc.Names.Count; if (numNames != afternumNames) { Pcc.save(); Debug.WriteLine("Added " + name + " to " + pccPath); } } } } } }
public void LoadFile(string path) { try { //LoadME3Package(path); LoadMEPackage(path); if (Pcc.Game != MEGame.ME3) { MessageBox.Show(this, "Only files from Mass Effect 3 are supported.\nIf you want to help us debug loading ME1/ME2 files, please come to the ME3Tweaks Discord server.", "Unsupported game"); Pcc.Release(); return; } MeshplorerMode = 0; RefreshMaterialList(); RefreshMeshList(); lblStatus.Text = Path.GetFileName(path); AddRecent(path, false); SaveRecentList(); RefreshRecent(true, RFiles); } catch (Exception ex) { MessageBox.Show("Error:\n" + ex.Message); } }
/// <summary> /// Attempts to relink unreal property data using propertycollection when cross porting an export /// </summary> private List <string> relinkObjects2(IMEPackage importpcc) { List <string> relinkResults = new List <string>(); //relink each modified export //We must convert this to a list, as this list will be updated as imports are cross mapped during relinking. //This process speeds up same-relinks later. //This is a list because otherwise we would get a concurrent modification exception. //Since we only enumerate exports and append imports to this list we will not need to worry about recursive links //I am sure this won't come back to be a pain for me. List <KeyValuePair <int, int> > crossPCCObjectMappingList = crossPCCObjectMap.ToList(); for (int i = 0; i < crossPCCObjectMappingList.Count; i++) { KeyValuePair <int, int> entry = crossPCCObjectMappingList[i]; if (entry.Key > 0) { PropertyCollection transplantProps = importpcc.Exports[entry.Key].GetProperties(); relinkResults.AddRange(relinkPropertiesRecursive(importpcc, Pcc, transplantProps, crossPCCObjectMappingList)); Pcc.getExport(entry.Value).WriteProperties(transplantProps); } } return(relinkResults); }
public override void handleUpdate(List <PackageUpdate> updates) { IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import && x.change != PackageChange.ImportAdd && x.change != PackageChange.Names); List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList(); if (updatedExports.Contains(bank.ExportIndex)) { int index = bank.ExportIndex; //loaded sequence is no longer a sequence if (Pcc.getExport(index).ClassName != "WwiseBank") { bank = null; listBox2.Items.Clear(); rtb1.Text = ""; hb1.ByteProvider = new DynamicByteProvider(); hircHexBox.ByteProvider = new DynamicByteProvider(); } RefreshSelected(); updatedExports.Remove(index); } if (updatedExports.Intersect(objects).Any()) { ListRefresh(); } foreach (var i in updatedExports) { if (Pcc.getExport(i).ClassName.Contains("WwiseBank")) { ListRefresh(); break; } } }
public void LoadStaticMesh(int index) { try { stm = ObjectBinary.From <StaticMesh>(Pcc.GetUExport(index)); //var mesh = ObjectBinary.From <StaticMesh>(Pcc.getUExport(index)); // Load meshes for the LODs preview?.Dispose(); preview = new ModelPreview(view.Context.Device, stm, 0, view.Context.TextureCache); RefreshChosenMaterialsList(); CenterView(); // Update treeview treeView1.BeginUpdate(); treeView1.Nodes.Clear(); //treeView1.Nodes.Add(stm.ToTree()); //treeView1.Nodes[0].Expand(); treeView1.EndUpdate(); MaterialBox.Visible = false; MaterialApplyButton.Visible = false; MaterialIndexBox.Visible = false; MaterialIndexApplyButton.Visible = false; } catch (Exception e) { MessageBox.Show(ExceptionHandlerDialogWPF.FlattenException(e)); } }
public override void handleUpdate(List <PackageUpdate> updates) { IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import && x.change != PackageChange.ImportAdd && x.change != PackageChange.Names); List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList(); if (Dialog != null && updatedExports.Contains(Dialog.MyIndex)) { //loaded dialog is no longer a dialog if (Pcc.getExport(Dialog.MyIndex).ClassName != "BioConversation") { listBox1.Items.Clear(); listBox2.Items.Clear(); listBox3.Items.Clear(); listBox4.Items.Clear(); listBox5.Items.Clear(); treeView1.Nodes.Clear(); treeView2.Nodes.Clear(); } else { Dialog = new ME1BioConversation(Pcc as ME1Package, Dialog.MyIndex); RefreshTabs(); } updatedExports.Remove(Dialog.MyIndex); } if (updatedExports.Intersect(Objs).Count() > 0) { Objs = new List <int>(); for (int i = 0; i < Pcc.Exports.Count; i++) { if (Pcc.Exports[i].ClassName == "BioConversation") { Objs.Add(i); } } RefreshCombo(); } else { foreach (var i in updatedExports) { if (Pcc.getExport(i).ClassName == "BioConversation") { Objs = new List <int>(); for (int j = 0; j < Pcc.Exports.Count; j++) { if (Pcc.Exports[j].ClassName == "BioConversation") { Objs.Add(j); } } RefreshCombo(); break; } } } }
public void SaveFile() { if (Pcc == null) { return; } if (CodexMapControl != null) { if (CodexMapView.TryFindCodexMap(Pcc, out IExportEntry export, out int _)) { using (var stream = new MemoryStream()) { var codexMap = CodexMapControl.ToCodexMap(); var binaryCodexMap = new BinaryBioCodexMap(codexMap.Sections, codexMap.Pages); binaryCodexMap.Save(stream); export.setBinaryData(stream.ToArray()); } } } if (QuestMapControl != null) { if (QuestMapControl.TryFindQuestMap(Pcc, out IExportEntry export, out int _)) { using (var stream = new MemoryStream()) { var questMap = QuestMapControl.ToQuestMap(); var binaryQuestMap = new BinaryBioQuestMap(questMap.Quests, questMap.BoolTaskEvals, questMap.IntTaskEvals, questMap.FloatTaskEvals); binaryQuestMap.Save(stream); export.setBinaryData(stream.ToArray()); } } } if (StateEventMapControl != null) { if (StateEventMapView.TryFindStateEventMap(Pcc, out IExportEntry export)) { using (var stream = new MemoryStream()) { var stateEventMap = StateEventMapControl.ToStateEventMap(); var binaryStateEventMap = new BinaryBioStateEventMap(stateEventMap.StateEvents); binaryStateEventMap.Save(stream); export.setBinaryData(stream.ToArray()); } } } Pcc.save(); }
private void saveToolStripMenuItem_Click(object sender, EventArgs e) { if (Pcc == null) { return; } Pcc.save(); MessageBox.Show("Done"); }
private void Save_Executed(object sender, ExecutedRoutedEventArgs e) { if (Pcc != null) { SaveChanges(); Pcc.save(); MessageBox.Show("Done!"); } }
private void savePCCToolStripMenuItem_Click(object sender, EventArgs e) { if (Pcc == null) { return; } Pcc.save(); MessageBox.Show("Done.", "Meshplorer", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); }
private void saveChangesToolStripMenuItem_Click(object sender, EventArgs e) { if (Dialog == null) { return; } Dialog.Save(); Pcc.save(); MessageBox.Show("Done."); }
private void savePccToolStripMenuItem_Click(object sender, EventArgs e) { SaveFileDialog d = new SaveFileDialog { Filter = "*.pcc|*.pcc" }; if (d.ShowDialog() == DialogResult.OK) { Pcc.save(d.FileName); MessageBox.Show("Done."); } }
public BinaryInterpreterHost(string fileName, int index) { InitializeComponent(); LoadMEPackage(fileName); interpreter1.Pcc = Pcc; interpreter1.export = Pcc.getExport(index); interpreter1.InitInterpreter(); toolStripStatusLabel1.Text = "Class: " + interpreter1.export.ClassName + ", Export Index: " + index; toolStripStatusLabel2.Text = "@" + Path.GetFileName(Pcc.FileName); interpreter1.hb1.ReadOnly = true; interpreter1.saveHexButton.Visible = false; interpreter1.exportButton.Visible = true; }
private void SavePackageAs() { string extension = Path.GetExtension(Pcc.FileName); SaveFileDialog d = new SaveFileDialog { Filter = $"*{extension}|*{extension}" }; if (d.ShowDialog() == true) { Pcc.save(d.FileName); MessageBox.Show("Done"); } }
private void toEntrysReplyListToolStripMenuItem_Click(object sender, EventArgs e) { TreeNode t = treeView1.SelectedNode; if (t == null || t.Parent == null) { return; } TreeNode p = t.Parent; int Index; int SubIndx = -1; if (p.Parent == null) { Index = p.Index; } else { Index = p.Parent.Index; SubIndx = t.Index; } ME1BioConversation.EntryListStuct el = Dialog.EntryList[Index]; AddReply ar = new AddReply(); ar.pcc = Pcc as ME1Package; if (SubIndx != -1) { ME1BioConversation.EntryListReplyListStruct tr = el.ReplyList[SubIndx]; ar.textBox1.Text = tr.Paraphrase; ar.textBox2.Text = tr.refParaphrase.ToString(); ar.comboBox1.SelectedItem = Pcc.getNameEntry(tr.CategoryValue); ar.textBox4.Text = tr.Index.ToString(); } ar.Show(); while (ar.state == 0) { Application.DoEvents(); } ar.Close(); if (ar.state == -1) { return; } if (el.ReplyList == null) { el.ReplyList = new List <ME1BioConversation.EntryListReplyListStruct>(); } el.ReplyList.Add(ar.res); Dialog.EntryList[Index] = el; Dialog.Save(); }
private void SaveAsCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) { SaveFileDialog d = new SaveFileDialog(); string extension = System.IO.Path.GetExtension(pcc.FileName); d.Filter = $"*{extension}|*{extension}"; bool?result = d.ShowDialog(); if (result.HasValue && result.Value) { Pcc.save(d.FileName); MessageBox.Show("Done"); } }
private void dumpBinaryToolStripMenuItem_Click_1(object sender, EventArgs e) { int n; if (stm != null) { n = stm.Export.UIndex; //TODO: CHANGE FOR UINDEXING } else if (skm != null) { n = skm.Export.UIndex; } else { return; } ExportEntry export = Pcc.GetUExport(n); if (export.ClassName == "StaticMesh") { SaveFileDialog d = new SaveFileDialog(); d.Filter = "*.bin|*.bin"; d.FileName = export.ObjectName.Instanced + ".bin"; if (d.ShowDialog() == DialogResult.OK) { FileStream fs = new FileStream(d.FileName, FileMode.Create, FileAccess.Write); fs.WriteFromBuffer(export.getBinaryData()); fs.Close(); MessageBox.Show("Done.", "Meshplorer", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); } } if (export.ClassName == "SkeletalMesh") { SaveFileDialog d = new SaveFileDialog(); d.Filter = "*.bin|*.bin"; d.FileName = export.ObjectName.Instanced + ".bin"; if (d.ShowDialog() == DialogResult.OK) { using (FileStream fs = new FileStream(d.FileName, FileMode.Create, FileAccess.Write)) { var data = export.getBinaryData(); fs.Write(data, 0, data.Length); } MessageBox.Show("Done.", "Meshplorer", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); } } }
private void hircHexbox_SelectionChanged(object sender, EventArgs e) { DynamicByteProvider hbp = hircHexBox.ByteProvider as DynamicByteProvider; byte[] memory = hbp.Bytes.ToArray(); int start = (int)hircHexBox.SelectionStart; int len = (int)hircHexBox.SelectionLength; int size = (int)hircHexBox.ByteProvider.Length; try { if (memory.Length > 0 && start != -1 && start < size) { string s = $"Byte: {memory[start]}"; //if selection is same as size this will crash. if (start <= memory.Length - 4) { int val = BitConverter.ToInt32(memory, start); s += $", Int: {val} (0x{val.ToString("X8")})"; if (Pcc.isName(val)) { s += $", Name: {Pcc.getNameEntry(val)}"; } if (Pcc.getEntry(val) is IExportEntry exp) { s += $", Export: {exp.ObjectName}"; } else if (Pcc.getEntry(val) is ImportEntry imp) { s += $", Import: {imp.ObjectName}"; } } s += $" | Start=0x{start.ToString("X8")} "; if (len > 0) { s += $"Length=0x{len.ToString("X8")} "; s += $"End=0x{(start + len - 1).ToString("X8")}"; } hircHexboxStatusLabel.Text = s; } else { hircHexboxStatusLabel.Text = "Nothing Selected"; } } catch (Exception) { } }
public string GetDisplayableValue() { switch (Type) { case TYPE_INT: return(BitConverter.ToInt32(Data, 0).ToString()); case TYPE_NAME: int name = BitConverter.ToInt32(Data, 0); return(Pcc.getNameEntry(name)); case TYPE_FLOAT: return(BitConverter.ToSingle(Data, 0).ToString()); } return("Unknown type " + Type); }
private void serializeToFileToolStripMenuItem_Click(object sender, EventArgs e) { int n; if (stm != null) { n = stm.Export.UIndex; //TODO: CHANGE FOR UINDEXING } else if (skm != null) { n = skm.Export.UIndex; } else { return; } if (Pcc.GetUExport(n).ClassName == "StaticMesh") { SaveFileDialog d = new SaveFileDialog(); d.Filter = "*.bin|*.bin"; d.FileName = Pcc.GetUExport(n).ObjectName.Instanced + ".bin"; if (d.ShowDialog() == DialogResult.OK) { //DISABLED TEMP //stm.SerializeToFile(d.FileName); MessageBox.Show("Done.", "Meshplorer", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); } } if (Pcc.GetUExport(n).ClassName == "SkeletalMesh") { SaveFileDialog d = new SaveFileDialog(); d.Filter = "*.bin|*.bin"; d.FileName = Pcc.GetUExport(n).ObjectName.Instanced + ".bin"; if (d.ShowDialog() == DialogResult.OK) { SerializingContainer c = new SerializingContainer(); c.Memory = new MemoryStream(); c.isLoading = false; skm.Serialize(c); FileStream fs = new FileStream(d.FileName, FileMode.Create, FileAccess.Write); fs.Write(c.Memory.ToArray(), 0, (int)c.Memory.Length); fs.Close(); MessageBox.Show("Done.", "Meshplorer", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); } } }
public void LoadSkeletalMesh(int uindex) { DisableLODs(); UnCheckLODs(); try { skm = new SkeletalMesh(Pcc.GetUExport(uindex)); // Load preview model preview?.Dispose(); preview = new ModelPreview(view.Context.Device, skm, view.Context.TextureCache); RefreshChosenMaterialsList(); CenterView(); // Update treeview treeView1.BeginUpdate(); treeView1.Nodes.Clear(); treeView1.Nodes.Add(skm.ToTree()); treeView1.Nodes[0].Expand(); treeView1.EndUpdate(); lODToolStripMenuItem.Visible = true; lOD0ToolStripMenuItem.Enabled = true; lOD0ToolStripMenuItem.Checked = true; if (skm.LODModels.Count > 1) { lOD1ToolStripMenuItem.Enabled = true; } if (skm.LODModels.Count > 2) { lOD2ToolStripMenuItem.Enabled = true; } if (skm.LODModels.Count > 3) { lOD3ToolStripMenuItem.Enabled = true; } MaterialBox.Visible = false; MaterialApplyButton.Visible = false; MaterialIndexBox.Visible = false; MaterialIndexApplyButton.Visible = false; } catch (Exception e) { MessageBox.Show(ExceptionHandlerDialogWPF.FlattenException(e)); } }
public override void handleUpdate(List <PackageUpdate> updates) { IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import && x.change != PackageChange.ImportAdd && x.change != PackageChange.Names); List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList(); if (FaceFX != null && updatedExports.Contains(FaceFX.Export.Index)) { int index = FaceFX.Export.Index; //loaded FaceFXAnimset is no longer a FaceFXAnimset if (FaceFX.Export.ClassName != "FaceFXAnimSet") { selectedLine = null; FaceFX = null; treeView.Nodes.Clear(); linesListBox.ItemsSource = null; animationListBox.ItemsSource = null; graph.Clear(); } else if (!this.IsForegroundWindow()) { loadFaceFXAnimset(); } updatedExports.Remove(index); } if (updatedExports.Intersect(animSets.Select(x => x.Index)).Any()) { RefreshComboBox(); } else { foreach (var i in updatedExports) { if (Pcc.getExport(i).ClassName == "FaceFXAnimSet") { RefreshComboBox(); break; } } } }
public override void handleUpdate(List <PackageUpdate> updates) { IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import && x.change != PackageChange.ImportAdd && x.change != PackageChange.Names); List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList(); if (FaceFX != null && updatedExports.Contains(FaceFX.export.Index)) { int index = FaceFX.export.Index; //loaded FaceFXAnimset is no longer a FaceFXAnimset if (FaceFX.export.ClassName != "FaceFXAnimSet") { FaceFX = null; treeView1.Nodes.Clear(); treeView2.Nodes.Clear(); hb1.ByteProvider = new DynamicByteProvider(); ListRefresh(); } else { FaceFXRefresh(index); } updatedExports.Remove(index); } if (updatedExports.Intersect(Objects).Any()) { ListRefresh(); } else { foreach (var i in updatedExports) { if (Pcc.getExport(i).ClassName == "FaceFXAnimSet") { ListRefresh(); break; } } } }
private void dEBUGAddAPropertyToExportsMatchingCriteriaToolStripMenuItem_Click(object sender, EventArgs e) { if (Pcc != null) { int count = 0; foreach (IExportEntry exp in Pcc.Exports) { if (exp.ObjectName == "StaticMeshCollectionActor") { var smas = exp.GetProperty <ArrayProperty <ObjectProperty> >("StaticMeshComponents"); foreach (ObjectProperty item in smas) { var export = Pcc.getExport(item.Value - 1); var props = export.GetProperties(); props.AddOrReplaceProp(new BoolProperty(false, "bUsePrecomputedShadows")); export.WriteProperties(props); count++; } } } System.Windows.MessageBox.Show($"Done. Updated {count} exports."); } }
public void RefreshChosenMaterialsList() { ChosenMaterials.Clear(); MaterialIndexBox.Items.Clear(); if (skm != null) { for (int i = 0; i < skm.Materials.Count; i++) { ChosenMaterials.Add(skm.Materials[i]); string desc = ""; if (skm.Materials[i] > 0) { // Material is export IExportEntry export = Pcc.getExport(skm.Materials[i] - 1); desc = " Export #" + skm.Materials[i] + " : " + export.ObjectName; } else if (skm.Materials[i] < 0) { // Material is import??? desc = "Import #" + -skm.Materials[i]; } MaterialIndexBox.Items.Add(i + " - " + desc); } } }
public override void handleUpdate(List <PackageUpdate> updates) { IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import && x.change != PackageChange.ImportAdd && x.change != PackageChange.Names); List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList(); if (updatedExports.Contains(timeline.GroupList.index)) { //loaded InterpData is no longer an InterpData if (Pcc.getExport(timeline.GroupList.index).ClassName != "InterpData") { //? } else { timeline.GroupList.LoadInterpData(timeline.GroupList.index, Pcc as ME3Package); } updatedExports.Remove(timeline.GroupList.index); } if (updatedExports.Intersect(objects).Count() > 0) { RefreshCombo(); } else { foreach (var i in updatedExports) { if (Pcc.getExport(i).ClassName == "InterpData") { RefreshCombo(); break; } } } }
public void SaveFile(string filepath = null) { if (Pcc == null) { return; } if (CodexMapControl != null) { if (CodexMapView.TryFindCodexMap(Pcc, out ExportEntry export, out int _)) { using (var stream = new MemoryStream()) { var codexMap = CodexMapControl.ToCodexMap(); var binaryCodexMap = new BinaryBioCodexMap(codexMap.Sections, codexMap.Pages); binaryCodexMap.Save(stream); export.WriteBinary(stream.ToArray()); } } } if (QuestMapControl != null) { if (QuestMapControl.TryFindQuestMap(Pcc, out ExportEntry export, out int _)) { using (var stream = new MemoryStream()) { var questMap = QuestMapControl.ToQuestMap(); var binaryQuestMap = new BinaryBioQuestMap(questMap.Quests, questMap.BoolTaskEvals, questMap.IntTaskEvals, questMap.FloatTaskEvals); binaryQuestMap.Save(stream); export.WriteBinary(stream.ToArray()); } } } if (StateEventMapControl != null) { if (StateEventMapView.TryFindStateEventMap(Pcc, out ExportEntry export)) { using (var stream = new MemoryStream()) { var stateEventMap = StateEventMapControl.ToStateEventMap(); var binaryStateEventMap = new BinaryBioStateEventMap(stateEventMap.StateEvents); binaryStateEventMap.Save(stream); export.WriteBinary(stream.ToArray()); } } } if (ConsequenceMapControl != null) { if (StateEventMapView.TryFindStateEventMap(Pcc, out ExportEntry export, "ConsequenceMap")) { using (var stream = new MemoryStream()) { var consequenceMap = ConsequenceMapControl.ToStateEventMap(); var binaryConsequenceMap = new BinaryBioStateEventMap(consequenceMap.StateEvents); binaryConsequenceMap.Save(stream); export.WriteBinary(stream.ToArray()); } } } if (filepath == null) { filepath = Pcc.FilePath; } Pcc.Save(filepath); }
private void SavePackage() { Pcc.save(); }
public override void handleUpdate(List <PackageUpdate> updates) { IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import && x.change != PackageChange.ImportAdd && x.change != PackageChange.Names); List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList(); if (skm != null && updatedExports.Contains(skm.MyIndex)) { int index = skm.MyIndex; //loaded SkeletalMesh is no longer a SkeletalMesh if (Pcc.getExport(index).ClassName != "SkeletalMesh") { skm = null; preview?.Dispose(); preview = null; treeView1.Nodes.Clear(); RefreshMeshList(); } else { LoadSkeletalMesh(index); } updatedExports.Remove(index); } else if (stm != null && updatedExports.Contains(stm.index)) { int index = stm.index; //loaded SkeletalMesh is no longer a SkeletalMesh if (Pcc.getExport(index).ClassName != "StaticMesh") { stm = null; preview?.Dispose(); preview = null; treeView1.Nodes.Clear(); RefreshMeshList(); } else { LoadStaticMesh(index); } updatedExports.Remove(index); } if (updatedExports.Intersect(Materials).Count() > 0) { RefreshMaterialList(); } else { foreach (var i in updatedExports) { string className = Pcc.getExport(i).ClassName; if (className == "MaterialInstanceConstant" || className == "Material") { RefreshMaterialList(); break; } } } if (updatedExports.Intersect(Objects).Count() > 0) { RefreshMeshList(); } else { foreach (var i in updatedExports) { string className = Pcc.getExport(i).ClassName; if (className == "SkeletalMesh" || className == "StaticMesh") { RefreshMeshList(); break; } } } }