# HG changeset patch # User alfadur # Date 1605129898 -10800 # Node ID c929e25a7da2791de8768d4e7c95df8bbc7efd58 # Parent 6c939e6de981beeb52522ff5bba1c8210f3e558b allow finding sprites diff -r 6c939e6de981 -r c929e25a7da2 rust/lib-hedgewars-engine/src/lib.rs --- a/rust/lib-hedgewars-engine/src/lib.rs Wed Nov 11 22:41:31 2020 +0300 +++ b/rust/lib-hedgewars-engine/src/lib.rs Thu Nov 12 00:24:58 2020 +0300 @@ -78,7 +78,6 @@ x: i32, y: i32, ) { - } #[no_mangle] diff -r 6c939e6de981 -r c929e25a7da2 rust/lib-hedgewars-engine/src/render/atlas.rs --- a/rust/lib-hedgewars-engine/src/render/atlas.rs Wed Nov 11 22:41:31 2020 +0300 +++ b/rust/lib-hedgewars-engine/src/render/atlas.rs Thu Nov 12 00:24:58 2020 +0300 @@ -335,7 +335,7 @@ buffer, &mut buffer_size, free_rect.with_margins(0, 0, 0, -trim), - );; + ); } if rect.bottom() < free_rect.bottom() { let trim = rect.bottom() - free_rect.top() + 1; @@ -344,7 +344,7 @@ buffer, &mut buffer_size, free_rect.with_margins(0, 0, -trim, 0), - );; + ); } } if split { diff -r 6c939e6de981 -r c929e25a7da2 rust/lib-hedgewars-engine/src/render/gear.rs --- a/rust/lib-hedgewars-engine/src/render/gear.rs Wed Nov 11 22:41:31 2020 +0300 +++ b/rust/lib-hedgewars-engine/src/render/gear.rs Thu Nov 12 00:24:58 2020 +0300 @@ -1,22 +1,46 @@ -use super::{atlas::AtlasCollection, gl::Texture2D}; -use crate::render::camera::Camera; +use crate::render::{ + atlas::{AtlasCollection, SpriteIndex, SpriteLocation}, + camera::Camera, + gl::Texture2D, +}; use integral_geometry::{Rect, Size}; -use crate::render::atlas::SpriteIndex; use png::{ColorType, Decoder, DecodingError}; -use std::path::PathBuf; + use std::{ collections::HashMap, ffi::OsString, fs::{read_dir, File}, io, io::BufReader, - path::Path, + path::{Path, PathBuf}, }; +#[derive(PartialEq, Debug, Clone, Copy)] +enum SpriteId { + Mine = 0, + Grenade, + + MaxSprite, +} + +const SPRITE_LOAD_LIST: &[(SpriteId, &str)] = &[ + ( + SpriteId::Mine, + "../../share/hedgewars/Data/Graphics/MineOn.png", + ), + ( + SpriteId::Grenade, + "../../share/hedgewars/Data/Graphics/Bomb.png", + ), +]; + +const MAX_SPRITES: usize = SpriteId::MaxSprite as usize + 1; + pub struct GearRenderer { atlas: AtlasCollection, + allocation: Box<[SpriteLocation; MAX_SPRITES]>, } struct SpriteData { @@ -28,49 +52,36 @@ impl GearRenderer { pub fn new() -> Self { - let mut lookup = Vec::with_capacity(2048); - let mut atlas = AtlasCollection::new(ATLAS_SIZE); - let mut sprites = load_sprites(Path::new("../../share/hedgewars/Data/Graphics/")) - .expect("Unable to load Graphics"); - let max_size = sprites - .iter() - .fold(Size::EMPTY, |size, sprite| size.join(sprite.size)); - for sprite in sprites.drain(..) { - lookup.push((sprite.filename, atlas.insert_sprite(sprite.size).unwrap())); - } - - println!( - "Filled atlas with {} sprites:\n{}", - sprites.len(), - atlas.used_space() - ); let texture = Texture2D::new(ATLAS_SIZE, gl::RGBA8, gl::LINEAR); - let mut pixels = vec![0; max_size.area()].into_boxed_slice(); - let mut pixels_transposed = vec![0; max_size.area()].into_boxed_slice(); + let mut allocation = Box::new([(0, Rect::at_origin(Size::EMPTY)); MAX_SPRITES]); - for (path, sprite_index) in lookup.drain(..) { - if let Some((atlas_index, rect)) = atlas.get_rect(sprite_index) { - let size = load_sprite_pixels(&path, mapgen::theme::slice_u32_to_u8_mut(&mut pixels[..])).expect("Unable to load Graphics"); + for (sprite, file) in SPRITE_LOAD_LIST { + let path = Path::new(file); + let size = load_sprite_size(path).expect(&format!("Unable to open {}", file)); + let index = atlas + .insert_sprite(size) + .expect(&format!("Could not store sprite {:?}", sprite)); + let (texture_index, rect) = atlas.get_rect(index).unwrap(); - 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[..] - }; + let mut pixels = vec![0; size.area()].into_boxed_slice(); + load_sprite_pixels(path, mapgen::theme::slice_u32_to_u8_mut(&mut pixels[..])) + .expect("Unable to load Graphics"); - texture.update(rect, mapgen::theme::slice_u32_to_u8_mut(used_pixels), 0, gl::RGBA, gl::UNSIGNED_BYTE); - } + texture.update( + rect, + mapgen::theme::slice_u32_to_u8_mut(&mut pixels[..]), + 0, + gl::RGBA, + gl::UNSIGNED_BYTE, + ); + + allocation[*sprite as usize] = (texture_index, rect); } - Self { atlas } + Self { atlas, allocation } } pub fn render(&mut self, camera: &Camera) { diff -r 6c939e6de981 -r c929e25a7da2 rust/lib-hedgewars-engine/src/world.rs --- a/rust/lib-hedgewars-engine/src/world.rs Wed Nov 11 22:41:31 2020 +0300 +++ b/rust/lib-hedgewars-engine/src/world.rs Thu Nov 12 00:24:58 2020 +0300 @@ -134,14 +134,10 @@ if let Some(ref mut state) = self.game_state { let id = state.physics.new_gear().unwrap(); let fp_position = FPPoint::new(position.x.into(), position.y.into()); - state.physics.add_gear_data( - id, - &PositionData(fp_position) - ); - state.physics.add_gear_data( - id, - &VelocityData(FPPoint::zero()) - ) + state.physics.add_gear_data(id, &PositionData(fp_position)); + state + .physics + .add_gear_data(id, &VelocityData(FPPoint::zero())) } }