From a87823dcc833c7a7084c2135a7d49ae48290426f Mon Sep 17 00:00:00 2001 From: Nova Date: Sun, 16 Jul 2023 10:42:35 -0700 Subject: [PATCH] feat: play space --- src/main.rs | 6 +++++ src/nodes/data.rs | 11 ++++++--- src/nodes/fields/box.rs | 7 +++--- src/nodes/fields/mod.rs | 4 ++-- src/objects/mod.rs | 1 + src/objects/play_space.rs | 50 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 src/objects/play_space.rs diff --git a/src/main.rs b/src/main.rs index c4c9de6..993e93b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,7 @@ use crate::objects::input::eye_pointer::EyePointer; use crate::objects::input::mouse_pointer::MousePointer; use crate::objects::input::sk_controller::SkController; use crate::objects::input::sk_hand::SkHand; +use crate::objects::play_space::PlaySpace; use self::core::eventloop::EventLoop; use clap::Parser; @@ -173,6 +174,8 @@ fn main() { sk.input_hand_visible(Handed::Right, false); } + let play_space = sk.world_has_bounds().then(|| PlaySpace::new().ok()).flatten(); + let (event_stop_tx, event_stop_rx) = oneshot::channel::<()>(); let (info_sender, info_receiver) = oneshot::channel::(); let event_thread = std::thread::Builder::new() @@ -241,6 +244,9 @@ fn main() { if let Some(eye_pointer) = &eye_pointer { eye_pointer.update(sk); } + if let Some(play_space) = &play_space { + play_space.update(sk); + } input::process_input(); nodes::root::Root::send_frame_events(sk.time_elapsed_unscaled()); adaptive_sleep( diff --git a/src/nodes/data.rs b/src/nodes/data.rs index 42cc7f1..3426872 100644 --- a/src/nodes/data.rs +++ b/src/nodes/data.rs @@ -35,6 +35,11 @@ pub fn mask_matches(mask_map_lesser: &Mask, mask_map_greater: &Mask) -> bool { pub struct Mask(pub Vec); impl Mask { + pub fn from_struct() -> Self { + let mut serializer = flexbuffers::FlexbufferSerializer::new(); + T::default().serialize(&mut serializer).unwrap(); + Mask(serializer.take_buffer()) + } pub fn get_mask(&self) -> Result> { flexbuffers::Reader::get_root(self.0.as_slice()) .map_err(|_| eyre!("Mask is not a valid flexbuffer"))? @@ -182,7 +187,7 @@ pub struct PulseReceiver { pub mask: Mask, } impl PulseReceiver { - pub fn add_to(node: &Arc, field: Arc, mask: Mask) -> Result<()> { + pub fn add_to(node: &Arc, field: Arc, mask: Mask) -> Result> { ensure!( node.spatial.get().is_some(), "Internal: Node does not have a spatial attached!" @@ -199,8 +204,8 @@ impl PulseReceiver { for sender in PULSE_SENDER_REGISTRY.get_valid_contents() { sender.handle_new_receiver(&receiver); } - let _ = node.pulse_receiver.set(receiver); - Ok(()) + let _ = node.pulse_receiver.set(receiver.clone()); + Ok(receiver) } pub fn send_data(&self, uid: &str, data: Vec) -> Result<()> { diff --git a/src/nodes/fields/box.rs b/src/nodes/fields/box.rs index 763edbe..ffc4de7 100644 --- a/src/nodes/fields/box.rs +++ b/src/nodes/fields/box.rs @@ -16,7 +16,7 @@ pub struct BoxField { } impl BoxField { - pub fn add_to(node: &Arc, size: Vector3) -> Result<()> { + pub fn add_to(node: &Arc, size: Vector3) -> Result> { ensure!( node.spatial.get().is_some(), "Internal: Node does not have a spatial attached!" @@ -31,8 +31,9 @@ impl BoxField { }; box_field.add_field_methods(node); node.add_local_signal("set_size", BoxField::set_size_flex); - let _ = node.field.set(Arc::new(Field::Box(box_field))); - Ok(()) + let field = Arc::new(Field::Box(box_field)); + let _ = node.field.set(field.clone()); + Ok(field) } pub fn set_size(&self, size: Vector3) { diff --git a/src/nodes/fields/mod.rs b/src/nodes/fields/mod.rs index 2da55ca..548cf1c 100644 --- a/src/nodes/fields/mod.rs +++ b/src/nodes/fields/mod.rs @@ -1,7 +1,7 @@ -mod r#box; +pub mod r#box; mod cylinder; mod sphere; -pub mod torus; +mod torus; use self::cylinder::{create_cylinder_field_flex, CylinderField}; use self::r#box::{create_box_field_flex, BoxField}; diff --git a/src/objects/mod.rs b/src/objects/mod.rs index 7839bc5..77ba00e 100644 --- a/src/objects/mod.rs +++ b/src/objects/mod.rs @@ -1 +1,2 @@ pub mod input; +pub mod play_space; diff --git a/src/objects/play_space.rs b/src/objects/play_space.rs new file mode 100644 index 0000000..9020ed0 --- /dev/null +++ b/src/objects/play_space.rs @@ -0,0 +1,50 @@ +use std::sync::Arc; + +use color_eyre::eyre::Result; +use glam::Mat4; +use mint::Vector2; +use nanoid::nanoid; +use serde::{Serialize, Deserialize}; +use stereokit::StereoKitMultiThread; + +use crate::{nodes::{spatial::Spatial, data::{PulseReceiver, Mask}, Node, fields::{Field, r#box::BoxField}}, core::client::INTERNAL_CLIENT}; + +#[derive(Debug, Deserialize, Serialize)] +struct PlaySpaceMap { + play_space: (), + size: Vector2, +} +impl Default for PlaySpaceMap { + fn default() -> Self { + Self { play_space: (), size: [0.0; 2].into() } + } +} + +pub struct PlaySpace { + _node: Arc, + spatial: Arc, + field: Arc, + _pulse_rx: Arc, +} +impl PlaySpace { + pub fn new() -> Result { + let node = Node::create(&INTERNAL_CLIENT, "", &nanoid!(), false).add_to_scenegraph()?; + let spatial = Spatial::add_to(&node, None, Mat4::IDENTITY, false)?; + let field = BoxField::add_to(&node, [0.0;3].into())?; + + let pulse_rx = PulseReceiver::add_to(&node, field.clone(), Mask::from_struct::())?; + + Ok(PlaySpace { + _node: node, + spatial, + field, + _pulse_rx: pulse_rx, + }) + } + pub fn update(&self, sk: &impl StereoKitMultiThread) { + let pose = sk.world_get_bounds_pose(); + self.spatial.set_local_transform(Mat4::from_rotation_translation(pose.orientation, pose.position)); + let Field::Box(box_field) = self.field.as_ref() else {return}; + box_field.set_size([sk.world_get_bounds_size().x, 0.0, sk.world_get_bounds_size().y].into()); + } +} \ No newline at end of file