1use nalgebra::SVector;
4use serde::{de::DeserializeOwned, Deserialize, Serialize};
5
6use crate::scalar::Scalar;
7
8use super::Behavior;
9
10#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
11#[serde(bound(
12 serialize = "X: Serialize",
13 deserialize = "X: DeserializeOwned"
14))]
15pub struct Obstacle2dParams<X: Scalar> {
16 pub shape: Shape2dParams<X>,
17 #[serde(default)]
18 pub offset: Offset2dParams<X>,
19 #[serde(default)]
20 pub behavior: Behavior,
21}
22
23#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
24#[serde(bound(
25 serialize = "X: Serialize",
26 deserialize = "X: DeserializeOwned"
27))]
28pub struct Offset2dParams<X: Scalar> {
29 pub translation: SVector<X, 2>,
30 pub angle: X,
31}
32
33impl<X: Scalar> Default for Offset2dParams<X> {
34 fn default() -> Self {
35 Self {
36 translation: SVector::zeros(),
37 angle: X::zero(),
38 }
39 }
40}
41
42#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
43#[serde(bound(
44 serialize = "X: Serialize",
45 deserialize = "X: DeserializeOwned"
46))]
47pub enum Shape2dParams<X: Scalar> {
48 Ball {
49 radius: X,
50 },
51 Capsule {
52 a: SVector<X, 2>,
53 b: SVector<X, 2>,
54 radius: X,
55 },
56 Compound {
57 shapes: Vec<(Offset2dParams<X>, Shape2dParams<X>)>,
58 },
59 RegularPolygon {
60 sides: u8,
61 scale: X,
62 },
63 ConvexPolygon {
64 points: Vec<SVector<X, 2>>,
65 },
66 Cuboid {
67 half_extents: SVector<X, 2>,
68 },
69 HalfSpace {
70 normal: SVector<X, 2>,
71 },
72 RoundRegularPolygon {
73 sides: u8,
74 scale: X,
75 border_radius: X,
76 },
77 RoundConvexPolygon {
78 points: Vec<SVector<X, 2>>,
79 border_radius: X,
80 },
81 RoundCuboid {
82 half_extents: SVector<X, 2>,
83 border_radius: X,
84 },
85 RoundTriangle {
86 a: SVector<X, 2>,
87 b: SVector<X, 2>,
88 c: SVector<X, 2>,
89 border_radius: X,
90 },
91 Segment {
92 a: SVector<X, 2>,
93 b: SVector<X, 2>,
94 },
95 Triangle {
96 a: SVector<X, 2>,
97 b: SVector<X, 2>,
98 c: SVector<X, 2>,
99 },
100}
101
102#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
103#[serde(bound(
104 serialize = "X: Serialize",
105 deserialize = "X: DeserializeOwned"
106))]
107pub struct Obstacle3dParams<X: Scalar> {
108 pub shape: Shape3dParams<X>,
109 #[serde(default)]
110 pub offset: Offset3dParams<X>,
111 #[serde(default)]
112 pub behavior: Behavior,
113}
114
115#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
116#[serde(bound(
117 serialize = "X: Serialize",
118 deserialize = "X: DeserializeOwned"
119))]
120pub struct Offset3dParams<X: Scalar> {
121 pub translation: SVector<X, 3>,
122 pub axis_angle: SVector<X, 3>,
123}
124
125impl<X: Scalar> Default for Offset3dParams<X> {
126 fn default() -> Self {
127 Self {
128 translation: SVector::zeros(),
129 axis_angle: SVector::zeros(),
130 }
131 }
132}
133
134#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
135#[serde(bound(
136 serialize = "X: Serialize",
137 deserialize = "X: DeserializeOwned"
138))]
139pub enum Shape3dParams<X: Scalar> {
140 Ball {
141 radius: X,
142 },
143 Capsule {
144 a: SVector<X, 3>,
145 b: SVector<X, 3>,
146 radius: X,
147 },
148 Compound {
149 shapes: Vec<(Offset3dParams<X>, Shape3dParams<X>)>,
150 },
151 ConvexPolyhedron {
152 points: Vec<SVector<X, 3>>,
153 },
154 Cone {
155 half_height: X,
156 radius: X,
157 },
158 Cuboid {
159 half_extents: SVector<X, 3>,
160 },
161 Cylinder {
162 half_height: X,
163 radius: X,
164 },
165 HalfSpace {
166 normal: SVector<X, 3>,
167 },
168 RoundCone {
169 half_height: X,
170 radius: X,
171 border_radius: X,
172 },
173 RoundConvexPolyhedron {
174 points: Vec<SVector<X, 3>>,
175 border_radius: X,
176 },
177 RoundCuboid {
178 half_extents: SVector<X, 3>,
179 border_radius: X,
180 },
181 RoundCylinder {
182 half_height: X,
183 radius: X,
184 border_radius: X,
185 },
186 RoundTriangle {
187 a: SVector<X, 3>,
188 b: SVector<X, 3>,
189 c: SVector<X, 3>,
190 border_radius: X,
191 },
192 Segment {
193 a: SVector<X, 3>,
194 b: SVector<X, 3>,
195 },
196 Triangle {
197 a: SVector<X, 3>,
198 b: SVector<X, 3>,
199 c: SVector<X, 3>,
200 },
201}