Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_gltf/src/loader/extensions/khr_materials_clearcoat.rs
9500 views
1
use bevy_asset::{AssetPath, Handle};
2
use bevy_image::Image;
3
4
use gltf::Material;
5
6
use serde_json::Value;
7
8
#[cfg(feature = "pbr_multi_layer_material_textures")]
9
use {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(Default)]
16
pub(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
33
impl 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
}
103
104