public void UnloadLoadedWorldspaceProject() { _loadedWorldspaceProject = null; _selectedEntityFile = null; _selectedEntityLayer = EditorHelpers.EntityLayer.DefaultLayer; _renderer.OnSceneUnload(); UpdateProjectFolderTreeview(); UpdateEntityTreeview(); UpdateLayersView(); }
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. } }
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(); }
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++; } } } }
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<x> 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(); } } }