diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-04 22:52:42 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-04 22:52:42 +0100 |
commit | 2707f03617478e2a5e521961c46c9c6511d5088d (patch) | |
tree | a3516660f36614b006ea44eecf92bb4ff709fa3b /shared/src/tree.rs | |
parent | 2c1d8fdfd65ceb9361114f0105c23ff6a94bac2e (diff) | |
download | weareserver-2707f03617478e2a5e521961c46c9c6511d5088d.tar weareserver-2707f03617478e2a5e521961c46c9c6511d5088d.tar.bz2 weareserver-2707f03617478e2a5e521961c46c9c6511d5088d.tar.zst |
a
Diffstat (limited to 'shared/src/tree.rs')
-rw-r--r-- | shared/src/tree.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/shared/src/tree.rs b/shared/src/tree.rs new file mode 100644 index 0000000..fce6f8a --- /dev/null +++ b/shared/src/tree.rs @@ -0,0 +1,70 @@ +use crate::packets::{Object, Packet, Resource}; +use glam::Vec3; +use std::collections::HashMap; + +pub struct SceneTree { + objects: HashMap<Object, ObjectData>, +} +struct ObjectData { + pos: Vec3, + rot: Vec3, + parent: Object, + pose: Vec<f32>, + res: Resource, +} +impl Default for SceneTree { + fn default() -> Self { + Self { + objects: Default::default(), + } + } +} +impl SceneTree { + pub fn update(&mut self, p: &Packet) { + match p { + Packet::Add(object, res) => { + self.objects.insert(*object, ObjectData { + parent: Object(0), + pos: Vec3::ZERO, + rot: Vec3::ZERO, + pose: Vec::new(), + res: *res, + }); + } + Packet::Remove(object) => { + self.objects.remove(&object); + } + Packet::Position(object, pos, rot) => { + 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) { + o.pose = pose.to_vec(); + } + } + Packet::Parent(parent, child) => { + if let Some(o) = self.objects.get_mut(&parent) { + o.parent = *child + } + } + _ => (), + } + } + + pub fn prime_client(&self) -> impl Iterator<Item = Packet> { + self.objects + .iter() + .map(|(object, data)| { + [ + Packet::Add(*object, data.res), + Packet::Parent(*object, data.parent), + Packet::Position(*object, data.pos, data.rot), + Packet::Pose(*object, data.pose.clone()), + ] + }) + .flatten() + } +} |