use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::{color::Color, impl_visitable_noop, support::Visitable};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Visitable, Default)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
#[serde(rename_all = "camelCase", rename = "igMaterial")]
pub struct Material {
pub shininess: Option<f64>,
pub diffuse: Option<AlphaColorMap>,
pub specular: Option<ColorNoMap>,
pub emission: Option<ColorNoMap>,
pub normal: Option<BasicMap>,
pub metalness: Option<BasicMap>,
pub roughness: Option<BasicMap>,
pub sheen: Option<BasicMap>,
pub alpha: Option<ValueMap>,
pub diffuse_delta: Option<TextureMap>,
pub roughness_delta: Option<TextureMap>,
pub displacement: Option<TextureMap>,
pub mapping: Option<TextureMapping>,
#[serde(
deserialize_with = "crate::utils::deserialize_optional_map_without_null_values",
default
)]
pub taxonomy: Option<HashMap<String, Value>>,
#[serde(
deserialize_with = "crate::utils::deserialize_optional_map_without_null_values",
default
)]
pub parameters: Option<HashMap<String, Value>>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Visitable)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
#[serde(rename_all = "camelCase")]
pub struct ValueMap {
#[serde(flatten)]
pub basic: BasicMap,
pub value: Option<f64>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Visitable)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
#[serde(rename_all = "camelCase")]
pub struct AlphaColorMap {
#[serde(flatten)]
pub color_map: ColorMap,
pub alpha_mode: Option<AlphaMode>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub enum AlphaMode {
Standard,
RGBA,
}
impl_visitable_noop!(AlphaMode);
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Visitable)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
#[serde(rename_all = "camelCase")]
pub struct ColorNoMap {
pub color: Option<Color>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Visitable)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
#[serde(rename_all = "camelCase")]
pub struct ColorMap {
#[serde(flatten)]
pub basic: BasicMap,
pub color: Option<Color>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Visitable)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
#[serde(rename_all = "camelCase")]
pub struct BasicMap {
pub map: Option<TextureMap>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
#[serde(rename_all = "camelCase")]
pub struct TextureMap {
pub map_format: TextureMapFormat,
pub map: String,
pub mapping: Option<TextureMapping>,
}
impl Visitable for TextureMap {
fn visit_with(&mut self, visitor: &mut dyn crate::support::Visitor) {
visitor.visit_texture_map(self);
visitor.visit_path(&mut self.map);
}
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub enum TextureMapFormat {
JPEG,
PNG,
WEBP,
}
impl_visitable_noop!(TextureMapFormat);
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "schema", schemars(deny_unknown_fields))]
#[serde(rename_all = "camelCase")]
pub struct TextureMapping {
pub translation_s: f64,
pub translation_t: f64,
pub rotation: f64,
#[serde(default = "default_scale")]
pub scale_s: f64,
#[serde(default = "default_scale")]
pub scale_t: f64,
}
impl_visitable_noop!(TextureMapping);
fn default_scale() -> f64 {
1.0
}