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>, named_materials: &HashMap, loc: &FileLoc, arena: &mut Arena, ) -> Result; } pub trait MaterialFactory { fn create( name: &str, params: &TextureParameterDictionary, normal_map: Option>, named_materials: HashMap, loc: FileLoc, arena: &mut Arena, ) -> Result; } impl MaterialFactory for Material { fn create( name: &str, parameters: &TextureParameterDictionary, normal_map: Option>, named_materials: HashMap, loc: FileLoc, arena: &mut Arena, ) -> Result { 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)), } } }