diff options
Diffstat (limited to 'shared/src/tree.rs')
-rw-r--r-- | shared/src/tree.rs | 45 |
1 files changed, 19 insertions, 26 deletions
diff --git a/shared/src/tree.rs b/shared/src/tree.rs index a0bbf43..72e4c24 100644 --- a/shared/src/tree.rs +++ b/shared/src/tree.rs @@ -22,9 +22,11 @@ use glam::Vec3A; use log::warn; use std::collections::{BTreeSet, HashMap}; +#[derive(Default)] pub struct SceneTree { pub objects: HashMap<Object, ObjectData>, } + pub struct ObjectData { pub pos: Vec3A, pub rot: Vec3A, @@ -33,13 +35,7 @@ pub struct ObjectData { pub pose: Vec<f32>, pub res: Resource<Prefab>, } -impl Default for SceneTree { - fn default() -> Self { - Self { - objects: Default::default(), - } - } -} + impl SceneTree { pub fn packet(&mut self, p: &Packet) { match p { @@ -50,13 +46,13 @@ impl SceneTree { self.remove_reparent(*object, &mut ()); } Packet::Position(object, pos, rot) => { - if let Some(o) = self.objects.get_mut(&object) { + if let Some(o) = self.objects.get_mut(object) { o.pos = *pos; o.rot = *rot; } } Packet::Pose(object, pose) => { - if let Some(o) = self.objects.get_mut(&object) { + if let Some(o) = self.objects.get_mut(object) { o.pose = pose.to_vec(); } } @@ -84,7 +80,7 @@ impl SceneTree { true } else { let parent = tree.objects[&o].parent; - if parent == o { + if parent == Object::ROOT { false } else { check_parent_loop(tree, parent, test) @@ -95,7 +91,7 @@ impl SceneTree { warn!("reparent of missing objects"); return; } - if check_parent_loop(&self, parent, child) { + if check_parent_loop(self, parent, child) { warn!("cyclic parenting prevented"); return; } @@ -131,22 +127,19 @@ impl SceneTree { } pub fn prime_client(&self) -> impl Iterator<Item = Packet> { - self.objects - .iter() - .map(|(object, data)| { - [ - Packet::Add(*object, data.res.clone()), - Packet::Parent(*object, data.parent), - Packet::Position(*object, data.pos, data.rot), - ] - .into_iter() - .chain(if data.pose.is_empty() { - None - } else { - Some(Packet::Pose(*object, data.pose.clone())) - }) + self.objects.iter().flat_map(|(object, data)| { + [ + Packet::Add(*object, data.res.clone()), + Packet::Parent(*object, data.parent), + Packet::Position(*object, data.pos, data.rot), + ] + .into_iter() + .chain(if data.pose.is_empty() { + None + } else { + Some(Packet::Pose(*object, data.pose.clone())) }) - .flatten() + }) } } |