1#[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#[derive(Debug, Default)]
14#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
15#[cfg_attr(feature = "serde", serde(default))]
16pub struct GltfPbrMetallicRoughness {
17 #[cfg_attr(feature = "serde", serde(rename = "baseColorFactor"))]
19 pub base_color_factor: Option<Vec<f32>>,
20
21 #[cfg_attr(feature = "serde", serde(rename = "baseColorTexture"))]
23 pub base_color_texture: Option<GltfTextureInfo>,
24
25 #[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 pub metallic_factor: f32,
35 #[cfg_attr(
36 feature = "serde",
37 serde(rename = "roughnessFactor", default = "deserialize::f32_one")
38 )]
39
40 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#[derive(Debug, Default)]
57#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
58#[cfg_attr(feature = "serde", serde(default))]
59pub struct GltfMaterial {
60 pub name: String,
62 #[cfg_attr(feature = "serde", serde(rename = "normalTexture"))]
64 pub normal_texture: Option<GltfTextureInfo>,
65 #[cfg_attr(feature = "serde", serde(rename = "occlusionTexture"))]
67 pub occlusion_texture: Option<GltfTextureInfo>,
68 #[cfg_attr(feature = "serde", serde(rename = "emissiveTexture"))]
70 pub emissive_texture: Option<GltfTextureInfo>,
71 #[cfg_attr(feature = "serde", serde(rename = "pbrMetallicRoughness"))]
73 pub pbr_metallic_roughness: Option<GltfPbrMetallicRoughness>,
74
75 #[cfg_attr(feature = "serde", serde(rename = "emissiveFactor"))]
77 pub emissive_factor: [f32; 3],
78
79 #[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
103impl Named for GltfMaterial {
105 type Index = MaterialIndex;
106 fn is_name(&self, name: &str) -> bool {
107 self.name == name
108 }
109}