Path: blob/main/crates/bevy_gltf/src/loader/extensions/khr_materials_clearcoat.rs
9500 views
use bevy_asset::{AssetPath, Handle};1use bevy_image::Image;23use gltf::Material;45use serde_json::Value;67#[cfg(feature = "pbr_multi_layer_material_textures")]8use {crate::loader::gltf_ext::material::parse_material_extension_texture, bevy_mesh::UvChannel};910/// Parsed data from the `KHR_materials_clearcoat` extension.11///12/// See the specification:13/// <https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md>14#[derive(Default)]15pub(crate) struct ClearcoatExtension {16pub(crate) clearcoat_factor: Option<f64>,17#[cfg(feature = "pbr_multi_layer_material_textures")]18pub(crate) clearcoat_channel: UvChannel,19#[cfg(feature = "pbr_multi_layer_material_textures")]20pub(crate) clearcoat_texture: Option<Handle<Image>>,21pub(crate) clearcoat_roughness_factor: Option<f64>,22#[cfg(feature = "pbr_multi_layer_material_textures")]23pub(crate) clearcoat_roughness_channel: UvChannel,24#[cfg(feature = "pbr_multi_layer_material_textures")]25pub(crate) clearcoat_roughness_texture: Option<Handle<Image>>,26#[cfg(feature = "pbr_multi_layer_material_textures")]27pub(crate) clearcoat_normal_channel: UvChannel,28#[cfg(feature = "pbr_multi_layer_material_textures")]29pub(crate) clearcoat_normal_texture: Option<Handle<Image>>,30}3132impl ClearcoatExtension {33#[expect(34clippy::allow_attributes,35reason = "`unused_variables` is not always linted"36)]37#[allow(38unused_variables,39reason = "Depending on what features are used to compile this crate, certain parameters may end up unused."40)]41pub(crate) fn parse(42material: &Material,43textures: &[Handle<Image>],44asset_path: AssetPath<'_>,45) -> Option<ClearcoatExtension> {46let extension = material47.extensions()?48.get("KHR_materials_clearcoat")?49.as_object()?;5051#[cfg(feature = "pbr_multi_layer_material_textures")]52let (clearcoat_channel, clearcoat_texture) = parse_material_extension_texture(53material,54extension,55"clearcoatTexture",56"clearcoat",57textures,58asset_path.clone(),59);6061#[cfg(feature = "pbr_multi_layer_material_textures")]62let (clearcoat_roughness_channel, clearcoat_roughness_texture) =63parse_material_extension_texture(64material,65extension,66"clearcoatRoughnessTexture",67"clearcoat roughness",68textures,69asset_path.clone(),70);7172#[cfg(feature = "pbr_multi_layer_material_textures")]73let (clearcoat_normal_channel, clearcoat_normal_texture) = parse_material_extension_texture(74material,75extension,76"clearcoatNormalTexture",77"clearcoat normal",78textures,79asset_path,80);8182Some(ClearcoatExtension {83clearcoat_factor: extension.get("clearcoatFactor").and_then(Value::as_f64),84clearcoat_roughness_factor: extension85.get("clearcoatRoughnessFactor")86.and_then(Value::as_f64),87#[cfg(feature = "pbr_multi_layer_material_textures")]88clearcoat_channel,89#[cfg(feature = "pbr_multi_layer_material_textures")]90clearcoat_texture,91#[cfg(feature = "pbr_multi_layer_material_textures")]92clearcoat_roughness_channel,93#[cfg(feature = "pbr_multi_layer_material_textures")]94clearcoat_roughness_texture,95#[cfg(feature = "pbr_multi_layer_material_textures")]96clearcoat_normal_channel,97#[cfg(feature = "pbr_multi_layer_material_textures")]98clearcoat_normal_texture,99})100}101}102103104