diff --git a/Cargo.lock b/Cargo.lock index 6463b3d..2c360cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2501,7 +2501,7 @@ checksum = "2f2b15926089e5526bb2dd738a2eb0e59034356e06eb71e1cd912358c0e62c4d" [[package]] name = "stardust-xr" version = "0.45.0" -source = "git+https://github.com/StardustXR/core.git?branch=dev#214e265655982e9db509f38f20e8392114f721f4" +source = "git+https://github.com/StardustXR/core.git?branch=dev#a21dc0e610f6e7c905d42f80009700ff4474e583" dependencies = [ "cluFlock", "color-rs", @@ -2521,7 +2521,7 @@ dependencies = [ [[package]] name = "stardust-xr-schemas" version = "1.5.3" -source = "git+https://github.com/StardustXR/core.git?branch=dev#214e265655982e9db509f38f20e8392114f721f4" +source = "git+https://github.com/StardustXR/core.git?branch=dev#a21dc0e610f6e7c905d42f80009700ff4474e583" dependencies = [ "flatbuffers", "flexbuffers", diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs index b8572ba..6e9a6e9 100644 --- a/codegen/src/lib.rs +++ b/codegen/src/lib.rs @@ -269,13 +269,26 @@ fn generate_alias_info(aspect: &Aspect) -> TokenStream { let local_methods = generate_alias_opcodes(aspect, Side::Server, MemberType::Method); let remote_signals = generate_alias_opcodes(aspect, Side::Client, MemberType::Signal); + let inherits = aspect + .inherits + .iter() + .map(|a| { + Ident::new( + &format!("{}_ASPECT_ALIAS_INFO", a.to_case(Case::ScreamingSnake)), + Span::call_site(), + ) + }) + .map(|a| quote!(#a.clone())) + .fold(quote!(), |a, b| quote!(#a + #b)); + quote! { lazy_static::lazy_static! { pub static ref #aspect_alias_info_name: crate::nodes::alias::AliasInfo = crate::nodes::alias::AliasInfo { server_signals: vec![#local_signals], server_methods: vec![#local_methods], client_signals: vec![#remote_signals], - }; + } + #inherits; } } } diff --git a/src/nodes/alias.rs b/src/nodes/alias.rs index 810ab32..f8736e8 100644 --- a/src/nodes/alias.rs +++ b/src/nodes/alias.rs @@ -89,16 +89,15 @@ impl AliasList { self.0.add_raw(node); } pub fn get(&self, aspect: &A) -> Option> { - self.0 - .get_valid_contents() - .into_iter() - .filter_map(|n| get_original(n, false)) - .find(|node| { - let Ok(aspect2) = node.get_aspect::() else { - return false; - }; - Arc::as_ptr(&aspect2) == (aspect as *const A) - }) + self.0.get_valid_contents().into_iter().find(|node| { + let Some(node) = get_original(node.clone(), false) else { + return false; + }; + let Ok(aspect2) = node.get_aspect::() else { + return false; + }; + Arc::as_ptr(&aspect2) == (aspect as *const A) + }) } pub fn get_aliases(&self) -> Vec> { self.0.get_valid_contents() diff --git a/src/nodes/audio.rs b/src/nodes/audio.rs index 3ab3303..c0c2a0f 100644 --- a/src/nodes/audio.rs +++ b/src/nodes/audio.rs @@ -4,6 +4,7 @@ use crate::core::destroy_queue; use crate::core::registry::Registry; use crate::core::resource::get_resource_file; use crate::create_interface; +use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO; use crate::nodes::spatial::{Spatial, Transform}; use color_eyre::eyre::{eyre, Result}; use glam::{vec3, Vec4Swizzles}; diff --git a/src/nodes/data.rs b/src/nodes/data.rs index 0f8110f..bab200e 100644 --- a/src/nodes/data.rs +++ b/src/nodes/data.rs @@ -7,6 +7,7 @@ use crate::core::registry::Registry; use crate::create_interface; use crate::nodes::fields::FIELD_ALIAS_INFO; use crate::nodes::spatial::Transform; +use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO; use color_eyre::eyre::{bail, ensure, eyre, Result}; use lazy_static::lazy_static; use parking_lot::Mutex; diff --git a/src/nodes/drawable/mod.rs b/src/nodes/drawable/mod.rs index db10b87..c24aaa4 100644 --- a/src/nodes/drawable/mod.rs +++ b/src/nodes/drawable/mod.rs @@ -8,6 +8,7 @@ use super::{ spatial::{Spatial, Transform}, Node, }; +use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO; use crate::{ core::{client::Client, resource::get_resource_file}, create_interface, diff --git a/src/nodes/fields/mod.rs b/src/nodes/fields/mod.rs index 2006b63..524b595 100644 --- a/src/nodes/fields/mod.rs +++ b/src/nodes/fields/mod.rs @@ -17,6 +17,8 @@ use super::{Aspect, Node}; use crate::core::client::Client; use crate::create_interface; use crate::nodes::spatial::Transform; +use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO; +use crate::nodes::spatial::SPATIAL_REF_ASPECT_ALIAS_INFO; use color_eyre::eyre::Result; use glam::{vec2, vec3a, Mat4, Vec3, Vec3A}; use mint::Vector3; diff --git a/src/nodes/input/handler.rs b/src/nodes/input/handler.rs index 64a67e3..59e7fef 100644 --- a/src/nodes/input/handler.rs +++ b/src/nodes/input/handler.rs @@ -1,17 +1,7 @@ -use super::{ - input_handler_client, InputHandlerAspect, InputLink, INPUT_HANDLER_REGISTRY, - INPUT_METHOD_REGISTRY, -}; -use crate::nodes::{ - alias::AliasList, - fields::Field, - spatial::Spatial, - Aspect, Node, -}; +use super::{InputHandlerAspect, INPUT_HANDLER_REGISTRY, INPUT_METHOD_REGISTRY}; +use crate::nodes::{alias::AliasList, fields::Field, spatial::Spatial, Aspect, Node}; use color_eyre::eyre::Result; -use stardust_xr::values::Datamap; use std::sync::Arc; -use tracing::instrument; pub struct InputHandler { pub spatial: Arc, @@ -32,27 +22,6 @@ impl InputHandler { node.add_aspect_raw(handler); Ok(()) } - - #[instrument(level = "debug", skip(self, input_link))] - pub(super) fn send_input( - &self, - order: u32, - captured: bool, - input_link: &InputLink, - datamap: Datamap, - ) { - let Some(node) = self.spatial.node() else { - return; - }; - let Some(method_alias) = self.method_aliases.get(input_link.method.as_ref()) else { - return; - }; - let _ = input_handler_client::input( - &node, - &method_alias, - &input_link.serialize(method_alias.id, order, captured, datamap), - ); - } } impl Aspect for InputHandler { const NAME: &'static str = "InputHandler"; diff --git a/src/nodes/input/method.rs b/src/nodes/input/method.rs index 26cd46a..0feeffc 100644 --- a/src/nodes/input/method.rs +++ b/src/nodes/input/method.rs @@ -1,7 +1,7 @@ use super::{ input_method_client, InputDataTrait, InputDataType, InputHandler, InputMethodAspect, - InputMethodRefAspect, INPUT_HANDLER_REGISTRY, INPUT_METHOD_ASPECT_ALIAS_INFO, - INPUT_METHOD_REF_ASPECT_ALIAS_INFO, INPUT_METHOD_REGISTRY, + InputMethodRefAspect, INPUT_HANDLER_REGISTRY, INPUT_METHOD_REF_ASPECT_ALIAS_INFO, + INPUT_METHOD_REGISTRY, }; use crate::{ core::{client::Client, registry::Registry}, @@ -76,7 +76,7 @@ impl InputMethod { let Ok(method_alias) = Alias::create( &method_node, &client, - INPUT_METHOD_ASPECT_ALIAS_INFO.clone(), + INPUT_METHOD_REF_ASPECT_ALIAS_INFO.clone(), Some(&handler.method_aliases), ) else { return; diff --git a/src/nodes/input/mod.rs b/src/nodes/input/mod.rs index a6fa1e6..aec68f2 100644 --- a/src/nodes/input/mod.rs +++ b/src/nodes/input/mod.rs @@ -6,10 +6,13 @@ mod tip; pub use handler::*; pub use method::*; +use rustc_hash::FxHashMap; use super::fields::Field; use super::spatial::Spatial; use crate::create_interface; +use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO; +use crate::nodes::spatial::SPATIAL_REF_ASPECT_ALIAS_INFO; use crate::{core::client::Client, nodes::Node}; use crate::{core::registry::Registry, nodes::spatial::Transform}; use color_eyre::eyre::Result; @@ -32,9 +35,6 @@ impl InputLink { InputLink { method, handler } } - fn send_input(&self, order: u32, captured: bool, datamap: Datamap) { - self.handler.send_input(order, captured, self, datamap); - } #[instrument(level = "debug", skip(self))] fn serialize(&self, id: u64, order: u32, captured: bool, datamap: Datamap) -> InputData { let mut input = self.method.data.lock().clone(); @@ -136,6 +136,8 @@ pub fn process_input() { method_alias.set_enabled(false); } } + let mut handler_input: FxHashMap, Vec>, Vec)> = + Default::default(); // const LIMIT: usize = 50; for method in methods { debug_span!("Process input method").in_scope(|| { @@ -158,20 +160,32 @@ pub fn process_input() { // Iterate over the distance links and send input to them for (i, input_link) in input_links.into_iter().enumerate() { - if let Some(method_alias) = input_link + let handler = input_link.handler.spatial.node().unwrap(); + if !handler_input.contains_key(&handler.id) { + handler_input.insert(handler.id, (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()) - { - method_alias.set_enabled(true); - } - input_link.send_input( + .unwrap(); + method_alias.set_enabled(true); + dbg!(&method_alias.local_methods); + datas.push(input_link.serialize( + method_alias.id, i as u32, method.captures.contains(&input_link.handler), method.datamap.lock().clone(), - ); + )); + methods.push(method_alias); } method.capture_requests.clear(); }); } + + for (_, (handler, methods, data)) in handler_input { + let _ = input_handler_client::input(&handler, &methods, &data); + } } diff --git a/src/nodes/items/camera.rs b/src/nodes/items/camera.rs index 094e870..a9d13f0 100644 --- a/src/nodes/items/camera.rs +++ b/src/nodes/items/camera.rs @@ -1,6 +1,8 @@ use super::{ create_item_acceptor_flex, register_item_ui_flex, Item, ItemAcceptor, ItemInterface, ItemType, }; +use crate::nodes::items::ITEM_ACCEPTOR_ASPECT_ALIAS_INFO; +use crate::nodes::items::ITEM_ASPECT_ALIAS_INFO; use crate::{ core::{client::Client, registry::Registry, scenegraph::MethodResponseSender}, create_interface, diff --git a/src/nodes/items/mod.rs b/src/nodes/items/mod.rs index 08547e4..99ef2cc 100644 --- a/src/nodes/items/mod.rs +++ b/src/nodes/items/mod.rs @@ -11,9 +11,9 @@ use crate::core::client::Client; use crate::core::registry::Registry; use crate::nodes::alias::AliasInfo; use crate::nodes::spatial::Transform; +use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO; use color_eyre::eyre::{ensure, Result}; use parking_lot::Mutex; - use std::hash::Hash; use std::sync::{Arc, Weak}; diff --git a/src/nodes/items/panel.rs b/src/nodes/items/panel.rs index daf0ecb..f378a29 100644 --- a/src/nodes/items/panel.rs +++ b/src/nodes/items/panel.rs @@ -1,3 +1,5 @@ +use crate::nodes::items::ITEM_ACCEPTOR_ASPECT_ALIAS_INFO; +use crate::nodes::items::ITEM_ASPECT_ALIAS_INFO; use crate::{ core::{ client::{get_env, state, Client, INTERNAL_CLIENT}, diff --git a/src/nodes/mod.rs b/src/nodes/mod.rs index b642655..c42b220 100644 --- a/src/nodes/mod.rs +++ b/src/nodes/mod.rs @@ -146,7 +146,7 @@ impl Node { message: Message, ) -> Result<(), ScenegraphError> { if let Ok(alias) = self.get_aspect::() { - if !alias.info.server_signals.iter().any(|e| e == &method) { + if !alias.info.server_signals.iter().any(|e| *e == method) { return Err(ScenegraphError::SignalNotFound); } alias @@ -174,7 +174,7 @@ impl Node { response: MethodResponseSender, ) { if let Ok(alias) = self.get_aspect::() { - if !alias.info.server_methods.iter().any(|e| e == &method) { + if !alias.info.server_methods.iter().any(|e| *e == method) { response.send(Err(ScenegraphError::MethodNotFound)); return; } diff --git a/src/nodes/root.rs b/src/nodes/root.rs index 6e74548..ac060cd 100644 --- a/src/nodes/root.rs +++ b/src/nodes/root.rs @@ -3,6 +3,7 @@ use super::Node; use crate::core::client::Client; use crate::core::client_state::ClientStateParsed; use crate::core::registry::Registry; +use crate::nodes::spatial::SPATIAL_REF_ASPECT_ALIAS_INFO; #[cfg(feature = "wayland")] use crate::wayland::WAYLAND_DISPLAY; #[cfg(feature = "xwayland")] diff --git a/src/nodes/spatial/mod.rs b/src/nodes/spatial/mod.rs index 69469b2..28a2aec 100644 --- a/src/nodes/spatial/mod.rs +++ b/src/nodes/spatial/mod.rs @@ -6,6 +6,7 @@ use super::{Aspect, Node}; use crate::core::client::Client; use crate::core::registry::Registry; use crate::create_interface; +use crate::nodes::OWNED_ASPECT_ALIAS_INFO; use color_eyre::eyre::{eyre, Result}; use glam::{vec3a, Mat4, Quat, Vec3}; use mint::Vector3;