@@ -22,9 +22,10 @@ use bevy_render::{
22
22
} ,
23
23
prelude:: SpatialBundle ,
24
24
primitives:: Aabb ,
25
- render_resource:: { AddressMode , Face , FilterMode , PrimitiveTopology , SamplerDescriptor } ,
25
+ render_resource:: { Face , PrimitiveTopology } ,
26
26
texture:: {
27
- CompressedImageFormats , Image , ImageLoaderSettings , ImageSampler , ImageType , TextureError ,
27
+ CompressedImageFormats , Image , ImageAddressMode , ImageFilterMode , ImageLoaderSettings ,
28
+ ImageSampler , ImageSamplerDescriptor , ImageType , TextureError ,
28
29
} ,
29
30
} ;
30
31
use bevy_scene:: Scene ;
@@ -256,9 +257,14 @@ async fn load_gltf<'a, 'b, 'c>(
256
257
) {
257
258
let handle = match texture {
258
259
ImageOrPath :: Image { label, image } => load_context. add_labeled_asset ( label, image) ,
259
- ImageOrPath :: Path { path, is_srgb } => {
260
+ ImageOrPath :: Path {
261
+ path,
262
+ is_srgb,
263
+ sampler_descriptor,
264
+ } => {
260
265
load_context. load_with_settings ( path, move |settings : & mut ImageLoaderSettings | {
261
266
settings. is_srgb = is_srgb;
267
+ settings. sampler_descriptor = sampler_descriptor;
262
268
} )
263
269
}
264
270
} ;
@@ -667,18 +673,19 @@ async fn load_image<'a, 'b>(
667
673
supported_compressed_formats : CompressedImageFormats ,
668
674
) -> Result < ImageOrPath , GltfError > {
669
675
let is_srgb = !linear_textures. contains ( & gltf_texture. index ( ) ) ;
676
+ let sampler_descriptor = texture_sampler ( & gltf_texture) ;
670
677
match gltf_texture. source ( ) . source ( ) {
671
678
gltf:: image:: Source :: View { view, mime_type } => {
672
679
let start = view. offset ( ) ;
673
680
let end = view. offset ( ) + view. length ( ) ;
674
681
let buffer = & buffer_data[ view. buffer ( ) . index ( ) ] [ start..end] ;
675
- let mut image = Image :: from_buffer (
682
+ let image = Image :: from_buffer (
676
683
buffer,
677
684
ImageType :: MimeType ( mime_type) ,
678
685
supported_compressed_formats,
679
686
is_srgb,
687
+ ImageSampler :: Descriptor ( sampler_descriptor. into ( ) ) ,
680
688
) ?;
681
- image. sampler_descriptor = ImageSampler :: Descriptor ( texture_sampler ( & gltf_texture) ) ;
682
689
Ok ( ImageOrPath :: Image {
683
690
image,
684
691
label : texture_label ( & gltf_texture) ,
@@ -698,6 +705,7 @@ async fn load_image<'a, 'b>(
698
705
mime_type. map ( ImageType :: MimeType ) . unwrap_or ( image_type) ,
699
706
supported_compressed_formats,
700
707
is_srgb,
708
+ ImageSampler :: Descriptor ( sampler_descriptor. into ( ) ) ,
701
709
) ?,
702
710
label : texture_label ( & gltf_texture) ,
703
711
} )
@@ -706,6 +714,7 @@ async fn load_image<'a, 'b>(
706
714
Ok ( ImageOrPath :: Path {
707
715
path : image_path,
708
716
is_srgb,
717
+ sampler_descriptor,
709
718
} )
710
719
}
711
720
}
@@ -1110,56 +1119,56 @@ fn skin_label(skin: &gltf::Skin) -> String {
1110
1119
}
1111
1120
1112
1121
/// Extracts the texture sampler data from the glTF texture.
1113
- fn texture_sampler < ' a > ( texture : & gltf:: Texture ) -> SamplerDescriptor < ' a > {
1122
+ fn texture_sampler ( texture : & gltf:: Texture ) -> ImageSamplerDescriptor {
1114
1123
let gltf_sampler = texture. sampler ( ) ;
1115
1124
1116
- SamplerDescriptor {
1125
+ ImageSamplerDescriptor {
1117
1126
address_mode_u : texture_address_mode ( & gltf_sampler. wrap_s ( ) ) ,
1118
1127
address_mode_v : texture_address_mode ( & gltf_sampler. wrap_t ( ) ) ,
1119
1128
1120
1129
mag_filter : gltf_sampler
1121
1130
. mag_filter ( )
1122
1131
. map ( |mf| match mf {
1123
- MagFilter :: Nearest => FilterMode :: Nearest ,
1124
- MagFilter :: Linear => FilterMode :: Linear ,
1132
+ MagFilter :: Nearest => ImageFilterMode :: Nearest ,
1133
+ MagFilter :: Linear => ImageFilterMode :: Linear ,
1125
1134
} )
1126
- . unwrap_or ( SamplerDescriptor :: default ( ) . mag_filter ) ,
1135
+ . unwrap_or ( ImageSamplerDescriptor :: default ( ) . mag_filter ) ,
1127
1136
1128
1137
min_filter : gltf_sampler
1129
1138
. min_filter ( )
1130
1139
. map ( |mf| match mf {
1131
1140
MinFilter :: Nearest
1132
1141
| MinFilter :: NearestMipmapNearest
1133
- | MinFilter :: NearestMipmapLinear => FilterMode :: Nearest ,
1142
+ | MinFilter :: NearestMipmapLinear => ImageFilterMode :: Nearest ,
1134
1143
MinFilter :: Linear
1135
1144
| MinFilter :: LinearMipmapNearest
1136
- | MinFilter :: LinearMipmapLinear => FilterMode :: Linear ,
1145
+ | MinFilter :: LinearMipmapLinear => ImageFilterMode :: Linear ,
1137
1146
} )
1138
- . unwrap_or ( SamplerDescriptor :: default ( ) . min_filter ) ,
1147
+ . unwrap_or ( ImageSamplerDescriptor :: default ( ) . min_filter ) ,
1139
1148
1140
1149
mipmap_filter : gltf_sampler
1141
1150
. min_filter ( )
1142
1151
. map ( |mf| match mf {
1143
1152
MinFilter :: Nearest
1144
1153
| MinFilter :: Linear
1145
1154
| MinFilter :: NearestMipmapNearest
1146
- | MinFilter :: LinearMipmapNearest => FilterMode :: Nearest ,
1155
+ | MinFilter :: LinearMipmapNearest => ImageFilterMode :: Nearest ,
1147
1156
MinFilter :: NearestMipmapLinear | MinFilter :: LinearMipmapLinear => {
1148
- FilterMode :: Linear
1157
+ ImageFilterMode :: Linear
1149
1158
}
1150
1159
} )
1151
- . unwrap_or ( SamplerDescriptor :: default ( ) . mipmap_filter ) ,
1160
+ . unwrap_or ( ImageSamplerDescriptor :: default ( ) . mipmap_filter ) ,
1152
1161
1153
1162
..Default :: default ( )
1154
1163
}
1155
1164
}
1156
1165
1157
1166
/// Maps the texture address mode form glTF to wgpu.
1158
- fn texture_address_mode ( gltf_address_mode : & gltf:: texture:: WrappingMode ) -> AddressMode {
1167
+ fn texture_address_mode ( gltf_address_mode : & gltf:: texture:: WrappingMode ) -> ImageAddressMode {
1159
1168
match gltf_address_mode {
1160
- WrappingMode :: ClampToEdge => AddressMode :: ClampToEdge ,
1161
- WrappingMode :: Repeat => AddressMode :: Repeat ,
1162
- WrappingMode :: MirroredRepeat => AddressMode :: MirrorRepeat ,
1169
+ WrappingMode :: ClampToEdge => ImageAddressMode :: ClampToEdge ,
1170
+ WrappingMode :: Repeat => ImageAddressMode :: Repeat ,
1171
+ WrappingMode :: MirroredRepeat => ImageAddressMode :: MirrorRepeat ,
1163
1172
}
1164
1173
}
1165
1174
@@ -1280,8 +1289,15 @@ fn resolve_node_hierarchy(
1280
1289
}
1281
1290
1282
1291
enum ImageOrPath {
1283
- Image { image : Image , label : String } ,
1284
- Path { path : PathBuf , is_srgb : bool } ,
1292
+ Image {
1293
+ image : Image ,
1294
+ label : String ,
1295
+ } ,
1296
+ Path {
1297
+ path : PathBuf ,
1298
+ is_srgb : bool ,
1299
+ sampler_descriptor : ImageSamplerDescriptor ,
1300
+ } ,
1285
1301
}
1286
1302
1287
1303
struct DataUri < ' a > {
0 commit comments