YTD and embedded texture editing in YtdForm, Fixed texture sorting by hash when importing XML

This commit is contained in:
dexy 2021-12-28 23:26:35 +11:00
parent a4998e36c8
commit 7f0bb17e68
6 changed files with 523 additions and 93 deletions

View File

@ -26,6 +26,7 @@ namespace CodeWalker.GameFiles
public void Load(byte[] data, RpfFileEntry entry)
{
Name = entry.Name;
RpfFileEntry = entry;
RpfResourceFileEntry resentry = entry as RpfResourceFileEntry;

View File

@ -99,7 +99,6 @@ namespace CodeWalker.GameFiles
public void ReadXml(XmlNode node, string ddsfolder)
{
var textures = new List<Texture>();
var texturehashes = new List<uint>();
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<Texture>();
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<Texture> textures)
{
textures.Sort((a, b) => a.NameHash.CompareTo(b.NameHash));
var texturehashes = new List<uint>();
foreach (var tex in textures)
{
texturehashes.Add(tex.NameHash);
}
TextureNameHashes = new ResourceSimpleList64_uint();
TextureNameHashes.data_items = texturehashes.ToArray();
Textures = new ResourcePointerList64<Texture>();
Textures.data_items = textures.ToArray();
BuildDict();
}
}
[TypeConverter(typeof(ExpandableObjectConverter))] public class TextureBase : ResourceSystemBlock

View File

@ -1608,7 +1608,7 @@ namespace CodeWalker
private void ViewYtd(string name, string path, byte[] data, RpfFileEntry e)
{
var ytd = RpfFile.GetFile<YtdFile>(e, data);
YtdForm f = new YtdForm();
YtdForm f = new YtdForm(this);
f.Show();
f.LoadYtd(ytd);
}

View File

@ -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;
}
}

View File

@ -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<Texture>();
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<Texture>();
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<Texture>();
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<Texture>();
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);
}
}
}

View File

@ -121,15 +121,14 @@
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="FileSaveAsMenu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<data name="FileSaveMenu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABUSURBVDhPY/j//z9FGEx8+/btPwn4PRAbMAABigFOTk5w
/OH9RzhGFgPRbW1tcEPIMgCEYYaQbQAIg/QQZQAyRlZDWwOIwaMGDEoDyMFwA8jH/xkAuAOq5KQIy40A
AAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
xAAADsQBlSsOGwAAAFRJREFUOE9j+P//P0UYTHz79u0/Cfg9EBswAAGKAU5OTnD84f1HOEYWA9FtbW1w
Q8gyAIRhhpBtAAiD9BBlADJGVkNbA4jBowYMSgPIwXADyMf/GQC4A6rkpAjLjQAAAABJRU5ErkJggg==
</value>
</data>
<data name="FileSaveAllMenu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<data name="FileSaveAllTexturesMenu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAAHZJREFUOE/tkLENwCAMBBkpMzCcF2IwgmTRJnpiSyhgQ5EyLx128VzhYKXWejlk
@ -161,15 +160,14 @@
K0QAIeQTi/cp4B9tCZE2c6oRhQAAAABJRU5ErkJggg==
</value>
</data>
<data name="ToolbarSaveAsMenu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<data name="ToolbarSaveMenu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABUSURBVDhPY/j//z9FGEx8+/btPwn4PRAbMAABigFOTk5w
/OH9RzhGFgPRbW1tcEPIMgCEYYaQbQAIg/QQZQAyRlZDWwOIwaMGDEoDyMFwA8jH/xkAuAOq5KQIy40A
AAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
xAAADsQBlSsOGwAAAFRJREFUOE9j+P//P0UYTHz79u0/Cfg9EBswAAGKAU5OTnD84f1HOEYWA9FtbW1w
Q8gyAIRhhpBtAAiD9BBlADJGVkNbA4jBowYMSgPIwXADyMf/GQC4A6rkpAjLjQAAAABJRU5ErkJggg==
</value>
</data>
<data name="ToolbarSaveAllMenu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<data name="ToolbarSaveAllTexturesMenu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAAHZJREFUOE/tkLENwCAMBBkpMzCcF2IwgmTRJnpiSyhgQ5EyLx128VzhYKXWejlk
@ -212,12 +210,18 @@
+6sAAAAASUVORK5CYII=
</value>
</data>
<metadata name="SaveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<metadata name="SaveDDSFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>358, 17</value>
</metadata>
<metadata name="FolderBrowserDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>489, 17</value>
</metadata>
<metadata name="OpenDDSFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>654, 17</value>
</metadata>
<metadata name="SaveYTDFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>813, 17</value>
</metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAICAAAAAAGACoDAAANgAAABAQAAAAABgAaAMAAN4MAABAQAAAAAAYACgyAABGEAAAKAAAACAA