pbrt/src/core/material.rs

87 lines
2.9 KiB
Rust

use crate::Arena;
use crate::core::image::Image;
use crate::utils::TextureParameterDictionary;
use crate::utils::error::FileLoc;
use anyhow::{Result, anyhow};
use shared::core::material::Material;
use shared::materials::*;
use std::collections::HashMap;
use std::sync::Arc;
pub trait CreateMaterial: Sized {
fn create(
parameters: &TextureParameterDictionary,
normal_map: Option<Arc<Image>>,
named_materials: &HashMap<String, Material>,
loc: &FileLoc,
arena: &mut Arena,
) -> Result<Material>;
}
pub trait MaterialFactory {
fn create(
name: &str,
params: &TextureParameterDictionary,
normal_map: Option<Arc<Image>>,
named_materials: HashMap<String, Material>,
loc: FileLoc,
arena: &mut Arena,
) -> Result<Self>;
}
impl MaterialFactory for Material {
fn create(
name: &str,
parameters: &TextureParameterDictionary,
normal_map: Option<Arc<Image>>,
named_materials: HashMap<String, Material>,
loc: FileLoc,
arena: &mut Arena,
) -> Result<Material> {
match name {
"diffuse" => {
DiffuseMaterial::create(parameters, normal_map, &named_materials, &loc, arena)
}
"coateddiffuse" => {
CoatedDiffuseMaterial::create(parameters, normal_map, &named_materials, &loc, arena)
}
"coatedconductor" => CoatedConductorMaterial::create(
parameters,
normal_map,
&named_materials,
&loc,
arena,
),
"diffusetransmission" => DiffuseTransmissionMaterial::create(
parameters,
normal_map,
&named_materials,
&loc,
arena,
),
"dielectric" => {
DielectricMaterial::create(parameters, normal_map, &named_materials, &loc, arena)
}
"thindielectric" => ThinDielectricMaterial::create(
parameters,
normal_map,
&named_materials,
&loc,
arena,
),
"hair" => HairMaterial::create(parameters, normal_map, &named_materials, &loc, arena),
"conductor" => {
ConductorMaterial::create(parameters, normal_map, &named_materials, &loc, arena)
}
"measured" => {
MeasuredMaterial::create(parameters, normal_map, &named_materials, &loc, arena)
}
"subsurface" => {
SubsurfaceMaterial::create(parameters, normal_map, &named_materials, &loc, arena)
}
"mix" => MixMaterial::create(parameters, normal_map, &named_materials, &loc, arena),
_ => Err(anyhow!("Material type '{}' unknown at {}", $name, $loc)),
}
}
}