fix(panel): applying materials works
This commit is contained in:
@@ -4,7 +4,7 @@ use super::spatial::{get_spatial_parent_flex, get_transform_pose_flex, Spatial};
|
|||||||
use crate::core::client::{Client, INTERNAL_CLIENT};
|
use crate::core::client::{Client, INTERNAL_CLIENT};
|
||||||
use crate::core::nodelist::LifeLinkedNodeList;
|
use crate::core::nodelist::LifeLinkedNodeList;
|
||||||
use crate::core::registry::Registry;
|
use crate::core::registry::Registry;
|
||||||
use crate::wayland::panel_item::PanelItem;
|
use crate::wayland::panel_item::{register_panel_item_ui_flex, PanelItem};
|
||||||
use anyhow::{anyhow, ensure, Result};
|
use anyhow::{anyhow, ensure, Result};
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use nanoid::nanoid;
|
use nanoid::nanoid;
|
||||||
@@ -316,6 +316,7 @@ pub fn create_interface(client: &Arc<Client>) {
|
|||||||
"registerEnvironmentItemUI",
|
"registerEnvironmentItemUI",
|
||||||
register_environment_item_ui_flex,
|
register_environment_item_ui_flex,
|
||||||
);
|
);
|
||||||
|
node.add_local_signal("registerPanelItemUI", register_panel_item_ui_flex);
|
||||||
node.add_local_signal(
|
node.add_local_signal(
|
||||||
"createEnvironmentItemAcceptor",
|
"createEnvironmentItemAcceptor",
|
||||||
create_environment_item_acceptor_flex,
|
create_environment_item_acceptor_flex,
|
||||||
|
|||||||
@@ -24,13 +24,11 @@ impl CompositorHandler for WaylandState {
|
|||||||
compositor::with_states(surface, |data| {
|
compositor::with_states(surface, |data| {
|
||||||
if let Some(surface_states) = data.data_map.get::<RendererSurfaceStateUserData>() {
|
if let Some(surface_states) = data.data_map.get::<RendererSurfaceStateUserData>() {
|
||||||
if let Some(core_surface) = data.data_map.get::<CoreSurface>() {
|
if let Some(core_surface) = data.data_map.get::<CoreSurface>() {
|
||||||
core_surface.wl_tex.replace(
|
*core_surface.wl_tex.lock() = surface_states
|
||||||
surface_states
|
.borrow()
|
||||||
.borrow()
|
.texture(&self.renderer)
|
||||||
.texture(&self.renderer)
|
.cloned()
|
||||||
.cloned()
|
.map(SendWrapper::new);
|
||||||
.map(SendWrapper::new),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
pub mod panel_item;
|
|
||||||
pub mod compositor;
|
pub mod compositor;
|
||||||
|
pub mod panel_item;
|
||||||
pub mod shaders;
|
pub mod shaders;
|
||||||
pub mod surface;
|
pub mod surface;
|
||||||
pub mod xdg_decoration;
|
pub mod xdg_decoration;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
nodes::{
|
nodes::{
|
||||||
core::Node,
|
core::Node,
|
||||||
item::{Item, ItemType, TypeInfo},
|
item::{register_item_ui_flex, Item, ItemType, TypeInfo},
|
||||||
spatial::Spatial,
|
spatial::Spatial,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -68,7 +68,7 @@ impl PanelItem {
|
|||||||
|
|
||||||
fn apply_surface_material(node: &Node, calling_client: Arc<Client>, data: &[u8]) -> Result<()> {
|
fn apply_surface_material(node: &Node, calling_client: Arc<Client>, data: &[u8]) -> Result<()> {
|
||||||
let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?;
|
let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?;
|
||||||
let material_idx = flex_vec.idx(0).get_u64()?;
|
let material_idx = flex_vec.idx(1).get_u64()?;
|
||||||
let model_node = calling_client
|
let model_node = calling_client
|
||||||
.scenegraph
|
.scenegraph
|
||||||
.get_node(flex_vec.idx(0).as_str())
|
.get_node(flex_vec.idx(0).as_str())
|
||||||
@@ -80,17 +80,29 @@ impl PanelItem {
|
|||||||
|
|
||||||
if let ItemType::Panel(panel_item) = &node.item.get().unwrap().specialization {
|
if let ItemType::Panel(panel_item) = &node.item.get().unwrap().specialization {
|
||||||
compositor::with_states(&panel_item.toplevel_surface, |states| {
|
compositor::with_states(&panel_item.toplevel_surface, |states| {
|
||||||
if let Some(core_surface) = states.data_map.get::<CoreSurface>() {
|
let sk_mat = states
|
||||||
if let Some(sk_mat) = core_surface.sk_mat.get() {
|
.data_map
|
||||||
model
|
.get::<CoreSurface>()
|
||||||
.pending_material_replacements
|
.unwrap()
|
||||||
.lock()
|
.sk_mat
|
||||||
.insert(material_idx as u32, sk_mat.clone());
|
.get()
|
||||||
}
|
.unwrap()
|
||||||
}
|
.clone();
|
||||||
|
model
|
||||||
|
.pending_material_replacements
|
||||||
|
.lock()
|
||||||
|
.insert(material_idx as u32, sk_mat);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn register_panel_item_ui_flex(
|
||||||
|
_node: &Node,
|
||||||
|
calling_client: Arc<Client>,
|
||||||
|
_data: &[u8],
|
||||||
|
) -> Result<()> {
|
||||||
|
register_item_ui_flex(calling_client, &ITEM_TYPE_INFO_PANEL)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use std::{cell::RefCell, fmt::Error, sync::Arc};
|
use std::{fmt::Error, sync::Arc};
|
||||||
|
|
||||||
use glam::vec2;
|
use glam::vec2;
|
||||||
use once_cell::sync::OnceCell;
|
use once_cell::sync::OnceCell;
|
||||||
|
use parking_lot::Mutex;
|
||||||
use send_wrapper::SendWrapper;
|
use send_wrapper::SendWrapper;
|
||||||
use smithay::backend::renderer::{gles2::Gles2Texture, Texture};
|
use smithay::backend::renderer::{gles2::Gles2Texture, Texture};
|
||||||
use stereokit::{
|
use stereokit::{
|
||||||
@@ -14,15 +15,15 @@ use stereokit::{
|
|||||||
use super::shaders::SIMULA_SHADER_BYTES;
|
use super::shaders::SIMULA_SHADER_BYTES;
|
||||||
|
|
||||||
pub struct CoreSurface {
|
pub struct CoreSurface {
|
||||||
pub wl_tex: RefCell<Option<SendWrapper<Gles2Texture>>>,
|
pub wl_tex: Mutex<Option<SendWrapper<Gles2Texture>>>,
|
||||||
sk_tex: OnceCell<SKTexture>,
|
sk_tex: OnceCell<SendWrapper<SKTexture>>,
|
||||||
pub sk_mat: OnceCell<Arc<SendWrapper<Material>>>,
|
pub sk_mat: OnceCell<Arc<SendWrapper<Material>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CoreSurface {
|
impl CoreSurface {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
CoreSurface {
|
CoreSurface {
|
||||||
wl_tex: RefCell::new(None),
|
wl_tex: Mutex::new(None),
|
||||||
sk_tex: OnceCell::new(),
|
sk_tex: OnceCell::new(),
|
||||||
sk_mat: OnceCell::new(),
|
sk_mat: OnceCell::new(),
|
||||||
}
|
}
|
||||||
@@ -32,7 +33,9 @@ impl CoreSurface {
|
|||||||
let sk_tex = self
|
let sk_tex = self
|
||||||
.sk_tex
|
.sk_tex
|
||||||
.get_or_try_init(|| {
|
.get_or_try_init(|| {
|
||||||
SKTexture::create(sk, TextureType::ImageNoMips, TextureFormat::RGBA32).ok_or(Error)
|
SKTexture::create(sk, TextureType::ImageNoMips, TextureFormat::RGBA32)
|
||||||
|
.ok_or(Error)
|
||||||
|
.map(SendWrapper::new)
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let sk_mat = self
|
let sk_mat = self
|
||||||
@@ -42,13 +45,13 @@ impl CoreSurface {
|
|||||||
Material::create(sk, &shader)
|
Material::create(sk, &shader)
|
||||||
.ok_or(Error)
|
.ok_or(Error)
|
||||||
.map(|mat| {
|
.map(|mat| {
|
||||||
mat.set_parameter("diffuse", self.sk_tex.get().unwrap());
|
mat.set_parameter("diffuse", &**self.sk_tex.get().unwrap());
|
||||||
mat
|
mat
|
||||||
})
|
})
|
||||||
.map(|mat| Arc::new(SendWrapper::new(mat)))
|
.map(|mat| Arc::new(SendWrapper::new(mat)))
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
if let Some(smithay_tex) = self.wl_tex.borrow().as_ref() {
|
if let Some(smithay_tex) = self.wl_tex.lock().as_ref() {
|
||||||
unsafe {
|
unsafe {
|
||||||
sk_tex.set_native(
|
sk_tex.set_native(
|
||||||
smithay_tex.tex_id() as usize,
|
smithay_tex.tex_id() as usize,
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ impl XdgShellHandler for WaylandState {
|
|||||||
surface.send_configure();
|
surface.send_configure();
|
||||||
|
|
||||||
compositor::with_states(surface.wl_surface(), |data| {
|
compositor::with_states(surface.wl_surface(), |data| {
|
||||||
data.data_map.insert_if_missing(CoreSurface::new);
|
data.data_map.insert_if_missing_threadsafe(CoreSurface::new);
|
||||||
data.data_map
|
data.data_map
|
||||||
.insert_if_missing(|| PanelItem::create(surface.wl_surface().clone()));
|
.insert_if_missing_threadsafe(|| PanelItem::create(surface.wl_surface().clone()));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user