fix(item): item destroy not sending correctly
This commit is contained in:
@@ -81,6 +81,18 @@ pub fn get_original(node: Arc<Node>, stop_on_disabled: bool) -> Option<Arc<Node>
|
|||||||
}
|
}
|
||||||
get_original(alias.original.upgrade()?, stop_on_disabled)
|
get_original(alias.original.upgrade()?, stop_on_disabled)
|
||||||
}
|
}
|
||||||
|
pub fn links_to(alias: Arc<Node>, original: Weak<Node>) -> bool {
|
||||||
|
let Ok(alias) = alias.get_aspect::<Alias>() 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)]
|
#[derive(Debug, Default, Clone)]
|
||||||
pub struct AliasList(Registry<Node>);
|
pub struct AliasList(Registry<Node>);
|
||||||
@@ -88,7 +100,13 @@ impl AliasList {
|
|||||||
fn add(&self, node: &Arc<Node>) {
|
fn add(&self, node: &Arc<Node>) {
|
||||||
self.0.add_raw(node);
|
self.0.add_raw(node);
|
||||||
}
|
}
|
||||||
pub fn get<A: Aspect>(&self, aspect: &A) -> Option<Arc<Node>> {
|
pub fn get_from_original_node(&self, original: Weak<Node>) -> Option<Arc<Node>> {
|
||||||
|
self.0
|
||||||
|
.get_valid_contents()
|
||||||
|
.into_iter()
|
||||||
|
.find(move |node| links_to(node.clone(), original.clone()))
|
||||||
|
}
|
||||||
|
pub fn get_from_aspect<A: Aspect>(&self, aspect: &A) -> Option<Arc<Node>> {
|
||||||
self.0.get_valid_contents().into_iter().find(|node| {
|
self.0.get_valid_contents().into_iter().find(|node| {
|
||||||
let Some(node) = get_original(node.clone(), false) else {
|
let Some(node) = get_original(node.clone(), false) else {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ impl InputMethod {
|
|||||||
let Some(tx_node) = self.spatial.node() else {
|
let Some(tx_node) = self.spatial.node() else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let Some(handler_alias) = self.handler_aliases.get(handler) else {
|
let Some(handler_alias) = self.handler_aliases.get_from_aspect(handler) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let _ = input_method_client::destroy_handler(&tx_node, handler_alias.id);
|
let _ = input_method_client::destroy_handler(&tx_node, handler_alias.id);
|
||||||
|
|||||||
@@ -161,13 +161,15 @@ pub fn process_input() {
|
|||||||
// Iterate over the distance links and send input to them
|
// Iterate over the distance links and send input to them
|
||||||
for (i, input_link) in input_links.into_iter().enumerate() {
|
for (i, input_link) in input_links.into_iter().enumerate() {
|
||||||
let handler = input_link.handler.spatial.node().unwrap();
|
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 (_, methods, datas) = handler_input.get_mut(&handler.id).unwrap();
|
||||||
|
|
||||||
let method_alias = input_link
|
let method_alias = input_link
|
||||||
.handler
|
.handler
|
||||||
.method_aliases
|
.method_aliases
|
||||||
.get(input_link.method.as_ref())
|
.get_from_aspect(input_link.method.as_ref())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
method_alias.set_enabled(true);
|
method_alias.set_enabled(true);
|
||||||
datas.push(input_link.serialize(
|
datas.push(input_link.serialize(
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ impl PartialEq for TypeInfo {
|
|||||||
impl Eq for TypeInfo {}
|
impl Eq for TypeInfo {}
|
||||||
|
|
||||||
pub struct Item {
|
pub struct Item {
|
||||||
node: Weak<Node>,
|
spatial: Arc<Spatial>,
|
||||||
type_info: &'static TypeInfo,
|
type_info: &'static TypeInfo,
|
||||||
captured_acceptor: Mutex<Weak<ItemAcceptor>>,
|
captured_acceptor: Mutex<Weak<ItemAcceptor>>,
|
||||||
pub specialization: ItemType,
|
pub specialization: ItemType,
|
||||||
@@ -74,7 +74,7 @@ impl Item {
|
|||||||
specialization: ItemType,
|
specialization: ItemType,
|
||||||
) -> Arc<Self> {
|
) -> Arc<Self> {
|
||||||
let item = Item {
|
let item = Item {
|
||||||
node: Arc::downgrade(node),
|
spatial: node.aspects.get::<Spatial>().unwrap(),
|
||||||
type_info,
|
type_info,
|
||||||
captured_acceptor: Default::default(),
|
captured_acceptor: Default::default(),
|
||||||
specialization,
|
specialization,
|
||||||
@@ -101,7 +101,7 @@ impl Item {
|
|||||||
}
|
}
|
||||||
fn make_alias(&self, client: &Arc<Client>, alias_list: &AliasList) -> Result<Arc<Node>> {
|
fn make_alias(&self, client: &Arc<Client>, alias_list: &AliasList) -> Result<Arc<Node>> {
|
||||||
Alias::create(
|
Alias::create(
|
||||||
&self.node.upgrade().unwrap(),
|
&self.spatial.node().unwrap(),
|
||||||
client,
|
client,
|
||||||
self.type_info.alias_info.clone() + ITEM_ASPECT_ALIAS_INFO.clone(),
|
self.type_info.alias_info.clone() + ITEM_ASPECT_ALIAS_INFO.clone(),
|
||||||
Some(alias_list),
|
Some(alias_list),
|
||||||
@@ -205,10 +205,10 @@ impl ItemUI {
|
|||||||
item.specialization.send_ui_item_created(&node, &item_alias);
|
item.specialization.send_ui_item_created(&node, &item_alias);
|
||||||
}
|
}
|
||||||
fn handle_capture_item(&self, item: &Item, acceptor: &ItemAcceptor) {
|
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;
|
return;
|
||||||
};
|
};
|
||||||
let Some(acceptor_alias) = self.acceptor_aliases.get(acceptor) else {
|
let Some(acceptor_alias) = self.acceptor_aliases.get_from_aspect(acceptor) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let _ = item_ui_client::capture_item(
|
let _ = item_ui_client::capture_item(
|
||||||
@@ -218,10 +218,10 @@ impl ItemUI {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
fn handle_release_item(&self, item: &Item, acceptor: &ItemAcceptor) {
|
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;
|
return;
|
||||||
};
|
};
|
||||||
let Some(acceptor_alias) = self.acceptor_aliases.get(acceptor) else {
|
let Some(acceptor_alias) = self.acceptor_aliases.get_from_aspect(acceptor) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let _ = item_ui_client::release_item(
|
let _ = item_ui_client::release_item(
|
||||||
@@ -231,7 +231,10 @@ impl ItemUI {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
fn handle_destroy_item(&self, item: &Item) {
|
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;
|
return;
|
||||||
};
|
};
|
||||||
let _ = item_ui_client::destroy_item(&self.node.upgrade().unwrap(), item_alias.id);
|
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);
|
(acceptor.type_info.new_acceptor_fn)(&node, &acceptor_alias, &acceptor_field_alias);
|
||||||
}
|
}
|
||||||
fn handle_destroy_acceptor(&self, acceptor: &ItemAcceptor) {
|
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);
|
let _ = item_ui_client::destroy_acceptor(&self.node.upgrade().unwrap(), acceptor_alias.id);
|
||||||
|
|
||||||
self.acceptor_aliases
|
self.acceptor_aliases
|
||||||
@@ -335,7 +338,7 @@ impl ItemAcceptor {
|
|||||||
let Some(node) = self.spatial.node() else {
|
let Some(node) = self.spatial.node() else {
|
||||||
return;
|
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);
|
let _ = item_acceptor_client::release_item(&node, alias.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ impl Transform {
|
|||||||
static ZONEABLE_REGISTRY: Registry<Spatial> = Registry::new();
|
static ZONEABLE_REGISTRY: Registry<Spatial> = Registry::new();
|
||||||
|
|
||||||
pub struct Spatial {
|
pub struct Spatial {
|
||||||
node: Weak<Node>,
|
pub node: Weak<Node>,
|
||||||
parent: Mutex<Option<Arc<Spatial>>>,
|
parent: Mutex<Option<Arc<Spatial>>>,
|
||||||
old_parent: Mutex<Option<Arc<Spatial>>>,
|
old_parent: Mutex<Option<Arc<Spatial>>>,
|
||||||
transform: Mutex<Mat4>,
|
transform: Mutex<Mat4>,
|
||||||
|
|||||||
Reference in New Issue
Block a user