refactor: all old flexbuffers parsing upgraded

This commit is contained in:
Nova
2022-10-13 00:47:37 -04:00
parent 1f371fe497
commit edc7eefbbc
3 changed files with 72 additions and 76 deletions

View File

@@ -5,7 +5,9 @@ use super::Node;
use crate::core::client::Client; use crate::core::client::Client;
use anyhow::Result; use anyhow::Result;
use parking_lot::Mutex; use parking_lot::Mutex;
use std::{path::PathBuf, str::FromStr, sync::Arc}; use serde::Deserialize;
use stardust_xr::schemas::flex::deserialize;
use std::{path::PathBuf, sync::Arc};
use stereokit::{lifecycle::DrawContext, texture::Texture, StereoKit}; use stereokit::{lifecycle::DrawContext, texture::Texture, StereoKit};
pub fn create_interface(client: &Arc<Client>) { pub fn create_interface(client: &Arc<Client>) {
@@ -48,14 +50,19 @@ static QUEUED_SKYLIGHT: Mutex<Option<PathBuf>> = Mutex::new(None);
static QUEUED_SKYTEX: Mutex<Option<PathBuf>> = Mutex::new(None); static QUEUED_SKYTEX: Mutex<Option<PathBuf>> = Mutex::new(None);
fn set_sky_file_flex(_node: &Node, _calling_client: Arc<Client>, data: &[u8]) -> Result<()> { fn set_sky_file_flex(_node: &Node, _calling_client: Arc<Client>, data: &[u8]) -> Result<()> {
let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; #[derive(Deserialize)]
let path = PathBuf::from_str(flex_vec.index(0)?.get_str()?)?; struct SkyFileInfo {
path.metadata()?; path: PathBuf,
if flex_vec.idx(1).as_bool() { skytex: Option<bool>,
QUEUED_SKYTEX.lock().replace(path.clone()); skylight: Option<bool>,
} }
if flex_vec.idx(2).as_bool() { let info: SkyFileInfo = deserialize(data)?;
QUEUED_SKYLIGHT.lock().replace(path); info.path.metadata()?;
if info.skytex.unwrap_or_default() {
QUEUED_SKYTEX.lock().replace(info.path.clone());
}
if info.skylight.unwrap_or_default() {
QUEUED_SKYLIGHT.lock().replace(info.path);
} }
Ok(()) Ok(())

View File

@@ -4,8 +4,7 @@ use crate::core::destroy_queue;
use crate::core::registry::Registry; use crate::core::registry::Registry;
use crate::core::resource::ResourceID; use crate::core::resource::ResourceID;
use crate::nodes::spatial::{get_spatial_parent_flex, parse_transform, Spatial}; use crate::nodes::spatial::{get_spatial_parent_flex, parse_transform, Spatial};
use anyhow::{anyhow, bail, ensure, Result}; use anyhow::{anyhow, ensure, Result};
use flexbuffers::FlexBufferType;
use once_cell::sync::OnceCell; use once_cell::sync::OnceCell;
use parking_lot::Mutex; use parking_lot::Mutex;
use prisma::{Rgb, Rgba}; use prisma::{Rgb, Rgba};
@@ -26,6 +25,8 @@ use stereokit::StereoKit;
static MODEL_REGISTRY: Registry<Model> = Registry::new(); static MODEL_REGISTRY: Registry<Model> = Registry::new();
#[derive(Deserialize, Debug)]
#[serde(untagged)]
pub enum MaterialParameter { pub enum MaterialParameter {
Texture(PathBuf), Texture(PathBuf),
} }
@@ -81,29 +82,20 @@ impl Model {
_calling_client: Arc<Client>, _calling_client: Arc<Client>,
data: &[u8], data: &[u8],
) -> Result<()> { ) -> Result<()> {
let model = node.model.get().unwrap(); #[derive(Deserialize)]
let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; struct MaterialParameterInfo {
let material_idx = flex_vec idx: u32,
.idx(0) name: String,
.get_u64() value: MaterialParameter,
.map_err(|_| anyhow!("Material ID is not a number!"))? as u32; }
let parameter_name = flex_vec let info: MaterialParameterInfo = deserialize(data)?;
.idx(1)
.get_str()
.map_err(|_| anyhow!("Parameter name is not a string!"))?;
let flex_parameter_value = flex_vec.idx(2); node.model
let parameter_value = match flex_parameter_value.flexbuffer_type() { .get()
FlexBufferType::String => { .unwrap()
MaterialParameter::Texture(PathBuf::from(flex_parameter_value.as_str()))
}
_ => bail!("Invalid parameter value type"),
};
model
.pending_material_parameters .pending_material_parameters
.lock() .lock()
.insert((material_idx, parameter_name.to_string()), parameter_value); .insert((info.idx, info.name), info.value);
Ok(()) Ok(())
} }

View File

@@ -113,20 +113,24 @@ impl PanelItem {
calling_client: Arc<Client>, calling_client: Arc<Client>,
data: &[u8], data: &[u8],
) -> Result<()> { ) -> Result<()> {
let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; #[derive(Deserialize)]
struct SurfaceMaterialInfo<'a> {
model_path: &'a str,
idx: u32,
}
let info: SurfaceMaterialInfo = deserialize(data)?;
let model_node = calling_client let model_node = calling_client
.scenegraph .scenegraph
.get_node(flex_vec.idx(0).as_str()) .get_node(info.model_path)
.ok_or_else(|| anyhow!("Model node not found"))?; .ok_or_else(|| anyhow!("Model node not found"))?;
let model = model_node let model = model_node
.model .model
.get() .get()
.ok_or_else(|| anyhow!("Node is not a model"))?; .ok_or_else(|| anyhow!("Node is not a model"))?;
let material_idx = flex_vec.idx(1).get_u64()? as u32;
if let ItemType::Panel(panel_item) = &node.item.get().unwrap().specialization { if let ItemType::Panel(panel_item) = &node.item.get().unwrap().specialization {
if let Some(core_surface) = panel_item.core_surface.upgrade() { if let Some(core_surface) = panel_item.core_surface.upgrade() {
core_surface.apply_material(model.clone(), material_idx); core_surface.apply_material(model.clone(), info.idx);
} }
} }
@@ -138,21 +142,25 @@ impl PanelItem {
calling_client: Arc<Client>, calling_client: Arc<Client>,
data: &[u8], data: &[u8],
) -> Result<()> { ) -> Result<()> {
let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; #[derive(Deserialize)]
struct SurfaceMaterialInfo<'a> {
model_path: &'a str,
idx: u32,
}
let info: SurfaceMaterialInfo = deserialize(data)?;
let model_node = calling_client let model_node = calling_client
.scenegraph .scenegraph
.get_node(flex_vec.idx(0).as_str()) .get_node(info.model_path)
.ok_or_else(|| anyhow!("Model node not found"))?; .ok_or_else(|| anyhow!("Model node not found"))?;
let model = model_node let model = model_node
.model .model
.get() .get()
.ok_or_else(|| anyhow!("Node is not a model"))?; .ok_or_else(|| anyhow!("Node is not a model"))?;
let material_idx = flex_vec.idx(1).get_u64()? as u32;
if let ItemType::Panel(panel_item) = &node.item.get().unwrap().specialization { if let ItemType::Panel(panel_item) = &node.item.get().unwrap().specialization {
if let Some(cursor) = &*panel_item.seat_data.cursor.lock() { if let Some(cursor) = &*panel_item.seat_data.cursor.lock() {
if let Some(core_surface) = cursor.lock().core_surface.upgrade() { if let Some(core_surface) = cursor.lock().core_surface.upgrade() {
core_surface.apply_material(model.clone(), material_idx); core_surface.apply_material(model.clone(), info.idx);
} }
} }
} }
@@ -251,14 +259,14 @@ impl PanelItem {
if let Some(pointer) = panel_item.seat_data.pointer() { if let Some(pointer) = panel_item.seat_data.pointer() {
if let Some(core_surface) = panel_item.core_surface.upgrade() { if let Some(core_surface) = panel_item.core_surface.upgrade() {
if let Some(size) = core_surface.with_data(|data| data.size) { if let Some(size) = core_surface.with_data(|data| data.size) {
let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; let mut position: Vector2<f64> = deserialize(data)?;
let x = flex_vec.index(0)?.get_f64()?.clamp(0.0, size.x as f64); position.x = position.x.clamp(0.0, size.x as f64);
let y = flex_vec.index(1)?.get_f64()?.clamp(0.0, size.y as f64); position.y = position.y.clamp(0.0, size.y as f64);
let mut pointer_active = panel_item.seat_data.pointer_active.lock(); let mut pointer_active = panel_item.seat_data.pointer_active.lock();
if *pointer_active { if *pointer_active {
pointer.motion(0, x, y); pointer.motion(0, position.x, position.y);
} else { } else {
pointer.enter(0, &core_surface.wl_surface(), x, y); pointer.enter(0, &core_surface.wl_surface(), position.x, position.y);
*pointer_active = true; *pointer_active = true;
} }
pointer.frame(); pointer.frame();
@@ -276,9 +284,7 @@ impl PanelItem {
if let Some(pointer) = panel_item.seat_data.pointer() { if let Some(pointer) = panel_item.seat_data.pointer() {
if *panel_item.seat_data.pointer_active.lock() { if *panel_item.seat_data.pointer_active.lock() {
if let Some(core_surface) = panel_item.core_surface.upgrade() { if let Some(core_surface) = panel_item.core_surface.upgrade() {
let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; let (button, state): (u32, u32) = deserialize(data)?;
let button = flex_vec.index(0)?.get_u64()? as u32;
let state = flex_vec.index(1)?.get_u64()? as u32;
pointer.button( pointer.button(
0, 0,
0, 0,
@@ -345,15 +351,10 @@ impl PanelItem {
_calling_client: Arc<Client>, _calling_client: Arc<Client>,
data: &[u8], data: &[u8],
) -> Result<()> { ) -> Result<()> {
let keymap_str = flexbuffers::Reader::get_root(data)?.get_str()?;
let context = xkb::Context::new(0); let context = xkb::Context::new(0);
let keymap = Keymap::new_from_string( let keymap =
&context, Keymap::new_from_string(&context, deserialize(data)?, XKB_KEYMAP_FORMAT_TEXT_V1, 0)
keymap_str.to_string(), .ok_or_else(|| anyhow!("Keymap is not valid"))?;
XKB_KEYMAP_FORMAT_TEXT_V1,
0,
)
.ok_or_else(|| anyhow!("Keymap is not valid"))?;
PanelItem::keyboard_activate_flex(node, &keymap) PanelItem::keyboard_activate_flex(node, &keymap)
} }
@@ -363,23 +364,23 @@ impl PanelItem {
_calling_client: Arc<Client>, _calling_client: Arc<Client>,
data: &[u8], data: &[u8],
) -> Result<()> { ) -> Result<()> {
let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; #[derive(Deserialize)]
let rules = flex_vec.idx(0).as_str(); struct Names<'a> {
let model = flex_vec.idx(1).as_str(); rules: &'a str,
let layout = flex_vec.idx(2).as_str(); model: &'a str,
let variant = flex_vec.idx(3).as_str(); layout: &'a str,
let options = match flex_vec.index(4).ok() { variant: &'a str,
Some(options) => Some(options.get_str()?.to_string()), options: Option<String>,
None => None, }
}; let names: Names = deserialize(data)?;
let context = xkb::Context::new(0); let context = xkb::Context::new(0);
let keymap = Keymap::new_from_names( let keymap = Keymap::new_from_names(
&context, &context,
rules, names.rules,
model, names.model,
layout, names.layout,
variant, names.variant,
options, names.options,
XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_FORMAT_TEXT_V1,
) )
.ok_or_else(|| anyhow!("Keymap is not valid"))?; .ok_or_else(|| anyhow!("Keymap is not valid"))?;
@@ -434,9 +435,7 @@ impl PanelItem {
if let Some(keyboard) = panel_item.seat_data.keyboard() { if let Some(keyboard) = panel_item.seat_data.keyboard() {
let mut keyboard_info = panel_item.seat_data.keyboard_info.lock(); let mut keyboard_info = panel_item.seat_data.keyboard_info.lock();
if let Some(keyboard_info) = &mut *keyboard_info { if let Some(keyboard_info) = &mut *keyboard_info {
let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; let (key, state): (u32, u32) = deserialize(data)?;
let key = flex_vec.index(0)?.get_u64()? as u32;
let state = flex_vec.index(1)?.get_u64()? as u32;
keyboard_info.process(key, state, keyboard)?; keyboard_info.process(key, state, keyboard)?;
} }
} }
@@ -448,9 +447,7 @@ impl PanelItem {
fn resize_flex(node: &Node, _calling_client: Arc<Client>, data: &[u8]) -> Result<()> { fn resize_flex(node: &Node, _calling_client: Arc<Client>, data: &[u8]) -> Result<()> {
if let ItemType::Panel(panel_item) = &node.item.get().unwrap().specialization { if let ItemType::Panel(panel_item) = &node.item.get().unwrap().specialization {
if let Some(core_surface) = panel_item.core_surface.upgrade() { if let Some(core_surface) = panel_item.core_surface.upgrade() {
let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; let size: Vector2<u32> = deserialize(data)?;
let w = flex_vec.index(0)?.get_u64()? as u32;
let h = flex_vec.index(1)?.get_u64()? as u32;
let toplevel_surface = core_surface let toplevel_surface = core_surface
.wayland_state() .wayland_state()
@@ -467,8 +464,8 @@ impl PanelItem {
let mut size_set = false; let mut size_set = false;
toplevel_surface.with_pending_state(|state| { toplevel_surface.with_pending_state(|state| {
state.size = Some(Size::default()); state.size = Some(Size::default());
state.size.as_mut().unwrap().w = w as i32; state.size.as_mut().unwrap().w = size.x as i32;
state.size.as_mut().unwrap().h = h as i32; state.size.as_mut().unwrap().h = size.y as i32;
size_set = true; size_set = true;
}); });
if size_set { if size_set {