Crafter.Graphics/examples/VulkanUI
2026-05-02 00:03:24 +02:00
..
Inter.ttf new UI system 2026-05-01 23:35:37 +02:00
main.cpp new UI system 2026-05-01 23:35:37 +02:00
project.cpp new UI system 2026-05-01 23:35:37 +02:00
README.md animated example 2026-05-02 00:03:24 +02:00

VulkanUI

A walking tour of the V1 widget set. UI-only (no 3D pass), so the entire visible image comes from one compute dispatch per frame.

What it shows

  • Layout: nested VStack / HStack / Spacer / TabView, fluent builder API, Length::Px / Pct / Frac / Auto units, DPI scaling (your Window::scale flows through automatically).
  • Theming: themes::default_dark() with theme.primary / secondary / danger / input styles applied per-widget via .style(...).
  • Text: per-run colour styling via TextRun, an em-dash in the header to confirm UTF-8 decoding works end-to-end.
  • Buttons: rounded background (SDF in the shader), centred SDF glyphs, onClick callbacks. Quit calls _Exit(0) so a working click visibly closes the window.
  • Progress bar: a ProgressBar at 42 %.
  • TabView: three tabs (Graphics / Input / Audio); clicking the tab bar swaps content.
  • InputField: focusable text edits with caret blink, UTF-8 typing, Backspace / Delete / arrow keys / Home / End, key repeat, horizontal scrolling that keeps the caret visible, clipping that prevents overflow from drawing past the field's bounds.

Run

cd examples/VulkanUI
crafter-build -r

Interactions to try

Action Expected
Click Play / Options Prints [click] ... to stderr
Click Quit App exits
Click a tab label (Graphics / Input / Audio) Tab body swaps
Click an InputField Border turns blue, caret appears and blinks
Type Characters appear at the caret, including multi-byte UTF-8
Hold a letter After ~500 ms the character starts repeating at ~25 Hz
Backspace / Delete Removes one full UTF-8 codepoint
← / → / Home / End Moves the caret
Type past the right edge Text scrolls left, caret stays visible
Click outside any input Caret disappears (focus cleared)

Notes

The shader (shaders/ui.comp.glsl in the library) is compiled to ui.comp.spv next to the binary by the build system. The font (Inter.ttf) is bundled via cfg.files.push_back.