refactor(input): flexible datamaps

This commit is contained in:
Nova
2022-10-14 08:01:07 -04:00
parent 6cba9a010f
commit e0be6ecea9
9 changed files with 86 additions and 94 deletions

View File

@@ -3,9 +3,12 @@ use crate::nodes::{
spatial::Spatial,
};
use glam::{vec3, Mat4};
use stardust_xr::values::Transform;
use stardust_xr::{schemas::flat::Datamap, values::Transform};
use std::sync::{Arc, Weak};
use stereokit::{input::Ray, StereoKit};
use stereokit::{
input::{ButtonState, Key, Ray},
StereoKit,
};
pub struct MousePointer {
pointer: Arc<InputMethod>,
@@ -32,5 +35,25 @@ impl MousePointer {
},
);
}
let mut fbb = flexbuffers::Builder::default();
let mut map = fbb.start_map();
map.push(
"select",
if sk.input_key(Key::MouseLeft).contains(ButtonState::Active) {
1.0f32
} else {
0.0f32
},
);
map.push(
"grab",
if sk.input_key(Key::MouseRight).contains(ButtonState::Active) {
1.0f32
} else {
0.0f32
},
);
map.end_map();
*self.pointer.datamap.lock() = Datamap::new(fbb.take_buffer()).ok();
}
}

View File

@@ -3,10 +3,12 @@ use crate::nodes::{
spatial::Spatial,
};
use glam::Mat4;
use portable_atomic::Ordering;
use stardust_xr::values::Transform;
use stardust_xr::{schemas::flat::Datamap, values::Transform};
use std::sync::{Arc, Weak};
use stereokit::{input::Handed, StereoKit};
use stereokit::{
input::{ButtonState, Handed},
StereoKit,
};
pub struct SkController {
tip: Arc<InputMethod>,
@@ -23,22 +25,23 @@ impl SkController {
}
}
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,
Transform {
position: Some(controller.pose.position),
rotation: Some(controller.pose.orientation),
scale: None,
},
);
}
tip.select.store(controller.trigger, Ordering::Relaxed);
tip.grab.store(controller.grip, Ordering::Relaxed);
let controller = sk.input_controller(self.handed);
*self.tip.enabled.lock() = controller.tracked.contains(ButtonState::Active);
if *self.tip.enabled.lock() {
self.tip.spatial.set_local_transform_components(
None,
Transform {
position: Some(controller.pose.position),
rotation: Some(controller.pose.orientation),
scale: None,
},
);
}
let mut fbb = flexbuffers::Builder::default();
let mut map = fbb.start_map();
map.push("select", controller.trigger);
map.push("grab", controller.grip);
map.end_map();
*self.tip.datamap.lock() = Datamap::new(fbb.take_buffer()).ok();
}
}

View File

@@ -3,10 +3,10 @@ use crate::nodes::{
spatial::Spatial,
};
use glam::Mat4;
use stardust_xr::schemas::flat::{Hand as FlatHand, Joint};
use stardust_xr::schemas::flat::{Datamap, Hand as FlatHand, Joint};
use std::sync::{Arc, Weak};
use stereokit::{
input::{Handed, Joint as SkJoint},
input::{ButtonState, Handed, Joint as SkJoint},
StereoKit,
};
@@ -32,19 +32,17 @@ impl SkHand {
right: handed == Handed::Right,
..Default::default()
},
pinch_strength: 0.0,
grab_strength: 0.0,
})),
),
handed,
}
}
pub fn update(&mut self, sk: &StereoKit) {
let sk_hand = sk.input_hand(self.handed);
if let InputType::Hand(hand) = &mut *self.hand.specialization.lock() {
let sk_hand = *sk.input_hand(self.handed);
let controller = sk.input_controller(self.handed);
*self.hand.enabled.lock() =
controller.tracked.is_inactive() && sk_hand.tracked_state.is_active();
*self.hand.enabled.lock() = controller.tracked.contains(ButtonState::Inactive)
&& sk_hand.tracked_state.contains(ButtonState::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]);
@@ -75,20 +73,13 @@ impl SkHand {
(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.pinch_strength = if sk_hand.pinch_state.is_active() {
1.0
} else {
0.0
};
hand.grab_strength = if sk_hand.grip_state.is_active() {
1.0
} else {
0.0
};
}
}
let mut fbb = flexbuffers::Builder::default();
let mut map = fbb.start_map();
map.push("grabStrength", sk_hand.grip_activation);
map.push("pinchStrength", sk_hand.pinch_activation);
map.end_map();
*self.hand.datamap.lock() = Datamap::new(fbb.take_buffer()).ok();
}
}