feat(input): create tip input
This commit is contained in:
@@ -82,6 +82,8 @@ impl InputMethod {
|
|||||||
"Internal: Node does not have a spatial attached!"
|
"Internal: Node does not have a spatial attached!"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
node.add_local_signal("setDatamap", InputMethod::set_datamap);
|
||||||
|
|
||||||
let method = InputMethod {
|
let method = InputMethod {
|
||||||
uid: node.uid.clone(),
|
uid: node.uid.clone(),
|
||||||
enabled: Mutex::new(true),
|
enabled: Mutex::new(true),
|
||||||
@@ -94,6 +96,17 @@ impl InputMethod {
|
|||||||
let _ = node.input_method.set(method);
|
let _ = node.input_method.set(method);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn set_datamap(node: &Node, _calling_client: Arc<Client>, data: &[u8]) -> Result<()> {
|
||||||
|
node.input_method
|
||||||
|
.get()
|
||||||
|
.unwrap()
|
||||||
|
.datamap
|
||||||
|
.lock()
|
||||||
|
.replace(Datamap::new(data.to_vec())?);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn distance(&self, to: &Field) -> f32 {
|
fn distance(&self, to: &Field) -> f32 {
|
||||||
self.specialization.lock().distance(&self.spatial, to)
|
self.specialization.lock().distance(&self.spatial, to)
|
||||||
}
|
}
|
||||||
@@ -197,6 +210,7 @@ impl Drop for InputHandler {
|
|||||||
pub fn create_interface(client: &Arc<Client>) {
|
pub fn create_interface(client: &Arc<Client>) {
|
||||||
let node = Node::create(client, "", "input", false);
|
let node = Node::create(client, "", "input", false);
|
||||||
node.add_local_signal("createInputHandler", create_input_handler_flex);
|
node.add_local_signal("createInputHandler", create_input_handler_flex);
|
||||||
|
node.add_local_signal("createInputMethodTip", tip::create_tip_flex);
|
||||||
node.add_to_scenegraph();
|
node.add_to_scenegraph();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,14 @@ use std::sync::Arc;
|
|||||||
pub struct Tip {
|
pub struct Tip {
|
||||||
pub radius: f32,
|
pub radius: f32,
|
||||||
}
|
}
|
||||||
|
impl Tip {
|
||||||
|
fn set_radius(node: &Node, _calling_client: Arc<Client>, 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 {
|
impl InputSpecialization for Tip {
|
||||||
fn distance(&self, space: &Arc<Spatial>, field: &Field) -> f32 {
|
fn distance(&self, space: &Arc<Spatial>, field: &Field) -> f32 {
|
||||||
field.distance(space, vec3a(0.0, 0.0, 0.0))
|
field.distance(space, vec3a(0.0, 0.0, 0.0))
|
||||||
@@ -33,5 +40,31 @@ impl InputSpecialization for Tip {
|
|||||||
radius: self.radius,
|
radius: self.radius,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn create_tip_flex(_node: &Node, calling_client: Arc<Client>, data: &[u8]) -> Result<()> {
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
struct CreateTipInfo<'a> {
|
||||||
|
name: &'a str,
|
||||||
|
parent_path: &'a str,
|
||||||
|
transform: Transform,
|
||||||
|
radius: f32,
|
||||||
|
datamap: Option<Vec<u8>>,
|
||||||
|
}
|
||||||
|
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(())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user