mod3d_gltf/
material.rs

1//a Imports
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5#[cfg(feature = "serde")]
6use crate::deserialize;
7
8use crate::Named;
9use crate::{GltfTextureInfo, MaterialIndex};
10
11//tp GltfPbrMetallicRoughness
12/// A Pbr metallic/roughneess
13#[derive(Debug, Default)]
14#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
15#[cfg_attr(feature = "serde", serde(default))]
16pub struct GltfPbrMetallicRoughness {
17    /// Base color factor
18    #[cfg_attr(feature = "serde", serde(rename = "baseColorFactor"))]
19    pub base_color_factor: Option<Vec<f32>>,
20
21    /// Base color texture
22    #[cfg_attr(feature = "serde", serde(rename = "baseColorTexture"))]
23    pub base_color_texture: Option<GltfTextureInfo>,
24
25    /// Metallic/roughness texture
26    #[cfg_attr(feature = "serde", serde(rename = "metallicRoughnessTexture"))]
27    pub metallic_roughness_texture: Option<GltfTextureInfo>,
28    #[cfg_attr(
29        feature = "serde",
30        serde(rename = "metallicFactor", default = "deserialize::f32_one")
31    )]
32
33    /// Metallic factor
34    pub metallic_factor: f32,
35    #[cfg_attr(
36        feature = "serde",
37        serde(rename = "roughnessFactor", default = "deserialize::f32_one")
38    )]
39
40    /// Roughness factor
41    pub roughness_factor: f32,
42}
43
44impl GltfPbrMetallicRoughness {
45    pub fn base_color_texture(&self) -> &Option<GltfTextureInfo> {
46        &self.base_color_texture
47    }
48    pub fn metallic_roughness_texture(&self) -> &Option<GltfTextureInfo> {
49        &self.metallic_roughness_texture
50    }
51}
52
53//a GltfMaterial
54//tp GltfMaterial
55/// A type representing a Gltf Material -
56#[derive(Debug, Default)]
57#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
58#[cfg_attr(feature = "serde", serde(default))]
59pub struct GltfMaterial {
60    /// Optional name of the material
61    pub name: String,
62    /// Image index (source)
63    #[cfg_attr(feature = "serde", serde(rename = "normalTexture"))]
64    pub normal_texture: Option<GltfTextureInfo>,
65    /// occlusion texture
66    #[cfg_attr(feature = "serde", serde(rename = "occlusionTexture"))]
67    pub occlusion_texture: Option<GltfTextureInfo>,
68    /// emissive texture
69    #[cfg_attr(feature = "serde", serde(rename = "emissiveTexture"))]
70    pub emissive_texture: Option<GltfTextureInfo>,
71    /// pbrMetallicRoughness
72    #[cfg_attr(feature = "serde", serde(rename = "pbrMetallicRoughness"))]
73    pub pbr_metallic_roughness: Option<GltfPbrMetallicRoughness>,
74
75    /// Emissive factor
76    #[cfg_attr(feature = "serde", serde(rename = "emissiveFactor"))]
77    pub emissive_factor: [f32; 3],
78
79    /// One of OPAQUE, MASK, BLEND
80    #[cfg_attr(feature = "serde", serde(rename = "alphaMode"))]
81    pub alpha_mode: Option<String>,
82    #[cfg_attr(feature = "serde", serde(rename = "alphaCutoff"))]
83    pub alpha_cutoff: f32,
84    #[cfg_attr(feature = "serde", serde(rename = "doubleSided"))]
85    pub double_sided: bool,
86}
87
88impl GltfMaterial {
89    pub fn pbr_metallic_roughness(&self) -> &Option<GltfPbrMetallicRoughness> {
90        &self.pbr_metallic_roughness
91    }
92    pub fn normal_texture(&self) -> &Option<GltfTextureInfo> {
93        &self.normal_texture
94    }
95    pub fn occlusion_texture(&self) -> &Option<GltfTextureInfo> {
96        &self.occlusion_texture
97    }
98    pub fn emissive_texture(&self) -> &Option<GltfTextureInfo> {
99        &self.emissive_texture
100    }
101}
102
103//ip Named for GltfMaterial
104impl Named for GltfMaterial {
105    type Index = MaterialIndex;
106    fn is_name(&self, name: &str) -> bool {
107        self.name == name
108    }
109}