refactor(node): defer setting client until adding to scenegraph
This commit is contained in:
@@ -27,6 +27,8 @@ impl Scenegraph {
|
||||
}
|
||||
|
||||
pub fn add_node(&self, node: Node) -> RcCell<Node> {
|
||||
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());
|
||||
|
||||
@@ -18,7 +18,7 @@ pub type Method = fn(&Node, Rc<Client>, &[u8]) -> Result<Vec<u8>>;
|
||||
|
||||
pub struct Node {
|
||||
uid: String,
|
||||
client: Weak<Client>,
|
||||
pub(crate) client: Weak<Client>,
|
||||
path: String,
|
||||
// trailing_slash_pos: usize,
|
||||
local_signals: HashMap<String, Signal, BuildHasherDefault<FxHasher>>,
|
||||
@@ -45,13 +45,13 @@ impl Node {
|
||||
self.destroyable
|
||||
}
|
||||
|
||||
pub fn create(client: Weak<Client>, 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(),
|
||||
|
||||
@@ -336,7 +336,7 @@ impl FieldTrait for SphereField {
|
||||
}
|
||||
|
||||
pub fn create_interface(client: Rc<Client>) {
|
||||
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<Client>) {
|
||||
pub fn create_box_field_flex(_node: &Node, calling_client: Rc<Client>, 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())
|
||||
|
||||
@@ -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<Client>) {
|
||||
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<Client>) {
|
||||
pub fn create_spatial_flex(_node: &Node, calling_client: Rc<Client>, 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())
|
||||
|
||||
Reference in New Issue
Block a user