overshoot UI animation targets. add vsync tweak.

This commit is contained in:
jacob 2026-01-03 16:15:58 -06:00
parent 0224b27902
commit 8fa00607cb
5 changed files with 46 additions and 53 deletions

View File

@ -86,6 +86,5 @@
// TODO: Move these to user-configurable settings // TODO: Move these to user-configurable settings
#define VSYNC 1
#define AUDIO_ENABLED 0 #define AUDIO_ENABLED 0
#define FPS_LIMIT 300 #define FPS_LIMIT 300

View File

@ -637,7 +637,7 @@ void S_TickForever(WaveLaneCtx *lane)
S_Shape shape0 = constraint->shape0; S_Shape shape0 = constraint->shape0;
S_Shape shape1 = constraint->shape1; S_Shape shape1 = constraint->shape1;
S_DebugDrawShape(shape1, Color_Cyan); S_DebugDrawShape(shape1, Color_Orange);
// TODO: Real dir // TODO: Real dir
Vec2 shape_dir = NormVec2(SubVec2(shape1.centroid, shape0.centroid)); Vec2 shape_dir = NormVec2(SubVec2(shape1.centroid, shape0.centroid));

View File

@ -485,10 +485,8 @@ void V_TickForever(WaveLaneCtx *lane)
V_WidgetTheme theme = V_GetWidgetTheme(); V_WidgetTheme theme = V_GetWidgetTheme();
UI_FrameFlag ui_frame_flags = 0; UI_FrameFlag ui_frame_flags = 0;
Vec4 swapchain_color = theme.col.window_bg;
ui_frame_flags |= UI_FrameFlag_Debug * !!frame->ui_debug; ui_frame_flags |= UI_FrameFlag_Debug * !!frame->ui_debug;
ui_frame_flags |= UI_FrameFlag_Vsync * !!VSYNC; UI_Frame *ui_frame = UI_BeginFrame(ui_frame_flags);
UI_Frame *ui_frame = UI_BeginFrame(ui_frame_flags, swapchain_color);
WND_Frame window_frame = ui_frame->window_frame; WND_Frame window_frame = ui_frame->window_frame;
WND_SetCursor(window_frame, WND_CursorKind_Default); WND_SetCursor(window_frame, WND_CursorKind_Default);
@ -2587,6 +2585,8 @@ void V_TickForever(WaveLaneCtx *lane)
////////////////////////////// //////////////////////////////
//- End frame //- End frame
i32 vsync = !!TweakBool("Vsync", 1);
{ {
Arena *old_arena = sim_output->arena; Arena *old_arena = sim_output->arena;
ZeroStruct(sim_output); ZeroStruct(sim_output);
@ -2596,7 +2596,7 @@ void V_TickForever(WaveLaneCtx *lane)
G_CommitCommandList(frame->cl); G_CommitCommandList(frame->cl);
UI_EndFrame(ui_frame); UI_EndFrame(ui_frame, vsync);
} }
FetchAddFence(&V.shutdown_complete, 1); FetchAddFence(&V.shutdown_complete, 1);

View File

