use crate::{ core::client::INTERNAL_CLIENT, nodes::{ Node, OwnedNode, fields::{FieldTrait, Ray}, input::{INPUT_HANDLER_REGISTRY, InputDataType, InputMethod, Pointer}, spatial::Spatial, }, }; use color_eyre::eyre::Result; use glam::{Mat4, vec3}; use serde::{Deserialize, Serialize}; use stardust_xr::values::Datamap; use std::sync::Arc; #[derive(Default, Deserialize, Serialize)] pub struct EyeDatamap { eye: u32, } #[derive(Debug, Clone, Serialize)] pub struct KeyboardEvent { pub keyboard: String, pub keymap: Option, pub keys_up: Option>, pub keys_down: Option>, } pub struct EyePointer { node: OwnedNode, spatial: Arc, pointer: Arc, } impl EyePointer { pub fn new() -> Result { let node = Node::generate(&INTERNAL_CLIENT, false).add_to_scenegraph_owned()?; let spatial = Spatial::add_to(&node.0, None, Mat4::IDENTITY, false); let pointer = InputMethod::add_to( &node.0, InputDataType::Pointer(Pointer::default()), Datamap::from_typed(EyeDatamap::default())?, ) .unwrap(); Ok(EyePointer { node, spatial, pointer, }) } }