Fix 0.9 bfres with scene animations. Add toggle for direct x tex decoder
This commit is contained in:
parent
141be9ff4f
commit
47ca70a015
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -72,10 +72,12 @@ namespace FirstPlugin
|
|||||||
|
|
||||||
public MenuExt()
|
public MenuExt()
|
||||||
{
|
{
|
||||||
|
// toolExt[0] = new STToolStripItem("Models");
|
||||||
|
// toolExt[0].DropDownItems.Add(new STToolStripItem("Batch Export (BFRES)", Export));
|
||||||
|
|
||||||
editExt[0] = new STToolStripItem("Use Advanced Editor As Default", AdvancedEditor);
|
editExt[0] = new STToolStripItem("Use Advanced Editor As Default", AdvancedEditor);
|
||||||
newFileExt[0] = new STToolStripItem("BFRES (Switch)", NewSwitchBfres);
|
newFileExt[0] = new STToolStripItem("BFRES (Switch)", NewSwitchBfres);
|
||||||
newFileExt[1] = new STToolStripItem("BFRES (Wii U)", NewWiiUBfres);
|
newFileExt[1] = new STToolStripItem("BFRES (Wii U)", NewWiiUBfres);
|
||||||
|
|
||||||
editExt[0].Checked = !PluginRuntime.UseSimpleBfresEditor;
|
editExt[0].Checked = !PluginRuntime.UseSimpleBfresEditor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,6 +144,71 @@ namespace FirstPlugin
|
|||||||
debugInfo.Show();
|
debugInfo.Show();
|
||||||
debugInfo.PrintDebugInfo(ofd.FileName);
|
debugInfo.PrintDebugInfo(ofd.FileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Export(object sender, EventArgs args)
|
||||||
|
{
|
||||||
|
string formats = FileFilters.FMDL_EXPORT;
|
||||||
|
|
||||||
|
string[] forms = formats.Split('|');
|
||||||
|
|
||||||
|
List<string> Formats = new List<string>();
|
||||||
|
for (int i = 0; i < forms.Length; i++)
|
||||||
|
{
|
||||||
|
if (i > 1 || i == (forms.Length - 1)) //Skip lines with all extensions
|
||||||
|
{
|
||||||
|
if (!forms[i].StartsWith("*"))
|
||||||
|
Formats.Add(forms[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BatchFormatExport form = new BatchFormatExport(Formats);
|
||||||
|
if (form.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
string Extension = form.GetSelectedExtension();
|
||||||
|
|
||||||
|
OpenFileDialog ofd = new OpenFileDialog();
|
||||||
|
ofd.Multiselect = true;
|
||||||
|
ofd.Filter = Utils.GetAllFilters(new Type[] { typeof(BFRES), typeof(SARC) });
|
||||||
|
|
||||||
|
if (ofd.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
FolderSelectDialog folderDialog = new FolderSelectDialog();
|
||||||
|
if (folderDialog.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
foreach (string file in ofd.FileNames)
|
||||||
|
{
|
||||||
|
var FileFormat = STFileLoader.OpenFileFormat(file, new Type[] { typeof(BFRES), typeof(SARC) });
|
||||||
|
if (FileFormat == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SearchBinary(FileFormat, folderDialog.SelectedPath, Extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SearchBinary(IFileFormat FileFormat, string Folder, string Extension)
|
||||||
|
{
|
||||||
|
if (FileFormat is SARC)
|
||||||
|
{
|
||||||
|
foreach (var file in ((SARC)FileFormat).Files)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"{FileFormat.FileName} {file.Text}");
|
||||||
|
var archiveFile = STFileLoader.OpenFileFormat(file.FullName, new Type[] { typeof(BFRES), typeof(SARC) }, file.Data);
|
||||||
|
if (archiveFile == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SearchBinary(archiveFile, Folder, Extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (FileFormat is BFRES)
|
||||||
|
{
|
||||||
|
// ((BFRES)FileFormat).Export(Path.Combine(Folder, $"{FileFormat.FileName}{Extension}"));
|
||||||
|
}
|
||||||
|
|
||||||
|
FileFormat.Unload();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static byte[] CreateNewBFRESSwitch(string Name)
|
private static byte[] CreateNewBFRESSwitch(string Name)
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -231,6 +231,9 @@ namespace Switch_Toolbox.Library
|
|||||||
case "FrameCamera":
|
case "FrameCamera":
|
||||||
bool.TryParse(node.InnerText, out Runtime.FrameCamera);
|
bool.TryParse(node.InnerText, out Runtime.FrameCamera);
|
||||||
break;
|
break;
|
||||||
|
case "UseDirectXTexDecoder":
|
||||||
|
bool.TryParse(node.InnerText, out Runtime.UseDirectXTexDecoder);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -353,6 +356,7 @@ namespace Switch_Toolbox.Library
|
|||||||
XmlNode mainSettingsNode = doc.CreateElement("MAINFORM");
|
XmlNode mainSettingsNode = doc.CreateElement("MAINFORM");
|
||||||
parentNode.AppendChild(mainSettingsNode);
|
parentNode.AppendChild(mainSettingsNode);
|
||||||
|
|
||||||
|
mainSettingsNode.AppendChild(createNode(doc, "UseDirectXTexDecoder", Runtime.UseDirectXTexDecoder.ToString()));
|
||||||
mainSettingsNode.AppendChild(createNode(doc, "DisplayViewport", Runtime.DisplayViewport.ToString()));
|
mainSettingsNode.AppendChild(createNode(doc, "DisplayViewport", Runtime.DisplayViewport.ToString()));
|
||||||
mainSettingsNode.AppendChild(createNode(doc, "UseOpenGL", Runtime.UseOpenGL.ToString()));
|
mainSettingsNode.AppendChild(createNode(doc, "UseOpenGL", Runtime.UseOpenGL.ToString()));
|
||||||
mainSettingsNode.AppendChild(createNode(doc, "UseDebugDomainExceptionHandler", Runtime.UseDebugDomainExceptionHandler.ToString()));
|
mainSettingsNode.AppendChild(createNode(doc, "UseDebugDomainExceptionHandler", Runtime.UseDebugDomainExceptionHandler.ToString()));
|
||||||
|
@ -237,13 +237,11 @@ namespace Switch_Toolbox.Library
|
|||||||
int W = (width + 3) / 4;
|
int W = (width + 3) / 4;
|
||||||
int H = (height + 3) / 4;
|
int H = (height + 3) / 4;
|
||||||
|
|
||||||
|
|
||||||
byte[] Output = new byte[W * H * 64];
|
byte[] Output = new byte[W * H * 64];
|
||||||
|
|
||||||
for (int Y = 0; Y < H; Y++)
|
for (int Y = 0; Y < H; Y++)
|
||||||
{
|
{
|
||||||
for (int X = 0; X < W; X++)
|
for (int X = 0; X < W; X++)
|
||||||
|
|
||||||
{
|
{
|
||||||
int IOffs = (Y * W + X) * 16;
|
int IOffs = (Y * W + X) * 16;
|
||||||
byte[] Red = new byte[8];
|
byte[] Red = new byte[8];
|
||||||
|
@ -377,16 +377,35 @@ namespace Switch_Toolbox.Library
|
|||||||
case TEX_FORMAT.ETC1_A4:
|
case TEX_FORMAT.ETC1_A4:
|
||||||
return BitmapExtension.GetBitmap(ETC1.ETC1Decompress(data, (int)width, (int)height, true),
|
return BitmapExtension.GetBitmap(ETC1.ETC1Decompress(data, (int)width, (int)height, true),
|
||||||
(int)width, (int)height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
|
(int)width, (int)height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
|
||||||
default:
|
}
|
||||||
|
|
||||||
|
if (Runtime.UseDirectXTexDecoder)
|
||||||
|
{
|
||||||
return BitmapExtension.GetBitmap(DecodeBlock(data, width, height, Format),
|
return BitmapExtension.GetBitmap(DecodeBlock(data, width, height, Format),
|
||||||
(int)width, (int)height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
|
(int)width, (int)height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
return DecodeNotDirectXTex(data, width, height, Format);
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Forms.STErrorDialog.Show($"Texture failed to load!", "Texture [GetBitmap({MipLevel},{ArrayLevel})]", DebugInfo() + " \n" + ex);
|
Forms.STErrorDialog.Show($"Texture failed to load!", "Texture [GetBitmap({MipLevel},{ArrayLevel})]", DebugInfo() + " \n" + ex);
|
||||||
|
|
||||||
try
|
try
|
||||||
|
{
|
||||||
|
return DecodeNotDirectXTex(data, width, height, Format);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Forms.STErrorDialog.Show($"Texture failed to load!", "Texture [GetBitmap({MipLevel},{ArrayLevel})]", DebugInfo() + " \n" + ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Bitmap DecodeNotDirectXTex(byte[] data, uint Width, uint Height, TEX_FORMAT Format)
|
||||||
{
|
{
|
||||||
if (Format == TEX_FORMAT.BC1_UNORM)
|
if (Format == TEX_FORMAT.BC1_UNORM)
|
||||||
return DDSCompressor.DecompressBC1(data, (int)Width, (int)Height, false);
|
return DDSCompressor.DecompressBC1(data, (int)Width, (int)Height, false);
|
||||||
@ -402,24 +421,23 @@ namespace Switch_Toolbox.Library
|
|||||||
return DDSCompressor.DecompressBC4(data, (int)Width, (int)Height, true);
|
return DDSCompressor.DecompressBC4(data, (int)Width, (int)Height, true);
|
||||||
else if (Format == TEX_FORMAT.BC5_UNORM)
|
else if (Format == TEX_FORMAT.BC5_UNORM)
|
||||||
return DDSCompressor.DecompressBC5(data, (int)Width, (int)Height, false);
|
return DDSCompressor.DecompressBC5(data, (int)Width, (int)Height, false);
|
||||||
|
else if (Format == TEX_FORMAT.BC7_UNORM)
|
||||||
|
return BitmapExtension.GetBitmap(CSharpImageLibrary.DDS.Dxt.DecompressBc7(data, (int)Width, (int)Height), (int)Width, (int)Height);
|
||||||
|
else if (Format == TEX_FORMAT.BC7_UNORM_SRGB)
|
||||||
|
return BitmapExtension.GetBitmap(CSharpImageLibrary.DDS.Dxt.DecompressBc7(data, (int)Width, (int)Height), (int)Width, (int)Height);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Runtime.UseOpenGL)
|
if (Runtime.UseOpenGL)
|
||||||
{
|
{
|
||||||
Runtime.OpenTKInitialized = true;
|
Runtime.OpenTKInitialized = true;
|
||||||
|
if (RenderableTex == null || !RenderableTex.GLInitialized)
|
||||||
LoadOpenGLTexture();
|
LoadOpenGLTexture();
|
||||||
return RenderableTex.GLTextureToBitmap(RenderableTex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
Forms.STErrorDialog.Show($"Texture failed to load!", "Texture [GetBitmap({MipLevel},{ArrayLevel})]", DebugInfo() + " \n" + ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
return RenderableTex.ToBitmap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static Bitmap DecodeBlockGetBitmap(byte[] data, uint Width, uint Height, TEX_FORMAT Format)
|
public static Bitmap DecodeBlockGetBitmap(byte[] data, uint Width, uint Height, TEX_FORMAT Format)
|
||||||
{
|
{
|
||||||
|
@ -66,17 +66,21 @@ namespace Switch_Toolbox.Library.Rendering
|
|||||||
case TEX_FORMAT.BC4_SNORM:
|
case TEX_FORMAT.BC4_SNORM:
|
||||||
//Convert to rgb to prevent red output
|
//Convert to rgb to prevent red output
|
||||||
//While shaders could prevent this, converting is easier and works fine across all editors
|
//While shaders could prevent this, converting is easier and works fine across all editors
|
||||||
|
if (Runtime.UseDirectXTexDecoder)
|
||||||
|
{
|
||||||
data = STGenericTexture.DecodeBlock(data,
|
data = STGenericTexture.DecodeBlock(data,
|
||||||
GenericTexture.Width,
|
GenericTexture.Width,
|
||||||
GenericTexture.Height,
|
GenericTexture.Height,
|
||||||
GenericTexture.Format,
|
GenericTexture.Format,
|
||||||
GenericTexture.PlatformSwizzle);
|
GenericTexture.PlatformSwizzle);
|
||||||
|
|
||||||
pixelInternalFormat = PixelInternalFormat.Rgba;
|
pixelInternalFormat = PixelInternalFormat.Rgba;
|
||||||
pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgba;
|
pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgba;
|
||||||
|
}
|
||||||
// pixelInternalFormat = PixelInternalFormat.CompressedRedRgtc1;
|
else
|
||||||
// pixelInternalFormat = PixelInternalFormat.CompressedSignedRedRgtc1;
|
{
|
||||||
|
pixelInternalFormat = PixelInternalFormat.CompressedRedRgtc1;
|
||||||
|
pixelInternalFormat = PixelInternalFormat.CompressedSignedRedRgtc1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case TEX_FORMAT.BC5_SNORM:
|
case TEX_FORMAT.BC5_SNORM:
|
||||||
pixelInternalFormat = PixelInternalFormat.CompressedRgRgtc2;
|
pixelInternalFormat = PixelInternalFormat.CompressedRgRgtc2;
|
||||||
@ -110,6 +114,8 @@ namespace Switch_Toolbox.Library.Rendering
|
|||||||
pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgba;
|
pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgba;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (Runtime.UseDirectXTexDecoder)
|
||||||
|
{
|
||||||
data = STGenericTexture.DecodeBlock(data,
|
data = STGenericTexture.DecodeBlock(data,
|
||||||
GenericTexture.Width,
|
GenericTexture.Width,
|
||||||
GenericTexture.Height,
|
GenericTexture.Height,
|
||||||
@ -118,6 +124,7 @@ namespace Switch_Toolbox.Library.Rendering
|
|||||||
|
|
||||||
pixelInternalFormat = PixelInternalFormat.Rgba;
|
pixelInternalFormat = PixelInternalFormat.Rgba;
|
||||||
pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgba;
|
pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgba;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
GLInitialized = true;
|
GLInitialized = true;
|
||||||
|
@ -33,6 +33,8 @@ namespace Switch_Toolbox.Library.IO
|
|||||||
|
|
||||||
public static IFileFormat OpenFileFormat(string FileName, Type[] FileTypes, byte[] data = null)
|
public static IFileFormat OpenFileFormat(string FileName, Type[] FileTypes, byte[] data = null)
|
||||||
{
|
{
|
||||||
|
CheckCompression(FileName, data);
|
||||||
|
|
||||||
Stream stream;
|
Stream stream;
|
||||||
if (data != null)
|
if (data != null)
|
||||||
stream = new MemoryStream(data);
|
stream = new MemoryStream(data);
|
||||||
@ -56,6 +58,8 @@ namespace Switch_Toolbox.Library.IO
|
|||||||
|
|
||||||
public static IFileFormat OpenFileFormat(string FileName, Type FileType, byte[] data = null)
|
public static IFileFormat OpenFileFormat(string FileName, Type FileType, byte[] data = null)
|
||||||
{
|
{
|
||||||
|
CheckCompression(FileName, data);
|
||||||
|
|
||||||
Stream stream;
|
Stream stream;
|
||||||
if (data != null)
|
if (data != null)
|
||||||
stream = new MemoryStream(data);
|
stream = new MemoryStream(data);
|
||||||
@ -71,6 +75,46 @@ namespace Switch_Toolbox.Library.IO
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void CheckCompression(string FileName, byte[] data)
|
||||||
|
{
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
using (var reader = new FileReader(data))
|
||||||
|
{
|
||||||
|
DecompressData(reader, FileName, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
using (var reader = new FileReader(FileName))
|
||||||
|
{
|
||||||
|
DecompressData(reader, FileName, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void DecompressData(FileReader reader, string FileName, byte[] data)
|
||||||
|
{
|
||||||
|
reader.ByteOrder = ByteOrder.BigEndian;
|
||||||
|
uint MagicHex = reader.ReadUInt32();
|
||||||
|
string Magic = reader.ReadMagic(0, 4);
|
||||||
|
reader.Position = 0;
|
||||||
|
|
||||||
|
if (Magic == "Yaz0")
|
||||||
|
{
|
||||||
|
if (data != null)
|
||||||
|
data = EveryFileExplorer.YAZ0.Decompress(data);
|
||||||
|
else
|
||||||
|
data = EveryFileExplorer.YAZ0.Decompress(FileName);
|
||||||
|
}
|
||||||
|
if (MagicHex == 0x28B52FFD || MagicHex == 0xFD2FB528)
|
||||||
|
{
|
||||||
|
if (data != null)
|
||||||
|
data = STLibraryCompression.ZSTD.Decompress(data);
|
||||||
|
else
|
||||||
|
data = STLibraryCompression.ZSTD.Decompress(File.ReadAllBytes(FileName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the <see cref="IFileFormat"/> from a file or byte array.
|
/// Gets the <see cref="IFileFormat"/> from a file or byte array.
|
||||||
|
@ -15,6 +15,8 @@ namespace Switch_Toolbox.Library
|
|||||||
|
|
||||||
public class Runtime
|
public class Runtime
|
||||||
{
|
{
|
||||||
|
public static bool UseDirectXTexDecoder = true;
|
||||||
|
|
||||||
public static bool DEVELOPER_DEBUG_MODE = false;
|
public static bool DEVELOPER_DEBUG_MODE = false;
|
||||||
|
|
||||||
public static class ResourceTables
|
public static class ResourceTables
|
||||||
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user