bones_bevy_renderer/
debug.rs

1//! Debug module for data that hooks into Bevy. Bevy frame diagnostics are synchronized into [`bones_framework::debug::FrameDiagState`]
2//! which may be displayed using [`bones_framework::debug`] module.
3use bevy::{
4    diagnostic::{DiagnosticsStore, FrameTimeDiagnosticsPlugin},
5    prelude::*,
6};
7use bones_framework::debug::FrameDiagState;
8
9use crate::BonesGame;
10
11/// Plugin for debug tools that hook into Bevy, such as [`bevy::diagnostic::FrameTimeDiagnosticsPlugin`].
12pub struct BevyDebugPlugin;
13
14impl Plugin for BevyDebugPlugin {
15    fn build(&self, app: &mut App) {
16        app.add_plugins(bevy::diagnostic::FrameTimeDiagnosticsPlugin);
17        app.add_systems(Last, sync_frame_time);
18    }
19}
20
21fn sync_frame_time(mut game: ResMut<BonesGame>, diagnostics: Res<DiagnosticsStore>) {
22    let mut state = game.init_shared_resource::<FrameDiagState>();
23
24    let fps = diagnostics.get(FrameTimeDiagnosticsPlugin::FPS).unwrap();
25    state.fps = fps.value().unwrap_or(0.0);
26    state.fps_avg = fps.average().unwrap_or(0.0);
27
28    if state.fps < state.min_fps {
29        state.min_fps = state.fps;
30    }
31    if state.fps > state.max_fps {
32        state.max_fps = state.fps;
33    }
34
35    let frame_time = diagnostics
36        .get(FrameTimeDiagnosticsPlugin::FRAME_TIME)
37        .unwrap();
38    state.frame_time = frame_time.value().unwrap_or(0.0);
39    state.frame_time_avg = frame_time.average().unwrap_or(0.0);
40
41    if state.frame_time < state.min_frame_time {
42        state.min_frame_time = state.frame_time;
43    }
44    if state.frame_time > state.max_frame_time {
45        state.max_frame_time = state.frame_time;
46    }
47}