From 651fa5f01244b693c39406832f680ab8b9fb5e7f Mon Sep 17 00:00:00 2001 From: Nova Date: Tue, 14 Jun 2022 18:18:22 -0400 Subject: [PATCH] refactor(node): defer setting client until adding to scenegraph --- src/core/scenegraph.rs | 2 ++ src/nodes/core.rs | 6 +++--- src/nodes/field.rs | 23 ++++------------------- src/nodes/spatial.rs | 10 ++-------- 4 files changed, 11 insertions(+), 30 deletions(-) diff --git a/src/core/scenegraph.rs b/src/core/scenegraph.rs index ae6443f..8859754 100644 --- a/src/core/scenegraph.rs +++ b/src/core/scenegraph.rs @@ -27,6 +27,8 @@ impl Scenegraph { } pub fn add_node(&self, node: Node) -> RcCell { + let mut node = node; + node.client = Rc::downgrade(&self.get_client()); let path = node.get_path().to_string(); let node_rc = RcCell::new(node); self.nodes.insert(path, node_rc.clone()); diff --git a/src/nodes/core.rs b/src/nodes/core.rs index 63b5219..799a3ac 100644 --- a/src/nodes/core.rs +++ b/src/nodes/core.rs @@ -18,7 +18,7 @@ pub type Method = fn(&Node, Rc, &[u8]) -> Result>; pub struct Node { uid: String, - client: Weak, + pub(crate) client: Weak, path: String, // trailing_slash_pos: usize, local_signals: HashMap>, @@ -45,13 +45,13 @@ impl Node { self.destroyable } - pub fn create(client: Weak, parent: &str, name: &str, destroyable: bool) -> Self { + pub fn create(parent: &str, name: &str, destroyable: bool) -> Self { let mut path = parent.to_string(); path.push('/'); path.push_str(name); let mut node = Node { uid: nanoid!(), - client, + client: Weak::new(), path, // trailing_slash_pos: parent.len(), local_signals: Default::default(), diff --git a/src/nodes/field.rs b/src/nodes/field.rs index 43d2a6f..e84a3b6 100644 --- a/src/nodes/field.rs +++ b/src/nodes/field.rs @@ -336,7 +336,7 @@ impl FieldTrait for SphereField { } pub fn create_interface(client: Rc) { - let mut node = Node::create(Rc::downgrade(&client), "", "field", false); + let mut node = Node::create("", "field", false); node.add_local_signal("createBoxField", create_box_field_flex); node.add_local_signal("createCylinderField", create_cylinder_field_flex); node.add_local_signal("createSphereField", create_sphere_field_flex); @@ -346,12 +346,7 @@ pub fn create_interface(client: Rc) { pub fn create_box_field_flex(_node: &Node, calling_client: Rc, data: &[u8]) -> Result<()> { let root = flexbuffers::Reader::get_root(data)?; let flex_vec = root.get_vector()?; - let node = Node::create( - Rc::downgrade(&calling_client), - "/field", - flex_vec.idx(0).get_str()?, - true, - ); + let node = Node::create("/field", flex_vec.idx(0).get_str()?, true); let parent = calling_client .get_scenegraph() .get_node(flex_vec.idx(1).as_str()) @@ -378,12 +373,7 @@ pub fn create_cylinder_field_flex( ) -> Result<()> { let root = flexbuffers::Reader::get_root(data)?; let flex_vec = root.get_vector()?; - let node = Node::create( - Rc::downgrade(&calling_client), - "/field", - flex_vec.idx(0).get_str()?, - true, - ); + let node = Node::create("/field", flex_vec.idx(0).get_str()?, true); let parent = calling_client .get_scenegraph() .get_node(flex_vec.idx(1).as_str()) @@ -411,12 +401,7 @@ pub fn create_sphere_field_flex( ) -> Result<()> { let root = flexbuffers::Reader::get_root(data)?; let flex_vec = root.get_vector()?; - let node = Node::create( - Rc::downgrade(&calling_client), - "/field", - flex_vec.idx(0).get_str()?, - true, - ); + let node = Node::create("/field", flex_vec.idx(0).get_str()?, true); let parent = calling_client .get_scenegraph() .get_node(flex_vec.idx(1).as_str()) diff --git a/src/nodes/spatial.rs b/src/nodes/spatial.rs index 702b96e..56f1ccb 100644 --- a/src/nodes/spatial.rs +++ b/src/nodes/spatial.rs @@ -7,7 +7,6 @@ use libstardustxr::push_to_vec; use libstardustxr::{flex_to_quat, flex_to_vec3}; use parking_lot::RwLock; use rccell::RcCell; -use std::cell::RefCell; use std::rc::Rc; use std::sync::Arc; @@ -158,7 +157,7 @@ impl Spatial { } pub fn create_interface(client: Rc) { - let mut node = Node::create(Rc::downgrade(&client), "", "spatial", false); + let mut node = Node::create("", "spatial", false); node.add_local_signal("createSpatial", create_spatial_flex); client.get_scenegraph().add_node(node); } @@ -166,12 +165,7 @@ pub fn create_interface(client: Rc) { pub fn create_spatial_flex(_node: &Node, calling_client: Rc, data: &[u8]) -> Result<()> { let root = flexbuffers::Reader::get_root(data)?; let flex_vec = root.get_vector()?; - let spatial = Node::create( - Rc::downgrade(&calling_client), - "/spatial/spatial", - flex_vec.idx(0).get_str()?, - true, - ); + let spatial = Node::create("/spatial/spatial", flex_vec.idx(0).get_str()?, true); let parent = calling_client .get_scenegraph() .get_node(flex_vec.idx(1).as_str())