summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-04-10 11:41:29 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-04-10 11:41:29 -0400
commita066448effaa9a56c049136067a73ba0156f65d3 (patch)
tree7eee2f9db2f23d1847d53f67874d7af0d80732e0
parent3fbf01b3466bb94a730cc94fea72ea661ffb9759 (diff)
pke: ui box type text cleanup
-rw-r--r--editor/editor.cpp2
-rw-r--r--src/font.cpp5
-rw-r--r--src/font.hpp41
-rw-r--r--src/game.cpp4
-rw-r--r--src/static-ui.cpp29
-rw-r--r--src/static-ui.hpp74
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;