openvr: chaperone movement fix

This commit is contained in:
galister
2024-03-10 12:22:20 +01:00
parent 45d08cd89b
commit a08c260898
2 changed files with 31 additions and 12 deletions

4
Cargo.lock generated
View File

@@ -2198,7 +2198,7 @@ dependencies = [
[[package]] [[package]]
name = "ovr_overlay" name = "ovr_overlay"
version = "0.0.0" version = "0.0.0"
source = "git+https://github.com/galister/ovr_overlay_oyasumi#9d8a3f4017024e79b6ec7fa518b97df401bf259c" source = "git+https://github.com/galister/ovr_overlay_oyasumi#61e0e77770212d64a76775a8c76637d1ca935942"
dependencies = [ dependencies = [
"byteorder", "byteorder",
"derive_more", "derive_more",
@@ -2213,7 +2213,7 @@ dependencies = [
[[package]] [[package]]
name = "ovr_overlay_sys" name = "ovr_overlay_sys"
version = "0.0.0" version = "0.0.0"
source = "git+https://github.com/galister/ovr_overlay_oyasumi#9d8a3f4017024e79b6ec7fa518b97df401bf259c" source = "git+https://github.com/galister/ovr_overlay_oyasumi#61e0e77770212d64a76775a8c76637d1ca935942"
dependencies = [ dependencies = [
"autocxx", "autocxx",
"autocxx-build", "autocxx-build",

View File

@@ -56,20 +56,21 @@ impl PlayspaceMover {
return; return;
} }
let overlay_offset = data.pose.inverse().transform_vector3a(relative_pos); let overlay_offset = data.pose.inverse().transform_vector3a(relative_pos) * -1.0;
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 -= overlay_offset; overlay.state.transform.translation += overlay_offset;
} }
}); });
chaperone_mgr.revert_working_copy();
apply_chaperone_offset(overlay_offset, chaperone_mgr);
data.pose.translation += relative_pos; data.pose.translation += relative_pos;
data.hand_pos = new_hand; data.hand_pos = new_hand;
if self.universe == ETrackingUniverseOrigin::TrackingUniverseStanding {
apply_chaperone_offset(overlay_offset, chaperone_mgr);
}
set_working_copy(&universe, chaperone_mgr, &data.pose); 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 {
@@ -93,12 +94,19 @@ impl PlayspaceMover {
} }
pub fn reset_offset(&mut self, chaperone_mgr: &mut ChaperoneSetupManager) { pub fn reset_offset(&mut self, chaperone_mgr: &mut ChaperoneSetupManager) {
if self.universe == ETrackingUniverseOrigin::TrackingUniverseStanding {
if let Some(cur) = get_working_copy(&self.universe, chaperone_mgr) {
apply_chaperone_transform(cur, chaperone_mgr);
}
}
set_working_copy(&self.universe, chaperone_mgr, &Affine3A::IDENTITY); set_working_copy(&self.universe, chaperone_mgr, &Affine3A::IDENTITY);
chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live); chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live);
if self.last.is_some() { if self.last.is_some() {
log::info!("Space drag interrupted by manual reset"); log::info!("Space drag interrupted by manual reset");
self.last = None; self.last = None;
} else {
log::info!("Playspace reset");
} }
} }
@@ -109,7 +117,9 @@ impl PlayspaceMover {
log::warn!("Can't fix floor - failed to get zero pose"); log::warn!("Can't fix floor - failed to get zero pose");
return; return;
}; };
mat.translation.y += y1.min(y2) - 0.03; let offset = y1.min(y2) - 0.03;
mat.translation.y += offset;
set_working_copy(&self.universe, chaperone_mgr, &mat); set_working_copy(&self.universe, chaperone_mgr, &mat);
chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live); chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live);
} }
@@ -177,15 +187,24 @@ fn set_working_copy(
} }
fn apply_chaperone_offset(offset: Vec3A, chaperone_mgr: &mut ChaperoneSetupManager) { fn apply_chaperone_offset(offset: Vec3A, chaperone_mgr: &mut ChaperoneSetupManager) {
let mut quads = chaperone_mgr.get_working_collision_bounds_info(); let mut quads = chaperone_mgr.get_live_collision_bounds_info();
quads.iter_mut().for_each(|quad| { quads.iter_mut().for_each(|quad| {
quad.vCorners.iter_mut().for_each(|corner| { quad.vCorners.iter_mut().for_each(|corner| {
corner.v[0] += offset.x; corner.v[0] += offset.x;
if corner.v[1] != 0.0 {
corner.v[1] += offset.y;
}
corner.v[2] += offset.z; corner.v[2] += offset.z;
}); });
}); });
chaperone_mgr.set_working_collision_bounds_info(&mut quads); chaperone_mgr.set_working_collision_bounds_info(quads.as_mut_slice());
}
fn apply_chaperone_transform(transform: Affine3A, chaperone_mgr: &mut ChaperoneSetupManager) {
let mut quads = chaperone_mgr.get_live_collision_bounds_info();
quads.iter_mut().for_each(|quad| {
quad.vCorners.iter_mut().for_each(|corner| {
let coord = transform.transform_point3a(Vec3A::from_slice(&corner.v));
corner.v[0] = coord.x;
corner.v[2] = coord.z;
});
});
chaperone_mgr.set_working_collision_bounds_info(quads.as_mut_slice());
} }