refactor(alias): new fn
This commit is contained in:
@@ -1,35 +1,38 @@
|
||||
use crate::core::client::Client;
|
||||
|
||||
use super::Node;
|
||||
use std::sync::{Arc, Weak};
|
||||
|
||||
#[derive(Debug, Default, Clone)]
|
||||
pub struct AliasInfo {
|
||||
pub(super) local_signals: Vec<&'static str>,
|
||||
pub(super) local_methods: Vec<&'static str>,
|
||||
pub(super) remote_signals: Vec<&'static str>,
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub struct Alias {
|
||||
pub(super) node: Weak<Node>,
|
||||
pub original: Weak<Node>,
|
||||
|
||||
pub(super) local_signals: Vec<&'static str>,
|
||||
pub(super) local_methods: Vec<&'static str>,
|
||||
pub(super) remote_signals: Vec<&'static str>,
|
||||
pub(super) remote_methods: Vec<&'static str>,
|
||||
pub info: AliasInfo,
|
||||
}
|
||||
impl Alias {
|
||||
pub fn add_to(
|
||||
node: &Arc<Node>,
|
||||
pub fn new(
|
||||
client: &Arc<Client>,
|
||||
parent: &str,
|
||||
name: &str,
|
||||
original: &Arc<Node>,
|
||||
local_signals: Vec<&'static str>,
|
||||
local_methods: Vec<&'static str>,
|
||||
remote_signals: Vec<&'static str>,
|
||||
remote_methods: Vec<&'static str>,
|
||||
) -> Arc<Alias> {
|
||||
info: AliasInfo,
|
||||
) -> Arc<Node> {
|
||||
let node = Node::create(client, parent, name, true).add_to_scenegraph();
|
||||
let alias = Alias {
|
||||
node: Arc::downgrade(node),
|
||||
node: Arc::downgrade(&node),
|
||||
original: Arc::downgrade(original),
|
||||
local_signals,
|
||||
local_methods,
|
||||
remote_signals,
|
||||
remote_methods,
|
||||
info,
|
||||
};
|
||||
let alias = original.aliases.add(alias);
|
||||
let _ = node.alias.set(alias.clone());
|
||||
alias
|
||||
let _ = node.alias.set(alias);
|
||||
node
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
use super::alias::AliasInfo;
|
||||
use super::fields::Field;
|
||||
use super::spatial::{parse_transform, Spatial};
|
||||
use super::{Alias, Node};
|
||||
@@ -128,20 +129,15 @@ impl PulseSender {
|
||||
let uids: Vec<String> = distance_sorted_receivers
|
||||
.into_iter()
|
||||
.map(|(_, receiver)| {
|
||||
let receiver_alias = Node::create(
|
||||
let receiver_alias = Alias::new(
|
||||
&calling_client,
|
||||
node.get_path(),
|
||||
receiver.uid.as_str(),
|
||||
false,
|
||||
)
|
||||
.add_to_scenegraph();
|
||||
Alias::add_to(
|
||||
&receiver_alias,
|
||||
receiver.node.upgrade().as_ref().unwrap(),
|
||||
vec![],
|
||||
vec!["sendData"],
|
||||
vec![],
|
||||
vec![],
|
||||
AliasInfo {
|
||||
local_methods: vec!["sendData"],
|
||||
..Default::default()
|
||||
},
|
||||
);
|
||||
sender.aliases.add(Arc::downgrade(&receiver_alias));
|
||||
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
use super::{alias::Alias, spatial::Spatial, Node};
|
||||
use crate::core::client::{Client, INTERNAL_CLIENT};
|
||||
use crate::{
|
||||
core::client::{Client, INTERNAL_CLIENT},
|
||||
nodes::alias::AliasInfo,
|
||||
};
|
||||
use glam::{vec3, Mat4};
|
||||
use std::sync::Arc;
|
||||
use stereokit::StereoKit;
|
||||
@@ -26,7 +29,14 @@ pub fn frame(sk: &StereoKit) {
|
||||
}
|
||||
|
||||
pub fn make_alias(client: &Arc<Client>) -> Arc<Node> {
|
||||
let node = Node::create(client, "", "hmd", false).add_to_scenegraph();
|
||||
Alias::add_to(&node, &HMD, vec!["getTransform"], vec![], vec![], vec![]);
|
||||
node
|
||||
Alias::new(
|
||||
client,
|
||||
"",
|
||||
"hmd",
|
||||
&HMD,
|
||||
AliasInfo {
|
||||
local_signals: vec!["getTransform"],
|
||||
..Default::default()
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ use super::{Alias, Node};
|
||||
use crate::core::client::{Client, INTERNAL_CLIENT};
|
||||
use crate::core::nodelist::LifeLinkedNodeList;
|
||||
use crate::core::registry::Registry;
|
||||
use crate::nodes::alias::AliasInfo;
|
||||
use crate::nodes::fields::find_field;
|
||||
use crate::wayland::panel_item::{register_panel_item_ui_flex, PanelItem};
|
||||
use anyhow::{anyhow, ensure, Result};
|
||||
@@ -120,31 +121,30 @@ impl Item {
|
||||
item
|
||||
}
|
||||
fn make_alias(&self, client: &Arc<Client>, parent: &str) -> (Arc<Node>, Arc<Alias>) {
|
||||
let node = Node::create(client, parent, &self.uid, true).add_to_scenegraph();
|
||||
let alias = Alias::add_to(
|
||||
&node,
|
||||
let node = Alias::new(
|
||||
client,
|
||||
parent,
|
||||
&self.uid,
|
||||
&self.node.upgrade().unwrap(),
|
||||
[
|
||||
&self.type_info.aliased_local_signals,
|
||||
ITEM_ALIAS_LOCAL_SIGNALS.as_slice(),
|
||||
]
|
||||
.concat(),
|
||||
[
|
||||
&self.type_info.aliased_local_methods,
|
||||
ITEM_ALIAS_LOCAL_METHODS.as_slice(),
|
||||
]
|
||||
.concat(),
|
||||
[
|
||||
&self.type_info.aliased_remote_signals,
|
||||
ITEM_ALIAS_REMOTE_SIGNALS.as_slice(),
|
||||
]
|
||||
.concat(),
|
||||
[
|
||||
&self.type_info.aliased_remote_methods,
|
||||
ITEM_ALIAS_REMOTE_METHODS.as_slice(),
|
||||
]
|
||||
.concat(),
|
||||
AliasInfo {
|
||||
local_signals: [
|
||||
&self.type_info.aliased_local_signals,
|
||||
ITEM_ALIAS_LOCAL_SIGNALS.as_slice(),
|
||||
]
|
||||
.concat(),
|
||||
local_methods: [
|
||||
&self.type_info.aliased_local_methods,
|
||||
ITEM_ALIAS_LOCAL_METHODS.as_slice(),
|
||||
]
|
||||
.concat(),
|
||||
remote_signals: [
|
||||
&self.type_info.aliased_remote_signals,
|
||||
ITEM_ALIAS_REMOTE_SIGNALS.as_slice(),
|
||||
]
|
||||
.concat(),
|
||||
},
|
||||
);
|
||||
let alias = node.alias.get().unwrap().clone();
|
||||
(node, alias)
|
||||
}
|
||||
}
|
||||
@@ -273,27 +273,25 @@ impl ItemAcceptor {
|
||||
fn make_aliases(&self, client: &Arc<Client>, parent: &str) -> Vec<Arc<Node>> {
|
||||
let mut aliases = Vec::new();
|
||||
let acceptor_node = &self.node.upgrade().unwrap();
|
||||
let acceptor_alias =
|
||||
Node::create(client, parent, acceptor_node.uid.as_str(), true).add_to_scenegraph();
|
||||
Alias::add_to(
|
||||
&acceptor_alias,
|
||||
let acceptor_alias = Alias::new(
|
||||
client,
|
||||
parent,
|
||||
acceptor_node.uid.as_str(),
|
||||
acceptor_node,
|
||||
vec!["release"],
|
||||
vec![],
|
||||
vec![],
|
||||
vec![],
|
||||
AliasInfo {
|
||||
local_signals: vec!["release"],
|
||||
..Default::default()
|
||||
},
|
||||
);
|
||||
if let Some(field) = self.field.lock().upgrade() {
|
||||
let acceptor_field_alias =
|
||||
Node::create(client, acceptor_alias.get_path(), "field", true).add_to_scenegraph();
|
||||
Alias::add_to(
|
||||
&acceptor_field_alias,
|
||||
let acceptor_field_alias = Alias::new(
|
||||
client,
|
||||
acceptor_alias.get_path(),
|
||||
"field",
|
||||
&field.spatial_ref().node.upgrade().unwrap(),
|
||||
vec![],
|
||||
vec![],
|
||||
vec![],
|
||||
vec![],
|
||||
AliasInfo::default(),
|
||||
);
|
||||
|
||||
aliases.push(acceptor_field_alias);
|
||||
}
|
||||
aliases.push(acceptor_alias);
|
||||
|
||||
@@ -167,7 +167,7 @@ impl Node {
|
||||
data: &[u8],
|
||||
) -> Result<(), ScenegraphError> {
|
||||
if let Some(alias) = self.alias.get() {
|
||||
if !alias.local_signals.iter().any(|e| e == &method) {
|
||||
if !alias.info.local_signals.iter().any(|e| e == &method) {
|
||||
return Err(ScenegraphError::SignalNotFound);
|
||||
}
|
||||
alias
|
||||
@@ -191,7 +191,7 @@ impl Node {
|
||||
data: &[u8],
|
||||
) -> Result<Vec<u8>, ScenegraphError> {
|
||||
if let Some(alias) = self.alias.get() {
|
||||
if !alias.local_methods.iter().any(|e| e == &method) {
|
||||
if !alias.info.local_methods.iter().any(|e| e == &method) {
|
||||
return Err(ScenegraphError::MethodNotFound);
|
||||
}
|
||||
alias
|
||||
@@ -212,7 +212,7 @@ impl Node {
|
||||
self.aliases
|
||||
.get_valid_contents()
|
||||
.iter()
|
||||
.filter(|alias| alias.remote_signals.iter().any(|e| e == &method))
|
||||
.filter(|alias| alias.info.remote_signals.iter().any(|e| e == &method))
|
||||
.for_each(|alias| {
|
||||
let _ = alias
|
||||
.node
|
||||
|
||||
@@ -283,7 +283,7 @@ pub fn create_spatial_flex(_node: &Node, calling_client: Arc<Client>, data: &[u8
|
||||
}
|
||||
let info: CreateSpatialInfo = deserialize(data)?;
|
||||
let node = Node::create(&calling_client, "/spatial/spatial", info.name, true);
|
||||
let parent = find_spatial(&calling_client, "Spatial parent", info.parent_path)?;
|
||||
let parent = find_spatial_parent(&calling_client, info.parent_path)?;
|
||||
let transform = parse_transform(info.transform, true, true, true)?;
|
||||
let node = node.add_to_scenegraph();
|
||||
Spatial::add_to(&node, Some(parent), transform)?;
|
||||
|
||||
Reference in New Issue
Block a user