diff --git a/src/backend/input.rs b/src/backend/input.rs index ec30c07..1a9b107 100644 --- a/src/backend/input.rs +++ b/src/backend/input.rs @@ -304,7 +304,7 @@ where #[cfg(debug_assertions)] log::trace!("Hit: {} {:?}", hovered.state.name, hit); - if pointer.now.grab && !pointer.before.grab { + if pointer.now.grab && !pointer.before.grab && hovered.state.grabbable { pointer.start_grab(hovered); return hit.dist; } @@ -346,6 +346,9 @@ impl Pointer { } if let Some(hit) = self.ray_test(overlay.state.id, &overlay.state.transform) { + if hit.dist.is_infinite() || hit.dist.is_nan() { + continue; + } hits.try_push(hit); } } diff --git a/src/backend/openvr/overlay.rs b/src/backend/openvr/overlay.rs index 82e3652..cefbf17 100644 --- a/src/backend/openvr/overlay.rs +++ b/src/backend/openvr/overlay.rs @@ -48,7 +48,6 @@ impl OverlayData { self.data.color = Vec4::ONE; self.init(app); - self.upload_transform(overlay); if self.data.width < f32::EPSILON { self.data.width = 1.0; diff --git a/src/backend/overlay.rs b/src/backend/overlay.rs index e1ba350..fac65bd 100644 --- a/src/backend/overlay.rs +++ b/src/backend/overlay.rs @@ -43,7 +43,7 @@ impl Default for OverlayState { want_visible: false, show_hide: false, grabbable: false, - dirty: false, + dirty: true, relative_to: RelativeTo::None, spawn_scale: 1.0, spawn_point: Vec3A::NEG_Z, @@ -95,6 +95,7 @@ impl OverlayState { self.spawn_rotation, self.spawn_point.into(), ); + self.dirty = true; } } pub fn reset(&mut self, app: &mut AppState) { diff --git a/src/overlays/watch.rs b/src/overlays/watch.rs index a2af1bc..12383d0 100644 --- a/src/overlays/watch.rs +++ b/src/overlays/watch.rs @@ -1,6 +1,7 @@ use std::{sync::Arc, time::Instant}; use chrono::Local; +use glam::{vec2, Affine2}; use crate::{ backend::{ @@ -158,6 +159,8 @@ where }); button_x += button_width; } + let interaction_transform = + Affine2::from_translation(vec2(0.5, 0.5)) * Affine2::from_scale(vec2(1., -2.0)); let relative_to = RelativeTo::Hand(state.session.watch_hand); @@ -169,6 +172,7 @@ where spawn_scale: 0.065, spawn_point: state.session.watch_pos.into(), spawn_rotation: state.session.watch_rot, + interaction_transform, relative_to, ..Default::default() }, diff --git a/src/state.rs b/src/state.rs index 822b038..c2f10fc 100644 --- a/src/state.rs +++ b/src/state.rs @@ -11,7 +11,7 @@ use crate::{ shaders::{frag_color, frag_glyph, frag_screen, frag_sprite, frag_srgb, vert_common}, }; -pub const WATCH_DEFAULT_POS: Vec3 = Vec3::new(0., 0., 0.15); +pub const WATCH_DEFAULT_POS: Vec3 = Vec3::new(0.025, 0., 0.15); pub const WATCH_DEFAULT_ROT: Quat = Quat::from_xyzw(0.7071066, 0., 0.7071066, 0.0007963); pub struct AppState { @@ -127,7 +127,7 @@ impl AppSession { screen_max_res: [2560, 1440], capture_method: "auto".to_string(), primary_hand: 1, - watch_hand: 1, + watch_hand: 0, watch_pos: WATCH_DEFAULT_POS, watch_rot: WATCH_DEFAULT_ROT, color_norm: Vec3 {