overshoot profiler zoom interpolation

This commit is contained in:
jacob 2026-04-01 11:05:42 -05:00
parent 934aba571b
commit a33b7346fa
3 changed files with 106 additions and 37 deletions

View File

@ -5495,6 +5495,22 @@ void V_TickForever(WaveLaneCtx *lane)
}
@ -5517,13 +5533,8 @@ void V_TickForever(WaveLaneCtx *lane)
UI_Key profiler_graph_box = UI_KeyF("graph");
UI_SetDF(OmitFlags, UI_BoxFlag_CaptureMouse * !!(frame->is_looking))
if (TweakBool("Show profiler", 1))
if (profiler->is_showing)
{
profiler->is_showing = 1;
// FIXME: Remove this
@ -5600,23 +5611,49 @@ void V_TickForever(WaveLaneCtx *lane)
// FIXME: Remove this
f32 prof_zoom_rate = 1.5;
f32 prof_zoom_rate = 1.65;
f64 prof_lerp_rate = SaturateF64(frame->dt * 25);
{
f64 zooms = UI_Presses(main_box, Button_WheelDown) - UI_Presses(main_box, Button_WheelUp);
f64 zoom_factor = PowF64(prof_zoom_rate, zooms);
profiler->target_ns_per_px *= zoom_factor;
profiler->target_view_ns = profiler->cursor_ns - (profiler->cursor_ns - profiler->target_view_ns) * zoom_factor;
if (zooms != 0)
{
profiler->last_zoom_delta = profiler->target_ns_per_px - profiler->ns_per_px;
profiler->last_view_delta = profiler->target_view_ns - profiler->view_ns;
}
f64 overshoot_rate = 2 * frame->dt;
profiler->ns_per_px = LerpF64(profiler->ns_per_px, profiler->target_ns_per_px + profiler->last_zoom_delta * overshoot_rate, prof_lerp_rate);
profiler->view_ns = LerpF64(profiler->view_ns, profiler->target_view_ns + profiler->last_view_delta * overshoot_rate, prof_lerp_rate);
if (profiler->last_zoom_delta < 0)
{
profiler->ns_per_px = MaxF64(profiler->ns_per_px, profiler->target_ns_per_px);
}
else if (profiler->last_zoom_delta > 0)
{
profiler->ns_per_px = MinF64(profiler->ns_per_px, profiler->target_ns_per_px);
}
if (profiler->last_view_delta < 0)
{
profiler->view_ns = MaxF64(profiler->view_ns, profiler->target_view_ns);
}
else if (profiler->last_view_delta > 0)
{
profiler->view_ns = MinF64(profiler->view_ns, profiler->target_view_ns);
}
}
f64 zoom_factor = PowF64(prof_zoom_rate, UI_Presses(main_box, Button_WheelDown) - UI_Presses(main_box, Button_WheelUp));
profiler->target_ns_per_px *= zoom_factor;
profiler->target_ns_per_px = ClampF64(profiler->target_ns_per_px, min_profiler_ns_per_px, max_profiler_ns_per_px);
// profiler->view_ns = profiler->cursor_ns - (profiler->cursor_ns - profiler->view_ns) * zoom_factor;
// TODO: Don't apply offset when zoom movement was clamped
profiler->target_view_ns = profiler->cursor_ns - (profiler->cursor_ns - profiler->target_view_ns) * zoom_factor;
profiler->ns_per_px = LerpF64(profiler->ns_per_px, profiler->target_ns_per_px, prof_lerp_rate);
profiler->view_ns = LerpF64(profiler->view_ns, profiler->target_view_ns, prof_lerp_rate);
@ -5736,7 +5773,6 @@ void V_TickForever(WaveLaneCtx *lane)
i64 start_ns;
i64 end_ns;
b32 is_collapsed;
u64 collapsed_count;
};
@ -5784,8 +5820,8 @@ void V_TickForever(WaveLaneCtx *lane)
SllQueuePush(first_bfs_zone, last_bfs_zone, root_bfs);
}
VisZone *collapsed_vis_zone = 0;
V_Zone *collapsed_zone_parent = 0;
VisZone *prev_vis_zone = 0;
V_Zone *prev_zone_parent = 0;
for (BfsZone *bfs_zone = first_bfs_zone; bfs_zone; bfs_zone = first_bfs_zone)
{
SllQueuePop(first_bfs_zone, last_bfs_zone);
@ -5796,8 +5832,30 @@ void V_TickForever(WaveLaneCtx *lane)
i64 zone_elapsed_ns = zone_end_ns - zone_start_ns;
i64 visual_zone_start_ns = MaxI64(zone_start_ns, profiler->view_ns);
i64 visual_zone_end_ns = MinI64(zone_end_ns, profiler->view_ns + view_range_len_ns);
f64 visual_zone_start_px = visual_zone_start_ns / profiler->ns_per_px;
f64 visual_zone_end_px = MaxF64(visual_zone_end_ns / profiler->ns_per_px, visual_zone_start_px + min_zone_width_px);
if (prev_vis_zone && prev_zone_parent == zone->parent)
// if (prev_vis_zone)
{
// visual_zone_start_px = MaxF64(visual_zone_start_px, prev_vis_zone->end_px + 1);
// f64 px = prev_vis_zone->end_px;
// prev_vis_zone->end_px = CeilF64(px);
// visual_zone_start_px = MaxF64(visual_zone_start_px, CeilF64(prev_vis_zone->end_px));
f64 px = prev_vis_zone->end_px;
prev_vis_zone->end_px = FloorF64(px);
visual_zone_start_px = CeilF64(px);
}
// f64 visual_zone_end_px = MaxF64(visual_zone_end_ns / profiler->ns_per_px, visual_zone_start_px + min_zone_width_px);
f64 visual_zone_end_px = visual_zone_end_ns / profiler->ns_per_px;
// f64 visual_zone_end_px = visual_zone_end_ns / profiler->ns_per_px - 1;
// visual_zone_start_px = FloorF64(visual_zone_start_px);
// visual_zone_end_px = CeilF64(visual_zone_end_px);
b32 is_root_zone = zone == zone_track->root_zone;
b32 should_collapse_zone = (zone_elapsed_ns / profiler->ns_per_px) <= zone_collapse_threshold_px && !is_root_zone;
@ -5854,12 +5912,13 @@ void V_TickForever(WaveLaneCtx *lane)
VisZone *vis_zone = 0;
if (
should_collapse_zone &&
collapsed_vis_zone &&
collapsed_zone_parent == zone->parent &&
((zone_start_ns - collapsed_vis_zone->end_ns) / profiler->ns_per_px) < zone_collapse_threshold_px
prev_vis_zone &&
prev_vis_zone->collapsed_count > 0 &&
prev_zone_parent == zone->parent &&
((zone_start_ns - prev_vis_zone->end_ns) / profiler->ns_per_px) < zone_collapse_threshold_px
)
{
vis_zone = collapsed_vis_zone;
vis_zone = prev_vis_zone;
}
else
{
@ -5879,11 +5938,11 @@ void V_TickForever(WaveLaneCtx *lane)
if (should_collapse_zone)
{
vis_zone->is_collapsed = 1;
vis_zone->collapsed_count += zone->total_descendents_count + 1;
collapsed_vis_zone = vis_zone;
collapsed_zone_parent = zone->parent;
}
prev_vis_zone = vis_zone;
prev_zone_parent = zone->parent;
}
}
}
@ -6061,10 +6120,10 @@ void V_TickForever(WaveLaneCtx *lane)
{
zone_text = StringF(frame->arena, "%F", FmtUint(zone->collapsed_count));
zone_text_color = collapsed_text_color;
zone_color = VEC4(0, 0, 0, 0);
// zone_color = VEC4(0, 0, 0, 0);
// zone_color = VEC4(1, 0, 1, 1);
// zone_color = VEC4(0.15, 0.15, 0.15, 0.5);
// zone_color = VEC4(0.20, 0.20, 0.20, 0.5);
zone_color = VEC4(0.20, 0.20, 0.20, 0.5);
zone_color_bd = VEC4(0, 0, 0, 0);
}
@ -6109,7 +6168,7 @@ void V_TickForever(WaveLaneCtx *lane)
}
// Zone name
if (zone_len_px > zone_collapse_threshold_px)
if (zone_len_px > zone_collapse_threshold_px * 3)
{
if (is_collapsed)
{
@ -6375,12 +6434,6 @@ void V_TickForever(WaveLaneCtx *lane)
@ -7215,6 +7268,11 @@ void V_TickForever(WaveLaneCtx *lane)
frame->show_console = !frame->show_console;
} break;
case V_CmdKind_toggle_profiler:
{
frame->profiler.is_showing = !frame->profiler.is_showing;
} break;
case V_CmdKind_toggle_timeline:
{
frame->timeline.show = !frame->timeline.show;
@ -7342,6 +7400,10 @@ void V_TickForever(WaveLaneCtx *lane)
}
}
//////////////////////////////
//- Begin gpu frame

