From 53979ce167520eee14325f55c7de08974c7c16dc Mon Sep 17 00:00:00 2001 From: Nova Date: Sat, 15 Jun 2024 13:58:36 -0400 Subject: [PATCH] fix(item): item destroy not sending correctly --- src/nodes/alias.rs | 20 +++++++++++++++++++- src/nodes/input/method.rs | 2 +- src/nodes/input/mod.rs | 6 ++++-- src/nodes/items/mod.rs | 23 +++++++++++++---------- src/nodes/spatial/mod.rs | 2 +- 5 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/nodes/alias.rs b/src/nodes/alias.rs index 009aeff..9ba9386 100644 --- a/src/nodes/alias.rs +++ b/src/nodes/alias.rs @@ -81,6 +81,18 @@ pub fn get_original(node: Arc, stop_on_disabled: bool) -> Option } get_original(alias.original.upgrade()?, stop_on_disabled) } +pub fn links_to(alias: Arc, original: Weak) -> bool { + let Ok(alias) = alias.get_aspect::() else { + return false; + }; + if alias.original.ptr_eq(&original) { + return true; + } + let Some(original_strong) = alias.original.upgrade() else { + return false; + }; + links_to(original_strong, original) +} #[derive(Debug, Default, Clone)] pub struct AliasList(Registry); @@ -88,7 +100,13 @@ impl AliasList { fn add(&self, node: &Arc) { self.0.add_raw(node); } - pub fn get(&self, aspect: &A) -> Option> { + pub fn get_from_original_node(&self, original: Weak) -> Option> { + self.0 + .get_valid_contents() + .into_iter() + .find(move |node| links_to(node.clone(), original.clone())) + } + pub fn get_from_aspect(&self, aspect: &A) -> Option> { self.0.get_valid_contents().into_iter().find(|node| { let Some(node) = get_original(node.clone(), false) else { return false; diff --git a/src/nodes/input/method.rs b/src/nodes/input/method.rs index 0feeffc..36a33b6 100644 --- a/src/nodes/input/method.rs +++ b/src/nodes/input/method.rs @@ -124,7 +124,7 @@ impl InputMethod { let Some(tx_node) = self.spatial.node() else { return; }; - let Some(handler_alias) = self.handler_aliases.get(handler) else { + let Some(handler_alias) = self.handler_aliases.get_from_aspect(handler) else { return; }; let _ = input_method_client::destroy_handler(&tx_node, handler_alias.id); diff --git a/src/nodes/input/mod.rs b/src/nodes/input/mod.rs index fc4f7fa..1423ad1 100644 --- a/src/nodes/input/mod.rs +++ b/src/nodes/input/mod.rs @@ -161,13 +161,15 @@ pub fn process_input() { // Iterate over the distance links and send input to them for (i, input_link) in input_links.into_iter().enumerate() { let handler = input_link.handler.spatial.node().unwrap(); - handler_input.entry(handler.id).or_insert_with(|| (handler.clone(), Vec::new(), Vec::new())); + handler_input + .entry(handler.id) + .or_insert_with(|| (handler.clone(), Vec::new(), Vec::new())); let (_, methods, datas) = handler_input.get_mut(&handler.id).unwrap(); let method_alias = input_link .handler .method_aliases - .get(input_link.method.as_ref()) + .get_from_aspect(input_link.method.as_ref()) .unwrap(); method_alias.set_enabled(true); datas.push(input_link.serialize( diff --git a/src/nodes/items/mod.rs b/src/nodes/items/mod.rs index afe4067..bc0f250 100644 --- a/src/nodes/items/mod.rs +++ b/src/nodes/items/mod.rs @@ -62,7 +62,7 @@ impl PartialEq for TypeInfo { impl Eq for TypeInfo {} pub struct Item { - node: Weak, + spatial: Arc, type_info: &'static TypeInfo, captured_acceptor: Mutex>, pub specialization: ItemType, @@ -74,7 +74,7 @@ impl Item { specialization: ItemType, ) -> Arc { let item = Item { - node: Arc::downgrade(node), + spatial: node.aspects.get::().unwrap(), type_info, captured_acceptor: Default::default(), specialization, @@ -101,7 +101,7 @@ impl Item { } fn make_alias(&self, client: &Arc, alias_list: &AliasList) -> Result> { Alias::create( - &self.node.upgrade().unwrap(), + &self.spatial.node().unwrap(), client, self.type_info.alias_info.clone() + ITEM_ASPECT_ALIAS_INFO.clone(), Some(alias_list), @@ -205,10 +205,10 @@ impl ItemUI { item.specialization.send_ui_item_created(&node, &item_alias); } fn handle_capture_item(&self, item: &Item, acceptor: &ItemAcceptor) { - let Some(item_alias) = self.item_aliases.get(item) else { + let Some(item_alias) = self.item_aliases.get_from_aspect(item) else { return; }; - let Some(acceptor_alias) = self.acceptor_aliases.get(acceptor) else { + let Some(acceptor_alias) = self.acceptor_aliases.get_from_aspect(acceptor) else { return; }; let _ = item_ui_client::capture_item( @@ -218,10 +218,10 @@ impl ItemUI { ); } fn handle_release_item(&self, item: &Item, acceptor: &ItemAcceptor) { - let Some(item_alias) = self.item_aliases.get(item) else { + let Some(item_alias) = self.item_aliases.get_from_aspect(item) else { return; }; - let Some(acceptor_alias) = self.acceptor_aliases.get(acceptor) else { + let Some(acceptor_alias) = self.acceptor_aliases.get_from_aspect(acceptor) else { return; }; let _ = item_ui_client::release_item( @@ -231,7 +231,10 @@ impl ItemUI { ); } fn handle_destroy_item(&self, item: &Item) { - let Some(item_alias) = self.item_aliases.get(item) else { + let Some(item_alias) = self + .item_aliases + .get_from_original_node(item.spatial.node.clone()) + else { return; }; let _ = item_ui_client::destroy_item(&self.node.upgrade().unwrap(), item_alias.id); @@ -272,7 +275,7 @@ impl ItemUI { (acceptor.type_info.new_acceptor_fn)(&node, &acceptor_alias, &acceptor_field_alias); } fn handle_destroy_acceptor(&self, acceptor: &ItemAcceptor) { - let acceptor_alias = self.acceptor_aliases.get(acceptor).unwrap(); + let acceptor_alias = self.acceptor_aliases.get_from_aspect(acceptor).unwrap(); let _ = item_ui_client::destroy_acceptor(&self.node.upgrade().unwrap(), acceptor_alias.id); self.acceptor_aliases @@ -335,7 +338,7 @@ impl ItemAcceptor { let Some(node) = self.spatial.node() else { return; }; - let alias = self.accepted_aliases.get(item).unwrap(); + let alias = self.accepted_aliases.get_from_aspect(item).unwrap(); let _ = item_acceptor_client::release_item(&node, alias.id); } } diff --git a/src/nodes/spatial/mod.rs b/src/nodes/spatial/mod.rs index c4bf206..726c2f3 100644 --- a/src/nodes/spatial/mod.rs +++ b/src/nodes/spatial/mod.rs @@ -40,7 +40,7 @@ impl Transform { static ZONEABLE_REGISTRY: Registry = Registry::new(); pub struct Spatial { - node: Weak, + pub node: Weak, parent: Mutex>>, old_parent: Mutex>>, transform: Mutex,