rust/lib-hedgewars-engine/src/render/gear.rs
changeset 15890 8a6a2d931bae
parent 15766 19ad3fe48ea6
child 15924 9502611bffc1
equal deleted inserted replaced
15889:eb52cf05e454 15890:8a6a2d931bae
    71 }
    71 }
    72 
    72 
    73 const SPRITE_LOAD_LIST: &[(SpriteId, &str)] = &[
    73 const SPRITE_LOAD_LIST: &[(SpriteId, &str)] = &[
    74     (
    74     (
    75         SpriteId::Mine,
    75         SpriteId::Mine,
    76         "../../share/hedgewars/Data/Graphics/MineOn.png",
    76         "Graphics/MineOn.png",
    77     ),
    77     ),
    78     (
    78     (
    79         SpriteId::Grenade,
    79         SpriteId::Grenade,
    80         "../../share/hedgewars/Data/Graphics/Bomb.png",
    80         "Graphics/Bomb.png",
    81     ),
    81     ),
    82     (
    82     (
    83         SpriteId::Cheese,
    83         SpriteId::Cheese,
    84         "../../share/hedgewars/Data/Graphics/cheese.png",
    84         "Graphics/cheese.png",
    85     ),
    85     ),
    86     (
    86     (
    87         SpriteId::Cleaver,
    87         SpriteId::Cleaver,
    88         "../../share/hedgewars/Data/Graphics/cleaver.png",
    88         "Graphics/cleaver.png",
    89     ),
    89     ),
    90 ];
    90 ];
    91 
    91 
    92 const MAX_SPRITES: usize = SpriteId::MaxSprite as usize + 1;
    92 const MAX_SPRITES: usize = SpriteId::MaxSprite as usize + 1;
    93 
    93 
   122 }
   122 }
   123 
   123 
   124 const ATLAS_SIZE: Size = Size::square(2048);
   124 const ATLAS_SIZE: Size = Size::square(2048);
   125 
   125 
   126 impl GearRenderer {
   126 impl GearRenderer {
   127     pub fn new() -> Self {
   127     pub fn new(data_path: &Path) -> Self {
   128         let mut atlas = AtlasCollection::new(ATLAS_SIZE);
   128         let mut atlas = AtlasCollection::new(ATLAS_SIZE);
   129 
   129 
   130         let texture = Texture2D::new(
   130         let texture = Texture2D::new(
   131             ATLAS_SIZE,
   131             ATLAS_SIZE,
   132             TextureInternalFormat::Rgba8,
   132             TextureInternalFormat::Rgba8,
   134         );
   134         );
   135 
   135 
   136         let mut allocation = Box::new([Default::default(); MAX_SPRITES]);
   136         let mut allocation = Box::new([Default::default(); MAX_SPRITES]);
   137 
   137 
   138         for (sprite, file) in SPRITE_LOAD_LIST {
   138         for (sprite, file) in SPRITE_LOAD_LIST {
   139             let path = Path::new(file);
   139             let path = data_path.join(Path::new(file));
   140             let size = load_sprite_size(path).expect(&format!("Unable to open {}", file));
   140             let size = load_sprite_size(path.as_path()).expect(&format!("Unable to open {}", file));
   141             let index = atlas
   141             let index = atlas
   142                 .insert_sprite(size)
   142                 .insert_sprite(size)
   143                 .expect(&format!("Could not store sprite {:?}", sprite));
   143                 .expect(&format!("Could not store sprite {:?}", sprite));
   144             let (texture_index, rect) = atlas.get_rect(index).unwrap();
   144             let (texture_index, rect) = atlas.get_rect(index).unwrap();
   145 
   145 
   146             let mut pixels = vec![255u8; size.area() * 4].into_boxed_slice();
   146             let mut pixels = vec![255u8; size.area() * 4].into_boxed_slice();
   147             load_sprite_pixels(path, &mut pixels).expect("Unable to load Graphics");
   147             load_sprite_pixels(path.as_path(), &mut pixels).expect("Unable to load Graphics");
   148 
   148 
   149             texture.update(
   149             texture.update(
   150                 rect,
   150                 rect,
   151                 &pixels,
   151                 &pixels,
   152                 None,
   152                 None,
   260 
   260 
   261         self.vertex_buffer.write_typed(&data);
   261         self.vertex_buffer.write_typed(&data);
   262         let _buffer_bind = self.layout.bind(&[(0, &self.vertex_buffer)], None);
   262         let _buffer_bind = self.layout.bind(&[(0, &self.vertex_buffer)], None);
   263 
   263 
   264         let _state = PipelineState::new().with_blend();
   264         let _state = PipelineState::new().with_blend();
   265 
       
   266         unsafe {
   265         unsafe {
   267             gl::DrawArrays(gl::TRIANGLES, 0, entries.len() as i32 * 6);
   266             gl::DrawArrays(gl::TRIANGLES, 0, entries.len() as i32 * 6);
   268         }
   267         }
   269     }
   268     }
   270 }
   269 }