void FixVMeshNodeNames(string file) { UTFFile utf = new UTFFile(); TreeNode root = utf.LoadUTFFile(file); foreach (TreeNode node in root.Nodes.Find("VMeshData", true)) { string new_name = System.IO.Path.GetFileNameWithoutExtension(file); new_name += "." + String.Format("{0:0000000000}", Utilities.FLModelCRC(Guid.NewGuid().ToString())); string old_name = node.Parent.Name; if (old_name.Contains("wire")) { new_name += ".wire."; } int lodstart = old_name.IndexOf(".lod"); if (lodstart > 0) { new_name += old_name.Substring(lodstart); } else { new_name += ".vms"; } node.Parent.Name = new_name; node.Parent.Text = new_name; NodeChanged(root, node.Parent, old_name); } utf.SaveUTFFile(root, file); }
/// <summary> /// Build the update package in the background. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ScanForNonUniqueMeshNodes(object sender, DoWorkEventArgs e) { matList.Clear(); nodelist.Clear(); string folderpath = (string)e.Argument; string[] files = System.IO.Directory.GetFiles(folderpath, "*.*", System.IO.SearchOption.AllDirectories); int max = files.Length; AddLog("Loading mats"); int curr = 0; foreach (string file in files) { if (bgScanMeshNodesWkr.CancellationPending) { return; } if ((++curr % 100) == 0) { AddLog(String.Format("\nProcessing {0}/{1}", curr, max)); } if (file.EndsWith(".mat")) { UTFFile utf = new UTFFile(); TreeNode root = utf.LoadUTFFile(file); LoadMaterials(file, root); } } AddLog("Loading cmp/3db"); curr = 0; foreach (string file in files) { if (file.EndsWith(".3db") || file.EndsWith(".cmp")) { try { List <string> files_with_duplicates = new List <string>(); UTFFile utf = new UTFFile(); TreeNode root = utf.LoadUTFFile(file); LoadMaterials(file, root); foreach (TreeNode node in root.Nodes.Find("VMeshData", true)) { VMeshNodeInfo info = new VMeshNodeInfo(); info.file = file; info.name = node.Parent.Name; info.crc = Utilities.FLModelCRC(info.name); if (nodelist.ContainsKey(info.crc)) { AddLog("\nError duplicate node name=" + info.name); AddLog(" file1=" + info.file); AddLog(" file2=" + nodelist[info.crc].file); if (!files_with_duplicates.Contains(info.file)) { files_with_duplicates.Add(info.file); } if (!files_with_duplicates.Contains(nodelist[info.crc].file)) { files_with_duplicates.Add(nodelist[info.crc].file); } } else { nodelist[info.crc] = info; } VMeshData meshData = new VMeshData(node.Tag as byte[]); foreach (VMeshData.TMeshHeader m in meshData.Meshes) { if (matList.ContainsKey(m.MaterialId)) { matList[m.MaterialId].usedBy[file] = node.Name; } else { AddLog(String.Format("\nError no material entry for name={0} materialID={1}", node.Parent.Parent.Name, m.MaterialId)); AddLog(" file1=" + file); } } } if (root.Nodes.Find("VMeshLibrary", true).Length > 0) { foreach (TreeNode node in root.Nodes.Find("VMeshRef", true)) { VMeshRef data = new VMeshRef(node.Tag as byte[]); if (FindVMeshName(root, data.VMeshLibId) == null) { AddLog("\nError no vmeshlibrary entry"); try { AddLog(" name=" + node.Parent.Parent.Parent.Parent.Name); } catch { } AddLog(" file1=" + file); if (scanOptions == "Open File On Error") { parent.LoadUTFFile(file); } } } foreach (TreeNode node in root.Nodes.Find("VWireData", true)) { VWireData data = new VWireData(node.Tag as byte[]); if (FindVMeshName(root, data.VMeshLibId) == null) { AddLog("\nError no vmeshlibrary entry for name=" + node.Parent.Parent.Name); AddLog(" file1=" + file); if (scanOptions == "Open File On Error") { OpenEdit(file); } } } } foreach (string file_to_fix in files_with_duplicates) { if (scanOptions == "Automatically Fix Errors") { FixVMeshNodeNames(file_to_fix); } else if (scanOptions == "Automatically Fix Errors") { DialogResult r = MessageBox.Show(String.Format("Rebuild VMeshData Node Names in {0}?", file_to_fix), "Rebuild?", MessageBoxButtons.YesNoCancel); if (r == DialogResult.Yes) { FixVMeshNodeNames(file_to_fix); } else if (r == DialogResult.Cancel) { AddLog("Cancelled"); return; } } else if (scanOptions == "Open File On Error") { parent.LoadUTFFile(file); } } } catch { AddLog("Error loading " + file); } } } foreach (MaterialInfo mi in matList.Values) { if (mi.errors.Count > 0 && mi.usedBy.Count > 1) { AddLog(String.Format("\nError for material={0} id={1} id2={2}", mi.matName, mi.matID, mi.matID2)); AddLog(String.Format("Material found in:")); foreach (string file in mi.refs.Keys) { AddLog(" " + file); } AddLog(String.Format("Errors:")); foreach (KeyValuePair <string, string> item in mi.errors) { AddLog(String.Format(" file={0} error={1}", item.Key, item.Value)); } AddLog(String.Format("Used By:")); foreach (KeyValuePair <string, string> item in mi.usedBy) { AddLog(String.Format(" model={0} mesh={1}", item.Key, item.Value)); } } } // Check for same textures, different names. Dictionary <uint, List <MaterialInfo> > textures = new Dictionary <uint, List <MaterialInfo> >(); foreach (MaterialInfo mi in matList.Values) { if (!textures.ContainsKey(mi.texCRC)) { textures[mi.texCRC] = new List <MaterialInfo>(); } textures[mi.texCRC].Add(mi); } foreach (List <MaterialInfo> ml in textures.Values) { if (ml.Count > 1) { AddLog(String.Format("Same texture/different name:")); foreach (MaterialInfo mi in ml) { AddLog(String.Format(" name={0} texture_file_name={1} matid={2}", mi.matName, mi.texFileName, mi.matID)); AddLog(String.Format(" Material found in:")); foreach (string file in mi.refs.Keys) { AddLog(" " + file); } } } } }