From 69311125ba38fc886d99214a4c28779dffa59779 Mon Sep 17 00:00:00 2001 From: Nova Date: Fri, 7 Jun 2024 15:13:13 -0400 Subject: [PATCH] fix(objects/input): multimodal hand input --- src/main.rs | 12 ++++-------- src/nodes/data.rs | 6 ++++-- src/objects/input/sk_hand.rs | 15 ++++++++------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9109529..9f6f34c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -53,10 +53,6 @@ struct CliArgs { #[clap(id = "PRIORITY", short = 'o', long = "overlay", action)] overlay_priority: Option, - /// Don't create a tip input for controller because SOME RUNTIMES will lie - #[clap(long, action)] - disable_controller: bool, - /// Run a script when ready for clients to connect. If this is not set the script at $HOME/.config/stardust/startup will be ran if it exists. #[clap(id = "PATH", short = 'e', long = "execute-startup-script", action)] startup_script: Option, @@ -167,7 +163,7 @@ fn main() { left.zip(right) }) .flatten(); - let mut controllers = (!cli_args.flatscreen && !cli_args.disable_controller) + let mut controllers = (!cli_args.flatscreen) .then(|| { let left = SkController::new(Handed::Left).ok(); let right = SkController::new(Handed::Right).ok(); @@ -216,7 +212,7 @@ fn main() { SkClosures::run_app( sk, sk_event_loop, - |_sk, token| { + |sk, token| { let _span = debug_span!("StereoKit step"); let _span = _span.enter(); @@ -230,8 +226,8 @@ fn main() { mouse_pointer.update(); } if let Some((left_hand, right_hand)) = &mut hands { - left_hand.update(!cli_args.disable_controller, token); - right_hand.update(!cli_args.disable_controller, token); + left_hand.update(sk, token); + right_hand.update(sk, token); } if let Some((left_controller, right_controller)) = &mut controllers { left_controller.update(token); diff --git a/src/nodes/data.rs b/src/nodes/data.rs index bab200e..ce4f33f 100644 --- a/src/nodes/data.rs +++ b/src/nodes/data.rs @@ -120,13 +120,15 @@ impl PulseSender { } fn handle_drop_receiver(&self, receiver: &PulseReceiver) { - let id = receiver.node.upgrade().unwrap().get_id(); + let Some(node) = receiver.node.upgrade() else { + return; + }; self.aliases.remove_aspect(receiver); self.field_aliases.remove_aspect(receiver.field.as_ref()); let Some(tx_node) = self.node.upgrade() else { return; }; - let _ = pulse_sender_client::drop_receiver(&tx_node, id); + let _ = pulse_sender_client::drop_receiver(&tx_node, node.get_id()); } } impl Aspect for PulseSender { diff --git a/src/objects/input/sk_hand.rs b/src/objects/input/sk_hand.rs index 5db7fc7..58fdf0c 100644 --- a/src/objects/input/sk_hand.rs +++ b/src/objects/input/sk_hand.rs @@ -12,8 +12,8 @@ use serde::{Deserialize, Serialize}; use stardust_xr::values::Datamap; use std::f32::INFINITY; use std::sync::Arc; -use stereokit_rust::sk::MainThreadToken; -use stereokit_rust::system::{HandJoint, Handed, Input, LinePoint, Lines}; +use stereokit_rust::sk::{DisplayMode, MainThreadToken, Sk}; +use stereokit_rust::system::{HandJoint, HandSource, Handed, Input, LinePoint, Lines}; use stereokit_rust::util::Color128; fn convert_joint(joint: HandJoint) -> Joint { @@ -58,14 +58,15 @@ impl SkHand { datamap: Default::default(), }) } - pub fn update(&mut self, controller_enabled: bool, token: &MainThreadToken) { + pub fn update(&mut self, sk: &Sk, token: &MainThreadToken) { let sk_hand = Input::hand(self.handed); + let real_hand = Input::hand_source(self.handed) as u32 == HandSource::Articulated as u32; if let InputDataType::Hand(hand) = &mut *self.input.data.lock() { - let controller_active = - controller_enabled && Input::controller(self.handed).is_tracked(); - let input_node = self.input.spatial.node().unwrap(); - input_node.set_enabled(!controller_active && sk_hand.tracked.is_active()); + input_node.set_enabled( + (real_hand || sk.get_active_display_mode() == DisplayMode::Flatscreen) + && sk_hand.tracked.is_active(), + ); if input_node.enabled() { hand.thumb.tip = convert_joint(sk_hand.fingers[0][4]); hand.thumb.distal = convert_joint(sk_hand.fingers[0][3]);