From fabe2a9a166077b3ade32edd93c35e7b67566f63 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Thu, 29 Sep 2022 13:00:31 +0200 Subject: [PATCH] Fix some texture handling. --- Penumbra/Import/Textures/CombinedTexture.cs | 26 +++++----- Penumbra/Import/Textures/TexFileParser.cs | 52 ++++++++++---------- Penumbra/lib/OtterTex.dll | Bin 32256 -> 32256 bytes 3 files changed, 41 insertions(+), 37 deletions(-) diff --git a/Penumbra/Import/Textures/CombinedTexture.cs b/Penumbra/Import/Textures/CombinedTexture.cs index 61c3dbd5..8e831806 100644 --- a/Penumbra/Import/Textures/CombinedTexture.cs +++ b/Penumbra/Import/Textures/CombinedTexture.cs @@ -91,11 +91,11 @@ public partial class CombinedTexture : IDisposable var tex = type switch { - TextureSaveType.AsIs => _current.Type is Texture.FileType.Bitmap or Texture.FileType.Png ? CreateUncompressed(s, mipMaps ) : s, + TextureSaveType.AsIs => _current.Type is Texture.FileType.Bitmap or Texture.FileType.Png ? CreateUncompressed( s, mipMaps ) : s, TextureSaveType.Bitmap => CreateUncompressed( s, mipMaps ), - TextureSaveType.BC5 => CreateCompressed( s, mipMaps, false ), - TextureSaveType.BC7 => CreateCompressed( s, mipMaps, true ), - _ => throw new ArgumentOutOfRangeException( nameof( type ), type, null ), + TextureSaveType.BC5 => CreateCompressed( s, mipMaps, false ), + TextureSaveType.BC7 => CreateCompressed( s, mipMaps, true ), + _ => throw new ArgumentOutOfRangeException( nameof( type ), type, null ), }; if( !writeTex ) @@ -117,25 +117,29 @@ public partial class CombinedTexture : IDisposable private static void SaveTex( string path, ScratchImage input ) { - var header = input.Meta.ToTexHeader(); + var header = input.ToTexHeader(); if( header.Format == TexFile.TextureFormat.Unknown ) { throw new Exception( $"Could not save tex file with format {input.Meta.Format}, not convertible to a valid .tex formats." ); } - using var stream = File.OpenWrite( path ); + using var stream = File.Open( path, File.Exists(path) ? FileMode.Truncate : FileMode.CreateNew); using var w = new BinaryWriter( stream ); header.Write( w ); w.Write( input.Pixels ); } private static ScratchImage AddMipMaps( ScratchImage input, bool mipMaps ) - => mipMaps ? input.GenerateMipMaps() : input; + => mipMaps + ? input.GenerateMipMaps( Math.Min( 13, 1 + BitOperations.Log2( ( uint )Math.Max( input.Meta.Width, input.Meta.Height ) ) ) ) + : input; private static ScratchImage CreateUncompressed( ScratchImage input, bool mipMaps ) { - if( input.Meta.Format == DXGIFormat.B8G8R8A8UNorm) - return AddMipMaps(input, mipMaps); + if( input.Meta.Format == DXGIFormat.B8G8R8A8UNorm ) + { + return AddMipMaps( input, mipMaps ); + } if( input.Meta.Format.IsCompressed() ) { @@ -151,8 +155,8 @@ public partial class CombinedTexture : IDisposable private static ScratchImage CreateCompressed( ScratchImage input, bool mipMaps, bool bc7 ) { - var format = bc7 ? DXGIFormat.BC7UNorm : DXGIFormat.BC5UNorm; - if( input.Meta.Format == format) + var format = bc7 ? DXGIFormat.BC7UNorm : DXGIFormat.BC3UNorm; + if( input.Meta.Format == format ) { return input; } diff --git a/Penumbra/Import/Textures/TexFileParser.cs b/Penumbra/Import/Textures/TexFileParser.cs index f38d066e..e9de84a0 100644 --- a/Penumbra/Import/Textures/TexFileParser.cs +++ b/Penumbra/Import/Textures/TexFileParser.cs @@ -61,8 +61,8 @@ public static class TexFileParser return i; } - width = Math.Max( width / 2, 4 ); - height = Math.Max( height / 2, 4 ); + width = Math.Max( width / 2, 1 ); + height = Math.Max( height / 2, 1 ); lastOffset = offset; lastSize = requiredSize; } @@ -103,8 +103,9 @@ public static class TexFileParser } } - public static TexFile.TexHeader ToTexHeader( this TexMeta meta ) + public static TexFile.TexHeader ToTexHeader( this ScratchImage scratch ) { + var meta = scratch.Meta; var ret = new TexFile.TexHeader() { Height = ( ushort )meta.Height, @@ -121,34 +122,33 @@ public static class TexFileParser _ => 0, }, }; - unsafe - { - ret.LodOffset[ 0 ] = 0; - ret.LodOffset[ 1 ] = 1; - ret.LodOffset[ 2 ] = 2; - ret.OffsetToSurface[ 0 ] = 80; - var size = meta.Format.BitsPerPixel() * meta.Width * meta.Height / 8; - for( var i = 1; i < meta.MipLevels; ++i ) - { - ret.OffsetToSurface[ i ] = ( uint )( 80 + size ); - size >>= 2; - if( size == 0 ) - { - ret.MipLevels = ( ushort )i; - break; - } - } - - for( var i = ret.MipLevels; i < 13; ++i ) - { - ret.OffsetToSurface[ i ] = 0; - } - } + ret.FillSurfaceOffsets( scratch ); return ret; } + private static unsafe void FillSurfaceOffsets( this ref TexFile.TexHeader header, ScratchImage scratch ) + { + var idx = 0; + fixed( byte* ptr = scratch.Pixels ) + { + foreach( var image in scratch.Images ) + { + var offset = ( byte* )image.Pixels - ptr; + header.OffsetToSurface[ idx++ ] = ( uint )( 80 + offset ); + } + } + + for( ; idx < 13; ++idx ) + header.OffsetToSurface[ idx ] = 0; + + header.LodOffset[ 0 ] = 0; + header.LodOffset[ 1 ] = 1; + header.LodOffset[ 2 ] = 2; + } + + public static TexMeta ToTexMeta( this TexFile.TexHeader header ) => new() { diff --git a/Penumbra/lib/OtterTex.dll b/Penumbra/lib/OtterTex.dll index 447939777545e5efbf41b084e85a3a1f804cb3c2..5e54e1f648ba8cd5d97b579a95c9157575a69754 100644 GIT binary patch literal 32256 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