bevy_gltf/loader/extensions/
khr_materials_clearcoat.rs1use bevy_asset::{AssetPath, Handle};
2use bevy_image::Image;
3
4use gltf::Material;
5
6use serde_json::Value;
7
8#[cfg(feature = "pbr_multi_layer_material_textures")]
9use {crate::loader::gltf_ext::material::parse_material_extension_texture, bevy_mesh::UvChannel};
10
11#[derive(#[automatically_derived]impl ::core::default::Default for ClearcoatExtension {
#[inline]
fn default() -> Self {
ClearcoatExtension {
clearcoat_factor: ::core::default::Default::default(),
clearcoat_channel: ::core::default::Default::default(),
clearcoat_texture: ::core::default::Default::default(),
clearcoat_roughness_factor: ::core::default::Default::default(),
clearcoat_roughness_channel: ::core::default::Default::default(),
clearcoat_roughness_texture: ::core::default::Default::default(),
clearcoat_normal_channel: ::core::default::Default::default(),
clearcoat_normal_texture: ::core::default::Default::default(),
}
}
}Default)]
16pub(crate) struct ClearcoatExtension {
17 pub(crate) clearcoat_factor: Option<f64>,
18 #[cfg(feature = "pbr_multi_layer_material_textures")]
19 pub(crate) clearcoat_channel: UvChannel,
20 #[cfg(feature = "pbr_multi_layer_material_textures")]
21 pub(crate) clearcoat_texture: Option<Handle<Image>>,
22 pub(crate) clearcoat_roughness_factor: Option<f64>,
23 #[cfg(feature = "pbr_multi_layer_material_textures")]
24 pub(crate) clearcoat_roughness_channel: UvChannel,
25 #[cfg(feature = "pbr_multi_layer_material_textures")]
26 pub(crate) clearcoat_roughness_texture: Option<Handle<Image>>,
27 #[cfg(feature = "pbr_multi_layer_material_textures")]
28 pub(crate) clearcoat_normal_channel: UvChannel,
29 #[cfg(feature = "pbr_multi_layer_material_textures")]
30 pub(crate) clearcoat_normal_texture: Option<Handle<Image>>,
31}
32
33impl ClearcoatExtension {
34 #[expect(
35 clippy::allow_attributes,
36 reason = "`unused_variables` is not always linted"
37 )]
38 #[allow(
39 unused_variables,
40 reason = "Depending on what features are used to compile this crate, certain parameters may end up unused."
41 )]
42 pub(crate) fn parse(
43 material: &Material,
44 textures: &[Handle<Image>],
45 asset_path: AssetPath<'_>,
46 ) -> Option<ClearcoatExtension> {
47 let extension = material
48 .extensions()?
49 .get("KHR_materials_clearcoat")?
50 .as_object()?;
51
52 #[cfg(feature = "pbr_multi_layer_material_textures")]
53 let (clearcoat_channel, clearcoat_texture) = parse_material_extension_texture(
54 material,
55 extension,
56 "clearcoatTexture",
57 "clearcoat",
58 textures,
59 asset_path.clone(),
60 );
61
62 #[cfg(feature = "pbr_multi_layer_material_textures")]
63 let (clearcoat_roughness_channel, clearcoat_roughness_texture) =
64 parse_material_extension_texture(
65 material,
66 extension,
67 "clearcoatRoughnessTexture",
68 "clearcoat roughness",
69 textures,
70 asset_path.clone(),
71 );
72
73 #[cfg(feature = "pbr_multi_layer_material_textures")]
74 let (clearcoat_normal_channel, clearcoat_normal_texture) = parse_material_extension_texture(
75 material,
76 extension,
77 "clearcoatNormalTexture",
78 "clearcoat normal",
79 textures,
80 asset_path,
81 );
82
83 Some(ClearcoatExtension {
84 clearcoat_factor: extension.get("clearcoatFactor").and_then(Value::as_f64),
85 clearcoat_roughness_factor: extension
86 .get("clearcoatRoughnessFactor")
87 .and_then(Value::as_f64),
88 #[cfg(feature = "pbr_multi_layer_material_textures")]
89 clearcoat_channel,
90 #[cfg(feature = "pbr_multi_layer_material_textures")]
91 clearcoat_texture,
92 #[cfg(feature = "pbr_multi_layer_material_textures")]
93 clearcoat_roughness_channel,
94 #[cfg(feature = "pbr_multi_layer_material_textures")]
95 clearcoat_roughness_texture,
96 #[cfg(feature = "pbr_multi_layer_material_textures")]
97 clearcoat_normal_channel,
98 #[cfg(feature = "pbr_multi_layer_material_textures")]
99 clearcoat_normal_texture,
100 })
101 }
102}