1
0
mirror of synced 2025-02-17 11:28:33 +01:00

More format fixes. Add custom parameters for not swapping red and green channels

This commit is contained in:
KillzXGaming 2019-07-29 15:48:36 -04:00
parent e1d9dff336
commit 326b11aef6
7 changed files with 37 additions and 23 deletions

View File

@ -134,12 +134,10 @@ namespace FirstPlugin
switch (format) switch (format)
{ {
case 0x5F: case 0x5F:
case 0x01: case 0x01:
case 0x09:
tex.Format = TEX_FORMAT.R8G8B8A8_UNORM; tex.Format = TEX_FORMAT.R8G8B8A8_UNORM;
break; break;
case 0x09:
tex.Format = TEX_FORMAT.R32G32B32A32_FLOAT;
break;
case 0x06: case 0x06:
case 0x59: //Switch case 0x59: //Switch
case 0x60: //Wii U case 0x60: //Wii U
@ -156,6 +154,13 @@ namespace FirstPlugin
} }
uint textureSize = (Width * Height * STGenericTexture.GetBytesPerPixel(tex.Format)) / 8; uint textureSize = (Width * Height * STGenericTexture.GetBytesPerPixel(tex.Format)) / 8;
if (format == 0x09)
textureSize = (Width * Height * 64) / 8;
if (format == 0x01)
{
textureSize = (Width * Height * 32) / 8;
tex.Parameters.DontSwapRG = true;
}
tex.ImageData = reader.ReadBytes((int)textureSize); tex.ImageData = reader.ReadBytes((int)textureSize);
Nodes.Add(tex); Nodes.Add(tex);

View File

@ -140,12 +140,12 @@ namespace FirstPlugin
Nodes.Add(GITextureU); Nodes.Add(GITextureU);
break; break;
default: default:
files.Add(fileEntry);
break; break;
} }
files.Add(fileEntry);
} }
} }
} }
public void Unload() public void Unload()

View File

