1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//! `<equality>` element AST.
/// One `<equality>` entry.
#[derive(Clone, Debug)]
pub enum Equality {
/// `<equality><connect>` — point-to-point constraint between two bodies.
Connect(EqualityConnect),
/// `<equality><weld>` — rigid attachment between two bodies.
Weld(EqualityWeld),
}
/// Common metadata shared by all equality variants.
#[derive(Clone, Debug, Default)]
pub struct EqualityCommon {
/// `name` attribute.
pub name: Option<String>,
/// Class.
pub class: Option<String>,
/// `active` attribute (default `true`).
pub active: bool,
}
/// `<equality><connect>` element.
#[derive(Clone, Debug, Default)]
pub struct EqualityConnect {
/// Common metadata.
pub common: EqualityCommon,
/// First body.
pub body1: String,
/// Second body. May be omitted (constrains to world).
pub body2: Option<String>,
/// Anchor in body1's frame.
pub anchor: [f64; 3],
}
/// `<equality><weld>` element.
#[derive(Clone, Debug, Default)]
pub struct EqualityWeld {
/// Common metadata.
pub common: EqualityCommon,
/// First body.
pub body1: String,
/// Second body. May be omitted (constrains to world).
pub body2: Option<String>,
/// Optional `relpose` attribute `(pos quat)`.
pub relpose: Option<crate::Pose>,
/// Optional anchor (`anchor="x y z"`).
pub anchor: Option<[f64; 3]>,
/// `torquescale` attribute.
pub torque_scale: f64,
}