diff --git a/src/objects/input/mouse_pointer.rs b/src/objects/input/mouse_pointer.rs index 8597042..e6e063a 100644 --- a/src/objects/input/mouse_pointer.rs +++ b/src/objects/input/mouse_pointer.rs @@ -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, + pub keys_up: Option>, + pub keys_down: Option>, +} + pub struct MousePointer { node: Arc, spatial: Arc, @@ -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(); } } }