diff --git a/src/core/client.rs b/src/core/client.rs index 1f91d85..16d519d 100644 --- a/src/core/client.rs +++ b/src/core/client.rs @@ -2,6 +2,7 @@ use super::eventloop::EventLoop; use super::scenegraph::Scenegraph; use crate::nodes::data; use crate::nodes::field; +use crate::nodes::hmd; use crate::nodes::input; use crate::nodes::item; use crate::nodes::model; @@ -64,6 +65,7 @@ impl Client { }); let _ = client.scenegraph.client.set(Arc::downgrade(&client)); let _ = client.root.set(Root::create(&client)); + hmd::make_alias(&client); spatial::create_interface(&client); field::create_interface(&client); model::create_interface(&client); diff --git a/src/main.rs b/src/main.rs index 2f0548d..72e8536 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ mod nodes; mod wayland; use crate::core::destroy_queue; +use crate::nodes::hmd; use crate::nodes::model::{MODELS_TO_DROP, MODEL_REGISTRY}; use crate::wayland::Wayland; @@ -63,6 +64,7 @@ fn main() -> Result<()> { println!("Stardust ready!"); stereokit.run( |draw_ctx| { + hmd::frame(&stereokit); wayland.frame(&stereokit); destroy_queue::clear(); diff --git a/src/nodes/core.rs b/src/nodes/core.rs index d6a3e2c..917e5cc 100644 --- a/src/nodes/core.rs +++ b/src/nodes/core.rs @@ -30,7 +30,7 @@ pub struct Node { local_methods: DashMap>, destroyable: AtomicBool, - alias: OnceCell>, + pub alias: OnceCell>, aliases: Registry, pub spatial: OnceCell>, @@ -198,7 +198,7 @@ impl Node { #[allow(dead_code)] pub struct Alias { node: Weak, - original: Weak, + pub original: Weak, local_signals: Vec<&'static str>, local_methods: Vec<&'static str>, diff --git a/src/nodes/hmd.rs b/src/nodes/hmd.rs new file mode 100644 index 0000000..6e1f5a6 --- /dev/null +++ b/src/nodes/hmd.rs @@ -0,0 +1,35 @@ +use super::{ + core::{Alias, Node}, + spatial::Spatial, +}; +use crate::core::client::{Client, INTERNAL_CLIENT}; +use glam::{vec3, Mat4}; +use std::sync::Arc; +use stereokit::StereoKit; + +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).unwrap(); + + node +} + +pub fn frame(sk: &StereoKit) { + let spatial = HMD.spatial.get().unwrap(); + 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) -> Arc { + let node = Node::create(client, "", "hmd", false).add_to_scenegraph(); + Alias::add_to(&node, &HMD, vec!["getTransform"], vec![], vec![], vec![]); + node +} diff --git a/src/nodes/mod.rs b/src/nodes/mod.rs index 7853b8c..89b6dd9 100644 --- a/src/nodes/mod.rs +++ b/src/nodes/mod.rs @@ -1,3 +1,4 @@ +pub mod hmd; pub mod core; pub mod data; pub mod field;