bevy_diagnostic_vertex_count/
lib.rs1use bevy::{
2 diagnostic::{Diagnostic, DiagnosticId, Diagnostics},
3 prelude::*,
4};
5
6#[derive(Default)]
7pub struct VertexCountDiagnosticsPlugin;
8
9pub struct VertexCountDiagnosticsSettings {
10 pub only_visible: bool,
11}
12
13impl Default for VertexCountDiagnosticsSettings {
14 fn default() -> Self {
15 Self { only_visible: true }
16 }
17}
18
19impl Plugin for VertexCountDiagnosticsPlugin {
20 fn build(&self, app: &mut App) {
21 app.init_resource::<VertexCountDiagnosticsSettings>()
22 .add_startup_system(Self::setup_system)
23 .add_system(Self::diagnostic_system);
24 }
25}
26
27impl VertexCountDiagnosticsPlugin {
28 pub const VERTEX_COUNT: DiagnosticId =
29 DiagnosticId::from_u128(8139414220128000606581257525911227370);
30
31 pub fn setup_system(mut diagnostics: ResMut<Diagnostics>) {
32 diagnostics.add(Diagnostic::new(Self::VERTEX_COUNT, "vertex_count", 20));
33 }
34
35 pub fn diagnostic_system(
36 meshes: Res<Assets<Mesh>>,
37 meshed_entities: Query<(&Handle<Mesh>, Option<&ComputedVisibility>)>,
38 diagnostics: Option<ResMut<Diagnostics>>,
39 settings: Res<VertexCountDiagnosticsSettings>,
40 ) {
41 if let Some(mut diagnostics) = diagnostics {
42 let vertex_count: usize = meshed_entities
43 .iter()
44 .filter(|(_, visibility)| {
45 !settings.only_visible
46 || visibility.map_or(false, |v| v.is_visible_in_hierarchy())
47 })
48 .map(|(mesh, _)| meshes.get(mesh))
49 .flatten()
50 .map(|mesh| mesh.count_vertices())
51 .sum();
52
53 diagnostics.add_measurement(Self::VERTEX_COUNT, || vertex_count as f64);
54 }
55 }
56}