diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index 457d8669..25c17358 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -913,12 +913,13 @@ void V_TickForever(WaveLaneCtx *lane) { shutdown = Atomic32Fetch(&V.shutdown); P_tl.debug_draw_enabled = TweakBool("Vis debug draw", 0); - i64 begin_time_ns = TimeNs(); + i64 frame_begin_ns = TimeNs(); ////////////////////////////// //- Begin frame i64 prev_frame_ack = ack; + G_Stats gpu_stats = G_QueryStats(); V.cur_frame_tick += 1; V_Frame *prev_frame = V_PrevFrame(); @@ -4210,6 +4211,197 @@ void V_TickForever(WaveLaneCtx *lane) UI_PushDF(Tag, panel->contents_box.v) UI_PushDF(Parent, panel->contents_box) { + ////////////////////////////// + //- Build stats panel + + + + + + + if (panel->flags & V_PanelFlag_Stats) + { + UI_SetNext(Width, UI_Grow(1, 0)); + UI_PushDF(FontSize, UI_Top(FontSize) * 1.25) + UI_PushDF(Parent, UI_BuildRow()) + { + Struct(Stat) { String name; String value; b32 is_separator; }; + Stat stats[] = { + { .is_separator = 1, .name = Lit("Cpu") }, + { Lit("Arenas allocated"), StringF(frame->arena, "%F", FmtSint(GetGstat(NumArenas))) }, + { Lit("Arena memory committed"), StringF(frame->arena, "%F MiB", FmtFloat((f64)GetGstat(ArenaMemoryCommitted) / 1024 / 1024, .p = 3)) }, + { Lit("Arena memory reserved"), StringF(frame->arena, "%F TiB", FmtFloat((f64)GetGstat(ArenaMemoryReserved) / 1024 / 1024 / 1024 / 1024, .p = 3)) }, + { .is_separator = 1, .name = Lit("Gpu") }, + { Lit("Arenas allocated"), StringF(frame->arena, "%F", FmtUint(gpu_stats.arenas_count)) }, + { Lit("Device memory usage"), StringF(frame->arena, "%F MiB", FmtFloat((f64)gpu_stats.device_committed / 1024 / 1024, .p = 3)) }, + { Lit("Host memory usage"), StringF(frame->arena, "%F MiB", FmtFloat((f64)gpu_stats.host_committed / 1024 / 1024, .p = 3)) }, + { Lit("Non reuse tally"), StringF(frame->arena, "%F", FmtUint(gpu_stats.cumulative_nonreuse_count)) }, + { .is_separator = 1, .name = Lit("Network") }, + { Lit("RTT"), StringF(frame->arena, "%F ms", FmtFloat(smoothed_rtt * 1000, .p = 3)) }, + { Lit("Client send"), StringF(frame->arena, "%F MiB", FmtFloat(CeilF64((f64)vis_pipe_stats.total_bytes_sent / 1024) / 1024, .p = 3)) }, + { Lit("Client recv"), StringF(frame->arena, "%F MiB", FmtFloat(CeilF64((f64)vis_pipe_stats.total_bytes_received / 1024) / 1024, .p = 3)) }, + { Lit("Server send"), StringF(frame->arena, "%F MiB", FmtFloat(CeilF64((f64)sim_stats.pipe.total_bytes_sent / 1024) / 1024, .p = 3)) }, + { Lit("Server recv"), StringF(frame->arena, "%F MiB", FmtFloat(CeilF64((f64)sim_stats.pipe.total_bytes_received / 1024) / 1024, .p = 3)) }, + { .is_separator = 1, .name = Lit("Game") }, + { Lit("Frame rate"), StringF(frame->arena, "%F fps", FmtFloat(1.0 / V.smooth_frame_time_seconds)) }, + { Lit("Frame time"), StringF(frame->arena, "%F ms", FmtFloat(V.smooth_frame_time_seconds * 1000)) }, + { Lit("Particles spawned"), StringF(frame->arena, "%F", FmtUint(V.particle_seq)) }, + }; + + UI_Size padding = UI_Px(10, 1); + // Vec4 divider_color = Color_White; + Vec4 divider_color = theme.col.divider; + // Vec4 divider_color = VEC4(0.7, 0.6, 0.3, 1); + + UI_Size divider_size = UI_Px(2, 1); + UI_Size row_height = UI_Fnt(2, 1); + // panel->bd = divider_color; + // panel->bd = Color_Transparent; + + UI_Size child_padding = UI_Fnt(2, 0); + + Vec4 bg_colors[] = { + VEC4(0.12, 0.12, 0.12, 1), + VEC4(0.10, 0.10, 0.10, 1) + }; + for (u32 column_idx = 0; column_idx < 2; ++column_idx) + { + if (column_idx > 0) + { + UI_BuildDivider(divider_size, divider_color, Axis_X); + } + + b32 is_name = column_idx == 0; + if (column_idx == 0) + { + UI_SetNext(Width, UI_Grow(0.6, 0)); + } + else + { + UI_SetNext(Width, UI_Grow(0.4, 0)); + } + + UI_PushDF(Parent, UI_BuildColumn()) + { + u64 stats_count = countof(stats); + for (u64 stat_idx = 0; stat_idx < stats_count; ++stat_idx) + { + Stat stat = stats[stat_idx]; + + // UI_BuildSpacer(padding, Axis_Y); + + String text = stat.value; + // Vec4 text_color = Color_White; + Vec4 text_color = VEC4(0.7, 0.7, 0.7, 1); + if (is_name) + { + text = stat.name; + // text_color = theme.col.hint; + } + + // UI_SetNext(Width + UI_SetNext(Width, UI_Grow(1, 0)); + UI_SetNext(Height, row_height); + UI_SetNext(BackgroundColor, bg_colors[stat_idx % countof(bg_colors)]); + // if (stat.is_separator && column_idx > 0) + if (stat.is_separator) + { + UI_SetNext(BackgroundColor, Color_Transparent); + } + UI_SetNext(BorderSize, 2); + UI_PushDF(Parent, UI_BuildRow()) + { + UI_BuildSpacer(padding, Axis_X); + if (!stat.is_separator && column_idx == 0) + { + UI_BuildSpacer(child_padding, Axis_X); + } + + UI_SetNext(Width, UI_Shrink(0, 0)); + UI_SetNext(ChildAlignment, UI_Region_Left); + if (is_name) + { + // UI_SetNext(ChildAlignment, UI_Region_Left); + } + else + { + // UI_BuildSpacer(UI_Grow(1, 0), Axis_X); + } + + UI_SetNext(ChildAlignment, UI_Region_Left); + UI_SetNext(TextColor, text_color); + UI_SetNext(Height, UI_Grow(1, 0)); + UI_SetNext(Text, text); + UI_SetNext(Flags, UI_BoxFlag_DrawText | UI_BoxFlag_Scissor | UI_BoxFlag_DontTruncateText); + UI_BuildBox(); + + // UI_SetNext(Width, UI_Shrink(0, 1)); + // UI_SetNext(Height, UI_Shrink(0, 1)); + // UI_SetNext(Text, stat.value); + // UI_SetNext(Flags, UI_BoxFlag_DrawText); + // UI_BuildBox(); + + UI_BuildSpacer(padding, Axis_X); + } + // UI_BuildDivider(divider_size, divider_color, Axis_Y); + } + } + } + + } + } + + + + // if (panel->flags & V_PanelFlag_Stats) + // { + // UI_SetNext(Width, UI_Grow(1, 0)); + // UI_PushDF(FontSize, UI_Top(FontSize) * 1.5) + // UI_PushDF(Parent, UI_BuildColumn()) + // { + // Struct(Stat) { String name; String value; }; + // Stat stats[] = { + // { Lit("Particle sequence"), StringF(frame->arena, "%F", FmtUint(V.particle_seq)) } + // }; + + // UI_Size padding = UI_Px(10, 1); + + // u64 stats_count = countof(stats); + // for (u64 stat_idx = 0; stat_idx < stats_count; ++stat_idx) + // { + // UI_BuildSpacer(padding, Axis_Y); + + // Stat stat = stats[stat_idx]; + // // UI_SetNext(Width + // UI_SetNext(Width, UI_Grow(1, 0)); + // UI_SetNext(Height, UI_Shrink(0, 1)); + // UI_SetNext(BorderSize, 1) + // UI_PushDF(Parent, UI_BuildRow()) + // { + // UI_BuildSpacer(padding, Axis_X); + + // UI_SetNext(TextColor, theme.col.hint); + // UI_SetNext(Width, UI_Grow(1, 0)); + // UI_SetNext(Height, UI_Shrink(0, 1)); + // UI_SetNext(Text, stat.name); + // UI_SetNext(Flags, UI_BoxFlag_DrawText); + // UI_BuildBox(); + + // UI_SetNext(Width, UI_Shrink(0, 1)); + // UI_SetNext(Height, UI_Shrink(0, 1)); + // UI_SetNext(Text, stat.value); + // UI_SetNext(Flags, UI_BoxFlag_DrawText); + // UI_BuildBox(); + + // UI_BuildSpacer(padding, Axis_X); + // } + // }; + // } + // } + + + + ////////////////////////////// //- Build console panel @@ -4349,7 +4541,7 @@ void V_TickForever(WaveLaneCtx *lane) { for (P_TileKind tile_kind = 0; tile_kind < P_TileKind_COUNT; ++tile_kind) { - UI_BuildDivider(UI_Px(1, 0), divider_color, Axis_Y); + UI_BuildDivider(UI_Px(1, 1), divider_color, Axis_Y); String tile_name = P_NameFromTileKind(tile_kind); UI_Key tile_box = UI_KeyF("Tile %F", FmtString(tile_name)); @@ -4377,13 +4569,13 @@ void V_TickForever(WaveLaneCtx *lane) UI_SetNext(BorderColor, border_color); UI_SetNext(BorderSize, 1); UI_SetNext(Width, UI_Grow(1, 0)); - UI_SetNext(Height, UI_Shrink(UI_Fnt(0.25, 0).v, 0)); + UI_SetNext(Height, UI_Shrink(UI_Top(FontSize) * 0.25, 1)); UI_SetNext(Misc, is_selected); UI_SetNext(Flags, UI_BoxFlag_CaptureMouse); UI_SetNext(ChildAlignment, UI_Region_Left); UI_PushDF(Parent, UI_BuildRowEx(tile_box)) { - UI_BuildSpacer(UI_Fnt(0.25, 0), Axis_X); + UI_BuildSpacer(UI_Fnt(0.25, 1), Axis_X); // Tile sprite { @@ -4393,12 +4585,12 @@ void V_TickForever(WaveLaneCtx *lane) UI_SetNext(ChildAlignment, UI_Region_Center); UI_SetNext(Width, UI_Fnt(2.5, 0)); - UI_SetNext(Height, UI_Fnt(2.5, 0)); + UI_SetNext(Height, UI_Fnt(2.5, 1)); UI_SetNext(SpriteSheet, sheet); UI_BuildRow(); } - UI_BuildSpacer(UI_Fnt(0.5, 0), Axis_X); + UI_BuildSpacer(UI_Fnt(0.5, 1), Axis_X); // Tile name { @@ -4406,7 +4598,7 @@ void V_TickForever(WaveLaneCtx *lane) UI_SetNext(Text, tile_name); UI_SetNext(Flags, UI_BoxFlag_DrawText); UI_SetNext(Width, UI_Shrink(4, 0)); - UI_SetNext(Height, UI_Shrink(2, 0)); + UI_SetNext(Height, UI_Shrink(2, 1)); UI_BuildRow(); } } @@ -4422,7 +4614,7 @@ void V_TickForever(WaveLaneCtx *lane) P_PrefabFlag prefab_flags = P_FlagsFromPrefabKind(prefab_kind); if (!AnyBit(prefab_flags, P_PrefabFlag_HideFromEditor)) { - UI_BuildDivider(UI_Px(1, 0), divider_color, Axis_Y); + UI_BuildDivider(UI_Px(1, 1), divider_color, Axis_Y); UI_Key prefab_box = UI_KeyF("Prefab %F", FmtString(prefab_name)); @@ -4449,7 +4641,7 @@ void V_TickForever(WaveLaneCtx *lane) UI_SetNext(BorderColor, border_color); UI_SetNext(BorderSize, 1); UI_SetNext(Width, UI_Grow(1, 0)); - UI_SetNext(Height, UI_Shrink(UI_Fnt(0.25, 0).v, 0)); + UI_SetNext(Height, UI_Shrink(UI_Top(FontSize) * 0.25, 1)); UI_SetNext(Misc, is_selected); UI_SetNext(Flags, UI_BoxFlag_CaptureMouse); UI_SetNext(ChildAlignment, UI_Region_Left); @@ -4478,7 +4670,7 @@ void V_TickForever(WaveLaneCtx *lane) UI_SetNext(Text, prefab_name); UI_SetNext(Flags, UI_BoxFlag_DrawText); UI_SetNext(Width, UI_Shrink(4, 0)); - UI_SetNext(Height, UI_Shrink(2, 0)); + UI_SetNext(Height, UI_Shrink(2, 1)); UI_BuildRow(); } } @@ -5733,111 +5925,124 @@ void V_TickForever(WaveLaneCtx *lane) - ////////////////////////////// - //- Init panel layout + // ////////////////////////////// + // //- Init panel layout - // TODO: Allow for custom layouts stored in config files - // TODO: Don't use rand keys for panels + // // TODO: Allow for custom layouts stored in config files + // // TODO: Don't use rand keys for panels - if (!V.root_panel) - { - V.root_panel = PushStruct(perm, V_Panel); - V_Panel *left_panel = PushStruct(perm, V_Panel); - V_Panel *right_panel = PushStruct(perm, V_Panel); + // if (!V.root_panel) + // { + // V.root_panel = PushStruct(perm, V_Panel); + // V_Panel *left_panel = PushStruct(perm, V_Panel); + // V_Panel *right_panel = PushStruct(perm, V_Panel); - //- Root panel - { - { - V_Panel *panel = V.root_panel; - panel->box = UI_KeyF("test root panel"); - panel->contents_box = vis_panels_box; - panel->resizer_box = UI_KeyF("panel resizer box %F", FmtUint(panel->box.v)); - panel->pct = 1; - panel->is_organizational = 1; - panel->axis = Axis_X; - V.root_panel = panel; - } + // //- Root panel + // { + // { + // V_Panel *panel = V.root_panel; + // panel->box = UI_KeyF("test root panel"); + // panel->contents_box = vis_panels_box; + // panel->resizer_box = UI_KeyF("panel resizer box %F", FmtUint(panel->box.v)); + // panel->pct = 1; + // panel->is_organizational = 1; + // panel->axis = Axis_X; + // V.root_panel = panel; + // } - //- Left panel - { - V_Panel *panel = left_panel; - panel->parent = V.root_panel; - panel->axis = Axis_X; - DllQueuePush(panel->parent->first, panel->parent->last, panel); - panel->box = UI_RandKey(); - 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->pct = 0.10; - panel->is_organizational = 1; - } + // //- Left panel + // { + // V_Panel *panel = left_panel; + // panel->parent = V.root_panel; + // panel->axis = Axis_Y; + // DllQueuePush(panel->parent->first, panel->parent->last, panel); + // panel->box = UI_RandKey(); + // 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->pct = 0.10; + // panel->is_organizational = 1; + // } - //- Right panel - { - V_Panel *panel = right_panel; - panel->parent = V.root_panel; - panel->axis = Axis_Y; - DllQueuePush(panel->parent->first, panel->parent->last, panel); - panel->box = UI_RandKey(); - 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->pct = 0.90; - panel->is_organizational = 1; - } - } + // //- Right panel + // { + // V_Panel *panel = right_panel; + // panel->parent = V.root_panel; + // panel->axis = Axis_Y; + // DllQueuePush(panel->parent->first, panel->parent->last, panel); + // panel->box = UI_RandKey(); + // 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->pct = 0.90; + // panel->is_organizational = 1; + // } + // } - //- Test spawn panel - { - V_Panel *panel = PushStruct(perm, V_Panel); - panel->parent = left_panel; - panel->axis = Axis_X; - DllQueuePush(panel->parent->first, panel->parent->last, panel); - panel->box = UI_RandKey(); - 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_Spawn; - panel->pct = 0.25; - } + // //- Test stats panel + // { + // V_Panel *parent = left_panel; + // V_Panel *panel = PushStruct(perm, V_Panel); + // panel->axis = Axis_X; + // DllQueuePush(parent->first, parent->last, panel); + // panel->box = UI_RandKey(); + // 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_stats; + // panel->pct = 0.25; + // } - // //- Test profiler panel - // { - // V_Panel *panel = PushStruct(perm, V_Panel); - // panel->parent = right_panel; - // panel->axis = Axis_X; - // DllQueuePush(panel->parent->first, panel->parent->last, panel); - // panel->box = UI_RandKey(); - // 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_Profiler; - // panel->pct = 0.5; - // } + // //- Test spawn panel + // { + // V_Panel *panel = PushStruct(perm, V_Panel); + // panel->parent = left_panel; + // panel->axis = Axis_X; + // DllQueuePush(panel->parent->first, panel->parent->last, panel); + // panel->box = UI_RandKey(); + // 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_Spawn; + // panel->pct = 0.25; + // } - //- Vis screen panel - { - V_Panel *panel = PushStruct(perm, V_Panel); - panel->parent = right_panel; - panel->axis = Axis_X; - DllQueuePush(panel->parent->first, panel->parent->last, panel); - panel->box = UI_RandKey(); - panel->contents_box = vis_screen_panel_box; - panel->resizer_box = UI_KeyF("panel resizer box %F", FmtUint(panel->box.v)); - panel->flags |= V_PanelFlag_Screen; - panel->pct = 1; - } + // // //- Test profiler panel + // // { + // // V_Panel *panel = PushStruct(perm, V_Panel); + // // panel->parent = right_panel; + // // panel->axis = Axis_X; + // // DllQueuePush(panel->parent->first, panel->parent->last, panel); + // // panel->box = UI_RandKey(); + // // 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_Profiler; + // // panel->pct = 0.5; + // // } - // //- Test console panel - // { - // V_Panel *parent = right_panel; - // V_Panel *panel = PushStruct(perm, V_Panel); - // panel->axis = Axis_X; - // DllQueuePush(parent->first, parent->last, panel); - // panel->box = UI_KeyF("test raah console panel"); - // 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->flags |= V_PanelFlag_Spawn; - // panel->pct = 0.25; - // } - } + // //- Vis screen panel + // { + // V_Panel *panel = PushStruct(perm, V_Panel); + // panel->parent = right_panel; + // panel->axis = Axis_X; + // DllQueuePush(panel->parent->first, panel->parent->last, panel); + // panel->box = UI_RandKey(); + // panel->contents_box = vis_screen_panel_box; + // panel->resizer_box = UI_KeyF("panel resizer box %F", FmtUint(panel->box.v)); + // panel->flags |= V_PanelFlag_Screen; + // panel->pct = 1; + // } + + // // //- Test console panel + // // { + // // V_Panel *parent = right_panel; + // // V_Panel *panel = PushStruct(perm, V_Panel); + // // panel->axis = Axis_X; + // // DllQueuePush(parent->first, parent->last, panel); + // // panel->box = UI_RandKey(); + // // 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->flags |= V_PanelFlag_Spawn; + // // panel->pct = 0.25; + // // } + // } @@ -5980,7 +6185,7 @@ void V_TickForever(WaveLaneCtx *lane) // V_Panel *panel = PushStruct(perm, V_Panel); // panel->axis = Axis_X; // DllQueuePush(parent->first, parent->last, panel); - // panel->box = UI_KeyF("test raah console panel"); + // panel->box = UI_RandKey(); // 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; @@ -5999,6 +6204,155 @@ void V_TickForever(WaveLaneCtx *lane) + + + + + + + + + + ////////////////////////////// + //- + //- STATS DEMO panel layout + //- + + // TODO: Allow for custom layouts stored in config files + // TODO: Don't use rand keys for panels + + if (!V.root_panel) + { + V.root_panel = PushStruct(perm, V_Panel); + V_Panel *left_panel = PushStruct(perm, V_Panel); + V_Panel *right_panel = PushStruct(perm, V_Panel); + + //- Root panel + { + { + V_Panel *panel = V.root_panel; + panel->box = UI_KeyF("test root panel"); + panel->contents_box = vis_panels_box; + panel->resizer_box = UI_KeyF("panel resizer box %F", FmtUint(panel->box.v)); + panel->pct = 1; + panel->is_organizational = 1; + panel->axis = Axis_X; + V.root_panel = panel; + } + + //- Left panel + { + V_Panel *panel = left_panel; + panel->parent = V.root_panel; + panel->axis = Axis_Y; + DllQueuePush(panel->parent->first, panel->parent->last, panel); + panel->box = UI_RandKey(); + 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->pct = 0.4; + panel->is_organizational = 1; + } + + //- Right panel + { + V_Panel *panel = right_panel; + panel->parent = V.root_panel; + panel->axis = Axis_Y; + DllQueuePush(panel->parent->first, panel->parent->last, panel); + panel->box = UI_RandKey(); + 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->pct = 0.90; + panel->is_organizational = 1; + } + } + + //- Test stats panel + { + V_Panel *parent = left_panel; + V_Panel *panel = PushStruct(perm, V_Panel); + panel->axis = Axis_X; + DllQueuePush(parent->first, parent->last, panel); + panel->box = UI_RandKey(); + 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_Stats; + panel->pct = 0.5; + } + + //- Test spawn panel + { + V_Panel *panel = PushStruct(perm, V_Panel); + panel->parent = left_panel; + panel->axis = Axis_X; + DllQueuePush(panel->parent->first, panel->parent->last, panel); + panel->box = UI_RandKey(); + 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_Spawn; + panel->pct = 0.25; + } + + // //- Test profiler panel + // { + // V_Panel *panel = PushStruct(perm, V_Panel); + // panel->parent = right_panel; + // panel->axis = Axis_X; + // DllQueuePush(panel->parent->first, panel->parent->last, panel); + // panel->box = UI_RandKey(); + // 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_Profiler; + // panel->pct = 0.5; + // } + + //- Vis screen panel + { + V_Panel *panel = PushStruct(perm, V_Panel); + panel->parent = right_panel; + panel->axis = Axis_X; + DllQueuePush(panel->parent->first, panel->parent->last, panel); + panel->box = UI_RandKey(); + panel->contents_box = vis_screen_panel_box; + panel->resizer_box = UI_KeyF("panel resizer box %F", FmtUint(panel->box.v)); + panel->flags |= V_PanelFlag_Screen; + panel->pct = 1; + } + + // //- Test console panel + // { + // V_Panel *parent = right_panel; + // V_Panel *panel = PushStruct(perm, V_Panel); + // panel->axis = Axis_X; + // DllQueuePush(parent->first, parent->last, panel); + // panel->box = UI_RandKey(); + // 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->flags |= V_PanelFlag_Spawn; + // panel->pct = 0.25; + // } + } + + + + + + + + + + + + + + + + + + + + ////////////////////////////// //- Build vis panel contents @@ -7595,131 +7949,6 @@ void V_TickForever(WaveLaneCtx *lane) - ////////////////////////////// - //- Build debug info UI - - G_Stats gpu_stats = G_QueryStats(); - - if (0) - { - UI_Key dbg_box = UI_KeyF("Debug box"); - Vec2 dbg_dims = DimsFromRng2(UI_Rect(dbg_box)); - - f32 padding = 20; - f32 rounding = 15 * theme.rounding; - Vec4 color = VEC4(0, 0, 0, 0.75); - UI_SetNext(Flags, UI_BoxFlag_Floating); - UI_SetNext(FloatingPos, VEC2(0, frame->screen_dims.y - dbg_dims.y)); - UI_SetNext(Width, UI_Shrink(0, 1)); - UI_SetNext(Height, UI_Shrink(0, 1)); - UI_SetNext(BackgroundColor, color); - UI_SetNext(Rounding, UI_Rpx(rounding)); - UI_PushCp(UI_BuildColumn()); - { - // UI_BuildSpacer(UI_Px(10, 1), Axis_X); - // UI_Push(ChildAlignment, UI_Region_Center); - // UI_SetNext(Width, UI_Shrink(0, 1)); - // UI_SetNext(Height, UI_Shrink(0, 1)); - UI_SetNext(Width, UI_Shrink(0, 1)); - UI_SetNext(Height, UI_Shrink(0, 1)); - UI_PushCp(UI_BuildRow()); - { - UI_BuildSpacer(UI_Px(padding, 1), Axis_X); - UI_SetNext(Width, UI_Shrink(0, 1)); - UI_SetNext(Height, UI_Shrink(0, 1)); - UI_PushCp(UI_BuildColumn()); - { - UI_BuildSpacer(UI_Px(padding, 1), Axis_Y); - { - UI_BuildLabelF("Local server world tick: %F", FmtSint(sim_stats.tick)); - UI_BuildLabelF("Local server world entities: %F", FmtSint(sim_stats.ents_count)); - UI_BuildLabelF("Local server world constraints: %F", FmtSint(sim_stats.constraints_count)); - UI_BuildSpacer(UI_Px(padding, 1), Axis_Y); - UI_BuildLabelF("Sim world seed: 0x%F", FmtHex(sim_world->seed)); - UI_BuildLabelF("Sim world tick: %F", FmtSint(sim_world->last_frame->tick)); - UI_BuildLabelF("Sim world entities: %F", FmtSint(sim_world->last_frame->ents_count)); - UI_BuildLabelF("Sim world constraints: %F", FmtSint(sim_world->last_frame->constraints_count)); - UI_BuildSpacer(UI_Px(padding, 1), Axis_Y); - UI_BuildLabelF("Predicted world seed: 0x%F", FmtHex(predict_world->seed)); - UI_BuildLabelF("Predicted world tick: %F", FmtSint(predict_world->last_frame->tick)); - UI_BuildLabelF("Predicted world entities: %F", FmtSint(predict_world->last_frame->ents_count)); - UI_BuildLabelF("Predicted world constraints: %F", FmtSint(predict_world->last_frame->constraints_count)); - UI_BuildSpacer(UI_Px(padding, 1), Axis_Y); - UI_BuildLabelF("Local world seed: 0x%F", FmtHex(frame->local_world->seed)); - UI_BuildLabelF("Local world tick: %F", FmtSint(frame->local_world->last_frame->tick)); - UI_BuildLabelF("Local world entities: %F", FmtSint(frame->local_world->last_frame->ents_count)); - UI_BuildLabelF("Local world constraints: %F", FmtSint(frame->local_world->last_frame->constraints_count)); - } - UI_BuildSpacer(UI_Px(padding, 1), Axis_Y); - { - Vec2 tile_pos = MulAffineVec2(frame->af.world_to_tile, frame->world_cursor); - Vec2 cell_pos = MulAffineVec2(frame->af.world_to_cell, frame->world_cursor); - i32 tile_idx = P_TileIdxFromTilePos(tile_pos); - UI_BuildLabelF("Camera pos: %F", FmtFloat2(frame->camera_pos)); - UI_BuildLabelF("Camera zoom: %F", FmtFloat(frame->camera_zoom)); - UI_BuildLabelF("Cursor pos: %F", FmtFloat2(frame->screen_cursor)); - UI_BuildLabelF("Cursor world pos: %F", FmtFloat2(frame->world_cursor)); - UI_BuildLabelF("Cursor tile pos: %F", FmtFloat2(tile_pos)); - UI_BuildLabelF("Cursor tile idx: %F", FmtSint(tile_idx)); - UI_BuildLabelF("Cursor cell pos: %F", FmtFloat2(cell_pos)); - UI_BuildLabelF("Hovered ent: %F", P_FmtKey(hovered_ent->key)); - } - UI_BuildSpacer(UI_Px(padding, 1), Axis_Y); - { - UI_BuildLabelF("Screen dims: %F", FmtFloat2(frame->screen_dims)); - UI_BuildLabelF("Shade dims: %F", FmtFloat2(frame->shade_dims)); - } - UI_BuildSpacer(UI_Px(padding, 1), Axis_Y); - { - UI_BuildLabelF("Particle seq: %F", FmtFloat(V.particle_seq)); - } - UI_BuildSpacer(UI_Px(padding, 1), Axis_Y); - { - UI_BuildLabelF("RTT: %Fms", FmtFloat(smoothed_rtt * 1000, .p = 3)); - UI_BuildLabelF("Client send: %F MiB", FmtFloat(CeilF64((f64)vis_pipe_stats.total_bytes_sent / 1024) / 1024, .p = 3)); - UI_BuildLabelF("Client recv: %F MiB", FmtFloat(CeilF64((f64)vis_pipe_stats.total_bytes_received / 1024) / 1024, .p = 3)); - UI_BuildLabelF("Server send: %F MiB", FmtFloat(CeilF64((f64)sim_stats.pipe.total_bytes_sent / 1024) / 1024, .p = 3)); - UI_BuildLabelF("Server recv: %F MiB", FmtFloat(CeilF64((f64)sim_stats.pipe.total_bytes_received / 1024) / 1024, .p = 3)); - } - UI_BuildSpacer(UI_Px(padding, 1), Axis_Y); - { - { - UI_Push(FontSize, UI_Top(FontSize) * theme.h2); - UI_BuildLabelF("Cpu:"); - UI_Pop(FontSize); - } - UI_BuildLabelF(" Arenas: %F", FmtSint(GetGstat(NumArenas))); - if (PROFILING_ENABLED) - { - UI_BuildLabelF(" Arena memory committed: %F MiB (Collecting profiler samples, so perpetual growth is expected)", FmtFloat((f64)GetGstat(ArenaMemoryCommitted) / 1024 / 1024, .p = 3)); - } - else - { - UI_BuildLabelF(" Arena memory committed: %F MiB", FmtFloat((f64)GetGstat(ArenaMemoryCommitted) / 1024 / 1024, .p = 3)); - } - UI_BuildLabelF(" Arena memory reserved: %F TiB", FmtFloat((f64)GetGstat(ArenaMemoryReserved) / 1024 / 1024 / 1024 / 1024, .p = 3)); - } - UI_BuildSpacer(UI_Px(padding, 1), Axis_Y); - { - { - UI_Push(FontSize, UI_Top(FontSize) * theme.h2); - UI_BuildLabelF("Gpu:"); - UI_Pop(FontSize); - } - UI_BuildLabelF(" Arenas: %F", FmtUint(gpu_stats.arenas_count)); - UI_BuildLabelF(" Device memory usage: %F MiB", FmtFloat((f64)gpu_stats.device_committed / 1024 / 1024, .p = 3)); - UI_BuildLabelF(" Host memory usage: %F MiB", FmtFloat((f64)gpu_stats.host_committed / 1024 / 1024, .p = 3)); - UI_BuildLabelF(" Non-reuse tally: %F", FmtUint(gpu_stats.cumulative_nonreuse_count)); - } - UI_BuildSpacer(UI_Px(padding, 1), Axis_Y); - } - UI_PopCp(UI_TopCp()); - UI_BuildSpacer(UI_Px(padding, 1), Axis_X); - } - UI_PopCp(UI_TopCp()); - } - UI_PopCp(UI_TopCp()); - } ////////////////////////////// @@ -8295,6 +8524,7 @@ void V_TickForever(WaveLaneCtx *lane) if (V_CountVisCmds(V_CmdKind_clear_particles)) { frame->should_clear_particles = 1; + V_PushNotif(Lit("Particles cleared")); } if (V_CountVisCmds(V_CmdKind_clear_bullets)) @@ -8782,13 +9012,20 @@ void V_TickForever(WaveLaneCtx *lane) LogInfoF("Time to first frame: %Fs", FmtFloat(SecondsFromNs(TimeNs()), .p = 3)); } + frame->elapsed_ns = TimeNs() - frame_begin_ns; + V.smooth_frame_time_seconds = LerpF64(V.smooth_frame_time_seconds, SecondsFromNs(frame->elapsed_ns), SaturateF64(5 * frame->dt)); + if (frame->tick < 100) + { + V.smooth_frame_time_seconds = SecondsFromNs(frame->elapsed_ns); + } + ////////////////////////////// //- Sleep if (!shutdown && FPS_LIMIT > 0) { i64 step_dt_ns = FPS_LIMIT > 0 ? NsFromSeconds(1) / FPS_LIMIT : 0; - PLT_SleepFrame(begin_time_ns, step_dt_ns); + PLT_SleepFrame(frame_begin_ns, step_dt_ns); } } diff --git a/src/pp/pp_vis/pp_vis_core.h b/src/pp/pp_vis/pp_vis_core.h index 13440a0f..01a827a2 100644 --- a/src/pp/pp_vis/pp_vis_core.h +++ b/src/pp/pp_vis/pp_vis_core.h @@ -4,28 +4,28 @@ #define V_CmdsTableXList(X) \ X(nop, NOP, V_CmdDescFlag_HideFromPalette, V_HOTKEY( 0 ), ) \ X(exit_program, Exit Program, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_Escape ) ) \ - X(toggle_palette, Toggle Command Palette, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_E, .ctrl = 1 ), V_HOTKEY( Button_P, .ctrl = 1, .shift = 1 ), ) \ + X(toggle_palette, Toggle Command Palette, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_E, .alt = 1 ), V_HOTKEY( Button_P, .ctrl = 1, .shift = 1 ), ) \ X(zoom_in, Zoom In, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_WheelUp ), ) \ X(zoom_out, Zoom Out, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_WheelDown ), ) \ X(toggle_editor, Toggle Editor, V_CmdDescFlag_None, V_HOTKEY( Button_F1 ), ) \ - X(save_level, Save level, V_CmdDescFlag_None, V_HOTKEY( Button_S, .ctrl = 1 ), ) \ + X(save_level, Save level, V_CmdDescFlag_None, V_HOTKEY( Button_S, .alt = 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, .ctrl = 1 ), ) \ X(toggle_profiler, Toggle Profiler, V_CmdDescFlag_None, V_HOTKEY( 0 ), ) \ - 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(pause_timeline, Pause Debug Timeline, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_E, .alt = 1 ), ) \ + X(lock_timeline, Lock Debug Timeline, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_R, .alt = 1 ), ) \ X(toggle_fullscreen, Toggle Fullscreen Mode, V_CmdDescFlag_None, V_HOTKEY( Button_Enter, .alt = 1 ) ) \ X(toggle_window_topmost, Toggle Window Topmost, V_CmdDescFlag_None, V_HOTKEY( Button_F4 ), ) \ - X(tp_player, Teleport Player, V_CmdDescFlag_None, V_HOTKEY( Button_Q ), ) \ - X(spawn_tp_bot, Spawn/Teleport Bot, V_CmdDescFlag_None, V_HOTKEY( Button_T ), ) \ - X(spawn_bot, Spawn Bot, V_CmdDescFlag_None, V_HOTKEY( Button_T, .ctrl = 1 ), ) \ + X(tp_player, Teleport Player, V_CmdDescFlag_None, V_HOTKEY( Button_Q, .alt = 1 ), ) \ + X(spawn_tp_bot, Spawn/Teleport Bot, V_CmdDescFlag_None, V_HOTKEY( Button_T, .alt = 1 ), ) \ + X(spawn_bot, Spawn Bot, V_CmdDescFlag_None, V_HOTKEY( Button_T, .alt = 1, .shift = 1 ), ) \ X(delete, Delete entity at cursor, V_CmdDescFlag_None, V_HOTKEY( Button_M2 ), ) \ X(reset_world, Reset world, V_CmdDescFlag_None, V_HOTKEY( Button_R, .ctrl = 1, .alt = 1 ), ) \ - X(clear_particles, Clear particles, V_CmdDescFlag_None, V_HOTKEY( Button_C ), ) \ + X(clear_particles, Clear particles, V_CmdDescFlag_None, V_HOTKEY( Button_C, .alt = 1, ), ) \ X(clear_bullets, Clear bullets, V_CmdDescFlag_None, V_HOTKEY( Button_C, .shift = 1 ), ) \ - X(test, Test, V_CmdDescFlag_None, V_HOTKEY( Button_Y ), ) \ -/* -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ + X(test, Test, V_CmdDescFlag_None, V_HOTKEY( Button_Y, .alt = 1 ), ) \ +/* --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ //////////////////////////////////////////////////////////// //~ Theme types @@ -330,6 +330,7 @@ Enum(V_PanelFlag) V_PanelFlag_Spawn = (1 << 1), V_PanelFlag_Profiler = (1 << 2), V_PanelFlag_Console = (1 << 3), + V_PanelFlag_Stats = (1 << 4), }; Struct(V_Panel) @@ -440,6 +441,7 @@ Struct(V_Frame) V_Palette palette; UI_Key text_input_focus; + i64 elapsed_ns; String window_restore; @@ -505,6 +507,8 @@ Struct(V_Ctx) u64 profiler_frame_seq; V_ProfilerFrame *profiler_frames; + f64 smooth_frame_time_seconds; + i64 cur_frame_tick; V_Frame frames[2]; };