diff --git a/src/backend/openxr/playspace.rs b/src/backend/openxr/playspace.rs index 92fd680..d473770 100644 --- a/src/backend/openxr/playspace.rs +++ b/src/backend/openxr/playspace.rs @@ -77,19 +77,20 @@ impl PlayspaceMover { Quat::from_affine3(&(data.pose * state.input_state.pointers[data.hand].raw_pose)); let dq = new_hand * data.hand_pose.conjugate(); - let rel_y = f32::atan2( - 2.0 * (dq.y * dq.w + dq.x * dq.z), - (2.0 * (dq.w * dq.w + dq.x * dq.x)) - 1.0, - ); + let mut space_transform = if state.session.config.space_rotate_unlocked { + Affine3A::from_quat(dq) + } else { + let rel_y = f32::atan2( + 2.0 * (dq.y * dq.w + dq.x * dq.z), + (2.0 * (dq.w * dq.w + dq.x * dq.x)) - 1.0, + ); - //let mut space_transform = Affine3A::from_rotation_translation(dq, Vec3::ZERO); - let mut space_transform = Affine3A::from_rotation_y(rel_y); + Affine3A::from_rotation_y(rel_y) + }; let offset = (space_transform.transform_vector3a(state.input_state.hmd.translation) - state.input_state.hmd.translation) * -1.0; - let mut overlay_transform = Affine3A::from_rotation_y(-rel_y); - overlay_transform.translation = offset; space_transform.translation = offset; data.pose *= space_transform; diff --git a/src/config.rs b/src/config.rs index cda55aa..5bec6fb 100644 --- a/src/config.rs +++ b/src/config.rs @@ -270,6 +270,9 @@ pub struct GeneralConfig { #[serde(default = "def_point3")] pub pointer_lerp_factor: f32, + + #[serde(default = "def_false")] + pub space_rotate_unlocked: bool, } impl GeneralConfig { diff --git a/src/gui/modular/button.rs b/src/gui/modular/button.rs index d58d369..1eb97a6 100644 --- a/src/gui/modular/button.rs +++ b/src/gui/modular/button.rs @@ -47,6 +47,7 @@ pub enum HighlightTest { AutoRealign, NotificationSounds, Notifications, + RorateLock, } #[derive(Deserialize, Clone)] @@ -55,6 +56,7 @@ pub enum SystemAction { ToggleAutoRealign, ToggleNotificationSounds, ToggleNotifications, + ToggleRotateLock, PlayspaceResetOffset, PlayspaceFixFloor, RecalculateExtent, @@ -298,6 +300,7 @@ fn modular_button_highlight( HighlightTest::AutoRealign => app.session.config.realign_on_showhide, HighlightTest::NotificationSounds => app.session.config.notifications_sound_enabled, HighlightTest::Notifications => app.session.config.notifications_enabled, + HighlightTest::RorateLock => !app.session.config.space_rotate_unlocked, }; if lit { @@ -369,6 +372,19 @@ fn run_system(action: &SystemAction, app: &mut AppState) { ) .submit(app); } + SystemAction::ToggleRotateLock => { + app.session.config.space_rotate_unlocked = !app.session.config.space_rotate_unlocked; + Toast::new( + ToastTopic::System, + format!( + "Space rotate axis lock now {}.", + ENABLED_DISABLED[!app.session.config.space_rotate_unlocked as usize] + ) + .into(), + "".into(), + ) + .submit(app); + } SystemAction::PlayspaceResetOffset => { app.tasks .enqueue(TaskType::System(SystemTask::ResetPlayspace));