View File

@ -11,7 +11,8 @@
X(save_level, Save level, V_CmdDescFlag_None, V_HOTKEY( Button_S, .ctrl = 1 ), ) \
X(toggle_ui_debug, Toggle UI Debug, V_CmdDescFlag_None, V_HOTKEY( Button_F5 ), ) \
X(toggle_console, Toggle Developer Console, V_CmdDescFlag_None, V_HOTKEY( Button_GraveAccent ), ) \
X(toggle_timeline, Toggle Debug Timeline, V_CmdDescFlag_None, V_HOTKEY( Button_GraveAccent, .alt = 1 ), ) \
X(toggle_timeline, Toggle Debug Timeline, V_CmdDescFlag_None, V_HOTKEY( Button_GraveAccent, .alt = 1, .ctrl = 1 ), ) \
X(toggle_profiler, Toggle Profiler, V_CmdDescFlag_None, V_HOTKEY( Button_GraveAccent, .alt = 1 ), ) \
X(pause_timeline, Pause Debug Timeline, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_E ), ) \
X(lock_timeline, Lock Debug Timeline, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_R ), ) \
X(toggle_fullscreen, Toggle Fullscreen Mode, V_CmdDescFlag_None, V_HOTKEY( Button_Enter, .alt = 1 ) ) \
@ -307,9 +308,15 @@ Struct(V_Profiler)
f64 ruler_start_ns;
f32 ruler_opacity;
f64 last_zoom_delta;
f64 last_view_delta;
f64 target_ns_per_px;
f64 ns_per_px;
f64 zoom_level;
f64 target_zoom_level;
f64 cursor_ns;
f64 drag_cursor_px;
};

View File

@ -835,7 +835,7 @@ UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags)
feedback->active_smooth = SaturateF32(LerpF32(feedback->active_smooth, target_active, active_blend_rate));
feedback->hot_smooth = SaturateF32(LerpF32(feedback->hot_smooth, target_hot, hot_blend_rate));
feedback->hovered_smooth = SaturateF32(LerpF32(feedback->hovered_smooth, target_hovered, hovered_blend_rate));
feedback->hovered_smooth = SaturateF32(LerpF32(feedback->hovered_smooth, target_hovered, hovered_blend_rate));
feedback->exists_smooth = SaturateF32(LerpF32(feedback->exists_smooth, target_exists, exists_blend_rate));
feedback->misc_smooth = SaturateF32(LerpF32(feedback->misc_smooth, target_misc, misc_blend_rate));