public void OnApplicationRequestOpenProject() { var ofd = new CommonOpenFileDialog(); ofd.Title = "Choose Directory"; ofd.IsFolderPicker = true; ofd.AddToMostRecentlyUsedList = false; ofd.AllowNonFileSystemItems = false; ofd.EnsureFileExists = true; ofd.EnsurePathExists = true; ofd.EnsureReadOnly = false; ofd.EnsureValidNames = true; ofd.Multiselect = false; ofd.ShowPlacesList = true; if (ofd.ShowDialog() == CommonFileDialogResult.Ok) { List <string> files = new List <string>(Directory.GetFiles(ofd.FileName)); // There were no files in the directory, so we'll assume the map is already extracted if (files.Count == 0) { // Just assume the folder paths are valid now. LoadProject(ofd.FileName, ofd.FileName); } // We'll have to dump the contents of the arcs else { string tempMapPath = Path.GetTempPath() + Path.GetFileName(ofd.FileName); // This is where we'll dump the arc contents to if (!Directory.Exists(tempMapPath)) { Directory.CreateDirectory(tempMapPath); } foreach (var arc in files) { VirtualFilesystemDirectory archiveRoot = ArchiveUtilities.LoadArchive(arc); string tempArcPath = $"{tempMapPath}\\{archiveRoot.Name}"; if (!Directory.Exists(tempArcPath)) { Directory.CreateDirectory(tempMapPath); } DumpContents(archiveRoot, tempArcPath); } LoadProject(tempMapPath, ofd.FileName); } } }
private void UpdateModel() { // Loads the necessary information about which figurine model to load dynamically from the REL and the DOL. m_actorMeshes = WResourceManager.LoadActorResource("Figurine Stand"); int modelFileID; int modelArcIndex; int figurineIndex = (int)WhichFigurine; string figurine_rel_path = Path.Combine(WSettingsManager.GetSettings().RootDirectoryPath, "files", "rels/d_a_obj_figure.rel"); MemoryStream figurine_rel_data = null; using (EndianBinaryReader reader = new EndianBinaryReader(File.ReadAllBytes(figurine_rel_path), Endian.Big)) { figurine_rel_data = Yaz0.Decode(reader); } using (EndianBinaryReader reader = new EndianBinaryReader(figurine_rel_data, Endian.Big)) { int l_figure_dat_entry_offset = l_figure_dat_tbl_offset + figurineIndex * 0xC; modelFileID = reader.ReadInt32At(l_figure_dat_entry_offset + 0x00); modelArcIndex = reader.ReadInt32At(l_figure_dat_entry_offset + 0x08); } if (modelArcIndex == -1) { string main_dol_path = Path.Combine(WSettingsManager.GetSettings().RootDirectoryPath, "sys", "main.dol"); using (FileStream strm = new FileStream(main_dol_path, FileMode.Open, FileAccess.Read)) { EndianBinaryReader reader = new EndianBinaryReader(strm, Endian.Big); long l_CharaData_entry_address = l_CharaData_address + figurineIndex * 0x12; long l_CharaData_entry_offset = DOL.AddressToOffset(l_CharaData_entry_address, reader); modelArcIndex = reader.ReadByteAt(l_CharaData_entry_offset + 0x10); } } var arc_name = l_arcname_tbl[modelArcIndex]; string arc_path = Path.Combine(WSettingsManager.GetSettings().RootDirectoryPath, "files", "res/Object/", arc_name + ".arc"); if (File.Exists(arc_path)) { VirtualFilesystemDirectory model_arc = ArchiveUtilities.LoadArchive(arc_path); if (model_arc.FindByID((ushort)modelFileID) != null) { var figurine_model = WResourceManager.LoadModelFromVFS(model_arc, fileID: (ushort)modelFileID); figurine_model.SetOffsetTranslation(new Vector3(0, 100, 0)); m_actorMeshes.Add(figurine_model); } } }
public IEnumerable <Category> Load(string fileName) { using (FileStream stream = new FileStream(fileName, FileMode.Open)) { VirtualFilesystemDirectory rootDir = ArchiveUtilities.LoadArchive(fileName); foreach (VirtualFilesystemNode node in rootDir.Children) { if (node.Name.Contains("dzb")) { return(GetDzbData((VirtualFilesystemDirectory)node)); } } } // If this is triggered, the archive the user opened wasn't a room archive and didn't have any DZBs in it return(null); }
private bool TryLoadMessageArchive() { string bmgres_path = Path.Combine(WSettingsManager.GetSettings().RootDirectoryPath, "files", "res", "Msg", "bmgres.arc"); if (!File.Exists(bmgres_path)) { return(false); } m_MessageArchive = ArchiveUtilities.LoadArchive(bmgres_path); VirtualFilesystemFile text_bank = m_MessageArchive.GetFileAtPath("zel_00.bmg"); using (MemoryStream strm = new MemoryStream(text_bank.Data)) { EndianBinaryReader reader = new EndianBinaryReader(strm, Endian.Big); LoadMessageData(reader); } return(true); }
public void OnApplicationRequestOpenProject() { var ofd = new CommonOpenFileDialog(); ofd.Title = "Choose Directory"; ofd.IsFolderPicker = true; ofd.AddToMostRecentlyUsedList = false; ofd.AllowNonFileSystemItems = false; ofd.EnsureFileExists = true; ofd.EnsurePathExists = true; ofd.EnsureReadOnly = false; ofd.EnsureValidNames = true; ofd.Multiselect = false; ofd.ShowPlacesList = true; if (ofd.ShowDialog() == CommonFileDialogResult.Ok) { List <string> files = new List <string>(Directory.GetFiles(ofd.FileName)); List <string> dirs = new List <string>(Directory.GetDirectories(ofd.FileName)); // There are directories here, so we will assume they are from already unpacked data. if (dirs.Count != 0) { // Just assume the folder paths are valid now. LoadProject(ofd.FileName, ofd.FileName); m_sourceDataPath = ofd.FileName; } // We'll have to dump the contents of the arcs else { string tempMapPath = Path.GetTempPath() + Path.GetFileName(ofd.FileName); // This is where we'll dump the arc contents to if (!Directory.Exists(tempMapPath)) { Directory.CreateDirectory(tempMapPath); } foreach (var arc in files) { VirtualFilesystemDirectory archiveRoot = ArchiveUtilities.LoadArchive(arc); if (archiveRoot == null) { continue; } string tempArcPath = $"{tempMapPath}\\{archiveRoot.Name}"; if (!Directory.Exists(tempArcPath)) { Directory.CreateDirectory(tempMapPath); } DumpContents(archiveRoot, tempArcPath); } LoadProject(tempMapPath, ofd.FileName); // This will signal that we loaded from archives, and that there is no valid path to save the map yet. MainWorld.Map.SavePath = null; m_sourceDataPath = tempMapPath; } } }
private void OnRequestImportIsland() { View.IslandImportWindow window = new View.IslandImportWindow(MainWorld.Map); window.FileSelector.IsFilePicker = true; window.FileSelector.FileExtension = "arc"; if (window.ShowDialog() == true) { if (window.FileName == "") { MessageBox.Show("No filename entered!", "Island Import Error"); return; } if (window.SceneNumber == -1) { MessageBox.Show("Invalid room number entered!", "Island Import Error"); return; } WRoom oldRoom = GetRoomFromDropdownIndex(window.SceneNumber); if (oldRoom != null) { MainWorld.Map.SceneList.Remove(oldRoom); } List <WCollisionMesh> colList = oldRoom.GetChildrenOfType <WCollisionMesh>(); if (colList.Count > 0) { colList[0].ReleaseResources(); } string tempMapPath = Path.Combine(GetStageDumpPath(), Path.GetFileName(window.FileName)); VirtualFilesystemDirectory archiveRoot = ArchiveUtilities.LoadArchive(window.FileName); if (archiveRoot == null) { MessageBox.Show("Invalid archive selected!", "Island Import Error"); return; } string tempArcPath = $"{tempMapPath}\\{archiveRoot.Name}"; if (!Directory.Exists(tempArcPath)) { Directory.CreateDirectory(tempMapPath); } DumpContents(archiveRoot, tempArcPath); WRoom newRoom = new WRoom(MainWorld, oldRoom.RoomIndex); newRoom.Load(tempArcPath); newRoom.RoomTransform = oldRoom.RoomTransform; newRoom.ApplyTransformToObjects(); newRoom.Name = "room" + oldRoom.RoomIndex; archiveRoot.Name = "room" + oldRoom.RoomIndex; newRoom.SourceDirectory = archiveRoot; MainWorld.Map.SceneList.Add(newRoom); } }
public void OnApplicationRequestOpenRooms() { var ofd = new CommonOpenFileDialog() { Title = "Choose Rooms to Open", AddToMostRecentlyUsedList = false, AllowNonFileSystemItems = false, EnsureFileExists = true, EnsurePathExists = true, EnsureReadOnly = false, EnsureValidNames = true, Multiselect = true, ShowPlacesList = true }; ofd.Filters.Add(new CommonFileDialogFilter("RARC Archives", ".arc")); ofd.Filters.Add(new CommonFileDialogFilter("All Files", ".*")); if (WSettingsManager.GetSettings().LastStagePath.FilePath != "") { ofd.InitialDirectory = WSettingsManager.GetSettings().LastStagePath.FilePath; } if (ofd.ShowDialog() == CommonFileDialogResult.Ok) { List <string> files = new List <string>(ofd.FileNames); string dirPath = Path.GetDirectoryName(files[0]); string stageArcPath = Path.Combine(dirPath, "Stage.arc"); if (!files.Contains(stageArcPath) && File.Exists(stageArcPath)) { // Always load the stage arc even if it wasn't selected by the user. files.Add(stageArcPath); } string tempMapPath = Path.Combine(GetStageDumpPath(), Path.GetFileName(dirPath)); // This is where we'll dump the arc contents to DeleteDumpContentsFromTempDir(); if (!Directory.Exists(GetStageDumpPath())) { Directory.CreateDirectory(GetStageDumpPath()); } if (!Directory.Exists(tempMapPath)) { Directory.CreateDirectory(tempMapPath); } foreach (var arc in files) { VirtualFilesystemDirectory archiveRoot = ArchiveUtilities.LoadArchive(arc); if (archiveRoot == null) { continue; } string tempArcPath = $"{tempMapPath}\\{archiveRoot.Name}"; if (!Directory.Exists(tempArcPath)) { Directory.CreateDirectory(tempMapPath); } DumpContents(archiveRoot, tempArcPath); } LoadProject(tempMapPath, dirPath); // This will signal that we loaded from archives, and that there is no valid path to save the map yet. MainWorld.Map.SavePath = null; m_sourceDataPath = tempMapPath; WSettingsManager.GetSettings().LastStagePath.FilePath = dirPath; WSettingsManager.SaveSettings(); } }
public void OnApplicationRequestOpenProject() { var ofd = new CommonOpenFileDialog() { Title = "Choose Directory", IsFolderPicker = true, AddToMostRecentlyUsedList = false, AllowNonFileSystemItems = false, EnsureFileExists = true, EnsurePathExists = true, EnsureReadOnly = false, EnsureValidNames = true, Multiselect = false, ShowPlacesList = true }; if (WSettingsManager.GetSettings().LastStagePath.FilePath != "") { ofd.InitialDirectory = WSettingsManager.GetSettings().LastStagePath.FilePath; } if (ofd.ShowDialog() == CommonFileDialogResult.Ok) { List <string> files = new List <string>(Directory.GetFiles(ofd.FileName)); List <string> dirs = new List <string>(Directory.GetDirectories(ofd.FileName)); // There are directories here, and one of them is an unpacked Stage folder, so try to load all of these instead of loading the .arcs. if (dirs.Count != 0 && File.Exists(Path.Combine(ofd.FileName, "Stage/dzs/stage.dzs"))) { LoadProject(ofd.FileName, ofd.FileName); m_sourceDataPath = ofd.FileName; } // We'll have to dump the contents of the arcs else { string tempMapPath = HandleTempPath(ofd.FileName); foreach (var arc in files) { var filename = Path.GetFileName(arc); Regex reg = new Regex(@"(Stage|Room\d+).arc", RegexOptions.Compiled | RegexOptions.IgnoreCase); if (!reg.IsMatch(filename)) { continue; } VirtualFilesystemDirectory archiveRoot = ArchiveUtilities.LoadArchive(arc); if (archiveRoot == null) { continue; } string tempArcPath = $"{tempMapPath}\\{archiveRoot.Name}"; if (!Directory.Exists(tempArcPath)) { Directory.CreateDirectory(tempMapPath); } DumpContents(archiveRoot, tempArcPath); } LoadProject(tempMapPath, ofd.FileName); // This will signal that we loaded from archives, and that there is no valid path to save the map yet. MainWorld.Map.SavePath = null; m_sourceDataPath = tempMapPath; WSettingsManager.GetSettings().LastStagePath.FilePath = ofd.FileName; WSettingsManager.SaveSettings(); } } }
private static J3D LoadModelFromResource(WActorResource.ModelResource res, string archive) { J3D j3d = null; if (string.IsNullOrEmpty(res.Path) || string.IsNullOrEmpty(archive)) { return(null); } string archivePath = Path.Combine(WSettingsManager.GetSettings().RootDirectoryPath, "files", "res/Object/", archive + ".arc"); if (!File.Exists(archivePath)) { return(null); } VirtualFilesystemDirectory model_arc = ArchiveUtilities.LoadArchive(archivePath); VirtualFilesystemFile archiveFile = model_arc.GetFileAtPath(res.Path); if (archiveFile == null) { Console.WriteLine("LoadActorByName failed because the specified path \"{0}\" does not exist in archive \"{1}\"!", res.Path, archive); return(null); } byte[] j3dData = archiveFile.Data; j3d = new J3D(archiveFile.Name); using (EndianBinaryReader reader = new EndianBinaryReader(j3dData, Endian.Big)) j3d.LoadFromStream(reader, WSettingsManager.GetSettings().DumpTextures, WSettingsManager.GetSettings().DumpShaders); if (res.Position != null) { j3d.SetOffsetTranslation((Vector3)res.Position); } if (res.Rotation != null) { j3d.SetOffsetRotation((Vector3)res.Rotation); } if (res.Scale != null) { j3d.SetOffsetScale((Vector3)res.Scale); } j3d.SetHardwareLight(0, m_mainLight); j3d.SetHardwareLight(1, m_secondaryLight); j3d.SetTextureOverride("ZBtoonEX", "resources/textures/ZBtoonEX.png"); j3d.SetTextureOverride("ZAtoon", "resources/textures/ZAtoon.png"); if (res.Animations == null) { res.Animations = new WActorResource.AnimationResource[0]; } foreach (var anim in res.Animations) { VirtualFilesystemDirectory anim_arc = model_arc; if (!string.IsNullOrEmpty(anim.ArchiveName)) { string anim_arc_path = Path.Combine(WSettingsManager.GetSettings().RootDirectoryPath, "files", "res/Object/", anim.ArchiveName + ".arc"); if (!File.Exists(anim_arc_path)) { return(null); } anim_arc = ArchiveUtilities.LoadArchive(anim_arc_path); } VirtualFilesystemFile anim_file = anim_arc.GetFileAtPath(anim.Path); if (anim_file == null) { continue; } byte[] anim_data = anim_file.Data; // Decompress the file if necessary if (anim_data[0] == 'Y') { MemoryStream decompressed_data = null; using (EndianBinaryReader decompressor = new EndianBinaryReader(anim_data, Endian.Big)) { decompressed_data = Yaz0.Decode(decompressor); } anim_data = decompressed_data.ToArray(); } switch (anim.Type) { case "bck": BCK loaded_bck = new BCK(anim_file.Name); using (EndianBinaryReader reader = new EndianBinaryReader(anim_data, Endian.Big)) loaded_bck.LoadFromStream(reader); j3d.BoneAnimations.Add(loaded_bck); j3d.SetBoneAnimation(anim_file.Name); loaded_bck.Tick(anim.StartTime); if (anim.PausedOnLoad) { loaded_bck.Pause(); } break; case "btk": BTK loaded_btk = new BTK(anim_file.Name); using (EndianBinaryReader reader = new EndianBinaryReader(anim_data, Endian.Big)) loaded_btk.LoadFromStream(reader); j3d.MaterialAnimations.Add(loaded_btk); j3d.SetMaterialAnimation(anim_file.Name); loaded_btk.Tick(anim.StartTime); if (anim.PausedOnLoad) { loaded_btk.Pause(); } break; case "brk": BRK loaded_brk = new BRK(anim_file.Name); using (EndianBinaryReader reader = new EndianBinaryReader(anim_data, Endian.Big)) loaded_brk.LoadFromStream(reader); j3d.RegisterAnimations.Add(loaded_brk); j3d.SetRegisterAnimation(anim_file.Name); loaded_brk.Tick(anim.StartTime); if (anim.PausedOnLoad) { loaded_brk.Pause(); } break; case "bmt": BMT loaded_bmt = new BMT(anim_file.Name); using (EndianBinaryReader reader = new EndianBinaryReader(anim_data, Endian.Big)) loaded_bmt.LoadFromStream(reader); j3d.ExternalMaterials.Add(loaded_bmt); j3d.SetExternalMaterial(anim_file.Name); if (loaded_bmt.MAT3 != null) { // a hack to get bmts working Material dummyMat = null; j3d.AssignVertexAttributesToMaterialsRecursive(j3d.INF1Tag.HierarchyRoot, ref dummyMat, loaded_bmt.MAT3); j3d.GenerateShadersForMaterials(loaded_bmt.MAT3); } break; default: break; } } j3d.Tick(1 / (float)60); if (res.ChildModels == null) { res.ChildModels = new WActorResource.ModelResource[0]; } foreach (var childRes in res.ChildModels) { var childJ3d = LoadModelFromResource(childRes, archive); j3d.AddChildModel(childJ3d, childRes.ParentJointName); } return(j3d); }
public static J3D LoadActorByName(string actorName) { // Stop to check if we've already loaded this model. var existRef = m_j3dList.Find(x => string.Compare(x.FilePath, actorName, StringComparison.InvariantCultureIgnoreCase) == 0); if (existRef != null) { existRef.ReferenceCount++; return(existRef.Asset); } if (actorName == null) { return(null); } // Check to see if we have an Actor Descriptor for this actor. if (!m_actorDescriptors.ContainsKey(actorName)) { return(null); } WActorDescriptor descriptor = m_actorDescriptors[actorName]; // Check to see that this actor descriptor specifies a model path. if (string.IsNullOrEmpty(descriptor.ModelPath) || string.IsNullOrEmpty(descriptor.ArchiveName)) { return(null); } string archivePath = Path.Combine(Properties.Settings.Default.RootDirectory, "res/Object/", descriptor.ArchiveName + ".arc"); // Check to see that the archive exists if (!File.Exists(archivePath)) { return(null); } // Finally, open the archive so we can look insdie of it to see if it exists. VirtualFilesystemDirectory archive = ArchiveUtilities.LoadArchive(archivePath); VirtualFilesystemFile archiveFile = archive.GetFileAtPath(descriptor.ModelPath); if (archiveFile == null) { Console.WriteLine("LoadActorByName failed because the specified path \"{0}\" does not exist in archive \"{1}\"!", descriptor.ModelPath, descriptor.ArchiveName); return(null); } // Now that we finally have the file, we can try to load a J3D from it. byte[] j3dData = archiveFile.Data; J3D j3d = new J3D(archiveFile.Name); using (EndianBinaryReader reader = new EndianBinaryReader(j3dData, Endian.Big)) j3d.LoadFromStream(reader, Properties.Settings.Default.DumpTexturesToDisk, Properties.Settings.Default.DumpShadersToDisk); j3d.SetHardwareLight(0, m_mainLight); j3d.SetHardwareLight(1, m_secondaryLight); // Apply patches for Wind Waker by default, since they don't seem to break anything else. j3d.SetTextureOverride("ZBtoonEX", "resources/textures/ZBtoonEX.png"); j3d.SetTextureOverride("ZAtoon", "resources/textures/ZAtoon.png"); j3d.SetColorWriteOverride("eyeLdamA", false); j3d.SetColorWriteOverride("eyeLdamB", false); j3d.SetColorWriteOverride("mayuLdamA", false); j3d.SetColorWriteOverride("mayuLdamB", false); j3d.SetColorWriteOverride("eyeRdamA", false); j3d.SetColorWriteOverride("eyeRdamB", false); j3d.SetColorWriteOverride("mayuRdamA", false); j3d.SetColorWriteOverride("mayuRdamB", false); existRef = new TSharedRef <J3D>(); existRef.FilePath = actorName; existRef.Asset = j3d; existRef.ReferenceCount++; m_j3dList.Add(existRef); return(j3d); }