Watch rotation + galister fixes (Keyboard mapping fix, OpenXR hand transform fix) (#4)
* Watch rotation + galister fixes (Keyboard mapping fix, OpenXR hand transform fix) * Use from_scale_rotation_translation
This commit is contained in:
@@ -353,7 +353,10 @@ fn quat_lerp(a: Quat, mut b: Quat, t: f32) -> Quat {
|
|||||||
|
|
||||||
fn transform_to_posef(transform: &Affine3A) -> xr::Posef {
|
fn transform_to_posef(transform: &Affine3A) -> xr::Posef {
|
||||||
let translation = transform.translation;
|
let translation = transform.translation;
|
||||||
let rotation = Quat::from_affine3(transform).normalize();
|
let norm_mat3 = transform
|
||||||
|
.matrix3
|
||||||
|
.mul_scalar(1.0 / transform.matrix3.x_axis.length());
|
||||||
|
let rotation = Quat::from_mat3a(&norm_mat3).normalize();
|
||||||
|
|
||||||
xr::Posef {
|
xr::Posef {
|
||||||
orientation: xr::Quaternionf {
|
orientation: xr::Quaternionf {
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ where
|
|||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
OverlayData {
|
OverlayData {
|
||||||
state: Default::default(),
|
state: Default::default(),
|
||||||
backend: Box::new(SplitOverlayBackend::default()),
|
backend: Box::<SplitOverlayBackend>::default(),
|
||||||
primary_pointer: None,
|
primary_pointer: None,
|
||||||
data: Default::default(),
|
data: Default::default(),
|
||||||
}
|
}
|
||||||
@@ -87,17 +87,22 @@ impl OverlayState {
|
|||||||
RelativeTo::Hand(idx) => Some(app.input_state.pointers[idx].pose),
|
RelativeTo::Hand(idx) => Some(app.input_state.pointers[idx].pose),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn auto_movement(&mut self, app: &mut AppState) {
|
pub fn auto_movement(&mut self, app: &mut AppState) {
|
||||||
if let Some(parent) = self.parent_transform(app) {
|
if let Some(parent) = self.parent_transform(app) {
|
||||||
self.transform = parent
|
self.transform = parent
|
||||||
* Affine3A::from_scale_rotation_translation(
|
* Affine3A::from_scale_rotation_translation(
|
||||||
Vec3::ONE * self.spawn_scale,
|
Vec3::ONE * self.spawn_scale,
|
||||||
self.spawn_rotation,
|
self.spawn_rotation
|
||||||
|
* Quat::from_rotation_x(f32::to_radians(-180.0))
|
||||||
|
* Quat::from_rotation_z(f32::to_radians(180.0)),
|
||||||
self.spawn_point.into(),
|
self.spawn_point.into(),
|
||||||
);
|
);
|
||||||
|
|
||||||
self.dirty = true;
|
self.dirty = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn reset(&mut self, app: &mut AppState) {
|
pub fn reset(&mut self, app: &mut AppState) {
|
||||||
let translation = app.input_state.hmd.transform_point3a(self.spawn_point);
|
let translation = app.input_state.hmd.transform_point3a(self.spawn_point);
|
||||||
self.transform = Affine3A::from_scale_rotation_translation(
|
self.transform = Affine3A::from_scale_rotation_translation(
|
||||||
@@ -108,6 +113,7 @@ impl OverlayState {
|
|||||||
|
|
||||||
self.realign(&app.input_state.hmd);
|
self.realign(&app.input_state.hmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn realign(&mut self, hmd: &Affine3A) {
|
pub fn realign(&mut self, hmd: &Affine3A) {
|
||||||
let to_hmd = hmd.translation - self.transform.translation;
|
let to_hmd = hmd.translation - self.transform.translation;
|
||||||
let up_dir: Vec3A;
|
let up_dir: Vec3A;
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ impl UInputProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for key in VirtualKey::iter() {
|
for key in VirtualKey::iter() {
|
||||||
let key: Key = unsafe { transmute(key as u16) };
|
let key: Key = unsafe { transmute((key as u16) - 8) };
|
||||||
if handle.set_keybit(key).is_err() {
|
if handle.set_keybit(key).is_err() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
@@ -249,6 +249,7 @@ pub const SUPER: KeyModifier = 0x40;
|
|||||||
pub const META: KeyModifier = 0x80;
|
pub const META: KeyModifier = 0x80;
|
||||||
|
|
||||||
#[allow(non_camel_case_types)]
|
#[allow(non_camel_case_types)]
|
||||||
|
#[repr(u16)]
|
||||||
#[derive(Debug, PartialEq, Clone, Copy, IntegerId, EnumString, EnumIter)]
|
#[derive(Debug, PartialEq, Clone, Copy, IntegerId, EnumString, EnumIter)]
|
||||||
pub enum VirtualKey {
|
pub enum VirtualKey {
|
||||||
Escape = 9,
|
Escape = 9,
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ where
|
|||||||
|
|
||||||
canvas.bg_color = color_parse("#405060");
|
canvas.bg_color = color_parse("#405060");
|
||||||
|
|
||||||
for screen in screens.into_iter() {
|
for screen in screens.iter() {
|
||||||
let button = canvas.button(
|
let button = canvas.button(
|
||||||
button_x + 2.,
|
button_x + 2.,
|
||||||
162.,
|
162.,
|
||||||
@@ -169,7 +169,7 @@ where
|
|||||||
name: "Watch".into(),
|
name: "Watch".into(),
|
||||||
size: (400, 200),
|
size: (400, 200),
|
||||||
want_visible: true,
|
want_visible: true,
|
||||||
spawn_scale: 0.065 * state.session.config.watch_scale,
|
spawn_scale: 0.11 * state.session.config.watch_scale,
|
||||||
spawn_point: state.session.watch_pos.into(),
|
spawn_point: state.session.watch_pos.into(),
|
||||||
spawn_rotation: state.session.watch_rot,
|
spawn_rotation: state.session.watch_rot,
|
||||||
interaction_transform,
|
interaction_transform,
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ use crate::{
|
|||||||
shaders::{frag_color, frag_glyph, frag_screen, frag_sprite, frag_srgb, vert_common},
|
shaders::{frag_color, frag_glyph, frag_screen, frag_sprite, frag_srgb, vert_common},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const WATCH_DEFAULT_POS: Vec3 = Vec3::new(0.025, 0., 0.15);
|
pub const WATCH_DEFAULT_POS: Vec3 = Vec3::new(-0.03, -0.01, 0.1);
|
||||||
pub const WATCH_DEFAULT_ROT: Quat = Quat::from_xyzw(0.7071066, 0., 0.7071066, 0.0007963);
|
pub const WATCH_DEFAULT_ROT: Quat = Quat::from_xyzw(0.7071066, 0., 0.7071066, 0.0007963);
|
||||||
|
|
||||||
pub struct AppState {
|
pub struct AppState {
|
||||||
|
|||||||
Reference in New Issue
Block a user