add space_drag_unlocked settings

This commit is contained in:
galister
2025-12-22 13:08:02 +09:00
parent 1a1e1c51b0
commit e6cb608bbf
4 changed files with 43 additions and 28 deletions

View File

@@ -205,6 +205,9 @@ pub struct GeneralConfig {
#[serde(default = "def_point3")]
pub pointer_lerp_factor: f32,
#[serde(default = "def_true")]
pub space_drag_unlocked: bool,
#[serde(default = "def_false")]
pub space_rotate_unlocked: bool,

View File

@@ -1,4 +1,4 @@
use glam::{Affine3A, Quat, Vec3, Vec3A};
use glam::{Affine3A, Quat, Vec3, Vec3A, vec3a};
use ovr_overlay::{
chaperone_setup::ChaperoneSetupManager,
compositor::CompositorManager,
@@ -58,12 +58,12 @@ impl PlayspaceMover {
&mut self,
chaperone_mgr: &mut ChaperoneSetupManager,
overlays: &mut OverlayWindowManager<OpenVrOverlayData>,
state: &AppState,
app: &AppState,
) {
let universe = self.universe.clone();
if let Some(data) = self.rotate.as_mut() {
let pointer = &state.input_state.pointers[data.hand];
let pointer = &app.input_state.pointers[data.hand];
if !pointer.now.space_rotate {
self.rotate = None;
log::info!("End space rotate");
@@ -71,7 +71,7 @@ impl PlayspaceMover {
}
let new_hand =
Quat::from_affine3(&(data.pose * state.input_state.pointers[data.hand].raw_pose));
Quat::from_affine3(&(data.pose * app.input_state.pointers[data.hand].raw_pose));
let dq = new_hand * data.hand_pose.conjugate();
let rel_y = f32::atan2(
@@ -80,8 +80,8 @@ impl PlayspaceMover {
);
let mut space_transform = Affine3A::from_rotation_y(rel_y);
let offset = (space_transform.transform_vector3a(state.input_state.hmd.translation)
- state.input_state.hmd.translation)
let offset = (space_transform.transform_vector3a(app.input_state.hmd.translation)
- app.input_state.hmd.translation)
* -1.0;
let mut overlay_transform = Affine3A::from_rotation_y(-rel_y);
@@ -97,7 +97,7 @@ impl PlayspaceMover {
set_working_copy(&universe, chaperone_mgr, &data.pose);
chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live);
} else {
for (i, pointer) in state.input_state.pointers.iter().enumerate() {
for (i, pointer) in app.input_state.pointers.iter().enumerate() {
if pointer.now.space_rotate {
let Some(mat) = get_working_copy(&universe, chaperone_mgr) else {
log::warn!("Can't space rotate - failed to get zero pose");
@@ -117,7 +117,7 @@ impl PlayspaceMover {
}
if let Some(data) = self.drag.as_mut() {
let pointer = &state.input_state.pointers[data.hand];
let pointer = &app.input_state.pointers[data.hand];
if !pointer.now.space_drag {
self.drag = None;
log::info!("End space drag");
@@ -126,9 +126,13 @@ impl PlayspaceMover {
let new_hand = data
.pose
.transform_point3a(state.input_state.pointers[data.hand].raw_pose.translation);
let relative_pos =
(new_hand - data.hand_pose) * state.session.config.space_drag_multiplier;
.transform_point3a(app.input_state.pointers[data.hand].raw_pose.translation);
let relative_pos = if app.session.config.space_drag_unlocked {
new_hand - data.hand_pose
} else {
vec3a(0., new_hand.y - data.hand_pose.y, 0.)
} * app.session.config.space_drag_multiplier;
if relative_pos.length_squared() > 1000.0 {
log::warn!("Space drag too fast, ignoring");
@@ -156,7 +160,7 @@ impl PlayspaceMover {
set_working_copy(&universe, chaperone_mgr, &data.pose);
chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live);
} else {
for (i, pointer) in state.input_state.pointers.iter().enumerate() {
for (i, pointer) in app.input_state.pointers.iter().enumerate() {
if pointer.now.space_drag {
let Some(mat) = get_working_copy(&universe, chaperone_mgr) else {
log::warn!("Can't space drag - failed to get zero pose");

View File

@@ -1,4 +1,4 @@
use glam::{Affine3A, Quat, Vec3A};
use glam::{Affine3A, Quat, Vec3A, vec3a};
use libmonado::{Monado, Pose, ReferenceSpaceType};
use crate::{
@@ -60,10 +60,10 @@ impl PlayspaceMover {
pub fn update(
&mut self,
overlays: &mut OverlayWindowManager<OpenXrOverlayData>,
state: &AppState,
app: &AppState,
monado: &mut Monado,
) {
for pointer in &state.input_state.pointers {
for pointer in &app.input_state.pointers {
if pointer.now.space_reset {
if !pointer.before.space_reset {
log::info!("Space reset");
@@ -74,7 +74,7 @@ impl PlayspaceMover {
}
if let Some(mut data) = self.rotate.take() {
let pointer = &state.input_state.pointers[data.hand];
let pointer = &app.input_state.pointers[data.hand];
if !pointer.now.space_rotate {
self.last_transform = data.pose;
log::info!("End space rotate");
@@ -82,10 +82,10 @@ impl PlayspaceMover {
}
let new_hand =
Quat::from_affine3(&(data.pose * state.input_state.pointers[data.hand].raw_pose));
Quat::from_affine3(&(data.pose * app.input_state.pointers[data.hand].raw_pose));
let dq = new_hand * data.hand_pose.conjugate();
let mut space_transform = if state.session.config.space_rotate_unlocked {
let mut space_transform = if app.session.config.space_rotate_unlocked {
Affine3A::from_quat(dq)
} else {
let rel_y = f32::atan2(
@@ -95,8 +95,8 @@ impl PlayspaceMover {
Affine3A::from_rotation_y(rel_y)
};
let offset = (space_transform.transform_vector3a(state.input_state.hmd.translation)
- state.input_state.hmd.translation)
let offset = (space_transform.transform_vector3a(app.input_state.hmd.translation)
- app.input_state.hmd.translation)
* -1.0;
space_transform.translation = offset;
@@ -107,7 +107,7 @@ impl PlayspaceMover {
apply_offset(data.pose, monado);
self.rotate = Some(data);
} else {
for (i, pointer) in state.input_state.pointers.iter().enumerate() {
for (i, pointer) in app.input_state.pointers.iter().enumerate() {
if pointer.now.space_rotate {
let hand_pose = Quat::from_affine3(&(self.last_transform * pointer.raw_pose));
self.rotate = Some(MoverData {
@@ -123,7 +123,7 @@ impl PlayspaceMover {
}
if let Some(mut data) = self.drag.take() {
let pointer = &state.input_state.pointers[data.hand];
let pointer = &app.input_state.pointers[data.hand];
if !pointer.now.space_drag {
self.last_transform = data.pose;
log::info!("End space drag");
@@ -132,9 +132,13 @@ impl PlayspaceMover {
let new_hand = data
.pose
.transform_point3a(state.input_state.pointers[data.hand].raw_pose.translation);
let relative_pos =
(new_hand - data.hand_pose) * state.session.config.space_drag_multiplier;
.transform_point3a(app.input_state.pointers[data.hand].raw_pose.translation);
let relative_pos = if app.session.config.space_drag_unlocked {
new_hand - data.hand_pose
} else {
vec3a(0., new_hand.y - data.hand_pose.y, 0.)
} * app.session.config.space_drag_multiplier;
if relative_pos.length_squared() > 1000.0 {
log::warn!("Space drag too fast, ignoring");
@@ -159,7 +163,7 @@ impl PlayspaceMover {
apply_offset(data.pose, monado);
self.drag = Some(data);
} else {
for (i, pointer) in state.input_state.pointers.iter().enumerate() {
for (i, pointer) in app.input_state.pointers.iter().enumerate() {
if pointer.now.space_drag {
let hand_pos = self
.last_transform

View File

@@ -28,8 +28,12 @@
## How fast to drag when the space drag feature is activated
#space_drag_multiplier: 1.0
## When enabled, the space_rotate binding can be used
## to rotate in any axis. Imagine horizon mode².
## Setting this to false will make space_drag
## only affect the vertical axis (Y).
#space_drag_unlocked: true
## Monado/WiVRn only. When enabled, the space_rotate binding
## can rotate in any axis. Imagine horizon mode².
#space_rotate_unlocked: false
## Monado/WiVRn only. Use passthrough camera if the headset supports it.