separate floor offset from space drag transform (#218)

Closes #163
This commit is contained in:
Sapphire
2025-05-24 18:42:17 -05:00
committed by GitHub
parent af45138add
commit b0f5e23ffd
2 changed files with 29 additions and 22 deletions

View File

@@ -22,6 +22,7 @@ pub(super) struct PlayspaceMover {
universe: ETrackingUniverseOrigin, universe: ETrackingUniverseOrigin,
drag: Option<MoverData<Vec3A>>, drag: Option<MoverData<Vec3A>>,
rotate: Option<MoverData<Quat>>, rotate: Option<MoverData<Quat>>,
floor_offset: f32,
} }
impl PlayspaceMover { impl PlayspaceMover {
@@ -30,6 +31,7 @@ impl PlayspaceMover {
universe: ETrackingUniverseOrigin::TrackingUniverseRawAndUncalibrated, universe: ETrackingUniverseOrigin::TrackingUniverseRawAndUncalibrated,
drag: None, drag: None,
rotate: None, rotate: None,
floor_offset: 0.0,
} }
} }
@@ -82,7 +84,7 @@ impl PlayspaceMover {
if self.universe == ETrackingUniverseOrigin::TrackingUniverseStanding { if self.universe == ETrackingUniverseOrigin::TrackingUniverseStanding {
apply_chaperone_transform(space_transform.inverse(), chaperone_mgr); apply_chaperone_transform(space_transform.inverse(), chaperone_mgr);
} }
set_working_copy(&universe, chaperone_mgr, &data.pose); set_working_copy(&universe, chaperone_mgr, &data.pose, self.floor_offset);
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() {
@@ -138,7 +140,7 @@ impl PlayspaceMover {
if self.universe == ETrackingUniverseOrigin::TrackingUniverseStanding { if self.universe == ETrackingUniverseOrigin::TrackingUniverseStanding {
apply_chaperone_offset(overlay_offset, chaperone_mgr); apply_chaperone_offset(overlay_offset, chaperone_mgr);
} }
set_working_copy(&universe, chaperone_mgr, &data.pose); set_working_copy(&universe, chaperone_mgr, &data.pose, self.floor_offset);
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() {
@@ -176,7 +178,7 @@ impl PlayspaceMover {
Affine3A::IDENTITY Affine3A::IDENTITY
}; };
set_working_copy(&self.universe, chaperone_mgr, &xform); set_working_copy(&self.universe, chaperone_mgr, &xform, self.floor_offset);
chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live); chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live);
if self.drag.is_some() { if self.drag.is_some() {
@@ -192,14 +194,14 @@ impl PlayspaceMover {
pub fn fix_floor(&mut self, chaperone_mgr: &mut ChaperoneSetupManager, input: &InputState) { pub fn fix_floor(&mut self, chaperone_mgr: &mut ChaperoneSetupManager, input: &InputState) {
let y1 = input.pointers[0].pose.translation.y; let y1 = input.pointers[0].pose.translation.y;
let y2 = input.pointers[1].pose.translation.y; let y2 = input.pointers[1].pose.translation.y;
let Some(mut mat) = get_working_copy(&self.universe, chaperone_mgr) else { let Some(mat) = get_working_copy(&self.universe, chaperone_mgr) else {
log::warn!("Can't fix floor - failed to get zero pose"); log::warn!("Can't fix floor - failed to get zero pose");
return; return;
}; };
let offset = y1.min(y2) - 0.03; let offset = y1.min(y2) - 0.03;
mat.translation.y += offset; self.floor_offset = offset;
set_working_copy(&self.universe, chaperone_mgr, &mat); set_working_copy(&self.universe, chaperone_mgr, &mat, self.floor_offset);
chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live); chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live);
if self.drag.is_some() { if self.drag.is_some() {
@@ -268,13 +270,16 @@ fn set_working_copy(
universe: &ETrackingUniverseOrigin, universe: &ETrackingUniverseOrigin,
chaperone_mgr: &mut ChaperoneSetupManager, chaperone_mgr: &mut ChaperoneSetupManager,
mat: &Affine3A, mat: &Affine3A,
floor_offset: f32,
) { ) {
let mat = HmdMatrix34_t::from_affine(mat); let mut mat = *mat;
mat.translation.y += floor_offset;
let ovr_mat = HmdMatrix34_t::from_affine(&mat);
match universe { match universe {
ETrackingUniverseOrigin::TrackingUniverseStanding => { ETrackingUniverseOrigin::TrackingUniverseStanding => {
chaperone_mgr.set_working_standing_zero_pose_to_raw_tracking_pose(&mat); chaperone_mgr.set_working_standing_zero_pose_to_raw_tracking_pose(&ovr_mat);
} }
_ => chaperone_mgr.set_working_seated_zero_pose_to_raw_tracking_pose(&mat), _ => chaperone_mgr.set_working_seated_zero_pose_to_raw_tracking_pose(&ovr_mat),
} }
} }

View File

@@ -16,6 +16,7 @@ struct MoverData<T> {
pub(super) struct PlayspaceMover { pub(super) struct PlayspaceMover {
last_transform: Affine3A, last_transform: Affine3A,
floor_offset: f32,
drag: Option<MoverData<Vec3A>>, drag: Option<MoverData<Vec3A>>,
rotate: Option<MoverData<Quat>>, rotate: Option<MoverData<Quat>>,
} }
@@ -36,6 +37,7 @@ impl PlayspaceMover {
Ok(Self { Ok(Self {
last_transform, last_transform,
floor_offset: 0.0,
drag: None, drag: None,
rotate: None, rotate: None,
@@ -89,7 +91,7 @@ impl PlayspaceMover {
data.pose *= space_transform; data.pose *= space_transform;
data.hand_pose = new_hand; data.hand_pose = new_hand;
apply_offset(data.pose, monado); self.apply_offset(data.pose, monado);
self.rotate = Some(data); self.rotate = Some(data);
} else { } else {
for (i, pointer) in state.input_state.pointers.iter().enumerate() { for (i, pointer) in state.input_state.pointers.iter().enumerate() {
@@ -138,7 +140,7 @@ impl PlayspaceMover {
data.pose.translation += relative_pos; data.pose.translation += relative_pos;
data.hand_pose = new_hand; data.hand_pose = new_hand;
apply_offset(data.pose, monado); self.apply_offset(data.pose, monado);
self.drag = Some(data); self.drag = Some(data);
} else { } else {
for (i, pointer) in state.input_state.pointers.iter().enumerate() { for (i, pointer) in state.input_state.pointers.iter().enumerate() {
@@ -169,7 +171,7 @@ impl PlayspaceMover {
} }
self.last_transform = Affine3A::IDENTITY; self.last_transform = Affine3A::IDENTITY;
apply_offset(self.last_transform, monado); self.apply_offset(self.last_transform, monado);
} }
pub fn fix_floor(&mut self, input: &InputState, monado: &mut Monado) { pub fn fix_floor(&mut self, input: &InputState, monado: &mut Monado) {
@@ -185,15 +187,15 @@ impl PlayspaceMover {
let y1 = input.pointers[0].raw_pose.translation.y; let y1 = input.pointers[0].raw_pose.translation.y;
let y2 = input.pointers[1].raw_pose.translation.y; let y2 = input.pointers[1].raw_pose.translation.y;
let delta = y1.min(y2) - 0.03; let delta = y1.min(y2) - 0.03;
self.last_transform.translation.y += delta; self.floor_offset = delta;
apply_offset(self.last_transform, monado); self.apply_offset(self.last_transform, monado);
} }
}
fn apply_offset(transform: Affine3A, monado: &mut Monado) { fn apply_offset(&self, transform: Affine3A, monado: &mut Monado) {
let pose = Pose { let pose = Pose {
position: transform.translation.into(), position: (transform.translation + Vec3A::new(0.0, self.floor_offset, 0.0)).into(),
orientation: Quat::from_affine3(&transform).into(), orientation: Quat::from_affine3(&transform).into(),
}; };
let _ = monado.set_reference_space_offset(ReferenceSpaceType::Stage, pose); let _ = monado.set_reference_space_offset(ReferenceSpaceType::Stage, pose);
}
} }