fix: input capturing
This commit is contained in:
4
Cargo.lock
generated
4
Cargo.lock
generated
@@ -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",
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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};
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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};
|
||||||
|
|
||||||
|
|||||||
@@ -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},
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")]
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user