Exemple #1
0
 public void UnloadLoadedWorldspaceProject()
 {
     _loadedWorldspaceProject = null;
     _selectedEntityFile      = null;
     _selectedEntityLayer     = EditorHelpers.EntityLayer.DefaultLayer;
     _renderer.OnSceneUnload();
     UpdateProjectFolderTreeview();
     UpdateEntityTreeview();
     UpdateLayersView();
 }
Exemple #2
0
        private void ProjectTreeview_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (!(e.Node.Tag is WindWakerEntityData))
            {
                return;
            }

            if (SelectedEntityFileChanged != null)
            {
                var entData = (WindWakerEntityData)e.Node.Tag;
                _selectedEntityFile = entData;


                UpdateLayersView();                 //Updates the Entity view for us.
                SelectedEntityFileChanged(entData); //Broadcast event.
            }
        }
Exemple #3
0
        private void UpdateLayersView()
        {
            LayersListBox.SuspendLayout();
            LayersListBox.BeginUpdate();
            LayersListBox.Items.Clear();

            //Early out if the worldspace project is null (ie: We just unloaded the project)
            if (_loadedWorldspaceProject == null)
            {
                LayersListBox.EndUpdate();
                LayersListBox.ResumeLayout();

                return;
            }

            WindWakerEntityData entData = _selectedEntityFile;
            List <EditorHelpers.EntityLayer> validLayers = new List <EditorHelpers.EntityLayer>();

            foreach (var kvPair in entData.GetAllChunks())
            {
                foreach (WindWakerEntityData.BaseChunk chunk in kvPair.Value)
                {
                    if (validLayers.Contains(chunk.ChunkLayer))
                    {
                        continue;
                    }

                    validLayers.Add(chunk.ChunkLayer);
                }
            }

            for (int i = validLayers.Count - 1; i >= 0; i--)
            {
                LayersListBox.Items.Add(EditorHelpers.LayerIdToString(validLayers[i]));
            }

            //Select the Default layer by uh... default.
            if (LayersListBox.Items.Count > 0)
            {
                LayersListBox.SetSelected(LayersListBox.Items.Count - 1, true);
            }

            LayersListBox.ResumeLayout();
            LayersListBox.EndUpdate();
        }
Exemple #4
0
        private void PerformTestsForWorldspaceProject(WorldspaceProject project)
        {
            Console.WriteLine("Performing tests on {0}", project.Name);

            foreach (ZArchive archive in project.GetAllArchives())
            {
                WindWakerEntityData data = archive.GetFileByType <WindWakerEntityData>();
                if (data == null)
                {
                    continue;
                }

                foreach (List <WindWakerEntityData.BaseChunk> chunkList in data.GetAllChunks().Values)
                {
                    int chunkId = 0;
                    foreach (WindWakerEntityData.BaseChunk chunk in chunkList)
                    {
                        foreach (FieldInfo field in chunk.GetType().GetFields())
                        {
                            UnitTestValue attribute = (UnitTestValue)Attribute.GetCustomAttribute(field, typeof(UnitTestValue));
                            if (attribute != null)
                            {
                                object testValue   = field.GetValue(chunk);
                                object attribValue = attribute.Value;

                                bool bEquals = attribValue.Equals(testValue);
                                if (bEquals)
                                {
                                    continue;
                                }

                                //If they're not equals, we're going to want to print them to disk.
                                string failureText = string.Format("{0}|{1} #{2} failed. Field \"{5}\" Expected: {3} Got: {4}", project.Name, chunk.ChunkName, chunkId, attribValue, testValue, field.Name);
                                File.AppendAllText(_outputDir + "//results.txt", failureText + Environment.NewLine);
                            }
                        }

                        chunkId++;
                    }
                }
            }
        }
