From e0e5f3b3bc321425529c4457eeac2516eca2e1bb Mon Sep 17 00:00:00 2001 From: Nova Date: Thu, 5 Jan 2023 21:46:25 -0500 Subject: [PATCH] feat(model): set material parameter --- Cargo.toml | 7 ++- src/nodes/drawable/model.rs | 94 ++++++++++++++++++++++++++++++++----- 2 files changed, 89 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 790fb07..38b7edc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,7 +42,7 @@ global_counter = "0.2.2" [dependencies.stereokit] default-features = false features = ["linux-egl", "color_named", "prisma"] -version = "0.10.0" +version = "0.11.0" [dependencies.smithay] git = "https://github.com/technobaboo/smithay.git" # Until we get stereokit to understand OES samplers and external textures @@ -54,3 +54,8 @@ optional = true [features] default = ["wayland"] wayland = ["dep:smithay", "dep:xkbcommon"] + +[patch.crates-io.stereokit] +path = "../stereokit-rs" +# [patch.crates-io.stereokit-sys] +# path = "../stereokit-sys" \ No newline at end of file diff --git a/src/nodes/drawable/model.rs b/src/nodes/drawable/model.rs index 5e3b3c8..ee587b6 100644 --- a/src/nodes/drawable/model.rs +++ b/src/nodes/drawable/model.rs @@ -5,6 +5,7 @@ use crate::core::registry::Registry; use crate::core::resource::ResourceID; use crate::nodes::spatial::{find_spatial_parent, parse_transform, Spatial}; use color_eyre::eyre::{ensure, eyre, Result}; +use mint::{ColumnMatrix4, Vector2, Vector3, Vector4}; use once_cell::sync::OnceCell; use parking_lot::Mutex; use rustc_hash::FxHashMap; @@ -17,19 +18,96 @@ use std::fmt::Error; use std::path::PathBuf; use std::sync::Arc; use stereokit::color_named::WHITE; -use stereokit::lifecycle::StereoKitDraw; +use stereokit::lifecycle::{StereoKitContext, StereoKitDraw}; use stereokit::material::Material; use stereokit::model::Model as SKModel; use stereokit::render::RenderLayer; use stereokit::texture::Texture; +use stereokit::values::Color128; static MODEL_REGISTRY: Registry = Registry::new(); #[derive(Deserialize, Debug)] -#[serde(untagged)] +#[serde(tag = "t", content = "c")] pub enum MaterialParameter { + Float(f32), + Vector2(Vector2), + Vector3(Vector3), + Vector4(Vector4), + Color([f32; 4]), + Int(i32), + Int2(Vector2), + Int3(Vector3), + Int4(Vector4), + Bool(bool), + UInt(u32), + UInt2(Vector2), + UInt3(Vector3), + UInt4(Vector4), + Matrix(ColumnMatrix4), Texture(PathBuf), } +impl MaterialParameter { + fn apply_to_material( + &self, + sk: &impl StereoKitContext, + material: &Material, + parameter_name: &str, + ) { + match self { + MaterialParameter::Float(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::Vector2(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::Vector3(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::Vector4(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::Color(val) => { + material.set_parameter(sk, parameter_name, &Color128::from(val.clone())); + } + MaterialParameter::Int(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::Int2(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::Int3(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::Int4(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::Bool(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::UInt(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::UInt2(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::UInt3(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::UInt4(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::Matrix(val) => { + material.set_parameter(sk, parameter_name, val); + } + MaterialParameter::Texture(path) => { + if let Some(tex) = Texture::from_file(sk, path.as_path(), true, 0) { + material.set_parameter(sk, parameter_name, &tex); + } + } + } + } +} pub struct Model { space: Arc, @@ -58,7 +136,7 @@ impl Model { pending_material_replacements: Mutex::new(FxHashMap::default()), sk_model: OnceCell::new(), }; - node.add_local_signal("set_material_parameter", Model::set_material_parameter); + node.add_local_signal("set_material_parameter", Model::set_material_parameter_flex); let model_arc = MODEL_REGISTRY.add(model); let _ = model_arc.pending_model_path.set( model_arc @@ -78,7 +156,7 @@ impl Model { Ok(model_arc) } - fn set_material_parameter( + fn set_material_parameter_flex( node: &Node, _calling_client: Arc, data: &[u8], @@ -126,13 +204,7 @@ impl Model { for ((material_idx, parameter_name), parameter_value) in material_parameters.iter() { if let Some(material) = sk_model.get_material(sk, *material_idx as i32) { - match parameter_value { - MaterialParameter::Texture(path) => { - if let Some(tex) = Texture::from_file(sk, path.as_path(), true, 0) { - material.set_parameter(sk, parameter_name.as_str(), &tex); - } - } - } + parameter_value.apply_to_material(sk, &material, parameter_name.as_str()); } } material_parameters.clear();