mirror of
https://github.com/KillzXGaming/Switch-Toolbox
synced 2024-11-26 06:20:24 +00:00
Update GTX code and update data types.
This commit is contained in:
parent
5cfec193bf
commit
785f5657b2
41 changed files with 7460 additions and 241 deletions
|
@ -282,7 +282,7 @@ namespace Bfres.Structs
|
||||||
ftexContainer.Nodes.Add(texture);
|
ftexContainer.Nodes.Add(texture);
|
||||||
ftexContainer.Textures.Add(texture.Text, texture);
|
ftexContainer.Textures.Add(texture.Text, texture);
|
||||||
}
|
}
|
||||||
// PluginRuntime.ftexContainers.Add(ftexContainer);
|
PluginRuntime.ftexContainers.Add(ftexContainer);
|
||||||
}
|
}
|
||||||
private void AddSkeletonAnims(ResU.ResFile resFile)
|
private void AddSkeletonAnims(ResU.ResFile resFile)
|
||||||
{
|
{
|
||||||
|
|
|
@ -434,8 +434,7 @@ namespace FirstPlugin
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
settings.Add(LoadSettings(name));
|
settings.Add(LoadSettings(name));
|
||||||
}
|
|
||||||
}
|
|
||||||
if (settings.Count == 0)
|
if (settings.Count == 0)
|
||||||
{
|
{
|
||||||
importer.Dispose();
|
importer.Dispose();
|
||||||
|
@ -482,6 +481,9 @@ namespace FirstPlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
settings.Clear();
|
settings.Clear();
|
||||||
GC.Collect();
|
GC.Collect();
|
||||||
Cursor.Current = Cursors.Default;
|
Cursor.Current = Cursors.Default;
|
||||||
|
@ -1177,7 +1179,6 @@ namespace FirstPlugin
|
||||||
if (setting.DataBlockOutput != null)
|
if (setting.DataBlockOutput != null)
|
||||||
{
|
{
|
||||||
Texture = setting.FromBitMap(setting.DataBlockOutput[0], setting);
|
Texture = setting.FromBitMap(setting.DataBlockOutput[0], setting);
|
||||||
LoadTexture(Texture, 1);
|
|
||||||
LoadOpenGLTexture();
|
LoadOpenGLTexture();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -25,6 +25,9 @@ namespace FirstPlugin
|
||||||
Name = "FTEXCONT";
|
Name = "FTEXCONT";
|
||||||
|
|
||||||
ContextMenu = new ContextMenu();
|
ContextMenu = new ContextMenu();
|
||||||
|
MenuItem importTex = new MenuItem("Import");
|
||||||
|
ContextMenu.MenuItems.Add(importTex);
|
||||||
|
importTex.Click += Import;
|
||||||
MenuItem exportAll = new MenuItem("Export All Textures");
|
MenuItem exportAll = new MenuItem("Export All Textures");
|
||||||
ContextMenu.MenuItems.Add(exportAll);
|
ContextMenu.MenuItems.Add(exportAll);
|
||||||
exportAll.Click += ExportAll;
|
exportAll.Click += ExportAll;
|
||||||
|
@ -50,7 +53,117 @@ namespace FirstPlugin
|
||||||
Textures.Remove(textureData.Text);
|
Textures.Remove(textureData.Text);
|
||||||
Viewport.Instance.UpdateViewport();
|
Viewport.Instance.UpdateViewport();
|
||||||
}
|
}
|
||||||
|
private void Import(object sender, EventArgs args)
|
||||||
|
{
|
||||||
|
ImportTexture();
|
||||||
|
}
|
||||||
|
public void ImportTexture()
|
||||||
|
{
|
||||||
|
OpenFileDialog ofd = new OpenFileDialog();
|
||||||
|
ofd.Filter = "Supported Formats|*.dds; *.png;*.tga;*.jpg;*.tiff|" +
|
||||||
|
"Microsoft DDS |*.dds|" +
|
||||||
|
"Portable Network Graphics |*.png|" +
|
||||||
|
"Joint Photographic Experts Group |*.jpg|" +
|
||||||
|
"Bitmap Image |*.bmp|" +
|
||||||
|
"Tagged Image File Format |*.tiff|" +
|
||||||
|
"All files(*.*)|*.*";
|
||||||
|
|
||||||
|
ofd.Multiselect = true;
|
||||||
|
if (ofd.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
GTXTextureImporter importer = new GTXTextureImporter();
|
||||||
|
List<GTXImporterSettings> settings = new List<GTXImporterSettings>();
|
||||||
|
foreach (string name in ofd.FileNames)
|
||||||
|
{
|
||||||
|
string ext = System.IO.Path.GetExtension(name);
|
||||||
|
ext = ext.ToLower();
|
||||||
|
|
||||||
|
if (ext == ".dds")
|
||||||
|
{
|
||||||
|
settings.Add(LoadSettings(name));
|
||||||
|
if (settings.Count == 0)
|
||||||
|
{
|
||||||
|
importer.Dispose();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
importer.LoadSettings(settings);
|
||||||
|
foreach (var setting in settings)
|
||||||
|
{
|
||||||
|
if (setting.DataBlockOutput != null)
|
||||||
|
{
|
||||||
|
GTX.GX2Surface tex = setting.CreateGx2Texture(setting.DataBlockOutput[0]);
|
||||||
|
FTEX ftex = new FTEX();
|
||||||
|
ftex.texture = ftex.FromGx2Surface(tex, setting);
|
||||||
|
ftex.Read(ftex.texture);
|
||||||
|
|
||||||
|
Nodes.Add(ftex);
|
||||||
|
Textures.Add(ftex.Text, ftex);
|
||||||
|
ftex.LoadOpenGLTexture();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
settings.Add(LoadSettings(name));
|
||||||
|
if (settings.Count == 0)
|
||||||
|
{
|
||||||
|
importer.Dispose();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
importer.LoadSettings(settings);
|
||||||
|
if (importer.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
Cursor.Current = Cursors.WaitCursor;
|
||||||
|
foreach (var setting in settings)
|
||||||
|
{
|
||||||
|
if (setting.GenerateMipmaps)
|
||||||
|
{
|
||||||
|
setting.DataBlockOutput.Clear();
|
||||||
|
setting.DataBlockOutput.Add(setting.GenerateMips());
|
||||||
|
}
|
||||||
|
if (setting.DataBlockOutput != null)
|
||||||
|
{
|
||||||
|
GTX.GX2Surface tex = setting.CreateGx2Texture(setting.DataBlockOutput[0]);
|
||||||
|
FTEX ftex = new FTEX();
|
||||||
|
ftex.texture = ftex.FromGx2Surface(tex, setting);
|
||||||
|
ftex.Read(ftex.texture);
|
||||||
|
|
||||||
|
Nodes.Add(ftex);
|
||||||
|
Textures.Add(ftex.Text, ftex);
|
||||||
|
ftex.LoadOpenGLTexture();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MessageBox.Show("Something went wrong???");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.Clear();
|
||||||
|
GC.Collect();
|
||||||
|
Cursor.Current = Cursors.Default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public GTXImporterSettings LoadSettings(string name)
|
||||||
|
{
|
||||||
|
var importer = new GTXImporterSettings();
|
||||||
|
string ext = System.IO.Path.GetExtension(name);
|
||||||
|
ext = ext.ToLower();
|
||||||
|
|
||||||
|
switch (ext)
|
||||||
|
{
|
||||||
|
case ".dds":
|
||||||
|
importer.LoadDDS(name);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
importer.LoadBitMap(name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return importer;
|
||||||
|
}
|
||||||
private void ExportAll(object sender, EventArgs args)
|
private void ExportAll(object sender, EventArgs args)
|
||||||
{
|
{
|
||||||
List<string> Formats = new List<string>();
|
List<string> Formats = new List<string>();
|
||||||
|
@ -94,10 +207,7 @@ namespace FirstPlugin
|
||||||
{
|
{
|
||||||
public int format;
|
public int format;
|
||||||
public RenderableTex renderedTex = new RenderableTex();
|
public RenderableTex renderedTex = new RenderableTex();
|
||||||
GX2CompSel ChannelRed;
|
public Texture texture;
|
||||||
GX2CompSel ChannelBlue;
|
|
||||||
GX2CompSel ChannelGreen;
|
|
||||||
GX2CompSel ChannelAlpha;
|
|
||||||
|
|
||||||
public FTEX()
|
public FTEX()
|
||||||
{
|
{
|
||||||
|
@ -105,6 +215,9 @@ namespace FirstPlugin
|
||||||
MenuItem export = new MenuItem("Export");
|
MenuItem export = new MenuItem("Export");
|
||||||
ContextMenu.MenuItems.Add(export);
|
ContextMenu.MenuItems.Add(export);
|
||||||
export.Click += Export;
|
export.Click += Export;
|
||||||
|
MenuItem replace = new MenuItem("Replace");
|
||||||
|
ContextMenu.MenuItems.Add(replace);
|
||||||
|
replace.Click += Replace;
|
||||||
MenuItem remove = new MenuItem("Remove");
|
MenuItem remove = new MenuItem("Remove");
|
||||||
ContextMenu.MenuItems.Add(remove);
|
ContextMenu.MenuItems.Add(remove);
|
||||||
remove.Click += Remove;
|
remove.Click += Remove;
|
||||||
|
@ -115,7 +228,91 @@ namespace FirstPlugin
|
||||||
|
|
||||||
private void Replace(object sender, EventArgs args)
|
private void Replace(object sender, EventArgs args)
|
||||||
{
|
{
|
||||||
|
OpenFileDialog ofd = new OpenFileDialog();
|
||||||
|
ofd.Filter = "Supported Formats|*.dds; *.png;*.tga;*.jpg;*.tiff|" +
|
||||||
|
"Microsoft DDS |*.dds|" +
|
||||||
|
"Portable Network Graphics |*.png|" +
|
||||||
|
"Joint Photographic Experts Group |*.jpg|" +
|
||||||
|
"Bitmap Image |*.bmp|" +
|
||||||
|
"Tagged Image File Format |*.tiff|" +
|
||||||
|
"All files(*.*)|*.*";
|
||||||
|
|
||||||
|
ofd.Multiselect = false;
|
||||||
|
if (ofd.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
Replace(ofd.FileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void Replace(string FileName)
|
||||||
|
{
|
||||||
|
string ext = System.IO.Path.GetExtension(FileName);
|
||||||
|
ext = ext.ToLower();
|
||||||
|
|
||||||
|
GTXImporterSettings setting = new GTXImporterSettings();
|
||||||
|
GTXTextureImporter importer = new GTXTextureImporter();
|
||||||
|
|
||||||
|
switch (ext)
|
||||||
|
{
|
||||||
|
case ".dds":
|
||||||
|
setting.LoadDDS(FileName, null);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
setting.LoadBitMap(FileName);
|
||||||
|
importer.LoadSetting(setting);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (importer.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
Cursor.Current = Cursors.WaitCursor;
|
||||||
|
|
||||||
|
if (setting.GenerateMipmaps)
|
||||||
|
{
|
||||||
|
setting.DataBlockOutput.Clear();
|
||||||
|
setting.DataBlockOutput.Add(setting.GenerateMips());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setting.DataBlockOutput != null)
|
||||||
|
{
|
||||||
|
var surface = setting.CreateGx2Texture(setting.DataBlockOutput[0]);
|
||||||
|
texture = FromGx2Surface(surface, setting);
|
||||||
|
LoadOpenGLTexture();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MessageBox.Show("Something went wrong???");
|
||||||
|
}
|
||||||
|
UpdateEditor();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//We reuse GX2 data as it's the same thing
|
||||||
|
public Texture FromGx2Surface(GTX.GX2Surface surf, GTXImporterSettings settings)
|
||||||
|
{
|
||||||
|
Texture tex = new Texture();
|
||||||
|
tex.Name = settings.TexName;
|
||||||
|
tex.AAMode = (GX2AAMode)surf.aa;
|
||||||
|
tex.Alignment = (uint)surf.alignment;
|
||||||
|
tex.ArrayLength = 1;
|
||||||
|
tex.Data = surf.data;
|
||||||
|
tex.MipData = surf.mipData;
|
||||||
|
tex.Format = (GX2SurfaceFormat)surf.format;
|
||||||
|
tex.Dim = (GX2SurfaceDim)surf.dim;
|
||||||
|
tex.Use = (GX2SurfaceUse)surf.use;
|
||||||
|
tex.TileMode = (GX2TileMode)surf.tileMode;
|
||||||
|
tex.Swizzle = (uint)surf.swizzle;
|
||||||
|
tex.Pitch = (uint)surf.pitch;
|
||||||
|
tex.Depth = (uint)surf.depth;
|
||||||
|
tex.MipCount = (uint)surf.numMips;
|
||||||
|
tex.MipOffsets = surf.mipOffset;
|
||||||
|
tex.Height = (uint)surf.height;
|
||||||
|
tex.Width = (uint)surf.width;
|
||||||
|
tex.Regs = new uint[0];
|
||||||
|
var channels = SetChannelsByFormat((GX2SurfaceFormat)surf.format);
|
||||||
|
tex.CompSelR = channels[0];
|
||||||
|
tex.CompSelG = channels[1];
|
||||||
|
tex.CompSelB = channels[2];
|
||||||
|
tex.CompSelA = channels[3];
|
||||||
|
return tex;
|
||||||
}
|
}
|
||||||
private void Rename(object sender, EventArgs args)
|
private void Rename(object sender, EventArgs args)
|
||||||
{
|
{
|
||||||
|
@ -160,11 +357,7 @@ namespace FirstPlugin
|
||||||
SelectedImageKey = "Texture";
|
SelectedImageKey = "Texture";
|
||||||
Text = tex.Name;
|
Text = tex.Name;
|
||||||
|
|
||||||
ChannelRed = tex.CompSelR;
|
renderedTex = new RenderableTex();
|
||||||
ChannelGreen = tex.CompSelG;
|
|
||||||
ChannelBlue = tex.CompSelB;
|
|
||||||
ChannelAlpha = tex.CompSelA;
|
|
||||||
|
|
||||||
renderedTex.width = (int)tex.Width;
|
renderedTex.width = (int)tex.Width;
|
||||||
renderedTex.height = (int)tex.Height;
|
renderedTex.height = (int)tex.Height;
|
||||||
format = (int)tex.Format;
|
format = (int)tex.Format;
|
||||||
|
@ -172,30 +365,70 @@ namespace FirstPlugin
|
||||||
int pitch = (int)tex.Pitch;
|
int pitch = (int)tex.Pitch;
|
||||||
uint bpp = GTX.surfaceGetBitsPerPixel((uint)format) >> 3;
|
uint bpp = GTX.surfaceGetBitsPerPixel((uint)format) >> 3;
|
||||||
|
|
||||||
|
Console.WriteLine(tex.Width);
|
||||||
|
Console.WriteLine(tex.Height);
|
||||||
|
Console.WriteLine(tex.Format);
|
||||||
|
Console.WriteLine(tex.Swizzle);
|
||||||
|
Console.WriteLine(tex.Pitch);
|
||||||
|
Console.WriteLine(tex.Alignment);
|
||||||
|
Console.WriteLine(tex.Depth);
|
||||||
|
Console.WriteLine(tex.Dim);
|
||||||
|
Console.WriteLine(tex.MipCount);
|
||||||
|
Console.WriteLine(tex.MipOffsets);
|
||||||
|
Console.WriteLine(tex.AAMode);
|
||||||
|
Console.WriteLine(tex.Use);
|
||||||
|
|
||||||
GTX.GX2Surface surf = new GTX.GX2Surface();
|
GTX.GX2Surface surf = new GTX.GX2Surface();
|
||||||
surf.bpp = bpp;
|
surf.bpp = bpp;
|
||||||
surf.height = (int)tex.Height;
|
surf.height = tex.Height;
|
||||||
surf.width = (int)tex.Width;
|
surf.width = tex.Width;
|
||||||
surf.aa = (int)tex.AAMode;
|
surf.aa = (uint)tex.AAMode;
|
||||||
surf.alignment = (int)tex.Alignment;
|
surf.alignment = tex.Alignment;
|
||||||
surf.depth = (int)tex.Depth;
|
surf.depth = tex.Depth;
|
||||||
surf.dim = (int)tex.Dim;
|
surf.dim = (uint)tex.Dim;
|
||||||
surf.format = (int)tex.Format;
|
surf.format = (uint)tex.Format;
|
||||||
surf.use = (int)tex.Use;
|
surf.use = (uint)tex.Use;
|
||||||
surf.pitch = (int)tex.Pitch;
|
surf.pitch = tex.Pitch;
|
||||||
surf.data = tex.Data;
|
surf.data = tex.Data;
|
||||||
surf.numMips = (int)tex.MipCount;
|
surf.numMips = tex.MipCount;
|
||||||
surf.mipOffset = tex.MipOffsets;
|
surf.mipOffset = tex.MipOffsets;
|
||||||
surf.mipData = tex.MipData;
|
surf.mipData = tex.MipData;
|
||||||
surf.tileMode = (int)tex.TileMode;
|
surf.tileMode = (uint)tex.TileMode;
|
||||||
surf.swizzle = (int)tex.Swizzle;
|
surf.swizzle = tex.Swizzle;
|
||||||
|
|
||||||
List<byte[]> mips = GTX.Decode(surf);
|
List<byte[]> mips = GTX.Decode(surf);
|
||||||
renderedTex.mipmaps.Add(mips);
|
renderedTex.mipmaps.Add(mips);
|
||||||
|
|
||||||
// LoadOpenGLTexture();
|
renderedTex.data = renderedTex.mipmaps[0][0];
|
||||||
// else
|
}
|
||||||
// Console.WriteLine("Failed to load image!");
|
public static GX2CompSel[] SetChannelsByFormat(GX2SurfaceFormat Format)
|
||||||
|
{
|
||||||
|
GX2CompSel[] channels = new GX2CompSel[4];
|
||||||
|
|
||||||
|
switch (Format)
|
||||||
|
{
|
||||||
|
case GX2SurfaceFormat.T_BC5_UNorm:
|
||||||
|
case GX2SurfaceFormat.T_BC5_SNorm:
|
||||||
|
channels[0] = GX2CompSel.ChannelR;
|
||||||
|
channels[1] = GX2CompSel.ChannelG;
|
||||||
|
channels[2] = GX2CompSel.Always0;
|
||||||
|
channels[3] = GX2CompSel.Always1;
|
||||||
|
break;
|
||||||
|
case GX2SurfaceFormat.T_BC4_SNorm:
|
||||||
|
case GX2SurfaceFormat.T_BC4_UNorm:
|
||||||
|
channels[0] = GX2CompSel.ChannelR;
|
||||||
|
channels[1] = GX2CompSel.ChannelR;
|
||||||
|
channels[2] = GX2CompSel.ChannelR;
|
||||||
|
channels[3] = GX2CompSel.ChannelR;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
channels[0] = GX2CompSel.ChannelR;
|
||||||
|
channels[1] = GX2CompSel.ChannelG;
|
||||||
|
channels[2] = GX2CompSel.ChannelB;
|
||||||
|
channels[3] = GX2CompSel.Always1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return channels;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Export(string FileName, bool ExportSurfaceLevel = false,
|
public void Export(string FileName, bool ExportSurfaceLevel = false,
|
||||||
|
@ -252,6 +485,7 @@ namespace FirstPlugin
|
||||||
if (OpenTKSharedResources.SetupStatus == OpenTKSharedResources.SharedResourceStatus.Unitialized)
|
if (OpenTKSharedResources.SetupStatus == OpenTKSharedResources.SharedResourceStatus.Unitialized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC1_UNORM):
|
case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC1_UNORM):
|
||||||
|
@ -283,8 +517,7 @@ namespace FirstPlugin
|
||||||
break;
|
break;
|
||||||
case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC5_SNORM):
|
case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC5_SNORM):
|
||||||
//OpenTK doesn't load BC5 SNORM textures right so I'll use the same decompress method bntx has
|
//OpenTK doesn't load BC5 SNORM textures right so I'll use the same decompress method bntx has
|
||||||
byte[] fixBC5 = DDSCompressor.DecompressBC5(renderedTex.data, renderedTex.width, renderedTex.height, true, true);
|
renderedTex.data = DDSCompressor.DecompressBC5(renderedTex.mipmaps[0][0], (int)renderedTex.width, (int)renderedTex.height, true, true);
|
||||||
renderedTex.data = fixBC5;
|
|
||||||
renderedTex.pixelInternalFormat = PixelInternalFormat.Rgba;
|
renderedTex.pixelInternalFormat = PixelInternalFormat.Rgba;
|
||||||
renderedTex.pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgba;
|
renderedTex.pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgba;
|
||||||
break;
|
break;
|
||||||
|
@ -356,12 +589,24 @@ namespace FirstPlugin
|
||||||
|
|
||||||
public override void OnClick(TreeView treeView)
|
public override void OnClick(TreeView treeView)
|
||||||
{
|
{
|
||||||
FTEXEditor FTEXEditor = new FTEXEditor();
|
UpdateEditor();
|
||||||
FTEXEditor.Text = Text;
|
}
|
||||||
FTEXEditor.Dock = DockStyle.Fill;
|
|
||||||
FTEXEditor.LoadPicture(DisplayTexture());
|
public void UpdateEditor()
|
||||||
FTEXEditor.LoadProperty(this);
|
{
|
||||||
LibraryGUI.Instance.LoadDockContent(FTEXEditor, PluginRuntime.FSHPDockState);
|
if (Viewport.Instance.gL_ControlModern1.Visible == false)
|
||||||
|
PluginRuntime.FSHPDockState = WeifenLuo.WinFormsUI.Docking.DockState.Document;
|
||||||
|
|
||||||
|
FTEXEditor docked = (FTEXEditor)LibraryGUI.Instance.GetContentDocked(new FTEXEditor());
|
||||||
|
if (docked == null)
|
||||||
|
{
|
||||||
|
docked = new FTEXEditor();
|
||||||
|
LibraryGUI.Instance.LoadDockContent(docked, PluginRuntime.FSHPDockState);
|
||||||
|
}
|
||||||
|
docked.Text = Text;
|
||||||
|
docked.Dock = DockStyle.Fill;
|
||||||
|
docked.LoadPicture(DisplayTexture());
|
||||||
|
docked.LoadProperty(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class RenderableTex
|
public class RenderableTex
|
||||||
|
@ -373,21 +618,8 @@ namespace FirstPlugin
|
||||||
public PixelType pixelType = PixelType.UnsignedByte;
|
public PixelType pixelType = PixelType.UnsignedByte;
|
||||||
public int mipMapCount;
|
public int mipMapCount;
|
||||||
public List<List<byte[]>> mipmaps = new List<List<byte[]>>();
|
public List<List<byte[]>> mipmaps = new List<List<byte[]>>();
|
||||||
|
public byte[] data;
|
||||||
|
|
||||||
public byte[] data
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return mipmaps[0][0];
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
mipmaps.Clear();
|
|
||||||
List<byte[]> mips = new List<byte[]>();
|
|
||||||
mips.Add(value);
|
|
||||||
mipmaps.Add(mips);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public class Surface
|
public class Surface
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -435,18 +667,23 @@ namespace FirstPlugin
|
||||||
{
|
{
|
||||||
throw new Exception($"Bad size from format {Format}");
|
throw new Exception($"Bad size from format {Format}");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
public static byte[] CompressBlock(byte[] data, int width, int height, GTX.GX2SurfaceFormat format)
|
||||||
|
{
|
||||||
|
if (IsCompressedFormat((GX2SurfaceFormat)format))
|
||||||
|
return DDSCompressor.CompressBlock(data, width, height, GetCompressedDXGI_FORMAT((GX2SurfaceFormat)format));
|
||||||
|
else
|
||||||
|
return DDSCompressor.EncodePixelBlock(data, width, height, GetUncompressedDXGI_FORMAT((GX2SurfaceFormat)format));
|
||||||
}
|
}
|
||||||
private static DDS.DXGI_FORMAT GetUncompressedDXGI_FORMAT(GX2SurfaceFormat Format)
|
private static DDS.DXGI_FORMAT GetUncompressedDXGI_FORMAT(GX2SurfaceFormat Format)
|
||||||
{
|
{
|
||||||
switch (Format)
|
switch (Format)
|
||||||
{
|
{
|
||||||
|
case GX2SurfaceFormat.TC_R5_G5_B5_A1_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_B5G5R5A1_UNORM;
|
||||||
case GX2SurfaceFormat.TC_A1_B5_G5_R5_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_B5G5R5A1_UNORM;
|
case GX2SurfaceFormat.TC_A1_B5_G5_R5_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_B5G5R5A1_UNORM;
|
||||||
case GX2SurfaceFormat.TC_R4_G4_B4_A4_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_B4G4R4A4_UNORM;
|
case GX2SurfaceFormat.TC_R4_G4_B4_A4_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_B4G4R4A4_UNORM;
|
||||||
case GX2SurfaceFormat.TCS_R5_G6_B5_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_B5G6R5_UNORM;
|
case GX2SurfaceFormat.TCS_R5_G6_B5_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_B5G6R5_UNORM;
|
||||||
case GX2SurfaceFormat.TCS_R8_G8_B8_A8_SRGB: return DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
|
case GX2SurfaceFormat.TCS_R8_G8_B8_A8_SRGB: return DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
case GX2SurfaceFormat.TCS_R8_G8_B8_A8_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM;
|
case GX2SurfaceFormat.TCS_R8_G8_B8_A8_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
case GX2SurfaceFormat.TCS_R10_G10_B10_A2_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_R10G10B10A2_UNORM;
|
case GX2SurfaceFormat.TCS_R10_G10_B10_A2_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_R10G10B10A2_UNORM;
|
||||||
case GX2SurfaceFormat.TC_R11_G11_B10_Float: return DDS.DXGI_FORMAT.DXGI_FORMAT_R11G11B10_FLOAT;
|
case GX2SurfaceFormat.TC_R11_G11_B10_Float: return DDS.DXGI_FORMAT.DXGI_FORMAT_R11G11B10_FLOAT;
|
||||||
|
@ -484,11 +721,11 @@ namespace FirstPlugin
|
||||||
switch (Format)
|
switch (Format)
|
||||||
{
|
{
|
||||||
case GX2SurfaceFormat.T_BC1_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM;
|
case GX2SurfaceFormat.T_BC1_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM;
|
||||||
case GX2SurfaceFormat.T_BC1_SRGB: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB;
|
case GX2SurfaceFormat.T_BC1_SRGB: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM;
|
||||||
case GX2SurfaceFormat.T_BC2_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM;
|
case GX2SurfaceFormat.T_BC2_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM;
|
||||||
case GX2SurfaceFormat.T_BC2_SRGB: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB;
|
case GX2SurfaceFormat.T_BC2_SRGB: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM;
|
||||||
case GX2SurfaceFormat.T_BC3_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM;
|
case GX2SurfaceFormat.T_BC3_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM;
|
||||||
case GX2SurfaceFormat.T_BC3_SRGB: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB;
|
case GX2SurfaceFormat.T_BC3_SRGB: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM;
|
||||||
case GX2SurfaceFormat.T_BC4_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM;
|
case GX2SurfaceFormat.T_BC4_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM;
|
||||||
case GX2SurfaceFormat.T_BC4_SNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC4_SNORM;
|
case GX2SurfaceFormat.T_BC4_SNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC4_SNORM;
|
||||||
case GX2SurfaceFormat.T_BC5_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM;
|
case GX2SurfaceFormat.T_BC5_UNorm: return DDS.DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM;
|
||||||
|
@ -503,7 +740,8 @@ namespace FirstPlugin
|
||||||
}
|
}
|
||||||
public Bitmap UpdateBitmap(Bitmap image)
|
public Bitmap UpdateBitmap(Bitmap image)
|
||||||
{
|
{
|
||||||
return ColorComponentSelector(image, ChannelRed, ChannelGreen, ChannelBlue, ChannelAlpha);
|
return ColorComponentSelector(image, texture.CompSelR,
|
||||||
|
texture.CompSelG, texture.CompSelB, texture.CompSelA);
|
||||||
}
|
}
|
||||||
public static Bitmap ColorComponentSelector(Bitmap image, GX2CompSel R, GX2CompSel G, GX2CompSel B, GX2CompSel A)
|
public static Bitmap ColorComponentSelector(Bitmap image, GX2CompSel R, GX2CompSel G, GX2CompSel B, GX2CompSel A)
|
||||||
{
|
{
|
||||||
|
|
|
@ -72,24 +72,24 @@ namespace FirstPlugin
|
||||||
//Todo. Add swizzling back
|
//Todo. Add swizzling back
|
||||||
public struct GX2Surface
|
public struct GX2Surface
|
||||||
{
|
{
|
||||||
public int dim;
|
public uint dim;
|
||||||
public int width;
|
public uint width;
|
||||||
public int height;
|
public uint height;
|
||||||
public int depth;
|
public uint depth;
|
||||||
public int numMips;
|
public uint numMips;
|
||||||
public int format;
|
public uint format;
|
||||||
public int aa;
|
public uint aa;
|
||||||
public int use;
|
public uint use;
|
||||||
public int resourceFlags;
|
public int resourceFlags;
|
||||||
public int imageSize;
|
public uint imageSize;
|
||||||
public int imagePtr;
|
public uint imagePtr;
|
||||||
public int pMem;
|
public int pMem;
|
||||||
public int mipSize;
|
public uint mipSize;
|
||||||
public int mipPtr;
|
public uint mipPtr;
|
||||||
public int tileMode;
|
public uint tileMode;
|
||||||
public int swizzle;
|
public uint swizzle;
|
||||||
public int alignment;
|
public uint alignment;
|
||||||
public int pitch;
|
public uint pitch;
|
||||||
public uint bpp;
|
public uint bpp;
|
||||||
|
|
||||||
public byte[] data;
|
public byte[] data;
|
||||||
|
@ -483,49 +483,52 @@ namespace FirstPlugin
|
||||||
Console.WriteLine($"tileType {surf.tileType}");
|
Console.WriteLine($"tileType {surf.tileType}");
|
||||||
Console.WriteLine($"tileIndex {surf.tileIndex}");
|
Console.WriteLine($"tileIndex {surf.tileIndex}");
|
||||||
}
|
}
|
||||||
static bool DebugSurface = true;
|
static bool DebugSurface = false;
|
||||||
|
|
||||||
public static List<byte[]> Decode(GX2Surface tex)
|
public static List<byte[]> Decode(GX2Surface tex)
|
||||||
{
|
{
|
||||||
var surfInfo = getSurfaceInfo((GX2SurfaceFormat)tex.format, tex.width, tex.height, tex.depth, (uint)tex.dim, (uint)tex.tileMode, (uint)tex.aa, 0);
|
uint blkWidth, blkHeight;
|
||||||
|
if (IsFormatBCN((GX2SurfaceFormat)tex.format))
|
||||||
|
{
|
||||||
|
blkWidth = 4;
|
||||||
|
blkHeight = 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
blkWidth = 1;
|
||||||
|
blkHeight = 1;
|
||||||
|
}
|
||||||
|
|
||||||
Console.WriteLine(tex.tileMode);
|
byte[] data = tex.data;
|
||||||
|
|
||||||
|
var surfInfo = getSurfaceInfo((GX2SurfaceFormat)tex.format, tex.width, tex.height, tex.depth, (uint)tex.dim, (uint)tex.tileMode, (uint)tex.aa, 0);
|
||||||
|
Debug(surfInfo);
|
||||||
|
uint bpp = TegraX1Swizzle.DIV_ROUND_UP(surfInfo.bpp, 8);
|
||||||
|
|
||||||
if (surfInfo.depth != 1)
|
if (surfInfo.depth != 1)
|
||||||
throw new Exception("Unsupported Depth!");
|
throw new Exception($"Unsupported Depth {surfInfo.depth}!");
|
||||||
|
|
||||||
List<byte[]> result = new List<byte[]>();
|
List<byte[]> result = new List<byte[]>();
|
||||||
for (int mipLevel = 0; mipLevel < tex.numMips; mipLevel++)
|
for (int mipLevel = 0; mipLevel < tex.numMips; mipLevel++)
|
||||||
{
|
{
|
||||||
int size;
|
uint width_ = (uint)Math.Max(1, tex.width >> mipLevel);
|
||||||
if (IsFormatBCN((GX2SurfaceFormat)tex.format))
|
uint height_ = (uint)Math.Max(1, tex.height >> mipLevel);
|
||||||
size = ((Math.Max(1, tex.width >> mipLevel) + 3) >> 2) * ((Math.Max(1, tex.height >> mipLevel) + 3) >> 2) * (int)tex.bpp;
|
|
||||||
else
|
uint size = TegraX1Swizzle.DIV_ROUND_UP(width_, blkWidth) * TegraX1Swizzle.DIV_ROUND_UP(height_, blkHeight) * bpp;
|
||||||
size = Math.Max(1, tex.width >> mipLevel) * Math.Max(1, tex.height >> mipLevel) * (int)tex.bpp;
|
|
||||||
|
|
||||||
byte[] data;
|
|
||||||
if (mipLevel == 0)
|
|
||||||
{
|
|
||||||
data = new byte[surfInfo.surfSize];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uint mipOffset;
|
uint mipOffset;
|
||||||
|
if (mipLevel != 0)
|
||||||
|
{
|
||||||
|
mipOffset = (tex.mipOffset[mipLevel - 1]);
|
||||||
if (mipLevel == 1)
|
if (mipLevel == 1)
|
||||||
mipOffset = (uint)(tex.mipOffset[mipLevel - 1] - surfInfo.surfSize);
|
mipOffset -= (uint)surfInfo.surfSize;
|
||||||
else
|
|
||||||
mipOffset = (uint)tex.mipOffset[mipLevel - 1];
|
|
||||||
|
|
||||||
// Console.WriteLine("mipOffset " + tex.mipOffset[mipLevel - 1]);
|
|
||||||
// Console.WriteLine("surfSize " + surfInfo.surfSize);
|
|
||||||
|
|
||||||
surfInfo = getSurfaceInfo((GX2SurfaceFormat)tex.format, tex.width, tex.height, tex.depth, (uint)tex.dim, (uint)tex.tileMode, (uint)tex.aa, mipLevel);
|
surfInfo = getSurfaceInfo((GX2SurfaceFormat)tex.format, tex.width, tex.height, tex.depth, (uint)tex.dim, (uint)tex.tileMode, (uint)tex.aa, mipLevel);
|
||||||
|
|
||||||
data = new byte[surfInfo.surfSize + mipOffset];
|
data = new byte[surfInfo.surfSize + mipOffset];
|
||||||
Array.Copy(tex.mipData, mipOffset, data, 0, surfInfo.surfSize);
|
Array.Copy(tex.mipData, mipOffset, data, 0, surfInfo.surfSize);
|
||||||
}
|
}
|
||||||
byte[] deswizzled = deswizzle(Math.Max(1, (uint)tex.width >> mipLevel), Math.Max(1, (uint)tex.height >> mipLevel), (uint)surfInfo.height, (uint)tex.format,
|
byte[] deswizzled = deswizzle(width_, height_, surfInfo.height, (uint)tex.format,
|
||||||
(uint)surfInfo.tileMode, (uint)tex.swizzle, (uint)surfInfo.pitch, (uint)surfInfo.bpp, data);
|
surfInfo.tileMode, (uint)tex.swizzle, surfInfo.pitch, surfInfo.bpp, data);
|
||||||
//Create a copy and use that to remove uneeded data
|
//Create a copy and use that to remove uneeded data
|
||||||
byte[] result_ = new byte[size];
|
byte[] result_ = new byte[size];
|
||||||
Array.Copy(deswizzled, 0, result_, 0, size);
|
Array.Copy(deswizzled, 0, result_, 0, size);
|
||||||
|
@ -591,17 +594,17 @@ namespace FirstPlugin
|
||||||
private static byte[] swizzleSurf(uint width, uint height, uint height_, uint format, uint tileMode, uint swizzle_,
|
private static byte[] swizzleSurf(uint width, uint height, uint height_, uint format, uint tileMode, uint swizzle_,
|
||||||
uint pitch, uint bitsPerPixel, byte[] data, int swizzle)
|
uint pitch, uint bitsPerPixel, byte[] data, int swizzle)
|
||||||
{
|
{
|
||||||
Console.WriteLine("swizzle");
|
Console.WriteLine("swizzling level....");
|
||||||
Console.WriteLine("---------------------------");
|
Console.WriteLine("---------------------------");
|
||||||
Console.WriteLine(width);
|
Console.WriteLine("width " + width);
|
||||||
Console.WriteLine(height);
|
Console.WriteLine("height " + height);
|
||||||
Console.WriteLine(height_);
|
Console.WriteLine("height_ " + height_);
|
||||||
Console.WriteLine(format);
|
Console.WriteLine("format " + format);
|
||||||
Console.WriteLine(tileMode);
|
Console.WriteLine("tileMode " + tileMode);
|
||||||
Console.WriteLine(swizzle_);
|
Console.WriteLine("swizzle_ " + swizzle_);
|
||||||
Console.WriteLine(pitch);
|
Console.WriteLine("pitch " + pitch);
|
||||||
Console.WriteLine(bitsPerPixel);
|
Console.WriteLine("bitsPerPixel " + bitsPerPixel);
|
||||||
Console.WriteLine(swizzle);
|
Console.WriteLine("swizzle " + swizzle);
|
||||||
Console.WriteLine("---------------------------");
|
Console.WriteLine("---------------------------");
|
||||||
|
|
||||||
uint bytesPerPixel = bitsPerPixel / 8;
|
uint bytesPerPixel = bitsPerPixel / 8;
|
||||||
|
@ -2265,7 +2268,7 @@ namespace FirstPlugin
|
||||||
return ~(align - 1) & (x + align - 1);
|
return ~(align - 1) & (x + align - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static surfaceOut getSurfaceInfo(GX2SurfaceFormat surfaceFormat, int surfaceWidth, int surfaceHeight, int surfaceDepth, uint surfaceDim, uint surfaceTileMode, uint surfaceAA, int level)
|
public static surfaceOut getSurfaceInfo(GX2SurfaceFormat surfaceFormat, uint surfaceWidth, uint surfaceHeight, uint surfaceDepth, uint surfaceDim, uint surfaceTileMode, uint surfaceAA, int level)
|
||||||
{
|
{
|
||||||
GX2Surface surface = new GX2Surface();
|
GX2Surface surface = new GX2Surface();
|
||||||
|
|
||||||
|
@ -2312,34 +2315,34 @@ namespace FirstPlugin
|
||||||
}
|
}
|
||||||
else if (dim == 1)
|
else if (dim == 1)
|
||||||
{
|
{
|
||||||
pSurfOut.height = (uint)Math.Max(1, surfaceHeight >> level);
|
pSurfOut.height = Math.Max(1, surfaceHeight >> level);
|
||||||
pSurfOut.depth = 1;
|
pSurfOut.depth = 1;
|
||||||
}
|
}
|
||||||
else if (dim == 2)
|
else if (dim == 2)
|
||||||
{
|
{
|
||||||
pSurfOut.height = (uint)Math.Max(1, surfaceHeight >> level);
|
pSurfOut.height = Math.Max(1, surfaceHeight >> level);
|
||||||
pSurfOut.depth = (uint)Math.Max(1, surfaceDepth >> level);
|
pSurfOut.depth = Math.Max(1, surfaceDepth >> level);
|
||||||
}
|
}
|
||||||
else if (dim == 3)
|
else if (dim == 3)
|
||||||
{
|
{
|
||||||
pSurfOut.height = (uint)Math.Max(1, surfaceHeight >> level);
|
pSurfOut.height = Math.Max(1, surfaceHeight >> level);
|
||||||
pSurfOut.depth = (uint)Math.Max(6, surfaceDepth);
|
pSurfOut.depth = Math.Max(6, surfaceDepth);
|
||||||
}
|
}
|
||||||
else if (dim == 4)
|
else if (dim == 4)
|
||||||
{
|
{
|
||||||
pSurfOut.height = 1;
|
pSurfOut.height = 1;
|
||||||
pSurfOut.depth = (uint)surfaceDepth;
|
pSurfOut.depth = surfaceDepth;
|
||||||
}
|
}
|
||||||
else if (dim == 5)
|
else if (dim == 5)
|
||||||
{
|
{
|
||||||
pSurfOut.height = (uint)Math.Max(1, surfaceHeight >> level);
|
pSurfOut.height = Math.Max(1, surfaceHeight >> level);
|
||||||
pSurfOut.depth = (uint)surfaceDepth;
|
pSurfOut.depth = surfaceDepth;
|
||||||
}
|
}
|
||||||
|
|
||||||
pSurfOut.height = (uint)(~(blockSize - 1) & (pSurfOut.height + blockSize - 1)) / blockSize;
|
pSurfOut.height = (~(blockSize - 1) & (pSurfOut.height + blockSize - 1)) / blockSize;
|
||||||
pSurfOut.pixelPitch = (uint)(~(blockSize - 1) & ((surfaceWidth >> level) + blockSize - 1));
|
pSurfOut.pixelPitch = (~(blockSize - 1) & ((surfaceWidth >> level) + blockSize - 1));
|
||||||
pSurfOut.pixelPitch = Math.Max(blockSize, pSurfOut.pixelPitch);
|
pSurfOut.pixelPitch = Math.Max(blockSize, pSurfOut.pixelPitch);
|
||||||
pSurfOut.pixelHeight = (uint)(~(blockSize - 1) & ((surfaceHeight >> level) + blockSize - 1));
|
pSurfOut.pixelHeight = (~(blockSize - 1) & ((surfaceHeight >> level) + blockSize - 1));
|
||||||
pSurfOut.pixelHeight = Math.Max(blockSize, pSurfOut.pixelHeight);
|
pSurfOut.pixelHeight = Math.Max(blockSize, pSurfOut.pixelHeight);
|
||||||
pSurfOut.pitch = Math.Max(1, pSurfOut.pitch);
|
pSurfOut.pitch = Math.Max(1, pSurfOut.pitch);
|
||||||
pSurfOut.height = Math.Max(1, pSurfOut.height);
|
pSurfOut.height = Math.Max(1, pSurfOut.height);
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
this.Format = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
this.Format = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
this.SwizzleNum = new System.Windows.Forms.NumericUpDown();
|
this.SwizzleNum = new System.Windows.Forms.NumericUpDown();
|
||||||
this.label5 = new System.Windows.Forms.Label();
|
this.label5 = new System.Windows.Forms.Label();
|
||||||
this.GPUAccessFlgComb = new System.Windows.Forms.ComboBox();
|
this.tileModeCB = new System.Windows.Forms.ComboBox();
|
||||||
this.label4 = new System.Windows.Forms.Label();
|
this.label4 = new System.Windows.Forms.Label();
|
||||||
this.ImgDimComb = new System.Windows.Forms.ComboBox();
|
this.ImgDimComb = new System.Windows.Forms.ComboBox();
|
||||||
this.label3 = new System.Windows.Forms.Label();
|
this.label3 = new System.Windows.Forms.Label();
|
||||||
|
@ -57,7 +57,7 @@
|
||||||
this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||||
this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
this.button2.ForeColor = System.Drawing.Color.White;
|
this.button2.ForeColor = System.Drawing.Color.White;
|
||||||
this.button2.Location = new System.Drawing.Point(941, 517);
|
this.button2.Location = new System.Drawing.Point(1009, 517);
|
||||||
this.button2.Name = "button2";
|
this.button2.Name = "button2";
|
||||||
this.button2.Size = new System.Drawing.Size(79, 33);
|
this.button2.Size = new System.Drawing.Size(79, 33);
|
||||||
this.button2.TabIndex = 5;
|
this.button2.TabIndex = 5;
|
||||||
|
@ -69,7 +69,7 @@
|
||||||
this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
|
this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||||
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
this.button1.ForeColor = System.Drawing.Color.White;
|
this.button1.ForeColor = System.Drawing.Color.White;
|
||||||
this.button1.Location = new System.Drawing.Point(843, 517);
|
this.button1.Location = new System.Drawing.Point(911, 517);
|
||||||
this.button1.Name = "button1";
|
this.button1.Name = "button1";
|
||||||
this.button1.Size = new System.Drawing.Size(79, 33);
|
this.button1.Size = new System.Drawing.Size(79, 33);
|
||||||
this.button1.TabIndex = 4;
|
this.button1.TabIndex = 4;
|
||||||
|
@ -121,23 +121,23 @@
|
||||||
this.label5.TabIndex = 27;
|
this.label5.TabIndex = 27;
|
||||||
this.label5.Text = "Swizzle";
|
this.label5.Text = "Swizzle";
|
||||||
//
|
//
|
||||||
// GPUAccessFlgComb
|
// tileModeCB
|
||||||
//
|
//
|
||||||
this.GPUAccessFlgComb.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
this.tileModeCB.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
this.GPUAccessFlgComb.FormattingEnabled = true;
|
this.tileModeCB.FormattingEnabled = true;
|
||||||
this.GPUAccessFlgComb.Location = new System.Drawing.Point(855, 79);
|
this.tileModeCB.Location = new System.Drawing.Point(855, 79);
|
||||||
this.GPUAccessFlgComb.Name = "GPUAccessFlgComb";
|
this.tileModeCB.Name = "tileModeCB";
|
||||||
this.GPUAccessFlgComb.Size = new System.Drawing.Size(172, 21);
|
this.tileModeCB.Size = new System.Drawing.Size(233, 21);
|
||||||
this.GPUAccessFlgComb.TabIndex = 26;
|
this.tileModeCB.TabIndex = 26;
|
||||||
//
|
//
|
||||||
// label4
|
// label4
|
||||||
//
|
//
|
||||||
this.label4.AutoSize = true;
|
this.label4.AutoSize = true;
|
||||||
this.label4.Location = new System.Drawing.Point(759, 82);
|
this.label4.Location = new System.Drawing.Point(759, 82);
|
||||||
this.label4.Name = "label4";
|
this.label4.Name = "label4";
|
||||||
this.label4.Size = new System.Drawing.Size(96, 13);
|
this.label4.Size = new System.Drawing.Size(54, 13);
|
||||||
this.label4.TabIndex = 25;
|
this.label4.TabIndex = 25;
|
||||||
this.label4.Text = "GPU Access Flags";
|
this.label4.Text = "Tile Mode";
|
||||||
//
|
//
|
||||||
// ImgDimComb
|
// ImgDimComb
|
||||||
//
|
//
|
||||||
|
@ -145,7 +145,7 @@
|
||||||
this.ImgDimComb.FormattingEnabled = true;
|
this.ImgDimComb.FormattingEnabled = true;
|
||||||
this.ImgDimComb.Location = new System.Drawing.Point(853, 46);
|
this.ImgDimComb.Location = new System.Drawing.Point(853, 46);
|
||||||
this.ImgDimComb.Name = "ImgDimComb";
|
this.ImgDimComb.Name = "ImgDimComb";
|
||||||
this.ImgDimComb.Size = new System.Drawing.Size(172, 21);
|
this.ImgDimComb.Size = new System.Drawing.Size(233, 21);
|
||||||
this.ImgDimComb.TabIndex = 24;
|
this.ImgDimComb.TabIndex = 24;
|
||||||
//
|
//
|
||||||
// label3
|
// label3
|
||||||
|
@ -222,7 +222,7 @@
|
||||||
this.formatComboBox.FormattingEnabled = true;
|
this.formatComboBox.FormattingEnabled = true;
|
||||||
this.formatComboBox.Location = new System.Drawing.Point(853, 16);
|
this.formatComboBox.Location = new System.Drawing.Point(853, 16);
|
||||||
this.formatComboBox.Name = "formatComboBox";
|
this.formatComboBox.Name = "formatComboBox";
|
||||||
this.formatComboBox.Size = new System.Drawing.Size(172, 21);
|
this.formatComboBox.Size = new System.Drawing.Size(233, 21);
|
||||||
this.formatComboBox.TabIndex = 16;
|
this.formatComboBox.TabIndex = 16;
|
||||||
this.formatComboBox.SelectedIndexChanged += new System.EventHandler(this.formatComboBox_SelectedIndexChanged);
|
this.formatComboBox.SelectedIndexChanged += new System.EventHandler(this.formatComboBox_SelectedIndexChanged);
|
||||||
//
|
//
|
||||||
|
@ -231,10 +231,10 @@
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||||
this.ClientSize = new System.Drawing.Size(1036, 562);
|
this.ClientSize = new System.Drawing.Size(1100, 562);
|
||||||
this.Controls.Add(this.SwizzleNum);
|
this.Controls.Add(this.SwizzleNum);
|
||||||
this.Controls.Add(this.label5);
|
this.Controls.Add(this.label5);
|
||||||
this.Controls.Add(this.GPUAccessFlgComb);
|
this.Controls.Add(this.tileModeCB);
|
||||||
this.Controls.Add(this.label4);
|
this.Controls.Add(this.label4);
|
||||||
this.Controls.Add(this.ImgDimComb);
|
this.Controls.Add(this.ImgDimComb);
|
||||||
this.Controls.Add(this.label3);
|
this.Controls.Add(this.label3);
|
||||||
|
@ -265,7 +265,7 @@
|
||||||
private Switch_Toolbox.Library.Forms.ListViewCustom listViewCustom1;
|
private Switch_Toolbox.Library.Forms.ListViewCustom listViewCustom1;
|
||||||
private System.Windows.Forms.NumericUpDown SwizzleNum;
|
private System.Windows.Forms.NumericUpDown SwizzleNum;
|
||||||
private System.Windows.Forms.Label label5;
|
private System.Windows.Forms.Label label5;
|
||||||
private System.Windows.Forms.ComboBox GPUAccessFlgComb;
|
private System.Windows.Forms.ComboBox tileModeCB;
|
||||||
private System.Windows.Forms.Label label4;
|
private System.Windows.Forms.Label label4;
|
||||||
private System.Windows.Forms.ComboBox ImgDimComb;
|
private System.Windows.Forms.ComboBox ImgDimComb;
|
||||||
private System.Windows.Forms.Label label3;
|
private System.Windows.Forms.Label label3;
|
||||||
|
|
|
@ -62,9 +62,9 @@ namespace FirstPlugin
|
||||||
{
|
{
|
||||||
ImgDimComb.Items.Add(dim);
|
ImgDimComb.Items.Add(dim);
|
||||||
}
|
}
|
||||||
GPUAccessFlgComb.Items.Add("Texture");
|
tileModeCB.Items.Add("Texture");
|
||||||
ImgDimComb.SelectedIndex = 1;
|
ImgDimComb.SelectedIndex = 1;
|
||||||
GPUAccessFlgComb.SelectedIndex = 0;
|
tileModeCB.SelectedIndex = 0;
|
||||||
formatComboBox.SelectedItem = SurfaceFormat.BC1_SRGB;
|
formatComboBox.SelectedItem = SurfaceFormat.BC1_SRGB;
|
||||||
}
|
}
|
||||||
TextureImporterSettings SelectedTexSettings;
|
TextureImporterSettings SelectedTexSettings;
|
||||||
|
|
375
Switch_FileFormatsMain/GUI/TextureUI/GTXImporterSettings.cs
Normal file
375
Switch_FileFormatsMain/GUI/TextureUI/GTXImporterSettings.cs
Normal file
|
@ -0,0 +1,375 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.IO;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Switch_Toolbox.Library;
|
||||||
|
using Switch_Toolbox.Library.IO;
|
||||||
|
using Syroot.NintenTools.Bfres.GX2;
|
||||||
|
|
||||||
|
namespace FirstPlugin
|
||||||
|
{
|
||||||
|
public class GTXImporterSettings
|
||||||
|
{
|
||||||
|
public string TexName;
|
||||||
|
public uint TexWidth;
|
||||||
|
public uint TexHeight;
|
||||||
|
public uint MipCount;
|
||||||
|
public uint bpp;
|
||||||
|
public uint Depth = 1;
|
||||||
|
public uint arrayLength = 1;
|
||||||
|
public List<byte[]> DataBlockOutput = new List<byte[]>();
|
||||||
|
public List<byte[]> DecompressedData = new List<byte[]>();
|
||||||
|
public GTX.GX2SurfaceFormat Format;
|
||||||
|
public bool GenerateMipmaps;
|
||||||
|
public bool IsSRGB;
|
||||||
|
public uint tileMode = 4;
|
||||||
|
public uint swizzle = 4;
|
||||||
|
public GX2CompSel[] compSel = new GX2CompSel[4];
|
||||||
|
public GX2SurfaceDim SurfaceDim = GX2SurfaceDim.Dim2D;
|
||||||
|
public GX2AAMode AAMode = GX2AAMode.Mode1X;
|
||||||
|
|
||||||
|
private GTX.GX2SurfaceFormat LoadDDSFormat(uint fourCC, DDS dds = null, bool IsSRGB = false)
|
||||||
|
{
|
||||||
|
bool IsDX10 = false;
|
||||||
|
|
||||||
|
switch (fourCC)
|
||||||
|
{
|
||||||
|
case DDS.FOURCC_DXT1:
|
||||||
|
if (IsSRGB)
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC1_SRGB;
|
||||||
|
else
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC1_UNORM;
|
||||||
|
case DDS.FOURCC_DXT3:
|
||||||
|
if (IsSRGB)
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC2_SRGB;
|
||||||
|
else
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC2_UNORM;
|
||||||
|
case DDS.FOURCC_DXT5:
|
||||||
|
if (IsSRGB)
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC3_SRGB;
|
||||||
|
else
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC3_UNORM;
|
||||||
|
case DDS.FOURCC_BC4U:
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC4_UNORM;
|
||||||
|
case DDS.FOURCC_ATI1:
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC4_UNORM;
|
||||||
|
case DDS.FOURCC_ATI2:
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC5_UNORM;
|
||||||
|
case DDS.FOURCC_BC5U:
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC4_UNORM;
|
||||||
|
case DDS.FOURCC_DX10:
|
||||||
|
IsDX10 = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM;
|
||||||
|
}
|
||||||
|
if (IsDX10)
|
||||||
|
{
|
||||||
|
switch (dds.DX10header.DXGI_Format)
|
||||||
|
{
|
||||||
|
case DDS.DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM:
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC4_UNORM;
|
||||||
|
case DDS.DXGI_FORMAT.DXGI_FORMAT_BC4_SNORM:
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC4_SNORM;
|
||||||
|
case DDS.DXGI_FORMAT.DXGI_FORMAT_BC4_TYPELESS:
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC4_UNORM;
|
||||||
|
case DDS.DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM:
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC5_UNORM;
|
||||||
|
case DDS.DXGI_FORMAT.DXGI_FORMAT_BC5_SNORM:
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC5_SNORM;
|
||||||
|
case DDS.DXGI_FORMAT.DXGI_FORMAT_BC5_TYPELESS:
|
||||||
|
return GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC5_UNORM;
|
||||||
|
default:
|
||||||
|
throw new Exception($"Format {dds.DX10header.DXGI_Format} not supported!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new Exception($"This shouldn't happen :(");
|
||||||
|
}
|
||||||
|
public void LoadDDS(string FileName, byte[] FileData = null)
|
||||||
|
{
|
||||||
|
TexName = Path.GetFileNameWithoutExtension(FileName);
|
||||||
|
|
||||||
|
DDS dds = new DDS();
|
||||||
|
|
||||||
|
if (FileData != null)
|
||||||
|
dds.Load(new FileReader(new MemoryStream(FileData)));
|
||||||
|
else
|
||||||
|
dds.Load(new FileReader(FileName));
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
DataBlockOutput.Add(dds.bdata);
|
||||||
|
|
||||||
|
Format = LoadDDSFormat(dds.header.ddspf.fourCC, dds, IsSRGB);
|
||||||
|
|
||||||
|
GTX.GX2Surface tex = CreateGx2Texture(DataBlockOutput[0]);
|
||||||
|
}
|
||||||
|
public void LoadBitMap(string FileName)
|
||||||
|
{
|
||||||
|
DecompressedData.Clear();
|
||||||
|
|
||||||
|
TexName = Path.GetFileNameWithoutExtension(FileName);
|
||||||
|
Format = GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC1_SRGB;
|
||||||
|
GenerateMipmaps = true;
|
||||||
|
|
||||||
|
Bitmap Image = new Bitmap(FileName);
|
||||||
|
Image = TextureData.SwapBlueRedChannels(Image);
|
||||||
|
|
||||||
|
TexWidth = (uint)Image.Width;
|
||||||
|
TexHeight = (uint)Image.Height;
|
||||||
|
MipCount = (uint)GetTotalMipCount();
|
||||||
|
|
||||||
|
DecompressedData.Add(BitmapExtension.ImageToByte(Image));
|
||||||
|
|
||||||
|
Image.Dispose();
|
||||||
|
if (DecompressedData.Count == 0)
|
||||||
|
{
|
||||||
|
throw new Exception("Failed to load " + Format);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int GetTotalMipCount()
|
||||||
|
{
|
||||||
|
int MipmapNum = 0;
|
||||||
|
uint num = Math.Max(TexHeight, TexWidth);
|
||||||
|
|
||||||
|
int width = (int)TexWidth;
|
||||||
|
int height = (int)TexHeight;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
num >>= 1;
|
||||||
|
|
||||||
|
width = width / 2;
|
||||||
|
height = height / 2;
|
||||||
|
if (width <= 0 || height <= 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (num > 0)
|
||||||
|
++MipmapNum;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MipmapNum;
|
||||||
|
}
|
||||||
|
public byte[] GenerateMips(int SurfaceLevel = 0)
|
||||||
|
{
|
||||||
|
Bitmap Image = BitmapExtension.GetBitmap(DecompressedData[SurfaceLevel], (int)TexWidth, (int)TexHeight);
|
||||||
|
|
||||||
|
List<byte[]> mipmaps = new List<byte[]>();
|
||||||
|
mipmaps.Add(FTEX.CompressBlock(DecompressedData[SurfaceLevel], (int)TexWidth, (int)TexHeight, Format));
|
||||||
|
|
||||||
|
//while (Image.Width / 2 > 0 && Image.Height / 2 > 0)
|
||||||
|
// for (int mipLevel = 0; mipLevel < MipCount; mipLevel++)
|
||||||
|
for (int mipLevel = 0; mipLevel < MipCount; mipLevel++)
|
||||||
|
{
|
||||||
|
Image = BitmapExtension.Resize(Image, Image.Width / 2, Image.Height / 2);
|
||||||
|
mipmaps.Add(FTEX.CompressBlock(BitmapExtension.ImageToByte(Image), Image.Width, Image.Height, Format));
|
||||||
|
}
|
||||||
|
Image.Dispose();
|
||||||
|
|
||||||
|
return Utils.CombineByteArray(mipmaps.ToArray());
|
||||||
|
}
|
||||||
|
public void Compress()
|
||||||
|
{
|
||||||
|
DataBlockOutput.Clear();
|
||||||
|
foreach (var surface in DecompressedData)
|
||||||
|
{
|
||||||
|
DataBlockOutput.Add(FTEX.CompressBlock(surface, (int)TexWidth, (int)TexHeight, Format));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public GTX.GX2Surface CreateGx2Texture(byte[] imageData)
|
||||||
|
{
|
||||||
|
var surfOut = GTX.getSurfaceInfo(Format, TexWidth, TexHeight, 1, 1, tileMode, 0, 0);
|
||||||
|
uint imageSize = (uint)surfOut.surfSize;
|
||||||
|
uint alignment = surfOut.baseAlign;
|
||||||
|
uint pitch = surfOut.pitch;
|
||||||
|
uint mipSize = 0;
|
||||||
|
uint dataSize = (uint)imageData.Length;
|
||||||
|
|
||||||
|
if (imageData.Length <= 0)
|
||||||
|
throw new Exception($"Image is empty!!");
|
||||||
|
|
||||||
|
if (surfOut.depth != 1)
|
||||||
|
throw new Exception($"Unsupported Depth {surfOut.depth}!");
|
||||||
|
|
||||||
|
uint s = 0;
|
||||||
|
switch (tileMode)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
case 16:
|
||||||
|
s = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
s = 0xd0000 | swizzle << 8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
uint blkWidth, blkHeight;
|
||||||
|
if (GTX.IsFormatBCN(Format))
|
||||||
|
{
|
||||||
|
blkWidth = 4;
|
||||||
|
blkHeight = 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
blkWidth = 1;
|
||||||
|
blkHeight = 1;
|
||||||
|
}
|
||||||
|
List<uint> mipOffsets = new List<uint>();
|
||||||
|
List<byte[]> Swizzled = new List<byte[]>();
|
||||||
|
|
||||||
|
byte[] data;
|
||||||
|
for (int mipLevel = 0; mipLevel < MipCount; mipLevel++)
|
||||||
|
{
|
||||||
|
var result = TextureHelper.GetCurrentMipSize(TexWidth, TexHeight, blkWidth, blkHeight, bpp, mipLevel);
|
||||||
|
uint offset = result.Item1;
|
||||||
|
uint size = result.Item2;
|
||||||
|
|
||||||
|
byte[] data_ = Utils.SubArray(imageData, offset, size);
|
||||||
|
|
||||||
|
uint width_ = Math.Max(1, TexWidth >> mipLevel);
|
||||||
|
uint height_ = Math.Max(1, TexHeight >> mipLevel);
|
||||||
|
|
||||||
|
|
||||||
|
if (mipLevel != 0)
|
||||||
|
{
|
||||||
|
surfOut = GTX.getSurfaceInfo(Format, TexWidth, TexHeight, 1, 1, tileMode, 0, mipLevel);
|
||||||
|
|
||||||
|
if (mipLevel == 1)
|
||||||
|
{
|
||||||
|
if (mipLevel == 1)
|
||||||
|
mipOffsets.Add(imageSize);
|
||||||
|
else
|
||||||
|
mipOffsets.Add(mipSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data_ = Utils.CombineByteArray(data_, new byte[surfOut.surfSize - size]);
|
||||||
|
byte[] dataAlignBytes = new byte[RoundUp(mipSize, surfOut.baseAlign) - mipSize];
|
||||||
|
|
||||||
|
if (mipLevel != 0)
|
||||||
|
mipSize += (uint)(surfOut.surfSize + dataAlignBytes.Length);
|
||||||
|
|
||||||
|
Swizzled.Add(Utils.CombineByteArray(dataAlignBytes, GTX.swizzle(width_, height_, surfOut.height, (uint)Format, surfOut.tileMode, s,
|
||||||
|
surfOut.pitch, surfOut.bpp, data_)));
|
||||||
|
}
|
||||||
|
File.WriteAllBytes("NewSwizzle.bin",Swizzled[0]);
|
||||||
|
|
||||||
|
compSel[0] = GX2CompSel.ChannelR;
|
||||||
|
compSel[1] = GX2CompSel.ChannelG;
|
||||||
|
compSel[2] = GX2CompSel.ChannelB;
|
||||||
|
compSel[3] = GX2CompSel.ChannelA;
|
||||||
|
|
||||||
|
GTX.GX2Surface surf = new GTX.GX2Surface();
|
||||||
|
surf.depth = Depth;
|
||||||
|
surf.width = TexWidth;
|
||||||
|
surf.height = TexHeight;
|
||||||
|
surf.depth = 1;
|
||||||
|
surf.dim = (uint)SurfaceDim;
|
||||||
|
surf.bpp = GTX.surfaceGetBitsPerPixel((uint)Format >> 3);
|
||||||
|
surf.tileMode = tileMode;
|
||||||
|
surf.swizzle = s;
|
||||||
|
surf.resourceFlags = 0;
|
||||||
|
surf.pitch = surfOut.pitch;
|
||||||
|
surf.format = (uint)Format;
|
||||||
|
surf.numMips = MipCount;
|
||||||
|
surf.aa = (uint)AAMode;
|
||||||
|
surf.mipOffset = mipOffsets.ToArray();
|
||||||
|
surf.numMips = (uint)Swizzled.Count;
|
||||||
|
surf.alignment = alignment;
|
||||||
|
surf.mipSize = mipSize;
|
||||||
|
surf.imageSize = imageSize;
|
||||||
|
surf.data = Swizzled[0];
|
||||||
|
|
||||||
|
List<byte[]> mips = new List<byte[]>();
|
||||||
|
for (int mipLevel = 1; mipLevel < Swizzled.Count; mipLevel++)
|
||||||
|
{
|
||||||
|
mips.Add(Swizzled[mipLevel]);
|
||||||
|
}
|
||||||
|
surf.mipData = Utils.CombineByteArray(mips.ToArray());
|
||||||
|
mips.Clear();
|
||||||
|
|
||||||
|
Console.WriteLine("");
|
||||||
|
Console.WriteLine("// ----- GX2Surface Info ----- ");
|
||||||
|
Console.WriteLine(" dim = 1");
|
||||||
|
Console.WriteLine(" width = " + surf.width);
|
||||||
|
Console.WriteLine(" height = " + surf.height);
|
||||||
|
Console.WriteLine(" depth = 1");
|
||||||
|
Console.WriteLine(" numMips = " + surf.numMips);
|
||||||
|
Console.WriteLine(" format = " + surf.format);
|
||||||
|
Console.WriteLine(" aa = 0");
|
||||||
|
Console.WriteLine(" use = 1");
|
||||||
|
Console.WriteLine(" imageSize = " + surf.imageSize);
|
||||||
|
Console.WriteLine(" mipSize = " + surf.mipSize);
|
||||||
|
Console.WriteLine(" tileMode = " + surf.tileMode);
|
||||||
|
Console.WriteLine(" swizzle = " + surf.swizzle);
|
||||||
|
Console.WriteLine(" alignment = " + surf.alignment);
|
||||||
|
Console.WriteLine(" pitch = " + surf.pitch);
|
||||||
|
Console.WriteLine("");
|
||||||
|
Console.WriteLine(" GX2 Component Selector:");
|
||||||
|
Console.WriteLine(" Red Channel: " + compSel[0]);
|
||||||
|
Console.WriteLine(" Green Channel: " + compSel[1]);
|
||||||
|
Console.WriteLine(" Blue Channel: " + compSel[2]);
|
||||||
|
Console.WriteLine(" Alpha Channel: " + compSel[3]);
|
||||||
|
Console.WriteLine("");
|
||||||
|
Console.WriteLine(" bits per pixel = " + (surf.bpp << 3));
|
||||||
|
Console.WriteLine(" bytes per pixel = " + surf.bpp);
|
||||||
|
Console.WriteLine(" realSize = " + imageData.Length);
|
||||||
|
|
||||||
|
|
||||||
|
return surf;
|
||||||
|
}
|
||||||
|
private static Tuple<uint, uint> GetCurrentMipSize(uint width, uint height, uint bpp, int CurLevel, bool IsCompressed)
|
||||||
|
{
|
||||||
|
uint offset = 0;
|
||||||
|
uint size = 0;
|
||||||
|
|
||||||
|
for (int mipLevel = 0; mipLevel < CurLevel; mipLevel++)
|
||||||
|
{
|
||||||
|
int level = mipLevel + 1;
|
||||||
|
if (IsCompressed)
|
||||||
|
offset += ((Math.Max(1, width >> level) + 3) >> 2) * ((Math.Max(1, height >> level) + 3) >> 2) * bpp;
|
||||||
|
else
|
||||||
|
offset += Math.Max(1, width >> level) * Math.Max(1, height >> level) * bpp;
|
||||||
|
}
|
||||||
|
if (IsCompressed)
|
||||||
|
size = ((Math.Max(1, width >> CurLevel) + 3) >> 2) * ((Math.Max(1, height >> CurLevel) + 3) >> 2) * bpp;
|
||||||
|
else
|
||||||
|
size = Math.Max(1, width >> CurLevel) * Math.Max(1, height >> CurLevel) * bpp;
|
||||||
|
|
||||||
|
return Tuple.Create(offset, size);
|
||||||
|
|
||||||
|
}
|
||||||
|
private uint getAlignBlockSize(uint dataOffset, uint alignment)
|
||||||
|
{
|
||||||
|
uint alignSize = RoundUp(dataOffset, alignment) - dataOffset - 32;
|
||||||
|
|
||||||
|
uint z = 1;
|
||||||
|
while (alignSize <= 0)
|
||||||
|
{
|
||||||
|
alignSize = RoundUp(dataOffset + (alignment * z), alignment) - dataOffset - 32;
|
||||||
|
z += 1;
|
||||||
|
}
|
||||||
|
return alignSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int RoundUp(int X, int Y)
|
||||||
|
{
|
||||||
|
return ((X - 1) | (Y - 1)) + 1;
|
||||||
|
}
|
||||||
|
private uint RoundUp(uint X, uint Y)
|
||||||
|
{
|
||||||
|
return ((X - 1) | (Y - 1)) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
281
Switch_FileFormatsMain/GUI/TextureUI/GTXTextureImporter.Designer.cs
generated
Normal file
281
Switch_FileFormatsMain/GUI/TextureUI/GTXTextureImporter.Designer.cs
generated
Normal file
|
@ -0,0 +1,281 @@
|
||||||
|
namespace FirstPlugin
|
||||||
|
{
|
||||||
|
partial class GTXTextureImporter
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GTXTextureImporter));
|
||||||
|
this.SwizzleNum = new System.Windows.Forms.NumericUpDown();
|
||||||
|
this.label5 = new System.Windows.Forms.Label();
|
||||||
|
this.tileModeCB = new System.Windows.Forms.ComboBox();
|
||||||
|
this.label4 = new System.Windows.Forms.Label();
|
||||||
|
this.ImgDimComb = new System.Windows.Forms.ComboBox();
|
||||||
|
this.label3 = new System.Windows.Forms.Label();
|
||||||
|
this.label2 = new System.Windows.Forms.Label();
|
||||||
|
this.label1 = new System.Windows.Forms.Label();
|
||||||
|
this.MipmapNum = new System.Windows.Forms.NumericUpDown();
|
||||||
|
this.WidthLabel = new System.Windows.Forms.Label();
|
||||||
|
this.HeightLabel = new System.Windows.Forms.Label();
|
||||||
|
this.formatComboBox = new System.Windows.Forms.ComboBox();
|
||||||
|
this.listViewCustom1 = new Switch_Toolbox.Library.Forms.ListViewCustom();
|
||||||
|
this.Name = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
|
this.Format = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
|
this.button2 = new System.Windows.Forms.Button();
|
||||||
|
this.button1 = new System.Windows.Forms.Button();
|
||||||
|
this.pictureBox1 = new Switch_Toolbox.Library.Forms.PictureBoxCustom();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.SwizzleNum)).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.MipmapNum)).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// SwizzleNum
|
||||||
|
//
|
||||||
|
this.SwizzleNum.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
|
||||||
|
this.SwizzleNum.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||||
|
this.SwizzleNum.ForeColor = System.Drawing.Color.White;
|
||||||
|
this.SwizzleNum.Location = new System.Drawing.Point(877, 142);
|
||||||
|
this.SwizzleNum.Name = "SwizzleNum";
|
||||||
|
this.SwizzleNum.Size = new System.Drawing.Size(130, 16);
|
||||||
|
this.SwizzleNum.TabIndex = 44;
|
||||||
|
//
|
||||||
|
// label5
|
||||||
|
//
|
||||||
|
this.label5.AutoSize = true;
|
||||||
|
this.label5.Location = new System.Drawing.Point(769, 142);
|
||||||
|
this.label5.Name = "label5";
|
||||||
|
this.label5.Size = new System.Drawing.Size(42, 13);
|
||||||
|
this.label5.TabIndex = 43;
|
||||||
|
this.label5.Text = "Swizzle";
|
||||||
|
//
|
||||||
|
// tileModeCB
|
||||||
|
//
|
||||||
|
this.tileModeCB.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.tileModeCB.FormattingEnabled = true;
|
||||||
|
this.tileModeCB.Location = new System.Drawing.Point(877, 69);
|
||||||
|
this.tileModeCB.Name = "tileModeCB";
|
||||||
|
this.tileModeCB.Size = new System.Drawing.Size(172, 21);
|
||||||
|
this.tileModeCB.TabIndex = 42;
|
||||||
|
this.tileModeCB.SelectedIndexChanged += new System.EventHandler(this.tileModeCB_SelectedIndexChanged);
|
||||||
|
//
|
||||||
|
// label4
|
||||||
|
//
|
||||||
|
this.label4.AutoSize = true;
|
||||||
|
this.label4.Location = new System.Drawing.Point(769, 72);
|
||||||
|
this.label4.Name = "label4";
|
||||||
|
this.label4.Size = new System.Drawing.Size(54, 13);
|
||||||
|
this.label4.TabIndex = 41;
|
||||||
|
this.label4.Text = "Tile Mode";
|
||||||
|
//
|
||||||
|
// ImgDimComb
|
||||||
|
//
|
||||||
|
this.ImgDimComb.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.ImgDimComb.FormattingEnabled = true;
|
||||||
|
this.ImgDimComb.Location = new System.Drawing.Point(875, 36);
|
||||||
|
this.ImgDimComb.Name = "ImgDimComb";
|
||||||
|
this.ImgDimComb.Size = new System.Drawing.Size(172, 21);
|
||||||
|
this.ImgDimComb.TabIndex = 40;
|
||||||
|
//
|
||||||
|
// label3
|
||||||
|
//
|
||||||
|
this.label3.AutoSize = true;
|
||||||
|
this.label3.Location = new System.Drawing.Point(769, 39);
|
||||||
|
this.label3.Name = "label3";
|
||||||
|
this.label3.Size = new System.Drawing.Size(88, 13);
|
||||||
|
this.label3.TabIndex = 39;
|
||||||
|
this.label3.Text = "Image Dimension";
|
||||||
|
//
|
||||||
|
// label2
|
||||||
|
//
|
||||||
|
this.label2.AutoSize = true;
|
||||||
|
this.label2.Location = new System.Drawing.Point(766, 9);
|
||||||
|
this.label2.Name = "label2";
|
||||||
|
this.label2.Size = new System.Drawing.Size(39, 13);
|
||||||
|
this.label2.TabIndex = 38;
|
||||||
|
this.label2.Text = "Format";
|
||||||
|
//
|
||||||
|
// label1
|
||||||
|
//
|
||||||
|
this.label1.AutoSize = true;
|
||||||
|
this.label1.Location = new System.Drawing.Point(769, 107);
|
||||||
|
this.label1.Name = "label1";
|
||||||
|
this.label1.Size = new System.Drawing.Size(90, 13);
|
||||||
|
this.label1.TabIndex = 37;
|
||||||
|
this.label1.Text = "Number MipMaps";
|
||||||
|
//
|
||||||
|
// MipmapNum
|
||||||
|
//
|
||||||
|
this.MipmapNum.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
|
||||||
|
this.MipmapNum.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||||
|
this.MipmapNum.ForeColor = System.Drawing.Color.White;
|
||||||
|
this.MipmapNum.Location = new System.Drawing.Point(877, 105);
|
||||||
|
this.MipmapNum.Name = "MipmapNum";
|
||||||
|
this.MipmapNum.Size = new System.Drawing.Size(130, 16);
|
||||||
|
this.MipmapNum.TabIndex = 36;
|
||||||
|
//
|
||||||
|
// WidthLabel
|
||||||
|
//
|
||||||
|
this.WidthLabel.AutoSize = true;
|
||||||
|
this.WidthLabel.Location = new System.Drawing.Point(769, 210);
|
||||||
|
this.WidthLabel.Name = "WidthLabel";
|
||||||
|
this.WidthLabel.Size = new System.Drawing.Size(35, 13);
|
||||||
|
this.WidthLabel.TabIndex = 35;
|
||||||
|
this.WidthLabel.Text = "Width";
|
||||||
|
//
|
||||||
|
// HeightLabel
|
||||||
|
//
|
||||||
|
this.HeightLabel.AutoSize = true;
|
||||||
|
this.HeightLabel.Location = new System.Drawing.Point(769, 175);
|
||||||
|
this.HeightLabel.Name = "HeightLabel";
|
||||||
|
this.HeightLabel.Size = new System.Drawing.Size(38, 13);
|
||||||
|
this.HeightLabel.TabIndex = 34;
|
||||||
|
this.HeightLabel.Text = "Height";
|
||||||
|
//
|
||||||
|
// formatComboBox
|
||||||
|
//
|
||||||
|
this.formatComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.formatComboBox.FormattingEnabled = true;
|
||||||
|
this.formatComboBox.Location = new System.Drawing.Point(875, 6);
|
||||||
|
this.formatComboBox.Name = "formatComboBox";
|
||||||
|
this.formatComboBox.Size = new System.Drawing.Size(172, 21);
|
||||||
|
this.formatComboBox.TabIndex = 32;
|
||||||
|
this.formatComboBox.SelectedIndexChanged += new System.EventHandler(this.formatComboBox_SelectedIndexChanged);
|
||||||
|
//
|
||||||
|
// listViewCustom1
|
||||||
|
//
|
||||||
|
this.listViewCustom1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
|
||||||
|
this.listViewCustom1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
||||||
|
this.Name,
|
||||||
|
this.Format});
|
||||||
|
this.listViewCustom1.Dock = System.Windows.Forms.DockStyle.Left;
|
||||||
|
this.listViewCustom1.ForeColor = System.Drawing.Color.White;
|
||||||
|
this.listViewCustom1.Location = new System.Drawing.Point(0, 0);
|
||||||
|
this.listViewCustom1.Name = "listViewCustom1";
|
||||||
|
this.listViewCustom1.Size = new System.Drawing.Size(237, 515);
|
||||||
|
this.listViewCustom1.TabIndex = 31;
|
||||||
|
this.listViewCustom1.UseCompatibleStateImageBehavior = false;
|
||||||
|
this.listViewCustom1.View = System.Windows.Forms.View.Details;
|
||||||
|
this.listViewCustom1.SelectedIndexChanged += new System.EventHandler(this.listViewCustom1_SelectedIndexChanged);
|
||||||
|
//
|
||||||
|
// Name
|
||||||
|
//
|
||||||
|
this.Name.Text = "Name";
|
||||||
|
this.Name.Width = 104;
|
||||||
|
//
|
||||||
|
// Format
|
||||||
|
//
|
||||||
|
this.Format.Text = "Format";
|
||||||
|
//
|
||||||
|
// button2
|
||||||
|
//
|
||||||
|
this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||||
|
this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
|
this.button2.ForeColor = System.Drawing.Color.White;
|
||||||
|
this.button2.Location = new System.Drawing.Point(993, 470);
|
||||||
|
this.button2.Name = "button2";
|
||||||
|
this.button2.Size = new System.Drawing.Size(79, 33);
|
||||||
|
this.button2.TabIndex = 30;
|
||||||
|
this.button2.Text = "Cancel";
|
||||||
|
this.button2.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// button1
|
||||||
|
//
|
||||||
|
this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||||
|
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
|
this.button1.ForeColor = System.Drawing.Color.White;
|
||||||
|
this.button1.Location = new System.Drawing.Point(895, 470);
|
||||||
|
this.button1.Name = "button1";
|
||||||
|
this.button1.Size = new System.Drawing.Size(79, 33);
|
||||||
|
this.button1.TabIndex = 29;
|
||||||
|
this.button1.Text = "Ok";
|
||||||
|
this.button1.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// pictureBox1
|
||||||
|
//
|
||||||
|
this.pictureBox1.BackColor = System.Drawing.Color.Transparent;
|
||||||
|
this.pictureBox1.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.BackgroundImage")));
|
||||||
|
this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Left;
|
||||||
|
this.pictureBox1.Location = new System.Drawing.Point(237, 0);
|
||||||
|
this.pictureBox1.Name = "pictureBox1";
|
||||||
|
this.pictureBox1.Size = new System.Drawing.Size(513, 515);
|
||||||
|
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
|
||||||
|
this.pictureBox1.TabIndex = 33;
|
||||||
|
this.pictureBox1.TabStop = false;
|
||||||
|
//
|
||||||
|
// GTXTextureImporter
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40)))));
|
||||||
|
this.ClientSize = new System.Drawing.Size(1084, 515);
|
||||||
|
this.Controls.Add(this.SwizzleNum);
|
||||||
|
this.Controls.Add(this.label5);
|
||||||
|
this.Controls.Add(this.tileModeCB);
|
||||||
|
this.Controls.Add(this.label4);
|
||||||
|
this.Controls.Add(this.ImgDimComb);
|
||||||
|
this.Controls.Add(this.label3);
|
||||||
|
this.Controls.Add(this.label2);
|
||||||
|
this.Controls.Add(this.label1);
|
||||||
|
this.Controls.Add(this.MipmapNum);
|
||||||
|
this.Controls.Add(this.WidthLabel);
|
||||||
|
this.Controls.Add(this.HeightLabel);
|
||||||
|
this.Controls.Add(this.pictureBox1);
|
||||||
|
this.Controls.Add(this.formatComboBox);
|
||||||
|
this.Controls.Add(this.listViewCustom1);
|
||||||
|
this.Controls.Add(this.button2);
|
||||||
|
this.Controls.Add(this.button1);
|
||||||
|
this.ForeColor = System.Drawing.Color.White;
|
||||||
|
this.Text = "GTXTextureImporter";
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.SwizzleNum)).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.MipmapNum)).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.NumericUpDown SwizzleNum;
|
||||||
|
private System.Windows.Forms.Label label5;
|
||||||
|
private System.Windows.Forms.ComboBox tileModeCB;
|
||||||
|
private System.Windows.Forms.Label label4;
|
||||||
|
private System.Windows.Forms.ComboBox ImgDimComb;
|
||||||
|
private System.Windows.Forms.Label label3;
|
||||||
|
private System.Windows.Forms.Label label2;
|
||||||
|
private System.Windows.Forms.Label label1;
|
||||||
|
private System.Windows.Forms.NumericUpDown MipmapNum;
|
||||||
|
private System.Windows.Forms.Label WidthLabel;
|
||||||
|
private System.Windows.Forms.Label HeightLabel;
|
||||||
|
private Switch_Toolbox.Library.Forms.PictureBoxCustom pictureBox1;
|
||||||
|
private System.Windows.Forms.ComboBox formatComboBox;
|
||||||
|
private Switch_Toolbox.Library.Forms.ListViewCustom listViewCustom1;
|
||||||
|
private System.Windows.Forms.ColumnHeader Name;
|
||||||
|
private System.Windows.Forms.ColumnHeader Format;
|
||||||
|
private System.Windows.Forms.Button button2;
|
||||||
|
private System.Windows.Forms.Button button1;
|
||||||
|
}
|
||||||
|
}
|
145
Switch_FileFormatsMain/GUI/TextureUI/GTXTextureImporter.cs
Normal file
145
Switch_FileFormatsMain/GUI/TextureUI/GTXTextureImporter.cs
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace FirstPlugin
|
||||||
|
{
|
||||||
|
public partial class GTXTextureImporter : Form
|
||||||
|
{
|
||||||
|
public GTXTextureImporter()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_SRGB);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_TCS_R10_G10_B10_A2_UNORM);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_TCS_R5_G6_B5_UNORM);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_TC_R5_G5_B5_A1_UNORM);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_TC_R4_G4_B4_A4_UNORM);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_TC_R8_UNORM);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_TC_R8_G8_UNORM);
|
||||||
|
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC1_UNORM);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC1_SRGB);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC2_UNORM);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC2_SRGB);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC3_UNORM);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC3_SRGB);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC4_UNORM);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC4_SNORM);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC5_UNORM);
|
||||||
|
formatComboBox.Items.Add(GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC5_SNORM);
|
||||||
|
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_DEFAULT);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_LINEAR_ALIGNED);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_1D_TILED_THIN1);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_1D_TILED_THICK);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_2D_TILED_THIN1);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_2D_TILED_THIN2);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_2D_TILED_THIN4);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_2D_TILED_THICK);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_2B_TILED_THIN1);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_2B_TILED_THIN2);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_2B_TILED_THIN4);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_2B_TILED_THICK);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_3D_TILED_THIN1);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_3D_TILED_THICK);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_3B_TILED_THIN1);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_3B_TILED_THICK);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_LINEAR_SPECIAL);
|
||||||
|
tileModeCB.Items.Add(GTX.GX2TileMode.GX2_TILE_MODE_DEFAULT_FIX2197);
|
||||||
|
|
||||||
|
tileModeCB.SelectedItem = GTX.GX2TileMode.GX2_TILE_MODE_2D_TILED_THIN1;
|
||||||
|
formatComboBox.SelectedItem = GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC1_SRGB;
|
||||||
|
}
|
||||||
|
GTXImporterSettings SelectedTexSettings;
|
||||||
|
|
||||||
|
List<GTXImporterSettings> settings = new List<GTXImporterSettings>();
|
||||||
|
public void LoadSettings(List<GTXImporterSettings> s)
|
||||||
|
{
|
||||||
|
settings = s;
|
||||||
|
|
||||||
|
foreach (var setting in settings)
|
||||||
|
{
|
||||||
|
listViewCustom1.Items.Add(setting.TexName).SubItems.Add(setting.Format.ToString());
|
||||||
|
}
|
||||||
|
listViewCustom1.Items[0].Selected = true;
|
||||||
|
listViewCustom1.Select();
|
||||||
|
}
|
||||||
|
public void LoadSetting(GTXImporterSettings setting)
|
||||||
|
{
|
||||||
|
settings = new List<GTXImporterSettings>();
|
||||||
|
settings.Add(setting);
|
||||||
|
|
||||||
|
listViewCustom1.Items.Add(setting.TexName).SubItems.Add(setting.Format.ToString());
|
||||||
|
listViewCustom1.Items[0].Selected = true;
|
||||||
|
listViewCustom1.Select();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Thread Thread;
|
||||||
|
public void SetupSettings()
|
||||||
|
{
|
||||||
|
if (SelectedTexSettings.Format == GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_INVALID)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
if (Thread != null && Thread.IsAlive)
|
||||||
|
Thread.Abort();
|
||||||
|
|
||||||
|
if (formatComboBox.SelectedItem is GTX.GX2SurfaceFormat)
|
||||||
|
{
|
||||||
|
SelectedTexSettings.Format = (GTX.GX2SurfaceFormat)formatComboBox.SelectedItem;
|
||||||
|
listViewCustom1.SelectedItems[0].SubItems[1].Text = SelectedTexSettings.Format.ToString();
|
||||||
|
}
|
||||||
|
Bitmap bitmap = Switch_Toolbox.Library.Imaging.GetLoadingImage();
|
||||||
|
|
||||||
|
Thread = new Thread((ThreadStart)(() =>
|
||||||
|
{
|
||||||
|
pictureBox1.Image = bitmap;
|
||||||
|
SelectedTexSettings.Compress();
|
||||||
|
|
||||||
|
bitmap = FTEX.DecodeBlock(SelectedTexSettings.DataBlockOutput[0], SelectedTexSettings.
|
||||||
|
TexWidth, SelectedTexSettings.TexHeight, (Syroot.NintenTools.Bfres.GX2.GX2SurfaceFormat)SelectedTexSettings.Format);
|
||||||
|
|
||||||
|
pictureBox1.Image = bitmap;
|
||||||
|
|
||||||
|
}));
|
||||||
|
Thread.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tileModeCB_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (tileModeCB.SelectedIndex > -1 && SelectedTexSettings != null)
|
||||||
|
SelectedTexSettings.tileMode = (uint)tileModeCB.SelectedItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void formatComboBox_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (formatComboBox.SelectedIndex > -1 && SelectedTexSettings != null)
|
||||||
|
{
|
||||||
|
SetupSettings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void listViewCustom1_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (listViewCustom1.SelectedItems.Count > 0)
|
||||||
|
{
|
||||||
|
SelectedTexSettings = settings[listViewCustom1.SelectedIndices[0]];
|
||||||
|
formatComboBox.SelectedItem = SelectedTexSettings.Format;
|
||||||
|
|
||||||
|
SetupSettings();
|
||||||
|
|
||||||
|
MipmapNum.Maximum = SelectedTexSettings.GetTotalMipCount();
|
||||||
|
MipmapNum.Value = SelectedTexSettings.MipCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
328
Switch_FileFormatsMain/GUI/TextureUI/GTXTextureImporter.resx
Normal file
328
Switch_FileFormatsMain/GUI/TextureUI/GTXTextureImporter.resx
Normal file
|
@ -0,0 +1,328 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
|
<data name="pictureBox1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAMAAACJuGjuAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6
|
||||||
|
JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEXMzMzNzc3Ozs7Pz8/Q0NDR0dHS
|
||||||
|
0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm
|
||||||
|
5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6
|
||||||
|
+vr7+/v8/Pz9/f3+/v7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
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
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
|
@ -145,7 +145,7 @@ namespace FirstPlugin
|
||||||
DataBlockOutput.Add(dds.bdata);
|
DataBlockOutput.Add(dds.bdata);
|
||||||
|
|
||||||
|
|
||||||
Format = LoadDDSFormat(dds.header.ddspf.fourCC, dds, IsSRGB);
|
Format = LoadDDSFormat(dds.header.ddspf.fourCC.ToString(), dds, IsSRGB);
|
||||||
|
|
||||||
Texture tex = FromBitMap(DataBlockOutput[0], this);
|
Texture tex = FromBitMap(DataBlockOutput[0], this);
|
||||||
|
|
||||||
|
@ -237,31 +237,6 @@ namespace FirstPlugin
|
||||||
{
|
{
|
||||||
return TegraX1Swizzle.DIV_ROUND_UP(value1, value2);
|
return TegraX1Swizzle.DIV_ROUND_UP(value1, value2);
|
||||||
}
|
}
|
||||||
public static byte[] SubArray(byte[] data, uint offset, uint length)
|
|
||||||
{
|
|
||||||
return data.Skip((int)offset).Take((int)length).ToArray();
|
|
||||||
}
|
|
||||||
private static Tuple<uint, uint> GetCurrentMipSize(uint width, uint height, uint blkHeight, uint blkWidth, uint bpp, int CurLevel)
|
|
||||||
{
|
|
||||||
uint offset = 0;
|
|
||||||
uint width_ = 0;
|
|
||||||
uint height_ = 0;
|
|
||||||
|
|
||||||
for (int mipLevel = 0; mipLevel < CurLevel; mipLevel++)
|
|
||||||
{
|
|
||||||
width_ = DIV_ROUND_UP(Math.Max(1, width >> mipLevel), blkWidth);
|
|
||||||
height_ = DIV_ROUND_UP(Math.Max(1, height >> mipLevel), blkHeight);
|
|
||||||
|
|
||||||
offset += width_ * height_ * bpp;
|
|
||||||
}
|
|
||||||
|
|
||||||
width_ = DIV_ROUND_UP(Math.Max(1, width >> CurLevel), blkWidth);
|
|
||||||
height_ = DIV_ROUND_UP(Math.Max(1, height >> CurLevel), blkHeight);
|
|
||||||
|
|
||||||
uint size = width_ * height_ * bpp;
|
|
||||||
return Tuple.Create(offset, size);
|
|
||||||
|
|
||||||
}
|
|
||||||
public Texture FromBitMap(byte[] data, TextureImporterSettings settings)
|
public Texture FromBitMap(byte[] data, TextureImporterSettings settings)
|
||||||
{
|
{
|
||||||
Texture tex = new Texture();
|
Texture tex = new Texture();
|
||||||
|
@ -357,11 +332,11 @@ namespace FirstPlugin
|
||||||
List<byte[]> mipmaps = new List<byte[]>();
|
List<byte[]> mipmaps = new List<byte[]>();
|
||||||
for (int mipLevel = 0; mipLevel < tex.MipCount; mipLevel++)
|
for (int mipLevel = 0; mipLevel < tex.MipCount; mipLevel++)
|
||||||
{
|
{
|
||||||
var result = GetCurrentMipSize(tex.Width, tex.Height, blkWidth, blkHeight, bpp, mipLevel);
|
var result = TextureHelper.GetCurrentMipSize(tex.Width, tex.Height, blkWidth, blkHeight, bpp, mipLevel);
|
||||||
uint offset = result.Item1;
|
uint offset = result.Item1;
|
||||||
uint size = result.Item2;
|
uint size = result.Item2;
|
||||||
|
|
||||||
byte[] data_ = SubArray(data, offset, size);
|
byte[] data_ = Utils.SubArray(data, offset, size);
|
||||||
|
|
||||||
uint width_ = Math.Max(1, tex.Width >> mipLevel);
|
uint width_ = Math.Max(1, tex.Width >> mipLevel);
|
||||||
uint height_ = Math.Max(1, tex.Height >> mipLevel);
|
uint height_ = Math.Max(1, tex.Height >> mipLevel);
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<Optimize>false</Optimize>
|
<Optimize>false</Optimize>
|
||||||
<OutputPath>..\Switch_Toolbox\Lib\Plugins\</OutputPath>
|
<OutputPath>..\Switch_Toolbox\bin\Debug\Lib\Plugins\</OutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
|
@ -267,6 +267,13 @@
|
||||||
<DependentUpon>BfresShapeEditor.cs</DependentUpon>
|
<DependentUpon>BfresShapeEditor.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="GUI\FormLoader.cs" />
|
<Compile Include="GUI\FormLoader.cs" />
|
||||||
|
<Compile Include="GUI\TextureUI\GTXImporterSettings.cs" />
|
||||||
|
<Compile Include="GUI\TextureUI\GTXTextureImporter.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="GUI\TextureUI\GTXTextureImporter.Designer.cs">
|
||||||
|
<DependentUpon>GTXTextureImporter.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="GUI\TextureUI\XTXEditor.cs">
|
<Compile Include="GUI\TextureUI\XTXEditor.cs">
|
||||||
<SubType>UserControl</SubType>
|
<SubType>UserControl</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
@ -424,6 +431,9 @@
|
||||||
<EmbeddedResource Include="GUI\BFRES\BfresShapeEditor.resx">
|
<EmbeddedResource Include="GUI\BFRES\BfresShapeEditor.resx">
|
||||||
<DependentUpon>BfresShapeEditor.cs</DependentUpon>
|
<DependentUpon>BfresShapeEditor.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="GUI\TextureUI\GTXTextureImporter.resx">
|
||||||
|
<DependentUpon>GTXTextureImporter.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="GUI\TextureUI\XTXEditor.resx">
|
<EmbeddedResource Include="GUI\TextureUI\XTXEditor.resx">
|
||||||
<DependentUpon>XTXEditor.cs</DependentUpon>
|
<DependentUpon>XTXEditor.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
@ -490,7 +500,6 @@
|
||||||
<ProjectReference Include="..\Switch_Toolbox_Library\Switch_Toolbox_Library.csproj">
|
<ProjectReference Include="..\Switch_Toolbox_Library\Switch_Toolbox_Library.csproj">
|
||||||
<Project>{96820047-2a39-4e5a-bfa4-e84fff5c66cf}</Project>
|
<Project>{96820047-2a39-4e5a-bfa4-e84fff5c66cf}</Project>
|
||||||
<Name>Switch_Toolbox_Library</Name>
|
<Name>Switch_Toolbox_Library</Name>
|
||||||
<Private>False</Private>
|
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -18,8 +18,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Updater", "Updater\Updater.
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTex", "Switch_Toolbox\Lib\DirectXTex\DirectXTex.vcxproj", "{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTex", "Switch_Toolbox\Lib\DirectXTex\DirectXTex.vcxproj", "{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GTXDEBUG", "GTXDEBUG\GTXDEBUG.csproj", "{C610B02F-97AE-48A8-B967-1F4E97DB2903}"
|
|
||||||
EndProject
|
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
@ -68,21 +66,14 @@ Global
|
||||||
{D82A2C08-2A65-43AF-BDA6-A36CC27AA003}.Release|Any CPU.Build.0 = Release|Any CPU
|
{D82A2C08-2A65-43AF-BDA6-A36CC27AA003}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{D82A2C08-2A65-43AF-BDA6-A36CC27AA003}.Release|x64.ActiveCfg = Release|Any CPU
|
{D82A2C08-2A65-43AF-BDA6-A36CC27AA003}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{D82A2C08-2A65-43AF-BDA6-A36CC27AA003}.Release|x64.Build.0 = Release|Any CPU
|
{D82A2C08-2A65-43AF-BDA6-A36CC27AA003}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Debug|Any CPU.ActiveCfg = Debug|x64
|
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||||
|
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Debug|Any CPU.Build.0 = Debug|Win32
|
||||||
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Debug|x64.ActiveCfg = Debug|x64
|
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Debug|x64.Build.0 = Debug|x64
|
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Debug|x64.Build.0 = Debug|x64
|
||||||
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Release|Any CPU.ActiveCfg = Release|Win32
|
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||||
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Release|Any CPU.Build.0 = Release|Win32
|
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Release|Any CPU.Build.0 = Release|Win32
|
||||||
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Release|x64.ActiveCfg = Release|x64
|
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Release|x64.ActiveCfg = Release|x64
|
||||||
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Release|x64.Build.0 = Release|x64
|
{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}.Release|x64.Build.0 = Release|x64
|
||||||
{C610B02F-97AE-48A8-B967-1F4E97DB2903}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{C610B02F-97AE-48A8-B967-1F4E97DB2903}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{C610B02F-97AE-48A8-B967-1F4E97DB2903}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{C610B02F-97AE-48A8-B967-1F4E97DB2903}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{C610B02F-97AE-48A8-B967-1F4E97DB2903}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{C610B02F-97AE-48A8-B967-1F4E97DB2903}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{C610B02F-97AE-48A8-B967-1F4E97DB2903}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{C610B02F-97AE-48A8-B967-1F4E97DB2903}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
Binary file not shown.
|
@ -30,7 +30,6 @@
|
||||||
<ProjectGuid>{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}</ProjectGuid>
|
<ProjectGuid>{755AB64B-16B4-4C90-AA3B-BFF448E5A21E}</ProjectGuid>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>DirectXTex</RootNamespace>
|
<RootNamespace>DirectXTex</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
|
||||||
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
|
BIN
Switch_Toolbox/Lib/Plugins/AssimpNet.dll
Normal file
BIN
Switch_Toolbox/Lib/Plugins/AssimpNet.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
Switch_Toolbox/Lib/Plugins/DirectXTex.dll
Normal file
BIN
Switch_Toolbox/Lib/Plugins/DirectXTex.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Switch_Toolbox/Lib/Plugins/K4os.Compression.LZ4.Streams.dll
Normal file
BIN
Switch_Toolbox/Lib/Plugins/K4os.Compression.LZ4.Streams.dll
Normal file
Binary file not shown.
BIN
Switch_Toolbox/Lib/Plugins/K4os.Compression.LZ4.dll
Normal file
BIN
Switch_Toolbox/Lib/Plugins/K4os.Compression.LZ4.dll
Normal file
Binary file not shown.
BIN
Switch_Toolbox/Lib/Plugins/K4os.Hash.xxHash.dll
Normal file
BIN
Switch_Toolbox/Lib/Plugins/K4os.Hash.xxHash.dll
Normal file
Binary file not shown.
BIN
Switch_Toolbox/Lib/Plugins/LZ4.dll
Normal file
BIN
Switch_Toolbox/Lib/Plugins/LZ4.dll
Normal file
Binary file not shown.
BIN
Switch_Toolbox/Lib/Plugins/Octokit.dll
Normal file
BIN
Switch_Toolbox/Lib/Plugins/Octokit.dll
Normal file
Binary file not shown.
BIN
Switch_Toolbox/Lib/Plugins/Switch_Toolbox.Library.dll
Normal file
BIN
Switch_Toolbox/Lib/Plugins/Switch_Toolbox.Library.dll
Normal file
Binary file not shown.
19
Switch_Toolbox/Lib/Plugins/Switch_Toolbox.Library.dll.config
Normal file
19
Switch_Toolbox/Lib/Plugins/Switch_Toolbox.Library.dll.config
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<runtime>
|
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="OpenTK" publicKeyToken="bad199fe84eb3df4" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="LZ4pn" publicKeyToken="62e1b5ec1eec9bdd" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-1.0.10.93" newVersion="1.0.10.93" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="K4os.Hash.xxHash" publicKeyToken="32cd54395057cec3" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-1.0.5.0" newVersion="1.0.5.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
</assemblyBinding>
|
||||||
|
</runtime>
|
||||||
|
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /></startup></configuration>
|
BIN
Switch_Toolbox/Lib/Plugins/Switch_Toolbox.Library.pdb
Normal file
BIN
Switch_Toolbox/Lib/Plugins/Switch_Toolbox.Library.pdb
Normal file
Binary file not shown.
Binary file not shown.
BIN
Switch_Toolbox/Lib/Plugins/Syroot.NintenTools.Bfres.pdb
Normal file
BIN
Switch_Toolbox/Lib/Plugins/Syroot.NintenTools.Bfres.pdb
Normal file
Binary file not shown.
5730
Switch_Toolbox/Lib/Plugins/Syroot.NintenTools.Bfres.xml
Normal file
5730
Switch_Toolbox/Lib/Plugins/Syroot.NintenTools.Bfres.xml
Normal file
File diff suppressed because it is too large
Load diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -26,6 +26,7 @@
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
@ -266,7 +267,6 @@
|
||||||
<ProjectReference Include="..\Switch_Toolbox_Library\Switch_Toolbox_Library.csproj">
|
<ProjectReference Include="..\Switch_Toolbox_Library\Switch_Toolbox_Library.csproj">
|
||||||
<Project>{96820047-2a39-4e5a-bfa4-e84fff5c66cf}</Project>
|
<Project>{96820047-2a39-4e5a-bfa4-e84fff5c66cf}</Project>
|
||||||
<Name>Switch_Toolbox_Library</Name>
|
<Name>Switch_Toolbox_Library</Name>
|
||||||
<Private>False</Private>
|
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\Updater\Updater.csproj">
|
<ProjectReference Include="..\Updater\Updater.csproj">
|
||||||
<Project>{d82a2c08-2a65-43af-bda6-a36cc27aa003}</Project>
|
<Project>{d82a2c08-2a65-43af-bda6-a36cc27aa003}</Project>
|
||||||
|
|
9
Switch_Toolbox/Switch_Toolbox.csproj.user
Normal file
9
Switch_Toolbox/Switch_Toolbox.csproj.user
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
|
||||||
|
<EnableUnmanagedDebugging>true</EnableUnmanagedDebugging>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
|
||||||
|
<EnableUnmanagedDebugging>true</EnableUnmanagedDebugging>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
|
@ -18,6 +18,19 @@ namespace Switch_Toolbox.Library
|
||||||
//Data from https://github.com/jam1garner/Smash-Forge/blob/master/Smash%20Forge/Filetypes/Textures/DDS.cs
|
//Data from https://github.com/jam1garner/Smash-Forge/blob/master/Smash%20Forge/Filetypes/Textures/DDS.cs
|
||||||
public class DDS
|
public class DDS
|
||||||
{
|
{
|
||||||
|
public const uint FOURCC_DXT1 = 0x31545844;
|
||||||
|
public const uint FOURCC_DXT2 = 0x32545844;
|
||||||
|
public const uint FOURCC_DXT3 = 0x33545844;
|
||||||
|
public const uint FOURCC_DXT4 = 0x34545844;
|
||||||
|
public const uint FOURCC_DXT5 = 0x35545844;
|
||||||
|
public const uint FOURCC_ATI1 = 0x31495441;
|
||||||
|
public const uint FOURCC_BC4U = 0x55344342;
|
||||||
|
public const uint FOURCC_BC5U = 0x55354342;
|
||||||
|
public const uint FOURCC_DX10 = 0x30315844;
|
||||||
|
|
||||||
|
public const uint FOURCC_ATI2 = 0x32495441;
|
||||||
|
public const uint FOURCC_RXGB = 0x42475852;
|
||||||
|
|
||||||
public enum CubemapFace
|
public enum CubemapFace
|
||||||
{
|
{
|
||||||
PosX,
|
PosX,
|
||||||
|
@ -79,17 +92,21 @@ namespace Switch_Toolbox.Library
|
||||||
{
|
{
|
||||||
case 0x00000000: //RGBA
|
case 0x00000000: //RGBA
|
||||||
return 0x4;
|
return 0x4;
|
||||||
case 0x31545844: //DXT1
|
case FOURCC_DXT1:
|
||||||
return 0x8;
|
return 0x8;
|
||||||
case 0x33545844: //DXT3
|
case FOURCC_DXT2:
|
||||||
return 0x10;
|
return 0x10;
|
||||||
case 0x35545844: //DXT5
|
case FOURCC_DXT3:
|
||||||
return 0x10;
|
return 0x10;
|
||||||
case 0x31495441: //ATI1
|
case FOURCC_DXT4:
|
||||||
case 0x55344342: //BC4U
|
return 0x10;
|
||||||
|
case FOURCC_DXT5:
|
||||||
|
return 0x10;
|
||||||
|
case FOURCC_ATI1:
|
||||||
|
case FOURCC_BC4U:
|
||||||
return 0x8;
|
return 0x8;
|
||||||
case 0x32495441: //ATI2
|
case FOURCC_ATI2:
|
||||||
case 0x55354342: //BC5U
|
case FOURCC_BC5U:
|
||||||
return 0x10;
|
return 0x10;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -101,19 +118,21 @@ namespace Switch_Toolbox.Library
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM:
|
case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM:
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB:
|
case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB:
|
||||||
header.ddspf.fourCC = "DXT1";
|
header.ddspf.fourCC = FOURCC_DXT1;
|
||||||
break;
|
break;
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM:
|
case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM:
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB:
|
case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB:
|
||||||
header.ddspf.fourCC = "DXT3";
|
header.ddspf.fourCC = FOURCC_DXT3;
|
||||||
break;
|
break;
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM:
|
case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM:
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB:
|
case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB:
|
||||||
header.ddspf.fourCC = "DXT5";
|
header.ddspf.fourCC = FOURCC_DXT5;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public bool IsDX10;
|
public bool IsDX10;
|
||||||
|
public uint imageSize;
|
||||||
|
|
||||||
public Header header;
|
public Header header;
|
||||||
public DX10Header DX10header;
|
public DX10Header DX10header;
|
||||||
public class Header
|
public class Header
|
||||||
|
@ -131,7 +150,7 @@ namespace Switch_Toolbox.Library
|
||||||
{
|
{
|
||||||
public uint size = 0x20;
|
public uint size = 0x20;
|
||||||
public uint flags = 0x00000000;
|
public uint flags = 0x00000000;
|
||||||
public string fourCC;
|
public uint fourCC;
|
||||||
public uint RGBBitCount = 0;
|
public uint RGBBitCount = 0;
|
||||||
public uint RBitMask = 0x00000000;
|
public uint RBitMask = 0x00000000;
|
||||||
public uint GBitMask = 0x00000000;
|
public uint GBitMask = 0x00000000;
|
||||||
|
@ -320,7 +339,7 @@ namespace Switch_Toolbox.Library
|
||||||
|
|
||||||
header.ddspf.size = reader.ReadUInt32();
|
header.ddspf.size = reader.ReadUInt32();
|
||||||
header.ddspf.flags = reader.ReadUInt32();
|
header.ddspf.flags = reader.ReadUInt32();
|
||||||
header.ddspf.fourCC = reader.ReadString(4);
|
header.ddspf.fourCC = reader.ReadUInt32();
|
||||||
header.ddspf.RGBBitCount = reader.ReadUInt32();
|
header.ddspf.RGBBitCount = reader.ReadUInt32();
|
||||||
header.ddspf.RBitMask = reader.ReadUInt32();
|
header.ddspf.RBitMask = reader.ReadUInt32();
|
||||||
header.ddspf.GBitMask = reader.ReadUInt32();
|
header.ddspf.GBitMask = reader.ReadUInt32();
|
||||||
|
@ -334,7 +353,7 @@ namespace Switch_Toolbox.Library
|
||||||
header.reserved2 = reader.ReadUInt32();
|
header.reserved2 = reader.ReadUInt32();
|
||||||
|
|
||||||
int DX10HeaderSize = 0;
|
int DX10HeaderSize = 0;
|
||||||
if (header.ddspf.fourCC == "DX10")
|
if (header.ddspf.fourCC == FOURCC_DX10)
|
||||||
{
|
{
|
||||||
IsDX10 = true;
|
IsDX10 = true;
|
||||||
|
|
||||||
|
@ -342,8 +361,15 @@ namespace Switch_Toolbox.Library
|
||||||
ReadDX10Header(reader);
|
ReadDX10Header(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IsCompressed())
|
||||||
|
{
|
||||||
|
imageSize = ((header.width + 3) >> 2) * ((header.height + 3) >> 2) * getFormatSize(header.ddspf.fourCC);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
imageSize = header.width * header.height * getFormatSize(header.ddspf.fourCC);
|
||||||
|
|
||||||
reader.TemporarySeek((int)(4 + header.size + DX10HeaderSize), SeekOrigin.Begin);
|
reader.TemporarySeek((int)(4 + header.size + DX10HeaderSize), SeekOrigin.Begin);
|
||||||
bdata = reader.ReadBytes((int)(reader.BaseStream.Length - reader.Position));
|
bdata = reader.ReadBytes((int)imageSize);
|
||||||
|
|
||||||
reader.Dispose();
|
reader.Dispose();
|
||||||
reader.Close();
|
reader.Close();
|
||||||
|
@ -398,17 +424,17 @@ namespace Switch_Toolbox.Library
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB:
|
case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB:
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM:
|
case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM:
|
||||||
header.ddspf.flags = (uint)DDPF.FOURCC;
|
header.ddspf.flags = (uint)DDPF.FOURCC;
|
||||||
header.ddspf.fourCC = "DXT1";
|
header.ddspf.fourCC = FOURCC_DXT1;
|
||||||
break;
|
break;
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB:
|
case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB:
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM:
|
case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM:
|
||||||
header.ddspf.flags = (uint)DDPF.FOURCC;
|
header.ddspf.flags = (uint)DDPF.FOURCC;
|
||||||
header.ddspf.fourCC = "DXT3";
|
header.ddspf.fourCC = FOURCC_DXT3;
|
||||||
break;
|
break;
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB:
|
case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB:
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM:
|
case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM:
|
||||||
header.ddspf.flags = (uint)DDPF.FOURCC;
|
header.ddspf.flags = (uint)DDPF.FOURCC;
|
||||||
header.ddspf.fourCC = "DXT5";
|
header.ddspf.fourCC = FOURCC_DXT5;
|
||||||
break;
|
break;
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM:
|
case DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM:
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC4_SNORM:
|
case DXGI_FORMAT.DXGI_FORMAT_BC4_SNORM:
|
||||||
|
@ -419,7 +445,7 @@ namespace Switch_Toolbox.Library
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM:
|
case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM:
|
||||||
case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM_SRGB:
|
case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM_SRGB:
|
||||||
header.ddspf.flags = (uint)DDPF.FOURCC;
|
header.ddspf.flags = (uint)DDPF.FOURCC;
|
||||||
header.ddspf.fourCC = "DX10";
|
header.ddspf.fourCC = FOURCC_DX10;
|
||||||
if (DX10header == null)
|
if (DX10header == null)
|
||||||
DX10header = new DX10Header();
|
DX10header = new DX10Header();
|
||||||
|
|
||||||
|
@ -428,9 +454,58 @@ namespace Switch_Toolbox.Library
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public bool IsCompressed()
|
||||||
|
{
|
||||||
|
if (header == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (DX10header != null)
|
||||||
|
{
|
||||||
|
switch (DX10header.DXGI_Format)
|
||||||
|
{
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC1_TYPELESS:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC2_TYPELESS:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC3_TYPELESS:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC4_TYPELESS:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC4_SNORM:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC5_TYPELESS:
|
||||||
|
case DXGI_FORMAT.DXGI_FORMAT_BC5_SNORM:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (header.ddspf.fourCC)
|
||||||
|
{
|
||||||
|
case FOURCC_DXT1:
|
||||||
|
case FOURCC_DXT2:
|
||||||
|
case FOURCC_DXT3:
|
||||||
|
case FOURCC_DXT4:
|
||||||
|
case FOURCC_DXT5:
|
||||||
|
case FOURCC_ATI1:
|
||||||
|
case FOURCC_BC4U:
|
||||||
|
case FOURCC_ATI2:
|
||||||
|
case FOURCC_BC5U:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
public void Save(DDS dds, string FileName, List<List<byte[]>> data = null)
|
public void Save(DDS dds, string FileName, List<List<byte[]>> data = null)
|
||||||
{
|
{
|
||||||
FileWriter writer = new FileWriter(new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.Write));
|
FileWriter writer = new FileWriter(new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.Write));
|
||||||
|
var header = dds.header;
|
||||||
writer.Write(Encoding.ASCII.GetBytes("DDS "));
|
writer.Write(Encoding.ASCII.GetBytes("DDS "));
|
||||||
writer.Write(header.size);
|
writer.Write(header.size);
|
||||||
writer.Write(header.flags);
|
writer.Write(header.flags);
|
||||||
|
@ -447,7 +522,7 @@ namespace Switch_Toolbox.Library
|
||||||
|
|
||||||
writer.Write(header.ddspf.size);
|
writer.Write(header.ddspf.size);
|
||||||
writer.Write(header.ddspf.flags);
|
writer.Write(header.ddspf.flags);
|
||||||
writer.WriteSignature(header.ddspf.fourCC);
|
writer.Write(header.ddspf.fourCC);
|
||||||
writer.Write(header.ddspf.RGBBitCount);
|
writer.Write(header.ddspf.RGBBitCount);
|
||||||
writer.Write(header.ddspf.RBitMask);
|
writer.Write(header.ddspf.RBitMask);
|
||||||
writer.Write(header.ddspf.GBitMask);
|
writer.Write(header.ddspf.GBitMask);
|
||||||
|
@ -466,10 +541,7 @@ namespace Switch_Toolbox.Library
|
||||||
|
|
||||||
if (data != null)
|
if (data != null)
|
||||||
{
|
{
|
||||||
foreach (byte[] mip in data[0])
|
writer.Write(data[0][0]);
|
||||||
{
|
|
||||||
writer.Write(mip);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
37
Switch_Toolbox_Library/Helpers/TextureHelper.cs
Normal file
37
Switch_Toolbox_Library/Helpers/TextureHelper.cs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Switch_Toolbox.Library
|
||||||
|
{
|
||||||
|
public class TextureHelper
|
||||||
|
{
|
||||||
|
public static Tuple<uint, uint> GetCurrentMipSize(uint width, uint height, uint blkHeight, uint blkWidth, uint bpp, int CurLevel)
|
||||||
|
{
|
||||||
|
uint offset = 0;
|
||||||
|
uint width_ = 0;
|
||||||
|
uint height_ = 0;
|
||||||
|
|
||||||
|
for (int mipLevel = 0; mipLevel < CurLevel; mipLevel++)
|
||||||
|
{
|
||||||
|
width_ = DIV_ROUND_UP(Math.Max(1, width >> mipLevel), blkWidth);
|
||||||
|
height_ = DIV_ROUND_UP(Math.Max(1, height >> mipLevel), blkHeight);
|
||||||
|
|
||||||
|
offset += width_ * height_ * bpp;
|
||||||
|
}
|
||||||
|
|
||||||
|
width_ = DIV_ROUND_UP(Math.Max(1, width >> CurLevel), blkWidth);
|
||||||
|
height_ = DIV_ROUND_UP(Math.Max(1, height >> CurLevel), blkHeight);
|
||||||
|
|
||||||
|
uint size = width_ * height_ * bpp;
|
||||||
|
return Tuple.Create(offset, size);
|
||||||
|
|
||||||
|
}
|
||||||
|
private static uint DIV_ROUND_UP(uint n, uint d)
|
||||||
|
{
|
||||||
|
return (n + d - 1) / d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -25,6 +25,7 @@
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
|
@ -140,6 +141,7 @@
|
||||||
<Compile Include="GUI\Viewport.Designer.cs">
|
<Compile Include="GUI\Viewport.Designer.cs">
|
||||||
<DependentUpon>Viewport.cs</DependentUpon>
|
<DependentUpon>Viewport.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Helpers\TextureHelper.cs" />
|
||||||
<Compile Include="Interfaces\IMenuExtension.cs" />
|
<Compile Include="Interfaces\IMenuExtension.cs" />
|
||||||
<Compile Include="Plugin\GenericPluginLoader.cs" />
|
<Compile Include="Plugin\GenericPluginLoader.cs" />
|
||||||
<Compile Include="GUI Custom\DockContentST.cs">
|
<Compile Include="GUI Custom\DockContentST.cs">
|
||||||
|
|
|
@ -44,6 +44,11 @@ namespace Switch_Toolbox.Library
|
||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
public static byte[] SubArray(byte[] data, uint offset, uint length)
|
||||||
|
{
|
||||||
|
return data.Skip((int)offset).Take((int)length).ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
static int i = 0;
|
static int i = 0;
|
||||||
public static string RenameDuplicateString(List<string> strings, string oldString)
|
public static string RenameDuplicateString(List<string> strings, string oldString)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue