private void EditVMeshRef_Load(object sender, EventArgs e)
        {
            try
            {
                data = new VMeshRef(node.Tag as byte[]);
                textBoxHdrSize.Text      = String.Format("0x{0:X}", data.HeaderSize);
                textBoxVMeshLibId.Text   = String.Format("0x{0:X8}", data.VMeshLibId);
                textBoxVMeshLibName.Text = parent.FindVMeshName(data.VMeshLibId, false);
                textBoxStartMesh.Text    = data.StartMesh.ToString();
                textBoxNumMeshes.Text    = data.NumMeshes.ToString();

                textBoxStartVert.Text = data.StartVert.ToString();
                NumVert.Text          = data.NumVert.ToString();

                textBoxStartIndex.Text = data.StartIndex.ToString();
                textBoxNumIndices.Text = data.NumIndex.ToString();

                textBoxBBMaxX.Text  = data.BoundingBoxMaxX.ToString("g");
                textBoxBBMaxY.Text  = data.BoundingBoxMaxY.ToString("g");
                textBoxBBMaxZ.Text  = data.BoundingBoxMaxZ.ToString("g");
                textBoxBBMinX.Text  = data.BoundingBoxMinX.ToString("g");
                textBoxBBMinY.Text  = data.BoundingBoxMinY.ToString("g");
                textBoxBBMinZ.Text  = data.BoundingBoxMinZ.ToString("g");
                textBoxCenterX.Text = data.CenterX.ToString("g");
                textBoxCenterY.Text = data.CenterY.ToString("g");
                textBoxCenterZ.Text = data.CenterZ.ToString("g");
                textBoxRadius.Text  = data.Radius.ToString("g");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error " + ex.Message, "Error");
                Close();
                return;
            }
        }
示例#2
0
 /// <summary>
 /// Update all VMeshRef nodes with newVMeshLibId.
 /// </summary>
 /// <param name="crc"></param>
 /// <returns></returns>
 public void UpdateVMeshRefs(TreeNode[] nodes, uint newVMeshLibId)
 {
     foreach (TreeNode node in nodes)
     {
         VMeshRef data = new VMeshRef(node.Tag as byte[]);
         data.VMeshLibId = newVMeshLibId;
         node.Tag        = data.GetBytes();
     }
 }
示例#3
0
        /// <summary>
        /// Find all vmeshref nodes with the matching flmodelcrc.
        /// </summary>
        /// <param name="crc"></param>
        /// <returns></returns>
        public TreeNode[] FindVMeshRefs(TreeNode root, uint vMeshLibId)
        {
            List <TreeNode> nodes = new List <TreeNode>();

            try
            {
                foreach (TreeNode node in root.Nodes.Find("VMeshRef", true))
                {
                    try
                    {
                        VMeshRef data = new VMeshRef(node.Tag as byte[]);
                        if (data.VMeshLibId == vMeshLibId)
                        {
                            nodes.Add(node);
                        }
                    }
                    catch { }
                }
            }
            catch { }
            return(nodes.ToArray());
        }
示例#4
0
        /// <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);
                        }
                    }
                }
            }
        }