diff options
Diffstat (limited to 'pixel-client/src/render')
-rw-r--r-- | pixel-client/src/render/font.rs | 43 | ||||
-rw-r--r-- | pixel-client/src/render/mod.rs | 55 |
2 files changed, 81 insertions, 17 deletions
diff --git a/pixel-client/src/render/font.rs b/pixel-client/src/render/font.rs new file mode 100644 index 00000000..ff4abade --- /dev/null +++ b/pixel-client/src/render/font.rs @@ -0,0 +1,43 @@ +use super::{sprite::SpriteDraw, AtlasLayout, Renderer}; +use hurrycurry_protocol::glam::Vec2; +use sdl2::rect::Rect; + +pub struct FontTextures { + pub glyphs: [Rect; 128], +} + +impl FontTextures { + pub fn init(layout: &AtlasLayout) -> Self { + FontTextures { + glyphs: (0..128) + .into_iter() + .map(|n| { + layout + .get(&format!("letter_{n}+a")) + .copied() + .unwrap_or(Rect::new(0, 0, 0, 0)) + }) + .collect::<Vec<_>>() + .try_into() + .unwrap(), + } + } +} + +impl<'a> Renderer<'a> { + pub fn draw_text(&mut self, position: Vec2, text: &str) { + let mut cursor = position; + for c in text.chars() { + if (c as u32) < 128 { + let r = self.font_textures.glyphs[c as usize]; + self.draw_ui(SpriteDraw::overlay( + r, + cursor, + Vec2::new(r.width() as f32, r.height() as f32), + None, + )); + cursor.x += r.width() as f32; + } + } + } +} diff --git a/pixel-client/src/render/mod.rs b/pixel-client/src/render/mod.rs index 43e08d61..9b3132f9 100644 --- a/pixel-client/src/render/mod.rs +++ b/pixel-client/src/render/mod.rs @@ -15,9 +15,11 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ +pub mod font; pub mod misc; pub mod sprite; +use font::FontTextures; use hurrycurry_protocol::glam::Vec2; use sdl2::{ pixels::PixelFormatEnum, @@ -28,21 +30,24 @@ use sdl2::{ use sprite::SpriteDraw; use std::collections::HashMap; -pub struct SpriteRenderer<'a> { +pub struct Renderer<'a> { metadata: AtlasLayout, + font_textures: FontTextures, + pub size: Vec2, texture: Texture<'a>, - view_scale: Vec2, - view_offset: Vec2, + world_scale: Vec2, + world_offset: Vec2, + pub ui_scale: Vec2, sprites: Vec<SpriteDraw>, } pub type AtlasLayout = HashMap<String, Rect>; -impl<'a> SpriteRenderer<'a> { +impl<'a> Renderer<'a> { pub fn init(texture_creator: &'a TextureCreator<WindowContext>) -> Self { let palette = include_str!("../../assets/palette.csv") .split('\n') @@ -88,7 +93,7 @@ impl<'a> SpriteRenderer<'a> { texture.update(None, &texels, 1024 * 4).unwrap(); texture.set_blend_mode(BlendMode::Blend); - let metadata = include_str!("../../assets/atlas.meta.csv") + let atlas_layout = include_str!("../../assets/atlas.meta.csv") .lines() .filter(|l| !l.is_empty()) .map(|l| { @@ -103,21 +108,23 @@ impl<'a> SpriteRenderer<'a> { .collect::<HashMap<_, _>>(); Self { + ui_scale: Vec2::ZERO, texture, + font_textures: FontTextures::init(&atlas_layout), size: Vec2::ONE, - metadata, + metadata: atlas_layout, sprites: vec![], - view_offset: Vec2::ZERO, - view_scale: Vec2::ZERO, + world_offset: Vec2::ZERO, + world_scale: Vec2::ZERO, } } - pub fn set_view(&mut self, offset: Vec2, scale: f32) { - self.view_offset = offset; - self.view_scale = Vec2::new(32., 24.) * scale; + pub fn set_world_view(&mut self, offset: Vec2, scale: f32) { + self.world_offset = offset; + self.world_scale = Vec2::new(32., 24.) * scale; } - pub fn get_scale(&self) -> Vec2 { - self.view_scale + pub fn get_world_scale(&self) -> Vec2 { + self.world_scale } #[inline] @@ -139,10 +146,24 @@ impl<'a> SpriteRenderer<'a> { z_order: sprite.z_order, src: sprite.src, dst: FRect::new( - (sprite.dst.x + self.view_offset.x) * self.view_scale.x, - (sprite.dst.y + self.view_offset.y) * self.view_scale.y, - sprite.dst.w * self.view_scale.x, - sprite.dst.h * self.view_scale.y, + (sprite.dst.x + self.world_offset.x) * self.world_scale.x, + (sprite.dst.y + self.world_offset.y) * self.world_scale.y, + sprite.dst.w * self.world_scale.x, + sprite.dst.h * self.world_scale.y, + ), + }) + } + + pub fn draw_ui(&mut self, sprite: SpriteDraw) { + self.sprites.push(SpriteDraw { + tint: sprite.tint, + z_order: sprite.z_order, + src: sprite.src, + dst: FRect::new( + sprite.dst.x * self.ui_scale.x, + sprite.dst.y * self.ui_scale.y, + sprite.dst.w * self.ui_scale.x, + sprite.dst.h * self.ui_scale.y, ), }) } |