@ -422,7 +422,7 @@ namespace Toolbox.Library
if (Runtime.UseDirectXTexDecoder) if (Runtime.UseDirectXTexDecoder)
{ {
return BitmapExtension.GetBitmap(DecodeBlock(data, width, height, Format, new byte[0]), return BitmapExtension.GetBitmap(DecodeBlock(data, width, height, Format, new byte[0], Parameters),
(int)width, (int)height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); (int)width, (int)height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
} }
else else
@ -487,7 +487,7 @@ namespace Toolbox.Library
public static Bitmap DecodeBlockGetBitmap(byte[] data, uint Width, uint Height, TEX_FORMAT Format, byte[] paletteData, PALETTE_FORMAT PaletteFormat = PALETTE_FORMAT.None) public static Bitmap DecodeBlockGetBitmap(byte[] data, uint Width, uint Height, TEX_FORMAT Format, byte[] paletteData, PALETTE_FORMAT PaletteFormat = PALETTE_FORMAT.None)
{ {
Bitmap bitmap = BitmapExtension.GetBitmap(DecodeBlock(data, Width, Height, Format, paletteData, PaletteFormat), Bitmap bitmap = BitmapExtension.GetBitmap(DecodeBlock(data, Width, Height, Format, paletteData, null, PaletteFormat),
(int)Width, (int)Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); (int)Width, (int)Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
return bitmap; return bitmap;
@ -501,7 +501,7 @@ namespace Toolbox.Library
/// <param name="Height">The height of the image in pixels.</param> /// <param name="Height">The height of the image in pixels.</param>
/// <param name=" DDS.DXGI_FORMAT">The image format.</param> /// <param name=" DDS.DXGI_FORMAT">The image format.</param>
/// <returns>Returns a byte array of decoded data. </returns> /// <returns>Returns a byte array of decoded data. </returns>
public static byte[] DecodeBlock(byte[] data, uint Width, uint Height, TEX_FORMAT Format, byte[] paletteData, PALETTE_FORMAT PaletteFormat = PALETTE_FORMAT.None, PlatformSwizzle PlatformSwizzle = PlatformSwizzle.None) public static byte[] DecodeBlock(byte[] data, uint Width, uint Height, TEX_FORMAT Format, byte[] paletteData, ImageParameters parameters, PALETTE_FORMAT PaletteFormat = PALETTE_FORMAT.None, PlatformSwizzle PlatformSwizzle = PlatformSwizzle.None)
{ {
if (data == null) throw new Exception($"Data is null!"); if (data == null) throw new Exception($"Data is null!");
if (Format <= 0) throw new Exception($"Invalid Format!"); if (Format <= 0) throw new Exception($"Invalid Format!");
@ -509,33 +509,37 @@ namespace Toolbox.Library
if (Width <= 0) throw new Exception($"Invalid width size {Width}!"); if (Width <= 0) throw new Exception($"Invalid width size {Width}!");
if (Height <= 0) throw new Exception($"Invalid height size {Height}!"); if (Height <= 0) throw new Exception($"Invalid height size {Height}!");
byte[] imageData = new byte[0];
bool DontSwapRG = false;
if (PlatformSwizzle == PlatformSwizzle.Platform_3DS && !IsCompressed(Format)) if (PlatformSwizzle == PlatformSwizzle.Platform_3DS && !IsCompressed(Format))
{ {
return CTR_3DS.DecodeBlock(data, (int)Width, (int)Height, Format); imageData = CTR_3DS.DecodeBlock(data, (int)Width, (int)Height, Format);
DontSwapRG = true;
} }
if (PlatformSwizzle == PlatformSwizzle.Platform_Gamecube) if (PlatformSwizzle == PlatformSwizzle.Platform_Gamecube)
{ imageData = Decode_Gamecube.DecodeData(data, paletteData, Width, Height, Format, PaletteFormat);
return ConvertBgraToRgba(Decode_Gamecube.DecodeData(data, paletteData, Width, Height, Format, PaletteFormat));
}
if (Format == TEX_FORMAT.R32G8X24_FLOAT) if (Format == TEX_FORMAT.R32G8X24_FLOAT)
return ConvertBgraToRgba(DDSCompressor.DecodePixelBlock(data, (int)Width, (int)Height, DDS.DXGI_FORMAT.DXGI_FORMAT_R32G8X24_TYPELESS)); imageData = DDSCompressor.DecodePixelBlock(data, (int)Width, (int)Height, DDS.DXGI_FORMAT.DXGI_FORMAT_R32G8X24_TYPELESS);
if (Format == TEX_FORMAT.BC5_SNORM) if (Format == TEX_FORMAT.BC5_SNORM)
return ConvertBgraToRgba(DDSCompressor.DecompressBC5(data, (int)Width, (int)Height, true, true)); imageData = DDSCompressor.DecompressBC5(data, (int)Width, (int)Height, true, true);
if (IsCompressed(Format)) if (IsCompressed(Format))
return ConvertBgraToRgba(DDSCompressor.DecompressBlock(data, (int)Width, (int)Height, (DDS.DXGI_FORMAT)Format)); imageData = DDSCompressor.DecompressBlock(data, (int)Width, (int)Height, (DDS.DXGI_FORMAT)Format);
else else
{ {
//If blue channel becomes first, do not swap them!
// if (Format.ToString().StartsWith("B") || Format == TEX_FORMAT.B5G6R5_UNORM)
// return DDSCompressor.DecodePixelBlock(data, (int)Width, (int)Height, (DDS.DXGI_FORMAT)Format);
if (IsAtscFormat(Format)) if (IsAtscFormat(Format))
return ConvertBgraToRgba(ASTCDecoder.DecodeToRGBA8888(data, (int)GetBlockWidth(Format), (int)GetBlockHeight(Format), 1, (int)Width, (int)Height, 1)); imageData = ASTCDecoder.DecodeToRGBA8888(data, (int)GetBlockWidth(Format), (int)GetBlockHeight(Format), 1, (int)Width, (int)Height, 1);
else else
return ConvertBgraToRgba(DDSCompressor.DecodePixelBlock(data, (int)Width, (int)Height, (DDS.DXGI_FORMAT)Format)); imageData = DDSCompressor.DecodePixelBlock(data, (int)Width, (int)Height, (DDS.DXGI_FORMAT)Format);
} }
if (parameters.DontSwapRG || DontSwapRG)
return imageData;
else
return ConvertBgraToRgba(imageData);
} }
public string DebugInfo() public string DebugInfo()

View File

@ -8,6 +8,10 @@ namespace Toolbox.Library
{ {
public class ImageParameters public class ImageParameters
{ {
//Flip the image on the Y axis
public bool FlipY { get; set; } public bool FlipY { get; set; }
//Dont swap the red and green channels
public bool DontSwapRG { get; set; }
} }
} }

View File

@ -252,6 +252,7 @@ namespace Toolbox.Library.Rendering
height, height,
GenericTexture.Format, GenericTexture.Format,
new byte[0], new byte[0],
GenericTexture.Parameters,
PALETTE_FORMAT.None, PALETTE_FORMAT.None,
GenericTexture.PlatformSwizzle); GenericTexture.PlatformSwizzle);
} }