diff options
| author | Freya Murphy <freya@freyacat.org> | 2025-11-08 14:28:29 -0500 |
|---|---|---|
| committer | Freya Murphy <freya@freyacat.org> | 2025-11-08 14:28:29 -0500 |
| commit | a4e46e4e564882b40605517ae8053e027befbea3 (patch) | |
| tree | 0cb7c4319beec2ece95af11673bc0e5e8e0fa0ac /graphics | |
| parent | assets: extend font (diff) | |
| download | DungeonCrawl-a4e46e4e564882b40605517ae8053e027befbea3.tar.gz DungeonCrawl-a4e46e4e564882b40605517ae8053e027befbea3.tar.bz2 DungeonCrawl-a4e46e4e564882b40605517ae8053e027befbea3.zip | |
graphics: refactor debug ui
Diffstat (limited to 'graphics')
| -rw-r--r-- | graphics/Cargo.toml | 1 | ||||
| -rw-r--r-- | graphics/src/lib.rs | 5 | ||||
| -rw-r--r-- | graphics/src/render.rs | 122 |
3 files changed, 103 insertions, 25 deletions
diff --git a/graphics/Cargo.toml b/graphics/Cargo.toml index 050c314..6f3be4e 100644 --- a/graphics/Cargo.toml +++ b/graphics/Cargo.toml @@ -16,6 +16,5 @@ workspace = true [features] default = [] -debug = [] wayland = ["sdl", "raylib/wayland"] sdl = ["raylib/sdl"] diff --git a/graphics/src/lib.rs b/graphics/src/lib.rs index 81ac16e..a9567eb 100644 --- a/graphics/src/lib.rs +++ b/graphics/src/lib.rs @@ -87,6 +87,11 @@ impl Window { .draw_frame(self.handle.get_mut(), &self.thread, dungeon); } + /// Toggles the debug UI + pub fn toggle_debug(&mut self) { + self.renderer.toggle_debug(); + } + /// Returns the per frame delta time pub fn delta_time(&self) -> f32 { self.handle.borrow().get_frame_time() diff --git a/graphics/src/render.rs b/graphics/src/render.rs index 95aecb8..aaa9983 100644 --- a/graphics/src/render.rs +++ b/graphics/src/render.rs @@ -39,6 +39,14 @@ macro_rules! vec2 { }; } +macro_rules! draw_text { + ($self:ident, $r:expr, $x:expr, $y:expr, $buffer:expr, $offset:expr, $($arg:tt)*) => {{ + let mut buffer = *$buffer; + let _ = write!(&mut buffer[$offset..], $($arg)*); + $self.draw_text($r, &buffer, $x, $y); + }}; +} + /// The baseline size of all ingame sprites and tile textures const BASE_TEXTURE_SIZE: u16 = 16; @@ -128,6 +136,10 @@ pub struct Renderer { width: u16, /// Render height of the current frame height: u16, + /// The current frame + frame: u64, + /// Show debug UI + debug: bool, } impl Renderer { pub fn new(handle: &mut RaylibHandle, thread: &RaylibThread) -> crate::Result<Self> { @@ -150,9 +162,15 @@ impl Renderer { fps: 0, width: 0, height: 0, + frame: 0, + debug: false, }) } + pub fn toggle_debug(&mut self) { + self.debug = !self.debug; + } + pub fn draw_frame( &mut self, handle: &mut RaylibHandle, @@ -182,6 +200,8 @@ impl Renderer { let pixels = size.div(dist).max(BASE_TEXTURE_SIZE); 1 << (u16::BITS - pixels.leading_zeros()) }; + // Update frame counter + self.frame += 1; } /// Returns the Raylib Camera setup with needed 2D position/transforms @@ -392,6 +412,10 @@ impl Renderer { 0.0, Color::WHITE, ); + + if self.debug { + r.draw_rectangle_lines_ex(dest_rec, 1.0, Color::YELLOW); + } } /// Returns the known UI height for this frame @@ -417,14 +441,15 @@ impl Renderer { // Draw UI base rect r.draw_rectangle_ext(0, 0, self.width, self.get_ui_height(), Color::BLACK); + if self.debug { + self.draw_debug_ui(r, dungeon); + return; + } + // Draw core ui components self.draw_minimap(r, dungeon); self.draw_inventory(r, &dungeon.player); self.draw_stats(r, &dungeon.player); - - // Draw debug info - #[cfg(feature = "debug")] - self.draw_debug_ui(r); } /// Draw in game minimap @@ -551,11 +576,7 @@ impl Renderer { let icon_x = stats_x; let text_x = icon_x + icon_width; - // text buffer - let mut buffer = [b'x', b'0', b'0']; - // draw health - let _ = write!(&mut buffer[1..], "{health:02}"); let heart_y = padding; r.draw_inv_atlas( &self.textures.atlas, @@ -565,10 +586,9 @@ impl Renderer { icon_width, 0.0, ); - self.draw_text(r, &buffer, text_x, heart_y + padding); + draw_text!(self, r, text_x, heart_y + padding, b"x00", 1, "{health:02}"); // draw damage - let _ = write!(&mut buffer[1..], "{damage:02}"); let damage_y = heart_y + font_size + padding; r.draw_inv_atlas( &self.textures.atlas, @@ -578,27 +598,81 @@ impl Renderer { icon_width, 0.0, ); - self.draw_text(r, &buffer, text_x, damage_y + padding); + draw_text!( + self, + r, + text_x, + damage_y + padding, + b"x00", + 1, + "{damage:02}" + ); } /// Draws debug information ontop of other UI elements - /// Called by default if `debug` featue is enabled - #[cfg(feature = "debug")] - fn draw_debug_ui<R>(&self, r: &mut R) + fn draw_debug_ui<R>(&self, r: &mut R, dungeon: &Dungeon) where R: RaylibDraw, { - self.draw_fps(r); - } + let padding = self.get_ui_padding(); + let font_size = self.get_ui_font_size(); + let player = &dungeon.player; - /// Draw FPS counter (debug) - #[cfg(feature = "debug")] - fn draw_fps<R>(&self, r: &mut R) - where - R: RaylibDraw, - { - let fps_str = format!("{}", self.fps); - r.draw_text(&fps_str, 10, 10, 30, Color::YELLOW); + // X Positions + let col1 = padding; + let col2 = padding + font_size * 10; + + // Y Positions + let row1 = padding; + let row2 = row1 + font_size; + let row3 = row2 + font_size; + + // Draw FPS + draw_text!(self, r, col1, row1, b"FPS ", 4, "{}", self.fps); + + // Draw Player position + let (x, y) = &player.entity.pos.xy(); + draw_text!(self, r, col1, row2, b"POS 00,00", 4, "{x:02},{y:02}"); + + // Draw Player direction + let dir = &player.entity.dir; + draw_text!(self, r, col1, row3, b"DIR ", 4, "{dir}"); + + // Draw Player Seed + let seed = &dungeon.floor.seed(); + draw_text!( + self, + r, + col2, + row1, + b" SEED 0x0000000000000000", + 8, + "{seed:X}" + ); + + // Draw Dungeon Hash + let hash = dungeon.floor.hash(); + draw_text!( + self, + r, + col2, + row2, + b" HASH 0x0000000000000000", + 8, + "{hash:X}" + ); + + // Draw current frame number + let frame = &self.frame; + draw_text!( + self, + r, + col2, + row3, + b"FRAME ", + 6, + "{frame}" + ); } /// Draws vertical text |