From 55a50140a52a4a3889879e5e804f921eced1b75f Mon Sep 17 00:00:00 2001 From: Nova Date: Sat, 1 Oct 2022 22:55:59 -0400 Subject: [PATCH] feat(objects): sk controller for input method tip --- src/objects/input/mod.rs | 1 + src/objects/input/sk_controller.rs | 41 ++++++++++++++++++++++++++++++ src/objects/input/sk_hand.rs | 6 +++-- 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/objects/input/sk_controller.rs diff --git a/src/objects/input/mod.rs b/src/objects/input/mod.rs index f6110dc..6ef66b9 100644 --- a/src/objects/input/mod.rs +++ b/src/objects/input/mod.rs @@ -1,2 +1,3 @@ pub mod mouse_pointer; +pub mod sk_controller; pub mod sk_hand; diff --git a/src/objects/input/sk_controller.rs b/src/objects/input/sk_controller.rs new file mode 100644 index 0000000..a299e35 --- /dev/null +++ b/src/objects/input/sk_controller.rs @@ -0,0 +1,41 @@ +use crate::nodes::{ + input::{tip::Tip, InputMethod, InputType}, + spatial::Spatial, +}; +use glam::Mat4; +use portable_atomic::Ordering; +use std::sync::{Arc, Weak}; +use stereokit::{input::Handed, StereoKit}; + +pub struct SkController { + tip: Arc, + handed: Handed, +} +impl SkController { + pub fn new(handed: Handed) -> Self { + SkController { + tip: InputMethod::new( + Spatial::new(Weak::new(), None, Mat4::IDENTITY), + InputType::Tip(Tip::default()), + ), + handed, + } + } + pub fn update(&mut self, sk: &StereoKit) { + if let InputType::Tip(tip) = &mut *self.tip.specialization.lock() { + let controller = sk.input_controller(self.handed); + *self.tip.enabled.lock() = controller.tracked.is_active(); + if controller.tracked.is_active() { + self.tip.spatial.set_local_transform_components( + None, + Some(controller.pose.position.into()), + Some(controller.pose.orientation.into()), + None, + ); + } + + tip.select.store(controller.trigger, Ordering::Relaxed); + tip.grab.store(controller.grip, Ordering::Relaxed); + } + } +} diff --git a/src/objects/input/sk_hand.rs b/src/objects/input/sk_hand.rs index f7fe806..c0b2dcd 100644 --- a/src/objects/input/sk_hand.rs +++ b/src/objects/input/sk_hand.rs @@ -41,8 +41,10 @@ impl SkHand { pub fn update(&mut self, sk: &StereoKit) { if let InputType::Hand(hand) = &mut *self.hand.specialization.lock() { let sk_hand = *sk.input_hand(self.handed); - *self.hand.enabled.lock() = sk_hand.tracked_state.is_active(); - if sk_hand.tracked_state.is_active() { + let controller = sk.input_controller(self.handed); + *self.hand.enabled.lock() = + controller.tracked.is_inactive() && sk_hand.tracked_state.is_active(); + if *self.hand.enabled.lock() { hand.base.thumb.tip = convert_joint(sk_hand.fingers[0][4]); hand.base.thumb.distal = convert_joint(sk_hand.fingers[0][3]); hand.base.thumb.proximal = convert_joint(sk_hand.fingers[0][2]);