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 glam::{vec3, Mat4};
use glam::{vec3, Mat4, Vec3};
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 stereokit::input::{ButtonState, Key, Ray as SkRay, StereoKitInput};
use tracing::instrument;
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 {
node: Arc<Node>,
spatial: Arc<Spatial>,
@@ -51,14 +60,11 @@ impl MousePointer {
pub fn update(&self, sk: &impl StereoKitInput) {
let mouse = sk.input_mouse();
if let Some(ray) = SkRay::from_mouse(mouse) {
self.spatial.set_local_transform_components(
None,
Transform::from_position_rotation(
ray.pos,
glam::Quat::from_rotation_arc(vec3(0.0, 0.0, 1.0), ray.dir.into()),
),
);
if let Some(ray) = SkRay::from_mouse(&mouse) {
self.spatial.set_local_transform(
Mat4::look_to_rh(ray.pos.into(), -Vec3::from(ray.dir), vec3(0.0, 1.0, 0.0))
.inverse(),
)
}
{
// Set pointer input datamap
@@ -118,11 +124,13 @@ impl MousePointer {
if let Some(rx) = rx {
let mut keys_up = 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()?)))
.map(|(i, k)| (i, sk.input_key(k)))
.filter(|(_, k)| k.contains(ButtonState::Changed))
{
.map(|(i, k)| (i, sk.input_key(k)));
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) {
keys_down.push(key);
} else {
@@ -130,25 +138,16 @@ impl MousePointer {
}
}
let mut fbb = flexbuffers::Builder::default();
{
let mut map = fbb.start_map();
map.push("keyboard", "xkbv1");
map.push("keymap", SK_KEYMAP);
{
let mut keys_up_flex = map.start_vector("keys_up");
for key in keys_up {
keys_up_flex.push(key);
}
}
{
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();
let key_event = KeyboardEvent {
keyboard: "xkbv1".to_string(),
keymap: Some(SK_KEYMAP.to_string()),
keys_up: Some(keys_up),
keys_down: Some(keys_down),
};
let mut serializer = flexbuffers::FlexbufferSerializer::new();
let _ = key_event.serialize(&mut serializer);
rx.send_data(&self.node.uid, serializer.take_buffer())
.unwrap();
}
}
}