aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-07-21 18:45:11 +0200
committermetamuffin <metamuffin@disroot.org>2024-07-21 22:17:54 +0200
commit64e00aad013da92d29851d3e8109a006b4dff8c5 (patch)
tree081e9a2829f3c247d48bf6468030f35c85b2db4f
parentb1eba76afaf7a506ff912634da6220db15d0023e (diff)
downloadhurrycurry-64e00aad013da92d29851d3e8109a006b4dff8c5.tar
hurrycurry-64e00aad013da92d29851d3e8109a006b4dff8c5.tar.bz2
hurrycurry-64e00aad013da92d29851d3e8109a006b4dff8c5.tar.zst
pc: draw text
-rw-r--r--pixel-client/assets/font.ini96
-rw-r--r--pixel-client/makefile2
-rw-r--r--pixel-client/src/game.rs10
-rw-r--r--pixel-client/src/main.rs5
-rw-r--r--pixel-client/src/menu.rs7
-rw-r--r--pixel-client/src/render/font.rs43
-rw-r--r--pixel-client/src/render/mod.rs55
-rw-r--r--pixel-client/src/tilemap.rs4
8 files changed, 193 insertions, 29 deletions
diff --git a/pixel-client/assets/font.ini b/pixel-client/assets/font.ini
new file mode 100644
index 00000000..f033334f
--- /dev/null
+++ b/pixel-client/assets/font.ini
@@ -0,0 +1,96 @@
+letter_32=font/letter_32
+letter_33=font/letter_33
+letter_34=font/letter_34
+letter_35=font/letter_35
+letter_36=font/letter_36
+letter_37=font/letter_37
+letter_38=font/letter_38
+letter_39=font/letter_39
+letter_40=font/letter_40
+letter_41=font/letter_41
+letter_42=font/letter_42
+letter_43=font/letter_43
+letter_44=font/letter_44
+letter_45=font/letter_45
+letter_46=font/letter_46
+letter_47=font/letter_47
+letter_48=font/letter_48
+letter_49=font/letter_49
+letter_50=font/letter_50
+letter_51=font/letter_51
+letter_52=font/letter_52
+letter_53=font/letter_53
+letter_54=font/letter_54
+letter_55=font/letter_55
+letter_56=font/letter_56
+letter_57=font/letter_57
+letter_58=font/letter_58
+letter_59=font/letter_59
+letter_60=font/letter_60
+letter_61=font/letter_61
+letter_62=font/letter_62
+letter_63=font/letter_63
+letter_64=font/letter_64
+letter_65=font/letter_65
+letter_66=font/letter_66
+letter_67=font/letter_67
+letter_68=font/letter_68
+letter_69=font/letter_69
+letter_70=font/letter_70
+letter_71=font/letter_71
+letter_72=font/letter_72
+letter_73=font/letter_73
+letter_74=font/letter_74
+letter_75=font/letter_75
+letter_76=font/letter_76
+letter_77=font/letter_77
+letter_78=font/letter_78
+letter_79=font/letter_79
+letter_80=font/letter_80
+letter_81=font/letter_81
+letter_82=font/letter_82
+letter_83=font/letter_83
+letter_84=font/letter_84
+letter_85=font/letter_85
+letter_86=font/letter_86
+letter_87=font/letter_87
+letter_88=font/letter_88
+letter_89=font/letter_89
+letter_90=font/letter_90
+letter_91=font/letter_91
+letter_92=font/letter_92
+letter_93=font/letter_93
+letter_94=font/letter_94
+letter_95=font/letter_95
+letter_96=font/letter_96
+letter_97=font/letter_97
+letter_98=font/letter_98
+letter_99=font/letter_99
+letter_100=font/letter_100
+letter_101=font/letter_101
+letter_102=font/letter_102
+letter_103=font/letter_103
+letter_104=font/letter_104
+letter_105=font/letter_105
+letter_106=font/letter_106
+letter_107=font/letter_107
+letter_108=font/letter_108
+letter_109=font/letter_109
+letter_110=font/letter_110
+letter_111=font/letter_111
+letter_112=font/letter_112
+letter_113=font/letter_113
+letter_114=font/letter_114
+letter_115=font/letter_115
+letter_116=font/letter_116
+letter_117=font/letter_117
+letter_118=font/letter_118
+letter_119=font/letter_119
+letter_120=font/letter_120
+letter_121=font/letter_121
+letter_122=font/letter_122
+letter_123=font/letter_123
+letter_124=font/letter_124
+letter_125=font/letter_125
+letter_126=font/letter_126
+letter_127=font/letter_127
diff --git a/pixel-client/makefile b/pixel-client/makefile
index 08bc46bc..764a4564 100644
--- a/pixel-client/makefile
+++ b/pixel-client/makefile
@@ -58,6 +58,6 @@ assets/sprites/%/all: assets/%.ini $(TEXTURES) $(COMPOSE)
$(COMPOSE) $< assets/textures $(shell dirname $@)
@touch $@
-assets/atlas.ta assets/atlas.meta.csv: assets/sprites/items/all assets/sprites/tiles/all assets/sprites/misc/all $(PACK)
+assets/atlas.ta assets/atlas.meta.csv: assets/sprites/items/all assets/sprites/tiles/all assets/sprites/font/all assets/sprites/misc/all $(PACK)
@echo $(PACK) assets/atlas.ta assets/atlas.meta.csv ...
@$(PACK) assets/atlas.ta assets/atlas.meta.csv $(SPRITES)
diff --git a/pixel-client/src/game.rs b/pixel-client/src/game.rs
index 90711c48..c129f991 100644
--- a/pixel-client/src/game.rs
+++ b/pixel-client/src/game.rs
@@ -21,7 +21,7 @@ use crate::{
render::{
misc::MiscTextures,
sprite::{Sprite, SpriteDraw},
- AtlasLayout, SpriteRenderer,
+ AtlasLayout, Renderer,
},
tilemap::Tilemap,
};
@@ -342,9 +342,9 @@ impl Game {
}
}
- pub fn draw(&self, ctx: &mut SpriteRenderer) {
- ctx.set_view(
- -self.camera_center + (ctx.size / ctx.get_scale() / 2.),
+ pub fn draw(&self, ctx: &mut Renderer) {
+ ctx.set_world_view(
+ -self.camera_center + (ctx.size / ctx.get_world_scale() / 2.),
ctx.size.min_element() / 32. / 10.,
);
@@ -381,7 +381,7 @@ impl Item {
self.position.exp_to(self.parent_position, dt * 20.);
self.alive.exp_to(alive, dt * 20.)
}
- pub fn draw(&self, ctx: &mut SpriteRenderer, item_sprites: &[Sprite], misc: &MiscTextures) {
+ pub fn draw(&self, ctx: &mut Renderer, item_sprites: &[Sprite], misc: &MiscTextures) {
ctx.draw_world(
item_sprites[self.kind.0]
.at(self.position)
diff --git a/pixel-client/src/main.rs b/pixel-client/src/main.rs
index 65de7b15..68c5b66a 100644
--- a/pixel-client/src/main.rs
+++ b/pixel-client/src/main.rs
@@ -20,7 +20,7 @@ use game::Game;
use hurrycurry_protocol::glam::Vec2;
use menu::Menu;
use network::Network;
-use render::SpriteRenderer;
+use render::Renderer;
use sdl2::{
event::Event,
keyboard::{KeyboardState, Keycode},
@@ -85,7 +85,7 @@ fn main() {
let texture_creator = canvas.texture_creator();
- let mut renderer = SpriteRenderer::init(&texture_creator);
+ let mut renderer = Renderer::init(&texture_creator);
let mut state = match args.action.unwrap_or_default() {
Action::Menu => State::Menu(Menu::new()),
@@ -112,6 +112,7 @@ fn main() {
last_tick += dt;
+ renderer.ui_scale = Vec2::new(5., 5.);
match &mut state {
State::Ingame(x) => x.draw(&mut renderer),
State::Menu(x) => x.draw(&mut renderer),
diff --git a/pixel-client/src/menu.rs b/pixel-client/src/menu.rs
index a3242edb..d9396e49 100644
--- a/pixel-client/src/menu.rs
+++ b/pixel-client/src/menu.rs
@@ -1,4 +1,5 @@
-use crate::render::{AtlasLayout, SpriteRenderer};
+use crate::render::{AtlasLayout, Renderer};
+use hurrycurry_protocol::glam::Vec2;
use sdl2::keyboard::KeyboardState;
pub struct Menu {}
@@ -14,5 +15,7 @@ impl Menu {
Self {}
}
pub fn tick(&mut self, _dt: f32, _keyboard: &KeyboardState, _layout: &AtlasLayout) {}
- pub fn draw(&self, _ctx: &mut SpriteRenderer) {}
+ pub fn draw(&self, ctx: &mut Renderer) {
+ ctx.draw_text(Vec2::new(1., 1.), "Hello world!");
+ }
}
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,
),
})
}
diff --git a/pixel-client/src/tilemap.rs b/pixel-client/src/tilemap.rs
index 05f33b4b..f52ffc1c 100644
--- a/pixel-client/src/tilemap.rs
+++ b/pixel-client/src/tilemap.rs
@@ -22,7 +22,7 @@ use std::collections::{HashMap, HashSet};
use crate::render::{
sprite::{Sprite, SpriteDraw},
- SpriteRenderer,
+ Renderer,
};
#[derive(Default)]
@@ -109,7 +109,7 @@ impl Tilemap {
.insert(pos, Sprite::new_tile(src).at(pos.as_vec2()));
}
- pub fn draw(&self, ctx: &mut SpriteRenderer) {
+ pub fn draw(&self, ctx: &mut Renderer) {
for &sprite in self.tiles.values() {
ctx.draw_world(sprite);
}