+trait BsAabb: Sized {
+ fn ser(&self) -> Self;
+ fn des(&self) -> Self;
+}
+
+impl BsAabb for Aabb3<f32> {
+ fn ser(&self) -> Self {
+ collision::Aabb::mul_s(self, BS)
+ }
+
+ fn des(&self) -> Self {
+ collision::Aabb::mul_s(self, BS)
+ }
+}
+
+impl<T: BsAabb> BsAabb for Vec<T> {
+ fn ser(&self) -> Self {
+ self.iter().map(BsAabb::ser).collect()
+ }
+
+ fn des(&self) -> Self {
+ self.iter().map(BsAabb::des).collect()
+ }
+}
+
+impl<T: BsAabb, const N: usize> BsAabb for [T; N] {
+ fn ser(&self) -> Self {
+ std::array::from_fn(|i| self[i].ser())
+ }
+
+ fn des(&self) -> Self {
+ std::array::from_fn(|i| self[i].des())
+ }
+}
+
+#[cfg(feature = "server")]
+fn ser_bs_aabb<T: BsAabb>(aabb: &T) -> Result<T, mt_ser::SerializeError> {
+ Ok(aabb.ser())
+}
+
+#[cfg(feature = "client")]
+fn des_bs_aabb<T: BsAabb>(aabb: T) -> Result<T, mt_ser::DeserializeError> {
+ Ok(aabb.des())
+}
+
+#[mt_derive(to = "clt")]
+pub struct MountedNodeBox {
+ #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")]
+ wall_top: Aabb3<f32>,
+ #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")]
+ wall_bottom: Aabb3<f32>,
+ #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")]
+ wall_sides: Aabb3<f32>,
+}
+
+#[mt_derive(to = "clt")]
+pub struct ConnectedNodeBox {
+ #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")]
+ fixed: Vec<Aabb3<f32>>,
+ #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")]
+ connect_dirs: [Vec<Aabb3<f32>>; 6],
+ #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")]
+ disconnect_dirs: [Vec<Aabb3<f32>>; 6],
+ #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")]
+ disconnect_all: Vec<Aabb3<f32>>,
+ #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")]
+ disconnect_sides: Vec<Aabb3<f32>>,
+}
+