grab, mouse move

This commit is contained in:
galister
2023-12-08 19:41:41 +01:00
parent a3b60b9607
commit 1842259e66
7 changed files with 35 additions and 27 deletions

View File

@@ -4,6 +4,7 @@ use std::{
time::Instant,
};
use glam::Vec2;
use idmap::IdMap;
use crate::{
@@ -22,6 +23,7 @@ where
T: Default,
{
overlays: IdMap<usize, OverlayData<T>>,
pub extent: Vec2,
}
impl<T> OverlayContainer<T>
@@ -31,7 +33,7 @@ where
pub fn new(app: &mut AppState) -> Self {
let mut overlays = IdMap::new();
let screens = if std::env::var("WAYLAND_DISPLAY").is_ok() {
let (screens, extent) = if std::env::var("WAYLAND_DISPLAY").is_ok() {
get_screens_wayland(&app.session)
} else {
get_screens_x11()
@@ -52,7 +54,7 @@ where
overlays.insert(screen.state.id, screen);
}
Self { overlays }
Self { overlays, extent }
}
pub fn mut_by_selector(&mut self, selector: &OverlaySelector) -> Option<&mut OverlayData<T>> {

View File

@@ -214,12 +214,12 @@ impl<THand> Pointer<THand> {
{
if let Some(grab_data) = self.interaction.grabbed {
if let Some(grabbed) = overlays.mut_by_id(grab_data.grabbed_id) {
self.handle_grabbed(grabbed, grab_data.offset);
self.handle_grabbed(grabbed);
} else {
log::warn!("Grabbed overlay {} does not exist", grab_data.grabbed_id);
self.interaction.grabbed = None;
}
return grab_data.offset.length(); // grab interaction
return 0.1;
}
let Some(mut hit) = self.get_nearest_hit(overlays) else {
@@ -270,7 +270,8 @@ impl<THand> Pointer<THand> {
hit.primary = true;
}
log::debug!("Hit: {} {:?}", hovered.state.name, hit);
#[cfg(debug_assertions)]
log::trace!("Hit: {} {:?}", hovered.state.name, hit);
if self.now.grab && !self.before.grab {
self.start_grab(hovered);
@@ -358,25 +359,25 @@ impl<THand> Pointer<THand> {
offset,
grabbed_id: overlay.state.id,
});
log::info!("Hand {}: grabbed {}", self.idx, overlay.state.name);
log::debug!("Hand {}: grabbed {}", self.idx, overlay.state.name);
}
fn handle_grabbed<O>(&mut self, overlay: &mut OverlayData<O>, offset: Vec3A)
fn handle_grabbed<O>(&mut self, overlay: &mut OverlayData<O>)
where
O: Default,
{
if self.now.grab {
overlay.state.transform.translation = self.pose.transform_point3a(offset);
if self.now.click && !self.before.click {
log::warn!("todo: click-while-grabbed");
}
let grab_data = self.interaction.grabbed.as_mut().unwrap();
match self.interaction.mode {
PointerMode::Left => {
overlay.state.transform.translation.y += self.now.scroll * 0.01;
grab_data.offset.z -= self.now.scroll * 0.05;
}
_ => {
log::warn!("scale: {}", self.now.scroll);
overlay.state.transform.matrix3 = overlay
.state
.transform
@@ -384,6 +385,7 @@ impl<THand> Pointer<THand> {
.mul_scalar(1.0 + 0.01 * self.now.scroll);
}
}
overlay.state.transform.translation = self.pose.transform_point3a(grab_data.offset);
overlay.state.dirty = true;
} else {
overlay.state.spawn_point = overlay.state.transform.translation;

View File

@@ -200,7 +200,7 @@ impl InputState<OpenVrInputState, OpenVrHandState> {
hand.now.scroll = input
.get_analog_action_data(self.data.scroll_hnd, hand.data.input_hnd)
.map(|x| x.0.x)
.map(|x| x.0.y)
.unwrap_or(0.0);
}

View File

@@ -55,6 +55,8 @@ pub fn openvr_run() {
let mut state = AppState::new(instance_extensions, device_extensions_fn);
let mut overlays = OverlayContainer::<OpenVrOverlayData>::new(&mut state);
state.input.set_desktop_extent(overlays.extent);
if let Err(e) = input_mngr.set_action_manifest(action_manifest_path()) {
log::error!("Failed to set action manifest: {}", e.description());
return;