avian3d/diagnostics/
entity_counters.rsuse bevy::{diagnostic::DiagnosticPath, prelude::*};
use crate::{
dynamics::solver::joints::*, ColliderMarker, PhysicsSchedule, PhysicsStepSet, RigidBody,
};
use super::{impl_diagnostic_paths, AppDiagnosticsExt, PhysicsDiagnostics};
pub struct PhysicsEntityDiagnosticsPlugin;
impl Plugin for PhysicsEntityDiagnosticsPlugin {
fn build(&self, app: &mut App) {
app.register_physics_diagnostics::<PhysicsEntityDiagnostics>();
app.add_systems(
PhysicsSchedule,
diagnostic_entity_counts.in_set(PhysicsStepSet::First),
);
}
}
#[derive(Resource, Debug, Default, Reflect)]
#[reflect(Resource, Debug)]
pub struct PhysicsEntityDiagnostics {
pub dynamic_body_count: u32,
pub kinematic_body_count: u32,
pub static_body_count: u32,
pub collider_count: u32,
pub joint_count: u32,
}
impl PhysicsDiagnostics for PhysicsEntityDiagnostics {
fn counter_paths(&self) -> Vec<(&'static DiagnosticPath, u32)> {
vec![
(Self::DYNAMIC_BODY_COUNT, self.dynamic_body_count),
(Self::KINEMATIC_BODY_COUNT, self.kinematic_body_count),
(Self::STATIC_BODY_COUNT, self.static_body_count),
(Self::COLLIDER_COUNT, self.collider_count),
(Self::JOINT_COUNT, self.joint_count),
]
}
}
impl_diagnostic_paths! {
impl PhysicsEntityDiagnostics {
DYNAMIC_BODY_COUNT: "avian/entity_count/dynamic_bodies",
KINEMATIC_BODY_COUNT: "avian/entity_count/kinematic_bodies",
STATIC_BODY_COUNT: "avian/entity_count/static_bodies",
COLLIDER_COUNT: "avian/entity_count/colliders",
JOINT_COUNT: "avian/entity_count/joints",
}
}
fn diagnostic_entity_counts(
rigid_bodies_query: Query<&RigidBody>,
colliders_query: Query<&ColliderMarker>,
fixed_joint_query: Query<&FixedJoint>,
prismatic_joint_query: Query<&PrismaticJoint>,
distance_joint_query: Query<&DistanceJoint>,
revolute_joint_query: Query<&RevoluteJoint>,
#[cfg(feature = "3d")] spherical_joint_query: Query<&SphericalJoint>,
mut diagnostics: ResMut<PhysicsEntityDiagnostics>,
) {
diagnostics.dynamic_body_count = rigid_bodies_query
.iter()
.filter(|rb| rb.is_dynamic())
.count() as u32;
diagnostics.kinematic_body_count = rigid_bodies_query
.iter()
.filter(|rb| rb.is_kinematic())
.count() as u32;
diagnostics.static_body_count = rigid_bodies_query
.iter()
.filter(|rb| rb.is_static())
.count() as u32;
diagnostics.collider_count = colliders_query.iter().count() as u32;
diagnostics.joint_count = fixed_joint_query.iter().count() as u32
+ prismatic_joint_query.iter().count() as u32
+ distance_joint_query.iter().count() as u32
+ revolute_joint_query.iter().count() as u32;
#[cfg(feature = "3d")]
{
diagnostics.joint_count += spherical_joint_query.iter().count() as u32;
}
}