mirrors, recenter, fix floor

This commit is contained in:
galister
2025-12-11 23:55:18 +09:00
parent 4314610244
commit a5cacc2e70
44 changed files with 218 additions and 19 deletions

View File

@@ -44,9 +44,12 @@ impl PlayspaceMover {
PlayspaceTask::FixFloor => {
self.fix_floor(chaperone_mgr, &app.input_state);
}
PlayspaceTask::ResetPlayspace => {
PlayspaceTask::Reset => {
self.reset_offset(chaperone_mgr, &app.input_state);
}
PlayspaceTask::Recenter => {
self.recenter(chaperone_mgr, &app.input_state);
}
}
}
@@ -224,6 +227,28 @@ impl PlayspaceMover {
}
}
pub fn recenter(&mut self, chaperone_mgr: &mut ChaperoneSetupManager, input: &InputState) {
let Some(mut mat) = get_working_copy(&self.universe, chaperone_mgr) else {
log::warn!("Can't fix floor - failed to get zero pose");
return;
};
mat.translation.x += input.hmd.translation.x;
mat.translation.z += input.hmd.translation.z;
set_working_copy(&self.universe, chaperone_mgr, &mat);
chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live);
if self.drag.is_some() {
log::info!("Space drag interrupted by fix floor");
self.drag = None;
}
if self.rotate.is_some() {
log::info!("Space rotate interrupted by fix floor");
self.rotate = None;
}
}
pub fn playspace_changed(
&mut self,
compositor_mgr: &mut CompositorManager,

View File

@@ -48,9 +48,12 @@ impl PlayspaceMover {
PlayspaceTask::FixFloor => {
self.fix_floor(&app.input_state, monado);
}
PlayspaceTask::ResetPlayspace => {
PlayspaceTask::Reset => {
self.reset_offset(monado);
}
PlayspaceTask::Recenter => {
self.recenter(&app.input_state, monado);
}
}
}
@@ -173,6 +176,31 @@ impl PlayspaceMover {
}
}
pub fn recenter(&mut self, input: &InputState, monado: &mut Monado) {
if self.drag.is_some() {
log::info!("Space drag interrupted by recenter");
self.drag = None;
}
if self.rotate.is_some() {
log::info!("Space rotate interrupted by recenter");
self.rotate = None;
}
let Ok(mut pose) = monado
.get_reference_space_offset(ReferenceSpaceType::Stage)
.inspect_err(|e| log::warn!("Could not recenter due to libmonado error: {e:?}"))
else {
return;
};
pose.position.x += input.hmd.translation.x;
pose.position.z += input.hmd.translation.z;
let _ = monado
.set_reference_space_offset(ReferenceSpaceType::Stage, pose)
.inspect_err(|e| log::warn!("Could not recenter due to libmonado error: {e:?}"));
}
pub fn reset_offset(&mut self, monado: &mut Monado) {
if self.drag.is_some() {
log::info!("Space drag interrupted by manual reset");
@@ -197,11 +225,22 @@ impl PlayspaceMover {
self.rotate = None;
}
let Ok(mut pose) = monado
.get_reference_space_offset(ReferenceSpaceType::Stage)
.inspect_err(|e| log::warn!("Could not fix floor due to libmonado error: {e:?}"))
else {
return;
};
let y1 = input.pointers[0].raw_pose.translation.y;
let y2 = input.pointers[1].raw_pose.translation.y;
let delta = y1.min(y2) - 0.03;
self.last_transform.translation.y += delta;
apply_offset(self.last_transform, monado);
pose.position.y += delta;
let _ = monado
.set_reference_space_offset(ReferenceSpaceType::Stage, pose)
.inspect_err(|e| log::warn!("Could not fix floor due to libmonado error: {e:?}"));
}
}

View File

@@ -49,7 +49,8 @@ pub enum OpenVrTask {
}
pub enum PlayspaceTask {
ResetPlayspace,
Recenter,
Reset,
FixFloor,
}
@@ -61,6 +62,7 @@ pub enum OverlayTask {
DeleteActiveSet,
ToggleEditMode,
ShowHide,
CleanupMirrors,
Modify(OverlaySelector, Box<ModifyOverlayTask>),
Create(OverlaySelector, Box<CreateOverlayTask>),
Drop(OverlaySelector),