refactor: make all flex stuff use serde
This commit is contained in:
@@ -1,6 +1,17 @@
|
||||
use super::{Item, ItemSpecialization, ItemType, ITEM_TYPE_INFO_ENVIRONMENT};
|
||||
use crate::{core::client::Client, nodes::Node};
|
||||
use crate::{
|
||||
core::client::{Client, INTERNAL_CLIENT},
|
||||
nodes::{
|
||||
spatial::{get_spatial_parent_flex, parse_transform, Spatial},
|
||||
Node,
|
||||
},
|
||||
};
|
||||
use anyhow::{anyhow, Result};
|
||||
use serde::Deserialize;
|
||||
use stardust_xr::{
|
||||
schemas::flex::{deserialize, serialize},
|
||||
values::Transform,
|
||||
};
|
||||
use std::sync::Arc;
|
||||
|
||||
pub struct EnvironmentItem {
|
||||
@@ -25,7 +36,50 @@ impl EnvironmentItem {
|
||||
}
|
||||
}
|
||||
impl ItemSpecialization for EnvironmentItem {
|
||||
fn serialize_start_data(&self, vec: &mut flexbuffers::VectorBuilder) {
|
||||
vec.push(self.path.as_str());
|
||||
fn serialize_start_data(&self, id: &str) -> Vec<u8> {
|
||||
serialize((id, self.path.as_str())).unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn create_environment_item_flex(
|
||||
_node: &Node,
|
||||
calling_client: Arc<Client>,
|
||||
data: &[u8],
|
||||
) -> Result<()> {
|
||||
#[derive(Deserialize)]
|
||||
struct CreateEnvironmentItemInfo<'a> {
|
||||
name: &'a str,
|
||||
parent_path: &'a str,
|
||||
transform: Transform,
|
||||
item_data: String,
|
||||
}
|
||||
let info: CreateEnvironmentItemInfo = deserialize(data)?;
|
||||
let parent_name = format!("/item/{}/item/", ITEM_TYPE_INFO_ENVIRONMENT.type_name);
|
||||
let node = Node::create(&INTERNAL_CLIENT, &parent_name, info.name, true);
|
||||
let space = 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, None, transform * space.global_transform())?;
|
||||
EnvironmentItem::add_to(&node, info.item_data);
|
||||
node.item
|
||||
.get()
|
||||
.unwrap()
|
||||
.make_alias(&calling_client, &parent_name);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(super) fn create_environment_item_acceptor_flex(
|
||||
_node: &Node,
|
||||
calling_client: Arc<Client>,
|
||||
data: &[u8],
|
||||
) -> Result<()> {
|
||||
super::create_item_acceptor_flex(calling_client, data, &ITEM_TYPE_INFO_ENVIRONMENT)
|
||||
}
|
||||
|
||||
pub(super) fn register_environment_item_ui_flex(
|
||||
_node: &Node,
|
||||
calling_client: Arc<Client>,
|
||||
_data: &[u8],
|
||||
) -> Result<()> {
|
||||
super::register_item_ui_flex(calling_client, &ITEM_TYPE_INFO_ENVIRONMENT)
|
||||
}
|
||||
|
||||
@@ -13,7 +13,10 @@ use anyhow::{anyhow, ensure, Result};
|
||||
use lazy_static::lazy_static;
|
||||
use nanoid::nanoid;
|
||||
use parking_lot::Mutex;
|
||||
use stardust_xr::flex::flexbuffer_from_vector_arguments;
|
||||
use serde::Deserialize;
|
||||
use stardust_xr::schemas::flex::deserialize;
|
||||
use stardust_xr::values::Transform;
|
||||
|
||||
use std::ops::Deref;
|
||||
use std::sync::{Arc, Weak};
|
||||
|
||||
@@ -155,7 +158,7 @@ impl Drop for Item {
|
||||
}
|
||||
|
||||
pub trait ItemSpecialization {
|
||||
fn serialize_start_data(&self, vec: &mut flexbuffers::VectorBuilder);
|
||||
fn serialize_start_data(&self, id: &str) -> Vec<u8>;
|
||||
}
|
||||
|
||||
pub enum ItemType {
|
||||
@@ -214,12 +217,7 @@ impl ItemUI {
|
||||
|
||||
let _ = node.send_remote_signal(
|
||||
"create",
|
||||
&flexbuffer_from_vector_arguments(|vec| {
|
||||
vec.push(item.uid.as_str());
|
||||
let mut start_data_vec = vec.start_vector();
|
||||
item.specialization
|
||||
.serialize_start_data(&mut start_data_vec);
|
||||
}),
|
||||
&item.specialization.serialize_start_data(&item.uid),
|
||||
);
|
||||
}
|
||||
fn handle_destroy_item(&self, item: &Item) {
|
||||
@@ -324,72 +322,49 @@ impl Drop for ItemAcceptor {
|
||||
|
||||
pub fn create_interface(client: &Arc<Client>) {
|
||||
let node = Node::create(client, "", "item", false);
|
||||
node.add_local_signal("createEnvironmentItem", create_environment_item_flex);
|
||||
node.add_local_signal(
|
||||
"createEnvironmentItem",
|
||||
environment::create_environment_item_flex,
|
||||
);
|
||||
node.add_local_signal(
|
||||
"registerEnvironmentItemUI",
|
||||
register_environment_item_ui_flex,
|
||||
environment::register_environment_item_ui_flex,
|
||||
);
|
||||
node.add_local_signal("registerPanelItemUI", register_panel_item_ui_flex);
|
||||
node.add_local_signal(
|
||||
"createEnvironmentItemAcceptor",
|
||||
create_environment_item_acceptor_flex,
|
||||
environment::create_environment_item_acceptor_flex,
|
||||
);
|
||||
node.add_to_scenegraph();
|
||||
}
|
||||
|
||||
pub fn create_environment_item_flex(
|
||||
_node: &Node,
|
||||
calling_client: Arc<Client>,
|
||||
data: &[u8],
|
||||
) -> Result<()> {
|
||||
let root = flexbuffers::Reader::get_root(data)?;
|
||||
let flex_vec = root.get_vector()?;
|
||||
let parent_name = format!("/item/{}/item/", ITEM_TYPE_INFO_ENVIRONMENT.type_name);
|
||||
let node = Node::create(
|
||||
&INTERNAL_CLIENT,
|
||||
&parent_name,
|
||||
flex_vec.idx(0).get_str()?,
|
||||
true,
|
||||
);
|
||||
let space = get_spatial_parent_flex(&calling_client, flex_vec.idx(1).get_str()?)?;
|
||||
let transform = parse_transform(flex_vec.idx(2), true, true, false)?;
|
||||
let node = node.add_to_scenegraph();
|
||||
Spatial::add_to(&node, None, transform * space.global_transform())?;
|
||||
EnvironmentItem::add_to(&node, flex_vec.idx(3).get_str()?.to_string());
|
||||
node.item
|
||||
.get()
|
||||
.unwrap()
|
||||
.make_alias(&calling_client, &parent_name);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn create_item_acceptor_flex(
|
||||
pub(self) fn create_item_acceptor_flex(
|
||||
calling_client: Arc<Client>,
|
||||
data: &[u8],
|
||||
type_info: &'static TypeInfo,
|
||||
) -> Result<()> {
|
||||
let root = flexbuffers::Reader::get_root(data)?;
|
||||
let flex_vec = root.get_vector()?;
|
||||
#[derive(Deserialize)]
|
||||
struct CreateItemAcceptorInfo<'a> {
|
||||
name: &'a str,
|
||||
parent_path: &'a str,
|
||||
transform: Transform,
|
||||
field_path: &'a str,
|
||||
}
|
||||
let info: CreateItemAcceptorInfo = deserialize(data)?;
|
||||
let parent_name = format!("/item/{}/acceptor/", ITEM_TYPE_INFO_ENVIRONMENT.type_name);
|
||||
let space = get_spatial_parent_flex(&calling_client, flex_vec.idx(1).get_str()?)?;
|
||||
let transform = parse_transform(flex_vec.idx(2), true, true, false)?;
|
||||
let space = get_spatial_parent_flex(&calling_client, info.parent_path)?;
|
||||
let transform = parse_transform(info.transform, true, true, false)?;
|
||||
let field = calling_client
|
||||
.scenegraph
|
||||
.get_node(flex_vec.idx(3).get_str()?)
|
||||
.get_node(info.field_path)
|
||||
.ok_or_else(|| anyhow!("Field node not found"))?;
|
||||
let field = field
|
||||
.field
|
||||
.get()
|
||||
.ok_or_else(|| anyhow!("Field node is not a field"))?;
|
||||
|
||||
let node = Node::create(
|
||||
&INTERNAL_CLIENT,
|
||||
&parent_name,
|
||||
flex_vec.idx(0).get_str()?,
|
||||
true,
|
||||
)
|
||||
.add_to_scenegraph();
|
||||
Spatial::add_to(&node, None, transform * space.global_transform())?;
|
||||
let node = Node::create(&INTERNAL_CLIENT, &parent_name, info.name, true).add_to_scenegraph();
|
||||
Spatial::add_to(&node, Some(space), transform)?;
|
||||
ItemAcceptor::add_to(&node, type_info, Arc::downgrade(field));
|
||||
node.item
|
||||
.get()
|
||||
@@ -398,14 +373,6 @@ pub fn create_item_acceptor_flex(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn create_environment_item_acceptor_flex(
|
||||
_node: &Node,
|
||||
calling_client: Arc<Client>,
|
||||
data: &[u8],
|
||||
) -> Result<()> {
|
||||
create_item_acceptor_flex(calling_client, data, &ITEM_TYPE_INFO_ENVIRONMENT)
|
||||
}
|
||||
|
||||
pub fn register_item_ui_flex(
|
||||
calling_client: Arc<Client>,
|
||||
type_info: &'static TypeInfo,
|
||||
@@ -414,11 +381,3 @@ pub fn register_item_ui_flex(
|
||||
ItemUI::add_to(&ui, type_info)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn register_environment_item_ui_flex(
|
||||
_node: &Node,
|
||||
calling_client: Arc<Client>,
|
||||
_data: &[u8],
|
||||
) -> Result<()> {
|
||||
register_item_ui_flex(calling_client, &ITEM_TYPE_INFO_ENVIRONMENT)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user