41 lines
1.3 KiB
Rust
41 lines
1.3 KiB
Rust
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<Arc<HostImage>>,
|
|
named_materials: &HashMap<String, Material>,
|
|
loc: &FileLoc,
|
|
arena: &Arena,
|
|
) -> Result<Material> {
|
|
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<Ptr<Material>> {
|
|
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))
|
|
}
|
|
}
|