summaryrefslogtreecommitdiff
path: root/shared/src/tree.rs
diff options
context:
space:
mode:
Diffstat (limited to 'shared/src/tree.rs')
-rw-r--r--shared/src/tree.rs45
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()
+ })
}
}