rust/lib-hedgewars-engine/src/render/gear.rs
changeset 15195 e2adb40c7988
parent 15125 febccab419b1
child 15291 16bd389fc735
equal deleted inserted replaced
15194:ff397798e812 15195:e2adb40c7988
     1 use super::atlas::AtlasCollection;
     1 use super::atlas::AtlasCollection;
       
     2 use crate::render::camera::Camera;
       
     3 
     2 use integral_geometry::Size;
     4 use integral_geometry::Size;
     3 
     5 
     4 struct GearRenderer {
     6 use png::{ColorType, Decoder, DecodingError};
       
     7 use std::{
       
     8     fs::{read_dir, File},
       
     9     io,
       
    10     io::BufReader,
       
    11     path::Path,
       
    12 };
       
    13 
       
    14 pub struct GearRenderer {
     5     atlas: AtlasCollection,
    15     atlas: AtlasCollection,
     6 }
    16 }
     7 
    17 
     8 const ATLAS_SIZE: Size = Size::square(2048);
    18 const ATLAS_SIZE: Size = Size::square(1024);
     9 
    19 
    10 impl GearRenderer {
    20 impl GearRenderer {
    11     pub fn new() -> Self {
    21     pub fn new() -> Self {
    12         let atlas = AtlasCollection::new(ATLAS_SIZE);
    22         let mut atlas = AtlasCollection::new(ATLAS_SIZE);
       
    23         let sprites = load_sprites(Path::new("../../share/hedgewars/Data/Graphics/"))
       
    24             .expect("Unable to load Graphics");
       
    25         for sprite in &sprites {
       
    26             atlas.insert_sprite(*sprite);
       
    27         }
       
    28         println!(
       
    29             "Filled atlas with {} sprites:\n{}",
       
    30             sprites.len(),
       
    31             atlas.used_space()
       
    32         );
    13         Self { atlas }
    33         Self { atlas }
    14     }
    34     }
       
    35 
       
    36     pub fn render(&mut self, camera: &Camera) {
       
    37         let projection = camera.projection();
       
    38     }
    15 }
    39 }
       
    40 
       
    41 fn load_sprite(path: &Path) -> io::Result<Size> {
       
    42     let decoder = Decoder::new(BufReader::new(File::open(path)?));
       
    43     let (info, mut reader) = decoder.read_info()?;
       
    44 
       
    45     let size = Size::new(info.width as usize, info.height as usize);
       
    46     Ok(size)
       
    47 }
       
    48 
       
    49 fn load_sprites(path: &Path) -> io::Result<Vec<Size>> {
       
    50     let mut result = vec![];
       
    51     for file in read_dir(path)? {
       
    52         let file = file?;
       
    53         if let Some(extension) = file.path().extension() {
       
    54             if extension == "png" {
       
    55                 let sprite = load_sprite(&file.path())?;
       
    56                 result.push(sprite);
       
    57             }
       
    58         }
       
    59     }
       
    60     Ok(result)
       
    61 }