add space_drag_unlocked settings
This commit is contained in:
@@ -205,6 +205,9 @@ pub struct GeneralConfig {
|
|||||||
#[serde(default = "def_point3")]
|
#[serde(default = "def_point3")]
|
||||||
pub pointer_lerp_factor: f32,
|
pub pointer_lerp_factor: f32,
|
||||||
|
|
||||||
|
#[serde(default = "def_true")]
|
||||||
|
pub space_drag_unlocked: bool,
|
||||||
|
|
||||||
#[serde(default = "def_false")]
|
#[serde(default = "def_false")]
|
||||||
pub space_rotate_unlocked: bool,
|
pub space_rotate_unlocked: bool,
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use glam::{Affine3A, Quat, Vec3, Vec3A};
|
use glam::{Affine3A, Quat, Vec3, Vec3A, vec3a};
|
||||||
use ovr_overlay::{
|
use ovr_overlay::{
|
||||||
chaperone_setup::ChaperoneSetupManager,
|
chaperone_setup::ChaperoneSetupManager,
|
||||||
compositor::CompositorManager,
|
compositor::CompositorManager,
|
||||||
@@ -58,12 +58,12 @@ impl PlayspaceMover {
|
|||||||
&mut self,
|
&mut self,
|
||||||
chaperone_mgr: &mut ChaperoneSetupManager,
|
chaperone_mgr: &mut ChaperoneSetupManager,
|
||||||
overlays: &mut OverlayWindowManager<OpenVrOverlayData>,
|
overlays: &mut OverlayWindowManager<OpenVrOverlayData>,
|
||||||
state: &AppState,
|
app: &AppState,
|
||||||
) {
|
) {
|
||||||
let universe = self.universe.clone();
|
let universe = self.universe.clone();
|
||||||
|
|
||||||
if let Some(data) = self.rotate.as_mut() {
|
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 {
|
if !pointer.now.space_rotate {
|
||||||
self.rotate = None;
|
self.rotate = None;
|
||||||
log::info!("End space rotate");
|
log::info!("End space rotate");
|
||||||
@@ -71,7 +71,7 @@ impl PlayspaceMover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let new_hand =
|
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 dq = new_hand * data.hand_pose.conjugate();
|
||||||
let rel_y = f32::atan2(
|
let rel_y = f32::atan2(
|
||||||
@@ -80,8 +80,8 @@ impl PlayspaceMover {
|
|||||||
);
|
);
|
||||||
|
|
||||||
let mut space_transform = Affine3A::from_rotation_y(rel_y);
|
let mut space_transform = Affine3A::from_rotation_y(rel_y);
|
||||||
let offset = (space_transform.transform_vector3a(state.input_state.hmd.translation)
|
let offset = (space_transform.transform_vector3a(app.input_state.hmd.translation)
|
||||||
- state.input_state.hmd.translation)
|
- app.input_state.hmd.translation)
|
||||||
* -1.0;
|
* -1.0;
|
||||||
let mut overlay_transform = Affine3A::from_rotation_y(-rel_y);
|
let mut overlay_transform = Affine3A::from_rotation_y(-rel_y);
|
||||||
|
|
||||||
@@ -97,7 +97,7 @@ impl PlayspaceMover {
|
|||||||
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 {
|
||||||
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 {
|
if pointer.now.space_rotate {
|
||||||
let Some(mat) = get_working_copy(&universe, chaperone_mgr) else {
|
let Some(mat) = get_working_copy(&universe, chaperone_mgr) else {
|
||||||
log::warn!("Can't space rotate - failed to get zero pose");
|
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() {
|
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 {
|
if !pointer.now.space_drag {
|
||||||
self.drag = None;
|
self.drag = None;
|
||||||
log::info!("End space drag");
|
log::info!("End space drag");
|
||||||
@@ -126,9 +126,13 @@ impl PlayspaceMover {
|
|||||||
|
|
||||||
let new_hand = data
|
let new_hand = data
|
||||||
.pose
|
.pose
|
||||||
.transform_point3a(state.input_state.pointers[data.hand].raw_pose.translation);
|
.transform_point3a(app.input_state.pointers[data.hand].raw_pose.translation);
|
||||||
let relative_pos =
|
|
||||||
(new_hand - data.hand_pose) * state.session.config.space_drag_multiplier;
|
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 {
|
if relative_pos.length_squared() > 1000.0 {
|
||||||
log::warn!("Space drag too fast, ignoring");
|
log::warn!("Space drag too fast, ignoring");
|
||||||
@@ -156,7 +160,7 @@ impl PlayspaceMover {
|
|||||||
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 {
|
||||||
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 {
|
if pointer.now.space_drag {
|
||||||
let Some(mat) = get_working_copy(&universe, chaperone_mgr) else {
|
let Some(mat) = get_working_copy(&universe, chaperone_mgr) else {
|
||||||
log::warn!("Can't space drag - failed to get zero pose");
|
log::warn!("Can't space drag - failed to get zero pose");
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use glam::{Affine3A, Quat, Vec3A};
|
use glam::{Affine3A, Quat, Vec3A, vec3a};
|
||||||
use libmonado::{Monado, Pose, ReferenceSpaceType};
|
use libmonado::{Monado, Pose, ReferenceSpaceType};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
@@ -60,10 +60,10 @@ impl PlayspaceMover {
|
|||||||
pub fn update(
|
pub fn update(
|
||||||
&mut self,
|
&mut self,
|
||||||
overlays: &mut OverlayWindowManager<OpenXrOverlayData>,
|
overlays: &mut OverlayWindowManager<OpenXrOverlayData>,
|
||||||
state: &AppState,
|
app: &AppState,
|
||||||
monado: &mut Monado,
|
monado: &mut Monado,
|
||||||
) {
|
) {
|
||||||
for pointer in &state.input_state.pointers {
|
for pointer in &app.input_state.pointers {
|
||||||
if pointer.now.space_reset {
|
if pointer.now.space_reset {
|
||||||
if !pointer.before.space_reset {
|
if !pointer.before.space_reset {
|
||||||
log::info!("Space reset");
|
log::info!("Space reset");
|
||||||
@@ -74,7 +74,7 @@ impl PlayspaceMover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(mut data) = self.rotate.take() {
|
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 {
|
if !pointer.now.space_rotate {
|
||||||
self.last_transform = data.pose;
|
self.last_transform = data.pose;
|
||||||
log::info!("End space rotate");
|
log::info!("End space rotate");
|
||||||
@@ -82,10 +82,10 @@ impl PlayspaceMover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let new_hand =
|
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 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)
|
Affine3A::from_quat(dq)
|
||||||
} else {
|
} else {
|
||||||
let rel_y = f32::atan2(
|
let rel_y = f32::atan2(
|
||||||
@@ -95,8 +95,8 @@ impl PlayspaceMover {
|
|||||||
|
|
||||||
Affine3A::from_rotation_y(rel_y)
|
Affine3A::from_rotation_y(rel_y)
|
||||||
};
|
};
|
||||||
let offset = (space_transform.transform_vector3a(state.input_state.hmd.translation)
|
let offset = (space_transform.transform_vector3a(app.input_state.hmd.translation)
|
||||||
- state.input_state.hmd.translation)
|
- app.input_state.hmd.translation)
|
||||||
* -1.0;
|
* -1.0;
|
||||||
|
|
||||||
space_transform.translation = offset;
|
space_transform.translation = offset;
|
||||||
@@ -107,7 +107,7 @@ impl PlayspaceMover {
|
|||||||
apply_offset(data.pose, monado);
|
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 app.input_state.pointers.iter().enumerate() {
|
||||||
if pointer.now.space_rotate {
|
if pointer.now.space_rotate {
|
||||||
let hand_pose = Quat::from_affine3(&(self.last_transform * pointer.raw_pose));
|
let hand_pose = Quat::from_affine3(&(self.last_transform * pointer.raw_pose));
|
||||||
self.rotate = Some(MoverData {
|
self.rotate = Some(MoverData {
|
||||||
@@ -123,7 +123,7 @@ impl PlayspaceMover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(mut data) = self.drag.take() {
|
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 {
|
if !pointer.now.space_drag {
|
||||||
self.last_transform = data.pose;
|
self.last_transform = data.pose;
|
||||||
log::info!("End space drag");
|
log::info!("End space drag");
|
||||||
@@ -132,9 +132,13 @@ impl PlayspaceMover {
|
|||||||
|
|
||||||
let new_hand = data
|
let new_hand = data
|
||||||
.pose
|
.pose
|
||||||
.transform_point3a(state.input_state.pointers[data.hand].raw_pose.translation);
|
.transform_point3a(app.input_state.pointers[data.hand].raw_pose.translation);
|
||||||
let relative_pos =
|
|
||||||
(new_hand - data.hand_pose) * state.session.config.space_drag_multiplier;
|
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 {
|
if relative_pos.length_squared() > 1000.0 {
|
||||||
log::warn!("Space drag too fast, ignoring");
|
log::warn!("Space drag too fast, ignoring");
|
||||||
@@ -159,7 +163,7 @@ impl PlayspaceMover {
|
|||||||
apply_offset(data.pose, monado);
|
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 app.input_state.pointers.iter().enumerate() {
|
||||||
if pointer.now.space_drag {
|
if pointer.now.space_drag {
|
||||||
let hand_pos = self
|
let hand_pos = self
|
||||||
.last_transform
|
.last_transform
|
||||||
|
|||||||
@@ -28,8 +28,12 @@
|
|||||||
## How fast to drag when the space drag feature is activated
|
## How fast to drag when the space drag feature is activated
|
||||||
#space_drag_multiplier: 1.0
|
#space_drag_multiplier: 1.0
|
||||||
|
|
||||||
## When enabled, the space_rotate binding can be used
|
## Setting this to false will make space_drag
|
||||||
## to rotate in any axis. Imagine horizon mode².
|
## 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
|
#space_rotate_unlocked: false
|
||||||
|
|
||||||
## Monado/WiVRn only. Use passthrough camera if the headset supports it.
|
## Monado/WiVRn only. Use passthrough camera if the headset supports it.
|
||||||
|
|||||||
Reference in New Issue
Block a user