summaryrefslogtreecommitdiff
path: root/pixel-client/src/render
diff options
context:
space:
mode:
Diffstat (limited to 'pixel-client/src/render')
-rw-r--r--pixel-client/src/render/font.rs43
-rw-r--r--pixel-client/src/render/mod.rs55
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,
),
})
}