summaryrefslogtreecommitdiff
path: root/src/static-ui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/static-ui.cpp')
-rw-r--r--src/static-ui.cpp27
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) {