diff --git a/src/nodes/core.rs b/src/nodes/core.rs index 482211b..b9eba5a 100644 --- a/src/nodes/core.rs +++ b/src/nodes/core.rs @@ -7,6 +7,8 @@ use std::{ vec::Vec, }; +use super::spatial::Spatial; + type Signal<'a> = dyn Fn(&[u8]) + 'a; type Method<'a> = dyn Fn(&[u8]) -> Vec + 'a; @@ -16,6 +18,8 @@ pub struct Node<'a> { pub messenger: Weak>, local_signals: HashMap>>, local_methods: HashMap>>, + + pub spatial: Option>, } impl<'a> Node<'a> { @@ -26,17 +30,28 @@ impl<'a> Node<'a> { self.path.as_str() } - pub fn from_path(client: &Client<'a>, path: &str) -> Result> { + pub fn from_path(client: Option<&Client<'a>>, path: &str) -> Result> { ensure!(path.starts_with('/'), "Invalid path {}", path); + let mut weak_messenger = Weak::default(); + if client.is_some() { + weak_messenger = client.unwrap().get_weak_messenger(); + } let node = Node { path: path.to_string(), trailing_slash_pos: path.rfind('/').ok_or(anyhow!("Invalid path {}", path))?, - messenger: client.get_weak_messenger(), + messenger: weak_messenger, local_signals: HashMap::new(), local_methods: HashMap::new(), + + spatial: None, }; let node_ref = Rc::new(node); - client.scenegraph.add_node(Rc::downgrade(&node_ref)); + if client.is_some() { + client + .unwrap() + .scenegraph + .add_node(Rc::downgrade(&node_ref)); + } Ok(node_ref) } diff --git a/src/nodes/mod.rs b/src/nodes/mod.rs index 5a7ca06..e2d5055 100644 --- a/src/nodes/mod.rs +++ b/src/nodes/mod.rs @@ -1 +1,2 @@ pub mod core; +pub mod spatial; diff --git a/src/nodes/spatial.rs b/src/nodes/spatial.rs index e69de29..07dc008 100644 --- a/src/nodes/spatial.rs +++ b/src/nodes/spatial.rs @@ -0,0 +1,11 @@ +use super::core::Node; + +pub struct Spatial<'a> { + node: &'a Node<'a>, +} + +impl<'a> Spatial<'a> { + pub fn new(node: &'a Node<'a>) -> Self { + Spatial { node } + } +}