pbrt/src/materials/mix.rs

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))
}
}