use crate::packets::{Object, Packet, Resource}; use glam::Vec3; use std::collections::HashMap; pub struct SceneTree { objects: HashMap, } struct ObjectData { pos: Vec3, rot: Vec3, parent: Object, pose: Vec, 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 { 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() } }