Skip to main content

dynamis_model/
config.rs

1#[derive(Clone, Copy, Debug, PartialEq, Eq)]
2pub enum MaterialCombine {
3    Multiply,
4    Min,
5    Max,
6    Average,
7}
8
9#[derive(Clone, Copy)]
10pub struct PhysicsConfig {
11    pub gravity: [f32; 3],
12    pub damping: f32,
13    pub angular_damping: f32,
14    pub substeps: u32,
15    pub solve_iterations: u32,
16    pub position_iterations: u32,
17    pub soft_substeps: u32,
18    pub soft_iterations: u32,
19    pub relaxation: f32,
20    pub slop: f32,
21    pub contact_margin: f32,
22    pub restitution_threshold: f32,
23    pub max_velocity: f32,
24    pub max_angular_velocity: f32,
25    pub sleep_velocity: f32,
26    pub sleep_angular_velocity: f32,
27    pub sleep_time: f32,
28    pub settle_velocity: f32,
29    pub friction_combine: MaterialCombine,
30    pub restitution_combine: MaterialCombine,
31}
32
33impl PhysicsConfig {
34    pub fn assert_valid(&self) {
35        assert!(
36            self.contact_margin >= 0.0,
37            "contact margin must be non-negative"
38        );
39        assert!(
40            self.substeps > 0,
41            "rigid substeps must be strictly positive"
42        );
43        assert!(
44            self.solve_iterations > 0,
45            "solve iterations must be strictly positive"
46        );
47        assert!(
48            self.position_iterations > 0,
49            "position iterations must be strictly positive"
50        );
51        assert!(
52            self.soft_iterations > 0,
53            "soft iterations must be strictly positive"
54        );
55        assert!(
56            self.soft_substeps > 0,
57            "soft substeps must be strictly positive"
58        );
59        assert!(
60            self.settle_velocity >= 0.0,
61            "the soft settle velocity must be non-negative"
62        );
63        assert!(
64            (0.0..=1.0).contains(&self.relaxation),
65            "position relaxation must be within (0, 1]"
66        );
67    }
68}
69
70impl Default for PhysicsConfig {
71    fn default() -> Self {
72        Self {
73            gravity: [0.0, -9.81, 0.0],
74            damping: 0.05,
75            angular_damping: 0.05,
76            substeps: 2,
77            solve_iterations: 8,
78            position_iterations: 10,
79            soft_substeps: 4,
80            soft_iterations: 1,
81            relaxation: 0.8,
82            slop: 0.005,
83            contact_margin: 0.02,
84            restitution_threshold: 1.0,
85            max_velocity: 200.0,
86            max_angular_velocity: 400.0,
87            sleep_velocity: 0.2,
88            sleep_angular_velocity: 0.5,
89            sleep_time: 0.5,
90            settle_velocity: 1.0e-4,
91            friction_combine: MaterialCombine::Multiply,
92            restitution_combine: MaterialCombine::Max,
93        }
94    }
95}