avian3d/dynamics/solver/
diagnostics.rsuse bevy::{
diagnostic::DiagnosticPath,
prelude::{ReflectResource, Resource},
reflect::Reflect,
};
use core::time::Duration;
use crate::diagnostics::{impl_diagnostic_paths, PhysicsDiagnostics};
#[derive(Resource, Debug, Default, Reflect)]
#[reflect(Resource, Debug)]
pub struct SolverDiagnostics {
pub integrate_velocities: Duration,
pub warm_start: Duration,
pub solve_constraints: Duration,
pub integrate_positions: Duration,
pub relax_velocities: Duration,
pub apply_restitution: Duration,
pub finalize: Duration,
pub store_impulses: Duration,
pub swept_ccd: Duration,
pub contact_constraint_count: u32,
}
impl PhysicsDiagnostics for SolverDiagnostics {
fn timer_paths(&self) -> Vec<(&'static DiagnosticPath, Duration)> {
vec![
(Self::INTEGRATE_VELOCITIES, self.integrate_velocities),
(Self::WARM_START, self.warm_start),
(Self::SOLVE_CONSTRAINTS, self.solve_constraints),
(Self::INTEGRATE_POSITIONS, self.integrate_positions),
(Self::RELAX_VELOCITIES, self.relax_velocities),
(Self::APPLY_RESTITUTION, self.apply_restitution),
(Self::FINALIZE, self.finalize),
(Self::STORE_IMPULSES, self.store_impulses),
(Self::SWEPT_CCD, self.swept_ccd),
]
}
fn counter_paths(&self) -> Vec<(&'static DiagnosticPath, u32)> {
vec![(
Self::CONTACT_CONSTRAINT_COUNT,
self.contact_constraint_count,
)]
}
}
impl_diagnostic_paths! {
impl SolverDiagnostics {
INTEGRATE_VELOCITIES: "avian/solver/integrate_velocities",
WARM_START: "avian/solver/warm_start",
SOLVE_CONSTRAINTS: "avian/solver/solve_constraints",
INTEGRATE_POSITIONS: "avian/solver/integrate_positions",
RELAX_VELOCITIES: "avian/solver/relax_velocities",
APPLY_RESTITUTION: "avian/solver/apply_restitution",
FINALIZE: "avian/solver/finalize",
STORE_IMPULSES: "avian/solver/store_impulses",
SWEPT_CCD: "avian/solver/swept_ccd",
CONTACT_CONSTRAINT_COUNT: "avian/solver/contact_constraint_count",
}
}