diff options
Diffstat (limited to 'src/static-ui.cpp')
| -rw-r--r-- | src/static-ui.cpp | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/src/static-ui.cpp b/src/static-ui.cpp index c61b0aa..1204879 100644 --- a/src/static-ui.cpp +++ b/src/static-ui.cpp @@ -267,7 +267,7 @@ struct pke_ui_flex_params { bool pke_ui_calc_px(pk_arr_t<pke_ui_box_instance_buffer_item> &buffer, pk_arr_t<std::pair<pke_ui_box*,pke_ui_box_instance_buffer_item>> &tmp_txtr_buffer, pke_ui_flex_params *flex_params, pke_ui_box *box, uint8_t child_index) { assert(box != nullptr); pke_ui_box_count_T i; - float flex_padding; + float flex_padding, l, t; glm::vec2 px_size; glm::vec2 px_min_size; glm::vec2 px_max_size; @@ -400,6 +400,19 @@ bool pke_ui_calc_px(pk_arr_t<pke_ui_box_instance_buffer_item> &buffer, pk_arr_t< box->internal.px_size.x = px_size.x; box->internal.px_size.y = px_size.y; + if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_VISIBILITY_PIXEL_PERFECT)) { + l = fmod(box->internal.px_corner.x, 1.0); + t = fmod(box->internal.px_corner.y, 1.0); + box->internal.px_corner.x -= l; + box->internal.px_corner.y -= t; + box->internal.px_size.x += l; + box->internal.px_size.y += t; + l = fmod(box->internal.px_size.x, 1.0); + t = fmod(box->internal.px_size.y, 1.0); + box->internal.px_size.x += 1.0 - l; + box->internal.px_size.y += 1.0 - t; + } + // type-specific changes FontRenderSettings frs; switch (box->type) { @@ -537,13 +550,21 @@ void pke_ui_recalc_sizes_recursive(pk_arr_t<pke_ui_box_instance_buffer_item> &ar return; } if (flex_count != 0) { - assert(box->flex_padding == box->flex_padding); // NaN + assert(!glm::isnan(box->flex_padding)); available_size = box->flex_direction == 0 ? (box->internal.px_size.x - box->internal.px_padding_l - box->internal.px_padding_r) : (box->internal.px_size.y - box->internal.px_padding_t - box->internal.px_padding_b); available_size -= (float)(flex_count+1) * (box->flex_padding); - flex_params.px_per_unit = available_size / flex_params.unit_total; + if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_VISIBILITY_PIXEL_PERFECT)) { + assert(fmod(box->flex_padding, 1.0) == 0.0); + available_size = floor(available_size); + flex_params.px_per_unit = available_size / flex_params.unit_total; + flex_params.px_per_unit = floor(flex_params.px_per_unit); + } else { + available_size -= (float)(flex_count+1) * (box->flex_padding); + flex_params.px_per_unit = available_size / flex_params.unit_total; + } } for (pke_ui_box_count_T i = 0; i < box->internal.h_children; ++i) { |
