avian3d/dynamics/solver/
diagnostics.rs

1use bevy::{
2    diagnostic::DiagnosticPath,
3    prelude::{ReflectResource, Resource},
4    reflect::Reflect,
5};
6use core::time::Duration;
7
8use crate::diagnostics::{impl_diagnostic_paths, PhysicsDiagnostics};
9
10/// Diagnostics for the physics solver.
11#[derive(Resource, Debug, Default, Reflect)]
12#[reflect(Resource, Debug)]
13pub struct SolverDiagnostics {
14    /// Time spent integrating velocities.
15    pub integrate_velocities: Duration,
16    /// Time spent warm starting the solver.
17    pub warm_start: Duration,
18    /// Time spent solving constraints with bias.
19    pub solve_constraints: Duration,
20    /// Time spent integrating positions.
21    pub integrate_positions: Duration,
22    /// Time spent relaxing velocities.
23    pub relax_velocities: Duration,
24    /// Time spent applying restitution.
25    pub apply_restitution: Duration,
26    /// Time spent finalizing positions.
27    pub finalize: Duration,
28    /// Time spent storing impulses for warm starting.
29    pub store_impulses: Duration,
30    /// Time spent on swept CCD.
31    pub swept_ccd: Duration,
32    /// The number of contact constraints generated.
33    pub contact_constraint_count: u32,
34}
35
36impl PhysicsDiagnostics for SolverDiagnostics {
37    fn timer_paths(&self) -> Vec<(&'static DiagnosticPath, Duration)> {
38        vec![
39            (Self::INTEGRATE_VELOCITIES, self.integrate_velocities),
40            (Self::WARM_START, self.warm_start),
41            (Self::SOLVE_CONSTRAINTS, self.solve_constraints),
42            (Self::INTEGRATE_POSITIONS, self.integrate_positions),
43            (Self::RELAX_VELOCITIES, self.relax_velocities),
44            (Self::APPLY_RESTITUTION, self.apply_restitution),
45            (Self::FINALIZE, self.finalize),
46            (Self::STORE_IMPULSES, self.store_impulses),
47            (Self::SWEPT_CCD, self.swept_ccd),
48        ]
49    }
50
51    fn counter_paths(&self) -> Vec<(&'static DiagnosticPath, u32)> {
52        vec![(
53            Self::CONTACT_CONSTRAINT_COUNT,
54            self.contact_constraint_count,
55        )]
56    }
57}
58
59impl_diagnostic_paths! {
60    impl SolverDiagnostics {
61        INTEGRATE_VELOCITIES: "avian/solver/integrate_velocities",
62        WARM_START: "avian/solver/warm_start",
63        SOLVE_CONSTRAINTS: "avian/solver/solve_constraints",
64        INTEGRATE_POSITIONS: "avian/solver/integrate_positions",
65        RELAX_VELOCITIES: "avian/solver/relax_velocities",
66        APPLY_RESTITUTION: "avian/solver/apply_restitution",
67        FINALIZE: "avian/solver/finalize",
68        STORE_IMPULSES: "avian/solver/store_impulses",
69        SWEPT_CCD: "avian/solver/swept_ccd",
70        CONTACT_CONSTRAINT_COUNT: "avian/solver/contact_constraint_count",
71    }
72}