Exemple #5
0
        private void UpdateProjectFolderTreeview()
        {
            ProjectTreeview.BeginUpdate();
            ProjectTreeview.SuspendLayout();
            ProjectTreeview.Nodes.Clear();

            //Early out if the worldspace project is null (ie: We just unloaded the project)
            if (_loadedWorldspaceProject == null)
            {
                ProjectTreeview.EndUpdate();
                ProjectTreeview.ResumeLayout();
                return;
            }

            foreach (ZArchive archive in _loadedWorldspaceProject.GetAllArchives())
            {
                TreeNode arcRoot = ProjectTreeview.Nodes.Add(archive.Name, archive.Name);
                foreach (BaseArchiveFile archiveFile in archive.GetAllFiles())
                {
                    //Multiple files can share the same folder, so either find a node with the existing folder name or make a new one if it doesn't exist yet.
                    TreeNode folderNode = !arcRoot.Nodes.ContainsKey(archiveFile.FolderName) ? arcRoot.Nodes.Add(archiveFile.FolderName, archiveFile.FolderName) : arcRoot.Nodes.Find(archiveFile.FolderName, false)[0];

                    TreeNode fileName = folderNode.Nodes.Add(archiveFile.FileName);
                    fileName.Tag = archiveFile; //Store a reference to the archive file so we can get it later.

                    if (archiveFile is WindWakerEntityData && _selectedEntityFile == null)
                    {
                        _selectedEntityFile = (WindWakerEntityData)archiveFile;
                        UpdateLayersView(); //Updates the Entityview for us.

                        if (SelectedEntityFileChanged != null)
                        {
                            SelectedEntityFileChanged((WindWakerEntityData)archiveFile);
                        }
                    }
                }
            }

            ProjectTreeview.ResumeLayout();
            ProjectTreeview.EndUpdate();
        }
        /// <summary>
        /// Pass this a Room&lt;x&gt; folder or a Stage folder directory! This will look for specific subfolders
        /// (bdl, btk, dzb, dzr, dzs, dat, etc.) and load each file within them as appropriate.
        /// </summary>
        /// <param name="directory">Absolute file path to a folder containing a bdl/btk/etc. files(s)</param>
        public void LoadFromDirectory(string directory)
        {
            if (!Directory.Exists(directory))
            {
                new Exception("Invalid directory specified for WorldspaceProject.");
            }

            //Get all of the sub folders (bdl, btk, etc.)
            string[] subFolders = Directory.GetDirectories(directory);

            foreach (string folder in subFolders)
            {
                //Then grab all of the files that are inside this folder and we'll load each one.
                string[] subFiles = Directory.GetFiles(folder);

                foreach (string filePath in subFiles)
                {
                    BinaryReader    br = new BinaryReader(File.OpenRead(filePath));
                    BaseArchiveFile file;

                    byte[] fileData = br.ReadBytes((int)br.BaseStream.Length);
                    switch ((new DirectoryInfo(folder).Name).ToLower())
                    {
                    /* Map Collision Format */
                    case "dzb":
                        file = new StaticCollisionModel();
                        break;

                    /* Room and Stage Entity Data */
                    case "dzr":
                    case "dzs":
                        //Apparently Nintendo likes to mis-categorize files sometimes and put the wrong
                        //file format inside the wrong folder! We'll name-check dzr and dzs before loading
                        //them as they have fixed names (Room.*)
                        if (filePath.EndsWith(".dzr") || filePath.EndsWith(".dzs"))
                        {
                            file = new WindWakerEntityData();
                        }
                        else
                        {
                            file = new GenericArchiveData();
                        }
                        break;

                    /* 3D Model Formats */
                    case "bmd":
                    case "bdl":
                        file = new JStudioModel();
                        break;

                    case "tex":
                        file = new BinaryTextureImage();
                        break;

                    case "bck":
                    case "brk":
                    case "btk":
                    default:
                        Console.WriteLine("Unknown file extension {0} found ({1}). Creating GenericData holder for it!", Path.GetExtension(filePath), Path.GetFileName(filePath));
                        file = new GenericArchiveData();
                        break;
                    }

                    file.FileName      = Path.GetFileName(filePath);
                    file.FolderName    = new DirectoryInfo(folder).Name;
                    file.ParentArchive = this;
                    file.Load(fileData);

                    //Now that we've created the appropriate file (and hopefully mapped them all out!) we'll just stick
                    //it in our list of loaded files. They can later be gotten with the templated getter!
                    _archiveFiles.Add(file);
                    br.Close();
                }
            }
        }