fix(mouse pointer): proper pointer transform
This commit is contained in:
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user