defer non-layout-axis fill size calculations
This commit is contained in:
parent
0b98c24f46
commit
f8f6ea9729
@ -31,10 +31,8 @@ UI_Box *UI_BuildLabelF_(char *fmt_cstr, ...)
|
|||||||
UI_Box *UI_BuildSpacer(UI_Size size)
|
UI_Box *UI_BuildSpacer(UI_Size size)
|
||||||
{
|
{
|
||||||
UI_Box *box = 0;
|
UI_Box *box = 0;
|
||||||
|
|
||||||
UI_Box *old_parent = UI_UseTop(Parent);
|
UI_Box *old_parent = UI_UseTop(Parent);
|
||||||
Axis axis = old_parent->child_layout_axis;
|
Axis axis = old_parent->child_layout_axis;
|
||||||
|
|
||||||
UI_PushEmptyStack();
|
UI_PushEmptyStack();
|
||||||
{
|
{
|
||||||
UI_Push(Tint, 0);
|
UI_Push(Tint, 0);
|
||||||
@ -50,13 +48,11 @@ UI_Box *UI_BuildSpacer(UI_Size size)
|
|||||||
UI_Box *UI_BuildDivider(UI_Size size)
|
UI_Box *UI_BuildDivider(UI_Size size)
|
||||||
{
|
{
|
||||||
UI_Box *box = 0;
|
UI_Box *box = 0;
|
||||||
|
|
||||||
UI_Box *old_parent = UI_UseTop(Parent);
|
UI_Box *old_parent = UI_UseTop(Parent);
|
||||||
u32 old_tint = UI_UseTop(Tint);
|
u32 old_tint = UI_UseTop(Tint);
|
||||||
f32 old_border = UI_UseTop(Border);
|
f32 old_border = UI_UseTop(Border);
|
||||||
u32 old_border_color = UI_UseTop(BorderColor);
|
u32 old_border_color = UI_UseTop(BorderColor);
|
||||||
Axis axis = old_parent->child_layout_axis;
|
Axis axis = old_parent->child_layout_axis;
|
||||||
|
|
||||||
UI_PushEmptyStack();
|
UI_PushEmptyStack();
|
||||||
{
|
{
|
||||||
UI_Push(Parent, old_parent);
|
UI_Push(Parent, old_parent);
|
||||||
|
|||||||
@ -708,8 +708,6 @@ i64 UI_EndFrame(UI_Frame frame)
|
|||||||
render_viewport.pos = VEC2(0, 0);
|
render_viewport.pos = VEC2(0, 0);
|
||||||
render_viewport.size = VEC2(draw_size.x, draw_size.y);
|
render_viewport.size = VEC2(draw_size.x, draw_size.y);
|
||||||
|
|
||||||
/* TODO: Ensure root is parent */
|
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- Layout
|
//- Layout
|
||||||
|
|
||||||
@ -812,12 +810,13 @@ i64 UI_EndFrame(UI_Frame frame)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate upwards-dependent sizes */
|
/* Calculate upwards-dependent sizes along layout axis */
|
||||||
for (u64 pre_index = 0; pre_index < boxes_count; ++pre_index)
|
for (u64 pre_index = 0; pre_index < boxes_count; ++pre_index)
|
||||||
{
|
{
|
||||||
UI_Box *box = boxes_pre[pre_index];
|
UI_Box *box = boxes_pre[pre_index];
|
||||||
for (Axis axis = 0; axis < Axis_CountXY; ++axis)
|
if (box->parent)
|
||||||
{
|
{
|
||||||
|
Axis axis = box->parent->child_layout_axis;
|
||||||
UI_Size pref_size = box->pref_size[axis];
|
UI_Size pref_size = box->pref_size[axis];
|
||||||
if (pref_size.kind == UI_SizeKind_Fill)
|
if (pref_size.kind == UI_SizeKind_Fill)
|
||||||
{
|
{
|
||||||
@ -867,6 +866,21 @@ i64 UI_EndFrame(UI_Frame frame)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Calculate upwards-dependent sizes along non-layout axis */
|
||||||
|
for (u64 pre_index = 0; pre_index < boxes_count; ++pre_index)
|
||||||
|
{
|
||||||
|
UI_Box *box = boxes_pre[pre_index];
|
||||||
|
if (box->parent)
|
||||||
|
{
|
||||||
|
Axis axis = !box->parent->child_layout_axis;
|
||||||
|
UI_Size pref_size = box->pref_size[axis];
|
||||||
|
if (pref_size.kind == UI_SizeKind_Fill)
|
||||||
|
{
|
||||||
|
box->solved_dims[axis] = box->parent->solved_dims[axis] * pref_size.v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Solve violations */
|
/* Solve violations */
|
||||||
for (u64 pre_index = 0; pre_index < boxes_count; ++pre_index)
|
for (u64 pre_index = 0; pre_index < boxes_count; ++pre_index)
|
||||||
{
|
{
|
||||||
@ -927,23 +941,7 @@ i64 UI_EndFrame(UI_Frame frame)
|
|||||||
}
|
}
|
||||||
size_accum = adjusted_size_accum;
|
size_accum = adjusted_size_accum;
|
||||||
}
|
}
|
||||||
/* Initialize layout cursor based on alignment */
|
box->final_children_size_accum[axis] = size_accum;
|
||||||
if (axis == box->child_layout_axis)
|
|
||||||
{
|
|
||||||
UI_AxisAlignment alignment = box->child_alignment[axis];
|
|
||||||
switch(alignment)
|
|
||||||
{
|
|
||||||
default: break;
|
|
||||||
case UI_AxisAlignment_Center:
|
|
||||||
{
|
|
||||||
box->layout_cursor = box_size / 2 - size_accum / 2;
|
|
||||||
} break;
|
|
||||||
case UI_AxisAlignment_End:
|
|
||||||
{
|
|
||||||
box->layout_cursor = box_size - size_accum;
|
|
||||||
} break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* Solve floating violations */
|
/* Solve floating violations */
|
||||||
for (UI_Box *child = box->first; child; child = child->next)
|
for (UI_Box *child = box->first; child; child = child->next)
|
||||||
@ -968,6 +966,26 @@ i64 UI_EndFrame(UI_Frame frame)
|
|||||||
UI_Box *box = boxes_pre[pre_index];
|
UI_Box *box = boxes_pre[pre_index];
|
||||||
UI_Box *parent = box->parent;
|
UI_Box *parent = box->parent;
|
||||||
|
|
||||||
|
/* Initialize layout cursor based on alignment */
|
||||||
|
{
|
||||||
|
Axis axis = box->child_layout_axis;
|
||||||
|
UI_AxisAlignment alignment = box->child_alignment[axis];
|
||||||
|
f32 box_size = box->solved_dims[axis];
|
||||||
|
f32 size_accum = box->final_children_size_accum[axis];
|
||||||
|
switch(alignment)
|
||||||
|
{
|
||||||
|
default: break;
|
||||||
|
case UI_AxisAlignment_Center:
|
||||||
|
{
|
||||||
|
box->layout_cursor = box_size / 2 - size_accum / 2;
|
||||||
|
} break;
|
||||||
|
case UI_AxisAlignment_End:
|
||||||
|
{
|
||||||
|
box->layout_cursor = box_size - size_accum;
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Position */
|
/* Position */
|
||||||
{
|
{
|
||||||
f32 *dims_arr = box->solved_dims;
|
f32 *dims_arr = box->solved_dims;
|
||||||
|
|||||||
@ -244,8 +244,9 @@ Struct(UI_Box)
|
|||||||
//- Layout data
|
//- Layout data
|
||||||
F_Run glyph_run;
|
F_Run glyph_run;
|
||||||
F_Font *font;
|
F_Font *font;
|
||||||
f32 solved_dims[Axis_CountXY];
|
|
||||||
f32 layout_cursor;
|
f32 layout_cursor;
|
||||||
|
f32 solved_dims[Axis_CountXY];
|
||||||
|
f32 final_children_size_accum[Axis_CountXY];
|
||||||
|
|
||||||
//- Post-layout data
|
//- Post-layout data
|
||||||
Vec2 p0;
|
Vec2 p0;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user