fix(mouse pointer): proper pointer transform

This commit is contained in:
Nova
2023-02-17 13:10:08 -05:00
parent c42f69cb69
commit 0c15f54bdc

View File

@@ -9,15 +9,24 @@ use crate::{
}, },
}; };
use color_eyre::eyre::Result; use color_eyre::eyre::Result;
use glam::{vec3, Mat4}; use glam::{vec3, Mat4, Vec3};
use nanoid::nanoid; use nanoid::nanoid;
use stardust_xr::{schemas::flat::Datamap, values::Transform}; use serde::Serialize;
use stardust_xr::schemas::flat::Datamap;
use std::{convert::TryFrom, sync::Arc}; use std::{convert::TryFrom, sync::Arc};
use stereokit::input::{ButtonState, Key, Ray as SkRay, StereoKitInput}; use stereokit::input::{ButtonState, Key, Ray as SkRay, StereoKitInput};
use tracing::instrument; use tracing::instrument;
const SK_KEYMAP: &str = include_str!("sk.kmp"); const SK_KEYMAP: &str = include_str!("sk.kmp");
#[derive(Debug, Clone, Serialize)]
pub struct KeyboardEvent {
pub keyboard: String,
pub keymap: Option<String>,
pub keys_up: Option<Vec<u32>>,
pub keys_down: Option<Vec<u32>>,
}
pub struct MousePointer { pub struct MousePointer {
node: Arc<Node>, node: Arc<Node>,
spatial: Arc<Spatial>, spatial: Arc<Spatial>,
@@ -51,14 +60,11 @@ impl MousePointer {
pub fn update(&self, sk: &impl StereoKitInput) { pub fn update(&self, sk: &impl StereoKitInput) {
let mouse = sk.input_mouse(); let mouse = sk.input_mouse();
if let Some(ray) = SkRay::from_mouse(mouse) { if let Some(ray) = SkRay::from_mouse(&mouse) {
self.spatial.set_local_transform_components( self.spatial.set_local_transform(
None, Mat4::look_to_rh(ray.pos.into(), -Vec3::from(ray.dir), vec3(0.0, 1.0, 0.0))
Transform::from_position_rotation( .inverse(),
ray.pos, )
glam::Quat::from_rotation_arc(vec3(0.0, 0.0, 1.0), ray.dir.into()),
),
);
} }
{ {
// Set pointer input datamap // Set pointer input datamap
@@ -118,11 +124,13 @@ impl MousePointer {
if let Some(rx) = rx { if let Some(rx) = rx {
let mut keys_up = vec![]; let mut keys_up = vec![];
let mut keys_down = vec![]; let mut keys_down = vec![];
for (key, state) in (1_u32..254) let keys = (8_u32..254)
.filter_map(|i| Some((i, Key::try_from(i).ok()?))) .filter_map(|i| Some((i, Key::try_from(i).ok()?)))
.map(|(i, k)| (i, sk.input_key(k))) .map(|(i, k)| (i, sk.input_key(k)));
.filter(|(_, k)| k.contains(ButtonState::Changed)) for (key, state) in keys.clone() {
{ println!("Key {key} is {state:?}");
}
for (key, state) in keys.filter(|(_, k)| k.contains(ButtonState::Changed)) {
if state.contains(ButtonState::Active) { if state.contains(ButtonState::Active) {
keys_down.push(key); keys_down.push(key);
} else { } else {
@@ -130,25 +138,16 @@ impl MousePointer {
} }
} }
let mut fbb = flexbuffers::Builder::default(); let key_event = KeyboardEvent {
{ keyboard: "xkbv1".to_string(),
let mut map = fbb.start_map(); keymap: Some(SK_KEYMAP.to_string()),
map.push("keyboard", "xkbv1"); keys_up: Some(keys_up),
map.push("keymap", SK_KEYMAP); keys_down: Some(keys_down),
{ };
let mut keys_up_flex = map.start_vector("keys_up"); let mut serializer = flexbuffers::FlexbufferSerializer::new();
for key in keys_up { let _ = key_event.serialize(&mut serializer);
keys_up_flex.push(key); rx.send_data(&self.node.uid, serializer.take_buffer())
} .unwrap();
}
{
let mut keys_down_flex = map.start_vector("keys_down");
for key in keys_down {
keys_down_flex.push(key);
}
}
}
rx.send_data(&self.node.uid, fbb.take_buffer()).unwrap();
} }
} }
} }