From a0e05b11af349855afa6fa9d53e6814eed7ac967 Mon Sep 17 00:00:00 2001 From: Nova Date: Fri, 14 Oct 2022 23:57:00 -0400 Subject: [PATCH] feat(input): create tip input --- src/nodes/input/mod.rs | 14 ++++++++++++++ src/nodes/input/tip.rs | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/nodes/input/mod.rs b/src/nodes/input/mod.rs index 45d8e85..fbdcff5 100644 --- a/src/nodes/input/mod.rs +++ b/src/nodes/input/mod.rs @@ -82,6 +82,8 @@ impl InputMethod { "Internal: Node does not have a spatial attached!" ); + node.add_local_signal("setDatamap", InputMethod::set_datamap); + let method = InputMethod { uid: node.uid.clone(), enabled: Mutex::new(true), @@ -94,6 +96,17 @@ impl InputMethod { let _ = node.input_method.set(method); Ok(()) } + + fn set_datamap(node: &Node, _calling_client: Arc, data: &[u8]) -> Result<()> { + node.input_method + .get() + .unwrap() + .datamap + .lock() + .replace(Datamap::new(data.to_vec())?); + Ok(()) + } + fn distance(&self, to: &Field) -> f32 { self.specialization.lock().distance(&self.spatial, to) } @@ -197,6 +210,7 @@ impl Drop for InputHandler { pub fn create_interface(client: &Arc) { let node = Node::create(client, "", "input", false); node.add_local_signal("createInputHandler", create_input_handler_flex); + node.add_local_signal("createInputMethodTip", tip::create_tip_flex); node.add_to_scenegraph(); } diff --git a/src/nodes/input/tip.rs b/src/nodes/input/tip.rs index b7e62f3..5e4aa11 100644 --- a/src/nodes/input/tip.rs +++ b/src/nodes/input/tip.rs @@ -16,7 +16,14 @@ use std::sync::Arc; pub struct Tip { pub radius: f32, } - +impl Tip { + fn set_radius(node: &Node, _calling_client: Arc, data: &[u8]) -> Result<()> { + if let InputType::Tip(tip) = &mut *node.input_method.get().unwrap().specialization.lock() { + tip.radius = deserialize(data)?; + } + Ok(()) + } +} impl InputSpecialization for Tip { fn distance(&self, space: &Arc, field: &Field) -> f32 { field.distance(space, vec3a(0.0, 0.0, 0.0)) @@ -33,5 +40,31 @@ impl InputSpecialization for Tip { radius: self.radius, }) } - } +} + +pub fn create_tip_flex(_node: &Node, calling_client: Arc, data: &[u8]) -> Result<()> { + #[derive(Deserialize)] + struct CreateTipInfo<'a> { + name: &'a str, + parent_path: &'a str, + transform: Transform, + radius: f32, + datamap: Option>, + } + let info: CreateTipInfo = deserialize(data)?; + let node = Node::create(&calling_client, "/input/method/tip", info.name, true); + let parent = get_spatial_parent_flex(&calling_client, info.parent_path)?; + let transform = parse_transform(info.transform, true, true, false)?; + + let node = node.add_to_scenegraph(); + Spatial::add_to(&node, Some(parent), transform)?; + InputMethod::add_to( + &node, + InputType::Tip(Tip { + radius: info.radius, + }), + info.datamap.and_then(|datamap| Datamap::new(datamap).ok()), + )?; + node.add_local_signal("setRadius", Tip::set_radius); + Ok(()) }