From 1a7794e81be3eefef9ac3c5a517db943c1b537b6 Mon Sep 17 00:00:00 2001 From: jacob Date: Fri, 3 Apr 2026 13:09:53 -0500 Subject: [PATCH] move logging to panel --- src/pp/pp_vis/pp_vis_core.c | 2337 +++++++++++++++---------------- src/pp/pp_vis/pp_vis_core.h | 12 +- src/pp/pp_vis/pp_vis_gpu.g | 3 +- src/pp/pp_vis/pp_vis_shared.cgh | 1 - 4 files changed, 1127 insertions(+), 1226 deletions(-) diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index b6d5df20..2bc21890 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -570,6 +570,14 @@ String V_StringFromTextboxSelection(Arena *arena, V_TextboxState *tb) return StringFromString32(arena, (String32) { .len = max - min, .text = tb->text32 + min }); } +//////////////////////////////////////////////////////////// +//~ Panel + +b32 V_ShouldIgnorePanel(V_Panel *panel) +{ + return panel->flags & V_PanelFlag_Ignore; +} + //////////////////////////////////////////////////////////// //~ Timeline helpers @@ -930,7 +938,6 @@ void V_TickForever(WaveLaneCtx *lane) frame->palette = prev_frame->palette; frame->is_editing = prev_frame->is_editing; frame->ui_debug = prev_frame->ui_debug; - frame->show_console = prev_frame->show_console; frame->look = prev_frame->look; frame->fire_presses = prev_frame->fire_presses; frame->roll_presses = prev_frame->roll_presses; @@ -3747,89 +3754,105 @@ void V_TickForever(WaveLaneCtx *lane) for (V_Panel *panel = parent_panel->first; panel; panel = panel->next) { - BfsPanel *panel_bfs = PushStruct(frame->arena, BfsPanel); - panel_bfs->panel = panel; - SllQueuePush(first_bfs_panel, last_bfs_panel, panel_bfs); - - UI_PushDF(Tag, panel->contents_box.v) - UI_PushDF(Parent, panel->contents_box) + if (!V_ShouldIgnorePanel(panel)) { - ////////////////////////////// - //- Build console panel + BfsPanel *panel_bfs = PushStruct(frame->arena, BfsPanel); + panel_bfs->panel = panel; + SllQueuePush(first_bfs_panel, last_bfs_panel, panel_bfs); - - if (panel->flags & V_PanelFlag_Console) - ProfZoneDF("Build console panel") + UI_PushDF(Tag, panel->contents_box.v) + UI_PushDF(Parent, panel->contents_box) { + ////////////////////////////// + //- Build console panel - //- Gather visible logs - Struct(VisLog) + if (panel->flags & V_PanelFlag_Console) + ProfZoneDF("Build console panel") { - VisLog *next; - LogEvent log_ev; - }; - u64 display_logs_count = 0; - VisLog *first_vis_log = 0; - VisLog *last_vis_log = 0; + Vec4 level_colors[LogLevel_COUNT][2] = Zi; + SetBytes(level_colors, 0xFF, sizeof(level_colors)); + level_colors[LogLevel_Trace][0] = Rgb(0.1, 0.4, 0.4); + level_colors[LogLevel_Trace][1] = Rgb(0.2, 0.5, 0.5); + level_colors[LogLevel_Debug][0] = Rgb(0.4, 0.1, 0.4); + level_colors[LogLevel_Debug][1] = Rgb(0.5, 0.2, 0.5); + level_colors[LogLevel_Info][0] = Rgb(0.2, 0.2, 0.2); + level_colors[LogLevel_Info][1] = Rgb(0.25, 0.25, 0.25); + level_colors[LogLevel_Success][0] = Rgb(0.1, 0.3, 0.1); + level_colors[LogLevel_Success][1] = Rgb(0.2, 0.4, 0.2); + level_colors[LogLevel_Warning][0] = Rgb(0.4, 0.4, 0.1); + level_colors[LogLevel_Warning][1] = Rgb(0.5, 0.5, 0.2); + level_colors[LogLevel_Error][0] = Rgb(0.4, 0.1, 0.1); + level_colors[LogLevel_Error][1] = Rgb(0.5, 0.2, 0.2); - i32 max_log_level = LogLevel_Trace; - - u32 max_display_logs = 30; - i64 max_time_ns = NsFromSeconds(1000); - LogEventsArray log_events = GetLogEvents(); - { - b32 done = 0; - for (u64 log_event_idx = log_events.count; log_event_idx-- > 0 && display_logs_count < max_display_logs && !done;) + //- Gather visible logs + Struct(VisLog) { - LogEvent ev = log_events.events[log_event_idx]; - if (ev.time_ns > (frame->time_ns - max_time_ns)) + VisLog *next; + VisLog *prev; + LogEvent log_ev; + }; + u64 display_logs_count = 0; + VisLog *first_vis_log = 0; + VisLog *last_vis_log = 0; + + i32 max_log_level = LogLevel_Trace; + + f32 max_display_logs = MaxF32(10, DimsFromRng2(UI_Rect(panel->contents_box)).y / (UI_Top(FontSize))); + LogEventsArray log_events = GetLogEvents(); + { + for (u64 log_event_idx = log_events.count; log_event_idx-- > 0 && display_logs_count < max_display_logs;) { + LogEvent ev = log_events.events[log_event_idx]; if (ev.level <= max_log_level) { VisLog *vis_log = PushStruct(frame->arena, VisLog); vis_log->log_ev = ev; - SllQueuePush(first_vis_log, last_vis_log, vis_log); + DllQueuePush(first_vis_log, last_vis_log, vis_log); ++display_logs_count; } } - else - { - done = 1; - } } - } - //- Build log entries UI - UI_PushDF(ChildAlignment, UI_Region_BottomLeft) - // UI_PushDF(Anchor, UI_Region_BottomLeft) - // UI_SetNext(Height, UI_Shrink(0, 1)); - UI_PushDF(Parent, UI_BuildColumn()) - { - // UI_SetNext(BackgroundColor, VEC4(0.1, 0.5, 0.5, 0.8)); - // UI_SetNext(Height, UI_Grow(1, 0)); - // UI_BuildBox(); - - // UI_SetNext(Flags, UI_BoxFlag_Floating) - UI_SetNext(Height, UI_Shrink(0, 1)); + //- Build log entries UI + UI_PushDF(ChildAlignment, UI_Region_BottomLeft) + // UI_PushDF(Anchor, UI_Region_BottomLeft) + // UI_SetNext(Height, UI_Shrink(0, 1)); UI_PushDF(Parent, UI_BuildColumn()) { - for (VisLog *vis_log = first_vis_log; vis_log; vis_log = vis_log->next) - { - LogEvent ev = vis_log->log_ev; - String log_msg = ev.msg; - String display_text = StringF(frame->arena, "%F", FmtString(log_msg)); + // UI_SetNext(BackgroundColor, VEC4(0.1, 0.5, 0.5, 0.8)); + // UI_SetNext(Height, UI_Grow(1, 0)); + // UI_BuildBox(); - // UI_BuildLabelF("%F", FmtString(text)); - UI_SetNext(Height, UI_Shrink(0, 1)); - UI_SetNext(Text, display_text); - // UI_SetNext(ChildAlignment, UI_Region_BottomLeft); - UI_SetNext(ChildAlignment, UI_Region_TopLeft); - UI_SetNext(Flags, UI_BoxFlag_DrawText); - UI_BuildBox(); + // UI_SetNext(Flags, UI_BoxFlag_Floating) + UI_SetNext(Height, UI_Shrink(0, 1)); + UI_PushDF(Parent, UI_BuildColumn()) + { + for (VisLog *vis_log = last_vis_log; vis_log; vis_log = vis_log->prev) + { + + LogEvent ev = vis_log->log_ev; + String log_msg = ev.msg; + String display_text = StringF(frame->arena, "%F", FmtString(log_msg)); + + Vec4 color = level_colors[ev.level][ev.level_id % 2]; + color.a *= 0.55; + + UI_SetNext(BackgroundColor, color); + UI_SetNext(Height, UI_Shrink(0, 1)); + UI_PushDF(Parent, UI_BuildRow()) + { + // UI_BuildLabelF("%F", FmtString(text)); + UI_SetNext(Height, UI_Shrink(0, 1)); + UI_SetNext(Text, display_text); + // UI_SetNext(ChildAlignment, UI_Region_BottomLeft); + // UI_SetNext(ChildAlignment, UI_Region_TopLeft); + UI_SetNext(Flags, UI_BoxFlag_DrawText); + UI_BuildBox(); + } + } } } } - } @@ -3856,452 +3879,453 @@ void V_TickForever(WaveLaneCtx *lane) - ////////////////////////////// - //- Build profiler panel + ////////////////////////////// + //- Build profiler panel - if (!TweakBool("Hide profiler", 0)) - if (panel->flags & V_PanelFlag_Profiler) - ProfZoneDF("Build profiler panel") - { - // FIXME: Finalize - - - - // // FIXME: Remove this - // if (frame->tick == 1) - // { - // frame->profiler.is_showing = 1; - // } - - - - - - - - - - - V_Profiler *profiler = &panel->profiler; - - f64 min_profiler_ns_per_px = 1; - // f64 max_profiler_ns_per_px = NsFromSeconds(100); - f64 max_profiler_ns_per_px = frame->time_ns / 10; - profiler->target_ns_per_px = ClampF64(profiler->target_ns_per_px, min_profiler_ns_per_px, max_profiler_ns_per_px); - profiler->ns_per_px = ClampF64(profiler->ns_per_px, min_profiler_ns_per_px, max_profiler_ns_per_px); - - UI_PushDF(OmitFlags, UI_BoxFlag_CaptureMouse * !!(frame->is_looking)) - // if (profiler->is_showing) + if (!TweakBool("Hide profiler", 1)) + if (panel->flags & V_PanelFlag_Profiler) + ProfZoneDF("Build profiler panel") { - // FIXME: Remove this + // FIXME: Finalize + + + // // FIXME: Remove this // if (frame->tick == 1) // { - // // profiler->ns_per_px = NsFromSeconds(0.0001); - // profiler->target_ns_per_px = NsFromSeconds(0.01); + // frame->profiler.is_showing = 1; // } - // FIXME: Remove this + + + + + + + + + V_Profiler *profiler = &panel->profiler; + + f64 min_profiler_ns_per_px = 1; + // f64 max_profiler_ns_per_px = NsFromSeconds(100); + f64 max_profiler_ns_per_px = frame->time_ns / 10; + profiler->target_ns_per_px = ClampF64(profiler->target_ns_per_px, min_profiler_ns_per_px, max_profiler_ns_per_px); + profiler->ns_per_px = ClampF64(profiler->ns_per_px, min_profiler_ns_per_px, max_profiler_ns_per_px); + + UI_PushDF(OmitFlags, UI_BoxFlag_CaptureMouse * !!(frame->is_looking)) + // if (profiler->is_showing) { - V_ProfilerFrame *pf = &V.profiler_frames[V.profiler_frame_seq % V_ProfilerFramesCap]; - V.profiler_frame_seq += 1; - } + // FIXME: Remove this - - - - - //- Build profiler - UI_Key profiler_box = UI_KeyF("profiler"); - UI_PushDF(Tag, profiler_box.v) - UI_PushDF(Parent, profiler_box) - { - UI_Key main_box = UI_KeyF("main"); - - // UI_Size profiler_height = UI_Fnt(70, 1); - UI_Size profiler_height = UI_Grow(1, 0); - UI_Size header_height = UI_Fnt(2, 1); - UI_Size footer_height = UI_Fnt(2, 1); - UI_Size window_padding = UI_Fnt(0.60, 1); - UI_Size minor_padding = UI_Fnt(0.15, 1); - // UI_Size graph_height = UI_Grow(0.25, 0); - UI_Size graph_height = UI_Fnt(2, 1); - UI_Size main_height = UI_Grow(1, 0); - UI_Size zone_height = UI_Fnt(1.25, 0); - // UI_Size track_height = UI_Fnt(10, 0); - UI_Size track_height = UI_Grow(1, 0); - // UI_Size track_height = UI_Shrink(0, 0); - f32 zone_text_padding_px = UI_Top(FontSize) * 0.2; - - // Vec2 old_main_dims = DimsFromRng2(UI_Rect(main_box)); - // old_main_dims.x = MaxF32(old_main_dims.x, 1); - // old_main_dims.y = MaxF32(old_main_dims.y, 1); - - - - // if (profiler->view_start_ns == 0 && profiler->view_end_ns == 0) + // if (frame->tick == 1) // { - // profiler->view_start_ns = NsFromSeconds(0); - // profiler->view_end_ns = NsFromSeconds(10); + // // profiler->ns_per_px = NsFromSeconds(0.0001); + // profiler->target_ns_per_px = NsFromSeconds(0.01); // } - // f32 old_cursor_offset_px = frame->screen_cursor.x - UI_Rect(main_box).p0.x; - // i64 old_cursor_offset_ns = (old_cursor_offset_px / old_main_dims.x) * (profiler->view_end_ns - profiler->view_start_ns); - // i64 old_cursor_ns = profiler->view_start_ns + old_cursor_offset_ns; - - f32 cursor_px = frame->screen_cursor.x - UI_Rect(main_box).p0.x; - - b32 is_main_hot = UI_HotAbsolute(main_box); - // if (is_main_hot) - { - profiler->cursor_ns = (cursor_px * profiler->ns_per_px) + profiler->view_ns; - } - - // Snap view - if (!profiler->unsnap) - { - f64 snap_width_ns = NsFromSeconds(1.0 / 10.0); - profiler->target_view_ns = frame->time_ns - snap_width_ns; - profiler->target_ns_per_px = snap_width_ns / MaxF32(DimsFromRng2(UI_Rect(main_box)).x, 100); - } - - 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); - if (zooms != 0) - { - profiler->unsnap = 1; - } - 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_factor = 0.01; - profiler->ns_per_px = LerpF64(profiler->ns_per_px, profiler->target_ns_per_px + profiler->last_zoom_delta * overshoot_factor, prof_lerp_rate); - profiler->view_ns = LerpF64(profiler->view_ns, profiler->target_view_ns + profiler->last_view_delta * overshoot_factor, 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); - } - } - - - - - - - - - - - - - - - - - - - // if (profiler->is_dragging && !prev_frame->profiler.is_dragging) - // { - // profiler->drag_view_ns = profiler->view_ns; - // profiler->drag_cursor_px = cursor_px; - // } - - // if (profiler->is_dragging) - // { - // profiler->view_ns = profiler->drag_view_ns - ((cursor_px - profiler->drag_cursor_px) * profiler->ns_per_px); - // } - - - - - // FIXME: Recalc cursor after zoom - - - - - // if (is_main_hot) - { - profiler->cursor_ns = (cursor_px * profiler->ns_per_px) + profiler->view_ns; - } - - - - - - - // TODO: Drag in px units for sharper resolution - if (UI_Downs(main_box, Button_M2) || UI_Downs(main_box, Button_M3)) - { - profiler->drag_view_ns = profiler->view_ns; - profiler->drag_cursor_px = cursor_px; - } - - // Drag ruler - // TODO: When measuring stopped, lerp ruler closed - b32 is_measuring = 0; - if (UI_Downs(main_box, Button_M1)) - { - profiler->unsnap = 1; - profiler->ruler_start_ns = profiler->cursor_ns; - } - if (UI_Held(main_box, Button_M1)) - { - profiler->unsnap = 1; - is_measuring = 1; - profiler->target_ruler_opacity = 1; - } - else - { - profiler->target_ruler_opacity = 0; - } - profiler->ruler_opacity = LerpF32(profiler->ruler_opacity, profiler->target_ruler_opacity, prof_lerp_rate); - - // Drag view - if (UI_Held(main_box, Button_M2) || UI_Held(main_box, Button_M3)) - { - profiler->unsnap = 1; - profiler->view_ns = profiler->drag_view_ns - ((cursor_px - profiler->drag_cursor_px) * profiler->ns_per_px); - profiler->target_view_ns = profiler->view_ns; - } - - - - - - - - // FIXME: Remove this - b32 do_break = frame->real_held_buttons[Button_B] && !prev_frame->real_held_buttons[Button_B]; - - - - - - - - // FIXME: Remove this - f64 view_range_len_px = DimsFromRng2(UI_Rect(main_box)).x; - f64 view_range_len_ns = view_range_len_px * profiler->ns_per_px; - - f64 view_start_ns = profiler->view_ns; - f64 view_end_ns = view_start_ns + view_range_len_ns; - - f64 view_start_px = view_start_ns / profiler->ns_per_px; - f64 view_end_px = view_end_ns / profiler->ns_per_px; - - - - - - - - - - - - - - - - - //- Generate visible zones - - Struct(VisZone) { - VisZone *parent; - VisZone *next; - VisZone *next_bfs; - V_Zone *zone; + V_ProfilerFrame *pf = &V.profiler_frames[V.profiler_frame_seq % V_ProfilerFramesCap]; + V.profiler_frame_seq += 1; + } - u32 depth; - u64 id; - String name; - Vec4 color; - f64 start_px; - f64 end_px; - i64 start_ns; - i64 end_ns; - u64 collapsed_count; - }; - Struct(VisTrack) + //- Build profiler + UI_Key profiler_box = UI_KeyF("profiler"); + UI_PushDF(Tag, profiler_box.v) + UI_PushDF(Parent, profiler_box) { - VisTrack *next; - u64 id; + UI_Key main_box = UI_KeyF("main"); - u32 rows_count; - VisZone *first_zone; - VisZone *last_zone; - }; + // UI_Size profiler_height = UI_Fnt(70, 1); + UI_Size profiler_height = UI_Grow(1, 0); + UI_Size header_height = UI_Fnt(2, 1); + UI_Size footer_height = UI_Fnt(2, 1); + UI_Size window_padding = UI_Fnt(0.60, 1); + UI_Size minor_padding = UI_Fnt(0.15, 1); + // UI_Size graph_height = UI_Grow(0.25, 0); + UI_Size graph_height = UI_Fnt(2, 1); + UI_Size main_height = UI_Grow(1, 0); + UI_Size zone_height = UI_Fnt(1.25, 0); + // UI_Size track_height = UI_Fnt(10, 0); + UI_Size track_height = UI_Grow(1, 0); + // UI_Size track_height = UI_Shrink(0, 0); + f32 zone_text_padding_px = UI_Top(FontSize) * 0.2; - VisTrack *first_vis_track = 0; - VisTrack *last_vis_track = 0; - f32 zone_collapse_threshold_px = 10; - f32 zone_name_hide_threshold_px = UI_Top(FontSize) * 3; - f32 min_zone_width_px = 6; - ProfZoneDF("Generate visible zones") - { - for (V_ZoneTrack *zone_track = V.first_zone_track; zone_track; zone_track = zone_track->next) + // Vec2 old_main_dims = DimsFromRng2(UI_Rect(main_box)); + // old_main_dims.x = MaxF32(old_main_dims.x, 1); + // old_main_dims.y = MaxF32(old_main_dims.y, 1); + + + + // if (profiler->view_start_ns == 0 && profiler->view_end_ns == 0) + // { + // profiler->view_start_ns = NsFromSeconds(0); + // profiler->view_end_ns = NsFromSeconds(10); + // } + + + // f32 old_cursor_offset_px = frame->screen_cursor.x - UI_Rect(main_box).p0.x; + // i64 old_cursor_offset_ns = (old_cursor_offset_px / old_main_dims.x) * (profiler->view_end_ns - profiler->view_start_ns); + // i64 old_cursor_ns = profiler->view_start_ns + old_cursor_offset_ns; + + f32 cursor_px = frame->screen_cursor.x - UI_Rect(main_box).p0.x; + + b32 is_main_hot = UI_HotAbsolute(main_box); + // if (is_main_hot) { - // TODO: Ignore non-visible tracks - // TODO: Ignore non-visible depths + profiler->cursor_ns = (cursor_px * profiler->ns_per_px) + profiler->view_ns; + } - VisTrack *vis_track = PushStruct(frame->arena, VisTrack); - SllQueuePush(first_vis_track, last_vis_track, vis_track); - vis_track->id = zone_track->id; + // Snap view + if (!profiler->unsnap) + { + f64 snap_width_ns = NsFromSeconds(1.0 / 10.0); + profiler->target_view_ns = frame->time_ns - snap_width_ns; + profiler->target_ns_per_px = snap_width_ns / MaxF32(DimsFromRng2(UI_Rect(main_box)).x, 100); + } - VisZone *first_bfs_vis_zone = 0; - VisZone *last_bfs_vis_zone = 0; + f32 prof_zoom_rate = 1.65; + f64 prof_lerp_rate = SaturateF64(frame->dt * 25); - // Push root vis zone node to bfs + { + f64 zooms = UI_Presses(main_box, Button_WheelDown) - UI_Presses(main_box, Button_WheelUp); + if (zooms != 0) { - VisZone *root_bfs = PushStruct(frame->arena, VisZone); - root_bfs->zone = zone_track->root_zone; - root_bfs->start_px = -Inf; - root_bfs->end_px = Inf; - root_bfs->start_ns = I64Min; - root_bfs->end_ns = I64Max; - root_bfs->id = zone_track->root_zone->id; - SllQueuePushN(first_bfs_vis_zone, last_bfs_vis_zone, root_bfs, next_bfs); + profiler->unsnap = 1; + } + 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_factor = 0.01; + profiler->ns_per_px = LerpF64(profiler->ns_per_px, profiler->target_ns_per_px + profiler->last_zoom_delta * overshoot_factor, prof_lerp_rate); + profiler->view_ns = LerpF64(profiler->view_ns, profiler->target_view_ns + profiler->last_view_delta * overshoot_factor, 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); } - for (VisZone *parent_vis = first_bfs_vis_zone; parent_vis; parent_vis = first_bfs_vis_zone) + if (profiler->last_view_delta < 0) { - SllQueuePopN(first_bfs_vis_zone, last_bfs_vis_zone, next_bfs); - V_Zone *parent = parent_vis->zone; + 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); + } + } - // Process child zones + + + + + + + + + + + + + + + + + + // if (profiler->is_dragging && !prev_frame->profiler.is_dragging) + // { + // profiler->drag_view_ns = profiler->view_ns; + // profiler->drag_cursor_px = cursor_px; + // } + + // if (profiler->is_dragging) + // { + // profiler->view_ns = profiler->drag_view_ns - ((cursor_px - profiler->drag_cursor_px) * profiler->ns_per_px); + // } + + + + + // FIXME: Recalc cursor after zoom + + + + + // if (is_main_hot) + { + profiler->cursor_ns = (cursor_px * profiler->ns_per_px) + profiler->view_ns; + } + + + + + + + // TODO: Drag in px units for sharper resolution + if (UI_Downs(main_box, Button_M2) || UI_Downs(main_box, Button_M3)) + { + profiler->drag_view_ns = profiler->view_ns; + profiler->drag_cursor_px = cursor_px; + } + + // Drag ruler + // TODO: When measuring stopped, lerp ruler closed + b32 is_measuring = 0; + if (UI_Downs(main_box, Button_M1)) + { + profiler->unsnap = 1; + profiler->ruler_start_ns = profiler->cursor_ns; + } + if (UI_Held(main_box, Button_M1)) + { + profiler->unsnap = 1; + is_measuring = 1; + profiler->target_ruler_opacity = 1; + } + else + { + profiler->target_ruler_opacity = 0; + } + profiler->ruler_opacity = LerpF32(profiler->ruler_opacity, profiler->target_ruler_opacity, prof_lerp_rate); + + // Drag view + if (UI_Held(main_box, Button_M2) || UI_Held(main_box, Button_M3)) + { + profiler->unsnap = 1; + profiler->view_ns = profiler->drag_view_ns - ((cursor_px - profiler->drag_cursor_px) * profiler->ns_per_px); + profiler->target_view_ns = profiler->view_ns; + } + + + + + + + + + // FIXME: Remove this + b32 do_break = frame->real_held_buttons[Button_B] && !prev_frame->real_held_buttons[Button_B]; + + + + + + + + // FIXME: Remove this + f64 view_range_len_px = DimsFromRng2(UI_Rect(main_box)).x; + f64 view_range_len_ns = view_range_len_px * profiler->ns_per_px; + + f64 view_start_ns = profiler->view_ns; + f64 view_end_ns = view_start_ns + view_range_len_ns; + + f64 view_start_px = view_start_ns / profiler->ns_per_px; + f64 view_end_px = view_end_ns / profiler->ns_per_px; + + + + + + + + + + + + + + + + + //- Generate visible zones + + Struct(VisZone) + { + VisZone *parent; + VisZone *next; + VisZone *next_bfs; + V_Zone *zone; + + u32 depth; + u64 id; + String name; + Vec4 color; + + f64 start_px; + f64 end_px; + + i64 start_ns; + i64 end_ns; + + u64 collapsed_count; + }; + + Struct(VisTrack) + { + VisTrack *next; + u64 id; + + u32 rows_count; + VisZone *first_zone; + VisZone *last_zone; + }; + + VisTrack *first_vis_track = 0; + VisTrack *last_vis_track = 0; + f32 zone_collapse_threshold_px = 10; + f32 zone_name_hide_threshold_px = UI_Top(FontSize) * 3; + f32 min_zone_width_px = 6; + ProfZoneDF("Generate visible zones") + { + for (V_ZoneTrack *zone_track = V.first_zone_track; zone_track; zone_track = zone_track->next) + { + // TODO: Ignore non-visible tracks + // TODO: Ignore non-visible depths + + VisTrack *vis_track = PushStruct(frame->arena, VisTrack); + SllQueuePush(first_vis_track, last_vis_track, vis_track); + vis_track->id = zone_track->id; + + VisZone *first_bfs_vis_zone = 0; + VisZone *last_bfs_vis_zone = 0; + + // Push root vis zone node to bfs { - b32 reached_end_of_view = 0; - VisZone *left_vis = 0; - for (V_ZoneChunk *chunk = parent->first_chunk; chunk && !reached_end_of_view; chunk = chunk->next) + VisZone *root_bfs = PushStruct(frame->arena, VisZone); + root_bfs->zone = zone_track->root_zone; + root_bfs->start_px = -Inf; + root_bfs->end_px = Inf; + root_bfs->start_ns = I64Min; + root_bfs->end_ns = I64Max; + root_bfs->id = zone_track->root_zone->id; + SllQueuePushN(first_bfs_vis_zone, last_bfs_vis_zone, root_bfs, next_bfs); + } + + for (VisZone *parent_vis = first_bfs_vis_zone; parent_vis; parent_vis = first_bfs_vis_zone) + { + SllQueuePopN(first_bfs_vis_zone, last_bfs_vis_zone, next_bfs); + V_Zone *parent = parent_vis->zone; + + // Process child zones { - i64 chunk_start_ns = chunk->zones[0].start_ns; - i64 chunk_end_ns = MinI64(chunk->zones[chunk->count - 1].end_ns, frame->time_ns); - - // i64 should_collapse_chunk = (chunk->end_ns - chunk->start_ns) / - - if (chunk_start_ns <= view_end_ns && chunk_end_ns >= view_start_ns) + b32 reached_end_of_view = 0; + VisZone *left_vis = 0; + for (V_ZoneChunk *chunk = parent->first_chunk; chunk && !reached_end_of_view; chunk = chunk->next) { - // TODO: Binary search to find start within chunk - for (u64 chunk_zone_idx = 0; chunk_zone_idx < chunk->count && !reached_end_of_view; ++chunk_zone_idx) + i64 chunk_start_ns = chunk->zones[0].start_ns; + i64 chunk_end_ns = MinI64(chunk->zones[chunk->count - 1].end_ns, frame->time_ns); + + // i64 should_collapse_chunk = (chunk->end_ns - chunk->start_ns) / + + if (chunk_start_ns <= view_end_ns && chunk_end_ns >= view_start_ns) { - V_Zone *zone = &chunk->zones[chunk_zone_idx]; - if (zone->start_ns > view_end_ns) + // TODO: Binary search to find start within chunk + for (u64 chunk_zone_idx = 0; chunk_zone_idx < chunk->count && !reached_end_of_view; ++chunk_zone_idx) { - reached_end_of_view = 1; - } - else - { - i64 zone_start_ns = zone->start_ns; - i64 zone_end_ns = MinI64(zone->end_ns, frame->time_ns); - 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 = visual_zone_end_ns / profiler->ns_per_px; - + V_Zone *zone = &chunk->zones[chunk_zone_idx]; + if (zone->start_ns > view_end_ns) { - visual_zone_end_px = MaxF64(visual_zone_end_px, visual_zone_start_px + min_zone_width_px); - { - f32 overshoot = MaxF32(visual_zone_end_px - parent_vis->end_px, 0); - visual_zone_start_px -= overshoot; - visual_zone_end_px -= overshoot; - } - visual_zone_start_px = MaxF64(visual_zone_start_px, parent_vis->start_px); - if (left_vis) - { - visual_zone_start_px = MaxF64(visual_zone_start_px, left_vis->end_px); - } - visual_zone_start_px = RoundF32(visual_zone_start_px); - visual_zone_end_px = RoundF32(visual_zone_end_px); + reached_end_of_view = 1; } - - // Push vis zone - if (visual_zone_end_px <= (frame->time_ns / profiler->ns_per_px)) + else { - b32 should_collapse_zone = (visual_zone_end_px - visual_zone_start_px) <= zone_collapse_threshold_px; - String zone_name = zone->name; - u64 zone_id = zone->id; - Vec4 zone_color = zone->color; + i64 zone_start_ns = zone->start_ns; + i64 zone_end_ns = MinI64(zone->end_ns, frame->time_ns); + 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); - // b32 should_collapse_zone = visual_zone_len_px <= zone_collapse_threshold_px; - // b32 should_collapse_zone = 0; + f64 visual_zone_start_px = visual_zone_start_ns / profiler->ns_per_px; + f64 visual_zone_end_px = visual_zone_end_ns / profiler->ns_per_px; - // if (visual_zone_start_ns > view_end_ns) - // { - // reached_end_of_view = 1; - // } - - if (visual_zone_end_ns >= view_start_ns && visual_zone_start_ns <= view_end_ns) { - VisZone *vis_zone = 0; - if ( - should_collapse_zone && - left_vis && - left_vis->collapsed_count > 0 && - ((zone_start_ns - left_vis->end_ns) / profiler->ns_per_px) < zone_collapse_threshold_px - ) + visual_zone_end_px = MaxF64(visual_zone_end_px, visual_zone_start_px + min_zone_width_px); { - vis_zone = left_vis; + f32 overshoot = MaxF32(visual_zone_end_px - parent_vis->end_px, 0); + visual_zone_start_px -= overshoot; + visual_zone_end_px -= overshoot; } - else + visual_zone_start_px = MaxF64(visual_zone_start_px, parent_vis->start_px); + if (left_vis) { - vis_zone = PushStruct(frame->arena, VisZone); - vis_zone->zone = zone; - vis_zone->parent = parent_vis; - vis_zone->start_ns = zone_start_ns; - vis_zone->start_px = visual_zone_start_px; - vis_zone->name = zone_name; - vis_zone->id = zone_id; + visual_zone_start_px = MaxF64(visual_zone_start_px, left_vis->end_px); } + visual_zone_start_px = RoundF64(visual_zone_start_px); + visual_zone_end_px = RoundF64(visual_zone_end_px); + } - SllQueuePush(vis_track->first_zone, vis_track->last_zone, vis_zone); - vis_zone->end_px = visual_zone_end_px; - vis_zone->end_ns = zone_end_ns; - vis_zone->color = zone_color; - vis_zone->depth = zone->depth; - vis_track->rows_count = MaxU32(vis_track->rows_count, vis_zone->depth); + // Push vis zone + if (visual_zone_end_px <= (frame->time_ns / profiler->ns_per_px)) + { + b32 should_collapse_zone = (visual_zone_end_px - visual_zone_start_px) <= zone_collapse_threshold_px; + String zone_name = zone->name; + u64 zone_id = zone->id; + Vec4 zone_color = zone->color; - if (should_collapse_zone) + // b32 should_collapse_zone = visual_zone_len_px <= zone_collapse_threshold_px; + // b32 should_collapse_zone = 0; + + // if (visual_zone_start_ns > view_end_ns) + // { + // reached_end_of_view = 1; + // } + + if (visual_zone_end_ns >= view_start_ns && visual_zone_start_ns <= view_end_ns) { - vis_zone->collapsed_count += zone->total_descendents_count + 1; - } + VisZone *vis_zone = 0; + if ( + should_collapse_zone && + left_vis && + left_vis->collapsed_count > 0 && + ((zone_start_ns - left_vis->end_ns) / profiler->ns_per_px) < zone_collapse_threshold_px + ) + { + vis_zone = left_vis; + } + else + { + vis_zone = PushStruct(frame->arena, VisZone); + vis_zone->zone = zone; + vis_zone->parent = parent_vis; + vis_zone->start_ns = zone_start_ns; + vis_zone->start_px = visual_zone_start_px; + vis_zone->name = zone_name; + vis_zone->id = zone_id; + } - left_vis = vis_zone; + SllQueuePush(vis_track->first_zone, vis_track->last_zone, vis_zone); + vis_zone->end_px = visual_zone_end_px; + vis_zone->end_ns = zone_end_ns; + vis_zone->color = zone_color; + vis_zone->depth = zone->depth; + vis_track->rows_count = MaxU32(vis_track->rows_count, vis_zone->depth); - if (!should_collapse_zone) - { - SllQueuePushN(first_bfs_vis_zone, last_bfs_vis_zone, vis_zone, next_bfs); + if (should_collapse_zone) + { + vis_zone->collapsed_count += zone->total_descendents_count + 1; + } + + left_vis = vis_zone; + + if (!should_collapse_zone) + { + SllQueuePushN(first_bfs_vis_zone, last_bfs_vis_zone, vis_zone, next_bfs); + } } } } @@ -4312,329 +4336,294 @@ void V_TickForever(WaveLaneCtx *lane) } } } - } - // Vec4 profiler_color = theme.col.window_bg; - Vec4 profiler_color = theme.col.window_bg; - f32 profiler_opacity = TweakFloat("Profiler opacity", 1, 0, 1); + // Vec4 profiler_color = theme.col.window_bg; + Vec4 profiler_color = theme.col.window_bg; + f32 profiler_opacity = TweakFloat("Profiler opacity", 1, 0, 1); - Vec4 timeline_cursor_color = theme.col.window_bd; - timeline_cursor_color.a = UI_Hot(main_box) * 0.75; - UI_Size timeline_cursor_width = UI_Fnt(0.15, 1); + // Vec4 timeline_cursor_color = theme.col.window_bd; + Vec4 timeline_cursor_color = VEC4(0.5, 0.5, 0.5, 1); + timeline_cursor_color.a = UI_Hot(main_box) * 0.75; + UI_Size timeline_cursor_width = UI_Fnt(0.15, 1); - UI_Key hovered_zone_box = Zi; - VisZone *hovered_zone = 0; - f64 ruler_len_ns = 0; + UI_Key hovered_zone_box = Zi; + VisZone *hovered_zone = 0; + f64 ruler_len_ns = 0; - Vec4 main_color_sampled = profiler_color; - main_color_sampled.r *= 0.75; - main_color_sampled.g *= 0.75; - main_color_sampled.b *= 0.75; + Vec4 main_color_sampled = profiler_color; + main_color_sampled.r *= 0.75; + main_color_sampled.g *= 0.75; + main_color_sampled.b *= 0.75; - Vec4 main_color_unsampled = main_color_sampled; - main_color_unsampled.r *= 0.85; - main_color_unsampled.g *= 0.85; - main_color_unsampled.b *= 0.85; + Vec4 main_color_unsampled = main_color_sampled; + main_color_unsampled.r *= 0.85; + main_color_unsampled.g *= 0.85; + main_color_unsampled.b *= 0.85; - Vec4 collapsed_line_color = SrgbFromHsv(64, 1, 0.5); - Vec4 collapsed_text_color = SrgbFromHsv(64, 1, 0.75); + Vec4 collapsed_line_color = SrgbFromHsv(64, 1, 0.5); + Vec4 collapsed_text_color = SrgbFromHsv(64, 1, 0.75); - // main_color_sampled.g += 0.05; + // main_color_sampled.g += 0.05; - UI_SetNext(Parent, vis_screen_box); - UI_SetNext(BorderColor, theme.col.window_bd); - UI_SetNext(BorderSize, 2); - UI_SetNext(BackgroundColor, profiler_color); - UI_SetNext(Rounding, UI_Rpx(10 * theme.rounding)); - UI_SetNext(Height, profiler_height); - UI_SetNext(Flags, UI_BoxFlag_CaptureMouse); - UI_SetNext(Opacity, profiler_opacity); - UI_SetNext(Parent, panel->contents_box); - UI_PushDF(Width, UI_Grow(1, 0)) - UI_PushDF(Parent, UI_BuildColumnEx(profiler_box)) - UI_PushDF(Parent, UI_BuildRow()) - { - UI_BuildSpacer(window_padding, Axis_X); - UI_PushDF(Parent, UI_BuildColumn()) + UI_SetNext(Parent, vis_screen_box); + UI_SetNext(BorderColor, theme.col.window_bd); + UI_SetNext(BorderSize, 2); + UI_SetNext(BackgroundColor, profiler_color); + UI_SetNext(Rounding, UI_Rpx(10 * theme.rounding)); + UI_SetNext(Height, profiler_height); + UI_SetNext(Flags, UI_BoxFlag_CaptureMouse); + UI_SetNext(Opacity, profiler_opacity); + UI_SetNext(Parent, panel->contents_box); + UI_PushDF(Width, UI_Grow(1, 0)) + UI_PushDF(Parent, UI_BuildColumnEx(profiler_box)) + UI_PushDF(Parent, UI_BuildRow()) { - //- Header - // UI_PushDF(BackgroundColor, Color_Red) - // UI_SetNext(BorderColor, Color_Red); - // UI_SetNext(BorderSize, 1); - // UI_SetNext(ChildAlignment, UI_Region_Center); - // UI_PushDF(Height, header_height) - // UI_PushDF(Parent, UI_BuildBoxEx(UI_KeyF("profiler header"))) - // { - // UI_PushDF(TextColor, theme.col.hint) - // UI_BuildLabelF("Profiler"); - // } - - UI_BuildSpacer(window_padding, Axis_Y); - - UI_BuildDivider(UI_Px(1, 1), theme.col.divider, Axis_Y); - - //- Graph - // UI_SetNext(BackgroundColor, Color_Cyan); - UI_SetNext(Height, graph_height); - UI_PushDF(Parent, UI_BuildBoxEx(profiler_graph_box)) + UI_BuildSpacer(window_padding, Axis_X); + UI_PushDF(Parent, UI_BuildColumn()) { - } - // UI_BuildDivider(UI_Px(1, 1), theme.col.divider, Axis_Y); + //- Header + // UI_PushDF(BackgroundColor, Color_Red) + // UI_SetNext(BorderColor, Color_Red); + // UI_SetNext(BorderSize, 1); + // UI_SetNext(ChildAlignment, UI_Region_Center); + // UI_PushDF(Height, header_height) + // UI_PushDF(Parent, UI_BuildBoxEx(UI_KeyF("profiler header"))) + // { + // UI_PushDF(TextColor, theme.col.hint) + // UI_BuildLabelF("Profiler"); + // } - UI_BuildDivider(UI_Px(1, 1), theme.col.divider, Axis_Y); + UI_BuildSpacer(window_padding, Axis_Y); - UI_BuildSpacer(window_padding, Axis_Y); + UI_BuildDivider(UI_Px(1, 1), theme.col.divider, Axis_Y); - //- Main area - UI_SetNext(BackgroundColor, main_color_unsampled); - UI_SetNext(Height, main_height); - UI_SetNext(Rounding, UI_Rpx(5 * theme.rounding)); - // UI_SetNext(Flags, UI_BoxFlag_CaptureMouse | UI_BoxFlag_CaptureThroughChildren | UI_BoxFlag_Scissor); - UI_SetNext(Flags, UI_BoxFlag_CaptureMouse | UI_BoxFlag_CaptureThroughChildren); - // UI_SetNext(Flags, UI_BoxFlag_CaptureMouse); - UI_PushDF(Parent, UI_BuildColumnEx(main_box)) - { - //- Active area background - UI_PushDF(Opacity, 0.75) + //- Graph + // UI_SetNext(BackgroundColor, Color_Cyan); + UI_SetNext(Height, graph_height); + UI_PushDF(Parent, UI_BuildBoxEx(profiler_graph_box)) { - f64 aabg_left_ns = MaxF64(0, profiler->view_ns); - f64 aabg_right_ns = MinF64(frame->time_ns, view_end_ns); - - f64 aabg_len_ns = aabg_right_ns - aabg_left_ns; - f64 aabg_len_px = aabg_len_ns / profiler->ns_per_px; - - f64 aabg_cursor_offset_px = (aabg_left_ns - profiler->view_ns) / profiler->ns_per_px; - f32 aabg_offset_px = (aabg_left_ns - profiler->view_ns) / profiler->ns_per_px; - Vec2 aabg_cursor_pos = VEC2(aabg_cursor_offset_px, 0); - Vec2 aabg_pos = VEC2(aabg_offset_px, 0); - UI_Size aabg_width = UI_Px(aabg_len_px, 1); - - Vec4 aabg_color = main_color_sampled; - - // Ruler rect - { - // UI_SetNext(BorderSize, 1); - // UI_SetNext(BorderColor, Color_White); - UI_SetNext(Width, aabg_width); - UI_SetNext(FloatingPos, aabg_pos); - UI_SetNext(BackgroundColor, aabg_color); - UI_SetNext(Flags, UI_BoxFlag_Floating); - UI_BuildBoxEx(UI_KeyF("active area background")); - } } + // UI_BuildDivider(UI_Px(1, 1), theme.col.divider, Axis_Y); - //- Zone tracks - ProfZoneDF("Build zones") + UI_BuildDivider(UI_Px(1, 1), theme.col.divider, Axis_Y); + + UI_BuildSpacer(window_padding, Axis_Y); + + //- Main area + UI_SetNext(BackgroundColor, main_color_unsampled); + UI_SetNext(Height, main_height); + UI_SetNext(Rounding, UI_Rpx(5 * theme.rounding)); + // UI_SetNext(Flags, UI_BoxFlag_CaptureMouse | UI_BoxFlag_CaptureThroughChildren | UI_BoxFlag_Scissor); + UI_SetNext(Flags, UI_BoxFlag_CaptureMouse | UI_BoxFlag_CaptureThroughChildren); + // UI_SetNext(Flags, UI_BoxFlag_CaptureMouse); + UI_PushDF(Parent, UI_BuildColumnEx(main_box)) { - for (VisTrack *vis_track = first_vis_track; vis_track; vis_track = vis_track->next) + //- Active area background + UI_PushDF(Opacity, 0.75) { - UI_SetNext(Height, track_height); - UI_PushDF(Tag, HashF("vis track %F", FmtUint(vis_track->id))) - UI_PushDF(Parent, UI_BuildColumn()) + f64 aabg_left_ns = MaxF64(0, profiler->view_ns); + f64 aabg_right_ns = MinF64(frame->time_ns, view_end_ns); + + f64 aabg_len_ns = aabg_right_ns - aabg_left_ns; + f64 aabg_len_px = aabg_len_ns / profiler->ns_per_px; + + f64 aabg_cursor_offset_px = (aabg_left_ns - profiler->view_ns) / profiler->ns_per_px; + f32 aabg_offset_px = (aabg_left_ns - profiler->view_ns) / profiler->ns_per_px; + Vec2 aabg_cursor_pos = VEC2(aabg_cursor_offset_px, 0); + Vec2 aabg_pos = VEC2(aabg_offset_px, 0); + UI_Size aabg_width = UI_Px(aabg_len_px, 1); + + Vec4 aabg_color = main_color_sampled; + + // Ruler rect { - // UI_BuildSpacer(UI_Px(10, 0), Axis_Y); - // UI_BuildSpacer(UI_Grow(1, 0), Axis_Y); + // UI_SetNext(BorderSize, 1); + // UI_SetNext(BorderColor, Color_White); + UI_SetNext(Width, aabg_width); + UI_SetNext(FloatingPos, aabg_pos); + UI_SetNext(BackgroundColor, aabg_color); + UI_SetNext(Flags, UI_BoxFlag_Floating); + UI_BuildBoxEx(UI_KeyF("active area background")); + } + } - //- Zone rows - UI_Key *zone_row_boxes = PushStructs(frame->arena, UI_Key, vis_track->rows_count); - for (u64 zone_row_box_idx = 0; zone_row_box_idx < vis_track->rows_count; ++zone_row_box_idx) + //- Zone tracks + ProfZoneDF("Build zones") + { + for (VisTrack *vis_track = first_vis_track; vis_track; vis_track = vis_track->next) + { + UI_SetNext(Height, track_height); + UI_PushDF(Tag, HashF("vis track %F", FmtUint(vis_track->id))) + UI_PushDF(Parent, UI_BuildColumn()) { - UI_Key zone_row_box = UI_KeyF("zone row %F", FmtUint(zone_row_box_idx)); - zone_row_boxes[zone_row_box_idx] = zone_row_box; - // UI_SetNext(Height, zone_height); - UI_SetNext(Height, zone_height); - UI_PushDF(Parent, UI_BuildRowEx(zone_row_box)) + // UI_BuildSpacer(UI_Px(10, 0), Axis_Y); + // UI_BuildSpacer(UI_Grow(1, 0), Axis_Y); + + //- Zone rows + UI_Key *zone_row_boxes = PushStructs(frame->arena, UI_Key, vis_track->rows_count); + for (u64 zone_row_box_idx = 0; zone_row_box_idx < vis_track->rows_count; ++zone_row_box_idx) { - } - } - - //- Zones - for (VisZone *zone = vis_track->first_zone; zone; zone = zone->next) - { - UI_Key zone_row_box = zone_row_boxes[zone->depth - 1]; - b32 can_hover = profiler->unsnap; - - UI_Key zone_box = UI_KeyF("Zone %F", FmtUint(zone->id)); - b32 is_hovered = can_hover && UI_HoveredAbsolute(zone_box) && UI_HotAbsolute(main_box); - if (is_hovered) - { - hovered_zone_box = zone_box; - hovered_zone = zone; - } - f32 zone_hovered = can_hover * UI_Hovered(zone_box) * UI_Hot(main_box); - - f64 zone_offset_px = zone->start_px - view_start_px; - f64 zone_len_px = zone->end_px - zone->start_px; - - Vec2 zone_pos = VEC2(zone_offset_px, 0); - UI_Size zone_width = UI_Px(zone_len_px, 1); - - Vec4 zone_color = zone->color; - Vec4 zone_color_bd = zone_color; - - zone_color_bd = MulVec4(zone_color_bd, 0.65); - zone_color_bd.a = 1; - - Vec4 zone_text_color = UI_Top(TextColor); - zone_text_color.a *= 0.75; - - Vec4 zone_line_color = Zi; - - // b32 is_collapsed = zone->is_collapsed; - b32 is_collapsed = zone->collapsed_count > 0; - // b32 is_collapsed = zone->collapsed_count > 0 || zone_len_px <= min_zone_width_px; - - // UI_Size collapsed_line_size = UI_Px(2, 1); - UI_Size collapsed_line_size = UI_Px(1.5, 1); - // Vec4 collapsed_text_color = theme.col.positive; - // Vec4 collapsed_line_color = theme.col.negative; - // Vec4 collapsed_line_color = SrgbFromHsv(TweakFloat("RAAAAAAAAAH H", 100, 0, 360), TweakFloat("RAAAAAAAAAH S", 0.50, 0, 1), TweakFloat("RAAAAAAAAAH V", 1.00, 0, 1)); - // Vec4 collapsed_line_color = Color_Black; - // Vec4 collapsed_line_color = theme.col.hint; - // Vec4 collapsed_text_color = theme.col.positive; - // Vec4 collapsed_text_color = SrgbFromHsv(TweakFloat("RAAAAAAAAAH H", 100, 0, 360), TweakFloat("RAAAAAAAAAH S", 0.50, 0, 1), TweakFloat("RAAAAAAAAAH V", 1.00, 0, 1)); - - // Vec4 collapsed_line_color = SrgbFromHsv(32, 1, 0.5); - // Vec4 collapsed_text_color = SrgbFromHsv(32, 1, 1); - - // Vec4 collapsed_line_color = SrgbFromHsv(64, 1, 0.5); - // Vec4 collapsed_text_color = SrgbFromHsv(64, 1, 0.75); - - // collapsed_text_color = LerpSrgb(collapsed_text_color, Color_White, zone_hovered); - // collapsed_line_color = LerpSrgb(collapsed_line_color, Color_White, zone_hovered); - - - - - - String zone_text = zone->name; - if (is_collapsed) - { - zone_text = StringF(frame->arena, "%F", FmtUint(zone->collapsed_count)); - zone_text_color = collapsed_text_color; - zone_line_color = collapsed_line_color; - - // 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.25, 0.25, 0.25, 0.5); - - - // if (zone->collapsed_count > 1) - // { - // zone_color = VEC4(0.25, 0.25, 0.25, 0.5); - // } - // else - // { - // zone_color = Color_White; - // } - - - - // zone_color = VEC4(0.4, 0.4, 0.4, 0.5); - zone_color_bd = VEC4(0, 0, 0, 0); - - // zone_color = LerpSrgb(zone_color, Color_Transparent, zone_hovered); - + UI_Key zone_row_box = UI_KeyF("zone row %F", FmtUint(zone_row_box_idx)); + zone_row_boxes[zone_row_box_idx] = zone_row_box; + // UI_SetNext(Height, zone_height); + UI_SetNext(Height, zone_height); + UI_PushDF(Parent, UI_BuildRowEx(zone_row_box)) + { + } } - if (zone_len_px < zone_name_hide_threshold_px) + //- Zones + for (VisZone *zone = vis_track->first_zone; zone; zone = zone->next) { - zone_text.len = 0; - } + UI_Key zone_row_box = zone_row_boxes[zone->depth - 1]; + b32 can_hover = profiler->unsnap; - zone_color_bd = LerpSrgb(zone_color_bd, Color_White, zone_hovered * !is_collapsed); - zone_text_color = LerpSrgb(zone_text_color, Color_White, zone_hovered); - zone_line_color = LerpSrgb(zone_line_color, Color_White, zone_hovered); + UI_Key zone_box = UI_KeyF("Zone %F", FmtUint(zone->id)); + b32 is_hovered = can_hover && UI_HoveredAbsolute(zone_box) && UI_HotAbsolute(main_box); + if (is_hovered) + { + hovered_zone_box = zone_box; + hovered_zone = zone; + } + f32 zone_hovered = can_hover * UI_Hovered(zone_box) * UI_Hot(main_box); + + f64 zone_offset_px = zone->start_px - view_start_px; + f64 zone_len_px = zone->end_px - zone->start_px; + + Vec2 zone_pos = VEC2(zone_offset_px, 0); + UI_Size zone_width = UI_Px(zone_len_px, 1); + + Vec4 zone_color = zone->color; + Vec4 zone_color_bd = zone_color; + + zone_color_bd = MulVec4(zone_color_bd, 0.65); + zone_color_bd.a = 1; + + Vec4 zone_text_color = UI_Top(TextColor); + zone_text_color.a *= 0.75; + + Vec4 zone_line_color = Zi; + + // b32 is_collapsed = zone->is_collapsed; + b32 is_collapsed = zone->collapsed_count > 0; + // b32 is_collapsed = zone->collapsed_count > 0 || zone_len_px <= min_zone_width_px; + + // UI_Size collapsed_line_size = UI_Px(2, 1); + UI_Size collapsed_line_size = UI_Px(1.5, 1); + // Vec4 collapsed_text_color = theme.col.positive; + // Vec4 collapsed_line_color = theme.col.negative; + // Vec4 collapsed_line_color = SrgbFromHsv(TweakFloat("RAAAAAAAAAH H", 100, 0, 360), TweakFloat("RAAAAAAAAAH S", 0.50, 0, 1), TweakFloat("RAAAAAAAAAH V", 1.00, 0, 1)); + // Vec4 collapsed_line_color = Color_Black; + // Vec4 collapsed_line_color = theme.col.hint; + // Vec4 collapsed_text_color = theme.col.positive; + // Vec4 collapsed_text_color = SrgbFromHsv(TweakFloat("RAAAAAAAAAH H", 100, 0, 360), TweakFloat("RAAAAAAAAAH S", 0.50, 0, 1), TweakFloat("RAAAAAAAAAH V", 1.00, 0, 1)); + + // Vec4 collapsed_line_color = SrgbFromHsv(32, 1, 0.5); + // Vec4 collapsed_text_color = SrgbFromHsv(32, 1, 1); + + // Vec4 collapsed_line_color = SrgbFromHsv(64, 1, 0.5); + // Vec4 collapsed_text_color = SrgbFromHsv(64, 1, 0.75); + + // collapsed_text_color = LerpSrgb(collapsed_text_color, Color_White, zone_hovered); + // collapsed_line_color = LerpSrgb(collapsed_line_color, Color_White, zone_hovered); - f32 collapsed_zones_per_px = zone->collapsed_count / zone_len_px; - // f32 zag_intensity = 50 / collapsed_zones_per_px; - // zag_intensity = MaxF32(zag_intensity, 5); - // f32 top_zag_information_density = 10; - f32 top_zag_information_density = zone_collapse_threshold_px; - // f32 zag_intensity = SmoothstepF32(0, top_zag_information_density, collapsed_zones_per_px); - // f32 zag_intensity = 1; - f32 zag_intensity = 0.3; - // f32 zag_intensity = TweakFloat("RAAAAAAAAAAAAAH", 1, 0, 1); - f32 period_max = 20; - f32 period_min = 5; - f32 zag_period = LerpF32(period_max, period_min, zag_intensity); - f32 amplitude_max = UI_Top(FontSize) * 0.15; - f32 amplitude_min = UI_Top(FontSize) * 0.05; - f32 zag_amplitude = LerpF32(amplitude_max, amplitude_min, zag_intensity); - - UI_SetNext(Width, zone_width); - UI_SetNext(Height, UI_Grow(1, 0)); - UI_SetNext(BackgroundColor, zone_color); - UI_SetNext(BorderColor, zone_color_bd); - UI_SetNext(BorderSize, 1); - UI_SetNext(FloatingPos, zone_pos); - UI_SetNext(ChildAlignment, UI_Region_Center); - UI_SetNext( - Flags, - UI_BoxFlag_Floating | - UI_BoxFlag_DontClampFloatingX | - UI_BoxFlag_DontClampFloatingY | - UI_BoxFlag_CaptureMouse | - UI_BoxFlag_Scissor - ); - UI_SetNext(Parent, zone_row_box); - // UI_PushDF(OrFlags, UI_Top(OrFlags) | (UI_BoxFlag_DontTruncateText * !!(is_collapsed))) - // UI_PushDF(OmitFlags, UI_Top(OmitFlags) | (UI_BoxFlag_Scissor * !!(is_collapsed))) - // UI_PushDF(ZagPeriod, UI_Top(FontSize) * 1) - // UI_PushDF(ZagPeriod, (collapsed_zones_per_px * UI_Top(FontSize)) * 0.1) - // UI_PushDF(ZagPeriod, collapsed_zones_per_px / (UI_Top(FontSize) * 1)) - UI_PushDF(ZagPeriod, zag_period) - UI_PushDF(ZagThickness, 1.5) - UI_PushDF(ZagRoundness, 1) - UI_PushDF(ZagAmplitude, zag_amplitude) - UI_PushDF(Parent, UI_BuildRowEx(zone_box)) - { + String zone_text = zone->name; if (is_collapsed) { - // Left zag - UI_SetNext(Width, UI_Grow(1, 0)); - UI_SetNext(ZagColor, zone_line_color); - UI_BuildBox(); - } - else - { - UI_SetNext(Width, UI_Px(3, 1)); - UI_BuildBox(); + zone_text = StringF(frame->arena, "%F", FmtUint(zone->collapsed_count)); + zone_text_color = collapsed_text_color; + zone_line_color = collapsed_line_color; + + // 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.25, 0.25, 0.25, 0.5); + + + // if (zone->collapsed_count > 1) + // { + // zone_color = VEC4(0.25, 0.25, 0.25, 0.5); + // } + // else + // { + // zone_color = Color_White; + // } + + + + // zone_color = VEC4(0.4, 0.4, 0.4, 0.5); + zone_color_bd = VEC4(0, 0, 0, 0); + + // zone_color = LerpSrgb(zone_color, Color_Transparent, zone_hovered); + } - if (zone_text.len > 0) + if (zone_len_px < zone_name_hide_threshold_px) { - // Zone name - // if (zone_len_px > zone_collapse_threshold_px * 3) - { - if (is_collapsed) - { - UI_SetNext(Width, UI_Shrink(0, 1)); - UI_SetNext(ChildAlignment, UI_Region_Center); - } - else - { - UI_SetNext(ChildAlignment, UI_Region_Left); - UI_SetNext(Width, UI_Grow(1, 0)); - } - UI_SetNext(FontSize, UI_Top(FontSize) * theme.h5); - UI_SetNext(TextColor, zone_text_color); - UI_SetNext(Text, zone_text); - UI_SetNext(Flags, UI_BoxFlag_DrawText | UI_BoxFlag_DontTruncateText); - UI_BuildRow(); - } + zone_text.len = 0; + } - // Right collapsed lines + zone_color_bd = LerpSrgb(zone_color_bd, Color_White, zone_hovered * !is_collapsed); + zone_text_color = LerpSrgb(zone_text_color, Color_White, zone_hovered); + zone_line_color = LerpSrgb(zone_line_color, Color_White, zone_hovered); + + + f32 collapsed_zones_per_px = zone->collapsed_count / zone_len_px; + // f32 zag_intensity = 50 / collapsed_zones_per_px; + // zag_intensity = MaxF32(zag_intensity, 5); + + // f32 top_zag_information_density = 10; + f32 top_zag_information_density = zone_collapse_threshold_px; + // f32 zag_intensity = SmoothstepF32(0, top_zag_information_density, collapsed_zones_per_px); + // f32 zag_intensity = 1; + f32 zag_intensity = 0.3; + // f32 zag_intensity = TweakFloat("RAAAAAAAAAAAAAH", 1, 0, 1); + + f32 period_max = 20; + f32 period_min = 5; + f32 zag_period = LerpF32(period_max, period_min, zag_intensity); + + f32 amplitude_max = UI_Top(FontSize) * 0.15; + f32 amplitude_min = UI_Top(FontSize) * 0.05; + f32 zag_amplitude = LerpF32(amplitude_max, amplitude_min, zag_intensity); + + UI_SetNext(Width, zone_width); + UI_SetNext(Height, UI_Grow(1, 0)); + UI_SetNext(BackgroundColor, zone_color); + UI_SetNext(BorderColor, zone_color_bd); + UI_SetNext(BorderSize, 1); + UI_SetNext(FloatingPos, zone_pos); + UI_SetNext(ChildAlignment, UI_Region_Center); + UI_SetNext( + Flags, + UI_BoxFlag_Floating | + UI_BoxFlag_DontClampFloatingX | + UI_BoxFlag_DontClampFloatingY | + UI_BoxFlag_CaptureMouse | + UI_BoxFlag_Scissor + ); + UI_SetNext(Parent, zone_row_box); + // UI_PushDF(OrFlags, UI_Top(OrFlags) | (UI_BoxFlag_DontTruncateText * !!(is_collapsed))) + // UI_PushDF(OmitFlags, UI_Top(OmitFlags) | (UI_BoxFlag_Scissor * !!(is_collapsed))) + // UI_PushDF(ZagPeriod, UI_Top(FontSize) * 1) + // UI_PushDF(ZagPeriod, (collapsed_zones_per_px * UI_Top(FontSize)) * 0.1) + // UI_PushDF(ZagPeriod, collapsed_zones_per_px / (UI_Top(FontSize) * 1)) + UI_PushDF(ZagPeriod, zag_period) + UI_PushDF(ZagThickness, 1.5) + UI_PushDF(ZagRoundness, 1) + UI_PushDF(ZagAmplitude, zag_amplitude) + UI_PushDF(Parent, UI_BuildRowEx(zone_box)) + { if (is_collapsed) { + // Left zag UI_SetNext(Width, UI_Grow(1, 0)); UI_SetNext(ZagColor, zone_line_color); UI_BuildBox(); @@ -4644,216 +4633,253 @@ void V_TickForever(WaveLaneCtx *lane) UI_SetNext(Width, UI_Px(3, 1)); UI_BuildBox(); } - } - } - } - } - } - } - - - - - //- Ruler - UI_PushDF(Opacity, profiler->ruler_opacity) - { - { - f64 ruler_left_ns = MinF64(profiler->ruler_start_ns, profiler->cursor_ns); - f64 ruler_right_ns = MaxF64(profiler->ruler_start_ns, profiler->cursor_ns); - ruler_left_ns = ClampF64(ruler_left_ns, view_start_ns, view_end_ns); - ruler_right_ns = ClampF64(ruler_right_ns, view_start_ns, view_end_ns); - - ruler_len_ns = ruler_right_ns - ruler_left_ns; - f64 ruler_len_px = ruler_len_ns / profiler->ns_per_px; - - f64 ruler_cursor_offset_px = (profiler->ruler_start_ns - profiler->view_ns) / profiler->ns_per_px; - f32 ruler_offset_px = (ruler_left_ns - profiler->view_ns) / profiler->ns_per_px; - Vec2 ruler_cursor_pos = VEC2(ruler_cursor_offset_px, 0); - Vec2 ruler_pos = VEC2(ruler_offset_px, 0); - UI_Size ruler_width = UI_Px(ruler_len_px, 1); - - // Vec4 ruler_color = VEC4(0.25, 0.25, 0.25, 0.25); - Vec4 ruler_color = VEC4(0.20, 0.20, 0.20, 0.25); - - // Ruler rect - { - // UI_SetNext(BorderSize, 1); - // UI_SetNext(BorderColor, Color_White); - // UI_PushDF(Opacity, profiler->ruler_opacity) - UI_SetNext(Width, ruler_width); - UI_SetNext(FloatingPos, ruler_pos); - UI_SetNext(BackgroundColor, ruler_color); - UI_SetNext(Flags, UI_BoxFlag_Floating); - UI_BuildBoxEx(UI_KeyF("ruler")); - } - - // Ruler cursor - { - // UI_SetNext(BorderSize, 1); - // UI_SetNext(BorderColor, Color_White); - UI_SetNext(BackgroundColor, timeline_cursor_color); - UI_SetNext(Width, timeline_cursor_width); - UI_SetNext(FloatingPos, ruler_cursor_pos); - UI_SetNext(Anchor, UI_Region_Top); - UI_SetNext(Flags, UI_BoxFlag_Floating); - UI_BuildBoxEx(UI_KeyF("ruler cursor")); - } - } - } - - //- Timeline cursor - { - // Vec2 timeline_cursor_pos = VEC2(old_cursor_offset_px, 0); - Vec2 timeline_cursor_pos = VEC2((profiler->cursor_ns - profiler->view_ns) / profiler->ns_per_px, 0); - - UI_SetNext(Width, timeline_cursor_width); - UI_SetNext(Height, UI_Grow(1, 0)); - UI_SetNext(BackgroundColor, timeline_cursor_color); - UI_SetNext(FloatingPos, timeline_cursor_pos); - UI_SetNext(Flags, UI_BoxFlag_Floating); - UI_BuildBox(); - } - - //- Timeline tooltop - { - b32 show_ruler_time = is_measuring && ruler_len_ns != 0; - b32 show_hovered_zone = hovered_zone != 0; - if (show_ruler_time || show_hovered_zone) - { - UI_Key tooltip_box = UI_KeyF("tooltip"); - Vec2 tooltip_pos = SubVec2(frame->screen_cursor, UI_Anchor(main_box)); - tooltip_pos = AddVec2(tooltip_pos, theme.tooltip_offset_px); - f32 tooltip_opacity = 0.95; - - UI_SetNext(Opacity, tooltip_opacity); - UI_SetNext(BackgroundColor, theme.col.window_bg); - UI_SetNext(BorderColor, theme.col.window_bd); - UI_SetNext(Rounding, UI_Rpx(theme.rounding * 5)); - UI_SetNext(BorderSize, 1); - UI_SetNext(Anchor, UI_Region_TopLeft); - UI_SetNext(FloatingPos, tooltip_pos); - UI_SetNext(Flags, UI_BoxFlag_Floating); - UI_PushDF(Width, UI_Shrink(0, 1)) - UI_PushDF(Height, UI_Shrink(0, 1)) - UI_PushDF(Parent, UI_BuildRowEx(tooltip_box)) - { - UI_BuildSpacer(window_padding, Axis_X); - - UI_SetNext(Width, UI_Shrink(0, 1)); - UI_SetNext(Height, UI_Shrink(0, 1)); - UI_PushDF(Parent, UI_BuildColumn()) - { - UI_BuildSpacer(window_padding, Axis_Y); - - if (show_ruler_time) - { - // UI_SetNext(TextColor, theme.col.positive); - // UI_SetNext(TextColor, theme.col.button_active); - - UI_SetNext(TextColor, theme.col.button_selected); - UI_BuildLabelF("%F", FmtTimeNs(ruler_len_ns, .p = 2)); - - // UI_SetNext(TextColor, theme.col.button_selected); - // UI_BuildLabelF("Ruler"); - - if (show_hovered_zone) - { - UI_BuildSpacer(minor_padding, Axis_Y); - UI_BuildSpacer(minor_padding, Axis_Y); - UI_BuildDivider(UI_Px(1, 0), theme.col.divider, Axis_Y); - UI_BuildSpacer(minor_padding, Axis_Y); - } - } - - if (show_hovered_zone) - { - VisZone *zone = hovered_zone; - UI_PushDF(Parent, UI_BuildRow()) - { - i64 elapsed_ns = zone->end_ns - zone->start_ns; - UI_PushDF(Parent, UI_BuildColumn()) + if (zone_text.len > 0) { - UI_BuildLabelF("%F ", FmtTimeNs(elapsed_ns, .p = 2)); - - if (zone->collapsed_count > 0) + // Zone name + // if (zone_len_px > zone_collapse_threshold_px * 3) { - UI_PushDF(Parent, UI_BuildRow()) + if (is_collapsed) { - if (zone->collapsed_count == 1) - { - // // UI_BuildLabelF(" (%F)", FmtUint(zone->collapsed_count)); - // UI_SetNext(TextColor, theme.col.hint); - // UI_BuildLabelF("%F", FmtString(zone->name)); - - // UI_SetNext(TextColor, collapsed_text_color); - // UI_BuildLabelF(" (Too small to display)"); - - UI_SetNext(TextColor, collapsed_text_color); - UI_BuildLabelF("1 zone too small to display: "); - UI_SetNext(TextColor, theme.col.hint); - UI_BuildLabelF("%F", FmtString(zone->name)); - } - else - { - // UI_SetNext(TextColor, theme.col.hint); - // UI_BuildLabelF("Zones too small to display"); - - // UI_SetNext(TextColor, collapsed_text_color); - // UI_BuildLabelF(" (%F)", FmtUint(zone->collapsed_count)); - - - // UI_SetNext(TextColor, theme.col.hint); - UI_SetNext(TextColor, collapsed_text_color); - UI_BuildLabelF("%F zones too small to display", FmtUint(zone->collapsed_count)); - } + UI_SetNext(Width, UI_Shrink(0, 1)); + UI_SetNext(ChildAlignment, UI_Region_Center); } + else + { + UI_SetNext(ChildAlignment, UI_Region_Left); + UI_SetNext(Width, UI_Grow(1, 0)); + } + UI_SetNext(FontSize, UI_Top(FontSize) * theme.h5); + UI_SetNext(TextColor, zone_text_color); + UI_SetNext(Text, zone_text); + UI_SetNext(Flags, UI_BoxFlag_DrawText | UI_BoxFlag_DontTruncateText); + UI_BuildRow(); + } + + // Right collapsed lines + if (is_collapsed) + { + UI_SetNext(Width, UI_Grow(1, 0)); + UI_SetNext(ZagColor, zone_line_color); + UI_BuildBox(); } else { - UI_SetNext(TextColor, theme.col.hint); - UI_BuildLabelF("%F", FmtString(zone->name)); + UI_SetNext(Width, UI_Px(3, 1)); + UI_BuildBox(); } } } } - - UI_BuildSpacer(window_padding, Axis_Y); } - UI_BuildSpacer(window_padding, Axis_X); + } + } + + + + + + //- Ruler + UI_PushDF(Opacity, profiler->ruler_opacity) + { + { + f64 ruler_left_ns = MinF64(profiler->ruler_start_ns, profiler->cursor_ns); + f64 ruler_right_ns = MaxF64(profiler->ruler_start_ns, profiler->cursor_ns); + ruler_left_ns = ClampF64(ruler_left_ns, view_start_ns, view_end_ns); + ruler_right_ns = ClampF64(ruler_right_ns, view_start_ns, view_end_ns); + + ruler_len_ns = ruler_right_ns - ruler_left_ns; + f64 ruler_len_px = ruler_len_ns / profiler->ns_per_px; + + f64 ruler_cursor_offset_px = (profiler->ruler_start_ns - profiler->view_ns) / profiler->ns_per_px; + f32 ruler_offset_px = (ruler_left_ns - profiler->view_ns) / profiler->ns_per_px; + Vec2 ruler_cursor_pos = VEC2(ruler_cursor_offset_px, 0); + Vec2 ruler_pos = VEC2(ruler_offset_px, 0); + UI_Size ruler_width = UI_Px(ruler_len_px, 1); + + // Vec4 ruler_color = VEC4(0.25, 0.25, 0.25, 0.25); + Vec4 ruler_color = VEC4(0.20, 0.20, 0.20, 0.25); + + // Ruler rect + { + // UI_SetNext(BorderSize, 1); + // UI_SetNext(BorderColor, Color_White); + // UI_PushDF(Opacity, profiler->ruler_opacity) + UI_SetNext(Width, ruler_width); + UI_SetNext(FloatingPos, ruler_pos); + UI_SetNext(BackgroundColor, ruler_color); + UI_SetNext(Flags, UI_BoxFlag_Floating); + UI_BuildBoxEx(UI_KeyF("ruler")); + } + + // Ruler cursor + { + // UI_SetNext(BorderSize, 1); + // UI_SetNext(BorderColor, Color_White); + // UI_SetNext(BackgroundColor, timeline_cursor_color); + UI_SetNext(BackgroundColor, ruler_color); + UI_SetNext(Width, timeline_cursor_width); + UI_SetNext(FloatingPos, ruler_cursor_pos); + UI_SetNext(Anchor, UI_Region_Top); + UI_SetNext(Flags, UI_BoxFlag_Floating); + UI_BuildBoxEx(UI_KeyF("ruler cursor")); + } + } + } + + //- Timeline cursor + { + // Vec2 timeline_cursor_pos = VEC2(old_cursor_offset_px, 0); + Vec2 timeline_cursor_pos = VEC2((profiler->cursor_ns - profiler->view_ns) / profiler->ns_per_px, 0); + + UI_SetNext(Width, timeline_cursor_width); + UI_SetNext(Height, UI_Grow(1, 0)); + UI_SetNext(BackgroundColor, timeline_cursor_color); + UI_SetNext(FloatingPos, timeline_cursor_pos); + UI_SetNext(Flags, UI_BoxFlag_Floating); + UI_BuildBox(); + } + + //- Timeline tooltop + { + b32 show_ruler_time = is_measuring && ruler_len_ns != 0; + b32 show_hovered_zone = hovered_zone != 0; + if (show_ruler_time || show_hovered_zone) + { + UI_Key tooltip_box = UI_KeyF("tooltip"); + Vec2 tooltip_pos = SubVec2(frame->screen_cursor, UI_Anchor(main_box)); + tooltip_pos = AddVec2(tooltip_pos, theme.tooltip_offset_px); + f32 tooltip_opacity = 0.95; + + UI_SetNext(Opacity, tooltip_opacity); + UI_SetNext(BackgroundColor, theme.col.window_bg); + UI_SetNext(BorderColor, theme.col.window_bd); + UI_SetNext(Rounding, UI_Rpx(theme.rounding * 5)); + UI_SetNext(BorderSize, 1); + UI_SetNext(Anchor, UI_Region_TopLeft); + UI_SetNext(FloatingPos, tooltip_pos); + UI_SetNext(Flags, UI_BoxFlag_Floating); + UI_PushDF(Width, UI_Shrink(0, 1)) + UI_PushDF(Height, UI_Shrink(0, 1)) + UI_PushDF(Parent, UI_BuildRowEx(tooltip_box)) + { + UI_BuildSpacer(window_padding, Axis_X); + + UI_SetNext(Width, UI_Shrink(0, 1)); + UI_SetNext(Height, UI_Shrink(0, 1)); + UI_PushDF(Parent, UI_BuildColumn()) + { + UI_BuildSpacer(window_padding, Axis_Y); + + if (show_ruler_time) + { + // UI_SetNext(TextColor, theme.col.positive); + // UI_SetNext(TextColor, theme.col.button_active); + + UI_SetNext(TextColor, theme.col.button_selected); + UI_BuildLabelF("%F", FmtTimeNs(ruler_len_ns, .p = 2)); + + // UI_SetNext(TextColor, theme.col.button_selected); + // UI_BuildLabelF("Ruler"); + + if (show_hovered_zone) + { + UI_BuildSpacer(minor_padding, Axis_Y); + UI_BuildSpacer(minor_padding, Axis_Y); + UI_BuildDivider(UI_Px(1, 0), theme.col.divider, Axis_Y); + UI_BuildSpacer(minor_padding, Axis_Y); + } + } + + if (show_hovered_zone) + { + VisZone *zone = hovered_zone; + UI_PushDF(Parent, UI_BuildRow()) + { + i64 elapsed_ns = zone->end_ns - zone->start_ns; + UI_PushDF(Parent, UI_BuildColumn()) + { + UI_BuildLabelF("%F ", FmtTimeNs(elapsed_ns, .p = 2)); + + if (zone->collapsed_count > 0) + { + UI_PushDF(Parent, UI_BuildRow()) + { + if (zone->collapsed_count == 1) + { + // // UI_BuildLabelF(" (%F)", FmtUint(zone->collapsed_count)); + // UI_SetNext(TextColor, theme.col.hint); + // UI_BuildLabelF("%F", FmtString(zone->name)); + + // UI_SetNext(TextColor, collapsed_text_color); + // UI_BuildLabelF(" (Too small to display)"); + + UI_SetNext(TextColor, collapsed_text_color); + UI_BuildLabelF("1 zone too small to display: "); + UI_SetNext(TextColor, theme.col.hint); + UI_BuildLabelF("%F", FmtString(zone->name)); + } + else + { + // UI_SetNext(TextColor, theme.col.hint); + // UI_BuildLabelF("Zones too small to display"); + + // UI_SetNext(TextColor, collapsed_text_color); + // UI_BuildLabelF(" (%F)", FmtUint(zone->collapsed_count)); + + + // UI_SetNext(TextColor, theme.col.hint); + UI_SetNext(TextColor, collapsed_text_color); + UI_BuildLabelF("%F zones too small to display", FmtUint(zone->collapsed_count)); + } + } + } + else + { + UI_SetNext(TextColor, theme.col.hint); + UI_BuildLabelF("%F", FmtString(zone->name)); + } + } + } + } + + UI_BuildSpacer(window_padding, Axis_Y); + } + UI_BuildSpacer(window_padding, Axis_X); + } } } } - } - // UI_BuildSpacer(window_padding, Axis_Y); + // UI_BuildSpacer(window_padding, Axis_Y); - //- Footer - UI_PushDF(Height, footer_height) - UI_PushDF(ChildAlignment, UI_Region_Center) - UI_PushDF(Parent, UI_BuildRow()) - { - if (IsUnoptimized) + //- Footer + UI_PushDF(Height, footer_height) + UI_PushDF(ChildAlignment, UI_Region_Center) + UI_PushDF(Parent, UI_BuildRow()) { - UI_PushDF(Width, UI_Shrink(0, 1)) - UI_PushDF(Height, UI_Shrink(0, 1)) - UI_PushDF(ChildAlignment, UI_Region_Left) - UI_PushDF(TextColor, theme.col.warn) - UI_PushDF(Parent, UI_BuildRow()) + if (IsUnoptimized) { - UI_BuildIcon(theme.icon_font, UI_Icon_Warning); - // UI_BuildIcon(theme.icon_font, UI_Icon_Info); - UI_BuildLabelF(" Profiling an unoptimized build"); + UI_PushDF(Width, UI_Shrink(0, 1)) + UI_PushDF(Height, UI_Shrink(0, 1)) + UI_PushDF(ChildAlignment, UI_Region_Left) + UI_PushDF(TextColor, theme.col.warn) + UI_PushDF(Parent, UI_BuildRow()) + { + UI_BuildIcon(theme.icon_font, UI_Icon_Warning); + // UI_BuildIcon(theme.icon_font, UI_Icon_Info); + UI_BuildLabelF(" Profiling an unoptimized build"); + } } - } - // Right side text - UI_BuildSpacer(UI_Grow(1, 0), Axis_X); - UI_SetNext(Opacity, UI_Hot(main_box)); - UI_BuildLabelF("%Fs", FmtFloat(SecondsFromNs(profiler->cursor_ns), .p = 3)); + // Right side text + UI_BuildSpacer(UI_Grow(1, 0), Axis_X); + UI_SetNext(Opacity, UI_Hot(main_box)); + UI_BuildLabelF("%Fs", FmtFloat(SecondsFromNs(profiler->cursor_ns), .p = 3)); + } } + UI_BuildSpacer(window_padding, Axis_X); } - UI_BuildSpacer(window_padding, Axis_X); } } } @@ -4948,7 +4974,7 @@ void V_TickForever(WaveLaneCtx *lane) panel->contents_box = UI_KeyF("panel contents box %F", FmtUint(panel->box.v)); panel->resizer_box = UI_KeyF("panel resizer box %F", FmtUint(panel->box.v)); panel->flags |= V_PanelFlag_Console; - panel->pct = 0.5; + panel->pct = 0.75; } //- Vis screen panel @@ -4974,7 +5000,7 @@ void V_TickForever(WaveLaneCtx *lane) DllQueuePush(parent->first, parent->last, panel); panel->box = UI_KeyF("test raah profiler panel"); panel->contents_box = UI_KeyF("panel contents box %F", FmtUint(panel->box.v)); - panel->resizer_box = UI_KeyF("panel r esizer box %F", FmtUint(panel->box.v)); if (!TweakBool("Hide profiler", 0)) + panel->resizer_box = UI_KeyF("panel resizer box %F", FmtUint(panel->box.v)); panel->flags |= V_PanelFlag_Profiler; panel->pct = 0.5; } @@ -5046,173 +5072,182 @@ void V_TickForever(WaveLaneCtx *lane) f32 children_count = 0; for (V_Panel *panel = parent_panel->first; panel; panel = panel->next) { - children_count += 1; - pct_accum += panel->pct; + if (!V_ShouldIgnorePanel(panel)) + { + children_count += 1; + pct_accum += panel->pct; + } } f32 violation = 1.0 - pct_accum; for (V_Panel *panel = parent_panel->first; panel; panel = panel->next) { - panel->pct += violation / children_count; - panel->pct = MaxF32(panel->pct, minimum_panel_pct); + if (!V_ShouldIgnorePanel(panel)) + { + panel->pct += violation / children_count; + panel->pct = MaxF32(panel->pct, minimum_panel_pct); + } } } //- Build panel boxes for (V_Panel *panel = parent_panel->first; panel; panel = panel->next) { - PanelBfs *bfs_panel = PushStruct(frame->arena, PanelBfs); - bfs_panel->panel = panel; - SllQueuePush(first_panel_bfs, last_panel_bfs, bfs_panel); - - UI_Key panel_box = panel->box; - UI_Key contents_box = panel->contents_box; - UI_Key resizer_box = panel->resizer_box; - - UI_Size resizer_size = UI_Px(3, 1); - - Vec4 panel_bg = theme.col.panel_bg; - Vec4 panel_bd = theme.col.panel_bd; - panel_bg.a *= theme.col.panel_opacity; - - Vec4 resizer_color = theme.col.divider; - resizer_color.a *= theme.col.panel_resizer_opacity; - panel_bd.a *= theme.col.panel_border_opacity; - - if (UI_Downs(resizer_box, Button_M1)) + if (!V_ShouldIgnorePanel(panel)) { - // FIXME: Don't need to store this state per-panel - panel->drag_resize_pct = panel->pct; - panel->drag_resize_pct_per_px = 1.0 / parent_contents_size_px; - } - if (UI_Held(resizer_box, Button_M1)) - { - f32 drag_delta_px = UI_CursorPos().v[parent_axis] - UI_DragCursorPos().v[parent_axis]; - f32 drag_delta_pct = drag_delta_px * panel->drag_resize_pct_per_px; + PanelBfs *bfs_panel = PushStruct(frame->arena, PanelBfs); + bfs_panel->panel = panel; + SllQueuePush(first_panel_bfs, last_panel_bfs, bfs_panel); - f32 old_pct = panel->pct; - f32 new_pct = MaxF32(panel->drag_resize_pct + drag_delta_pct, minimum_panel_pct); - f32 new_sibling_pct = 0; - if (panel->next) + UI_Key panel_box = panel->box; + UI_Key contents_box = panel->contents_box; + UI_Key resizer_box = panel->resizer_box; + + UI_Size resizer_size = UI_Px(3, 1); + + Vec4 panel_bg = theme.col.panel_bg; + Vec4 panel_bd = theme.col.panel_bd; + panel_bg.a *= theme.col.panel_opacity; + + Vec4 resizer_color = theme.col.divider; + resizer_color.a *= theme.col.panel_resizer_opacity; + panel_bd.a *= theme.col.panel_border_opacity; + + if (UI_Downs(resizer_box, Button_M1)) { - f32 old_sibling_pct = panel->next->pct; - f32 desired_new_sibling_pct = panel->next->pct - (new_pct - old_pct); - new_sibling_pct = MaxF32(desired_new_sibling_pct, minimum_panel_pct); - new_pct -= (new_sibling_pct - desired_new_sibling_pct); + // FIXME: Don't need to store this state per-panel + panel->drag_resize_pct = panel->pct; + panel->drag_resize_pct_per_px = 1.0 / parent_contents_size_px; } - - if (panel->next) + if (UI_Held(resizer_box, Button_M1)) { - panel->next->pct = new_sibling_pct; - } - panel->pct = new_pct; - } - if (UI_HotAbsolute(resizer_box)) - { - if (parent_axis == Axis_X) - { - WND_SetCursor(window_frame, WND_CursorKind_HorizontalResize); - } - else - { - WND_SetCursor(window_frame, WND_CursorKind_VerticalResize); - } - } + f32 drag_delta_px = UI_CursorPos().v[parent_axis] - UI_DragCursorPos().v[parent_axis]; + f32 drag_delta_pct = drag_delta_px * panel->drag_resize_pct_per_px; - f32 panel_pct = panel->pct; - - // UI_SetNext(AxisSize, UI_Grow(panel_pct, 1), .axis = parent_axis); - UI_SetNext(AxisSize, UI_Grow(panel_pct, 0), .axis = parent_axis); - // UI_SetNext(AxisSize, UI_Px(panel_pct * parent_contents_size_px, 0), .axis = parent_axis); - UI_SetNext(AxisSize, UI_Grow(1, 0), .axis = !parent_axis); - UI_SetNext(ChildLayoutAxis, parent_axis); - UI_PushDF(Tag, panel_box.v) - UI_PushDF(Parent, UI_BuildBoxEx(panel_box)) - { - // panel_bd.a = 0; - // resizer_color.a = 0; - - b32 is_screen_panel_box = UI_MatchKey(contents_box, vis_screen_panel_box); - if (is_screen_panel_box || panel->is_organizational) - { - panel_bg.a = 0; - panel_bd.a = 0; - resizer_color.a = 0; - } - if (panel->is_organizational) - { - panel_bg.a = 0; - } - - //- Left null-resizer box - // if (!panel->prev) - // { - // UI_SetNext(AxisSize, resizer_size, .axis = parent_axis); - // UI_SetNext(BackgroundColor, resizer_color); - // UI_BuildBox(); - // } - - //- Panel contents box - { - // UI_SetNext(AxisSize, UI_Grow(panel_pct, 1), .axis = parent_axis); - // UI_SetNext(AxisSize, UI_Grow(1, 0), .axis = !parent_axis); - UI_SetNext(ChildLayoutAxis, panel->axis); - // UI_SetNext(Width, UI_Px(500, 1)); - // UI_SetNext(Height, UI_Px(200, 1)); - UI_SetNext(BackgroundColor, panel_bg); - UI_SetNext(BorderColor, panel_bd); - UI_SetNext(BorderSize, 2); - // UI_SetNext(Rounding, UI_Rpx(10 * theme.rounding)); - UI_SetNext(Flags, UI_BoxFlag_Scissor | (UI_BoxFlag_CaptureMouse * (!is_screen_panel_box && !panel->is_organizational))); - UI_PushDF(Parent, UI_BuildBoxEx(contents_box)) + f32 old_pct = panel->pct; + f32 new_pct = MaxF32(panel->drag_resize_pct + drag_delta_pct, minimum_panel_pct); + f32 new_sibling_pct = 0; + if (panel->next) { + f32 old_sibling_pct = panel->next->pct; + f32 desired_new_sibling_pct = panel->next->pct - (new_pct - old_pct); + new_sibling_pct = MaxF32(desired_new_sibling_pct, minimum_panel_pct); + new_pct -= (new_sibling_pct - desired_new_sibling_pct); + } + + if (panel->next) + { + panel->next->pct = new_sibling_pct; + } + panel->pct = new_pct; + } + if (UI_HotAbsolute(resizer_box)) + { + if (parent_axis == Axis_X) + { + WND_SetCursor(window_frame, WND_CursorKind_HorizontalResize); + } + else + { + WND_SetCursor(window_frame, WND_CursorKind_VerticalResize); } } + f32 panel_pct = panel->pct; - - //- Resizer box - b32 can_resize = panel->next != 0; - if (can_resize) + // UI_SetNext(AxisSize, UI_Grow(panel_pct, 1), .axis = parent_axis); + UI_SetNext(AxisSize, UI_Grow(panel_pct, 0), .axis = parent_axis); + // UI_SetNext(AxisSize, UI_Px(panel_pct * parent_contents_size_px, 0), .axis = parent_axis); + UI_SetNext(AxisSize, UI_Grow(1, 0), .axis = !parent_axis); + UI_SetNext(ChildLayoutAxis, parent_axis); + UI_PushDF(Tag, panel_box.v) + UI_PushDF(Parent, UI_BuildBoxEx(panel_box)) { - UI_SetNext(AxisSize, resizer_size, .axis = parent_axis); - UI_SetNext(BackgroundColor, resizer_color); - UI_SetNext(Flags, UI_BoxFlag_CaptureMouse * !!can_resize); - UI_BuildBoxEx(resizer_box); + // panel_bd.a = 0; + // resizer_color.a = 0; + + b32 is_screen_panel_box = UI_MatchKey(contents_box, vis_screen_panel_box); + if (is_screen_panel_box || panel->is_organizational) + { + panel_bg.a = 0; + panel_bd.a = 0; + resizer_color.a = 0; + } + if (panel->is_organizational) + { + panel_bg.a = 0; + } + + //- Left null-resizer box + // if (!panel->prev && !V_ShouldIgnorePanel(panel->prev)) + // { + // UI_SetNext(AxisSize, resizer_size, .axis = parent_axis); + // UI_SetNext(BackgroundColor, resizer_color); + // UI_BuildBox(); + // } + + //- Panel contents box + { + // UI_SetNext(AxisSize, UI_Grow(panel_pct, 1), .axis = parent_axis); + // UI_SetNext(AxisSize, UI_Grow(1, 0), .axis = !parent_axis); + UI_SetNext(ChildLayoutAxis, panel->axis); + // UI_SetNext(Width, UI_Px(500, 1)); + // UI_SetNext(Height, UI_Px(200, 1)); + UI_SetNext(BackgroundColor, panel_bg); + UI_SetNext(BorderColor, panel_bd); + UI_SetNext(BorderSize, 2); + // UI_SetNext(Rounding, UI_Rpx(10 * theme.rounding)); + UI_SetNext(Flags, UI_BoxFlag_Scissor | (UI_BoxFlag_CaptureMouse * (!is_screen_panel_box && !panel->is_organizational))); + UI_PushDF(Parent, UI_BuildBoxEx(contents_box)) + { + } + } + + + + //- Resizer box + b32 can_resize = panel->next != 0 && !V_ShouldIgnorePanel(panel->next); + if (can_resize) + { + UI_SetNext(AxisSize, resizer_size, .axis = parent_axis); + UI_SetNext(BackgroundColor, resizer_color); + UI_SetNext(Flags, UI_BoxFlag_CaptureMouse * !!can_resize); + UI_BuildBoxEx(resizer_box); + } + + + // //- Overlay box + // { + // // UI_SetNext(AxisSize, resizer_size, .axis = parent_axis); + // // UI_SetNext(AxisSize, UI_Px(100, 1), .axis = parent_axis); + // // UI_SetNext(AxisSize, UI_Px(100, 1), .axis = !parent_axis); + // // UI_SetNext(AxisSize, UI_Grow(1, 1), .axis = !parent_axis); + // // UI_SetNext(AxisSize, UI_Grow(1, 1), .axis = !parent_axis); + // // UI_SetNext(BackgroundColor, Color_Cyan); + // // UI_SetNext(Anchor, UI_Region_Center); + // UI_SetNext(ChildLayoutAxis, parent_axis); + // UI_SetNext(Flags, UI_BoxFlag_Floating); + // UI_SetNext(Parent, contents_box); + // // FIXME: Don't use contents box + // UI_PushDF(Parent, UI_BuildBoxEx(UI_KeyF("overlay box"))) + // { + // UI_SetNext(AxisSize, UI_Grow(1, 0), .axis = parent_axis); + // UI_BuildBox(); + + // //- Resizer box + // if (panel->next) + // { + // UI_SetNext(AxisSize, resizer_size, .axis = parent_axis); + // // UI_SetNext(AxisSize, UI_Px(100, 1), .axis = parent_axis); + // // UI_SetNext(AxisSize, UI_Px(100, 1), .axis = !parent_axis); + // // UI_SetNext(AxisSize, UI_Grow(1, 1), .axis = !parent_axis); + // // UI_SetNext(BackgroundColor, theme.col.divider); + // UI_SetNext(Anchor, UI_Region_Center); + // UI_SetNext(Flags, UI_BoxFlag_CaptureMouse); + // UI_BuildBoxEx(resizer_box); + // } + // } + // } } - - - // //- Overlay box - // { - // // UI_SetNext(AxisSize, resizer_size, .axis = parent_axis); - // // UI_SetNext(AxisSize, UI_Px(100, 1), .axis = parent_axis); - // // UI_SetNext(AxisSize, UI_Px(100, 1), .axis = !parent_axis); - // // UI_SetNext(AxisSize, UI_Grow(1, 1), .axis = !parent_axis); - // // UI_SetNext(AxisSize, UI_Grow(1, 1), .axis = !parent_axis); - // // UI_SetNext(BackgroundColor, Color_Cyan); - // // UI_SetNext(Anchor, UI_Region_Center); - // UI_SetNext(ChildLayoutAxis, parent_axis); - // UI_SetNext(Flags, UI_BoxFlag_Floating); - // UI_SetNext(Parent, contents_box); - // // FIXME: Don't use contents box - // UI_PushDF(Parent, UI_BuildBoxEx(UI_KeyF("overlay box"))) - // { - // UI_SetNext(AxisSize, UI_Grow(1, 0), .axis = parent_axis); - // UI_BuildBox(); - - // //- Resizer box - // if (panel->next) - // { - // UI_SetNext(AxisSize, resizer_size, .axis = parent_axis); - // // UI_SetNext(AxisSize, UI_Px(100, 1), .axis = parent_axis); - // // UI_SetNext(AxisSize, UI_Px(100, 1), .axis = !parent_axis); - // // UI_SetNext(AxisSize, UI_Grow(1, 1), .axis = !parent_axis); - // // UI_SetNext(BackgroundColor, theme.col.divider); - // UI_SetNext(Anchor, UI_Region_Center); - // UI_SetNext(Flags, UI_BoxFlag_CaptureMouse); - // UI_BuildBoxEx(resizer_box); - // } - // } - // } } } } @@ -7050,7 +7085,10 @@ void V_TickForever(WaveLaneCtx *lane) UI_Push(Width, UI_Grow(1, 0)); UI_Push(Height, header_height); UI_SetNext(Flags, UI_BoxFlag_DrawText | (UI_BoxFlag_CaptureMouse * !!palette->is_showing)); - UI_PushCp(UI_BuildBoxEx(titlebar_key)); + UI_PushDF(FontSize, UI_Top(FontSize) * theme.h5) + UI_PushDF(TextColor, theme.col.hint) + UI_PushDF(ChildAlignment, UI_Region_Center) + UI_PushDF(Parent, UI_BuildBoxEx(titlebar_key)) { UI_Push(Width, UI_Grow(1, 0)); UI_Push(BorderColor, 0); @@ -7058,20 +7096,19 @@ void V_TickForever(WaveLaneCtx *lane) // Left title box UI_BuildRow(); + UI_SetNext(Width, UI_Shrink(0, 1)); + UI_BuildIcon(theme.icon_font, UI_Icon_Wrench); + // Title box // UI_SetNext(FontSize, UI_Top(FontSize) * theme.h3); - UI_SetNext(FontSize, UI_Top(FontSize) * theme.h5); - UI_SetNext(TextColor, theme.col.hint); - UI_SetNext(ChildAlignment, UI_Region_Center); UI_SetNext(Width, UI_Shrink(0, 1)); - UI_SetNext(Text, Lit("Developer Palette")); + UI_SetNext(Text, Lit(" Developer Palette")); UI_SetNext(Flags, UI_BoxFlag_DrawText); UI_BuildBox(); // Right title box UI_BuildRow(); } - UI_PopCp(UI_TopCp()); } UI_PopCp(UI_TopCp()); @@ -8159,7 +8196,8 @@ void V_TickForever(WaveLaneCtx *lane) G_Stats gpu_stats = G_QueryStats(); - if (frame->show_console) + // if (frame->show_console) + if (0) { UI_Key dbg_box = UI_KeyF("Debug box"); Vec2 dbg_dims = DimsFromRng2(UI_Rect(dbg_box)); @@ -8698,149 +8736,6 @@ void V_TickForever(WaveLaneCtx *lane) } } - ////////////////////////////// - //- Build console UI - - // TODO: Remove this whole thing - if (frame->show_console) - { - b32 minimized = 0; - - // i32 console_level = minimized ? LogLevel_Success : LogLevel_Debug; - i32 console_level = LogLevel_Trace; - - Vec4 colors[LogLevel_COUNT][2] = Zi; - SetBytes(colors, 0xFF, sizeof(colors)); - // Trace colors - colors[LogLevel_Trace][0] = Rgb(0.1, 0.4, 0.4); - colors[LogLevel_Trace][1] = Rgb(0.2, 0.5, 0.5); - // Debug colors - colors[LogLevel_Debug][0] = Rgb(0.4, 0.1, 0.4); - colors[LogLevel_Debug][1] = Rgb(0.5, 0.2, 0.5); - // Info colors - colors[LogLevel_Info][0] = Rgb(0.2, 0.2, 0.2); - colors[LogLevel_Info][1] = Rgb(0.25, 0.25, 0.25); - // Success colors - colors[LogLevel_Success][0] = Rgb(0.1, 0.3, 0.1); - colors[LogLevel_Success][1] = Rgb(0.2, 0.4, 0.2); - // Warning colors - colors[LogLevel_Warning][0] = Rgb(0.4, 0.4, 0.1); - colors[LogLevel_Warning][1] = Rgb(0.5, 0.5, 0.2); - // Error colors - colors[LogLevel_Error][0] = Rgb(0.4, 0.1, 0.1); - colors[LogLevel_Error][1] = Rgb(0.5, 0.2, 0.2); - - i64 max_time_ns = I64Max; - i64 fade_time_ns = max_time_ns; - if (minimized) - { - max_time_ns = NsFromSeconds(10); - fade_time_ns = max_time_ns; - } - f32 fade_curve = 0.5; - - { - UI_Push(FloatingPos, VEC2(0, 0)); - UI_SetNext(Flags, UI_BoxFlag_Floating); - UI_SetNext(BorderSize, 0); - if (minimized) - { - UI_SetNext(BackgroundColor, 0); - UI_SetNext(Width, UI_Fnt(50, 0)); - UI_SetNext(Height, UI_Shrink(0, 1)); - } - else - { - UI_SetNext(BackgroundColor, Rgba(0, 0, 0, 1)); - UI_SetNext(Width, UI_Grow(1, 0)); - UI_SetNext(Height, UI_Shrink(0, 1)); - } - UI_Key console_box = UI_BuildColumnEx(UI_KeyF("Console box")); - UI_PushCp(console_box); - { - // Gather display logs - u64 max = 20; - u64 display_count = 0; - LogEvent *display_logs = PushStructs(frame->arena, LogEvent, max); - { - b32 done = 0; - if (minimized) - { - max = 5; - } - LogEventsArray log_events = GetLogEvents(); - for (u64 i = log_events.count; i-- > 0 && display_count < max && !done;) - { - LogEvent ev = log_events.events[i]; - if (ev.time_ns > (frame->time_ns - max_time_ns)) - { - if (ev.level <= console_level) - { - display_logs[display_count] = ev; - ++display_count; - } - } - else - { - done = 1; - } - } - } - // Display logs in reverse - for (u64 i = display_count; i-- > 0;) - { - LogEvent log = display_logs[i]; - f32 opacity = 0.75; - f32 lin = 1.0 - ClampF64((f64)(frame->time_ns - log.time_ns) / (f64)fade_time_ns, 0, 1); - opacity *= PowF32(lin, fade_curve); - String text = log.msg; - if (!minimized) - { - DateTime datetime = log.datetime; - text = StringF( - frame->arena, - "[%F:%F:%F.%F] %F", - FmtUint(datetime.hour, .z = 2), - FmtUint(datetime.minute, .z = 2), - FmtUint(datetime.second, .z = 2), - FmtUint(datetime.milliseconds, .z = 3), - FmtString(text) - ); - } - UI_PushCp(UI_NilKey); - { - Vec4 tint = VEC4(1, 1, 1, opacity); - UI_Push(Tint, tint); - { - Vec4 color = colors[log.level][log.level_id % 2]; - UI_Push(BackgroundColor, color); - UI_Push(Width, UI_Grow(1, 0)); - UI_Push(Height, UI_Fnt(1.5, 1)); - UI_Push(Rounding, UI_Rpx(0)); - UI_Push(BorderSize, 0); - UI_Push(ChildAlignment, UI_Region_Left); - UI_PushCp(UI_BuildRow()); - { - // UI_SetNext(Height, UI_Px(100, 0)); - UI_BuildSpacer(UI_Px(10, 0), Axis_X); - UI_Push(BackgroundColor, 0); - UI_Push(BorderSize, 0); - UI_Push(Text, text); - UI_Push(Width, UI_Grow(1, 0)); - UI_Push(Height, UI_Shrink(0, 1)); - UI_Push(Flags, UI_BoxFlag_DrawText); - UI_BuildBox(); - } - UI_PopCp(UI_TopCp()); - } - } - UI_PopCp(UI_TopCp()); - } - } - UI_PopCp(UI_TopCp()); - } - } - ////////////////////////////// //- Process vis commands @@ -8910,7 +8805,7 @@ void V_TickForever(WaveLaneCtx *lane) case V_CmdKind_toggle_console: { - frame->show_console = !frame->show_console; + // frame->show_console = !frame->show_console; } break; case V_CmdKind_toggle_profiler: diff --git a/src/pp/pp_vis/pp_vis_core.h b/src/pp/pp_vis/pp_vis_core.h index c7ea597a..f6f4b571 100644 --- a/src/pp/pp_vis/pp_vis_core.h +++ b/src/pp/pp_vis/pp_vis_core.h @@ -315,9 +315,10 @@ Struct(V_Profiler) Enum(V_PanelFlag) { V_PanelFlag_None = 0, - V_PanelFlag_Spawn = (1 << 0), - V_PanelFlag_Profiler = (1 << 1), - V_PanelFlag_Console = (1 << 2), + V_PanelFlag_Ignore = (1 << 0), + V_PanelFlag_Spawn = (1 << 1), + V_PanelFlag_Profiler = (1 << 2), + V_PanelFlag_Console = (1 << 3), }; Struct(V_Panel) @@ -523,6 +524,11 @@ V_TextboxDeltaFlag V_ApplyTextboxDeltas(V_TextboxState *tb, V_TextboxDeltaList d String V_StringFromTextbox(Arena *arena, V_TextboxState *tb); String V_StringFromTextboxSelection(Arena *arena, V_TextboxState *tb); +//////////////////////////////////////////////////////////// +//~ Panel + +b32 V_ShouldIgnorePanel(V_Panel *panel); + //////////////////////////////////////////////////////////// //~ Timeline helpers diff --git a/src/pp/pp_vis/pp_vis_gpu.g b/src/pp/pp_vis/pp_vis_gpu.g index d4875d0f..e619fed3 100644 --- a/src/pp/pp_vis/pp_vis_gpu.g +++ b/src/pp/pp_vis/pp_vis_gpu.g @@ -1012,7 +1012,8 @@ ComputeShader(V_CompositeCS) Vec4 grid_color = 0; if (is_in_world) { - b32 draw_grid = frame.show_console; + // b32 draw_grid = frame.show_console; + b32 draw_grid = 0; // Grid outline if (draw_grid) diff --git a/src/pp/pp_vis/pp_vis_shared.cgh b/src/pp/pp_vis/pp_vis_shared.cgh index e1e22fbe..5aab052e 100644 --- a/src/pp/pp_vis/pp_vis_shared.cgh +++ b/src/pp/pp_vis/pp_vis_shared.cgh @@ -316,7 +316,6 @@ Struct(V_SharedFrame) b32 is_editing; b32 ui_debug; - b32 show_console; b32 is_selecting; b32 is_panning; b32 has_mouse_focus;