refactor(alias): new fn

This commit is contained in:
Nova
2022-10-18 11:58:33 -04:00
parent 88555ee047
commit 66de0a2d53
6 changed files with 82 additions and 75 deletions

View File

@@ -1,35 +1,38 @@
use crate::core::client::Client;
use super::Node; use super::Node;
use std::sync::{Arc, Weak}; 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)] #[allow(dead_code)]
pub struct Alias { pub struct Alias {
pub(super) node: Weak<Node>, pub(super) node: Weak<Node>,
pub original: Weak<Node>, pub original: Weak<Node>,
pub(super) local_signals: Vec<&'static str>, pub info: AliasInfo,
pub(super) local_methods: Vec<&'static str>,
pub(super) remote_signals: Vec<&'static str>,
pub(super) remote_methods: Vec<&'static str>,
} }
impl Alias { impl Alias {
pub fn add_to( pub fn new(
node: &Arc<Node>, client: &Arc<Client>,
parent: &str,
name: &str,
original: &Arc<Node>, original: &Arc<Node>,
local_signals: Vec<&'static str>, info: AliasInfo,
local_methods: Vec<&'static str>, ) -> Arc<Node> {
remote_signals: Vec<&'static str>, let node = Node::create(client, parent, name, true).add_to_scenegraph();
remote_methods: Vec<&'static str>,
) -> Arc<Alias> {
let alias = Alias { let alias = Alias {
node: Arc::downgrade(node), node: Arc::downgrade(&node),
original: Arc::downgrade(original), original: Arc::downgrade(original),
local_signals, info,
local_methods,
remote_signals,
remote_methods,
}; };
let alias = original.aliases.add(alias); let alias = original.aliases.add(alias);
let _ = node.alias.set(alias.clone()); let _ = node.alias.set(alias);
alias node
} }
} }

View File

