From 7f0bb17e687b74c6b8bedc80d67beaca762b1318 Mon Sep 17 00:00:00 2001 From: dexy Date: Tue, 28 Dec 2021 23:26:35 +1100 Subject: [PATCH] YTD and embedded texture editing in YtdForm, Fixed texture sorting by hash when importing XML --- .../GameFiles/FileTypes/YtdFile.cs | 1 + .../GameFiles/Resources/Texture.cs | 25 +- CodeWalker/ExploreForm.cs | 2 +- CodeWalker/Forms/YtdForm.Designer.cs | 179 +++++++-- CodeWalker/Forms/YtdForm.cs | 379 ++++++++++++++++-- CodeWalker/Forms/YtdForm.resx | 30 +- 6 files changed, 523 insertions(+), 93 deletions(-) diff --git a/CodeWalker.Core/GameFiles/FileTypes/YtdFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YtdFile.cs index 632f835..74db0ef 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YtdFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YtdFile.cs @@ -26,6 +26,7 @@ namespace CodeWalker.GameFiles public void Load(byte[] data, RpfFileEntry entry) { Name = entry.Name; + RpfFileEntry = entry; RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; diff --git a/CodeWalker.Core/GameFiles/Resources/Texture.cs b/CodeWalker.Core/GameFiles/Resources/Texture.cs index 7b1d8bc..76faa84 100644 --- a/CodeWalker.Core/GameFiles/Resources/Texture.cs +++ b/CodeWalker.Core/GameFiles/Resources/Texture.cs @@ -99,7 +99,6 @@ namespace CodeWalker.GameFiles public void ReadXml(XmlNode node, string ddsfolder) { var textures = new List(); - var texturehashes = new List(); var inodes = node.SelectNodes("Item"); if (inodes != null) @@ -109,15 +108,10 @@ namespace CodeWalker.GameFiles var tex = new Texture(); tex.ReadXml(inode, ddsfolder); textures.Add(tex); - texturehashes.Add(tex.NameHash); } } - TextureNameHashes = new ResourceSimpleList64_uint(); - TextureNameHashes.data_items = texturehashes.ToArray(); - Textures = new ResourcePointerList64(); - Textures.data_items = textures.ToArray(); - BuildDict(); + BuildFromTextureList(textures); } public static void WriteXmlNode(TextureDictionary d, StringBuilder sb, int indent, string ddsfolder, string name = "TextureDictionary") { @@ -175,6 +169,23 @@ namespace CodeWalker.GameFiles Dict = dict; } + public void BuildFromTextureList(List textures) + { + textures.Sort((a, b) => a.NameHash.CompareTo(b.NameHash)); + + var texturehashes = new List(); + foreach (var tex in textures) + { + texturehashes.Add(tex.NameHash); + } + + TextureNameHashes = new ResourceSimpleList64_uint(); + TextureNameHashes.data_items = texturehashes.ToArray(); + Textures = new ResourcePointerList64(); + Textures.data_items = textures.ToArray(); + BuildDict(); + } + } [TypeConverter(typeof(ExpandableObjectConverter))] public class TextureBase : ResourceSystemBlock diff --git a/CodeWalker/ExploreForm.cs b/CodeWalker/ExploreForm.cs index 0083fe3..94259ef 100644 --- a/CodeWalker/ExploreForm.cs +++ b/CodeWalker/ExploreForm.cs @@ -1608,7 +1608,7 @@ namespace CodeWalker private void ViewYtd(string name, string path, byte[] data, RpfFileEntry e) { var ytd = RpfFile.GetFile(e, data); - YtdForm f = new YtdForm(); + YtdForm f = new YtdForm(this); f.Show(); f.LoadYtd(ytd); } diff --git a/CodeWalker/Forms/YtdForm.Designer.cs b/CodeWalker/Forms/YtdForm.Designer.cs index 737e01b..1bc0de0 100644 --- a/CodeWalker/Forms/YtdForm.Designer.cs +++ b/CodeWalker/Forms/YtdForm.Designer.cs @@ -31,16 +31,26 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(YtdForm)); this.menuStrip1 = new System.Windows.Forms.MenuStrip(); this.FileMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.FileSaveAllMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.FileSaveMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.FileSaveAsMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.FileSaveTextureAsMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.FileSaveAllTexturesMenu = new System.Windows.Forms.ToolStripMenuItem(); this.EditMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ViewMenu = new System.Windows.Forms.ToolStripMenuItem(); this.toolStrip1 = new System.Windows.Forms.ToolStrip(); this.NewButton = new System.Windows.Forms.ToolStripSplitButton(); this.OpenButton = new System.Windows.Forms.ToolStripSplitButton(); this.SaveButton = new System.Windows.Forms.ToolStripSplitButton(); + this.ToolbarSaveMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolbarSaveAsMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolbarSaveTextureAsMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolbarSaveAllTexturesMenu = new System.Windows.Forms.ToolStripMenuItem(); this.MainToolbar = new System.Windows.Forms.StatusStrip(); this.StatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.MainSplitContainer = new System.Windows.Forms.SplitContainer(); + this.ReplaceTextureButton = new System.Windows.Forms.Button(); + this.RemoveTextureButton = new System.Windows.Forms.Button(); + this.AddTextureButton = new System.Windows.Forms.Button(); this.TexturesListView = new System.Windows.Forms.ListView(); this.TextureNameColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.TextureSizeColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); @@ -58,11 +68,10 @@ this.label4 = new System.Windows.Forms.Label(); this.DetailsTabPage = new System.Windows.Forms.TabPage(); this.DetailsPropertyGrid = new CodeWalker.WinForms.PropertyGridFix(); - this.SaveFileDialog = new System.Windows.Forms.SaveFileDialog(); + this.SaveDDSFileDialog = new System.Windows.Forms.SaveFileDialog(); this.FolderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog(); - this.FileSaveAsMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSaveAsMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSaveAllMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.OpenDDSFileDialog = new System.Windows.Forms.OpenFileDialog(); + this.SaveYTDFileDialog = new System.Windows.Forms.SaveFileDialog(); this.menuStrip1.SuspendLayout(); this.toolStrip1.SuspendLayout(); this.MainToolbar.SuspendLayout(); @@ -93,21 +102,46 @@ // FileMenu // this.FileMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.FileSaveMenu, this.FileSaveAsMenu, - this.FileSaveAllMenu}); + this.FileSaveTextureAsMenu, + this.FileSaveAllTexturesMenu}); this.FileMenu.Name = "FileMenu"; this.FileMenu.Size = new System.Drawing.Size(37, 20); this.FileMenu.Text = "File"; // - // FileSaveAllMenu + // FileSaveMenu // - this.FileSaveAllMenu.Image = ((System.Drawing.Image)(resources.GetObject("FileSaveAllMenu.Image"))); - this.FileSaveAllMenu.Name = "FileSaveAllMenu"; - this.FileSaveAllMenu.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + this.FileSaveMenu.Image = ((System.Drawing.Image)(resources.GetObject("FileSaveMenu.Image"))); + this.FileSaveMenu.Name = "FileSaveMenu"; + this.FileSaveMenu.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.FileSaveMenu.Size = new System.Drawing.Size(242, 22); + this.FileSaveMenu.Text = "Save YTD"; + this.FileSaveMenu.Click += new System.EventHandler(this.FileSaveMenu_Click); + // + // FileSaveAsMenu + // + this.FileSaveAsMenu.Name = "FileSaveAsMenu"; + this.FileSaveAsMenu.Size = new System.Drawing.Size(242, 22); + this.FileSaveAsMenu.Text = "Save YTD As..."; + this.FileSaveAsMenu.Click += new System.EventHandler(this.FileSaveAsMenu_Click); + // + // FileSaveTextureAsMenu + // + this.FileSaveTextureAsMenu.Name = "FileSaveTextureAsMenu"; + this.FileSaveTextureAsMenu.Size = new System.Drawing.Size(242, 22); + this.FileSaveTextureAsMenu.Text = "Save Texture As..."; + this.FileSaveTextureAsMenu.Click += new System.EventHandler(this.FileSaveTextureAsMenu_Click); + // + // FileSaveAllTexturesMenu + // + this.FileSaveAllTexturesMenu.Image = ((System.Drawing.Image)(resources.GetObject("FileSaveAllTexturesMenu.Image"))); + this.FileSaveAllTexturesMenu.Name = "FileSaveAllTexturesMenu"; + this.FileSaveAllTexturesMenu.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S))); - this.FileSaveAllMenu.Size = new System.Drawing.Size(196, 22); - this.FileSaveAllMenu.Text = "Save All..."; - this.FileSaveAllMenu.Click += new System.EventHandler(this.FileSaveAllMenu_Click); + this.FileSaveAllTexturesMenu.Size = new System.Drawing.Size(242, 22); + this.FileSaveAllTexturesMenu.Text = "Save All Textures..."; + this.FileSaveAllTexturesMenu.Click += new System.EventHandler(this.FileSaveAllTexturesMenu_Click); // // EditMenu // @@ -159,8 +193,10 @@ // this.SaveButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.SaveButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ToolbarSaveMenu, this.ToolbarSaveAsMenu, - this.ToolbarSaveAllMenu}); + this.ToolbarSaveTextureAsMenu, + this.ToolbarSaveAllTexturesMenu}); this.SaveButton.Image = ((System.Drawing.Image)(resources.GetObject("SaveButton.Image"))); this.SaveButton.ImageTransparentColor = System.Drawing.Color.Magenta; this.SaveButton.Name = "SaveButton"; @@ -168,6 +204,36 @@ this.SaveButton.Text = "Save YTD..."; this.SaveButton.ButtonClick += new System.EventHandler(this.SaveButton_ButtonClick); // + // ToolbarSaveMenu + // + this.ToolbarSaveMenu.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSaveMenu.Image"))); + this.ToolbarSaveMenu.Name = "ToolbarSaveMenu"; + this.ToolbarSaveMenu.Size = new System.Drawing.Size(170, 22); + this.ToolbarSaveMenu.Text = "Save YTD"; + this.ToolbarSaveMenu.Click += new System.EventHandler(this.ToolbarSaveMenu_Click); + // + // ToolbarSaveAsMenu + // + this.ToolbarSaveAsMenu.Name = "ToolbarSaveAsMenu"; + this.ToolbarSaveAsMenu.Size = new System.Drawing.Size(170, 22); + this.ToolbarSaveAsMenu.Text = "Save YTD As..."; + this.ToolbarSaveAsMenu.Click += new System.EventHandler(this.ToolbarSaveAsMenu_Click); + // + // ToolbarSaveTextureAsMenu + // + this.ToolbarSaveTextureAsMenu.Name = "ToolbarSaveTextureAsMenu"; + this.ToolbarSaveTextureAsMenu.Size = new System.Drawing.Size(170, 22); + this.ToolbarSaveTextureAsMenu.Text = "Save Texture As..."; + this.ToolbarSaveTextureAsMenu.Click += new System.EventHandler(this.ToolbarSaveTextureAsMenu_Click); + // + // ToolbarSaveAllTexturesMenu + // + this.ToolbarSaveAllTexturesMenu.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSaveAllTexturesMenu.Image"))); + this.ToolbarSaveAllTexturesMenu.Name = "ToolbarSaveAllTexturesMenu"; + this.ToolbarSaveAllTexturesMenu.Size = new System.Drawing.Size(170, 22); + this.ToolbarSaveAllTexturesMenu.Text = "Save All Textures..."; + this.ToolbarSaveAllTexturesMenu.Click += new System.EventHandler(this.ToolbarSaveAllTexturesMenu_Click); + // // MainToolbar // this.MainToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -193,6 +259,9 @@ // // MainSplitContainer.Panel1 // + this.MainSplitContainer.Panel1.Controls.Add(this.ReplaceTextureButton); + this.MainSplitContainer.Panel1.Controls.Add(this.RemoveTextureButton); + this.MainSplitContainer.Panel1.Controls.Add(this.AddTextureButton); this.MainSplitContainer.Panel1.Controls.Add(this.TexturesListView); // // MainSplitContainer.Panel2 @@ -204,6 +273,41 @@ this.MainSplitContainer.SplitterDistance = 257; this.MainSplitContainer.TabIndex = 3; // + // ReplaceTextureButton + // + this.ReplaceTextureButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.ReplaceTextureButton.Enabled = false; + this.ReplaceTextureButton.Location = new System.Drawing.Point(170, 462); + this.ReplaceTextureButton.Name = "ReplaceTextureButton"; + this.ReplaceTextureButton.Size = new System.Drawing.Size(75, 23); + this.ReplaceTextureButton.TabIndex = 3; + this.ReplaceTextureButton.Text = "Replace..."; + this.ReplaceTextureButton.UseVisualStyleBackColor = true; + this.ReplaceTextureButton.Click += new System.EventHandler(this.ReplaceTextureButton_Click); + // + // RemoveTextureButton + // + this.RemoveTextureButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.RemoveTextureButton.Enabled = false; + this.RemoveTextureButton.Location = new System.Drawing.Point(89, 462); + this.RemoveTextureButton.Name = "RemoveTextureButton"; + this.RemoveTextureButton.Size = new System.Drawing.Size(75, 23); + this.RemoveTextureButton.TabIndex = 2; + this.RemoveTextureButton.Text = "Remove"; + this.RemoveTextureButton.UseVisualStyleBackColor = true; + this.RemoveTextureButton.Click += new System.EventHandler(this.RemoveTextureButton_Click); + // + // AddTextureButton + // + this.AddTextureButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.AddTextureButton.Location = new System.Drawing.Point(8, 462); + this.AddTextureButton.Name = "AddTextureButton"; + this.AddTextureButton.Size = new System.Drawing.Size(75, 23); + this.AddTextureButton.TabIndex = 1; + this.AddTextureButton.Text = "Add..."; + this.AddTextureButton.UseVisualStyleBackColor = true; + this.AddTextureButton.Click += new System.EventHandler(this.AddTextureButton_Click); + // // TexturesListView // this.TexturesListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -217,7 +321,7 @@ this.TexturesListView.Location = new System.Drawing.Point(3, 3); this.TexturesListView.Name = "TexturesListView"; this.TexturesListView.ShowItemToolTips = true; - this.TexturesListView.Size = new System.Drawing.Size(251, 483); + this.TexturesListView.Size = new System.Drawing.Size(251, 453); this.TexturesListView.TabIndex = 0; this.TexturesListView.UseCompatibleStateImageBehavior = false; this.TexturesListView.View = System.Windows.Forms.View.Details; @@ -250,6 +354,7 @@ this.SelTextureNameTextBox.Name = "SelTextureNameTextBox"; this.SelTextureNameTextBox.Size = new System.Drawing.Size(271, 20); this.SelTextureNameTextBox.TabIndex = 46; + this.SelTextureNameTextBox.TextChanged += new System.EventHandler(this.SelTextureNameTextBox_TextChanged); // // TextureTabControl // @@ -398,34 +503,17 @@ this.DetailsPropertyGrid.Size = new System.Drawing.Size(558, 445); this.DetailsPropertyGrid.TabIndex = 0; // - // SaveFileDialog + // SaveDDSFileDialog // - this.SaveFileDialog.Filter = "DDS files|*.dds|All files|*.*"; + this.SaveDDSFileDialog.Filter = "DDS files|*.dds|All files|*.*"; // - // FileSaveAsMenu + // OpenDDSFileDialog // - this.FileSaveAsMenu.Image = ((System.Drawing.Image)(resources.GetObject("FileSaveAsMenu.Image"))); - this.FileSaveAsMenu.Name = "FileSaveAsMenu"; - this.FileSaveAsMenu.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); - this.FileSaveAsMenu.Size = new System.Drawing.Size(196, 22); - this.FileSaveAsMenu.Text = "Save As..."; - this.FileSaveAsMenu.Click += new System.EventHandler(this.FileSaveAsMenu_Click); + this.OpenDDSFileDialog.Filter = "DDS files|*.dds|All files|*.*"; // - // ToolbarSaveAsMenu + // SaveYTDFileDialog // - this.ToolbarSaveAsMenu.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSaveAsMenu.Image"))); - this.ToolbarSaveAsMenu.Name = "ToolbarSaveAsMenu"; - this.ToolbarSaveAsMenu.Size = new System.Drawing.Size(152, 22); - this.ToolbarSaveAsMenu.Text = "Save as..."; - this.ToolbarSaveAsMenu.Click += new System.EventHandler(this.ToolbarSaveAsMenu_Click); - // - // ToolbarSaveAllMenu - // - this.ToolbarSaveAllMenu.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSaveAllMenu.Image"))); - this.ToolbarSaveAllMenu.Name = "ToolbarSaveAllMenu"; - this.ToolbarSaveAllMenu.Size = new System.Drawing.Size(152, 22); - this.ToolbarSaveAllMenu.Text = "Save All..."; - this.ToolbarSaveAllMenu.Click += new System.EventHandler(this.ToolbarSaveAllMenu_Click); + this.SaveYTDFileDialog.Filter = "YTD files|*.ytd|All files|*.*"; // // YtdForm // @@ -494,11 +582,20 @@ private System.Windows.Forms.Panel SelTexturePanel; private System.Windows.Forms.Label label1; private System.Windows.Forms.ComboBox SelTextureZoomCombo; - private System.Windows.Forms.ToolStripMenuItem FileSaveAllMenu; - private System.Windows.Forms.SaveFileDialog SaveFileDialog; + private System.Windows.Forms.ToolStripMenuItem FileSaveAllTexturesMenu; + private System.Windows.Forms.SaveFileDialog SaveDDSFileDialog; private System.Windows.Forms.FolderBrowserDialog FolderBrowserDialog; + private System.Windows.Forms.ToolStripMenuItem FileSaveMenu; + private System.Windows.Forms.ToolStripMenuItem ToolbarSaveMenu; + private System.Windows.Forms.ToolStripMenuItem ToolbarSaveAllTexturesMenu; + private System.Windows.Forms.Button ReplaceTextureButton; + private System.Windows.Forms.Button RemoveTextureButton; + private System.Windows.Forms.Button AddTextureButton; + private System.Windows.Forms.OpenFileDialog OpenDDSFileDialog; private System.Windows.Forms.ToolStripMenuItem FileSaveAsMenu; + private System.Windows.Forms.ToolStripMenuItem FileSaveTextureAsMenu; private System.Windows.Forms.ToolStripMenuItem ToolbarSaveAsMenu; - private System.Windows.Forms.ToolStripMenuItem ToolbarSaveAllMenu; + private System.Windows.Forms.ToolStripMenuItem ToolbarSaveTextureAsMenu; + private System.Windows.Forms.SaveFileDialog SaveYTDFileDialog; } } \ No newline at end of file diff --git a/CodeWalker/Forms/YtdForm.cs b/CodeWalker/Forms/YtdForm.cs index 70e269d..17c7cc4 100644 --- a/CodeWalker/Forms/YtdForm.cs +++ b/CodeWalker/Forms/YtdForm.cs @@ -17,15 +17,20 @@ namespace CodeWalker.Forms { public partial class YtdForm : Form { - private string fileName; + private string FileName; private YtdFile Ytd { get; set; } private TextureDictionary TexDict { get; set; } private Texture CurrentTexture = null; private float CurrentZoom = 0.0f; //1.0 = 100%, 0.0 = stretch + private bool Modified = false; + private ExploreForm ExploreForm = null; + private ModelForm ModelForm = null; - public YtdForm() + public YtdForm(ExploreForm exploreForm = null, ModelForm modelForm = null) { + ExploreForm = exploreForm; + ModelForm = modelForm; InitializeComponent(); } @@ -34,18 +39,18 @@ namespace CodeWalker.Forms { Ytd = ytd; - fileName = ytd?.Name; - if (string.IsNullOrEmpty(fileName)) + FileName = ytd?.Name; + if (string.IsNullOrEmpty(FileName)) { - fileName = ytd?.RpfFileEntry?.Name; + FileName = ytd?.RpfFileEntry?.Name; } - LoadTexDict(ytd.TextureDict, fileName); + LoadTexDict(ytd.TextureDict, FileName); } public void LoadTexDict(TextureDictionary texdict, string filename) { TexDict = texdict; - fileName = filename; + FileName = filename; TexturesListView.Items.Clear(); SelTexturePictureBox.Image = null; @@ -82,6 +87,7 @@ namespace CodeWalker.Forms UpdateFormTitle(); + UpdateSaveYTDAs(); } private string GetTexCountStr() @@ -92,11 +98,24 @@ namespace CodeWalker.Forms } + private void SelectTexture(Texture tex) + { + TexturesListView.SelectedItems.Clear(); + if (tex == null) return; + foreach (ListViewItem lvi in TexturesListView.Items) + { + if (lvi.Tag == tex) + { + lvi.Selected = true; + break; + } + } + } private void ShowTextureMip(Texture tex, int mip, bool mipchange) { CurrentTexture = tex; - UpdateSaveAs(); + UpdateSaveTextureAs(); if (tex == null) { @@ -107,10 +126,15 @@ namespace CodeWalker.Forms SelTextureMipTrackBar.Value = 0; SelTextureMipTrackBar.Maximum = 0; DetailsPropertyGrid.SelectedObject = null; + RemoveTextureButton.Enabled = false; + ReplaceTextureButton.Enabled = false; UpdateStatus(GetTexCountStr()); return; } + RemoveTextureButton.Enabled = true; + ReplaceTextureButton.Enabled = true; + if (mipchange) { @@ -169,10 +193,156 @@ namespace CodeWalker.Forms } + private void AddTexture() + { + if (TexDict.Textures?.data_items == null) return; + + var tex = OpenDDSFile(); + if (tex == null) return; + + var textures = new List(); + textures.AddRange(TexDict.Textures.data_items); + textures.Add(tex); + + TexDict.BuildFromTextureList(textures); + + Modified = true; + + LoadTexDict(TexDict, FileName); + + SelectTexture(tex); + + UpdateModelFormTextures(); + } + + private void RemoveTexture() + { + if (TexDict?.Textures?.data_items == null) return; + if (CurrentTexture == null) return; + + var textures = new List(); + foreach (var tex in TexDict.Textures.data_items) + { + if (tex != CurrentTexture) + { + textures.Add(tex); + } + } + + TexDict.BuildFromTextureList(textures); + + Modified = true; + + LoadTexDict(TexDict, FileName); + + SelectTexture(null); + + UpdateModelFormTextures(); + } + + private void ReplaceTexture() + { + if (TexDict?.Textures?.data_items == null) return; + if (CurrentTexture == null) return; + + var tex = OpenDDSFile(); + if (tex == null) return; + + tex.Name = CurrentTexture.Name; + tex.NameHash = CurrentTexture.NameHash; + + var textures = new List(); + foreach (var t in TexDict.Textures.data_items) + { + if (t != CurrentTexture) + { + textures.Add(t); + } + } + textures.Add(tex); + + TexDict.BuildFromTextureList(textures); + + Modified = true; + + LoadTexDict(TexDict, FileName); + + SelectTexture(tex); + + UpdateModelFormTextures(); + } + + private void RenameTexture(string name) + { + if (string.IsNullOrEmpty(name)) return; + if (TexDict?.Textures?.data_items == null) return; + if (CurrentTexture == null) return; + if (CurrentTexture.Name == name) return; + + var tex = CurrentTexture; + + tex.Name = name; + tex.NameHash = JenkHash.GenHash(name.ToLowerInvariant()); + + var textures = new List(); + textures.AddRange(TexDict.Textures.data_items); + + TexDict.BuildFromTextureList(textures); + + Modified = true; + + foreach (ListViewItem lvi in TexturesListView.Items) + { + if (lvi.Tag == tex) + { + lvi.Text = tex.Name; + lvi.ToolTipText = tex.Name; + break; + } + } + + UpdateFormTitle(); + UpdateSaveYTDAs(); + UpdateModelFormTextures(); + } + + + private Texture OpenDDSFile() + { + if (OpenDDSFileDialog.ShowDialog() != DialogResult.OK) return null; + + var fn = OpenDDSFileDialog.FileName; + + if (!File.Exists(fn)) return null; //couldn't find file? + + try + { + var dds = File.ReadAllBytes(fn); + var tex = DDSIO.GetTexture(dds); + tex.Name = Path.GetFileNameWithoutExtension(fn); + tex.NameHash = JenkHash.GenHash(tex.Name?.ToLowerInvariant()); + JenkIndex.Ensure(tex.Name?.ToLowerInvariant()); + return tex; + } + catch + { + MessageBox.Show("Unable to load " + fn + ".\nAre you sure it's a valid .dds file?"); + } + + return null; + } + + + private void UpdateModelFormTextures() + { + if (ModelForm == null) return; + + //TODO: live update of model form view when changes have been made... + } private void UpdateFormTitle() { - Text = fileName + " - Texture Dictionary - CodeWalker by dexyfex"; + Text = FileName + (Modified ? "*" : "") + " - Texture Dictionary - CodeWalker by dexyfex"; } private void UpdateStatus(string text) @@ -211,41 +381,141 @@ namespace CodeWalker.Forms + private void UpdateSaveYTDAs() + { + if (Ytd == null) + { + FileSaveMenu.Text = "Save YTD"; + FileSaveAsMenu.Text = "Save YTD As..."; + ToolbarSaveMenu.Text = "Save YTD"; + ToolbarSaveAsMenu.Text = "Save YTD As..."; + FileSaveMenu.Enabled = false; + FileSaveAsMenu.Enabled = false; + ToolbarSaveMenu.Enabled = false; + ToolbarSaveAsMenu.Enabled = false; + } + else + { + var cansave = (ExploreForm?.EditMode ?? false); + var s = "Save " + FileName; + var sas = "Save " + FileName + " As..."; + FileSaveMenu.Text = s; + FileSaveAsMenu.Text = sas; + ToolbarSaveMenu.Text = s; + ToolbarSaveAsMenu.Text = sas; + FileSaveMenu.Enabled = cansave; + FileSaveAsMenu.Enabled = true; + ToolbarSaveMenu.Enabled = cansave; + ToolbarSaveAsMenu.Enabled = true; + } + } - - private void UpdateSaveAs() + private void UpdateSaveTextureAs() { if (CurrentTexture == null) { - FileSaveAsMenu.Text = "Save As..."; - ToolbarSaveAsMenu.Text = "Save As..."; - FileSaveAsMenu.Enabled = false; - ToolbarSaveAsMenu.Enabled = false; + FileSaveTextureAsMenu.Text = "Save Texture As..."; + ToolbarSaveTextureAsMenu.Text = "Save Texture As..."; + FileSaveTextureAsMenu.Enabled = false; + ToolbarSaveTextureAsMenu.Enabled = false; } else { string fname = CurrentTexture.Name + ".dds"; string sas = "Save " + fname + " As..."; - FileSaveAsMenu.Text = sas; - ToolbarSaveAsMenu.Text = sas; - FileSaveAsMenu.Enabled = true; - ToolbarSaveAsMenu.Enabled = true; + FileSaveTextureAsMenu.Text = sas; + ToolbarSaveTextureAsMenu.Text = sas; + FileSaveTextureAsMenu.Enabled = true; + ToolbarSaveTextureAsMenu.Enabled = true; } } - private void SaveAs() + + private void SaveYTD(bool saveas = false) + { + if (Ytd == null) return; + if (!(ExploreForm?.EditMode ?? false)) + { + saveas = true; + } + + var isinrpf = false; + var rpfFileEntry = Ytd.RpfFileEntry; + if (rpfFileEntry == null) + { + saveas = true; + } + else + { + if (rpfFileEntry?.Parent != null) + { + if (!saveas) + { + isinrpf = true; + if (!rpfFileEntry.Path.ToLowerInvariant().StartsWith("mods")) + { + if (MessageBox.Show("This file is NOT located in the mods folder - Are you SURE you want to save this file?\r\nWARNING: This could cause permanent damage to your game!!!", "WARNING: Are you sure about this?", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + saveas = true;//that was a close one + isinrpf = false; + } + } + } + } + else if (!string.IsNullOrEmpty(rpfFileEntry?.Path)) + { + isinrpf = false; //saving direct to filesystem in RPF explorer... + } + else + { + saveas = true;//this probably shouldn't happen + } + } + + var data = Ytd.Save(); + + if (saveas) //save direct to filesystem in external location + { + SaveYTDFileDialog.FileName = FileName; + if (SaveYTDFileDialog.ShowDialog() != DialogResult.OK) return; + string fpath = SaveYTDFileDialog.FileName; + File.WriteAllBytes(fpath, data); + } + else if (!isinrpf) //save direct to filesystem in RPF explorer + { + File.WriteAllBytes(rpfFileEntry.Path, data); + ExploreForm?.RefreshMainListViewInvoke(); //update the file details in explorer... + } + else //save to RPF... + { + if (!(ExploreForm?.EnsureRpfValidEncryption(rpfFileEntry.File) ?? false)) + { + MessageBox.Show("Unable to save file, RPF encryption needs to be OPEN for this operation!"); + return; + } + + Ytd.RpfFileEntry = RpfFile.CreateFile(rpfFileEntry.Parent, rpfFileEntry.Name, data); + ExploreForm?.RefreshMainListViewInvoke(); //update the file details in explorer... + } + + Modified = false; + UpdateStatus("YTD file saved successfully at " + DateTime.Now.ToString()); + UpdateFormTitle(); + } + + private void SaveTextureAs() { if (CurrentTexture == null) return; string fname = CurrentTexture.Name + ".dds"; - SaveFileDialog.FileName = fname; - if (SaveFileDialog.ShowDialog() != DialogResult.OK) return; - string fpath = SaveFileDialog.FileName; + SaveDDSFileDialog.FileName = fname; + if (SaveDDSFileDialog.ShowDialog() != DialogResult.OK) return; + string fpath = SaveDDSFileDialog.FileName; byte[] dds = DDSIO.GetDDSFile(CurrentTexture); File.WriteAllBytes(fpath, dds); } - private void SaveAll() + private void SaveAllTextures() { if (TexDict?.Textures?.data_items == null) return; if (FolderBrowserDialog.ShowDialogNew() != DialogResult.OK) return; @@ -305,29 +575,76 @@ namespace CodeWalker.Forms UpdateZoom(); } - private void FileSaveAllMenu_Click(object sender, EventArgs e) + private void FileSaveMenu_Click(object sender, EventArgs e) { - SaveAll(); + SaveYTD(); } private void FileSaveAsMenu_Click(object sender, EventArgs e) { - SaveAs(); + SaveYTD(true); + } + + private void FileSaveTextureAsMenu_Click(object sender, EventArgs e) + { + SaveTextureAs(); + } + + private void FileSaveAllTexturesMenu_Click(object sender, EventArgs e) + { + SaveAllTextures(); } private void SaveButton_ButtonClick(object sender, EventArgs e) { - SaveAs(); + if (Ytd != null) + { + SaveYTD(); + } + else + { + SaveTextureAs(); + } + } + + private void ToolbarSaveMenu_Click(object sender, EventArgs e) + { + SaveYTD(); } private void ToolbarSaveAsMenu_Click(object sender, EventArgs e) { - SaveAs(); + SaveYTD(true); } - private void ToolbarSaveAllMenu_Click(object sender, EventArgs e) + private void ToolbarSaveTextureAsMenu_Click(object sender, EventArgs e) { - SaveAll(); + SaveTextureAs(); + } + + private void ToolbarSaveAllTexturesMenu_Click(object sender, EventArgs e) + { + SaveAllTextures(); + } + + private void AddTextureButton_Click(object sender, EventArgs e) + { + AddTexture(); + } + + private void RemoveTextureButton_Click(object sender, EventArgs e) + { + RemoveTexture(); + } + + private void ReplaceTextureButton_Click(object sender, EventArgs e) + { + ReplaceTexture(); + } + + private void SelTextureNameTextBox_TextChanged(object sender, EventArgs e) + { + RenameTexture(SelTextureNameTextBox.Text); } } } diff --git a/CodeWalker/Forms/YtdForm.resx b/CodeWalker/Forms/YtdForm.resx index 091414c..2b77b46 100644 --- a/CodeWalker/Forms/YtdForm.resx +++ b/CodeWalker/Forms/YtdForm.resx @@ -121,15 +121,14 @@ 17, 17 - + - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABUSURBVDhPY/j//z9FGEx8+/btPwn4PRAbMAABigFOTk5w - /OH9RzhGFgPRbW1tcEPIMgCEYYaQbQAIg/QQZQAyRlZDWwOIwaMGDEoDyMFwA8jH/xkAuAOq5KQIy40A - AAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAFRJREFUOE9j+P//P0UYTHz79u0/Cfg9EBswAAGKAU5OTnD84f1HOEYWA9FtbW1w + Q8gyAIRhhpBtAAiD9BBlADJGVkNbA4jBowYMSgPIwXADyMf/GQC4A6rkpAjLjQAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAHZJREFUOE/tkLENwCAMBBkpMzCcF2IwgmTRJnpiSyhgQ5EyLx128VzhYKXWejlk @@ -161,15 +160,14 @@ K0QAIeQTi/cp4B9tCZE2c6oRhQAAAABJRU5ErkJggg== - + - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABUSURBVDhPY/j//z9FGEx8+/btPwn4PRAbMAABigFOTk5w - /OH9RzhGFgPRbW1tcEPIMgCEYYaQbQAIg/QQZQAyRlZDWwOIwaMGDEoDyMFwA8jH/xkAuAOq5KQIy40A - AAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAFRJREFUOE9j+P//P0UYTHz79u0/Cfg9EBswAAGKAU5OTnD84f1HOEYWA9FtbW1w + Q8gyAIRhhpBtAAiD9BBlADJGVkNbA4jBowYMSgPIwXADyMf/GQC4A6rkpAjLjQAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAHZJREFUOE/tkLENwCAMBBkpMzCcF2IwgmTRJnpiSyhgQ5EyLx128VzhYKXWejlk @@ -212,12 +210,18 @@ +6sAAAAASUVORK5CYII= - + 358, 17 489, 17 + + 654, 17 + + + 813, 17 + AAABAAMAICAAAAAAGACoDAAANgAAABAQAAAAABgAaAMAAN4MAABAQAAAAAAYACgyAABGEAAAKAAAACAA