fix: input capturing

This commit is contained in:
Nova
2024-06-07 08:22:51 -04:00
parent f770357010
commit b590e82b05
16 changed files with 67 additions and 61 deletions

4
Cargo.lock generated
View File

@@ -2501,7 +2501,7 @@ checksum = "2f2b15926089e5526bb2dd738a2eb0e59034356e06eb71e1cd912358c0e62c4d"
[[package]] [[package]]
name = "stardust-xr" name = "stardust-xr"
version = "0.45.0" 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 = [ dependencies = [
"cluFlock", "cluFlock",
"color-rs", "color-rs",
@@ -2521,7 +2521,7 @@ dependencies = [
[[package]] [[package]]
name = "stardust-xr-schemas" name = "stardust-xr-schemas"
version = "1.5.3" 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 = [ dependencies = [
"flatbuffers", "flatbuffers",
"flexbuffers", "flexbuffers",

View File

@@ -269,13 +269,26 @@ fn generate_alias_info(aspect: &Aspect) -> TokenStream {
let local_methods = generate_alias_opcodes(aspect, Side::Server, MemberType::Method); let local_methods = generate_alias_opcodes(aspect, Side::Server, MemberType::Method);
let remote_signals = generate_alias_opcodes(aspect, Side::Client, MemberType::Signal); 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! { quote! {
lazy_static::lazy_static! { lazy_static::lazy_static! {
pub static ref #aspect_alias_info_name: crate::nodes::alias::AliasInfo = crate::nodes::alias::AliasInfo { pub static ref #aspect_alias_info_name: crate::nodes::alias::AliasInfo = crate::nodes::alias::AliasInfo {
server_signals: vec![#local_signals], server_signals: vec![#local_signals],
server_methods: vec![#local_methods], server_methods: vec![#local_methods],
client_signals: vec![#remote_signals], client_signals: vec![#remote_signals],
}; }
#inherits;
} }
} }
} }

View File

@@ -89,16 +89,15 @@ impl AliasList {
self.0.add_raw(node); self.0.add_raw(node);
} }
pub fn get<A: Aspect>(&self, aspect: &A) -> Option<Arc<Node>> { pub fn get<A: Aspect>(&self, aspect: &A) -> Option<Arc<Node>> {
self.0 self.0.get_valid_contents().into_iter().find(|node| {
.get_valid_contents() let Some(node) = get_original(node.clone(), false) else {
.into_iter() return false;
.filter_map(|n| get_original(n, false)) };
.find(|node| { let Ok(aspect2) = node.get_aspect::<A>() else {
let Ok(aspect2) = node.get_aspect::<A>() else { return false;
return false; };
}; Arc::as_ptr(&aspect2) == (aspect as *const A)
Arc::as_ptr(&aspect2) == (aspect as *const A) })
})
} }
pub fn get_aliases(&self) -> Vec<Arc<Node>> { pub fn get_aliases(&self) -> Vec<Arc<Node>> {
self.0.get_valid_contents() self.0.get_valid_contents()

View File

@@ -4,6 +4,7 @@ use crate::core::destroy_queue;
use crate::core::registry::Registry; use crate::core::registry::Registry;
use crate::core::resource::get_resource_file; use crate::core::resource::get_resource_file;
use crate::create_interface; use crate::create_interface;
use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO;
use crate::nodes::spatial::{Spatial, Transform}; use crate::nodes::spatial::{Spatial, Transform};
use color_eyre::eyre::{eyre, Result}; use color_eyre::eyre::{eyre, Result};
use glam::{vec3, Vec4Swizzles}; use glam::{vec3, Vec4Swizzles};

View File

@@ -7,6 +7,7 @@ use crate::core::registry::Registry;
use crate::create_interface; use crate::create_interface;
use crate::nodes::fields::FIELD_ALIAS_INFO; use crate::nodes::fields::FIELD_ALIAS_INFO;
use crate::nodes::spatial::Transform; use crate::nodes::spatial::Transform;
use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO;
use color_eyre::eyre::{bail, ensure, eyre, Result}; use color_eyre::eyre::{bail, ensure, eyre, Result};
use lazy_static::lazy_static; use lazy_static::lazy_static;
use parking_lot::Mutex; use parking_lot::Mutex;

View File

@@ -8,6 +8,7 @@ use super::{
spatial::{Spatial, Transform}, spatial::{Spatial, Transform},
Node, Node,
}; };
use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO;
use crate::{ use crate::{
core::{client::Client, resource::get_resource_file}, core::{client::Client, resource::get_resource_file},
create_interface, create_interface,

View File

@@ -17,6 +17,8 @@ use super::{Aspect, Node};
use crate::core::client::Client; use crate::core::client::Client;
use crate::create_interface; use crate::create_interface;
use crate::nodes::spatial::Transform; 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 color_eyre::eyre::Result;
use glam::{vec2, vec3a, Mat4, Vec3, Vec3A}; use glam::{vec2, vec3a, Mat4, Vec3, Vec3A};
use mint::Vector3; use mint::Vector3;

View File

@@ -1,17 +1,7 @@
use super::{ use super::{InputHandlerAspect, INPUT_HANDLER_REGISTRY, INPUT_METHOD_REGISTRY};
input_handler_client, InputHandlerAspect, InputLink, INPUT_HANDLER_REGISTRY, use crate::nodes::{alias::AliasList, fields::Field, spatial::Spatial, Aspect, Node};
INPUT_METHOD_REGISTRY,
};
use crate::nodes::{
alias::AliasList,
fields::Field,
spatial::Spatial,
Aspect, Node,
};
use color_eyre::eyre::Result; use color_eyre::eyre::Result;
use stardust_xr::values::Datamap;
use std::sync::Arc; use std::sync::Arc;
use tracing::instrument;
pub struct InputHandler { pub struct InputHandler {
pub spatial: Arc<Spatial>, pub spatial: Arc<Spatial>,
@@ -32,27 +22,6 @@ impl InputHandler {
node.add_aspect_raw(handler); node.add_aspect_raw(handler);
Ok(()) 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 { impl Aspect for InputHandler {
const NAME: &'static str = "InputHandler"; const NAME: &'static str = "InputHandler";

View File

@@ -1,7 +1,7 @@
use super::{ use super::{
input_method_client, InputDataTrait, InputDataType, InputHandler, InputMethodAspect, input_method_client, InputDataTrait, InputDataType, InputHandler, InputMethodAspect,
InputMethodRefAspect, INPUT_HANDLER_REGISTRY, INPUT_METHOD_ASPECT_ALIAS_INFO, InputMethodRefAspect, INPUT_HANDLER_REGISTRY, INPUT_METHOD_REF_ASPECT_ALIAS_INFO,
INPUT_METHOD_REF_ASPECT_ALIAS_INFO, INPUT_METHOD_REGISTRY, INPUT_METHOD_REGISTRY,
}; };
use crate::{ use crate::{
core::{client::Client, registry::Registry}, core::{client::Client, registry::Registry},
@@ -76,7 +76,7 @@ impl InputMethod {
let Ok(method_alias) = Alias::create( let Ok(method_alias) = Alias::create(
&method_node, &method_node,
&client, &client,
INPUT_METHOD_ASPECT_ALIAS_INFO.clone(), INPUT_METHOD_REF_ASPECT_ALIAS_INFO.clone(),
Some(&handler.method_aliases), Some(&handler.method_aliases),
) else { ) else {
return; return;

View File

@@ -6,10 +6,13 @@ mod tip;
pub use handler::*; pub use handler::*;
pub use method::*; pub use method::*;
use rustc_hash::FxHashMap;
use super::fields::Field; use super::fields::Field;
use super::spatial::Spatial; use super::spatial::Spatial;
use crate::create_interface; 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::client::Client, nodes::Node};
use crate::{core::registry::Registry, nodes::spatial::Transform}; use crate::{core::registry::Registry, nodes::spatial::Transform};
use color_eyre::eyre::Result; use color_eyre::eyre::Result;
@@ -32,9 +35,6 @@ impl InputLink {
InputLink { method, handler } 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))] #[instrument(level = "debug", skip(self))]
fn serialize(&self, id: u64, order: u32, captured: bool, datamap: Datamap) -> InputData { fn serialize(&self, id: u64, order: u32, captured: bool, datamap: Datamap) -> InputData {
let mut input = self.method.data.lock().clone(); let mut input = self.method.data.lock().clone();
@@ -136,6 +136,8 @@ pub fn process_input() {
method_alias.set_enabled(false); method_alias.set_enabled(false);
} }
} }
let mut handler_input: FxHashMap<u64, (Arc<Node>, Vec<Arc<Node>>, Vec<InputData>)> =
Default::default();
// const LIMIT: usize = 50; // const LIMIT: usize = 50;
for method in methods { for method in methods {
debug_span!("Process input method").in_scope(|| { 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 // 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() {
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 .handler
.method_aliases .method_aliases
.get(input_link.method.as_ref()) .get(input_link.method.as_ref())
{ .unwrap();
method_alias.set_enabled(true); method_alias.set_enabled(true);
} dbg!(&method_alias.local_methods);
input_link.send_input( datas.push(input_link.serialize(
method_alias.id,
i as u32, i as u32,
method.captures.contains(&input_link.handler), method.captures.contains(&input_link.handler),
method.datamap.lock().clone(), method.datamap.lock().clone(),
); ));
methods.push(method_alias);
} }
method.capture_requests.clear(); method.capture_requests.clear();
}); });
} }
for (_, (handler, methods, data)) in handler_input {
let _ = input_handler_client::input(&handler, &methods, &data);
}
} }

View File

@@ -1,6 +1,8 @@
use super::{ use super::{
create_item_acceptor_flex, register_item_ui_flex, Item, ItemAcceptor, ItemInterface, ItemType, 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::{ use crate::{
core::{client::Client, registry::Registry, scenegraph::MethodResponseSender}, core::{client::Client, registry::Registry, scenegraph::MethodResponseSender},
create_interface, create_interface,

View File

@@ -11,9 +11,9 @@ use crate::core::client::Client;
use crate::core::registry::Registry; use crate::core::registry::Registry;
use crate::nodes::alias::AliasInfo; use crate::nodes::alias::AliasInfo;
use crate::nodes::spatial::Transform; use crate::nodes::spatial::Transform;
use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO;
use color_eyre::eyre::{ensure, Result}; use color_eyre::eyre::{ensure, Result};
use parking_lot::Mutex; use parking_lot::Mutex;
use std::hash::Hash; use std::hash::Hash;
use std::sync::{Arc, Weak}; use std::sync::{Arc, Weak};

View File

@@ -1,3 +1,5 @@
use crate::nodes::items::ITEM_ACCEPTOR_ASPECT_ALIAS_INFO;
use crate::nodes::items::ITEM_ASPECT_ALIAS_INFO;
use crate::{ use crate::{
core::{ core::{
client::{get_env, state, Client, INTERNAL_CLIENT}, client::{get_env, state, Client, INTERNAL_CLIENT},

View File

@@ -146,7 +146,7 @@ impl Node {
message: Message, message: Message,
) -> Result<(), ScenegraphError> { ) -> Result<(), ScenegraphError> {
if let Ok(alias) = self.get_aspect::<Alias>() { if let Ok(alias) = self.get_aspect::<Alias>() {
if !alias.info.server_signals.iter().any(|e| e == &method) { if !alias.info.server_signals.iter().any(|e| *e == method) {
return Err(ScenegraphError::SignalNotFound); return Err(ScenegraphError::SignalNotFound);
} }
alias alias
@@ -174,7 +174,7 @@ impl Node {
response: MethodResponseSender, response: MethodResponseSender,
) { ) {
if let Ok(alias) = self.get_aspect::<Alias>() { if let Ok(alias) = self.get_aspect::<Alias>() {
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)); response.send(Err(ScenegraphError::MethodNotFound));
return; return;
} }

View File

@@ -3,6 +3,7 @@ use super::Node;
use crate::core::client::Client; use crate::core::client::Client;
use crate::core::client_state::ClientStateParsed; use crate::core::client_state::ClientStateParsed;
use crate::core::registry::Registry; use crate::core::registry::Registry;
use crate::nodes::spatial::SPATIAL_REF_ASPECT_ALIAS_INFO;
#[cfg(feature = "wayland")] #[cfg(feature = "wayland")]
use crate::wayland::WAYLAND_DISPLAY; use crate::wayland::WAYLAND_DISPLAY;
#[cfg(feature = "xwayland")] #[cfg(feature = "xwayland")]

View File

@@ -6,6 +6,7 @@ use super::{Aspect, Node};
use crate::core::client::Client; use crate::core::client::Client;
use crate::core::registry::Registry; use crate::core::registry::Registry;
use crate::create_interface; use crate::create_interface;
use crate::nodes::OWNED_ASPECT_ALIAS_INFO;
use color_eyre::eyre::{eyre, Result}; use color_eyre::eyre::{eyre, Result};
use glam::{vec3a, Mat4, Quat, Vec3}; use glam::{vec3a, Mat4, Quat, Vec3};
use mint::Vector3; use mint::Vector3;