From 25817f77803fe588a7f69f64e47eff60a530ff94 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Wed, 16 Jul 2025 21:40:48 -0500 Subject: [PATCH] font: add draw_float --- src/demo/font.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/demo/font.hpp | 20 ++++++++++++++++++++ src/demo/graphics.cpp | 2 ++ 3 files changed, 58 insertions(+) diff --git a/src/demo/font.cpp b/src/demo/font.cpp index 1ddd953..975b6eb 100644 --- a/src/demo/font.cpp +++ b/src/demo/font.cpp @@ -4,6 +4,8 @@ #include "demo/ta_parameter_presets.hpp" #include "demo/texture.hpp" +#include "printf/unparse.h" + namespace font { static inline vec2 transform_glyph_texture(const face& face, const vec2& t, int char_code) @@ -70,6 +72,40 @@ namespace font { base_color); } + static inline int format_float(char * s, float num) + { + int offset = 0; + bool negative = num < 0; + if (negative) { + s[offset++] = '-'; + num = -num; + } + int32_t whole = num; + offset += unparse_base10_unsigned(&s[offset], whole, 0, 0); + s[offset++] = '.'; + int32_t fraction = (int32_t)((num - (float)whole) * 1000.0); + if (fraction < 0) + fraction = -fraction; + offset += unparse_base10_unsigned(&s[offset], fraction, 3, '0'); + return offset; + } + + void face::draw_float(ta_parameter_writer& writer, + const vec3& p, + float num, + uint32_t base_color, + int length) const + { + char s[20]; + int offset = format_float(s, num); + s[offset] = 0; + float x = p.x; + if (offset < length) { + x += hori_advance * (length - offset); + } + draw_string(writer, {x, p.y, p.z}, s, base_color); + } + const face ter_u12n = { .texture_size = tsp_instruction_word::texture_u_size::from_int(128) | tsp_instruction_word::texture_v_size::from_int(64), diff --git a/src/demo/font.hpp b/src/demo/font.hpp index 02f3892..a9d2302 100644 --- a/src/demo/font.hpp +++ b/src/demo/font.hpp @@ -22,6 +22,26 @@ namespace font { const vec3& p, int c, uint32_t base_color) const; + + inline void draw_string(ta_parameter_writer& writer, + const vec3& p, + const char * s, + uint32_t base_color) const + { + const uint8_t * u8 = (const uint8_t *)s; + float x = p.x; + while (*u8) { + int c = *u8++; + draw_glyph(writer, {x, p.y, p.z}, c, base_color); + x += hori_advance; + } + } + + void draw_float(ta_parameter_writer& writer, + const vec3& p, + float num, + uint32_t base_color, + int length = 0) const; }; extern const face ter_u12n; diff --git a/src/demo/graphics.cpp b/src/demo/graphics.cpp index 1e408c5..ec1086f 100644 --- a/src/demo/graphics.cpp +++ b/src/demo/graphics.cpp @@ -96,6 +96,8 @@ namespace graphics { { font::ter_u12n.global(writer); font::ter_u12n.draw_glyph(writer, vec3(10, 10, 10), 'a', 0xffffffff); + font::ter_u12n.draw_float(writer, vec3(10, 22, 10), 1.234, 0xffffffff, 7); + font::ter_u12n.draw_float(writer, vec3(10, 34, 10), -50.234, 0xffffffff, 7); writer.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list);