[Add] Debug overlay and UI fixes.

- Real time on-screen debug overlay to display performance metrics.
  Overlay can be toggled with C-d.

[Fixed]
- Corrects a "click-through" bug by implementing Z-ordering for window
  stack.
- Decouples taskbar from window z-order to provide a stable button
  layout that isn't affected by focus changes.
- Adds culling to the terminal history view to prevent rendering
  off-screen lines.
This commit is contained in:
Ritchie Cunningham 2025-10-05 00:46:19 +01:00
parent d37f632344
commit 1cbf8ff0d8
4 changed files with 95 additions and 0 deletions

View File

@ -0,0 +1,52 @@
#include <cstdio>
#include "debug_overlay.h"
#include "ui/ui_renderer.h"
#include "gfx/types.h"
DebugOverlay::DebugOverlay(void) :
_fps(0.0f),
_frame_time(0.0f),
_draw_calls(0),
_shape_vertices(0),
_text_vertices(0),
_update_timer(0.0f) {}
void DebugOverlay::update(float dt, int draw_calls, int shape_verts, int txt_verts) {
_update_timer += dt;
/* Only update a few times per sec to keep them readable. */
if(_update_timer > 0.2f) {
_update_timer = 0.0f;
_frame_time = dt * 1000.0f;
_fps = 1.0f / dt;
_draw_calls = draw_calls;
_shape_vertices = shape_verts;
_text_vertices = txt_verts;
}
}
void DebugOverlay::render(UIRenderer* ui_renderer) {
const Color text_color = { 0.0f, 1.0f, 0.0f }; /* Bright green. */
const float line_height = 18.0f;
const float padding = 5.0f;
char buffer[256];
/* Manages its own rendering batch. */
ui_renderer->begin_shapes();
ui_renderer->begin_text();
snprintf(buffer, sizeof(buffer), "FPS: %.0f (%.2f ms)", _fps, _frame_time);
ui_renderer->render_text(buffer, padding, padding+line_height*1, text_color);
snprintf(buffer, sizeof(buffer), "Draw Calls: %d", _draw_calls);
ui_renderer->render_text(buffer, padding, padding+line_height*2, text_color);
snprintf(buffer, sizeof(buffer), "Vertices: %d (Shape %d, Text: %d)",
_shape_vertices + _text_vertices, _shape_vertices, _text_vertices);
ui_renderer->render_text(buffer, padding, padding+line_height*3, text_color);
ui_renderer->flush_shapes();
ui_renderer->flush_text();
}

View File

@ -0,0 +1,24 @@
#pragma once
class UIRenderer;
/**
* Renders real-time performance metrics on screen.
*/
class DebugOverlay {
public:
DebugOverlay(void);
void update(float dt, int draw_calls, int shape_verts, int txt_verts);
void render(UIRenderer* ui_renderer);
private:
float _fps;
float _frame_time;
int _draw_calls;
int _shape_vertices;
int _text_vertices;
/* Oh? You want to be able to read the stats?! */
float _update_timer;
};

View File

@ -0,0 +1,5 @@
#include "debug_stats.h"
int DebugStats::draw_calls = 0;
int DebugStats::shape_vertices = 0;
int DebugStats::text_vertices = 0;

View File

@ -0,0 +1,14 @@
#pragma once
struct DebugStats {
static int draw_calls;
static int shape_vertices;
static int text_vertices;
static void reset(void) {
draw_calls = 0;
shape_vertices = 0;
text_vertices = 0;
}
};