diff --git a/src/core/mod.rs b/src/core/mod.rs index 3ca7e83..b7cfb28 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -1,7 +1,7 @@ pub mod client; pub mod destroy_queue; pub mod eventloop; -pub mod nodelist; +pub mod node_collections; pub mod registry; pub mod resource; pub mod scenegraph; diff --git a/src/core/node_collections.rs b/src/core/node_collections.rs new file mode 100644 index 0000000..95f04e2 --- /dev/null +++ b/src/core/node_collections.rs @@ -0,0 +1,66 @@ +use crate::nodes::Node; +use parking_lot::Mutex; +use rustc_hash::FxHashMap; +use std::{ + hash::Hash, + sync::{Arc, Weak}, +}; + +#[derive(Default)] +pub struct LifeLinkedNodeList { + nodes: Mutex>>, +} +impl LifeLinkedNodeList { + pub fn add(&self, node: Weak) { + self.nodes.lock().push(node); + } + + pub fn clear(&self) { + self.nodes + .lock() + .iter() + .filter_map(|node| node.upgrade()) + .for_each(|node| { + node.destroy(); + }); + self.nodes.lock().clear(); + } +} +impl Drop for LifeLinkedNodeList { + fn drop(&mut self) { + self.clear(); + } +} + +#[derive(Default)] +pub struct LifeLinkedNodeMap { + nodes: Mutex>>, +} +#[allow(dead_code)] +impl LifeLinkedNodeMap { + pub fn add(&self, key: K, node: &Arc) { + self.nodes.lock().insert(key, Arc::downgrade(node)); + } + pub fn get(&self, key: &K) -> Option> { + self.nodes.lock().get(key).and_then(|n| n.upgrade()) + } + pub fn remove(&self, key: &K) -> Option> { + self.nodes.lock().remove(key).and_then(|n| n.upgrade()) + } + + pub fn clear(&self) { + let mut nodes = self.nodes.lock(); + nodes + .values() + .filter_map(|node| node.upgrade()) + .for_each(|node| { + node.destroy(); + }); + nodes.clear(); + } +} +impl Drop for LifeLinkedNodeMap { + fn drop(&mut self) { + self.clear(); + } +} diff --git a/src/core/nodelist.rs b/src/core/nodelist.rs deleted file mode 100644 index 988c828..0000000 --- a/src/core/nodelist.rs +++ /dev/null @@ -1,29 +0,0 @@ -use crate::nodes::Node; -use parking_lot::Mutex; -use std::sync::Weak; - -#[derive(Default)] -pub struct LifeLinkedNodeList { - nodes: Mutex>>, -} -impl LifeLinkedNodeList { - pub fn add(&self, node: Weak) { - self.nodes.lock().push(node); - } - - pub fn clear(&self) { - self.nodes - .lock() - .iter() - .filter_map(|node| node.upgrade()) - .for_each(|node| { - node.destroy(); - }); - self.nodes.lock().clear(); - } -} -impl Drop for LifeLinkedNodeList { - fn drop(&mut self) { - self.clear(); - } -} diff --git a/src/nodes/alias.rs b/src/nodes/alias.rs index 69d9088..7211347 100644 --- a/src/nodes/alias.rs +++ b/src/nodes/alias.rs @@ -18,7 +18,7 @@ pub struct Alias { pub info: AliasInfo, } impl Alias { - pub fn new( + pub fn create( client: &Arc, parent: &str, name: &str, diff --git a/src/nodes/fields/mod.rs b/src/nodes/fields/mod.rs index b4df14c..7fe3e2d 100644 --- a/src/nodes/fields/mod.rs +++ b/src/nodes/fields/mod.rs @@ -206,7 +206,7 @@ pub fn ray_march(ray: Ray, field: &Field) -> RayMarchResult { } pub fn find_field(client: &Client, path: &str) -> Result> { - Ok(client + client .get_node("Field", path)? - .get_aspect("Field", "info", |n| &n.field)?) + .get_aspect("Field", "info", |n| &n.field) } diff --git a/src/nodes/hmd.rs b/src/nodes/hmd.rs index 9efb6f0..7245059 100644 --- a/src/nodes/hmd.rs +++ b/src/nodes/hmd.rs @@ -29,7 +29,7 @@ pub fn frame(sk: &StereoKit) { } pub fn make_alias(client: &Arc) -> Arc { - Alias::new( + Alias::create( client, "", "hmd", diff --git a/src/nodes/items/mod.rs b/src/nodes/items/mod.rs index ce82e68..1fbe2a6 100644 --- a/src/nodes/items/mod.rs +++ b/src/nodes/items/mod.rs @@ -5,7 +5,7 @@ use super::fields::Field; use super::spatial::{find_spatial_parent, parse_transform, Spatial}; use super::{Alias, Node}; use crate::core::client::{Client, INTERNAL_CLIENT}; -use crate::core::nodelist::LifeLinkedNodeList; +use crate::core::node_collections::LifeLinkedNodeList; use crate::core::registry::Registry; use crate::nodes::alias::AliasInfo; use crate::nodes::fields::find_field; @@ -121,7 +121,7 @@ impl Item { item } fn make_alias(&self, client: &Arc, parent: &str) -> (Arc, Arc) { - let node = Alias::new( + let node = Alias::create( client, parent, &self.uid, @@ -273,7 +273,7 @@ impl ItemAcceptor { fn make_aliases(&self, client: &Arc, parent: &str) -> Vec> { let mut aliases = Vec::new(); let acceptor_node = &self.node.upgrade().unwrap(); - let acceptor_alias = Alias::new( + let acceptor_alias = Alias::create( client, parent, acceptor_node.uid.as_str(), @@ -284,7 +284,7 @@ impl ItemAcceptor { }, ); if let Some(field) = self.field.lock().upgrade() { - let acceptor_field_alias = Alias::new( + let acceptor_field_alias = Alias::create( client, acceptor_alias.get_path(), "field", diff --git a/src/nodes/spatial/mod.rs b/src/nodes/spatial/mod.rs index 8dbe8ab..97a5cf4 100644 --- a/src/nodes/spatial/mod.rs +++ b/src/nodes/spatial/mod.rs @@ -18,7 +18,7 @@ use std::sync::{Arc, Weak}; static ZONEABLE_REGISTRY: Registry = Registry::new(); pub struct Spatial { - pub(self) uid: String, + uid: String, pub(super) node: Weak, parent: Mutex>>, pub(self) old_parent: Mutex>>, @@ -296,10 +296,9 @@ pub fn find_spatial( node_name: &'static str, node_path: &str, ) -> anyhow::Result> { - Ok(calling_client + calling_client .get_node(node_name, node_path)? - .get_aspect(node_name, "spatial", |n| &n.spatial)? - .clone()) + .get_aspect(node_name, "spatial", |n| &n.spatial) } pub fn find_spatial_parent( calling_client: &Arc, diff --git a/src/nodes/spatial/zone.rs b/src/nodes/spatial/zone.rs index 2b14ea9..b7dd768 100644 --- a/src/nodes/spatial/zone.rs +++ b/src/nodes/spatial/zone.rs @@ -111,7 +111,7 @@ impl Zone { self_zone_distance < 0.0 && spatial_zone_distance > self_zone_distance }) .map(|zoneable| { - let alias = Alias::new( + let alias = Alias::create( &zone_client, zone_node.get_path(), &zoneable.uid,