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
6598 views
1
use bevy_asset::LoadContext;
2
3
use gltf::{Document, Material};
4
5
use serde_json::Value;
6
7
#[cfg(feature = "pbr_multi_layer_material_textures")]
8
use {
9
crate::loader::gltf_ext::material::parse_material_extension_texture, bevy_asset::Handle,
10
bevy_image::Image, bevy_pbr::UvChannel,
11
};
12
13
/// Parsed data from the `KHR_materials_clearcoat` extension.
14
///
15
/// See the specification:
16
/// <https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md>
17
#[derive(Default)]
18
pub(crate) struct ClearcoatExtension {
19
pub(crate) clearcoat_factor: Option<f64>,
20
#[cfg(feature = "pbr_multi_layer_material_textures")]
21
pub(crate) clearcoat_channel: UvChannel,
22
#[cfg(feature = "pbr_multi_layer_material_textures")]
23
pub(crate) clearcoat_texture: Option<Handle<Image>>,
24
pub(crate) clearcoat_roughness_factor: Option<f64>,
25
#[cfg(feature = "pbr_multi_layer_material_textures")]
26
pub(crate) clearcoat_roughness_channel: UvChannel,
27
#[cfg(feature = "pbr_multi_layer_material_textures")]
28
pub(crate) clearcoat_roughness_texture: Option<Handle<Image>>,
29
#[cfg(feature = "pbr_multi_layer_material_textures")]
30
pub(crate) clearcoat_normal_channel: UvChannel,
31
#[cfg(feature = "pbr_multi_layer_material_textures")]
32
pub(crate) clearcoat_normal_texture: Option<Handle<Image>>,
33
}
34
35
impl ClearcoatExtension {
36
#[expect(
37
clippy::allow_attributes,
38
reason = "`unused_variables` is not always linted"
39
)]
40
#[allow(
41
unused_variables,
42
reason = "Depending on what features are used to compile this crate, certain parameters may end up unused."
43
)]
44
pub(crate) fn parse(
45
load_context: &mut LoadContext,
46
document: &Document,
47
material: &Material,
48
) -> Option<ClearcoatExtension> {
49
let extension = material
50
.extensions()?
51
.get("KHR_materials_clearcoat")?
52
.as_object()?;
53
54
#[cfg(feature = "pbr_multi_layer_material_textures")]
55
let (clearcoat_channel, clearcoat_texture) = parse_material_extension_texture(
56
material,
57
load_context,
58
document,
59
extension,
60
"clearcoatTexture",
61
"clearcoat",
62
);
63
64
#[cfg(feature = "pbr_multi_layer_material_textures")]
65
let (clearcoat_roughness_channel, clearcoat_roughness_texture) =
66
parse_material_extension_texture(
67
material,
68
load_context,
69
document,
70
extension,
71
"clearcoatRoughnessTexture",
72
"clearcoat roughness",
73
);
74
75
#[cfg(feature = "pbr_multi_layer_material_textures")]
76
let (clearcoat_normal_channel, clearcoat_normal_texture) = parse_material_extension_texture(
77
material,
78
load_context,
79
document,
80
extension,
81
"clearcoatNormalTexture",
82
"clearcoat normal",
83
);
84
85
Some(ClearcoatExtension {
86
clearcoat_factor: extension.get("clearcoatFactor").and_then(Value::as_f64),
87
clearcoat_roughness_factor: extension
88
.get("clearcoatRoughnessFactor")
89
.and_then(Value::as_f64),
90
#[cfg(feature = "pbr_multi_layer_material_textures")]
91
clearcoat_channel,
92
#[cfg(feature = "pbr_multi_layer_material_textures")]
93
clearcoat_texture,
94
#[cfg(feature = "pbr_multi_layer_material_textures")]
95
clearcoat_roughness_channel,
96
#[cfg(feature = "pbr_multi_layer_material_textures")]
97
clearcoat_roughness_texture,
98
#[cfg(feature = "pbr_multi_layer_material_textures")]
99
clearcoat_normal_channel,
100
#[cfg(feature = "pbr_multi_layer_material_textures")]
101
clearcoat_normal_texture,
102
})
103
}
104
}
105
106