summaryrefslogtreecommitdiff
path: root/src/shaders/debug
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-03-08 10:49:08 +0100
committerskal <pascal.massimino@gmail.com>2026-03-08 10:49:08 +0100
commit4bc54609d7af62dd8e09977ec016f711f56c6e1d (patch)
tree770ce9a8b1ce24d5194beb215b79ab2c67825201 /src/shaders/debug
parent21b061b951ec3a65bc479fabeb2d9565e08a807e (diff)
feat: add WGSL debug_f32() snippet with C64 8x8 font
Renders a f32 value (±999.999, 3 decimal digits) at a given screen position using authentic C64 8x8 bitmap glyphs in yellow. Usage: col = debug_f32(col, pos.xy, vec2f(10.0, 10.0), value); Include: #include "debug/debug_print" handoff(Gemini): new snippet at src/shaders/debug/debug_print.wgsl Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'src/shaders/debug')
-rw-r--r--src/shaders/debug/debug_print.wgsl67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/shaders/debug/debug_print.wgsl b/src/shaders/debug/debug_print.wgsl
new file mode 100644
index 0000000..ee9b107
--- /dev/null
+++ b/src/shaders/debug/debug_print.wgsl
@@ -0,0 +1,67 @@
+// Debug print utility: renders a f32 value at a pixel position using 8×8 C64 font.
+// Include: #include "debug/debug_print"
+//
+// Usage:
+// col = debug_f32(col, pos.xy, vec2f(10.0, 10.0), my_value);
+//
+// Format: [-]DDD.DDD (8 chars × 8px wide = 64×8 pixel area)
+// Range: -999.999 to 999.999
+
+// Returns the lit pixel (0 or 1) for glyph g, pixel row r [0-7], column c [0-7].
+// Glyphs: 0-9 = digits, 10 = '-', 11 = '.', 12 = ' '
+// Encoding: 2 u32s per glyph; hi covers rows 0-3, lo covers rows 4-7.
+// Within each u32, row r occupies bits [(3-r%4)*8 + 7 : (3-r%4)*8].
+fn _dbg_pixel(g: u32, r: u32, c: u32) -> u32 {
+ let data = array<u32, 26>(
+ 0x3C666E76u, 0x66663C00u, // '0'
+ 0x18381818u, 0x18187E00u, // '1'
+ 0x3C66060Cu, 0x18307E00u, // '2'
+ 0x3C66061Cu, 0x06663C00u, // '3'
+ 0x0C1C2C4Cu, 0x7E0C0C00u, // '4'
+ 0x7E607C06u, 0x06663C00u, // '5'
+ 0x1C30607Cu, 0x66663C00u, // '6'
+ 0x7E060C18u, 0x18181800u, // '7'
+ 0x3C66663Cu, 0x66663C00u, // '8'
+ 0x3C66663Eu, 0x060C3800u, // '9'
+ 0x0000007Eu, 0x00000000u, // '-'
+ 0x00000000u, 0x00181800u, // '.'
+ 0x00000000u, 0x00000000u, // ' '
+ );
+ let word = data[g * 2u + (r / 4u)];
+ let shift = (3u - (r % 4u)) * 8u + (7u - c);
+ return (word >> shift) & 1u;
+}
+
+// Overlays printed value onto col, returning updated RGB.
+// pixel_pos : @builtin(position).xy
+// origin : top-left corner of text in screen pixels
+// value : f32 to display
+fn debug_f32(col: vec3f, pixel_pos: vec2f, origin: vec2f, value: f32) -> vec3f {
+ let ink_color = vec3f(1.0, 1.0, 0.0); // yellow
+ let lp = pixel_pos - origin;
+ if (lp.x < 0.0 || lp.x >= 64.0 || lp.y < 0.0 || lp.y >= 8.0) {
+ return col;
+ }
+ let ix = u32(lp.x);
+ let iy = u32(lp.y);
+ let char_col = ix / 8u;
+ let bit_col = ix % 8u;
+
+ let neg = value < 0.0;
+ let abs_val = min(abs(value), 999.999f);
+ let int_part = u32(abs_val);
+ let frac_s = min(u32((abs_val - f32(int_part)) * 1000.0 + 0.5), 999u);
+
+ var g: u32;
+ switch char_col {
+ case 0u: { g = select(12u, 10u, neg); } // sign
+ case 1u: { g = (int_part / 100u) % 10u; } // hundreds
+ case 2u: { g = (int_part / 10u) % 10u; } // tens
+ case 3u: { g = int_part % 10u; } // ones
+ case 4u: { g = 11u; } // '.'
+ case 5u: { g = (frac_s / 100u) % 10u; } // tenths
+ case 6u: { g = (frac_s / 10u) % 10u; } // hundredths
+ default: { g = frac_s % 10u; } // thousandths
+ }
+ return mix(col, ink_color, f32(_dbg_pixel(g, iy, bit_col)));
+}