@ -551,7 +551,7 @@ UI_BoxReports UI_ReportsFromKey(UI_Key key)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Begin frame //~ Begin frame
UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags, Vec4 swapchain_color) UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags)
{ {
////////////////////////////// //////////////////////////////
@ -619,7 +619,6 @@ UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags, Vec4 swapchain_color)
} }
frame->frame_flags = frame_flags; frame->frame_flags = frame_flags;
frame->swapchain_color = swapchain_color;
////////////////////////////// //////////////////////////////
//- Process controller events //- Process controller events
@ -791,31 +790,37 @@ UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags, Vec4 swapchain_color)
} }
// Update box reports // Update box reports
{
f32 lower_target = TweakFloat("UI lower blend target", -0.05, -1, 0);
f32 upper_target = TweakFloat("UI upper blend target", 1.05, 1, 10);
for (u64 pre_index = 0; pre_index < UI.boxes_count; ++pre_index) for (u64 pre_index = 0; pre_index < UI.boxes_count; ++pre_index)
{ {
UI_Box *box = last_frame->boxes_pre[pre_index]; UI_Box *box = last_frame->boxes_pre[pre_index];
UI_BoxReport *report = &box->reports.draw; UI_BoxReport *report = &box->reports.draw;
report->is_hot = box == hot_box; report->is_hot = box == hot_box;
f32 target_exists = box->last_build_tick >= (frame->tick - 1); f32 target_exists = (box->last_build_tick >= (frame->tick - 1)) ? upper_target : lower_target;
f32 target_hovered = report->is_hovered; f32 target_hovered = report->is_hovered ? Inf : lower_target;
f32 target_hot = report->is_hot; f32 target_hot = report->is_hot ? Inf : lower_target;
f32 target_active = box == active_box; f32 target_active = box == active_box ? Inf : lower_target;
f64 target_misc = box->desc.misc; f64 target_misc = box->desc.misc;
// TODO: Configurable per-box blend rates // TODO: Configurable per-box blend rates
f32 exists_blend_rate = (30 * frame->dt); f32 exists_blend_rate = (30 * frame->dt);
f32 hot_blend_rate = target_hot == 1 ? 1 : (15 * frame->dt); f32 hot_blend_rate = (15 * frame->dt);
f32 active_blend_rate = target_active == 1 ? 1 : (15 * frame->dt); f32 active_blend_rate = (15 * frame->dt);
f32 hovered_blend_rate = target_hovered == 1 ? 1 : (15 * frame->dt); f32 hovered_blend_rate = (15 * frame->dt);
// f64 misc_blend_rate = (30 * frame->dt); // f64 misc_blend_rate = (30 * frame->dt);
f64 misc_blend_rate = 1; f64 misc_blend_rate = 1;
report->exists = LerpF32(report->exists, target_exists, exists_blend_rate); report->exists = SaturateF32(LerpF32(report->exists, target_exists, exists_blend_rate));
report->hot = LerpF32(report->hot, target_hot, hot_blend_rate); report->hot = SaturateF32(LerpF32(report->hot, target_hot, hot_blend_rate));
report->active = LerpF32(report->active, target_active, active_blend_rate); report->active = SaturateF32(LerpF32(report->active, target_active, active_blend_rate));
report->hovered = LerpF32(report->hovered, target_hovered, hovered_blend_rate); report->hovered = SaturateF32(LerpF32(report->hovered, target_hovered, hovered_blend_rate));
report->misc = LerpF32(report->misc, target_misc, misc_blend_rate); report->misc = SaturateF32(LerpF32(report->misc, target_misc, misc_blend_rate));
report->screen_rect = box->screen_rect; report->screen_rect = box->screen_rect;
report->screen_anchor = box->screen_anchor; report->screen_anchor = box->screen_anchor;
@ -824,6 +829,7 @@ UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags, Vec4 swapchain_color)
box->reports.drag = *report; box->reports.drag = *report;
} }
} }
}
if (mouse_downs > 0) if (mouse_downs > 0)
{ {
@ -904,7 +910,7 @@ GC_Run UI_ScaleRun(Arena *arena, GC_Run unscaled_run, Vec2 scale)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ End frame //~ End frame
void UI_EndFrame(UI_Frame *frame) void UI_EndFrame(UI_Frame *frame, i32 vsync)
{ {
TempArena scratch = BeginScratchNoConflict(); TempArena scratch = BeginScratchNoConflict();
UI_BoxIter box_iter = Zi; UI_BoxIter box_iter = Zi;
@ -1128,16 +1134,6 @@ void UI_EndFrame(UI_Frame *frame)
{ {
box->solved_scale = MulVec2Vec2(parent->solved_scale, box->solved_scale); box->solved_scale = MulVec2Vec2(parent->solved_scale, box->solved_scale);
} }
f32 scale_snap = TweakFloat("UI scale snap threshold", 0.0, 0, 0.01, .precision = 6);
if (AbsF32(1.0 - box->solved_scale.x) < scale_snap)
{
box->solved_scale.x = 1;
}
if (AbsF32(1.0 - box->solved_scale.y) < scale_snap)
{
box->solved_scale.y = 1;
}
} }
} }
else else
@ -1785,7 +1781,7 @@ void UI_EndFrame(UI_Frame *frame)
//- End frame //- End frame
G_CommitCommandList(frame->cl); G_CommitCommandList(frame->cl);
WND_EndFrame(frame->window_frame, VSYNC); WND_EndFrame(frame->window_frame, vsync);
EndScratch(scratch); EndScratch(scratch);
} }

View File

@ -364,7 +364,6 @@ Enum(UI_FrameFlag)
{ {
UI_FrameFlag_None = 0, UI_FrameFlag_None = 0,
UI_FrameFlag_Debug = (1 << 0), UI_FrameFlag_Debug = (1 << 0),
UI_FrameFlag_Vsync = (1 << 1),
}; };
Struct(UI_Frame) Struct(UI_Frame)
@ -391,7 +390,6 @@ Struct(UI_Frame)
UI_Key active_box; UI_Key active_box;
// Cmds // Cmds
Vec4 swapchain_color;
UI_FrameFlag frame_flags; UI_FrameFlag frame_flags;
UI_CmdNode *first_cmd_node; UI_CmdNode *first_cmd_node;
UI_CmdNode *last_cmd_node; UI_CmdNode *last_cmd_node;
@ -523,7 +521,7 @@ UI_BoxReports UI_ReportsFromKey(UI_Key key);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Begin frame //~ Begin frame
UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags, Vec4 swapchain_color); UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Frame helpers //~ Frame helpers
@ -541,4 +539,4 @@ GC_Run UI_ScaleRun(Arena *arena, GC_Run unscaled_run, Vec2 scale);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ End frame //~ End frame
void UI_EndFrame(UI_Frame *frame); void UI_EndFrame(UI_Frame *frame, i32 vsync);