diff --git a/.vs/Switch_Toolbox/v15/.suo b/.vs/Switch_Toolbox/v15/.suo
index e75c138a..45151060 100644
Binary files a/.vs/Switch_Toolbox/v15/.suo and b/.vs/Switch_Toolbox/v15/.suo differ
diff --git a/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide b/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide
index 3fc4262f..804328ab 100644
Binary files a/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide and b/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide differ
diff --git a/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide-shm b/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide-shm
index 12e24cd9..08037e7c 100644
Binary files a/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide-shm and b/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide-shm differ
diff --git a/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide-wal b/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide-wal
index 722cfca4..bf7fbb59 100644
Binary files a/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide-wal and b/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide-wal differ
diff --git a/Switch_FileFormatsMain/GUI/TextureUI/Importers/BNTX/BinaryTextureImporterList.Designer.cs b/Switch_FileFormatsMain/GUI/TextureUI/Importers/BNTX/BinaryTextureImporterList.Designer.cs
index 09c967ae..4dc08aec 100644
--- a/Switch_FileFormatsMain/GUI/TextureUI/Importers/BNTX/BinaryTextureImporterList.Designer.cs
+++ b/Switch_FileFormatsMain/GUI/TextureUI/Importers/BNTX/BinaryTextureImporterList.Designer.cs
@@ -270,8 +270,10 @@
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1096, 560);
+ this.KeyPreview = true;
this.Text = "Texture Importer";
this.Load += new System.EventHandler(this.BinaryTextureImporterList_Load);
+ this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.BinaryTextureImporterList_KeyDown);
this.contentContainer.ResumeLayout(false);
this.contentContainer.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.SwizzleNum)).EndInit();
diff --git a/Switch_FileFormatsMain/GUI/TextureUI/Importers/BNTX/BinaryTextureImporterList.cs b/Switch_FileFormatsMain/GUI/TextureUI/Importers/BNTX/BinaryTextureImporterList.cs
index 254788ce..f790f16b 100644
--- a/Switch_FileFormatsMain/GUI/TextureUI/Importers/BNTX/BinaryTextureImporterList.cs
+++ b/Switch_FileFormatsMain/GUI/TextureUI/Importers/BNTX/BinaryTextureImporterList.cs
@@ -88,6 +88,8 @@ namespace FirstPlugin
ImgDimComb.SelectedIndex = 1;
tileModeCB.SelectedIndex = 0;
formatComboBox.SelectedItem = SurfaceFormat.BC1_SRGB;
+
+ button1.Select();
}
TextureImporterSettings SelectedTexSettings;
@@ -226,5 +228,18 @@ namespace FirstPlugin
else
SelectedTexSettings.MipCount = 1;
}
+
+ private void BinaryTextureImporterList_KeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.KeyCode == Keys.Enter)
+ {
+ if (button1.Enabled)
+ {
+ DialogResult = DialogResult.OK;
+ }
+ }
+
+
+ }
}
}
diff --git a/Switch_FileFormatsMain/GUI/TextureUI/Importers/BNTX/TextureImporterSettings.cs b/Switch_FileFormatsMain/GUI/TextureUI/Importers/BNTX/TextureImporterSettings.cs
index 1a9a7397..c1805261 100644
--- a/Switch_FileFormatsMain/GUI/TextureUI/Importers/BNTX/TextureImporterSettings.cs
+++ b/Switch_FileFormatsMain/GUI/TextureUI/Importers/BNTX/TextureImporterSettings.cs
@@ -23,7 +23,6 @@ namespace FirstPlugin
}
public string TexName;
- public uint arrayLength = 1;
public uint AccessFlags = 0x20;
public uint MipCount;
public uint Depth = 1;
@@ -68,16 +67,11 @@ namespace FirstPlugin
MipCount = dds.header.mipmapCount;
TexWidth = dds.header.width;
TexHeight = dds.header.height;
- arrayLength = 1;
- if (dds.header.caps2 == (uint)DDS.DDSCAPS2.CUBEMAP_ALLFACES)
- {
- arrayLength = 6;
- }
- foreach (var array in DDS.GetArrayFacesBytes(dds.bdata, (int)arrayLength))
- {
- DataBlockOutput.Add(array);
- }
+ var surfaces = DDS.GetArrayFaces(dds, dds.bdata, dds.ArrayCount);
+
+ foreach (var surface in surfaces)
+ DataBlockOutput.Add(Utils.CombineByteArray(surface.mipmaps.ToArray()));
Format = TextureData.GenericToBntxSurfaceFormat(dds.Format);
}
@@ -234,7 +228,6 @@ namespace FirstPlugin
tex.sparseBinding = settings.sparseBinding;
tex.sparseResidency = settings.sparseResidency;
tex.AccessFlags = settings.AccessFlags;
- tex.ArrayLength = settings.arrayLength;
tex.MipCount = settings.MipCount;
tex.Depth = settings.Depth;
tex.Dim = settings.Dim;
diff --git a/Switch_FileFormatsMain/Main.cs b/Switch_FileFormatsMain/Main.cs
index c7bf0d5f..bbb74844 100644
--- a/Switch_FileFormatsMain/Main.cs
+++ b/Switch_FileFormatsMain/Main.cs
@@ -136,7 +136,7 @@ namespace FirstPlugin
// Formats.Add(typeof(NCA));
// Formats.Add(typeof(XCI));
- // Formats.Add(typeof(NSP));
+ Formats.Add(typeof(NSP));
Formats.Add(typeof(BFSAR));
Formats.Add(typeof(BNSH));
Formats.Add(typeof(BFSHA));
diff --git a/Switch_FileFormatsMain/obj/Release/Switch_FileFormatsMain.csproj.GenerateResource.cache b/Switch_FileFormatsMain/obj/Release/Switch_FileFormatsMain.csproj.GenerateResource.cache
index d171b549..a4e42d87 100644
Binary files a/Switch_FileFormatsMain/obj/Release/Switch_FileFormatsMain.csproj.GenerateResource.cache and b/Switch_FileFormatsMain/obj/Release/Switch_FileFormatsMain.csproj.GenerateResource.cache differ
diff --git a/Switch_FileFormatsMain/obj/Release/Switch_FileFormatsMain.csprojAssemblyReference.cache b/Switch_FileFormatsMain/obj/Release/Switch_FileFormatsMain.csprojAssemblyReference.cache
index d6c7e076..20436a70 100644
Binary files a/Switch_FileFormatsMain/obj/Release/Switch_FileFormatsMain.csprojAssemblyReference.cache and b/Switch_FileFormatsMain/obj/Release/Switch_FileFormatsMain.csprojAssemblyReference.cache differ
diff --git a/Switch_Toolbox_Library/FileFormats/DDS.cs b/Switch_Toolbox_Library/FileFormats/DDS.cs
index 28e7cb0c..07ba85e6 100644
--- a/Switch_Toolbox_Library/FileFormats/DDS.cs
+++ b/Switch_Toolbox_Library/FileFormats/DDS.cs
@@ -490,6 +490,13 @@ namespace Switch_Toolbox.Library
header.caps4 = reader.ReadUInt32();
header.reserved2 = reader.ReadUInt32();
+ ArrayCount = 1;
+
+ if (header.caps2 == (uint)DDS.DDSCAPS2.CUBEMAP_ALLFACES)
+ {
+ ArrayCount = 6;
+ }
+
int DX10HeaderSize = 0;
if (header.ddspf.fourCC == FOURCC_DX10)
{
@@ -537,7 +544,6 @@ namespace Switch_Toolbox.Library
reader.Close();
- ArrayCount = 1;
MipCount = header.mipmapCount;
Width = header.width;
Height = header.height;
@@ -587,7 +593,7 @@ namespace Switch_Toolbox.Library
{
if (RedMask == R8G8B8_MASKS[0] && GreenMask == R8G8B8_MASKS[1] && BlueMask == R8G8B8_MASKS[2] && AlphaMask == R8G8B8_MASKS[3])
{
- return TEX_FORMAT.R8G8_B8G8_UNORM;
+ return TEX_FORMAT.R8G8B8A8_UNORM;
}
else
{
@@ -602,7 +608,7 @@ namespace Switch_Toolbox.Library
}
else if (RedMask == X8B8G8R8_MASKS[0] && GreenMask == X8B8G8R8_MASKS[1] && BlueMask == X8B8G8R8_MASKS[2] && AlphaMask == X8B8G8R8_MASKS[3])
{
- return TEX_FORMAT.R8G8_B8G8_UNORM;
+ return TEX_FORMAT.B8G8R8X8_UNORM;
}
else if (RedMask == A8R8G8B8_MASKS[0] && GreenMask == A8R8G8B8_MASKS[1] && BlueMask == A8R8G8B8_MASKS[2] && AlphaMask == A8R8G8B8_MASKS[3])
{
@@ -610,7 +616,7 @@ namespace Switch_Toolbox.Library
}
else if (RedMask == X8R8G8B8_MASKS[0] && GreenMask == X8R8G8B8_MASKS[1] && BlueMask == X8R8G8B8_MASKS[2] && AlphaMask == X8R8G8B8_MASKS[3])
{
- return TEX_FORMAT.R8G8_B8G8_UNORM;
+ return TEX_FORMAT.B8G8R8X8_UNORM;
}
else
{
@@ -628,6 +634,8 @@ namespace Switch_Toolbox.Library
DX10header.miscFlag = reader.ReadUInt32();
DX10header.arrayFlag = reader.ReadUInt32();
DX10header.miscFlags2 = reader.ReadUInt32();
+
+ ArrayCount = DX10header.arrayFlag;
}
public bool Swizzle = false;
@@ -636,7 +644,7 @@ namespace Switch_Toolbox.Library
if (Swizzle)
return TegraX1Swizzle.GetImageData(this, bdata, ArrayLevel, MipLevel);
- return GetArrayFaces(this, 1)[ArrayLevel].mipmaps[MipLevel];
+ return GetArrayFaces(this, ArrayCount)[ArrayLevel].mipmaps[MipLevel];
}
public override void SetImageData(Bitmap bitmap, int ArrayLevel)
@@ -818,13 +826,25 @@ namespace Switch_Toolbox.Library
return TEX_FORMAT.R8G8B8A8_UNORM;
}
}
- public void SetFlags(DXGI_FORMAT Format)
+ public void SetFlags(DXGI_FORMAT Format, bool UseDX10 = false)
{
header.flags = (uint)(DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PIXELFORMAT | DDSD.MIPMAPCOUNT | DDSD.LINEARSIZE);
header.caps = (uint)DDSCAPS.TEXTURE;
if (header.mipmapCount > 1)
header.caps |= (uint)(DDSCAPS.COMPLEX | DDSCAPS.MIPMAP);
+ if (UseDX10)
+ {
+ header.ddspf.flags = (uint)DDPF.FOURCC;
+ header.ddspf.fourCC = FOURCC_DX10;
+ if (DX10header == null)
+ DX10header = new DX10Header();
+
+ IsDX10 = true;
+ DX10header.DXGI_Format = Format;
+ return;
+ }
+
switch (Format)
{
case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM:
diff --git a/Switch_Toolbox_Library/Forms/Custom/STProgressBar.Designer.cs b/Switch_Toolbox_Library/Forms/Custom/STProgressBar.Designer.cs
index 833fae9d..22473930 100644
--- a/Switch_Toolbox_Library/Forms/Custom/STProgressBar.Designer.cs
+++ b/Switch_Toolbox_Library/Forms/Custom/STProgressBar.Designer.cs
@@ -42,24 +42,25 @@
//
// label1
//
- this.label1.AutoSize = true;
- this.label1.Location = new System.Drawing.Point(114, 9);
+ this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.label1.Location = new System.Drawing.Point(12, 9);
this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(79, 13);
+ this.label1.Size = new System.Drawing.Size(287, 13);
this.label1.TabIndex = 1;
this.label1.Text = "Loaidng File.....";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
- // ProgressBar
+ // STProgressBar
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(311, 82);
this.Controls.Add(this.label1);
this.Controls.Add(this.progressBar1);
- this.Name = "ProgressBar";
+ this.Name = "STProgressBar";
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.ProgressBar_FormClosed);
this.ResumeLayout(false);
- this.PerformLayout();
}
diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.Designer.cs
index 6d32a4dc..200fe2ef 100644
--- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.Designer.cs
+++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.Designer.cs
@@ -58,6 +58,11 @@
this.fillColorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.undoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.redoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.channelsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.replacRedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.replaceGreenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.replaceBlueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.replaceAlphaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.editInExternalProgramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -360,6 +365,7 @@
this.fillColorToolStripMenuItem,
this.undoToolStripMenuItem,
this.redoToolStripMenuItem,
+ this.channelsToolStripMenuItem,
this.editInExternalProgramToolStripMenuItem,
this.copyToolStripMenuItem});
this.editToolStripMenuItem.Name = "editToolStripMenuItem";
@@ -387,6 +393,45 @@
this.redoToolStripMenuItem.Text = "Redo";
this.redoToolStripMenuItem.Click += new System.EventHandler(this.redoToolStripMenuItem_Click);
//
+ // channelsToolStripMenuItem
+ //
+ this.channelsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.replacRedToolStripMenuItem,
+ this.replaceGreenToolStripMenuItem,
+ this.replaceBlueToolStripMenuItem,
+ this.replaceAlphaToolStripMenuItem});
+ this.channelsToolStripMenuItem.Name = "channelsToolStripMenuItem";
+ this.channelsToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
+ this.channelsToolStripMenuItem.Text = "Channels";
+ //
+ // replacRedToolStripMenuItem
+ //
+ this.replacRedToolStripMenuItem.Name = "replacRedToolStripMenuItem";
+ this.replacRedToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+ this.replacRedToolStripMenuItem.Text = "Replace Red";
+ this.replacRedToolStripMenuItem.Click += new System.EventHandler(this.replacRedToolStripMenuItem_Click);
+ //
+ // replaceGreenToolStripMenuItem
+ //
+ this.replaceGreenToolStripMenuItem.Name = "replaceGreenToolStripMenuItem";
+ this.replaceGreenToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+ this.replaceGreenToolStripMenuItem.Text = "Replace Green";
+ this.replaceGreenToolStripMenuItem.Click += new System.EventHandler(this.replaceGreenToolStripMenuItem_Click);
+ //
+ // replaceBlueToolStripMenuItem
+ //
+ this.replaceBlueToolStripMenuItem.Name = "replaceBlueToolStripMenuItem";
+ this.replaceBlueToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+ this.replaceBlueToolStripMenuItem.Text = "Replace Blue";
+ this.replaceBlueToolStripMenuItem.Click += new System.EventHandler(this.replaceBlueToolStripMenuItem_Click);
+ //
+ // replaceAlphaToolStripMenuItem
+ //
+ this.replaceAlphaToolStripMenuItem.Name = "replaceAlphaToolStripMenuItem";
+ this.replaceAlphaToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+ this.replaceAlphaToolStripMenuItem.Text = "Replace Alpha";
+ this.replaceAlphaToolStripMenuItem.Click += new System.EventHandler(this.replaceAlphaToolStripMenuItem_Click);
+ //
// editInExternalProgramToolStripMenuItem
//
this.editInExternalProgramToolStripMenuItem.Name = "editInExternalProgramToolStripMenuItem";
@@ -621,5 +666,10 @@
private STPanel stPanel5;
private STLabel bottomLabel;
private System.Windows.Forms.ToolStripMenuItem fillColorToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem channelsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem replacRedToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem replaceGreenToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem replaceBlueToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem replaceAlphaToolStripMenuItem;
}
}
\ No newline at end of file
diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.cs b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.cs
index 554478e2..2648ef12 100644
--- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.cs
+++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.cs
@@ -333,6 +333,8 @@ namespace Switch_Toolbox.Library.Forms
}
+ public Image BaseImage;
+
private void UpdatePictureBox(int ChannelIndex = 0)
{
if (ActiveTexture == null)
@@ -344,6 +346,9 @@ namespace Switch_Toolbox.Library.Forms
var image = ActiveTexture.GetBitmap(CurArrayDisplayLevel, CurMipDisplayLevel);
+ //Keep base image for channel viewer updating/editing
+ BaseImage = new Bitmap(image);
+
if (propertiesEditor.InvokeRequired)
{
propertiesEditor.Invoke(new MethodInvoker(
@@ -695,6 +700,7 @@ namespace Switch_Toolbox.Library.Forms
mipLevelCounterLabel.Text = $"Mip Level: {CurMipDisplayLevel} / {TotalMipCount}";
propertiesEditor.UpdateProperties();
+ propertiesEditor.LoadImage(new Bitmap(image), this);
HasBeenEdited = true;
}
@@ -758,6 +764,8 @@ namespace Switch_Toolbox.Library.Forms
}
}
+ public Image GetActiveImage() => pictureBoxCustom1.Image;
+
private void hueToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!IsFinished)
@@ -990,7 +998,7 @@ namespace Switch_Toolbox.Library.Forms
}
}
- private void SaveAndApplyImage(Bitmap image, bool DecodeBack)
+ public void SaveAndApplyImage(Bitmap image, bool DecodeBack)
{
if (saveBtn.InvokeRequired)
{
@@ -1220,5 +1228,21 @@ namespace Switch_Toolbox.Library.Forms
ApplyEdit(newImage);
}
}
+
+ private void replacRedToolStripMenuItem_Click(object sender, EventArgs e) {
+ propertiesEditor.EditChannel(STChannelType.Red);
+ }
+
+ private void replaceGreenToolStripMenuItem_Click(object sender, EventArgs e) {
+ propertiesEditor.EditChannel(STChannelType.Green);
+ }
+
+ private void replaceBlueToolStripMenuItem_Click(object sender, EventArgs e) {
+ propertiesEditor.EditChannel(STChannelType.Blue);
+ }
+
+ private void replaceAlphaToolStripMenuItem_Click(object sender, EventArgs e) {
+ propertiesEditor.EditChannel(STChannelType.Alpha);
+ }
}
}
diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.resx b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.resx
index 0c3dc06a..0fe51b03 100644
--- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.resx
+++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.resx
@@ -117,6 +117,12 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 17, 17
+
+
+ 351, 17
+
184, 17
@@ -172,9 +178,6 @@
gg==
-
- 351, 17
-
iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6
@@ -736,9 +739,6 @@
cL+T0fIXUvho1xJo195FiqmQ0PIqcY9VOy9ppv/4j/8PQJ1wavHnTdQAAAAASUVORK5CYII=
-
- 17, 17
-
108
diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImagePropertiesEditor.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImagePropertiesEditor.Designer.cs
index e0d7d5f5..56a506f9 100644
--- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImagePropertiesEditor.Designer.cs
+++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImagePropertiesEditor.Designer.cs
@@ -28,15 +28,19 @@
///
private void InitializeComponent()
{
+ this.components = new System.ComponentModel.Container();
this.channelListView = new Switch_Toolbox.Library.Forms.ListViewCustom();
this.ChannelsColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.stTabControl1 = new Switch_Toolbox.Library.Forms.STTabControl();
- this.tabPage1 = new System.Windows.Forms.TabPage();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.stPropertyGrid1 = new Switch_Toolbox.Library.Forms.STPropertyGrid();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.stChannelToolstripMenu = new Switch_Toolbox.Library.Forms.STContextMenuStrip(this.components);
+ this.replaceChannelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.stTabControl1.SuspendLayout();
- this.tabPage1.SuspendLayout();
this.tabPage2.SuspendLayout();
+ this.tabPage1.SuspendLayout();
+ this.stChannelToolstripMenu.SuspendLayout();
this.SuspendLayout();
//
// channelListView
@@ -53,6 +57,7 @@
this.channelListView.UseCompatibleStateImageBehavior = false;
this.channelListView.View = System.Windows.Forms.View.Details;
this.channelListView.SelectedIndexChanged += new System.EventHandler(this.channelListView_SelectedIndexChanged);
+ this.channelListView.MouseClick += new System.Windows.Forms.MouseEventHandler(this.channelListView_MouseClick);
//
// ChannelsColumn
//
@@ -71,17 +76,6 @@
this.stTabControl1.Size = new System.Drawing.Size(233, 543);
this.stTabControl1.TabIndex = 1;
//
- // tabPage1
- //
- this.tabPage1.Controls.Add(this.channelListView);
- this.tabPage1.Location = new System.Drawing.Point(4, 25);
- this.tabPage1.Name = "tabPage1";
- this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
- this.tabPage1.Size = new System.Drawing.Size(225, 514);
- this.tabPage1.TabIndex = 0;
- this.tabPage1.Text = "Channels";
- this.tabPage1.UseVisualStyleBackColor = true;
- //
// tabPage2
//
this.tabPage2.Controls.Add(this.stPropertyGrid1);
@@ -100,9 +94,35 @@
this.stPropertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
this.stPropertyGrid1.Location = new System.Drawing.Point(3, 3);
this.stPropertyGrid1.Name = "stPropertyGrid1";
+ this.stPropertyGrid1.ShowHintDisplay = true;
this.stPropertyGrid1.Size = new System.Drawing.Size(219, 508);
this.stPropertyGrid1.TabIndex = 0;
//
+ // tabPage1
+ //
+ this.tabPage1.Controls.Add(this.channelListView);
+ this.tabPage1.Location = new System.Drawing.Point(4, 25);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage1.Size = new System.Drawing.Size(225, 514);
+ this.tabPage1.TabIndex = 0;
+ this.tabPage1.Text = "Channels";
+ this.tabPage1.UseVisualStyleBackColor = true;
+ //
+ // stChannelToolstripMenu
+ //
+ this.stChannelToolstripMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.replaceChannelToolStripMenuItem});
+ this.stChannelToolstripMenu.Name = "stChannelToolstripMenu";
+ this.stChannelToolstripMenu.Size = new System.Drawing.Size(181, 48);
+ //
+ // replaceChannelToolStripMenuItem
+ //
+ this.replaceChannelToolStripMenuItem.Name = "replaceChannelToolStripMenuItem";
+ this.replaceChannelToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+ this.replaceChannelToolStripMenuItem.Text = "Replace Channel";
+ this.replaceChannelToolStripMenuItem.Click += new System.EventHandler(this.replaceChannelToolStripMenuItem_Click);
+ //
// ImagePropertiesEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -111,8 +131,9 @@
this.Name = "ImagePropertiesEditor";
this.Size = new System.Drawing.Size(233, 543);
this.stTabControl1.ResumeLayout(false);
- this.tabPage1.ResumeLayout(false);
this.tabPage2.ResumeLayout(false);
+ this.tabPage1.ResumeLayout(false);
+ this.stChannelToolstripMenu.ResumeLayout(false);
this.ResumeLayout(false);
}
@@ -125,5 +146,7 @@
private System.Windows.Forms.TabPage tabPage2;
private System.Windows.Forms.ColumnHeader ChannelsColumn;
private STPropertyGrid stPropertyGrid1;
+ private STContextMenuStrip stChannelToolstripMenu;
+ private System.Windows.Forms.ToolStripMenuItem replaceChannelToolStripMenuItem;
}
}
\ No newline at end of file
diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImagePropertiesEditor.cs b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImagePropertiesEditor.cs
index 01ce2218..766376a2 100644
--- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImagePropertiesEditor.cs
+++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImagePropertiesEditor.cs
@@ -222,6 +222,21 @@ namespace Switch_Toolbox.Library.Forms
}
+ public void EditChannel(STChannelType ChannelType)
+ {
+ var Image = imageEditor.BaseImage;
+ if (Image != null)
+ {
+ OpenFileDialog ofd = new OpenFileDialog();
+ if (ofd.ShowDialog() == DialogResult.OK)
+ {
+ Bitmap ChannelDest = new Bitmap(ofd.FileName);
+ Bitmap newImage = BitmapExtension.ReplaceChannel(Image, ChannelDest, ChannelType);
+ imageEditor.SaveAndApplyImage(newImage, true);
+ }
+ }
+ }
+
private void tabPage2_Click(object sender, EventArgs e)
{
@@ -234,5 +249,42 @@ namespace Switch_Toolbox.Library.Forms
imageEditor.UpdateMipDisplay();
}
}
+
+ private void channelListView_MouseClick(object sender, MouseEventArgs e)
+ {
+ if (channelListView.SelectedItems.Count <= 0)
+ return;
+
+ switch (e.Button)
+ {
+ case MouseButtons.Right:
+ {
+ Point p = new Point(e.X, e.Y);
+ stChannelToolstripMenu.Show(channelListView, p);
+ }
+ break;
+ }
+ }
+
+ private void replaceChannelToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ //Note first index (0) is RGBA display
+ int ChannelIndex = channelListView.SelectedIndices[0];
+ switch (ChannelIndex)
+ {
+ case 1:
+ EditChannel(STChannelType.Red);
+ break;
+ case 2:
+ EditChannel(STChannelType.Green);
+ break;
+ case 3:
+ EditChannel(STChannelType.Blue);
+ break;
+ case 4:
+ EditChannel(STChannelType.Alpha);
+ break;
+ }
+ }
}
}
diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImagePropertiesEditor.resx b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImagePropertiesEditor.resx
index 1af7de15..6a548fc4 100644
--- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImagePropertiesEditor.resx
+++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImagePropertiesEditor.resx
@@ -117,4 +117,7 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 17, 17
+
\ No newline at end of file
diff --git a/Switch_Toolbox_Library/Generics/GenericTexture.cs b/Switch_Toolbox_Library/Generics/GenericTexture.cs
index b1dbfbfe..24f4e756 100644
--- a/Switch_Toolbox_Library/Generics/GenericTexture.cs
+++ b/Switch_Toolbox_Library/Generics/GenericTexture.cs
@@ -192,7 +192,10 @@ namespace Switch_Toolbox.Library
{ TEX_FORMAT.R8G8B8A8_UNORM, new FormatInfo(4, 1, 1, 1, TargetBuffer.Color) },
{ TEX_FORMAT.R8G8B8A8_UNORM_SRGB, new FormatInfo(4, 1, 1, 1, TargetBuffer.Color) },
{ TEX_FORMAT.R32G8X24_FLOAT, new FormatInfo(4, 1, 1, 1, TargetBuffer.Color) },
-
+ { TEX_FORMAT.R8G8_B8G8_UNORM, new FormatInfo(4, 1, 1, 1, TargetBuffer.Color) },
+ { TEX_FORMAT.B8G8R8X8_UNORM, new FormatInfo(4, 1, 1, 1, TargetBuffer.Color) },
+ { TEX_FORMAT.B5G5R5A1_UNORM, new FormatInfo(2, 1, 1, 1, TargetBuffer.Color) },
+
{ TEX_FORMAT.R10G10B10A2_UINT, new FormatInfo(4, 1, 1, 1, TargetBuffer.Color) },
{ TEX_FORMAT.R10G10B10A2_UNORM, new FormatInfo(4, 1, 1, 1, TargetBuffer.Color) },
{ TEX_FORMAT.R32_SINT, new FormatInfo(4, 1, 1, 1, TargetBuffer.Color) },
@@ -615,9 +618,54 @@ namespace Switch_Toolbox.Library
}
public void SaveBitMap(string FileName, int SurfaceLevel = 0, int MipLevel = 0)
{
+ STProgressBar progressBar = new STProgressBar();
+ progressBar.Task = "Exporting Image Data...";
+ progressBar.Value = 0;
+ progressBar.StartPosition = FormStartPosition.CenterScreen;
+ progressBar.Show();
+ progressBar.Refresh();
+
+ if (ArrayCount > 1)
+ {
+ progressBar.Task = "Select dialog option... ";
+
+ var result = MessageBox.Show("Multiple image surfaces found! Would you like to export them all?", "Image Exporter",
+ MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
+ if (result == DialogResult.Yes)
+ {
+ string ext = Path.GetExtension(FileName);
+
+ int index = FileName.LastIndexOf('.');
+ string name = index == -1 ? FileName : FileName.Substring(0, index);
+
+ for (int i = 0; i < ArrayCount; i++)
+ {
+ progressBar.Task = $"Decoding Surface [{i}] for image {Text}... ";
+ progressBar.Value = (i * 100) / (int)ArrayCount;
+ progressBar.Refresh();
+
+ Bitmap arrayBitMap = GetBitmap(i, 0);
+ arrayBitMap.Save($"{name}_Slice_{i}_{ext}");
+ arrayBitMap.Dispose();
+ }
+
+ progressBar.Value = 100;
+ progressBar.Close();
+
+ return;
+ }
+ }
+
+ progressBar.Task = $"Decoding image {Text}... ";
+ progressBar.Value = 20;
+ progressBar.Refresh();
+
Bitmap bitMap = GetBitmap(SurfaceLevel, MipLevel);
bitMap.Save(FileName);
bitMap.Dispose();
+
+ progressBar.Value = 100;
+ progressBar.Close();
}
public void SaveDDS(string FileName, int SurfaceLevel = 0, int MipLevel = 0)
{
@@ -634,8 +682,8 @@ namespace Switch_Toolbox.Library
dds.header.mipmapCount = (uint)MipCount;
dds.header.pitchOrLinearSize = (uint)surfaces[0].mipmaps[0].Length;
- if (surfaces.Count > 0)
- dds.SetFlags((DDS.DXGI_FORMAT)Format);
+ if (surfaces.Count > 0) //Use DX10 format for array surfaces as it can do custom amounts
+ dds.SetFlags((DDS.DXGI_FORMAT)Format, true);
else
dds.SetFlags((DDS.DXGI_FORMAT)Format);
diff --git a/Switch_Toolbox_Library/IO/FileIO.cs b/Switch_Toolbox_Library/IO/FileIO.cs
index 6ea19cfb..f9f1be85 100644
--- a/Switch_Toolbox_Library/IO/FileIO.cs
+++ b/Switch_Toolbox_Library/IO/FileIO.cs
@@ -210,6 +210,7 @@ namespace Switch_Toolbox.Library.IO
}
}
}
+
public class Type_LZ4F
{
public static byte[] Decompress(byte[] data)
diff --git a/Switch_Toolbox_Library/Imaging/BitmapExtension.cs b/Switch_Toolbox_Library/Imaging/BitmapExtension.cs
index 38ca003d..97bf743f 100644
--- a/Switch_Toolbox_Library/Imaging/BitmapExtension.cs
+++ b/Switch_Toolbox_Library/Imaging/BitmapExtension.cs
@@ -48,6 +48,85 @@ namespace Switch_Toolbox.Library
// return new Bitmap(original, new Size(width, height));
}
+ public static Bitmap ReplaceChannel(Image OriginalImage, Image ChannelImage, STChannelType ChannelType)
+ {
+ Bitmap b = new Bitmap(OriginalImage);
+ Bitmap c = new Bitmap(ChannelImage, new Size(b.Width, b.Height)); //Force to be same size
+ c = GrayScale(c); //Convert to grayscale
+
+ BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
+ ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
+ int stride = bmData.Stride;
+ System.IntPtr Scan0 = bmData.Scan0;
+
+
+
+ BitmapData cmData = c.LockBits(new Rectangle(0, 0, c.Width, c.Height),
+ ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
+ int cstride = cmData.Stride;
+ System.IntPtr cScan0 = cmData.Scan0;
+
+ unsafe
+ {
+ byte* p = (byte*)(void*)Scan0;
+ byte* channelPointer = (byte*)(void*)cScan0;
+
+ int nOffset = stride - b.Width * 4;
+
+ byte red, green, blue, alpha;
+
+ for (int y = 0; y < b.Height; ++y)
+ {
+ for (int x = 0; x < b.Width; ++x)
+ {
+ blue = p[0];
+ green = p[1];
+ red = p[2];
+ alpha = p[3];
+
+ if (ChannelType == STChannelType.Red)
+ {
+ p[2] = channelPointer[2];
+ p[1] = green;
+ p[0] = blue;
+ p[3] = alpha;
+ }
+ else if (ChannelType == STChannelType.Green)
+ {
+ p[2] = red;
+ p[1] = channelPointer[2];
+ p[0] = blue;
+ p[3] = alpha;
+ }
+ else if (ChannelType == STChannelType.Blue)
+ {
+ p[2] = red;
+ p[1] = green;
+ p[0] = channelPointer[2];
+ p[3] = alpha;
+ }
+ else if (ChannelType == STChannelType.Alpha)
+ {
+ p[2] = red;
+ p[1] = green;
+ p[0] = blue;
+ p[3] = channelPointer[2];
+ }
+
+ p += 4;
+ channelPointer += 4;
+ }
+ p += nOffset;
+ channelPointer += nOffset;
+ }
+ }
+
+ b.UnlockBits(bmData);
+ c.UnlockBits(cmData);
+
+ return b;
+ }
+
public static Bitmap SwapBlueRedChannels(Image image)
{
Bitmap b = new Bitmap(image);
diff --git a/Switch_Toolbox_Library/Util/Util.cs b/Switch_Toolbox_Library/Util/Util.cs
index 7e85fe8a..ce43fa48 100644
--- a/Switch_Toolbox_Library/Util/Util.cs
+++ b/Switch_Toolbox_Library/Util/Util.cs
@@ -10,6 +10,17 @@ namespace Switch_Toolbox.Library
{
public class Utils
{
+ public static byte[] CreateMD5Hash(string filename)
+ {
+ using (var md5 = System.Security.Cryptography.MD5.Create())
+ {
+ using (var stream = File.OpenRead(filename))
+ {
+ return md5.ComputeHash(stream);
+ }
+ }
+ }
+
public static bool HasInterface(Type objectType, Type interfaceType)
{
foreach (var inter in objectType.GetInterfaces())
diff --git a/Toolbox/System.Numerics.Vectors.dll b/Toolbox/System.Numerics.Vectors.dll
new file mode 100644
index 00000000..08659724
Binary files /dev/null and b/Toolbox/System.Numerics.Vectors.dll differ
diff --git a/Toolbox/Toolbox.csproj b/Toolbox/Toolbox.csproj
index 92651c8f..7e38127a 100644
--- a/Toolbox/Toolbox.csproj
+++ b/Toolbox/Toolbox.csproj
@@ -433,6 +433,9 @@
+
+ PreserveNewest
+
diff --git a/Toolbox/UpdateProgram.cs b/Toolbox/UpdateProgram.cs
index 190c6b47..bdab9989 100644
--- a/Toolbox/UpdateProgram.cs
+++ b/Toolbox/UpdateProgram.cs
@@ -14,10 +14,12 @@ namespace Toolbox
{
static Release[] releases;
public static bool CanUpdate = false;
+ public static bool Downloaded = false;
public static Release LatestRelease;
public static List CommitList = new List();
public static DateTime LatestReleaseTime;
+
public static void CheckLatest()
{
try
@@ -37,9 +39,16 @@ namespace Toolbox
if (Runtime.CompileDate != latest.Assets[0].UpdatedAt.ToString())
{
- LatestReleaseTime = latest.Assets[0].UpdatedAt.DateTime;
- CanUpdate = true;
- LatestRelease = latest;
+ DownloadRelease();
+ if (CanUpdate)
+ {
+ LatestReleaseTime = latest.Assets[0].UpdatedAt.DateTime;
+ LatestRelease = latest;
+ }
+ else
+ {
+
+ }
}
break;
}
@@ -49,6 +58,31 @@ namespace Toolbox
Console.WriteLine($"Failed to get latest update\n{ex.ToString()}");
}
}
+
+ static void DownloadRelease()
+ {
+ ProcessStartInfo p = new ProcessStartInfo();
+ p.WindowStyle = ProcessWindowStyle.Hidden;
+ p.CreateNoWindow = true;
+ p.FileName = Path.Combine(Runtime.ExecutableDir, "Updater.exe");
+ p.WorkingDirectory = Path.Combine(Runtime.ExecutableDir, "updater/");
+ Console.WriteLine($"Updater: {p.FileName}");
+ p.Arguments = "-d";
+
+ Process process = new Process();
+ process.StartInfo = p;
+ Console.WriteLine("Downloading...");
+ process.Start();
+ process.WaitForExit();
+ if (process.ExitCode != 0)
+ throw new TimeoutException();
+ Console.WriteLine("Finished downloading");
+ string updateExe = Path.Combine(Runtime.ExecutableDir, "master\\Toolbox.exe"),
+ currentExe = System.Reflection.Assembly.GetEntryAssembly().Location;
+ if (!Utils.CreateMD5Hash(currentExe).SequenceEqual(Utils.CreateMD5Hash(updateExe)))
+ CanUpdate = true;
+ }
+
static async Task GetCommits(GitHubClient client)
{
var options = new ApiOptions