87 lines
2.9 KiB
Rust
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)),
|
|
}
|
|
}
|
|
}
|