1
0
mirror of synced 2024-11-30 18:24:39 +01:00

Add batch export option for all supported texture formats.

This commit is contained in:
KillzXGaming 2019-11-10 12:36:56 -05:00
parent c3e070d981
commit 616a2604c4
19 changed files with 165 additions and 53 deletions

View File

@ -116,9 +116,11 @@ namespace FirstPlugin
LoadBMD(BMDFile);
}
private class BMDTextureFolder : STTextureFolder, ITextureIconLoader
private class BMDTextureFolder : STTextureFolder, ITextureContainer
{
public List<STGenericTexture> IconTextureList
public bool DisplayIcons => true;
public List<STGenericTexture> TextureList
{
get
{

View File

@ -272,13 +272,15 @@ namespace FirstPlugin
}
}
public class TextureFolder : TreeNodeCustom, IContextMenuNode, ITextureIconLoader
public class TextureFolder : TreeNodeCustom, IContextMenuNode, ITextureContainer
{
public TextureFolder(string text)
{
Text = text;
}
public bool DisplayIcons => true;
public ToolStripItem[] GetContextMenuItems()
{
return new ToolStripItem[]
@ -287,7 +289,7 @@ namespace FirstPlugin
};
}
public List<STGenericTexture> IconTextureList
public List<STGenericTexture> TextureList
{
get
{

View File

@ -496,9 +496,11 @@ namespace FirstPlugin
}
}
private class TextureFolder : STTextureFolder, ITextureIconLoader
private class TextureFolder : STTextureFolder, ITextureContainer
{
public List<STGenericTexture> IconTextureList
public bool DisplayIcons => true;
public List<STGenericTexture> TextureList
{
get
{

View File

@ -11,7 +11,7 @@ using Toolbox.Library.Forms;
namespace FirstPlugin
{
public class CTXB : TreeNodeFile, IFileFormat, ITextureIconLoader
public class CTXB : TreeNodeFile, IFileFormat, ITextureContainer
{
public FileType FileType { get; set; } = FileType.Archive;
@ -39,7 +39,9 @@ namespace FirstPlugin
}
}
public List<STGenericTexture> IconTextureList
public bool DisplayIcons => true;
public List<STGenericTexture> TextureList
{
get
{

View File

@ -10,7 +10,7 @@ using System.Drawing;
namespace FirstPlugin
{
public class G1T : TreeNodeFile, IFileFormat, IContextMenuNode, ITextureIconLoader
public class G1T : TreeNodeFile, IFileFormat, IContextMenuNode, ITextureContainer
{
public FileType FileType { get; set; } = FileType.Image;
@ -38,8 +38,9 @@ namespace FirstPlugin
}
}
public bool DisplayIcons => true;
public List<STGenericTexture> IconTextureList
public List<STGenericTexture> TextureList
{
get
{

View File

@ -121,7 +121,7 @@ namespace LayoutBXLYT
{
TPL tpl = (TPL)file.OpenFile();
file.FileFormat = tpl;
foreach (var tex in tpl.IconTextureList)
foreach (var tex in tpl.TextureList)
{
//Only need the first texture
if (!textures.ContainsKey(tex.Text))

View File

@ -8,7 +8,7 @@ using System.Runtime.InteropServices;
namespace FirstPlugin.NLG
{
public class StrikersRLT : TreeNodeFile, IFileFormat, ITextureIconLoader
public class StrikersRLT : TreeNodeFile, IFileFormat, ITextureContainer
{
public FileType FileType { get; set; } = FileType.Image;
@ -37,7 +37,9 @@ namespace FirstPlugin.NLG
}
}
public List<STGenericTexture> IconTextureList
public bool DisplayIcons => true;
public List<STGenericTexture> TextureList
{
get
{

View File

@ -21,7 +21,7 @@ using FirstPlugin.Forms;
namespace FirstPlugin
{
public class BNTX : TreeNodeFile, IFileFormat, IContextMenuNode, ITextureIconLoader
public class BNTX : TreeNodeFile, IFileFormat, IContextMenuNode, ITextureContainer
{
public bool LoadIcons = false;
@ -58,7 +58,9 @@ namespace FirstPlugin
}
}
public List<STGenericTexture> IconTextureList
public bool DisplayIcons => LoadIcons;
public List<STGenericTexture> TextureList
{
get
{
@ -563,7 +565,7 @@ namespace FirstPlugin
public void LoadFile(Stream stream, string Name = "")
{
Textures = new Dictionary<string, TextureData>(StringComparer.InvariantCultureIgnoreCase);
IconTextureList = new List<STGenericTexture>();
TextureList = new List<STGenericTexture>();
BinaryTexFile = new BntxFile(stream);
Text = BinaryTexFile.Name;

View File

@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
namespace FirstPlugin
{
public class CTPK : TreeNodeFile, IFileFormat, ITextureIconLoader
public class CTPK : TreeNodeFile, IFileFormat, ITextureContainer
{
public FileType FileType { get; set; } = FileType.Layout;
@ -31,7 +31,9 @@ namespace FirstPlugin
}
}
public List<STGenericTexture> IconTextureList
public bool DisplayIcons => true;
public List<STGenericTexture> TextureList
{
get
{

View File

@ -11,7 +11,7 @@ using Toolbox.Library.IO;
namespace FirstPlugin
{
public class TPL : TreeNodeFile, IFileFormat, ITextureIconLoader
public class TPL : TreeNodeFile, IFileFormat, ITextureContainer
{
public FileType FileType { get; set; } = FileType.Image;
@ -40,7 +40,9 @@ namespace FirstPlugin
}
}
public List<STGenericTexture> IconTextureList
public bool DisplayIcons => true;
public List<STGenericTexture> TextureList
{
get
{

View File

@ -34,8 +34,7 @@ namespace Toolbox.Library
reader.ReadUInt16();
IsValid = magicNumber == 0x789C || magicNumber == 0x78DA;
if (IsValid)
{
if (IsValid) {
startPosition = reader.Position - 4;
break;
}

View File

@ -85,7 +85,7 @@ namespace Toolbox.Library
{
private readonly Dictionary<int, TreeNode> _treeNodes = new Dictionary<int, TreeNode>();
public List<ITextureIconLoader> TextureIcons = new List<ITextureIconLoader>();
public List<ITextureContainer> TextureIcons = new List<ITextureContainer>();
public List<ISingleTextureIconLoader> SingleTextureIcons = new List<ISingleTextureIconLoader>();
public TreeViewCustom()
@ -113,7 +113,10 @@ namespace Toolbox.Library
{
for (int i = 0; i < TextureIcons.Count; i++)
{
foreach (TreeNode node in TextureIcons[i].IconTextureList)
if (!TextureIcons[i].DisplayIcons)
continue;
foreach (TreeNode node in TextureIcons[i].TextureList)
{
if (node is STGenericTexture)
{
@ -268,8 +271,11 @@ namespace Toolbox.Library
Thread.Start();
}
public void ReloadTextureIcons(ITextureIconLoader textureIconList)
public void ReloadTextureIcons(ITextureContainer textureIconList)
{
if (!textureIconList.DisplayIcons)
return;
if (Thread != null && Thread.IsAlive)
Thread.Abort();
@ -280,7 +286,7 @@ namespace Toolbox.Library
List<TreeNode> treeNodes = new List<TreeNode>();
List<Image> imageIcons = new List<Image>();
foreach (TreeNode node in textureIconList.IconTextureList)
foreach (TreeNode node in textureIconList.TextureList)
{
if (node is STGenericTexture)
{

View File

@ -100,8 +100,8 @@ namespace Toolbox.Library.Forms
AddNode((TreeNode)FileFormat);
}
if (FileFormat is ITextureIconLoader) {
ObjectTree.LoadGenericTextureIcons((ITextureIconLoader)FileFormat);
if (FileFormat is ITextureContainer) {
ObjectTree.LoadGenericTextureIcons((ITextureContainer)FileFormat);
}
}

View File

@ -829,7 +829,7 @@ namespace Toolbox.Library.Forms
treeViewCustom1.ReloadTextureIcons(texIcons, false);
}
public void LoadGenericTextureIcons(ITextureIconLoader iconList) {
public void LoadGenericTextureIcons(ITextureContainer iconList) {
treeViewCustom1.TextureIcons.Add(iconList);
treeViewCustom1.ReloadTextureIcons(iconList);
}
@ -870,9 +870,9 @@ namespace Toolbox.Library.Forms
{
if (e.Node == null) return;
else if (e.Node is ITextureIconLoader) {
else if (e.Node is ITextureContainer) {
treeViewCustom1.BeginUpdate();
LoadGenericTextureIcons((ITextureIconLoader)e.Node);
LoadGenericTextureIcons((ITextureContainer)e.Node);
treeViewCustom1.EndUpdate();
}
else if (e.Node is ISingleTextureIconLoader) {

View File

@ -8,6 +8,8 @@ namespace Toolbox.Library
{
public interface ITextureContainer
{
Dictionary<string, STGenericTexture> Textures { get; set; }
List<STGenericTexture> TextureList { get; set; }
bool DisplayIcons { get; }
}
}

View File

@ -6,15 +6,6 @@ using System.Threading.Tasks;
namespace Toolbox.Library
{
/// <summary>
/// A texture list to display icons on a treeview
/// Note these will load and attach an icon when the parent treenode is expanded!
/// </summary>
public interface ITextureIconLoader
{
List<STGenericTexture> IconTextureList { get; set; }
}
/// <summary>
/// Reprenets a single texture that loads an icon.
/// These will check both on expand, and on root

View File

@ -337,12 +337,15 @@ namespace Toolbox.Library.Rendering
foreach (var container in TextureContainers)
{
if (container.Textures.ContainsKey(activeTex))
for (int i = 0; i < container.TextureList?.Count; i++)
{
BindGLTexture(tex, shader, container.Textures[activeTex]);
if (activeTex == container.TextureList[i].Text)
{
BindGLTexture(tex, shader, container.TextureList[i]);
return tex.textureUnit + 1;
}
}
}
return tex.textureUnit + 1;
}

View File

@ -44,6 +44,7 @@
this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.compressionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.batchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.hashCalculatorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.experimentalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.windowsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.cascadeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@ -72,7 +73,7 @@
this.stToolStrip1 = new Toolbox.Library.Forms.STToolStrip();
this.saveToolStripButton = new System.Windows.Forms.ToolStripButton();
this.updateToolstrip = new System.Windows.Forms.ToolStripButton();
this.hashCalculatorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.batchExportTexturesAllSupportedFormatsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip1.SuspendLayout();
this.stPanel1.SuspendLayout();
this.tabControlContextMenuStrip.SuspendLayout();
@ -185,7 +186,8 @@
this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.compressionToolStripMenuItem,
this.batchToolStripMenuItem,
this.hashCalculatorToolStripMenuItem});
this.hashCalculatorToolStripMenuItem,
this.batchExportTexturesAllSupportedFormatsToolStripMenuItem});
this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem";
this.toolsToolStripMenuItem.Size = new System.Drawing.Size(47, 21);
this.toolsToolStripMenuItem.Text = "Tools";
@ -193,16 +195,23 @@
// compressionToolStripMenuItem
//
this.compressionToolStripMenuItem.Name = "compressionToolStripMenuItem";
this.compressionToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.compressionToolStripMenuItem.Size = new System.Drawing.Size(315, 22);
this.compressionToolStripMenuItem.Text = "Compression";
//
// batchToolStripMenuItem
//
this.batchToolStripMenuItem.Name = "batchToolStripMenuItem";
this.batchToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.batchToolStripMenuItem.Size = new System.Drawing.Size(315, 22);
this.batchToolStripMenuItem.Text = "Batch Set File Table";
this.batchToolStripMenuItem.Click += new System.EventHandler(this.batchToolStripMenuItem_Click);
//
// hashCalculatorToolStripMenuItem
//
this.hashCalculatorToolStripMenuItem.Name = "hashCalculatorToolStripMenuItem";
this.hashCalculatorToolStripMenuItem.Size = new System.Drawing.Size(315, 22);
this.hashCalculatorToolStripMenuItem.Text = "Hash Calculator";
this.hashCalculatorToolStripMenuItem.Click += new System.EventHandler(this.hashCalculatorToolStripMenuItem_Click);
//
// experimentalToolStripMenuItem
//
this.experimentalToolStripMenuItem.Name = "experimentalToolStripMenuItem";
@ -465,12 +474,12 @@
this.updateToolstrip.ToolTipText = "Update Tool";
this.updateToolstrip.Click += new System.EventHandler(this.updateToolstrip_Click);
//
// hashCalculatorToolStripMenuItem
// batchExportTexturesAllSupportedFormatsToolStripMenuItem
//
this.hashCalculatorToolStripMenuItem.Name = "hashCalculatorToolStripMenuItem";
this.hashCalculatorToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.hashCalculatorToolStripMenuItem.Text = "Hash Calculator";
this.hashCalculatorToolStripMenuItem.Click += new System.EventHandler(this.hashCalculatorToolStripMenuItem_Click);
this.batchExportTexturesAllSupportedFormatsToolStripMenuItem.Name = "batchExportTexturesAllSupportedFormatsToolStripMenuItem";
this.batchExportTexturesAllSupportedFormatsToolStripMenuItem.Size = new System.Drawing.Size(315, 22);
this.batchExportTexturesAllSupportedFormatsToolStripMenuItem.Text = "Batch Export Textures (All Supported Formats)";
this.batchExportTexturesAllSupportedFormatsToolStripMenuItem.Click += new System.EventHandler(this.batchExportTexturesAllSupportedFormatsToolStripMenuItem_Click);
//
// MainForm
//
@ -552,5 +561,6 @@
private System.Windows.Forms.ToolStripMenuItem openFolderToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem batchToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem hashCalculatorToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem batchExportTexturesAllSupportedFormatsToolStripMenuItem;
}
}

View File

@ -1343,5 +1343,89 @@ namespace Toolbox
HashCalculatorForm form = new HashCalculatorForm();
form.Show(this);
}
private void batchExportTexturesAllSupportedFormatsToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Multiselect = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
FolderSelectDialog folderDlg = new FolderSelectDialog();
if (folderDlg.ShowDialog() == DialogResult.OK) {
BatchExportTextures(ofd.FileNames, folderDlg.SelectedPath);
}
}
}
private void BatchExportTextures(string[] files, string outputFolder)
{
List<string> Formats = new List<string>();
Formats.Add("Portable Graphics Network (.png)");
Formats.Add("Microsoft DDS (.dds)");
Formats.Add("Joint Photographic Experts Group (.jpg)");
Formats.Add("Bitmap Image (.bmp)");
Formats.Add("Tagged Image File Format (.tiff)");
Formats.Add("ASTC (.astc)");
List<string> failedFiles = new List<string>();
BatchFormatExport form = new BatchFormatExport(Formats);
if (form.ShowDialog() == DialogResult.OK)
{
string extension = form.GetSelectedExtension();
foreach (var file in files)
{
try
{
var fileFormat = STFileLoader.OpenFileFormat(file);
SearchFileFormat(fileFormat, extension, outputFolder);
}
catch
{
failedFiles.Add(file);
}
}
}
if (failedFiles.Count > 0)
{
string detailList = "";
foreach (var file in failedFiles)
detailList += $"{file}\n";
STErrorDialog.Show("Some files failed to export! See detail list of failed files.", "Switch Toolbox", detailList);
}
else
MessageBox.Show("Files batched successfully!");
}
private void SearchFileFormat(IFileFormat fileFormat, string extension, string outputFolder)
{
if (fileFormat == null) return;
if (fileFormat is STGenericTexture)
ExportTexture(((STGenericTexture)fileFormat), $"{outputFolder}/{fileFormat.FileName}.{extension}");
else if (fileFormat is IArchiveFile)
SearchArchive((IArchiveFile)fileFormat, extension, outputFolder);
else if (fileFormat is ITextureContainer)
{
foreach (STGenericTexture tex in ((ITextureContainer)fileFormat).TextureList) {
ExportTexture(tex, $"{outputFolder}/{tex.Text}.{extension}");
}
}
fileFormat.Unload();
}
private void ExportTexture(STGenericTexture tex, string filePath) {
tex.Export(filePath);
}
private void SearchArchive(IArchiveFile archiveFile, string extension, string outputFolder)
{
foreach (var file in archiveFile.Files)
SearchFileFormat(file.OpenFile(), extension, outputFolder);
}
}
}