fix space drag
This commit is contained in:
@@ -159,6 +159,7 @@ impl Default for InteractionState {
|
|||||||
pub struct Pointer {
|
pub struct Pointer {
|
||||||
pub idx: usize,
|
pub idx: usize,
|
||||||
pub pose: Affine3A,
|
pub pose: Affine3A,
|
||||||
|
pub raw_pose: Affine3A,
|
||||||
pub now: PointerState,
|
pub now: PointerState,
|
||||||
pub before: PointerState,
|
pub before: PointerState,
|
||||||
pub last_click: Instant,
|
pub last_click: Instant,
|
||||||
@@ -171,6 +172,7 @@ impl Pointer {
|
|||||||
Self {
|
Self {
|
||||||
idx,
|
idx,
|
||||||
pose: Affine3A::IDENTITY,
|
pose: Affine3A::IDENTITY,
|
||||||
|
raw_pose: Affine3A::IDENTITY,
|
||||||
now: Default::default(),
|
now: Default::default(),
|
||||||
before: Default::default(),
|
before: Default::default(),
|
||||||
last_click: Instant::now(),
|
last_click: Instant::now(),
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ pub(super) struct OpenVrInputSource {
|
|||||||
|
|
||||||
pub(super) struct OpenVrHandSource {
|
pub(super) struct OpenVrHandSource {
|
||||||
has_pose: bool,
|
has_pose: bool,
|
||||||
|
device: Option<TrackedDeviceIndex>,
|
||||||
input_hnd: InputValueHandle,
|
input_hnd: InputValueHandle,
|
||||||
pose_hnd: ActionHandle,
|
pose_hnd: ActionHandle,
|
||||||
haptics_hnd: ActionHandle,
|
haptics_hnd: ActionHandle,
|
||||||
@@ -91,6 +92,7 @@ impl OpenVrInputSource {
|
|||||||
|
|
||||||
let hands: [OpenVrHandSource; 2] = array::from_fn(|i| OpenVrHandSource {
|
let hands: [OpenVrHandSource; 2] = array::from_fn(|i| OpenVrHandSource {
|
||||||
has_pose: false,
|
has_pose: false,
|
||||||
|
device: None,
|
||||||
input_hnd: input_hnd[i],
|
input_hnd: input_hnd[i],
|
||||||
pose_hnd: pose_hnd[i],
|
pose_hnd: pose_hnd[i],
|
||||||
haptics_hnd: haptics_hnd[i],
|
haptics_hnd: haptics_hnd[i],
|
||||||
@@ -124,6 +126,7 @@ impl OpenVrInputSource {
|
|||||||
|
|
||||||
pub fn update(
|
pub fn update(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
universe: ETrackingUniverseOrigin,
|
||||||
input: &mut InputManager,
|
input: &mut InputManager,
|
||||||
system: &mut SystemManager,
|
system: &mut SystemManager,
|
||||||
app: &mut AppState,
|
app: &mut AppState,
|
||||||
@@ -138,12 +141,19 @@ impl OpenVrInputSource {
|
|||||||
|
|
||||||
let _ = input.update_actions(&mut [aas]);
|
let _ = input.update_actions(&mut [aas]);
|
||||||
|
|
||||||
let universe = ETrackingUniverseOrigin::TrackingUniverseStanding;
|
let devices = system.get_device_to_absolute_tracking_pose(universe.clone(), 0.005);
|
||||||
|
app.input_state.hmd = devices[0].mDeviceToAbsoluteTracking.to_affine();
|
||||||
|
|
||||||
for i in 0..2 {
|
for i in 0..2 {
|
||||||
let hand = &mut self.hands[i];
|
let hand = &mut self.hands[i];
|
||||||
let app_hand = &mut app.input_state.pointers[i];
|
let app_hand = &mut app.input_state.pointers[i];
|
||||||
|
|
||||||
|
if let Some(device) = hand.device {
|
||||||
|
app_hand.raw_pose = devices[device.0 as usize]
|
||||||
|
.mDeviceToAbsoluteTracking
|
||||||
|
.to_affine();
|
||||||
|
}
|
||||||
|
|
||||||
hand.has_pose = false;
|
hand.has_pose = false;
|
||||||
|
|
||||||
let _ = input
|
let _ = input
|
||||||
@@ -198,14 +208,10 @@ impl OpenVrInputSource {
|
|||||||
.map(|x| x.0.y)
|
.map(|x| x.0.y)
|
||||||
.unwrap_or(0.0);
|
.unwrap_or(0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
let devices = system.get_device_to_absolute_tracking_pose(universe, 0.005);
|
|
||||||
app.input_state.hmd = devices[0].mDeviceToAbsoluteTracking.to_affine();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_devices(&mut self, system: &mut SystemManager, app: &mut AppState) {
|
pub fn update_devices(&mut self, system: &mut SystemManager, app: &mut AppState) {
|
||||||
app.input_state.devices.clear();
|
app.input_state.devices.clear();
|
||||||
|
|
||||||
for idx in 0..TrackedDeviceIndex::MAX {
|
for idx in 0..TrackedDeviceIndex::MAX {
|
||||||
let device = TrackedDeviceIndex::new(idx as _).unwrap(); // safe
|
let device = TrackedDeviceIndex::new(idx as _).unwrap(); // safe
|
||||||
if !system.is_tracked_device_connected(device) {
|
if !system.is_tracked_device_connected(device) {
|
||||||
@@ -220,9 +226,11 @@ impl OpenVrInputSource {
|
|||||||
let role = system.get_controller_role_for_tracked_device_index(device);
|
let role = system.get_controller_role_for_tracked_device_index(device);
|
||||||
match role {
|
match role {
|
||||||
ETrackedControllerRole::TrackedControllerRole_LeftHand => {
|
ETrackedControllerRole::TrackedControllerRole_LeftHand => {
|
||||||
|
self.hands[0].device = Some(device);
|
||||||
TrackedDeviceRole::LeftHand
|
TrackedDeviceRole::LeftHand
|
||||||
}
|
}
|
||||||
ETrackedControllerRole::TrackedControllerRole_RightHand => {
|
ETrackedControllerRole::TrackedControllerRole_RightHand => {
|
||||||
|
self.hands[1].device = Some(device);
|
||||||
TrackedDeviceRole::RightHand
|
TrackedDeviceRole::RightHand
|
||||||
}
|
}
|
||||||
_ => continue,
|
_ => continue,
|
||||||
|
|||||||
@@ -100,8 +100,8 @@ pub fn openvr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
|
|||||||
notifications.run_dbus();
|
notifications.run_dbus();
|
||||||
notifications.run_udp();
|
notifications.run_udp();
|
||||||
|
|
||||||
let mut space_mover = playspace::PlayspaceMover::new();
|
let mut playspace = playspace::PlayspaceMover::new();
|
||||||
space_mover.playspace_changed(&mut compositor_mgr, &mut chaperone_mgr);
|
playspace.playspace_changed(&mut compositor_mgr, &mut chaperone_mgr);
|
||||||
|
|
||||||
#[cfg(feature = "osc")]
|
#[cfg(feature = "osc")]
|
||||||
let mut osc_sender =
|
let mut osc_sender =
|
||||||
@@ -159,7 +159,7 @@ pub fn openvr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
|
|||||||
EVREventType::VREvent_SeatedZeroPoseReset
|
EVREventType::VREvent_SeatedZeroPoseReset
|
||||||
| EVREventType::VREvent_StandingZeroPoseReset
|
| EVREventType::VREvent_StandingZeroPoseReset
|
||||||
| EVREventType::VREvent_ChaperoneUniverseHasChanged => {
|
| EVREventType::VREvent_ChaperoneUniverseHasChanged => {
|
||||||
space_mover.playspace_changed(&mut compositor_mgr, &mut chaperone_mgr);
|
playspace.playspace_changed(&mut compositor_mgr, &mut chaperone_mgr);
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
@@ -210,17 +210,22 @@ pub fn openvr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
|
|||||||
let _ = adjust_gain(&mut settings_mgr, channel, value);
|
let _ = adjust_gain(&mut settings_mgr, channel, value);
|
||||||
}
|
}
|
||||||
SystemTask::FixFloor => {
|
SystemTask::FixFloor => {
|
||||||
space_mover.fix_floor(&mut chaperone_mgr, &state.input_state);
|
playspace.fix_floor(&mut chaperone_mgr, &state.input_state);
|
||||||
}
|
}
|
||||||
SystemTask::ResetPlayspace => {
|
SystemTask::ResetPlayspace => {
|
||||||
space_mover.reset_offset(&mut chaperone_mgr);
|
playspace.reset_offset(&mut chaperone_mgr);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
state.input_state.pre_update();
|
state.input_state.pre_update();
|
||||||
input_source.update(&mut input_mgr, &mut system_mgr, &mut state);
|
input_source.update(
|
||||||
|
playspace.get_universe(),
|
||||||
|
&mut input_mgr,
|
||||||
|
&mut system_mgr,
|
||||||
|
&mut state,
|
||||||
|
);
|
||||||
state.input_state.post_update();
|
state.input_state.post_update();
|
||||||
|
|
||||||
if state
|
if state
|
||||||
@@ -237,7 +242,7 @@ pub fn openvr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
|
|||||||
.for_each(|o| o.state.auto_movement(&mut state));
|
.for_each(|o| o.state.auto_movement(&mut state));
|
||||||
|
|
||||||
watch_fade(&mut state, overlays.mut_by_id(watch_id).unwrap()); // want panic
|
watch_fade(&mut state, overlays.mut_by_id(watch_id).unwrap()); // want panic
|
||||||
space_mover.update(&mut chaperone_mgr, &mut overlays, &state);
|
playspace.update(&mut chaperone_mgr, &mut overlays, &state);
|
||||||
|
|
||||||
let lengths_haptics = interact(&mut overlays, &mut state);
|
let lengths_haptics = interact(&mut overlays, &mut state);
|
||||||
for (idx, (len, haptics)) in lengths_haptics.iter().enumerate() {
|
for (idx, (len, haptics)) in lengths_haptics.iter().enumerate() {
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ use super::{helpers::Affine3AConvert, overlay::OpenVrOverlayData};
|
|||||||
|
|
||||||
struct DragData {
|
struct DragData {
|
||||||
pose: Affine3A,
|
pose: Affine3A,
|
||||||
pose_inverse: Affine3A,
|
|
||||||
hand: usize,
|
hand: usize,
|
||||||
hand_pos: Vec3A,
|
hand_pos: Vec3A,
|
||||||
}
|
}
|
||||||
@@ -46,24 +45,27 @@ impl PlayspaceMover {
|
|||||||
log::info!("End space drag");
|
log::info!("End space drag");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let new_hand = state.input_state.pointers[data.hand].pose.translation;
|
|
||||||
let new_hand_local = new_hand;
|
|
||||||
|
|
||||||
let relative_pos = data.pose.transform_vector3a(new_hand_local - data.hand_pos);
|
let new_hand =
|
||||||
log::info!("Space drag: {:?}", relative_pos);
|
state.input_state.pointers[data.hand].raw_pose.translation + data.pose.translation;
|
||||||
|
let relative_pos = data.pose.transform_vector3a(new_hand - data.hand_pos);
|
||||||
|
|
||||||
|
if relative_pos.length_squared() > 1000.0 {
|
||||||
|
log::warn!("Space drag too fast, ignoring");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
overlays.iter_mut().for_each(|overlay| {
|
overlays.iter_mut().for_each(|overlay| {
|
||||||
if overlay.state.grabbable {
|
if overlay.state.grabbable {
|
||||||
overlay.state.dirty = true;
|
overlay.state.dirty = true;
|
||||||
overlay.state.transform.translation += relative_pos * -1.0;
|
overlay.state.transform.translation -= relative_pos;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut mat = data.pose.clone();
|
data.pose.translation += relative_pos;
|
||||||
mat.translation += relative_pos;
|
data.hand_pos = new_hand;
|
||||||
//data.hand_pos = data.pose.inverse().transform_point3a(new_hand);
|
|
||||||
|
|
||||||
set_working_copy(&universe, chaperone_mgr, &mat);
|
set_working_copy(&universe, chaperone_mgr, &data.pose);
|
||||||
chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live);
|
chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live);
|
||||||
} else {
|
} else {
|
||||||
for (i, pointer) in state.input_state.pointers.iter().enumerate() {
|
for (i, pointer) in state.input_state.pointers.iter().enumerate() {
|
||||||
@@ -72,11 +74,9 @@ impl PlayspaceMover {
|
|||||||
log::warn!("Can't space drag - failed to get zero pose");
|
log::warn!("Can't space drag - failed to get zero pose");
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let pose_inverse = mat.inverse();
|
let hand_pos = pointer.raw_pose.translation + mat.translation;
|
||||||
let hand_pos = pointer.pose.translation;
|
|
||||||
self.last = Some(DragData {
|
self.last = Some(DragData {
|
||||||
pose: mat,
|
pose: mat,
|
||||||
pose_inverse,
|
|
||||||
hand: i,
|
hand: i,
|
||||||
hand_pos,
|
hand_pos,
|
||||||
});
|
});
|
||||||
@@ -129,6 +129,10 @@ impl PlayspaceMover {
|
|||||||
self.last = None;
|
self.last = None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_universe(&self) -> ETrackingUniverseOrigin {
|
||||||
|
self.universe.clone()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn universe_str(universe: &ETrackingUniverseOrigin) -> &'static str {
|
fn universe_str(universe: &ETrackingUniverseOrigin) -> &'static str {
|
||||||
|
|||||||
Reference in New Issue
Block a user