From cd86b3a0019a83b80ce08a9c4637f6426a542f57 Mon Sep 17 00:00:00 2001 From: Nova Date: Mon, 22 Aug 2022 14:42:28 -0400 Subject: [PATCH] feat(model): apply material replacements --- src/nodes/model.rs | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/nodes/model.rs b/src/nodes/model.rs index 68a48ab..eef5662 100644 --- a/src/nodes/model.rs +++ b/src/nodes/model.rs @@ -18,6 +18,7 @@ use std::path::PathBuf; use std::sync::Arc; use stereokit::enums::RenderLayer; use stereokit::lifecycle::DrawContext; +use stereokit::material::Material; use stereokit::model::Model as SKModel; use stereokit::texture::Texture; use stereokit::StereoKit; @@ -36,6 +37,7 @@ pub struct Model { resource_id: ResourceID, pending_model_path: OnceCell, pending_material_parameters: Mutex>, + pub pending_material_replacements: Mutex>>>, sk_model: OnceCell>, } @@ -54,6 +56,7 @@ impl Model { resource_id, pending_model_path: OnceCell::new(), pending_material_parameters: Mutex::new(FxHashMap::default()), + pending_material_replacements: Mutex::new(FxHashMap::default()), sk_model: OnceCell::new(), }; node.add_local_signal("setMaterialParameter", Model::set_material_parameter); @@ -81,20 +84,30 @@ impl Model { .ok(); if let Some(sk_model) = sk_model { - for ((material_idx, parameter_name), parameter_value) in - self.pending_material_parameters.lock().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(parameter_name.as_str(), &tex); + let mut material_replacements = self.pending_material_replacements.lock(); + for (material_idx, replacement_material) in material_replacements.iter() { + sk_model.set_material(*material_idx as i32, replacement_material); + } + material_replacements.clear(); + } + + { + let mut material_parameters = self.pending_material_parameters.lock(); + 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(parameter_name.as_str(), &tex); + } } } } } + material_parameters.clear(); } - self.pending_material_parameters.lock().clear(); sk_model.draw( draw_ctx,