diff options
Diffstat (limited to 'light-client/src')
-rw-r--r-- | light-client/src/atlas.rs | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/light-client/src/atlas.rs b/light-client/src/atlas.rs index e75430c5..94114176 100644 --- a/light-client/src/atlas.rs +++ b/light-client/src/atlas.rs @@ -4,8 +4,8 @@ use hurrycurry_protocol::{ }; use sdl2::{ pixels::PixelFormatEnum, - rect::Rect, - render::{Canvas, Texture, TextureAccess, TextureCreator}, + rect::{FRect, Rect}, + render::{BlendMode, Canvas, Texture, TextureAccess, TextureCreator}, video::{Window, WindowContext}, }; use std::collections::HashMap; @@ -16,7 +16,7 @@ pub struct SpriteRenderer<'a> { tiles: Vec<Rect>, items: Vec<Rect>, - view_scale: u32, + view_scale: Vec2, view_offset: Vec2, sprites: Vec<DrawItem>, @@ -25,7 +25,7 @@ pub struct SpriteRenderer<'a> { pub struct DrawItem { z_order: i32, src: Rect, - dst: Rect, + dst: FRect, } impl<'a> SpriteRenderer<'a> { @@ -55,8 +55,10 @@ impl<'a> SpriteRenderer<'a> { } for (x, char) in line.chars().enumerate() { let color = palette.get(&char).unwrap(); - let base = (y * 1024 + x) * 4; - texels[base..base + 4].copy_from_slice(color); + texels[(y * 1024 + x) * 4 + 0] = color[3]; + texels[(y * 1024 + x) * 4 + 1] = color[2]; + texels[(y * 1024 + x) * 4 + 2] = color[1]; + texels[(y * 1024 + x) * 4 + 3] = color[0]; } } @@ -70,6 +72,7 @@ impl<'a> SpriteRenderer<'a> { .unwrap(); texture.update(None, &texels, 1024 * 4).unwrap(); + texture.set_blend_mode(BlendMode::Blend); Self { texture, @@ -77,7 +80,7 @@ impl<'a> SpriteRenderer<'a> { tiles: vec![], sprites: vec![], view_offset: Vec2::ZERO, - view_scale: 32, + view_scale: Vec2::new(1., 0.75) * 2., } } @@ -99,39 +102,37 @@ impl<'a> SpriteRenderer<'a> { self.items = data .item_names .iter() - .map(|i| meta.get(i).copied().unwrap_or(Rect::new(0, 0, 100, 100))) + .map(|i| meta.get(i).copied().unwrap_or(Rect::new(0, 0, 0, 0))) .collect(); self.tiles = data .tile_names .iter() - .map(|i| meta.get(i).copied().unwrap_or(Rect::new(0, 0, 100, 100))) + .map(|i| meta.get(i).copied().unwrap_or(Rect::new(0, 0, 0, 0))) .collect(); } pub fn draw_tile(&mut self, TileIndex(i): TileIndex, position: IVec2) { - let p = (self.view_offset.as_ivec2() + position) * self.view_scale as i32; + let p = self.view_offset + position.as_vec2(); + let src = self.tiles[i]; self.sprites.push(DrawItem { z_order: position.y, - src: self.tiles[i], - dst: Rect::from_center((p.x as i32, p.y as i32), self.view_scale, self.view_scale), + src, + dst: FRect::new( + (p.x * 32.) * self.view_scale.x, + (p.y * 24. + 24. - src.height() as f32) * self.view_scale.y, + src.width() as f32 * self.view_scale.x, + src.height() as f32 * self.view_scale.y, + ), }); } - pub fn draw_item(&mut self, ItemIndex(i): ItemIndex, position: Vec2) { - self.sprites.push(DrawItem { - z_order: position.y as i32, - src: self.tiles[i], - dst: Rect::from_center( - (position.x as i32, position.y as i32), - self.view_scale, - self.view_scale, - ), - }) + pub fn draw_item(&mut self, ItemIndex(_i): ItemIndex, _position: Vec2) { + todo!() } pub fn submit(&mut self, canvas: &mut Canvas<Window>) { self.sprites.sort(); for DrawItem { src, dst, .. } in self.sprites.drain(..) { - canvas.copy(&self.texture, src, dst).unwrap(); + canvas.copy_f(&self.texture, src, dst).unwrap(); } } } |