fix(input): extra hand data

This commit is contained in:
Nova
2022-09-18 12:03:02 -04:00
parent 3e18833211
commit 98ee5073dd
3 changed files with 56 additions and 40 deletions

View File

@@ -7,16 +7,21 @@ use std::sync::Arc;
use super::{DistanceLink, InputSpecialization}; use super::{DistanceLink, InputSpecialization};
impl InputSpecialization for HandT { pub struct Hand {
pub base: HandT,
pub pinch_strength: f32,
pub grab_strength: f32,
}
impl InputSpecialization for Hand {
fn distance(&self, space: &Arc<Spatial>, field: &Field) -> f32 { fn distance(&self, space: &Arc<Spatial>, field: &Field) -> f32 {
let mut min_distance = f32::MAX; let mut min_distance = f32::MAX;
for tip in [ for tip in [
&self.thumb.tip.position, &self.base.thumb.tip.position,
&self.index.tip.position, &self.base.index.tip.position,
&self.middle.tip.position, &self.base.middle.tip.position,
&self.ring.tip.position, &self.base.ring.tip.position,
&self.little.tip.position, &self.base.little.tip.position,
] { ] {
min_distance = min_distance.min(field.distance(space, vec3a(tip.x, tip.y, tip.z))); min_distance = min_distance.min(field.distance(space, vec3a(tip.x, tip.y, tip.z)));
} }
@@ -32,7 +37,7 @@ impl InputSpecialization for HandT {
InputDataRaw, InputDataRaw,
flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>, flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>,
) { ) {
let mut hand = self.clone(); let mut hand = self.base.clone();
let mut joints: Vec<&mut JointT> = Vec::new(); let mut joints: Vec<&mut JointT> = Vec::new();
joints.extend([&mut hand.palm, &mut hand.wrist]); joints.extend([&mut hand.palm, &mut hand.wrist]);
@@ -77,7 +82,9 @@ impl InputSpecialization for HandT {
fn serialize_datamap(&self) -> Vec<u8> { fn serialize_datamap(&self) -> Vec<u8> {
let mut fbb = flexbuffers::Builder::default(); let mut fbb = flexbuffers::Builder::default();
let mut map = fbb.start_map(); let mut map = fbb.start_map();
map.push("right", self.right); map.push("right", self.base.right);
map.push("pinchStrength", self.pinch_strength);
map.push("grabStrength", self.grab_strength);
map.end_map(); map.end_map();
fbb.view().to_vec() fbb.view().to_vec()
} }

View File

@@ -1,6 +1,7 @@
pub mod hand; pub mod hand;
pub mod pointer; pub mod pointer;
use self::hand::Hand;
use self::pointer::Pointer; use self::pointer::Pointer;
use super::fields::Field; use super::fields::Field;
@@ -14,7 +15,6 @@ use glam::Mat4;
use nanoid::nanoid; use nanoid::nanoid;
use parking_lot::Mutex; use parking_lot::Mutex;
use stardust_xr_schemas::input::{InputData, InputDataArgs, InputDataRaw}; use stardust_xr_schemas::input::{InputData, InputDataArgs, InputDataRaw};
use stardust_xr_schemas::input_hand::HandT;
use std::ops::Deref; use std::ops::Deref;
use std::sync::atomic::Ordering; use std::sync::atomic::Ordering;
use std::sync::{Arc, Weak}; use std::sync::{Arc, Weak};
@@ -37,7 +37,7 @@ pub trait InputSpecialization: Send + Sync {
} }
pub enum InputType { pub enum InputType {
Pointer(Pointer), Pointer(Pointer),
Hand(Box<HandT>), Hand(Box<Hand>),
} }
impl Deref for InputType { impl Deref for InputType {
type Target = dyn InputSpecialization; type Target = dyn InputSpecialization;

View File

@@ -1,5 +1,5 @@
use crate::nodes::{ use crate::nodes::{
input::{InputMethod, InputType}, input::{hand::Hand, InputMethod, InputType},
spatial::Spatial, spatial::Spatial,
}; };
use glam::Mat4; use glam::Mat4;
@@ -29,7 +29,11 @@ impl SkHand {
SkHand { SkHand {
hand: InputMethod::new( hand: InputMethod::new(
Spatial::new(Weak::new(), None, Mat4::IDENTITY), Spatial::new(Weak::new(), None, Mat4::IDENTITY),
InputType::Hand(Box::new(sk_hand)), InputType::Hand(Box::new(Hand {
base: sk_hand,
pinch_strength: 0.0,
grab_strength: 0.0,
})),
), ),
handed, handed,
} }
@@ -37,36 +41,41 @@ impl SkHand {
pub fn update(&mut self, sk: &StereoKit) { pub fn update(&mut self, sk: &StereoKit) {
if let InputType::Hand(hand) = &mut *self.hand.specialization.lock() { if let InputType::Hand(hand) = &mut *self.hand.specialization.lock() {
let sk_hand = *sk.input_hand(self.handed); let sk_hand = *sk.input_hand(self.handed);
// *self.hand.enabled.lock() = sk_hand.tracked_state.is_active(); *self.hand.enabled.lock() = sk_hand.tracked_state.is_active();
// if sk_hand.tracked_state.is_active() { if sk_hand.tracked_state.is_active() {
hand.thumb.tip = convert_joint(sk_hand.fingers[0][4]); hand.base.thumb.tip = convert_joint(sk_hand.fingers[0][4]);
hand.thumb.distal = convert_joint(sk_hand.fingers[0][3]); hand.base.thumb.distal = convert_joint(sk_hand.fingers[0][3]);
hand.thumb.proximal = convert_joint(sk_hand.fingers[0][2]); hand.base.thumb.proximal = convert_joint(sk_hand.fingers[0][2]);
hand.thumb.metacarpal = convert_joint(sk_hand.fingers[0][1]); hand.base.thumb.metacarpal = convert_joint(sk_hand.fingers[0][1]);
for (finger, sk_finger) in [ for (finger, sk_finger) in [
(&mut hand.index, sk_hand.fingers[1]), (&mut hand.base.index, sk_hand.fingers[1]),
(&mut hand.middle, sk_hand.fingers[2]), (&mut hand.base.middle, sk_hand.fingers[2]),
(&mut hand.ring, sk_hand.fingers[3]), (&mut hand.base.ring, sk_hand.fingers[3]),
(&mut hand.little, sk_hand.fingers[4]), (&mut hand.base.little, sk_hand.fingers[4]),
] { ] {
finger.tip = convert_joint(sk_finger[4]); finger.tip = convert_joint(sk_finger[4]);
finger.distal = convert_joint(sk_finger[3]); finger.distal = convert_joint(sk_finger[3]);
finger.intermediate = convert_joint(sk_finger[2]); finger.intermediate = convert_joint(sk_finger[2]);
finger.proximal = convert_joint(sk_finger[1]); finger.proximal = convert_joint(sk_finger[1]);
finger.metacarpal = convert_joint(sk_finger[0]); finger.metacarpal = convert_joint(sk_finger[0]);
}
hand.base.palm.position = sk_hand.palm.position.into();
hand.base.palm.rotation = sk_hand.palm.orientation.into();
hand.base.palm.radius =
(sk_hand.fingers[2][0].radius + sk_hand.fingers[2][1].radius) * 0.5;
hand.base.wrist.position = sk_hand.wrist.position.into();
hand.base.wrist.rotation = sk_hand.wrist.orientation.into();
hand.base.wrist.radius =
(sk_hand.fingers[0][0].radius + sk_hand.fingers[4][0].radius) * 0.5;
hand.base.elbow = None;
hand.pinch_strength = sk_hand.pinch_activation;
hand.grab_strength = sk_hand.grip_activation;
} }
hand.palm.position = sk_hand.palm.position.into();
hand.palm.rotation = sk_hand.palm.orientation.into();
hand.palm.radius = (sk_hand.fingers[2][0].radius + sk_hand.fingers[2][1].radius) * 0.5;
hand.wrist.position = sk_hand.wrist.position.into();
hand.wrist.rotation = sk_hand.wrist.orientation.into();
hand.wrist.radius = (sk_hand.fingers[0][0].radius + sk_hand.fingers[4][0].radius) * 0.5;
hand.elbow = None;
// }
} }
} }
} }