1#[derive(serde::Deserialize)]
2pub enum FrontFace {
3 Cw,
4 Ccw,
5}
6impl Default for FrontFace {
7 fn default() -> Self {
8 Self::Ccw
9 }
10}
11
12fn default_vec() -> mint::Vector3<f32> {
13 [0.0; 3].into()
14}
15fn default_scale() -> f32 {
16 1.0
17}
18
19#[derive(serde::Deserialize)]
20pub struct Visual {
21 pub model: String,
22 #[serde(default)]
23 pub front_face: FrontFace,
24 #[serde(default = "default_vec")]
25 pub pos: mint::Vector3<f32>,
26 #[serde(default = "default_vec")]
27 pub rot: mint::Vector3<f32>,
28 #[serde(default = "default_scale")]
29 pub scale: f32,
30}
31impl Default for Visual {
32 fn default() -> Self {
33 Self {
34 model: String::new(),
35 front_face: FrontFace::default(),
36 pos: default_vec(),
37 rot: default_vec(),
38 scale: default_scale(),
39 }
40 }
41}
42
43#[derive(serde::Deserialize)]
44pub enum Shape {
45 Ball {
46 radius: f32,
47 },
48 Cylinder {
49 half_height: f32,
50 radius: f32,
51 },
52 Cuboid {
53 half: mint::Vector3<f32>,
54 },
55 ConvexHull {
56 points: Vec<mint::Vector3<f32>>,
57 #[serde(default)]
58 border_radius: f32,
59 },
60 TriMesh {
61 model: String,
62 #[serde(default)]
63 convex: bool,
64 #[serde(default)]
65 border_radius: f32,
66 },
67}
68
69fn default_friction() -> f32 {
70 1.0
71}
72fn default_restitution() -> f32 {
73 0.0
74}
75
76#[derive(serde::Deserialize)]
77pub struct Collider {
78 pub density: f32,
79 pub shape: Shape,
80 #[serde(default = "default_friction")]
81 pub friction: f32,
82 #[serde(default = "default_restitution")]
83 pub restitution: f32,
84 #[serde(default = "default_vec")]
85 pub pos: mint::Vector3<f32>,
86 #[serde(default = "default_vec")]
87 pub rot: mint::Vector3<f32>,
88}
89
90#[derive(serde::Deserialize)]
91pub struct AdditionalMass {
92 pub density: f32,
93 pub shape: Shape,
94}
95
96#[derive(serde::Deserialize)]
97pub struct Object {
98 pub name: String,
99 pub visuals: Vec<Visual>,
100 pub colliders: Vec<Collider>,
101 #[serde(default)]
102 pub additional_mass: Option<AdditionalMass>,
103}
104
105#[derive(Clone, Copy, Debug, Default, PartialEq, serde::Deserialize)]
106pub struct Motor {
107 pub stiffness: f32,
108 pub damping: f32,
109 pub max_force: f32,
110}
111
112fn default_time_step() -> f32 {
113 0.01
114}
115
116#[derive(serde::Deserialize)]
117pub struct Engine {
118 pub shader_path: String,
119 pub data_path: String,
120 #[serde(default = "default_time_step")]
121 pub time_step: f32,
122}