ursus_materials/strategies/
unlit.rs1use 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}