diff options
Diffstat (limited to 'light-client/src/render')
-rw-r--r-- | light-client/src/render/misc.rs | 17 | ||||
-rw-r--r-- | light-client/src/render/mod.rs | 30 | ||||
-rw-r--r-- | light-client/src/render/sprite.rs | 15 |
3 files changed, 41 insertions, 21 deletions
diff --git a/light-client/src/render/misc.rs b/light-client/src/render/misc.rs new file mode 100644 index 00000000..9f866568 --- /dev/null +++ b/light-client/src/render/misc.rs @@ -0,0 +1,17 @@ +use super::{sprite::Sprite, AtlasLayout}; +use hurrycurry_protocol::glam::Vec2; +use sdl2::rect::Rect; + +pub struct MiscTextures { + pub player: Sprite, + pub solid: Rect, +} + +impl MiscTextures { + pub fn init(layout: &AtlasLayout) -> Self { + MiscTextures { + player: Sprite::new(*layout.get("player+a").unwrap(), Vec2::Y * 0.3, 0.5 + 0.3), + solid: *layout.get("solid+a").unwrap(), + } + } +} diff --git a/light-client/src/render/mod.rs b/light-client/src/render/mod.rs index fbf3d7a5..a410da6f 100644 --- a/light-client/src/render/mod.rs +++ b/light-client/src/render/mod.rs @@ -15,6 +15,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ +pub mod misc; pub mod sprite; use hurrycurry_protocol::glam::Vec2; @@ -24,11 +25,11 @@ use sdl2::{ render::{BlendMode, Canvas, Texture, TextureAccess, TextureCreator}, video::{Window, WindowContext}, }; -use sprite::{Sprite, SpriteDraw}; +use sprite::SpriteDraw; use std::collections::HashMap; pub struct SpriteRenderer<'a> { - metadata: HashMap<String, Rect>, + metadata: AtlasLayout, texture: Texture<'a>, @@ -38,6 +39,8 @@ pub struct SpriteRenderer<'a> { sprites: Vec<SpriteDraw>, } +pub type AtlasLayout = HashMap<String, Rect>; + impl<'a> SpriteRenderer<'a> { pub fn init(texture_creator: &'a TextureCreator<WindowContext>) -> Self { let palette = include_str!("../../assets/palette.csv") @@ -108,7 +111,7 @@ impl<'a> SpriteRenderer<'a> { } #[inline] - pub fn metadata(&self) -> &HashMap<String, Rect> { + pub fn atlas_layout(&self) -> &HashMap<String, Rect> { &self.metadata } @@ -122,6 +125,7 @@ impl<'a> SpriteRenderer<'a> { pub fn draw_world(&mut self, sprite: SpriteDraw) { self.sprites.push(SpriteDraw { + tint: sprite.tint, z_order: sprite.z_order, src: sprite.src, dst: FRect::new( @@ -135,24 +139,10 @@ impl<'a> SpriteRenderer<'a> { pub fn submit(&mut self, canvas: &mut Canvas<Window>) { self.sprites.sort(); - for SpriteDraw { src, dst, .. } in self.sprites.drain(..) { + for SpriteDraw { src, dst, tint, .. } in self.sprites.drain(..) { + self.texture.set_color_mod(tint[0], tint[1], tint[2]); + self.texture.set_alpha_mod(tint[3]); canvas.copy_f(&self.texture, src, dst).unwrap(); } } } - -pub struct MiscTextures { - pub player: Sprite, -} - -impl MiscTextures { - pub fn init(renderer: &SpriteRenderer) -> Self { - MiscTextures { - player: Sprite::new( - *renderer.metadata().get("player+a").unwrap(), - Vec2::Y * 0.3, - 0., - ), - } - } -} diff --git a/light-client/src/render/sprite.rs b/light-client/src/render/sprite.rs index c19f8392..711f45bf 100644 --- a/light-client/src/render/sprite.rs +++ b/light-client/src/render/sprite.rs @@ -22,7 +22,7 @@ impl Sprite { } } pub fn new_tile(src: Rect) -> Self { - Self::new(src, Vec2::new(0.5, 1.0), 0.) + Self::new(src, Vec2::new(0.5, 1.0), 0.5) } pub fn at(&self, pos: Vec2) -> SpriteDraw { SpriteDraw { @@ -34,17 +34,30 @@ impl Sprite { self.relative_dst.w, self.relative_dst.h, ), + tint: [0xff; 4], } } } #[derive(Debug, Clone, Copy)] pub struct SpriteDraw { + pub tint: [u8; 4], pub z_order: i32, pub src: Rect, pub dst: FRect, } +impl SpriteDraw { + pub fn overlay(src: Rect, pos: Vec2, size: Vec2, tint: Option<[u8; 4]>) -> Self { + Self { + dst: FRect::new(pos.x, pos.y, size.x, size.y), + src, + tint: tint.unwrap_or([0xff; 4]), + z_order: i32::MAX, + } + } +} + impl Ord for SpriteDraw { fn cmp(&self, other: &Self) -> std::cmp::Ordering { self.z_order.cmp(&other.z_order) |