diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-04-10 11:41:29 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-04-10 11:41:29 -0400 |
| commit | a066448effaa9a56c049136067a73ba0156f65d3 (patch) | |
| tree | 7eee2f9db2f23d1847d53f67874d7af0d80732e0 | |
| parent | 3fbf01b3466bb94a730cc94fea72ea661ffb9759 (diff) | |
pke: ui box type text cleanup
| -rw-r--r-- | editor/editor.cpp | 2 | ||||
| -rw-r--r-- | src/font.cpp | 5 | ||||
| -rw-r--r-- | src/font.hpp | 41 | ||||
| -rw-r--r-- | src/game.cpp | 4 | ||||
| -rw-r--r-- | src/static-ui.cpp | 29 | ||||
| -rw-r--r-- | src/static-ui.hpp | 74 |
6 files changed, 92 insertions, 63 deletions
diff --git a/editor/editor.cpp b/editor/editor.cpp index 6eb7f35..8526bff 100644 --- a/editor/editor.cpp +++ b/editor/editor.cpp @@ -792,7 +792,7 @@ void GenerateMTSDF(FontTypeMSDFSettings *msdf_settings, const Asset *a) { // 9 horizontal tab fgc.unicode = 9; fgc.advance = 2; - fgc.flags = (FONT_GLYPH_CHAR_FLAGS)(FONT_GLYPH_CHAR_FLAGS_WHITESPACE | FONT_GLYPH_CHAR_FLAGS_ALIGN_ADVANCE); + fgc.flags = FONT_GLYPH_CHAR_FLAGS_WHITESPACE | FONT_GLYPH_CHAR_FLAGS_ALIGN_ADVANCE; pk_arr_append(required_font_glyph_chars_arr, &fgc); // 10 line feed fgc.unicode = 10; diff --git a/src/font.cpp b/src/font.cpp index 03ca3fd..9c8f1bc 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -30,6 +30,8 @@ const char *PKE_PROJECT_FONT_SPACING_UNDERLINE_THICKNESS = "spacing_underline_th TypeSafeInt_B(FontTypeIndex); TypeSafeInt_B(FontRenderIndex); +TypeSafeInt_B(FONT_GLYPH_CHAR_FLAG); +TypeSafeInt_B(FONT_RENDER_SURFACE_AREA_TYPE_FLAG); struct FontTypeData { FontType *arr_ft; @@ -120,6 +122,9 @@ void FontType_Inner_CalcTransforms(const FontType *ft, FontRender *fr, FontInsta glm::vec3 translate; glm::vec3 scale; + // TODO 2025-04-10 - JCB PERF + // consider adding early-out when we exceed the bounding-box limits. + // TODO 2025-02-18 - JCB // Trying to get pixel-perfect rendering with mannequin-7. // Everything is now sized and positioned correctly. diff --git a/src/font.hpp b/src/font.hpp index 56977de..0396e8d 100644 --- a/src/font.hpp +++ b/src/font.hpp @@ -10,22 +10,31 @@ TypeSafeInt_H(FontTypeIndex, uint16_t, 0xFFFF); TypeSafeInt_H(FontRenderIndex, uint16_t, 0xFFFF); -enum FONT_GLYPH_CHAR_FLAGS : uint8_t { - FONT_GLYPH_CHAR_FLAGS_NONE = (0 << 0), - FONT_GLYPH_CHAR_FLAGS_CONTROL = (1 << 0), - FONT_GLYPH_CHAR_FLAGS_WHITESPACE = (1 << 1), - FONT_GLYPH_CHAR_FLAGS_ALIGN_ADVANCE = (1 << 2), - FONT_GLYPH_CHAR_FLAGS_NEW_LINE = (1 << 3), -}; +TypeSafeInt_H(FONT_GLYPH_CHAR_FLAG, uint8_t, 0xFF); +TypeSafeInt_H(FONT_RENDER_SURFACE_AREA_TYPE_FLAG, uint8_t, 0xFF); -enum FONT_RENDER_SURFACE_AREA_TYPE_FLAGS : uint8_t { - FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_NONE = 0, - FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_GROW_VERTICAL = (1 << 0), - FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_GROW_HORIZONTAL = (1 << 1), +constexpr FONT_GLYPH_CHAR_FLAG FONT_GLYPH_CHAR_FLAGS_NONE + = FONT_GLYPH_CHAR_FLAG((0 << 0)); +constexpr FONT_GLYPH_CHAR_FLAG FONT_GLYPH_CHAR_FLAGS_CONTROL + = FONT_GLYPH_CHAR_FLAG((1 << 0)); +constexpr FONT_GLYPH_CHAR_FLAG FONT_GLYPH_CHAR_FLAGS_WHITESPACE + = FONT_GLYPH_CHAR_FLAG((1 << 1)); +constexpr FONT_GLYPH_CHAR_FLAG FONT_GLYPH_CHAR_FLAGS_ALIGN_ADVANCE + = FONT_GLYPH_CHAR_FLAG((1 << 2)); +constexpr FONT_GLYPH_CHAR_FLAG FONT_GLYPH_CHAR_FLAGS_NEW_LINE + = FONT_GLYPH_CHAR_FLAG((1 << 3)); - FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_STATIC = 0, - FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_FLUID = (1 << 0) | (1 << 1), -}; +constexpr FONT_RENDER_SURFACE_AREA_TYPE_FLAG FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_NONE + = FONT_RENDER_SURFACE_AREA_TYPE_FLAG(0); +constexpr FONT_RENDER_SURFACE_AREA_TYPE_FLAG FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_GROW_VERTICAL + = FONT_RENDER_SURFACE_AREA_TYPE_FLAG((1 << 0)); +constexpr FONT_RENDER_SURFACE_AREA_TYPE_FLAG FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_GROW_HORIZONTAL + = FONT_RENDER_SURFACE_AREA_TYPE_FLAG((1 << 1)); + +constexpr FONT_RENDER_SURFACE_AREA_TYPE_FLAG FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_STATIC + = FONT_RENDER_SURFACE_AREA_TYPE_FLAG(0); +constexpr FONT_RENDER_SURFACE_AREA_TYPE_FLAG FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_FLUID + = FONT_RENDER_SURFACE_AREA_TYPE_FLAG((1 << 0) | (1 << 1)); struct FontRenderHandle { FontTypeIndex index_ft; @@ -38,7 +47,7 @@ struct FontGlyphChar { glm::vec2 sprite_region_max; glm::dvec4 plane_bounds; uint32_t unicode; - FONT_GLYPH_CHAR_FLAGS flags; + FONT_GLYPH_CHAR_FLAG flags; }; struct FontRenderSettings { float char_scale; @@ -46,7 +55,7 @@ struct FontRenderSettings { float char_spacing_scale; glm::ivec2 surface_area_size; // TODO glm::ivec2 surface_area_pos; - FONT_RENDER_SURFACE_AREA_TYPE_FLAGS surface_area_type_flags; // TODO + FONT_RENDER_SURFACE_AREA_TYPE_FLAG surface_area_type_flags; // TODO }; struct FontRender { FontRenderHandle handle; diff --git a/src/game.cpp b/src/game.cpp index b5bb0a0..f00d613 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -190,7 +190,7 @@ void Game_Main(PKEWindowProperties windowProps, const char *executablePath) { // TODO remove me: temp stuff for testing pke_ui_box *ui_box = pke_ui_box_new_root(); - ui_box->flags = PKE_UI_BOX_FLAG_POSITION_TYPE_DYNAMIC; + ui_box->flags |= PKE_UI_BOX_FLAG_POSITION_TYPE_DYNAMIC; ui_box->pos_top_left_x = 0.1; ui_box->pos_top_left_y = 0.1; ui_box->max_width = 0.8; @@ -198,7 +198,7 @@ void Game_Main(PKEWindowProperties windowProps, const char *executablePath) { // TODO remove me: temp stuff for testing pke_ui_box *c_ui_box = pke_ui_box_new_child(ui_box, PKE_UI_BOX_TYPE_TEXT); - c_ui_box->flags = PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC; + c_ui_box->flags |= PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC; c_ui_box->pos_top_left_x = 20; c_ui_box->pos_top_left_y = 20; c_ui_box->max_width = 3000; diff --git a/src/static-ui.cpp b/src/static-ui.cpp index 1c089b9..9df7ffa 100644 --- a/src/static-ui.cpp +++ b/src/static-ui.cpp @@ -13,6 +13,9 @@ #include <cstring> #include <vulkan/vulkan_core.h> +TypeSafeInt_B(PKE_UI_BOX_TYPE); +TypeSafeInt_B(PKE_UI_BOX_FLAG); + struct pke_ui_box_instance_buffer_item { glm::mat4 pos_scale; glm::vec2 px_scale; @@ -195,6 +198,16 @@ void pke_ui_calc_px(DynArray<pke_ui_box_instance_buffer_item> &buffer, pke_ui_fl box->internal.parent->internal.px_padding_t += px_size.y; } + if (box->type_data != nullptr) { + // type-specific changes + if (box->type == PKE_UI_BOX_TYPE_TEXT) { + pke_ui_box_type_data_text *data_text = reinterpret_cast<pke_ui_box_type_data_text*>(box->type_data); + data_text->font_render_settings.surface_area_pos = box->internal.px_corner; + data_text->font_render_settings.surface_area_size = box->internal.px_size; + FontType_UpdateStringRender(data_text->font_render_handle, &data_text->font_render_settings); + } + } + if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_VISIBILITY_INVISIBLE)) { return; } @@ -224,25 +237,14 @@ void pke_ui_calc_px(DynArray<pke_ui_box_instance_buffer_item> &buffer, pke_ui_fl buffer_item->px_scale.x = (2.0 / (float)Extent.width); buffer_item->px_scale.y = (2.0 / (float)Extent.height); buffer_item->depth = (float)box->layer; - - if (box->type_data == nullptr) return; - - // type-specific changes - if (box->type == PKE_UI_BOX_TYPE_TEXT) { - pke_ui_box_type_data_text *data_text = reinterpret_cast<pke_ui_box_type_data_text*>(box->type_data); - data_text->font_render_settings.surface_area_pos = box->internal.px_corner; - data_text->font_render_settings.surface_area_size = box->internal.px_size; - FontType_UpdateStringRender(data_text->font_render_handle, &data_text->font_render_settings); - return; - } } void pke_ui_recalc_sizes_recursive(DynArray<pke_ui_box_instance_buffer_item> &arr, pke_ui_box *box, uint8_t depth = 0) { - uint64_t flags_masked; + PKE_UI_BOX_FLAG_T flags_masked; uint8_t flex_count = 0; pke_ui_flex_params flex_params{}; - flags_masked = box->flags & (PKE_UI_BOX_FLAG_POSITION_TYPE_ALL); + flags_masked = PKE_UI_BOX_FLAG_T(box->flags & PKE_UI_BOX_FLAG_POSITION_TYPE_ALL); if (flags_masked == 0b000 || flags_masked == 0b011 || flags_masked == 0b101 || flags_masked == 0b110 || flags_masked == 0b111) { fprintf(stderr, "[%s] ui box invalid flags: position type", __FILE__); return; @@ -447,6 +449,7 @@ void pke_ui_internal_new_typed_box(pke_ui_box *box, const PKE_UI_BOX_TYPE type) break; case PKE_UI_BOX_TYPE_TEXT: box->type_data = pk_new<pke_ui_box_type_data_text>(pke_ui_master.bkt); + box->flags |= PKE_UI_BOX_FLAG_VISIBILITY_INVISIBLE; break; case PKE_UI_BOX_TYPE_INPUT_TEXT: break; diff --git a/src/static-ui.hpp b/src/static-ui.hpp index 3d64ce8..95506d7 100644 --- a/src/static-ui.hpp +++ b/src/static-ui.hpp @@ -18,43 +18,55 @@ struct MSDFGlyphSettings { float range_em; }; -enum PKE_UI_BOX_TYPE : uint8_t { - // layouts - PKE_UI_BOX_TYPE_STANDARD = 000, - // TODO columns, rows, tabs, etc - - // special (content) - PKE_UI_BOX_TYPE_TEXT = 050, - // TODO image, render target, etc - - // inputs - PKE_UI_BOX_TYPE_INPUT_TEXT = 100, // TODO - // TODO multi-line text, scalar, float, slider, button, etc -}; - -enum PKE_UI_BOX_FLAGS : uint64_t { - PKE_UI_BOX_FLAG_NONE = 0, - // [00-04] position type - // exact screen coordinates - PKE_UI_BOX_FLAG_POSITION_TYPE_FLEX = (1 << 0), - PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC = (1 << 1), - PKE_UI_BOX_FLAG_POSITION_TYPE_DYNAMIC = (1 << 2), - PKE_UI_BOX_FLAG_POSITION_TYPE_ALL = (1 << 0) | (1 << 1) | (1 << 2), - // [05-06] center - PKE_UI_BOX_FLAG_CENTER_HORIZONTAL = (1 << 5), - PKE_UI_BOX_FLAG_CENTER_VERTICAL = (1 << 6), - PKE_UI_BOX_FLAG_CENTER_BOTH = (1 << 5) | (1 << 6), - // [07-09] visibility - PKE_UI_BOX_FLAG_VISIBILITY_INVISIBLE = (1 << 7), - // [10-??] -}; +TypeSafeInt_H(PKE_UI_BOX_TYPE, uint8_t, 0xFF); +TypeSafeInt_H(PKE_UI_BOX_FLAG, uint64_t, 0xFFFFFFFFFFFFFFFF); + +// layouts +constexpr PKE_UI_BOX_TYPE PKE_UI_BOX_TYPE_STANDARD + = PKE_UI_BOX_TYPE(000); +// TODO columns, rows, tabs, etc + +// special (content) +constexpr PKE_UI_BOX_TYPE PKE_UI_BOX_TYPE_TEXT + = PKE_UI_BOX_TYPE(050); +// TODO image, render target, etc + +// inputs +constexpr PKE_UI_BOX_TYPE PKE_UI_BOX_TYPE_INPUT_TEXT + = PKE_UI_BOX_TYPE(100); +// TODO multi-line text, scalar, float, slider, button, etc + + +constexpr PKE_UI_BOX_FLAG PKE_UI_BOX_FLAG_NONE + = PKE_UI_BOX_FLAG(0); +// [00-04] position type +// exact screen coordinates +constexpr PKE_UI_BOX_FLAG PKE_UI_BOX_FLAG_POSITION_TYPE_FLEX + = PKE_UI_BOX_FLAG((1 << 0)); +constexpr PKE_UI_BOX_FLAG PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC + = PKE_UI_BOX_FLAG((1 << 1)); +constexpr PKE_UI_BOX_FLAG PKE_UI_BOX_FLAG_POSITION_TYPE_DYNAMIC + = PKE_UI_BOX_FLAG((1 << 2)); +constexpr PKE_UI_BOX_FLAG PKE_UI_BOX_FLAG_POSITION_TYPE_ALL + = PKE_UI_BOX_FLAG((1 << 0) | (1 << 1) | (1 << 2)); +// [05-06] center +constexpr PKE_UI_BOX_FLAG PKE_UI_BOX_FLAG_CENTER_HORIZONTAL + = PKE_UI_BOX_FLAG((1 << 5)); +constexpr PKE_UI_BOX_FLAG PKE_UI_BOX_FLAG_CENTER_VERTICAL + = PKE_UI_BOX_FLAG((1 << 6)); +constexpr PKE_UI_BOX_FLAG PKE_UI_BOX_FLAG_CENTER_BOTH + = PKE_UI_BOX_FLAG((1 << 5) | (1 << 6)); +// [07-09] visibility +constexpr PKE_UI_BOX_FLAG PKE_UI_BOX_FLAG_VISIBILITY_INVISIBLE + = PKE_UI_BOX_FLAG((1 << 7)); +// [10-??] typedef uint16_t pke_ui_box_count_T; struct pke_ui_box; struct pke_ui_box { - PKE_UI_BOX_FLAGS flags; + PKE_UI_BOX_FLAG flags; float pos_top_left_x, pos_top_left_y; float min_width, min_height; float max_width, max_height; |
