Skip to main content

bevy_gltf/loader/extensions/
khr_materials_clearcoat.rs

1use 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/// Parsed data from the `KHR_materials_clearcoat` extension.
12///
13/// See the specification:
14/// <https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md>
15#[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}