From bca9d72a8cb982e29adf3f9086335b1c821a5861 Mon Sep 17 00:00:00 2001 From: LysiX Date: Wed, 3 Apr 2024 11:13:37 -0700 Subject: [PATCH] Write hidden alpha in wii textures if version = 25 --- .../Extensions/TextureExtensions.cs | 32 ++++++++++++++++--- .../IO/Serializers/HMXBitmapSerializer.cs | 25 ++++++++++++--- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/Src/Core/Mackiloha.App/Extensions/TextureExtensions.cs b/Src/Core/Mackiloha.App/Extensions/TextureExtensions.cs index 03ae536..8a05329 100644 --- a/Src/Core/Mackiloha.App/Extensions/TextureExtensions.cs +++ b/Src/Core/Mackiloha.App/Extensions/TextureExtensions.cs @@ -946,7 +946,7 @@ public static HMXBitmap BitmapFromImage(string imagePath, SystemInfo info) if (HasAlpha(rawData)) { - var (rgbData, alphaData) = SplitRGBAForTPL(rawData); + var (rgbData, alphaData) = SplitRGBAForTPL(rawData, info); // Encode as two DXT1 images var rgbDxData = EncodeDxImage(rgbData, width, height, 0, DxEncoding.DXGI_FORMAT_BC1_UNORM); @@ -960,6 +960,20 @@ public static HMXBitmap BitmapFromImage(string imagePath, SystemInfo info) Array.Copy(rgbDxData, 0, combinedImageData, 0, rgbDxData.Length); Array.Copy(alphaDxData, 0, combinedImageData, rgbDxData.Length, alphaDxData.Length); + if (info.Version == 25) + { + return new HMXBitmap() + { + Bpp = 4, + Encoding = TPL_CMP, + MipMaps = 0, + Width = width, + Height = height, + BPL = (width * 4) / 8, + WiiAlphaNumber = 4, + RawData = combinedImageData + }; + } return new HMXBitmap() { Bpp = 8, @@ -1160,7 +1174,7 @@ private static bool HasAlpha(byte[] rgbaData) return false; } - private static (byte[] rgb, byte[] alpha) SplitRGBAForTPL(byte[] data) + private static (byte[] rgb, byte[] alpha) SplitRGBAForTPL(byte[] data, SystemInfo info) { var rgb = new byte[data.Length]; var alpha = new byte[data.Length]; @@ -1172,8 +1186,18 @@ private static (byte[] rgb, byte[] alpha) SplitRGBAForTPL(byte[] data) rgb[i + 2] = data[i + 2]; rgb[i + 3] = 0xFF; - // Put alpha on green channel - alpha[i + 1] = data[i + 3]; + if (info.Version == 25) + { + // Put alpha on all channels + alpha[i] = data[i + 3]; + alpha[i + 1] = data[i + 3]; + alpha[i + 2] = data[i + 3]; + } + else + { + // Put alpha on green channel + alpha[i + 1] = data[i + 3]; + } } return (rgb, alpha); diff --git a/Src/Core/Mackiloha/IO/Serializers/HMXBitmapSerializer.cs b/Src/Core/Mackiloha/IO/Serializers/HMXBitmapSerializer.cs index cc26eb5..dd1c2be 100644 --- a/Src/Core/Mackiloha/IO/Serializers/HMXBitmapSerializer.cs +++ b/Src/Core/Mackiloha/IO/Serializers/HMXBitmapSerializer.cs @@ -30,7 +30,10 @@ public override void WriteToStream(AwesomeWriter aw, ISerializable data) { var bitmap = data as HMXBitmap; - aw.Write((byte)0x01); + if (bitmap.WiiAlphaNumber == 4) + aw.Write((byte)0x02); + else + aw.Write((byte)0x01); aw.Write((byte)bitmap.Bpp); aw.Write((int)bitmap.Encoding); @@ -40,11 +43,23 @@ public override void WriteToStream(AwesomeWriter aw, ISerializable data) aw.Write((short)bitmap.Height); aw.Write((short)bitmap.BPL); - aw.Write(new byte[19]); + aw.Write((short)bitmap.WiiAlphaNumber); - byte[] bytes = new byte[CalculateTextureByteSize(bitmap.Encoding, bitmap.Width, bitmap.Height, bitmap.Bpp, bitmap.MipMaps)]; - Array.Copy(bitmap.RawData, bytes, bytes.Length); - aw.Write(bytes); + aw.Write(new byte[17]); + + if (bitmap.WiiAlphaNumber == 4) + { + byte[] bytes = new byte[CalculateTextureByteSize(bitmap.Encoding, bitmap.Width, bitmap.Height, 8, bitmap.MipMaps)]; + Array.Copy(bitmap.RawData, bytes, bytes.Length); + aw.Write(bytes); + } + else + { + byte[] bytes = new byte[CalculateTextureByteSize(bitmap.Encoding, bitmap.Width, bitmap.Height, bitmap.Bpp, bitmap.MipMaps)]; + Array.Copy(bitmap.RawData, bytes, bytes.Length); + aw.Write(bytes); + } + } private int CalculateTextureByteSize(int encoding, int w, int h, int bpp, int mips, int wiiAlphaNum = 0)