1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use crate::{color::Color, impl_visitable_noop, support::Visitable};
7
8#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Visitable, Default)]
9#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
10#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
11#[serde(rename_all = "camelCase", rename = "igMaterial")]
12pub struct Material {
13 pub shininess: Option<f64>,
14
15 pub diffuse: Option<AlphaColorMap>,
18
19 pub specular: Option<ColorNoMap>,
21
22 pub emission: Option<ColorNoMap>,
24
25 pub normal: Option<BasicMap>,
27
28 pub metalness: Option<BasicMap>,
30
31 pub roughness: Option<BasicMap>,
33
34 pub sheen: Option<BasicMap>,
36
37 pub alpha: Option<ValueMap>,
41
42 pub diffuse_delta: Option<TextureMap>,
55
56 pub roughness_delta: Option<TextureMap>,
69
70 pub displacement: Option<TextureMap>,
73
74 pub mapping: Option<TextureMapping>,
76
77 #[serde(
79 deserialize_with = "crate::utils::deserialize_optional_map_without_null_values",
80 default
81 )]
82 pub taxonomy: Option<HashMap<String, Value>>,
83
84 #[serde(
104 deserialize_with = "crate::utils::deserialize_optional_map_without_null_values",
105 default
106 )]
107 pub parameters: Option<HashMap<String, Value>>,
108}
109
110#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Visitable)]
111#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
112#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
113#[serde(rename_all = "camelCase")]
114pub struct ValueMap {
117 #[serde(flatten)]
118 pub basic: BasicMap,
119
120 pub value: Option<f64>,
123}
124
125#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Visitable)]
126#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
127#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
128#[serde(rename_all = "camelCase")]
129pub struct AlphaColorMap {
130 #[serde(flatten)]
131 pub color_map: ColorMap,
132
133 pub alpha_mode: Option<AlphaMode>,
134}
135
136#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
137#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
138pub enum AlphaMode {
139 Standard,
142 RGBA,
145}
146
147impl_visitable_noop!(AlphaMode);
148
149#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Visitable)]
150#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
151#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
152#[serde(rename_all = "camelCase")]
153pub struct ColorNoMap {
155 pub color: Option<Color>,
157}
158
159#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Visitable)]
160#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
161#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
162#[serde(rename_all = "camelCase")]
163pub struct ColorMap {
166 #[serde(flatten)]
167 pub basic: BasicMap,
168
169 pub color: Option<Color>,
171}
172
173#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Visitable)]
174#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
175#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
176#[serde(rename_all = "camelCase")]
177pub struct BasicMap {
178 pub map: Option<TextureMap>,
179}
180
181#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
182#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
183#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
184#[serde(rename_all = "camelCase")]
185pub struct TextureMap {
186 pub map_format: TextureMapFormat,
188
189 pub map: String,
191
192 pub mapping: Option<TextureMapping>,
194}
195
196impl Visitable for TextureMap {
197 fn visit_with(&mut self, visitor: &mut dyn crate::support::Visitor) {
198 visitor.visit_texture_map(self);
199 visitor.visit_path(&mut self.map);
200 }
201}
202
203#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
204#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
205pub enum TextureMapFormat {
206 JPEG,
207 PNG,
208 WEBP,
209}
210
211impl_visitable_noop!(TextureMapFormat);
212
213#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
214#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
215#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
216#[serde(rename_all = "camelCase")]
217pub struct TextureMapping {
238 pub translation_s: f64,
239
240 pub translation_t: f64,
241
242 pub rotation: f64,
243
244 #[serde(default = "default_scale")]
245 pub scale_s: f64,
247
248 #[serde(default = "default_scale")]
249 pub scale_t: f64,
251}
252
253impl_visitable_noop!(TextureMapping);
254
255fn default_scale() -> f64 {
256 1.0
257}