Skip to main content

ursus_materials/strategies/
unlit.rs

1use crate::error::MaterialError;
2use crate::field::{FieldDesc, FieldType};
3use crate::material::Material;
4use crate::requirements::Requirements;
5use crate::strategies::properties::*;
6use crate::strategy::ShadingStrategy;
7use crate::value::{MaterialValue, TextureRef};
8
9const FIELDS: &[FieldDesc] = &[
10    FieldDesc::new("base_color", FieldType::Vec4),
11    FieldDesc::new("diffuse_texture", FieldType::UInt),
12];
13
14pub struct UnlitStrategy {
15    requirements: Requirements,
16}
17
18impl Default for UnlitStrategy {
19    fn default() -> Self {
20        let requirements = Requirements::new().optional(BASE_COLOR, MaterialValue::Color(glam::Vec4::ONE));
21        Self { requirements }
22    }
23}
24
25impl ShadingStrategy for UnlitStrategy {
26    fn name(&self) -> &'static str {
27        "unlit"
28    }
29
30    fn requirements(&self) -> &Requirements {
31        &self.requirements
32    }
33
34    fn fields(&self) -> &[FieldDesc] {
35        FIELDS
36    }
37
38    fn resolve(&self, material: &Material) -> Result<Vec<MaterialValue>, MaterialError> {
39        let base_color = self.requirements.get_or_default(material, BASE_COLOR).copied().ok_or_else(|| {
40            MaterialError::MissingProperty {
41                material: material.name.clone(),
42                strategy: self.name(),
43                property: BASE_COLOR,
44            }
45        })?;
46
47        let diffuse = material.get(DIFFUSE_TEXTURE).copied().unwrap_or(MaterialValue::Texture(TextureRef(0)));
48
49        Ok(vec![base_color, diffuse])
50    }
51}