use crate::core::image::HostImage; use crate::core::material::CreateMaterial; use crate::{Arena, ArenaUpload, FileLoc, utils::TextureParameterDictionary}; use anyhow::Result; use anyhow::anyhow; use shared::Ptr; use shared::core::material::Material; use shared::materials::MixMaterial; use std::collections::HashMap; use std::sync::Arc; impl CreateMaterial for MixMaterial { fn create( parameters: &TextureParameterDictionary, _normal_map: Option>, named_materials: &HashMap, loc: &FileLoc, arena: &Arena, ) -> Result { let names = parameters.get_string_array("materials")?; let [a, b]: [String; 2] = names .try_into() .map_err(|_| anyhow!("{loc}: must provide two values for \"string materials\""))?; let mut resolve = |n: &str| -> Result> { let m = named_materials .get(n) .ok_or_else(|| anyhow!("{loc}: {n}: named material not found"))?; Ok(arena.alloc(*m)) }; let materials = [resolve(&a)?, resolve(&b)?]; let amount = parameters.get_float_texture("amount", 0.5)?; let mix_mat = MixMaterial { materials, amount: arena.upload(amount), }; Ok(Material::Mix(mix_mat)) } }