2 dimensional ui animation scale
This commit is contained in:
parent
13fa38ad68
commit
4689be8dc7
@ -94,6 +94,8 @@ V_WidgetTheme V_GetWidgetTheme(void)
|
|||||||
// theme.font = GC_FontKeyFromResource(ResourceKeyFromStore(&V_Resources, Lit("font/seguisb.ttf")));
|
// theme.font = GC_FontKeyFromResource(ResourceKeyFromStore(&V_Resources, Lit("font/seguisb.ttf")));
|
||||||
// theme.font_size = 30;
|
// theme.font_size = 30;
|
||||||
|
|
||||||
|
// theme.font_size = TweakI32("Font size", 14, RNGI32(5, 100));
|
||||||
|
|
||||||
theme.window_background_color = Rgb32(0xff1a1d1e);
|
theme.window_background_color = Rgb32(0xff1a1d1e);
|
||||||
theme.window_border_color = Rgb32(0xff343a3b);
|
theme.window_border_color = Rgb32(0xff343a3b);
|
||||||
theme.window_border = 1;
|
theme.window_border = 1;
|
||||||
@ -1093,11 +1095,15 @@ void V_TickForever(WaveLaneCtx *lane)
|
|||||||
bg_color.w *= 0.5;
|
bg_color.w *= 0.5;
|
||||||
Vec4 border_color = LerpSrgb(VEC4(0, 0, 0, 0), theme.button_active_color, rep.exists);
|
Vec4 border_color = LerpSrgb(VEC4(0, 0, 0, 0), theme.button_active_color, rep.exists);
|
||||||
|
|
||||||
UI_SetNext(Scale, rep.exists);
|
// UI_SetNext(Anchor, UI_Region_Center);
|
||||||
|
UI_SetNext(Anchor, UI_Region_TopRight);
|
||||||
|
|
||||||
|
UI_SetNext(Scale, VEC2(rep.exists, 1));
|
||||||
UI_SetNext(BackgroundColor, bg_color);
|
UI_SetNext(BackgroundColor, bg_color);
|
||||||
UI_SetNext(BorderColor, border_color);
|
UI_SetNext(BorderColor, border_color);
|
||||||
UI_SetNext(Border, 2);
|
UI_SetNext(Border, 2);
|
||||||
UI_SetNext(Width, UI_PIX(30, 0));
|
// UI_SetNext(Width, UI_PIX(30, 0));
|
||||||
|
UI_SetNext(Width, UI_PIX(100, 0));
|
||||||
UI_SetNext(Height, UI_GROW(1, 0));
|
UI_SetNext(Height, UI_GROW(1, 0));
|
||||||
UI_SetNext(ChildAlignment, UI_Region_Center);
|
UI_SetNext(ChildAlignment, UI_Region_Center);
|
||||||
// UI_SetNext(FontSize, theme.font_size * 1.5);
|
// UI_SetNext(FontSize, theme.font_size * 1.5);
|
||||||
@ -1314,8 +1320,9 @@ void V_TickForever(WaveLaneCtx *lane)
|
|||||||
}
|
}
|
||||||
window_border_color = LerpSrgb(window_border_color, Rgb32(0x0078a6), titlebar_rep.hot);
|
window_border_color = LerpSrgb(window_border_color, Rgb32(0x0078a6), titlebar_rep.hot);
|
||||||
|
|
||||||
|
f32 scale = LerpF32(0.85, 1, palette->show);
|
||||||
UI_Push(Tint, VEC4(1, 1, 1, palette->show));
|
UI_Push(Tint, VEC4(1, 1, 1, palette->show));
|
||||||
UI_SetNext(Scale, LerpF32(0.85, 1, palette->show));
|
UI_SetNext(Scale, VEC2(scale, scale));
|
||||||
|
|
||||||
UI_Push(BackgroundColor, window_background_color);
|
UI_Push(BackgroundColor, window_background_color);
|
||||||
UI_Push(BorderColor, window_border_color);
|
UI_Push(BorderColor, window_border_color);
|
||||||
@ -1325,7 +1332,7 @@ void V_TickForever(WaveLaneCtx *lane)
|
|||||||
UI_Push(Height, UI_SHRINK(0, 0));
|
UI_Push(Height, UI_SHRINK(0, 0));
|
||||||
UI_Push(ChildLayoutAxis, Axis_Y);
|
UI_Push(ChildLayoutAxis, Axis_Y);
|
||||||
UI_Push(FloatingPos, palette->pos);
|
UI_Push(FloatingPos, palette->pos);
|
||||||
UI_SetNext(FloatingPosAnchor, UI_Region_Center);
|
UI_SetNext(Anchor, UI_Region_Center);
|
||||||
UI_SetNext(Flags, UI_BoxFlag_Floating | UI_BoxFlag_Interactable);
|
UI_SetNext(Flags, UI_BoxFlag_Floating | UI_BoxFlag_Interactable);
|
||||||
UI_PushCP(UI_BuildBoxEx(palette->key));
|
UI_PushCP(UI_BuildBoxEx(palette->key));
|
||||||
{
|
{
|
||||||
@ -1510,10 +1517,14 @@ void V_TickForever(WaveLaneCtx *lane)
|
|||||||
// Tweak checkbox
|
// Tweak checkbox
|
||||||
case TweakKind_Bool:
|
case TweakKind_Bool:
|
||||||
{
|
{
|
||||||
Vec4 tweak_bg_color = LerpSrgb(theme.color_negative, theme.color_positive, new_tweak_value.x);
|
// Vec4 tweak_bg_color = LerpSrgb(theme.color_negative, theme.color_positive, new_tweak_value.x);
|
||||||
Vec4 tweak_border_color = Zi;
|
Vec4 tweak_bg_color = Zi;
|
||||||
tweak_border_color = LerpSrgb(tweak_border_color, theme.button_hot_color, tweak_rep.hot);
|
tweak_bg_color = LerpSrgb(tweak_bg_color, theme.color_positive, new_tweak_value.x);
|
||||||
tweak_border_color = LerpSrgb(tweak_border_color, theme.button_active_color, tweak_rep.active);
|
|
||||||
|
Vec4 tweak_border_color = theme.window_border_color;
|
||||||
|
// tweak_border_color = LerpSrgb(tweak_border_color, theme.button_hot_color, tweak_rep.hot);
|
||||||
|
// tweak_border_color = LerpSrgb(tweak_border_color, theme.button_active_color, tweak_rep.active);
|
||||||
|
tweak_border_color = LerpSrgb(tweak_border_color, theme.button_active_color, tweak_rep.hot);
|
||||||
|
|
||||||
if (tweak_rep.m1.downs)
|
if (tweak_rep.m1.downs)
|
||||||
{
|
{
|
||||||
@ -1522,8 +1533,8 @@ void V_TickForever(WaveLaneCtx *lane)
|
|||||||
|
|
||||||
UI_SetNext(BackgroundColor, tweak_bg_color);
|
UI_SetNext(BackgroundColor, tweak_bg_color);
|
||||||
UI_SetNext(BorderColor, tweak_border_color);
|
UI_SetNext(BorderColor, tweak_border_color);
|
||||||
UI_SetNext(Rounding, UI_RGROW(0.5));
|
UI_SetNext(Rounding, UI_RGROW(0.8));
|
||||||
UI_SetNext(Border, 2);
|
UI_SetNext(Border, 1);
|
||||||
UI_SetNext(Width, UI_FNT(1.25, 1));
|
UI_SetNext(Width, UI_FNT(1.25, 1));
|
||||||
UI_SetNext(Height, UI_FNT(1.25, 1));
|
UI_SetNext(Height, UI_FNT(1.25, 1));
|
||||||
UI_SetNext(Flags, UI_BoxFlag_Interactable);
|
UI_SetNext(Flags, UI_BoxFlag_Interactable);
|
||||||
|
|||||||
194
src/ui/ui_core.c
194
src/ui/ui_core.c
@ -344,7 +344,7 @@ void UI_PushDefaults(void)
|
|||||||
case UI_StyleKind_Parent: { desc.style.Parent = UI_RootKey; } break;
|
case UI_StyleKind_Parent: { desc.style.Parent = UI_RootKey; } break;
|
||||||
case UI_StyleKind_Width: { desc.style.Width = UI_GROW(1, 0); } break;
|
case UI_StyleKind_Width: { desc.style.Width = UI_GROW(1, 0); } break;
|
||||||
case UI_StyleKind_Height: { desc.style.Height = UI_GROW(1, 0); }
|
case UI_StyleKind_Height: { desc.style.Height = UI_GROW(1, 0); }
|
||||||
case UI_StyleKind_Scale: { desc.style.Scale = 1; } break;
|
case UI_StyleKind_Scale: { desc.style.Scale = VEC2(1, 1); } break;
|
||||||
case UI_StyleKind_Font: { desc.style.Font = UI_GetDefaultFont(); } break;
|
case UI_StyleKind_Font: { desc.style.Font = UI_GetDefaultFont(); } break;
|
||||||
|
|
||||||
u8 prefetch[127] = Zi;
|
u8 prefetch[127] = Zi;
|
||||||
@ -520,7 +520,7 @@ UI_Key UI_BuildBoxEx(UI_Key semantic_key)
|
|||||||
n->cmd.box.font_size = UI_UseTop(FontSize);
|
n->cmd.box.font_size = UI_UseTop(FontSize);
|
||||||
n->cmd.box.rounding = UI_UseTop(Rounding);
|
n->cmd.box.rounding = UI_UseTop(Rounding);
|
||||||
n->cmd.box.text = UI_UseTop(Text);
|
n->cmd.box.text = UI_UseTop(Text);
|
||||||
n->cmd.box.floating_pos_anchor = UI_UseTop(FloatingPosAnchor);
|
n->cmd.box.anchor = UI_UseTop(Anchor);
|
||||||
n->cmd.box.floating_pos = UI_UseTop(FloatingPos);
|
n->cmd.box.floating_pos = UI_UseTop(FloatingPos);
|
||||||
}
|
}
|
||||||
++frame->cmds_count;
|
++frame->cmds_count;
|
||||||
@ -812,11 +812,11 @@ UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags, Vec4 swapchain_color)
|
|||||||
f32 target_active = box == active_box;
|
f32 target_active = box == active_box;
|
||||||
f32 target_selected = report->is_selected;
|
f32 target_selected = report->is_selected;
|
||||||
|
|
||||||
f32 exists_blend_rate = (40 * frame->dt);
|
f32 exists_blend_rate = (30 * frame->dt);
|
||||||
f32 hot_blend_rate = target_hot == 1 ? 1 : (15 * frame->dt);
|
f32 hot_blend_rate = target_hot == 1 ? 1 : (15 * frame->dt);
|
||||||
f32 active_blend_rate = target_active == 1 ? 1 : (15 * frame->dt);
|
f32 active_blend_rate = target_active == 1 ? 1 : (15 * frame->dt);
|
||||||
f32 hovered_blend_rate = target_hovered == 1 ? 1 : (15 * frame->dt);
|
f32 hovered_blend_rate = target_hovered == 1 ? 1 : (15 * frame->dt);
|
||||||
f32 selected_blend_rate = (40 * frame->dt);
|
f32 selected_blend_rate = (30 * frame->dt);
|
||||||
|
|
||||||
report->exists = LerpF32(report->exists, target_exists, exists_blend_rate);
|
report->exists = LerpF32(report->exists, target_exists, exists_blend_rate);
|
||||||
report->hot = LerpF32(report->hot, target_hot, hot_blend_rate);
|
report->hot = LerpF32(report->hot, target_hot, hot_blend_rate);
|
||||||
@ -876,16 +876,16 @@ Vec2 UI_CursorPos(void)
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
//~ Text layout helpers
|
//~ Text layout helpers
|
||||||
|
|
||||||
GC_Run UI_ScaleRun(Arena *arena, GC_Run unscaled_run, f32 scale)
|
GC_Run UI_ScaleRun(Arena *arena, GC_Run unscaled_run, Vec2 scale)
|
||||||
{
|
{
|
||||||
GC_Run result = Zi;
|
GC_Run result = Zi;
|
||||||
result = unscaled_run;
|
result = unscaled_run;
|
||||||
|
|
||||||
result.font_size *= scale;
|
result.font_size *= scale.y;
|
||||||
result.font_ascent *= scale;
|
result.font_ascent *= scale.y;
|
||||||
result.font_descent *= scale;
|
result.font_descent *= scale.y;
|
||||||
result.font_cap *= scale;
|
result.font_cap *= scale.y;
|
||||||
result.baseline_length *= scale;
|
result.baseline_length *= scale.x;
|
||||||
|
|
||||||
result.rects_count = unscaled_run.rects_count;
|
result.rects_count = unscaled_run.rects_count;
|
||||||
result.rects = PushStructsNoZero(arena, GC_RunRect, result.rects_count);
|
result.rects = PushStructsNoZero(arena, GC_RunRect, result.rects_count);
|
||||||
@ -895,9 +895,9 @@ GC_Run UI_ScaleRun(Arena *arena, GC_Run unscaled_run, f32 scale)
|
|||||||
GC_RunRect *dst = &result.rects[rect_idx];
|
GC_RunRect *dst = &result.rects[rect_idx];
|
||||||
|
|
||||||
*dst = *src;
|
*dst = *src;
|
||||||
dst->bounds = MulRng2Vec2(dst->bounds, VEC2(scale, scale));
|
dst->bounds = MulRng2Vec2(dst->bounds, scale);
|
||||||
dst->advance *= scale;
|
dst->advance *= scale.x;
|
||||||
dst->baseline_pos *= scale;
|
dst->baseline_pos *= scale.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -1110,19 +1110,25 @@ void UI_EndFrame(UI_Frame *frame)
|
|||||||
|
|
||||||
// Reset layout data
|
// Reset layout data
|
||||||
box->cursor = 0;
|
box->cursor = 0;
|
||||||
ZeroStructs(box->final_children_size_accum, countof(box->final_children_size_accum));
|
box->final_children_size_accum = VEC2(0, 0);
|
||||||
box->solved_dims = VEC2(0, 0);
|
box->solved_dims = VEC2(0, 0);
|
||||||
|
|
||||||
// Compute scale
|
// Solve scale
|
||||||
|
{
|
||||||
UI_Box *parent = box->parent;
|
UI_Box *parent = box->parent;
|
||||||
box->solved_scale = box->desc.scale;
|
box->solved_scale = box->desc.scale;
|
||||||
if (parent)
|
if (parent)
|
||||||
{
|
{
|
||||||
box->solved_scale *= parent->solved_scale;
|
box->solved_scale = MulVec2Vec2(parent->solved_scale, box->solved_scale);
|
||||||
}
|
}
|
||||||
if (AbsF32(1.0 - box->solved_scale) < 0.001)
|
if (AbsF32(1.0 - box->solved_scale.x) < 0.001)
|
||||||
{
|
{
|
||||||
box->solved_scale = 1;
|
box->solved_scale.x = 1;
|
||||||
|
}
|
||||||
|
if (AbsF32(1.0 - box->solved_scale.y) < 0.001)
|
||||||
|
{
|
||||||
|
box->solved_scale.y = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1306,7 +1312,7 @@ void UI_EndFrame(UI_Frame *frame)
|
|||||||
}
|
}
|
||||||
child->solved_dims.v[axis] = new_size;
|
child->solved_dims.v[axis] = new_size;
|
||||||
}
|
}
|
||||||
box->final_children_size_accum[axis] = size_accum;
|
box->final_children_size_accum.v[axis] = size_accum;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1319,38 +1325,58 @@ void UI_EndFrame(UI_Frame *frame)
|
|||||||
UI_Box *parent = box->parent;
|
UI_Box *parent = box->parent;
|
||||||
|
|
||||||
UI_RegionPair child_alignment = UI_PairFromRegion(box->desc.child_alignment);
|
UI_RegionPair child_alignment = UI_PairFromRegion(box->desc.child_alignment);
|
||||||
UI_RegionPair alignment_in_parent = Zi;
|
UI_RegionPair alignment_in_parent = UI_PairFromRegion(parent ? parent->desc.child_alignment : UI_Region_TopLeft);
|
||||||
if (parent)
|
|
||||||
{
|
Axis child_layout_axis = box->desc.child_layout_axis;
|
||||||
alignment_in_parent = UI_PairFromRegion(parent->desc.child_alignment);
|
Axis layout_axis_in_parent = parent ? parent->desc.child_layout_axis : Axis_X;
|
||||||
}
|
|
||||||
else
|
b32 is_floating = AnyBit(box->desc.flags, UI_BoxFlag_Floating);
|
||||||
{
|
|
||||||
alignment_in_parent = UI_PairFromRegion(UI_Region_TopLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply scale
|
// Apply scale
|
||||||
for (Axis axis = 0; axis < Axis_COUNTXY; ++axis)
|
for (Axis axis = 0; axis < Axis_COUNTXY; ++axis)
|
||||||
{
|
{
|
||||||
f32 unscaled_size = box->solved_dims.v[axis];
|
f32 unscaled_size = box->solved_dims.v[axis];
|
||||||
f32 scaled_size = 0;
|
f32 scaled_size = 0;
|
||||||
if (box->solved_scale == 1)
|
if (box->solved_scale.v[axis] == 1)
|
||||||
{
|
{
|
||||||
scaled_size = CeilF32(unscaled_size);
|
scaled_size = RoundF32(unscaled_size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scaled_size = unscaled_size * box->solved_scale;
|
scaled_size = unscaled_size * box->solved_scale.v[axis];
|
||||||
}
|
}
|
||||||
box->solved_dims.v[axis] = scaled_size;
|
box->solved_dims.v[axis] = scaled_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compute anchor offset
|
||||||
|
Vec2 anchor_offset = Zi;
|
||||||
|
{
|
||||||
|
UI_RegionPair anchor_region = UI_PairFromRegion(box->desc.anchor);
|
||||||
|
for (Axis axis = 0; axis < Axis_COUNTXY; ++axis)
|
||||||
|
{
|
||||||
|
UI_AxisRegion anchor = anchor_region.v[axis];
|
||||||
|
switch (anchor)
|
||||||
|
{
|
||||||
|
default: break;
|
||||||
|
case UI_AxisRegion_Center:
|
||||||
|
{
|
||||||
|
anchor_offset.v[axis] = box->solved_dims.v[axis] * 0.5;
|
||||||
|
} break;
|
||||||
|
case UI_AxisRegion_End:
|
||||||
|
{
|
||||||
|
anchor_offset.v[axis] = box->solved_dims.v[axis];
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize layout cursor based on alignment
|
// Initialize layout cursor based on alignment
|
||||||
{
|
{
|
||||||
Axis axis = box->desc.child_layout_axis;
|
Axis axis = child_layout_axis;
|
||||||
UI_AxisRegion alignment = child_alignment.v[axis];
|
UI_AxisRegion alignment = child_alignment.v[axis];
|
||||||
f32 box_size = box->solved_dims.v[axis];
|
f32 box_size = box->solved_dims.v[axis];
|
||||||
f32 size_accum = box->final_children_size_accum[axis];
|
f32 size_accum = box->final_children_size_accum.v[axis];
|
||||||
switch(alignment)
|
switch(alignment)
|
||||||
{
|
{
|
||||||
default: break;
|
default: break;
|
||||||
@ -1366,67 +1392,25 @@ void UI_EndFrame(UI_Frame *frame)
|
|||||||
// box->cursor = FloorF32(box->cursor);
|
// box->cursor = FloorF32(box->cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Position
|
// Solve screen rect
|
||||||
{
|
{
|
||||||
Vec2 screen_pos = Zi;
|
// Compute offset
|
||||||
Vec2 offset = Zi;
|
Vec2 offset = Zi;
|
||||||
Vec2 anchor_offset = Zi;
|
|
||||||
// Vec2 screen_dims = CeilVec2(box->solved_dims);
|
|
||||||
Vec2 screen_dims = box->solved_dims;
|
|
||||||
|
|
||||||
// Floating box position
|
|
||||||
if (AnyBit(box->desc.flags, UI_BoxFlag_Floating))
|
|
||||||
{
|
{
|
||||||
UI_RegionPair floating_anchor = UI_PairFromRegion(box->desc.floating_pos_anchor);
|
// Floating box offset
|
||||||
|
if (is_floating)
|
||||||
for (Axis axis = 0; axis < Axis_COUNTXY; ++axis)
|
|
||||||
{
|
{
|
||||||
UI_AxisRegion anchor = floating_anchor.v[axis];
|
offset = box->desc.floating_pos;
|
||||||
switch (anchor)
|
offset = SubVec2(offset, anchor_offset);
|
||||||
{
|
|
||||||
default: break;
|
|
||||||
case UI_AxisRegion_Center:
|
|
||||||
{
|
|
||||||
anchor_offset.v[axis] = screen_dims.v[axis] * 0.5;
|
|
||||||
} break;
|
|
||||||
case UI_AxisRegion_End:
|
|
||||||
{
|
|
||||||
anchor_offset.v[axis] = screen_dims.v[axis];
|
|
||||||
} break;
|
|
||||||
}
|
}
|
||||||
}
|
// Non-floating box offset
|
||||||
|
|
||||||
offset = SubVec2(box->desc.floating_pos, anchor_offset);
|
|
||||||
if (box->solved_scale == 1)
|
|
||||||
{
|
|
||||||
offset = RoundVec2(offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
screen_pos = AddVec2(parent->screen_rect.p0, offset);
|
|
||||||
if (!AnyBit(box->desc.flags, UI_BoxFlag_NoFloatingClamp))
|
|
||||||
{
|
|
||||||
{
|
|
||||||
f32 overshoot = MaxF32(0, (screen_pos.x + screen_dims.x) - parent->screen_rect.p1.x);
|
|
||||||
screen_pos.x = MaxF32(parent->screen_rect.p0.x, screen_pos.x - overshoot);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
f32 overshoot = MaxF32((screen_pos.y + screen_dims.y) - parent->screen_rect.p1.y, 0);
|
|
||||||
screen_pos.y = MaxF32(parent->screen_rect.p0.y, screen_pos.y - overshoot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Non-floating box position
|
|
||||||
else if (parent)
|
else if (parent)
|
||||||
{
|
{
|
||||||
f32 layout_cursor = parent->cursor;
|
// Compute offset in layout direction (based on parent cursor)
|
||||||
// Compute offset in layout direction
|
offset.v[layout_axis_in_parent] = parent->cursor;
|
||||||
{
|
|
||||||
Axis axis = parent->desc.child_layout_axis;
|
|
||||||
offset.v[axis] = layout_cursor;
|
|
||||||
}
|
|
||||||
// Compute offset in non-layout direction (based on alignment)
|
// Compute offset in non-layout direction (based on alignment)
|
||||||
{
|
{
|
||||||
Axis axis = !parent->desc.child_layout_axis;
|
Axis axis = !layout_axis_in_parent;
|
||||||
UI_AxisRegion alignment = alignment_in_parent.v[axis];
|
UI_AxisRegion alignment = alignment_in_parent.v[axis];
|
||||||
switch(alignment)
|
switch(alignment)
|
||||||
{
|
{
|
||||||
@ -1434,31 +1418,50 @@ void UI_EndFrame(UI_Frame *frame)
|
|||||||
case UI_AxisRegion_Center:
|
case UI_AxisRegion_Center:
|
||||||
{
|
{
|
||||||
f32 parent_size = parent->solved_dims.v[axis];
|
f32 parent_size = parent->solved_dims.v[axis];
|
||||||
f32 box_size = screen_dims.v[axis];
|
f32 box_size = box->solved_dims.v[axis];
|
||||||
offset.v[axis] = parent_size / 2 - box_size / 2;
|
offset.v[axis] = parent_size / 2 - box_size / 2;
|
||||||
} break;
|
} break;
|
||||||
case UI_AxisRegion_End:
|
case UI_AxisRegion_End:
|
||||||
{
|
{
|
||||||
f32 parent_size = parent->solved_dims.v[axis];
|
f32 parent_size = parent->solved_dims.v[axis];
|
||||||
f32 box_size = screen_dims.v[axis];
|
f32 box_size = box->solved_dims.v[axis];
|
||||||
offset.v[axis] = parent_size - box_size;
|
offset.v[axis] = parent_size - box_size;
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// offset = RoundVec2(offset);
|
}
|
||||||
// offset = FloorVec2(offset);
|
if (box->solved_scale.x == 1)
|
||||||
screen_pos.x = parent->screen_rect.p0.x + offset.x;
|
{
|
||||||
screen_pos.y = parent->screen_rect.p0.y + offset.y;
|
offset.x = RoundF32(offset.x);
|
||||||
parent->cursor += screen_dims.v[parent->desc.child_layout_axis];
|
}
|
||||||
|
if (box->solved_scale.y == 1)
|
||||||
|
{
|
||||||
|
offset.y = RoundF32(offset.y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Submit position
|
// Compute rect
|
||||||
|
Vec2 screen_pos = parent ? AddVec2(parent->screen_rect.p0, offset) : VEC2(0, 0);
|
||||||
|
if (is_floating && !AnyBit(box->desc.flags, UI_BoxFlag_NoFloatingClamp))
|
||||||
|
{
|
||||||
|
Vec2 overshoot = Zi;
|
||||||
|
overshoot.x = MaxF32(0, (screen_pos.x + box->solved_dims.x) - parent->screen_rect.p1.x);
|
||||||
|
overshoot.y = MaxF32((screen_pos.y + box->solved_dims.y) - parent->screen_rect.p1.y, 0);
|
||||||
|
screen_pos.x = MaxF32(parent->screen_rect.p0.x, screen_pos.x - overshoot.x);
|
||||||
|
screen_pos.y = MaxF32(parent->screen_rect.p0.y, screen_pos.y - overshoot.y);
|
||||||
|
}
|
||||||
box->screen_rect.p0 = screen_pos;
|
box->screen_rect.p0 = screen_pos;
|
||||||
box->screen_rect.p1 = AddVec2(box->screen_rect.p0, screen_dims);
|
box->screen_rect.p1 = AddVec2(box->screen_rect.p0, box->solved_dims);
|
||||||
box->screen_anchor = AddVec2(box->screen_rect.p0, anchor_offset);
|
box->screen_anchor = AddVec2(box->screen_rect.p0, anchor_offset);
|
||||||
|
|
||||||
|
// Update parent cursor
|
||||||
|
if (parent && !is_floating)
|
||||||
|
{
|
||||||
|
parent->cursor += box->solved_dims.v[layout_axis_in_parent];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rounding
|
// Solve screen rounding
|
||||||
{
|
{
|
||||||
UI_Round rounding = box->desc.rounding;
|
UI_Round rounding = box->desc.rounding;
|
||||||
Vec2 half_dims = MulVec2(SubVec2(box->screen_rect.p1, box->screen_rect.p0), 0.5);
|
Vec2 half_dims = MulVec2(SubVec2(box->screen_rect.p1, box->screen_rect.p0), 0.5);
|
||||||
@ -1499,7 +1502,6 @@ void UI_EndFrame(UI_Frame *frame)
|
|||||||
final_rounding_bl = MaxF32(final_rounding_bl, parent->rounding_bl - Vec2Len(vbl));
|
final_rounding_bl = MaxF32(final_rounding_bl, parent->rounding_bl - Vec2Len(vbl));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Submit rounding
|
|
||||||
box->rounding_tl = final_rounding_tl;
|
box->rounding_tl = final_rounding_tl;
|
||||||
box->rounding_tr = final_rounding_tr;
|
box->rounding_tr = final_rounding_tr;
|
||||||
box->rounding_br = final_rounding_br;
|
box->rounding_br = final_rounding_br;
|
||||||
|
|||||||
@ -107,14 +107,14 @@ Enum(UI_BoxFlag)
|
|||||||
X(ChildAlignment, UI_Region) \
|
X(ChildAlignment, UI_Region) \
|
||||||
X(Width, UI_Size) \
|
X(Width, UI_Size) \
|
||||||
X(Height, UI_Size) \
|
X(Height, UI_Size) \
|
||||||
X(Scale, f32) \
|
X(Scale, Vec2) \
|
||||||
X(BackgroundColor, Vec4) \
|
X(BackgroundColor, Vec4) \
|
||||||
X(BorderColor, Vec4) \
|
X(BorderColor, Vec4) \
|
||||||
X(DebugColor, Vec4) \
|
X(DebugColor, Vec4) \
|
||||||
X(InvisibleDebugColor, Vec4) \
|
X(InvisibleDebugColor, Vec4) \
|
||||||
X(Tint, Vec4) \
|
X(Tint, Vec4) \
|
||||||
X(Border, f32) \
|
X(Border, f32) \
|
||||||
X(FloatingPosAnchor, UI_Region) \
|
X(Anchor, UI_Region) \
|
||||||
X(FloatingPos, Vec2) \
|
X(FloatingPos, Vec2) \
|
||||||
X(Rounding, UI_Round) \
|
X(Rounding, UI_Round) \
|
||||||
X(Font, GC_FontKey) \
|
X(Font, GC_FontKey) \
|
||||||
@ -241,14 +241,14 @@ Struct(UI_BoxDesc)
|
|||||||
Vec4 invisible_debug_color;
|
Vec4 invisible_debug_color;
|
||||||
Vec4 tint;
|
Vec4 tint;
|
||||||
f32 border;
|
f32 border;
|
||||||
f32 scale;
|
Vec2 scale;
|
||||||
Vec2 floating_pos;
|
|
||||||
String text;
|
String text;
|
||||||
GC_FontKey font;
|
GC_FontKey font;
|
||||||
f32 font_size;
|
f32 font_size;
|
||||||
Axis child_layout_axis;
|
Axis child_layout_axis;
|
||||||
UI_Region child_alignment;
|
UI_Region child_alignment;
|
||||||
UI_Region floating_pos_anchor;
|
UI_Region anchor;
|
||||||
|
Vec2 floating_pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
Struct(UI_Cmd)
|
Struct(UI_Cmd)
|
||||||
@ -307,8 +307,8 @@ Struct(UI_Box)
|
|||||||
u64 post_index;
|
u64 post_index;
|
||||||
|
|
||||||
//- Layout data
|
//- Layout data
|
||||||
f32 solved_scale;
|
Vec2 solved_scale;
|
||||||
f32 final_children_size_accum[Axis_COUNTXY];
|
Vec2 final_children_size_accum;
|
||||||
Vec2 solved_dims;
|
Vec2 solved_dims;
|
||||||
f32 cursor;
|
f32 cursor;
|
||||||
|
|
||||||
@ -533,7 +533,7 @@ Vec2 UI_CursorPos(void);
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
//~ Text layout helpers
|
//~ Text layout helpers
|
||||||
|
|
||||||
GC_Run UI_ScaleRun(Arena *arena, GC_Run unscaled_run, f32 scale);
|
GC_Run UI_ScaleRun(Arena *arena, GC_Run unscaled_run, Vec2 scale);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
//~ End frame
|
//~ End frame
|
||||||
|
|||||||
@ -6,7 +6,7 @@ UI_Key UI_BuildLabel(String text)
|
|||||||
UI_Key parent = UI_UseTop(Parent);
|
UI_Key parent = UI_UseTop(Parent);
|
||||||
GC_FontKey font = UI_UseTop(Font);
|
GC_FontKey font = UI_UseTop(Font);
|
||||||
f32 font_size = UI_UseTop(FontSize);
|
f32 font_size = UI_UseTop(FontSize);
|
||||||
f32 scale = UI_UseTop(Scale);
|
Vec2 scale = UI_UseTop(Scale);
|
||||||
Vec4 tint = UI_UseTop(Tint);
|
Vec4 tint = UI_UseTop(Tint);
|
||||||
UI_Region alignment = UI_UseTop(ChildAlignment);
|
UI_Region alignment = UI_UseTop(ChildAlignment);
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ UI_Key UI_BuildSpacer(UI_Size size, Axis axis)
|
|||||||
{
|
{
|
||||||
UI_Key parent = UI_UseTop(Parent);
|
UI_Key parent = UI_UseTop(Parent);
|
||||||
UI_Key key = Zi;
|
UI_Key key = Zi;
|
||||||
f32 scale = UI_UseTop(Scale);
|
Vec2 scale = UI_UseTop(Scale);
|
||||||
UI_PushCP(UI_NilKey);
|
UI_PushCP(UI_NilKey);
|
||||||
{
|
{
|
||||||
UI_PushDefaults();
|
UI_PushDefaults();
|
||||||
@ -71,7 +71,7 @@ UI_Key UI_BuildDivider(UI_Size size, Vec4 color, Axis axis)
|
|||||||
{
|
{
|
||||||
UI_Key key = Zi;
|
UI_Key key = Zi;
|
||||||
UI_Key parent = UI_UseTop(Parent);
|
UI_Key parent = UI_UseTop(Parent);
|
||||||
f32 scale = UI_UseTop(Scale);
|
Vec2 scale = UI_UseTop(Scale);
|
||||||
Vec4 tint = UI_UseTop(Tint);
|
Vec4 tint = UI_UseTop(Tint);
|
||||||
UI_PushCP(UI_NilKey);
|
UI_PushCP(UI_NilKey);
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user