# HG changeset patch # User alfadur # Date 1564841198 -10800 # Node ID fcf0fb0cddbf6cf8c8713f6dd431114649fe39a5 # Parent fd20e0a134af13d2c026f52ce0d26b03fc1e241f transpose atlas sprites where necessary diff -r fd20e0a134af -r fcf0fb0cddbf rust/lib-hedgewars-engine/src/render/gear.rs --- a/rust/lib-hedgewars-engine/src/render/gear.rs Sat Aug 03 04:16:36 2019 +0300 +++ b/rust/lib-hedgewars-engine/src/render/gear.rs Sat Aug 03 17:06:38 2019 +0300 @@ -24,7 +24,7 @@ filename: PathBuf, } -const ATLAS_SIZE: Size = Size::square(2024); +const ATLAS_SIZE: Size = Size::square(2048); impl GearRenderer { pub fn new() -> Self { @@ -46,13 +46,27 @@ atlas.used_space() ); - let texture = Texture2D::new(max_size, gl::RGBA8, gl::LINEAR); + let texture = Texture2D::new(ATLAS_SIZE, gl::RGBA8, gl::LINEAR); - let mut pixels = vec![0; max_size.area() * 4].into_boxed_slice(); + let mut pixels = vec![0; max_size.area()].into_boxed_slice(); + let mut pixels_transposed = vec![0; max_size.area()].into_boxed_slice(); + for (path, sprite_index) in lookup.drain(..) { if let Some((atlas_index, rect)) = atlas.get_rect(sprite_index) { - load_sprite_pixels(&path, &mut pixels[..]).expect("Unable to load Graphics"); - texture.update(rect, &pixels, 0, gl::RGBA, gl::UNSIGNED_BYTE); + let size = load_sprite_pixels(&path, mapgen::theme::slice_u32_to_u8_mut(&mut pixels[..])).expect("Unable to load Graphics"); + + let used_pixels = if size.width == rect.width() { + for y in 0..rect.height() { + for x in 0..rect.width() { + pixels_transposed[y * rect.width() + x] = pixels[x * rect.height() + y]; + } + } + &mut pixels_transposed[..] + } else { + &mut pixels[..] + }; + + texture.update(rect, mapgen::theme::slice_u32_to_u8_mut(used_pixels), 0, gl::RGBA, gl::UNSIGNED_BYTE); } } @@ -64,13 +78,13 @@ } } -fn load_sprite_pixels(path: &Path, buffer: &mut [u8]) -> io::Result<()> { +fn load_sprite_pixels(path: &Path, buffer: &mut [u8]) -> io::Result { let decoder = Decoder::new(BufReader::new(File::open(path)?)); let (info, mut reader) = decoder.read_info()?; let size = Size::new(info.width as usize, info.height as usize); reader.next_frame(buffer)?; - Ok(()) + Ok(size) } fn load_sprite_size(path: &Path) -> io::Result {