shine_gltf/extensions/
material.rs1use serde_derive::{Deserialize, Serialize};
2use shine_gltf_macro::Validate;
3
4#[cfg(feature = "KHR_materials_pbrSpecularGlossiness")]
5use {
6 material::StrengthFactor,
7 texture, Path, Root, {Error, Validate},
8};
9
10#[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)]
12pub struct Material {
13 #[cfg(feature = "KHR_materials_pbrSpecularGlossiness")]
14 #[serde(
15 default,
16 rename = "KHR_materials_pbrSpecularGlossiness",
17 skip_serializing_if = "Option::is_none"
18 )]
19 pub pbr_specular_glossiness: Option<PbrSpecularGlossiness>,
20}
21
22#[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)]
25pub struct PbrMetallicRoughness {}
26
27#[cfg(feature = "KHR_materials_pbrSpecularGlossiness")]
34#[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)]
35#[serde(default, rename_all = "camelCase")]
36pub struct PbrSpecularGlossiness {
37 pub diffuse_factor: PbrDiffuseFactor,
44
45 #[serde(skip_serializing_if = "Option::is_none")]
53 pub diffuse_texture: Option<texture::Info>,
54
55 pub specular_factor: PbrSpecularFactor,
57
58 pub glossiness_factor: StrengthFactor,
64
65 #[serde(skip_serializing_if = "Option::is_none")]
71 pub specular_glossiness_texture: Option<texture::Info>,
72}
73
74#[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)]
76pub struct NormalTexture {}
77
78#[derive(Clone, Debug, Default, Deserialize, Serialize, Validate)]
80pub struct OcclusionTexture {}
81
82#[cfg(feature = "KHR_materials_pbrSpecularGlossiness")]
84#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
85pub struct PbrDiffuseFactor(pub [f32; 4]);
86
87#[cfg(feature = "KHR_materials_pbrSpecularGlossiness")]
88impl Default for PbrDiffuseFactor {
89 fn default() -> Self {
90 PbrDiffuseFactor([1.0, 1.0, 1.0, 1.0])
91 }
92}
93
94#[cfg(feature = "KHR_materials_pbrSpecularGlossiness")]
95impl Validate for PbrDiffuseFactor {
96 fn validate_completely<P, R>(&self, _: &Root, path: P, report: &mut R)
97 where
98 P: Fn() -> Path,
99 R: FnMut(&Fn() -> Path, Error),
100 {
101 for x in &self.0 {
102 if *x < 0.0 || *x > 1.0 {
103 report(&path, Error::Invalid);
104 break;
106 }
107 }
108 }
109}
110
111#[cfg(feature = "KHR_materials_pbrSpecularGlossiness")]
113#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
114pub struct PbrSpecularFactor(pub [f32; 3]);
115
116#[cfg(feature = "KHR_materials_pbrSpecularGlossiness")]
117impl Default for PbrSpecularFactor {
118 fn default() -> Self {
119 PbrSpecularFactor([1.0, 1.0, 1.0])
120 }
121}
122
123#[cfg(feature = "KHR_materials_pbrSpecularGlossiness")]
124impl Validate for PbrSpecularFactor {
125 fn validate_completely<P, R>(&self, _: &Root, path: P, report: &mut R)
126 where
127 P: Fn() -> Path,
128 R: FnMut(&Fn() -> Path, Error),
129 {
130 for x in &self.0 {
131 if *x < 0.0 || *x > 1.0 {
132 report(&path, Error::Invalid);
133 break;
135 }
136 }
137 }
138}