1#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
13pub struct WorldId {
14 pub index1: u16,
15 pub generation: u16,
16}
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
20pub struct BodyId {
21 pub index1: i32,
22 pub world0: u16,
23 pub generation: u16,
24}
25
26#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
28pub struct ShapeId {
29 pub index1: i32,
30 pub world0: u16,
31 pub generation: u16,
32}
33
34#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
36pub struct ChainId {
37 pub index1: i32,
38 pub world0: u16,
39 pub generation: u16,
40}
41
42#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
44pub struct JointId {
45 pub index1: i32,
46 pub world0: u16,
47 pub generation: u16,
48}
49
50#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
52pub struct ContactId {
53 pub index1: i32,
54 pub world0: u16,
55 pub padding: i16,
56 pub generation: u32,
57}
58
59impl WorldId {
60 pub fn store(self) -> u32 {
62 ((self.index1 as u32) << 16) | (self.generation as u32)
63 }
64
65 pub fn load(x: u32) -> WorldId {
67 WorldId {
68 index1: (x >> 16) as u16,
69 generation: x as u16,
70 }
71 }
72
73 pub fn is_null(self) -> bool {
75 self.index1 == 0
76 }
77
78 pub fn is_non_null(self) -> bool {
80 self.index1 != 0
81 }
82}
83
84macro_rules! impl_u64_id {
87 ($ty:ident) => {
88 impl $ty {
89 pub fn store(self) -> u64 {
91 ((self.index1 as u64) << 32)
92 | ((self.world0 as u64) << 16)
93 | (self.generation as u64)
94 }
95
96 pub fn load(x: u64) -> $ty {
98 $ty {
99 index1: (x >> 32) as i32,
100 world0: (x >> 16) as u16,
101 generation: x as u16,
102 }
103 }
104
105 pub fn is_null(self) -> bool {
107 self.index1 == 0
108 }
109
110 pub fn is_non_null(self) -> bool {
112 self.index1 != 0
113 }
114 }
115 };
116}
117
118impl_u64_id!(BodyId);
119impl_u64_id!(ShapeId);
120impl_u64_id!(ChainId);
121impl_u64_id!(JointId);
122
123impl ContactId {
124 pub fn store(self) -> [u32; 3] {
126 [self.index1 as u32, self.world0 as u32, self.generation]
127 }
128
129 pub fn load(values: [u32; 3]) -> ContactId {
131 ContactId {
132 index1: values[0] as i32,
133 world0: values[1] as u16,
134 padding: 0,
135 generation: values[2],
136 }
137 }
138
139 pub fn is_null(self) -> bool {
141 self.index1 == 0
142 }
143
144 pub fn is_non_null(self) -> bool {
146 self.index1 != 0
147 }
148}