diff --git a/Cargo.lock b/Cargo.lock index 78155a2..a361a21 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2072,7 +2072,7 @@ dependencies = [ [[package]] name = "stardust-xr" version = "0.14.1" -source = "git+https://github.com/StardustXR/core.git#615d4b098f848b1699ac6763b22d6c8783328f10" +source = "git+https://github.com/StardustXR/core.git#975331f9739a9f6cb90ec75813b7720c86225848" dependencies = [ "cluFlock", "color-rs", @@ -2092,7 +2092,7 @@ dependencies = [ [[package]] name = "stardust-xr-schemas" version = "1.5.3" -source = "git+https://github.com/StardustXR/core.git#615d4b098f848b1699ac6763b22d6c8783328f10" +source = "git+https://github.com/StardustXR/core.git#975331f9739a9f6cb90ec75813b7720c86225848" dependencies = [ "flatbuffers", "flexbuffers", diff --git a/src/core/scenegraph.rs b/src/core/scenegraph.rs index db509cb..d09e3a6 100644 --- a/src/core/scenegraph.rs +++ b/src/core/scenegraph.rs @@ -37,7 +37,7 @@ impl Scenegraph { pub fn get_node(&self, path: &str) -> Option> { let mut node = self.nodes.lock().get(path)?.clone(); while let Some(alias) = node.alias.get() { - if alias.enabled.load(Ordering::Relaxed) { + if alias.enabled.load(Ordering::Acquire) { node = alias.original.upgrade()?; } else { return None; diff --git a/src/nodes/input/mod.rs b/src/nodes/input/mod.rs index e428544..b3a622f 100644 --- a/src/nodes/input/mod.rs +++ b/src/nodes/input/mod.rs @@ -114,6 +114,7 @@ impl InputMethod { let method = InputMethod::get(node)?; let handler = InputHandler::find(&calling_client, deserialize(message.as_ref())?)?; + println!("Input method captured"); method.captures.add_raw(&handler); node.send_remote_signal("capture", message) } @@ -230,11 +231,11 @@ impl DistanceLink { } } - fn send_input(&self, order: u32, datamap: Datamap) { - self.handler.send_input(order, self, datamap); + 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, order: u32, datamap: Datamap) -> Vec { + fn serialize(&self, order: u32, captured: bool, datamap: Datamap) -> Vec { let input = self.method.specialization.lock().serialize( self, Spatial::space_to_space_matrix(Some(&self.method.spatial), Some(&self.handler.spatial)), @@ -246,6 +247,7 @@ impl DistanceLink { distance: self.method.true_distance(&self.handler.field), datamap, order, + captured, }; root.serialize() } @@ -291,9 +293,15 @@ impl InputHandler { } #[instrument(level = "debug", skip(self, distance_link))] - fn send_input(&self, order: u32, distance_link: &DistanceLink, datamap: Datamap) { + fn send_input( + &self, + order: u32, + captured: bool, + distance_link: &DistanceLink, + datamap: Datamap, + ) { let Some(node) = self.node.upgrade() else {return}; - let _ = node.send_remote_signal("input", distance_link.serialize(order, datamap)); + let _ = node.send_remote_signal("input", distance_link.serialize(order, captured, datamap)); } } impl PartialEq for InputHandler { @@ -355,7 +363,7 @@ pub fn process_input() { const LIMIT: usize = 50; for method in methods { for alias in method.node.upgrade().unwrap().aliases.get_valid_contents() { - alias.enabled.store(false, Ordering::Relaxed); + alias.enabled.store(false, Ordering::Release); } debug_span!("Process input method").in_scope(|| { @@ -406,13 +414,18 @@ pub fn process_input() { .get(&(Arc::as_ptr(&distance_link.method) as usize)) .and_then(|a| a.alias.get().cloned()) { - method_alias.enabled.store(true, Ordering::Relaxed); + method_alias.enabled.store(true, Ordering::Release); } - distance_link.send_input(i as u32, method.datamap.lock().clone().unwrap()); + let captured = dbg!(captures.contains(&distance_link.handler)); + distance_link.send_input( + i as u32, + captured, + method.datamap.lock().clone().unwrap(), + ); // If the current distance link is in the list of captured input handlers, // break out of the loop to avoid sending input to the remaining distance links - if captures.contains(&distance_link.handler) { + if captured { break; } }