diff --git a/src/pp/pp.c b/src/pp/pp.c index 11458ec6..ecda8471 100644 --- a/src/pp/pp.c +++ b/src/pp/pp.c @@ -116,7 +116,7 @@ void PP_PushGameUiStyle(void) UI_Push(Width, UI_FILL(1, 0)); UI_Push(Height, UI_FILL(1, 0)); - UI_Push(LayoutAxis, Axis_Y); + UI_Push(ChildLayoutAxis, Axis_Y); } //- Draw xform @@ -785,14 +785,6 @@ void PP_UpdateUser(void) g->ui_cursor = MulXformV2(InvertXform(g->ui_to_screen_xf), g->screen_cursor); - //- Init pp root box - UI_Push(LayoutAxis, Axis_Y); - if (window_frame.forced_top) - { - UI_SetNext(Border, 10); - UI_SetNext(BorderColor, Rgba32F(1, 0, 0, 0.5)); - } - UI_Box *pp_root_box = 0; { UI_PushCP(UI_BuildRow(Zstr)); @@ -803,8 +795,16 @@ void PP_UpdateUser(void) UI_PushCP(UI_BuildColumn(Zstr)); { UI_BuildSpacer(UI_FILL(1, 0)); - UI_SetNext(Height, UI_PIX(g->ui_size.y, 1)); - pp_root_box = UI_BuildBox(Lit("pp root")); + { + if (window_frame.forced_top) + { + UI_SetNext(Border, 10); + UI_SetNext(BorderColor, Rgba32F(1, 0, 0, 0.5)); + } + UI_SetNext(ChildLayoutAxis, Axis_Y); + UI_SetNext(Height, UI_PIX(g->ui_size.y, 1)); + pp_root_box = UI_BuildBox(Lit("pp root")); + } UI_BuildSpacer(UI_FILL(1, 0)); } UI_PopCP(); @@ -813,7 +813,6 @@ void PP_UpdateUser(void) } UI_PopCP(); } - PP_PushGameUiStyle(); UI_Push(Parent, pp_root_box); @@ -1984,7 +1983,7 @@ void PP_UpdateUser(void) UI_Push(Rounding, UI_RPIX(15)); UI_Push(Width, UI_PIX(window_dims.x, 0)); UI_Push(Height, UI_PIX(window_dims.y, 0)); - UI_Push(LayoutAxis, Axis_Y); + UI_Push(ChildLayoutAxis, Axis_Y); UI_Push(FloatingPos, g->lister_pos); UI_SetNext(Flags, UI_BoxFlag_Floating); UI_Box *lister_box = UI_PushCP(UI_BuildBox(Lit("lister"))); @@ -1995,7 +1994,7 @@ void PP_UpdateUser(void) UI_Push(BackgroundColor, 0); UI_Push(BorderColor, 0); UI_Push(Rounding, UI_RPIX(0)); - UI_Push(LayoutAxis, Axis_X); + UI_Push(ChildLayoutAxis, Axis_X); UI_Push(Width, UI_FILL(1, 0)); UI_Push(Height, UI_FNT(2, 0)); UI_PushCP(UI_BuildBox(Zstr)); @@ -2033,10 +2032,10 @@ void PP_UpdateUser(void) UI_BuildSpacer(UI_FILL(1, 0)); - UI_SetNext(LayoutAxis, Axis_Y); + UI_SetNext(ChildLayoutAxis, Axis_Y); UI_SetNext(BackgroundColor, 0); UI_SetNext(BorderColor, 0); - UI_SetNext(Width, UI_FIT(0)); + UI_SetNext(Width, UI_FIT(1)); UI_SetNext(Height, UI_FIT(1)); UI_SetNext(Tint, 0); UI_PushCP(UI_BuildBox(Lit("dbg"))); diff --git a/src/pp/pp_widgets.c b/src/pp/pp_widgets.c index ddef0a26..2a609fed 100644 --- a/src/pp/pp_widgets.c +++ b/src/pp/pp_widgets.c @@ -110,23 +110,23 @@ UI_Box *PP_BuildDebugConsole(b32 minimized) UI_Push(Tint, Alpha32F(0xFFFFFFFF, opacity)); { u32 color = colors[log.level][log.level_id % 2]; - UI_SetNext(BackgroundColor, color); - UI_SetNext(Width, UI_FILL(1, 0)); - UI_SetNext(Height, UI_FIT(1)); - UI_SetNext(BorderColor, Rgba32F(0.25, 0.25, 0.25, 1)); - UI_SetNext(Rounding, UI_RPIX(0)); - UI_SetNext(Border, 1); + UI_Push(BackgroundColor, color); + UI_Push(Width, UI_FILL(1, 0)); + UI_Push(Height, UI_FNT(2, 1)); + UI_Push(BorderColor, Rgba32F(0.25, 0.25, 0.25, 1)); + UI_Push(Rounding, UI_RPIX(0)); + UI_Push(Border, 1); UI_PushCP(UI_BuildRow(Zstr)); { // UI_SetNext(Height, UI_PIX(100, 0)); - // UI_BuildSpacer(UI_PIX(1, 0)); - UI_SetNext(BackgroundColor, 0); - UI_SetNext(Border, 0); - UI_SetNext(Text, text); - UI_SetNext(TextAlignment, UI_Alignment_Left); - UI_SetNext(Width, UI_FILL(1, 0)); - UI_SetNext(Height, UI_FIT(1)); - UI_SetNext(Flags, UI_BoxFlag_DrawText); + UI_BuildSpacer(UI_PIX(10, 0)); + UI_Push(BackgroundColor, 0); + UI_Push(Border, 0); + UI_Push(Text, text); + UI_Push(TextAlignment, UI_Alignment_Left); + UI_Push(Width, UI_FILL(1, 0)); + UI_Push(Height, UI_FIT(1)); + UI_Push(Flags, UI_BoxFlag_DrawText); UI_BuildBox(Zstr); } UI_PopCP(); diff --git a/src/ui/ui_common.c b/src/ui/ui_common.c index 1add6a3e..9fa0ceda 100644 --- a/src/ui/ui_common.c +++ b/src/ui/ui_common.c @@ -33,23 +33,15 @@ UI_Box *UI_BuildSpacer(UI_Size size) UI_Box *box = 0; UI_Box *old_parent = UI_UseTop(Parent); - UI_Size old_width = UI_UseTop(Width); - UI_Size old_height = UI_UseTop(Height); + UI_Size old_axis_sizes[Axis_CountXY] = { UI_UseTop(Width), UI_UseTop(Height) }; + Axis axis = old_parent->child_layout_axis; UI_PushEmptyStack(); { UI_Push(Tint, 0); UI_Push(Parent, old_parent); - if (old_parent->layout_axis == Axis_X) - { - UI_Push(Width, size); - UI_Push(Height, old_height); - } - else - { - UI_Push(Width, old_width); - UI_Push(Height, size); - } + UI_Push(AxisSize, UI_AXSIZE(!axis, old_axis_sizes[axis])); + UI_Push(AxisSize, UI_AXSIZE(axis, size)); box = UI_BuildBox(Zstr); } UI_PopStack(); @@ -61,27 +53,19 @@ UI_Box *UI_BuildDivider(UI_Size size) UI_Box *box = 0; UI_Box *old_parent = UI_UseTop(Parent); - UI_Size old_width = UI_UseTop(Width); - UI_Size old_height = UI_UseTop(Height); + UI_Size old_axis_sizes[Axis_CountXY] = { UI_UseTop(Width), UI_UseTop(Height) }; u32 old_tint = UI_UseTop(Tint); f32 old_border = UI_UseTop(Border); u32 old_border_color = UI_UseTop(BorderColor); + Axis axis = old_parent->child_layout_axis; UI_PushEmptyStack(); { UI_Push(Parent, old_parent); UI_Push(Tint, old_tint); UI_Push(BackgroundColor, old_border_color); - if (old_parent->layout_axis == Axis_X) - { - UI_Push(Width, size); - UI_Push(Height, old_height); - } - else - { - UI_Push(Width, old_width); - UI_Push(Height, size); - } + UI_Push(AxisSize, UI_AXSIZE(!axis, old_axis_sizes[axis])); + UI_Push(AxisSize, UI_AXSIZE(axis, size)); box = UI_BuildBox(Zstr); } UI_PopStack(); @@ -93,14 +77,14 @@ UI_Box *UI_BuildDivider(UI_Size size) UI_Box *UI_BuildColumn(String seed) { - UI_SetNext(LayoutAxis, Axis_Y); + UI_SetNext(ChildLayoutAxis, Axis_Y); UI_Box *box = UI_BuildBox(seed); return box; } UI_Box *UI_BuildRow(String seed) { - UI_SetNext(LayoutAxis, Axis_X); + UI_SetNext(ChildLayoutAxis, Axis_X); UI_Box *box = UI_BuildBox(seed); return box; } diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 370467d2..f1d50318 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -322,82 +322,79 @@ UI_Box *UI_BuildBox(String seed) UI_SharedState *g = &UI_shared_state; UI_Box *parent = UI_UseTop(Parent); + UI_Tag tag = UI_UseTop(Tag); ////////////////////////////// //- Create box - UI_Box *box = 0; + UI_Box *box = PushStruct(g->build_arena, UI_Box); + + /* Calculate key */ + if (seed.len > 0) { - /* Calculate key */ - UI_Tag tag = UI_UseTop(Tag); UI_Key key = ZI; - if (seed.len > 0) - { - key.hash = RandU64FromSeeds(key.hash, parent->key.hash); - key.hash = RandU64FromSeeds(key.hash, tag.hash); - key.hash = HashFnv64(key.hash, seed); - } - - /* Insert into lookup */ - UI_BoxBin *bin = &g->box_bins[key.hash % UI_NumBoxLookupBins]; - box = PushStruct(g->build_arena, UI_Box); - UI_Box *back_box = 0; - if (key.hash != 0) - { -#if RtcIsEnabled - /* Validate box not already built */ - for (UI_Box *tmp = bin->first; tmp; tmp = tmp->next_in_bin) - { - if (tmp->key.hash == key.hash) - { - Assert(0); /* Box with matching key already built */ - break; - } - } -#endif - DllPushBackNP(bin->first, bin->last, box, next_in_bin, prev_in_bin); - back_box = UI_BackBoxFromKey(key); - } + key.hash = RandU64FromSeeds(key.hash, parent->key.hash); + key.hash = RandU64FromSeeds(key.hash, tag.hash); + key.hash = HashFnv64(key.hash, seed); box->key = key; - ++g->boxes_count; + } - /* Insert into parent */ - DllPushBack(parent->first, parent->last, box); - box->parent = parent; - ++parent->count; - - /* Persist data from back box */ - if (back_box != 0) + /* Insert into lookup */ + if (box->key.hash != 0) + { + UI_BoxBin *bin = &g->box_bins[box->key.hash % UI_NumBoxLookupBins]; +#if RtcIsEnabled + /* Validate box not already built */ + for (UI_Box *tmp = bin->first; tmp; tmp = tmp->next_in_bin) { - box->report = back_box->report; - } - - /* Pull from style stack */ - box->flags = UI_UseTop(Flags); - box->pref_size[Axis_X] = UI_UseTop(Width); - box->pref_size[Axis_Y] = UI_UseTop(Height); - box->layout_axis = UI_UseTop(LayoutAxis); - box->background_color = UI_UseTop(BackgroundColor); - box->border_color = UI_UseTop(BorderColor); - box->debug_color = UI_UseTop(DebugColor); - box->tint = UI_UseTop(Tint); - box->border = UI_UseTop(Border); - box->font_resource = UI_UseTop(Font); - box->font_size = UI_UseTop(FontSize); - box->rounding = UI_UseTop(Rounding); - box->text = UI_UseTop(Text); - box->floating_pos = UI_UseTop(FloatingPos); - box->text_alignment = UI_UseTop(TextAlignment); - - /* Prefetch font */ - if (box->text.len > 0) - { - box->font = F_LoadFontAsync(box->font_resource, box->font_size); - if (box->font) + if (tmp->key.hash == box->key.hash) { - box->glyph_run = F_RunFromString(g->build_arena, box->font, box->text); + Assert(0); /* Box with matching key already built */ + break; } } +#endif + DllPushBackNP(bin->first, bin->last, box, next_in_bin, prev_in_bin); + } + ++g->boxes_count; + + /* Insert into parent */ + DllPushBack(parent->first, parent->last, box); + box->parent = parent; + ++parent->count; + + /* Persist data from back box */ + UI_Box *back_box = UI_BackBoxFromKey(box->key); + if (back_box != 0) + { + box->report = back_box->report; + } + + /* Pull from style stack */ + box->flags = UI_UseTop(Flags); + box->pref_size[Axis_X] = UI_UseTop(Width); + box->pref_size[Axis_Y] = UI_UseTop(Height); + box->child_layout_axis = UI_UseTop(ChildLayoutAxis); + box->text_alignment = UI_UseTop(TextAlignment); + box->background_color = UI_UseTop(BackgroundColor); + box->border_color = UI_UseTop(BorderColor); + box->debug_color = UI_UseTop(DebugColor); + box->tint = UI_UseTop(Tint); + box->border = UI_UseTop(Border); + box->font_resource = UI_UseTop(Font); + box->font_size = UI_UseTop(FontSize); + box->rounding = UI_UseTop(Rounding); + box->text = UI_UseTop(Text); + box->floating_pos = UI_UseTop(FloatingPos); + + /* Prefetch font */ + if (box->text.len > 0) + { + box->font = F_LoadFontAsync(box->font_resource, box->font_size); + if (box->font) + { + box->glyph_run = F_RunFromString(g->build_arena, box->font, box->text); + } } return box; @@ -764,17 +761,19 @@ i64 UI_EndFrame(UI_Frame frame) UI_Size pref_size = box->pref_size[axis]; if (pref_size.kind == UI_SizeKind_Fill) { - f32 ancestor_size = 0; - for (UI_Box *ancestor = box->parent; ancestor; ancestor = ancestor->parent) + f32 match_size = 0; + b32 found_match = 0; + for (UI_Box *ancestor = box->parent; ancestor != 0 && !found_match; ancestor = ancestor->parent) { - UI_Size tmp = ancestor->pref_size[axis]; - if (tmp.kind == UI_SizeKind_Pixel || (tmp.kind == UI_SizeKind_Fit && AnyBit(box->flags, UI_BoxFlag_DrawText))) + UI_Size ancestor_size = ancestor->pref_size[axis]; + if (ancestor_size.kind == UI_SizeKind_Pixel || (ancestor_size.kind == UI_SizeKind_Fit && AnyBit(box->flags, UI_BoxFlag_DrawText))) { - ancestor_size = ancestor->solved_dims[axis]; - break; + /* Match independent ancestor */ + match_size = ancestor->solved_dims[axis]; + found_match = 1; } } - box->solved_dims[axis] = pref_size.v * ancestor_size; + box->solved_dims[axis] = match_size * pref_size.v; } } } @@ -793,7 +792,7 @@ i64 UI_EndFrame(UI_Frame frame) { if (!AnyBit(child->flags, UI_BoxFlag_Floating)) { - if (axis == box->layout_axis) + if (axis == box->child_layout_axis) { accum += child->solved_dims[axis]; } @@ -826,7 +825,7 @@ i64 UI_EndFrame(UI_Frame frame) f32 size = child->solved_dims[axis]; f32 strictness = child->pref_size[axis].strictness; f32 flex = size * (1.0 - strictness); - if (axis == box->layout_axis) + if (axis == box->child_layout_axis) { size_accum += size; flex_accum += flex; @@ -849,7 +848,7 @@ i64 UI_EndFrame(UI_Frame frame) f32 strictness = child->pref_size[axis].strictness; f32 flex = size * (1.0 - strictness); f32 new_size = size; - if (axis == box->layout_axis) + if (axis == box->child_layout_axis) { f32 chopoff = MinF32(flex, violation * (flex / flex_accum)); new_size = size - chopoff; @@ -914,7 +913,7 @@ i64 UI_EndFrame(UI_Frame frame) /* Non-floating box position */ else if (parent) { - b32 is_layout_x = parent->layout_axis == Axis_X; + b32 is_layout_x = parent->child_layout_axis == Axis_X; f32 layout_cursor = parent->layout_cursor; Vec2 offset = VEC2(layout_cursor * is_layout_x, layout_cursor * !is_layout_x); parent->layout_cursor += dims.x * is_layout_x + dims.y * !is_layout_x; diff --git a/src/ui/ui_core.h b/src/ui/ui_core.h index 9f3d433b..f6489df7 100644 --- a/src/ui/ui_core.h +++ b/src/ui/ui_core.h @@ -79,13 +79,13 @@ Enum(UI_BoxFlag) x(Flags, UI_BoxFlag) \ x(Parent, struct UI_Box *) \ x(Tag, UI_Tag) \ - x(LayoutAxis, Axis) \ + x(ChildLayoutAxis, Axis) \ x(Width, UI_Size) \ x(Height, UI_Size) \ x(Size, UI_Size) \ x(BackgroundColor, u32) \ x(BorderColor, u32) \ - x(DebugColor, u32) \ + x(DebugColor, u32) \ x(Tint, u32) \ x(Border, f32) \ x(FloatingPos, Vec2) \ @@ -211,7 +211,7 @@ Struct(UI_Box) UI_Alignment text_alignment; ResourceKey font_resource; f32 font_size; - Axis layout_axis; + Axis child_layout_axis; //- Pre-layout data u64 pre_index;