From 7cf6ab8f60947ff3935d4127a537905a0643d7c5 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Wed, 17 Apr 2024 20:26:45 -0400 Subject: [PATCH] Simplify texture code for now, add actual BC5 support --- src/tex.rs | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/tex.rs b/src/tex.rs index b69a5ef..85c0c24 100644 --- a/src/tex.rs +++ b/src/tex.rs @@ -49,7 +49,8 @@ bitflags! { enum TextureFormat { B8G8R8A8 = 0x1450, BC1 = 0x3420, - BC5 = 0x3431, + BC3 = 0x3431, + BC5 = 0x6230, } #[binrw] @@ -84,31 +85,18 @@ impl Texture { let mut cursor = Cursor::new(buffer); let header = TexHeader::read(&mut cursor).ok()?; - // TODO: Adapted from Lumina, but this really can be written better... - let mut texture_data_size = vec![0; min(13, header.mip_levels as usize)]; - let size = texture_data_size.len(); - for i in 0..size - 1 { - texture_data_size[i] = header.offset_to_surface[i + 1] - header.offset_to_surface[i]; - } - - texture_data_size[size - 1] = - (buffer.len() - header.offset_to_surface[size - 1] as usize) as u32; - cursor - .seek(SeekFrom::Start(header.offset_to_surface[0] as u64)) + .seek(SeekFrom::Start(std::mem::size_of::() as u64)) .ok()?; - let mut src = vec![0u8; texture_data_size.iter().sum::() as usize]; + let mut src = vec![0u8; buffer.len() - std::mem::size_of::() as usize]; cursor.read_exact(src.as_mut_slice()).ok()?; let mut dst; match header.format { TextureFormat::B8G8R8A8 => { - dst = - vec![0u8; texture_data_size.iter().sum::() as usize]; - - dst.copy_from_slice(&src); + dst = src; } TextureFormat::BC1 => { dst = vec![0u8; header.width as usize * header.height as usize * 4]; @@ -121,7 +109,7 @@ impl Texture { dst.as_mut_slice(), ); } - TextureFormat::BC5 => { + TextureFormat::BC3 => { dst = vec![0u8; header.width as usize * header.height as usize * 4]; let format = Format::Bc3; @@ -132,6 +120,17 @@ impl Texture { dst.as_mut_slice(), ); } + TextureFormat::BC5 => { + dst = vec![0u8; header.width as usize * header.height as usize * 4]; + + let format = Format::Bc5; + format.decompress( + &src, + header.width as usize, + header.height as usize, + dst.as_mut_slice(), + ); + } } Some(Texture {