diff --git a/Source/AssetRipper.Export.Modules.Textures/AssetRipper.Export.Modules.Textures.csproj b/Source/AssetRipper.Export.Modules.Textures/AssetRipper.Export.Modules.Textures.csproj index 4dae286c0..359ffd932 100644 --- a/Source/AssetRipper.Export.Modules.Textures/AssetRipper.Export.Modules.Textures.csproj +++ b/Source/AssetRipper.Export.Modules.Textures/AssetRipper.Export.Modules.Textures.csproj @@ -3,7 +3,6 @@ ..\0Bins\Other\AssetRipper.Export.Modules.Textures\$(Configuration)\ ..\0Bins\obj\AssetRipper.Export.Modules.Textures\$(Configuration)\ - true @@ -14,7 +13,7 @@ - + diff --git a/Source/AssetRipper.Export.Modules.Textures/TerrainHeatmap.cs b/Source/AssetRipper.Export.Modules.Textures/TerrainHeatmap.cs index 0e048a6e4..0913cda86 100644 --- a/Source/AssetRipper.Export.Modules.Textures/TerrainHeatmap.cs +++ b/Source/AssetRipper.Export.Modules.Textures/TerrainHeatmap.cs @@ -9,25 +9,25 @@ public static class TerrainHeatmap { public static DirectBitmap GetBitmap(ITerrainData terrain) { - DirectBitmap bitmap = new DirectBitmap( + DirectBitmap bitmap = new DirectBitmap, byte>( Math.Max(terrain.Heightmap.Width, terrain.Heightmap.Resolution), Math.Max(terrain.Heightmap.Height, terrain.Heightmap.Resolution), 1, - GetBGRA32Data(terrain)); + GetRGBA32Data(terrain)); bitmap.FlipY(); return bitmap; } - public static byte[] GetBGRA32Data(ITerrainData terrain) + public static byte[] GetRGBA32Data(ITerrainData terrain) { AssetList heights = terrain.Heightmap.Heights; byte[] result = new byte[heights.Count * 4]; for (int y = 0; y < heights.Count; y++) { Color32 color = (Color32)ConvertToColor((float)heights[y] / short.MaxValue); - result[4 * y] = color.B; + result[4 * y] = color.R; result[4 * y + 1] = color.G; - result[4 * y + 2] = color.R; + result[4 * y + 2] = color.B; result[4 * y + 3] = byte.MaxValue; //small optimization } return result; diff --git a/Source/AssetRipper.Export.Modules.Textures/TextureConverter.cs b/Source/AssetRipper.Export.Modules.Textures/TextureConverter.cs index f8cec7700..77ec4fe89 100644 --- a/Source/AssetRipper.Export.Modules.Textures/TextureConverter.cs +++ b/Source/AssetRipper.Export.Modules.Textures/TextureConverter.cs @@ -224,7 +224,7 @@ public static class TextureConverter TextureFormat.RG32_SIGNED => TryConvertToBitmap, short>(textureFormat, width, height, depth, imageSize, version, data, out bitmap), TextureFormat.RGB48_SIGNED => TryConvertToBitmap, short>(textureFormat, width, height, depth, imageSize, version, data, out bitmap), TextureFormat.RGBA64_SIGNED => TryConvertToBitmap, short>(textureFormat, width, height, depth, imageSize, version, data, out bitmap), - _ => TryConvertToBitmap(textureFormat, width, height, depth, imageSize, version, data, out bitmap), + _ => TryConvertToBitmap, byte>(textureFormat, width, height, depth, imageSize, version, data, out bitmap), }; } @@ -289,149 +289,75 @@ public static class TextureConverter ReadOnlySpan inputSpan = uncompressedSpan.Slice(i * bytesPerLayer, bytesPerLayer); Span outputSpan = bitmap.Bits.Slice(i * outputSize, outputSize); - if (typeof(TColor) == typeof(ColorBGRA32)) + if (!TryDecodeTexture(textureFormat, width, height, inputSpan, outputSpan)) { - if (!TryDecodeTexture(textureFormat, width, height, inputSpan, outputSpan)) - { - bitmap = DirectBitmap.Empty; - return false; - } - } - else - { - if (!TryDecodeTexture(textureFormat, width, height, inputSpan, outputSpan)) - { - bitmap = DirectBitmap.Empty; - return false; - } + bitmap = DirectBitmap.Empty; + return false; } } return true; } - private static bool TryDecodeTexture(TextureFormat textureFormat, int width, int height, ReadOnlySpan inputSpan, Span outputSpan) - { - switch (textureFormat) - { - //ASTC - case TextureFormat.ASTC_RGB_4x4: - case TextureFormat.ASTC_RGBA_4x4: - AstcDecoder.DecodeASTC(inputSpan, width, height, 4, 4, outputSpan); - return true; - - case TextureFormat.ASTC_RGB_5x5: - case TextureFormat.ASTC_RGBA_5x5: - AstcDecoder.DecodeASTC(inputSpan, width, height, 5, 5, outputSpan); - return true; - - case TextureFormat.ASTC_RGB_6x6: - case TextureFormat.ASTC_RGBA_6x6: - AstcDecoder.DecodeASTC(inputSpan, width, height, 6, 6, outputSpan); - return true; - - case TextureFormat.ASTC_RGB_8x8: - case TextureFormat.ASTC_RGBA_8x8: - AstcDecoder.DecodeASTC(inputSpan, width, height, 8, 8, outputSpan); - return true; - - case TextureFormat.ASTC_RGB_10x10: - case TextureFormat.ASTC_RGBA_10x10: - AstcDecoder.DecodeASTC(inputSpan, width, height, 10, 10, outputSpan); - return true; - - case TextureFormat.ASTC_RGB_12x12: - case TextureFormat.ASTC_RGBA_12x12: - AstcDecoder.DecodeASTC(inputSpan, width, height, 12, 12, outputSpan); - return true; - - //ATC - case TextureFormat.ATC_RGB4: - AtcDecoder.DecompressAtcRgb4(inputSpan, width, height, outputSpan); - return true; - - case TextureFormat.ATC_RGBA8: - AtcDecoder.DecompressAtcRgba8(inputSpan, width, height, outputSpan); - return true; - - //BC - case TextureFormat.BC4: - Bc4.Decompress(inputSpan, width, height, outputSpan); - return true; - case TextureFormat.BC5: - Bc5.Decompress(inputSpan, width, height, outputSpan); - return true; - case TextureFormat.BC6H: - Bc6h.Decompress(inputSpan, width, height, false, outputSpan); - return true; - case TextureFormat.BC7: - Bc7.Decompress(inputSpan, width, height, outputSpan); - return true; - - //ETC - case TextureFormat.ETC_RGB4: - case TextureFormat.ETC_RGB4_3DS: - case TextureFormat.ETC_RGB4Crunched: - EtcDecoder.DecompressETC(inputSpan, width, height, outputSpan); - return true; - - case TextureFormat.EAC_R: - EtcDecoder.DecompressEACRUnsigned(inputSpan, width, height, outputSpan); - return true; - - case TextureFormat.EAC_R_SIGNED: - EtcDecoder.DecompressEACRSigned(inputSpan, width, height, outputSpan); - return true; - - case TextureFormat.EAC_RG: - EtcDecoder.DecompressEACRGUnsigned(inputSpan, width, height, outputSpan); - return true; - - case TextureFormat.EAC_RG_SIGNED: - EtcDecoder.DecompressEACRGSigned(inputSpan, width, height, outputSpan); - return true; - - case TextureFormat.ETC2_RGB: - EtcDecoder.DecompressETC2(inputSpan, width, height, outputSpan); - return true; - - case TextureFormat.ETC2_RGBA1: - EtcDecoder.DecompressETC2A1(inputSpan, width, height, outputSpan); - return true; - - case TextureFormat.ETC2_RGBA8: - case TextureFormat.ETC_RGBA8_3DS: - case TextureFormat.ETC2_RGBA8Crunched: - EtcDecoder.DecompressETC2A8(inputSpan, width, height, outputSpan); - return true; - - //PVRTC - case TextureFormat.PVRTC_RGB2: - case TextureFormat.PVRTC_RGBA2: - PvrtcDecoder.DecompressPVRTC(inputSpan, width, height, true, outputSpan); - return true; - - case TextureFormat.PVRTC_RGB4: - case TextureFormat.PVRTC_RGBA4: - PvrtcDecoder.DecompressPVRTC(inputSpan, width, height, false, outputSpan); - return true; - - case TextureFormat.BGRA32_14: - case TextureFormat.BGRA32_37: - //This needs sliced because the inputSpan can have mips. - inputSpan[..outputSpan.Length].CopyTo(outputSpan); - return true; - - default: - return TryDecodeTexture(textureFormat, width, height, inputSpan, outputSpan); - } - } - private static bool TryDecodeTexture(TextureFormat textureFormat, int width, int height, ReadOnlySpan inputSpan, Span outputSpan) where TColor : unmanaged, IColor where TChannelValue : unmanaged { switch (textureFormat) { + //ASTC + case TextureFormat.ASTC_RGB_4x4: + case TextureFormat.ASTC_RGBA_4x4: + AstcDecoder.DecodeASTC(inputSpan, width, height, 4, 4, outputSpan); + return true; + + case TextureFormat.ASTC_RGB_5x5: + case TextureFormat.ASTC_RGBA_5x5: + AstcDecoder.DecodeASTC(inputSpan, width, height, 5, 5, outputSpan); + return true; + + case TextureFormat.ASTC_RGB_6x6: + case TextureFormat.ASTC_RGBA_6x6: + AstcDecoder.DecodeASTC(inputSpan, width, height, 6, 6, outputSpan); + return true; + + case TextureFormat.ASTC_RGB_8x8: + case TextureFormat.ASTC_RGBA_8x8: + AstcDecoder.DecodeASTC(inputSpan, width, height, 8, 8, outputSpan); + return true; + + case TextureFormat.ASTC_RGB_10x10: + case TextureFormat.ASTC_RGBA_10x10: + AstcDecoder.DecodeASTC(inputSpan, width, height, 10, 10, outputSpan); + return true; + + case TextureFormat.ASTC_RGB_12x12: + case TextureFormat.ASTC_RGBA_12x12: + AstcDecoder.DecodeASTC(inputSpan, width, height, 12, 12, outputSpan); + return true; + + //ATC + case TextureFormat.ATC_RGB4: + AtcDecoder.DecompressAtcRgb4(inputSpan, width, height, outputSpan); + return true; + + case TextureFormat.ATC_RGBA8: + AtcDecoder.DecompressAtcRgba8(inputSpan, width, height, outputSpan); + return true; + + //BC + case TextureFormat.BC4: + Bc4.Decompress(inputSpan, width, height, outputSpan); + return true; + case TextureFormat.BC5: + Bc5.Decompress(inputSpan, width, height, outputSpan); + return true; + case TextureFormat.BC6H: + Bc6h.Decompress(inputSpan, width, height, false, outputSpan); + return true; + case TextureFormat.BC7: + Bc7.Decompress(inputSpan, width, height, outputSpan); + return true; + //DXT case TextureFormat.DXT1: case TextureFormat.DXT1Crunched: @@ -447,6 +373,54 @@ public static class TextureConverter DxtDecoder.DecompressDXT5(inputSpan, width, height, outputSpan); return true; + //ETC + case TextureFormat.ETC_RGB4: + case TextureFormat.ETC_RGB4_3DS: + case TextureFormat.ETC_RGB4Crunched: + EtcDecoder.DecompressETC(inputSpan, width, height, outputSpan); + return true; + + case TextureFormat.EAC_R: + EtcDecoder.DecompressEACRUnsigned(inputSpan, width, height, outputSpan); + return true; + + case TextureFormat.EAC_R_SIGNED: + EtcDecoder.DecompressEACRSigned(inputSpan, width, height, outputSpan); + return true; + + case TextureFormat.EAC_RG: + EtcDecoder.DecompressEACRGUnsigned(inputSpan, width, height, outputSpan); + return true; + + case TextureFormat.EAC_RG_SIGNED: + EtcDecoder.DecompressEACRGSigned(inputSpan, width, height, outputSpan); + return true; + + case TextureFormat.ETC2_RGB: + EtcDecoder.DecompressETC2(inputSpan, width, height, outputSpan); + return true; + + case TextureFormat.ETC2_RGBA1: + EtcDecoder.DecompressETC2A1(inputSpan, width, height, outputSpan); + return true; + + case TextureFormat.ETC2_RGBA8: + case TextureFormat.ETC_RGBA8_3DS: + case TextureFormat.ETC2_RGBA8Crunched: + EtcDecoder.DecompressETC2A8(inputSpan, width, height, outputSpan); + return true; + + //PVRTC + case TextureFormat.PVRTC_RGB2: + case TextureFormat.PVRTC_RGBA2: + PvrtcDecoder.DecompressPVRTC(inputSpan, width, height, true, outputSpan); + return true; + + case TextureFormat.PVRTC_RGB4: + case TextureFormat.PVRTC_RGBA4: + PvrtcDecoder.DecompressPVRTC(inputSpan, width, height, false, outputSpan); + return true; + //YUY2 case TextureFormat.YUY2: Yuy2Decoder.DecompressYUY2(inputSpan, width, height, outputSpan);