From edc7eefbbcb4596eb8ac31028b40c6f8b86afaad Mon Sep 17 00:00:00 2001 From: Nova Date: Thu, 13 Oct 2022 00:47:37 -0400 Subject: [PATCH] refactor: all old flexbuffers parsing upgraded --- src/nodes/drawable/mod.rs | 23 ++++++---- src/nodes/drawable/model.rs | 36 ++++++--------- src/wayland/panel_item.rs | 89 ++++++++++++++++++------------------- 3 files changed, 72 insertions(+), 76 deletions(-) diff --git a/src/nodes/drawable/mod.rs b/src/nodes/drawable/mod.rs index 4cc94a0..5a8963a 100644 --- a/src/nodes/drawable/mod.rs +++ b/src/nodes/drawable/mod.rs @@ -5,7 +5,9 @@ use super::Node; use crate::core::client::Client; use anyhow::Result; 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}; pub fn create_interface(client: &Arc) { @@ -48,14 +50,19 @@ static QUEUED_SKYLIGHT: Mutex> = Mutex::new(None); static QUEUED_SKYTEX: Mutex> = Mutex::new(None); fn set_sky_file_flex(_node: &Node, _calling_client: Arc, data: &[u8]) -> Result<()> { - let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; - let path = PathBuf::from_str(flex_vec.index(0)?.get_str()?)?; - path.metadata()?; - if flex_vec.idx(1).as_bool() { - QUEUED_SKYTEX.lock().replace(path.clone()); + #[derive(Deserialize)] + struct SkyFileInfo { + path: PathBuf, + skytex: Option, + skylight: Option, } - if flex_vec.idx(2).as_bool() { - QUEUED_SKYLIGHT.lock().replace(path); + let info: SkyFileInfo = deserialize(data)?; + 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(()) diff --git a/src/nodes/drawable/model.rs b/src/nodes/drawable/model.rs index 784be8f..86e79e4 100644 --- a/src/nodes/drawable/model.rs +++ b/src/nodes/drawable/model.rs @@ -4,8 +4,7 @@ use crate::core::destroy_queue; use crate::core::registry::Registry; use crate::core::resource::ResourceID; use crate::nodes::spatial::{get_spatial_parent_flex, parse_transform, Spatial}; -use anyhow::{anyhow, bail, ensure, Result}; -use flexbuffers::FlexBufferType; +use anyhow::{anyhow, ensure, Result}; use once_cell::sync::OnceCell; use parking_lot::Mutex; use prisma::{Rgb, Rgba}; @@ -26,6 +25,8 @@ use stereokit::StereoKit; static MODEL_REGISTRY: Registry = Registry::new(); +#[derive(Deserialize, Debug)] +#[serde(untagged)] pub enum MaterialParameter { Texture(PathBuf), } @@ -81,29 +82,20 @@ impl Model { _calling_client: Arc, data: &[u8], ) -> Result<()> { - let model = node.model.get().unwrap(); - let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; - let material_idx = flex_vec - .idx(0) - .get_u64() - .map_err(|_| anyhow!("Material ID is not a number!"))? as u32; - let parameter_name = flex_vec - .idx(1) - .get_str() - .map_err(|_| anyhow!("Parameter name is not a string!"))?; + #[derive(Deserialize)] + struct MaterialParameterInfo { + idx: u32, + name: String, + value: MaterialParameter, + } + let info: MaterialParameterInfo = deserialize(data)?; - let flex_parameter_value = flex_vec.idx(2); - let parameter_value = match flex_parameter_value.flexbuffer_type() { - FlexBufferType::String => { - MaterialParameter::Texture(PathBuf::from(flex_parameter_value.as_str())) - } - _ => bail!("Invalid parameter value type"), - }; - - model + node.model + .get() + .unwrap() .pending_material_parameters .lock() - .insert((material_idx, parameter_name.to_string()), parameter_value); + .insert((info.idx, info.name), info.value); Ok(()) } diff --git a/src/wayland/panel_item.rs b/src/wayland/panel_item.rs index 4ed0317..ccc43e2 100644 --- a/src/wayland/panel_item.rs +++ b/src/wayland/panel_item.rs @@ -113,20 +113,24 @@ impl PanelItem { calling_client: Arc, data: &[u8], ) -> 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 .scenegraph - .get_node(flex_vec.idx(0).as_str()) + .get_node(info.model_path) .ok_or_else(|| anyhow!("Model node not found"))?; let model = model_node .model .get() .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 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, data: &[u8], ) -> 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 .scenegraph - .get_node(flex_vec.idx(0).as_str()) + .get_node(info.model_path) .ok_or_else(|| anyhow!("Model node not found"))?; let model = model_node .model .get() .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 Some(cursor) = &*panel_item.seat_data.cursor.lock() { 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(core_surface) = panel_item.core_surface.upgrade() { if let Some(size) = core_surface.with_data(|data| data.size) { - let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; - let x = flex_vec.index(0)?.get_f64()?.clamp(0.0, size.x as f64); - let y = flex_vec.index(1)?.get_f64()?.clamp(0.0, size.y as f64); + let mut position: Vector2 = deserialize(data)?; + position.x = position.x.clamp(0.0, size.x as f64); + position.y = position.y.clamp(0.0, size.y as f64); let mut pointer_active = panel_item.seat_data.pointer_active.lock(); if *pointer_active { - pointer.motion(0, x, y); + pointer.motion(0, position.x, position.y); } 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.frame(); @@ -276,9 +284,7 @@ impl PanelItem { if let Some(pointer) = panel_item.seat_data.pointer() { if *panel_item.seat_data.pointer_active.lock() { if let Some(core_surface) = panel_item.core_surface.upgrade() { - let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; - let button = flex_vec.index(0)?.get_u64()? as u32; - let state = flex_vec.index(1)?.get_u64()? as u32; + let (button, state): (u32, u32) = deserialize(data)?; pointer.button( 0, 0, @@ -345,15 +351,10 @@ impl PanelItem { _calling_client: Arc, data: &[u8], ) -> Result<()> { - let keymap_str = flexbuffers::Reader::get_root(data)?.get_str()?; let context = xkb::Context::new(0); - let keymap = Keymap::new_from_string( - &context, - keymap_str.to_string(), - XKB_KEYMAP_FORMAT_TEXT_V1, - 0, - ) - .ok_or_else(|| anyhow!("Keymap is not valid"))?; + let keymap = + Keymap::new_from_string(&context, deserialize(data)?, XKB_KEYMAP_FORMAT_TEXT_V1, 0) + .ok_or_else(|| anyhow!("Keymap is not valid"))?; PanelItem::keyboard_activate_flex(node, &keymap) } @@ -363,23 +364,23 @@ impl PanelItem { _calling_client: Arc, data: &[u8], ) -> Result<()> { - let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; - let rules = flex_vec.idx(0).as_str(); - let model = flex_vec.idx(1).as_str(); - let layout = flex_vec.idx(2).as_str(); - let variant = flex_vec.idx(3).as_str(); - let options = match flex_vec.index(4).ok() { - Some(options) => Some(options.get_str()?.to_string()), - None => None, - }; + #[derive(Deserialize)] + struct Names<'a> { + rules: &'a str, + model: &'a str, + layout: &'a str, + variant: &'a str, + options: Option, + } + let names: Names = deserialize(data)?; let context = xkb::Context::new(0); let keymap = Keymap::new_from_names( &context, - rules, - model, - layout, - variant, - options, + names.rules, + names.model, + names.layout, + names.variant, + names.options, XKB_KEYMAP_FORMAT_TEXT_V1, ) .ok_or_else(|| anyhow!("Keymap is not valid"))?; @@ -434,9 +435,7 @@ impl PanelItem { if let Some(keyboard) = panel_item.seat_data.keyboard() { let mut keyboard_info = panel_item.seat_data.keyboard_info.lock(); if let Some(keyboard_info) = &mut *keyboard_info { - let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; - let key = flex_vec.index(0)?.get_u64()? as u32; - let state = flex_vec.index(1)?.get_u64()? as u32; + let (key, state): (u32, u32) = deserialize(data)?; keyboard_info.process(key, state, keyboard)?; } } @@ -448,9 +447,7 @@ impl PanelItem { fn resize_flex(node: &Node, _calling_client: Arc, data: &[u8]) -> Result<()> { if let ItemType::Panel(panel_item) = &node.item.get().unwrap().specialization { if let Some(core_surface) = panel_item.core_surface.upgrade() { - let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?; - let w = flex_vec.index(0)?.get_u64()? as u32; - let h = flex_vec.index(1)?.get_u64()? as u32; + let size: Vector2 = deserialize(data)?; let toplevel_surface = core_surface .wayland_state() @@ -467,8 +464,8 @@ impl PanelItem { let mut size_set = false; toplevel_surface.with_pending_state(|state| { state.size = Some(Size::default()); - state.size.as_mut().unwrap().w = w as i32; - state.size.as_mut().unwrap().h = h as i32; + state.size.as_mut().unwrap().w = size.x as i32; + state.size.as_mut().unwrap().h = size.y as i32; size_set = true; }); if size_set {