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}