Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_gltf/src/loader/gltf_ext/texture.rs
9418 views
1
use bevy_image::{ImageAddressMode, ImageFilterMode, ImageSamplerDescriptor};
2
use bevy_math::Affine2;
3
4
use gltf::texture::{MagFilter, MinFilter, Texture, TextureTransform, WrappingMode};
5
6
/// Extracts the texture sampler data from the glTF [`Texture`].
7
pub(crate) fn texture_sampler(
8
texture: &Texture<'_>,
9
default_sampler: &ImageSamplerDescriptor,
10
) -> ImageSamplerDescriptor {
11
let gltf_sampler = texture.sampler();
12
let mut sampler = default_sampler.clone();
13
14
sampler.address_mode_u = address_mode(&gltf_sampler.wrap_s());
15
sampler.address_mode_v = address_mode(&gltf_sampler.wrap_t());
16
17
// Shouldn't parse filters when anisotropic filtering is on, because trilinear is then required by wgpu.
18
// We also trust user to have provided a valid sampler.
19
if sampler.anisotropy_clamp == 1 {
20
if let Some(mag_filter) = gltf_sampler.mag_filter().map(|mf| match mf {
21
MagFilter::Nearest => ImageFilterMode::Nearest,
22
MagFilter::Linear => ImageFilterMode::Linear,
23
}) {
24
sampler.mag_filter = mag_filter;
25
}
26
if let Some(min_filter) = gltf_sampler.min_filter().map(|mf| match mf {
27
MinFilter::Nearest
28
| MinFilter::NearestMipmapNearest
29
| MinFilter::NearestMipmapLinear => ImageFilterMode::Nearest,
30
MinFilter::Linear | MinFilter::LinearMipmapNearest | MinFilter::LinearMipmapLinear => {
31
ImageFilterMode::Linear
32
}
33
}) {
34
sampler.min_filter = min_filter;
35
}
36
if let Some(mipmap_filter) = gltf_sampler.min_filter().map(|mf| match mf {
37
MinFilter::Nearest
38
| MinFilter::Linear
39
| MinFilter::NearestMipmapNearest
40
| MinFilter::LinearMipmapNearest => ImageFilterMode::Nearest,
41
MinFilter::NearestMipmapLinear | MinFilter::LinearMipmapLinear => {
42
ImageFilterMode::Linear
43
}
44
}) {
45
sampler.mipmap_filter = mipmap_filter;
46
}
47
}
48
sampler
49
}
50
51
pub(crate) fn address_mode(wrapping_mode: &WrappingMode) -> ImageAddressMode {
52
match wrapping_mode {
53
WrappingMode::ClampToEdge => ImageAddressMode::ClampToEdge,
54
WrappingMode::Repeat => ImageAddressMode::Repeat,
55
WrappingMode::MirroredRepeat => ImageAddressMode::MirrorRepeat,
56
}
57
}
58
59
pub(crate) fn texture_transform_to_affine2(texture_transform: TextureTransform) -> Affine2 {
60
Affine2::from_scale_angle_translation(
61
texture_transform.scale().into(),
62
-texture_transform.rotation(),
63
texture_transform.offset().into(),
64
)
65
}
66
67