blade/
config.rs

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}