use super::{alias::Alias, spatial::Spatial, Node}; use crate::{ core::client::{Client, INTERNAL_CLIENT}, nodes::alias::AliasInfo, }; use color_eyre::eyre::Result; use glam::{vec3, Mat4}; use std::sync::Arc; use stereokit::input::StereoKitInput; use tracing::instrument; lazy_static::lazy_static! { static ref HMD: Arc = create(); } fn create() -> Arc { let node = Arc::new(Node::create(&INTERNAL_CLIENT, "", "hmd", false)); Spatial::add_to(&node, None, Mat4::IDENTITY, false).expect("Unable to make spatial for HMD"); node } #[instrument(level = "debug", name = "Update HMD Pose", skip(sk))] pub fn frame(sk: &impl StereoKitInput) { let spatial = HMD .spatial .get() .expect("Unable to get spatial to update HMD"); let hmd_pose = sk.input_head(); *spatial.transform.lock() = Mat4::from_scale_rotation_translation( vec3(1.0, 1.0, 1.0), hmd_pose.orientation.into(), hmd_pose.position.into(), ); } pub fn make_alias(client: &Arc) -> Result> { Alias::create( client, "", "hmd", &HMD, AliasInfo { local_signals: vec!["get_transform"], ..Default::default() }, ) }