@@ -1,3 +1,4 @@
use super::alias::AliasInfo;
use super::fields::Field; use super::fields::Field;
use super::spatial::{parse_transform, Spatial}; use super::spatial::{parse_transform, Spatial};
use super::{Alias, Node}; use super::{Alias, Node};
@@ -128,20 +129,15 @@ impl PulseSender {
let uids: Vec<String> = distance_sorted_receivers let uids: Vec<String> = distance_sorted_receivers
.into_iter() .into_iter()
.map(|(_, receiver)| { .map(|(_, receiver)| {
let receiver_alias = Node::create( let receiver_alias = Alias::new(
&calling_client, &calling_client,
node.get_path(), node.get_path(),
receiver.uid.as_str(), receiver.uid.as_str(),
false,
)
.add_to_scenegraph();
Alias::add_to(
&receiver_alias,
receiver.node.upgrade().as_ref().unwrap(), receiver.node.upgrade().as_ref().unwrap(),
vec![], AliasInfo {
vec!["sendData"], local_methods: vec!["sendData"],
vec![], ..Default::default()
vec![], },
); );
sender.aliases.add(Arc::downgrade(&receiver_alias)); sender.aliases.add(Arc::downgrade(&receiver_alias));

View File

@@ -1,5 +1,8 @@
use super::{alias::Alias, spatial::Spatial, Node}; 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 glam::{vec3, Mat4};
use std::sync::Arc; use std::sync::Arc;
use stereokit::StereoKit; use stereokit::StereoKit;
@@ -26,7 +29,14 @@ pub fn frame(sk: &StereoKit) {
} }
pub fn make_alias(client: &Arc<Client>) -> Arc<Node> { pub fn make_alias(client: &Arc<Client>) -> Arc<Node> {
let node = Node::create(client, "", "hmd", false).add_to_scenegraph(); Alias::new(
Alias::add_to(&node, &HMD, vec!["getTransform"], vec![], vec![], vec![]); client,
node "",
"hmd",
&HMD,
AliasInfo {
local_signals: vec!["getTransform"],
..Default::default()
},
)
} }

View File

@@ -7,6 +7,7 @@ use super::{Alias, Node};
use crate::core::client::{Client, INTERNAL_CLIENT}; use crate::core::client::{Client, INTERNAL_CLIENT};
use crate::core::nodelist::LifeLinkedNodeList; use crate::core::nodelist::LifeLinkedNodeList;
use crate::core::registry::Registry; use crate::core::registry::Registry;
use crate::nodes::alias::AliasInfo;
use crate::nodes::fields::find_field; use crate::nodes::fields::find_field;
use crate::wayland::panel_item::{register_panel_item_ui_flex, PanelItem}; use crate::wayland::panel_item::{register_panel_item_ui_flex, PanelItem};
use anyhow::{anyhow, ensure, Result}; use anyhow::{anyhow, ensure, Result};
@@ -120,31 +121,30 @@ impl Item {
item item
} }
fn make_alias(&self, client: &Arc<Client>, parent: &str) -> (Arc<Node>, Arc<Alias>) { 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 node = Alias::new(
let alias = Alias::add_to( client,
&node, parent,
&self.uid,
&self.node.upgrade().unwrap(), &self.node.upgrade().unwrap(),
[ AliasInfo {
&self.type_info.aliased_local_signals, local_signals: [
ITEM_ALIAS_LOCAL_SIGNALS.as_slice(), &self.type_info.aliased_local_signals,
] ITEM_ALIAS_LOCAL_SIGNALS.as_slice(),
.concat(), ]
[ .concat(),
&self.type_info.aliased_local_methods, local_methods: [
ITEM_ALIAS_LOCAL_METHODS.as_slice(), &self.type_info.aliased_local_methods,
] ITEM_ALIAS_LOCAL_METHODS.as_slice(),
.concat(), ]
[ .concat(),
&self.type_info.aliased_remote_signals, remote_signals: [
ITEM_ALIAS_REMOTE_SIGNALS.as_slice(), &self.type_info.aliased_remote_signals,
] ITEM_ALIAS_REMOTE_SIGNALS.as_slice(),
.concat(), ]
[ .concat(),
&self.type_info.aliased_remote_methods, },
ITEM_ALIAS_REMOTE_METHODS.as_slice(),
]
.concat(),
); );
let alias = node.alias.get().unwrap().clone();
(node, alias) (node, alias)
} }
} }
@@ -273,27 +273,25 @@ impl ItemAcceptor {
fn make_aliases(&self, client: &Arc<Client>, parent: &str) -> Vec<Arc<Node>> { fn make_aliases(&self, client: &Arc<Client>, parent: &str) -> Vec<Arc<Node>> {
let mut aliases = Vec::new(); let mut aliases = Vec::new();
let acceptor_node = &self.node.upgrade().unwrap(); let acceptor_node = &self.node.upgrade().unwrap();
let acceptor_alias = let acceptor_alias = Alias::new(
Node::create(client, parent, acceptor_node.uid.as_str(), true).add_to_scenegraph(); client,
Alias::add_to( parent,
&acceptor_alias, acceptor_node.uid.as_str(),
acceptor_node, acceptor_node,
vec!["release"], AliasInfo {
vec![], local_signals: vec!["release"],
vec![], ..Default::default()
vec![], },
); );
if let Some(field) = self.field.lock().upgrade() { if let Some(field) = self.field.lock().upgrade() {
let acceptor_field_alias = let acceptor_field_alias = Alias::new(
Node::create(client, acceptor_alias.get_path(), "field", true).add_to_scenegraph(); client,
Alias::add_to( acceptor_alias.get_path(),
&acceptor_field_alias, "field",
&field.spatial_ref().node.upgrade().unwrap(), &field.spatial_ref().node.upgrade().unwrap(),
vec![], AliasInfo::default(),
vec![],
vec![],
vec![],
); );
aliases.push(acceptor_field_alias); aliases.push(acceptor_field_alias);
} }
aliases.push(acceptor_alias); aliases.push(acceptor_alias);

View File

@@ -167,7 +167,7 @@ impl Node {
data: &[u8], data: &[u8],
) -> Result<(), ScenegraphError> { ) -> Result<(), ScenegraphError> {
if let Some(alias) = self.alias.get() { 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); return Err(ScenegraphError::SignalNotFound);
} }
alias alias
@@ -191,7 +191,7 @@ impl Node {
data: &[u8], data: &[u8],
) -> Result<Vec<u8>, ScenegraphError> { ) -> Result<Vec<u8>, ScenegraphError> {
if let Some(alias) = self.alias.get() { 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); return Err(ScenegraphError::MethodNotFound);
} }
alias alias
@@ -212,7 +212,7 @@ impl Node {
self.aliases self.aliases
.get_valid_contents() .get_valid_contents()
.iter() .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| { .for_each(|alias| {
let _ = alias let _ = alias
.node .node

View File

@@ -283,7 +283,7 @@ pub fn create_spatial_flex(_node: &Node, calling_client: Arc<Client>, data: &[u8
} }
let info: CreateSpatialInfo = deserialize(data)?; let info: CreateSpatialInfo = deserialize(data)?;
let node = Node::create(&calling_client, "/spatial/spatial", info.name, true); 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 transform = parse_transform(info.transform, true, true, true)?;
let node = node.add_to_scenegraph(); let node = node.add_to_scenegraph();
Spatial::add_to(&node, Some(parent), transform)?; Spatial::add_to(&node, Some(parent), transform)?;