@@ -7,14 +7,18 @@ use bevy_render::{
7
7
mesh:: { Indices , Mesh , VertexAttribute } ,
8
8
pipeline:: PrimitiveTopology ,
9
9
prelude:: { Color , Texture } ,
10
- texture:: TextureFormat ,
10
+ texture:: { AddressMode , FilterMode , SamplerDescriptor , TextureFormat } ,
11
11
} ;
12
12
use bevy_scene:: Scene ;
13
13
use bevy_transform:: {
14
14
hierarchy:: { BuildWorldChildren , WorldChildBuilder } ,
15
15
prelude:: { GlobalTransform , Transform } ,
16
16
} ;
17
- use gltf:: { mesh:: Mode , Primitive } ;
17
+ use gltf:: {
18
+ mesh:: Mode ,
19
+ texture:: { MagFilter , MinFilter , WrappingMode } ,
20
+ Primitive ,
21
+ } ;
18
22
use image:: { GenericImageView , ImageFormat } ;
19
23
use std:: path:: Path ;
20
24
use thiserror:: Error ;
@@ -24,6 +28,8 @@ use thiserror::Error;
24
28
pub enum GltfError {
25
29
#[ error( "Unsupported primitive mode." ) ]
26
30
UnsupportedPrimitive { mode : Mode } ,
31
+ #[ error( "Unsupported min filter." ) ]
32
+ UnsupportedMinFilter { filter : MinFilter } ,
27
33
#[ error( "Invalid GLTF file." ) ]
28
34
Gltf ( #[ from] gltf:: Error ) ,
29
35
#[ error( "Binary blob is missing." ) ]
@@ -133,6 +139,7 @@ async fn load_gltf<'a, 'b>(
133
139
data : image. clone ( ) . into_vec ( ) ,
134
140
size : bevy_math:: f32:: vec2 ( size. 0 as f32 , size. 1 as f32 ) ,
135
141
format : TextureFormat :: Rgba8Unorm ,
142
+ sampler : texture_sampler ( & texture) ?,
136
143
} ) ,
137
144
) ;
138
145
}
@@ -263,6 +270,43 @@ fn texture_label(texture: &gltf::Texture) -> String {
263
270
format ! ( "Texture{}" , texture. index( ) )
264
271
}
265
272
273
+ fn texture_sampler ( texture : & gltf:: Texture ) -> Result < SamplerDescriptor , GltfError > {
274
+ let gltf_sampler = texture. sampler ( ) ;
275
+
276
+ Ok ( SamplerDescriptor {
277
+ address_mode_u : texture_address_mode ( & gltf_sampler. wrap_s ( ) ) ,
278
+ address_mode_v : texture_address_mode ( & gltf_sampler. wrap_t ( ) ) ,
279
+
280
+ mag_filter : gltf_sampler
281
+ . mag_filter ( )
282
+ . map ( |mf| match mf {
283
+ MagFilter :: Nearest => FilterMode :: Nearest ,
284
+ MagFilter :: Linear => FilterMode :: Linear ,
285
+ } )
286
+ . unwrap_or ( SamplerDescriptor :: default ( ) . mag_filter ) ,
287
+
288
+ min_filter : gltf_sampler
289
+ . min_filter ( )
290
+ . map ( |mf| match mf {
291
+ MinFilter :: Nearest => Ok ( FilterMode :: Nearest ) ,
292
+ MinFilter :: Linear => Ok ( FilterMode :: Linear ) ,
293
+ filter => Err ( GltfError :: UnsupportedMinFilter { filter } ) ,
294
+ } )
295
+ . transpose ( ) ?
296
+ . unwrap_or ( SamplerDescriptor :: default ( ) . min_filter ) ,
297
+
298
+ ..Default :: default ( )
299
+ } )
300
+ }
301
+
302
+ fn texture_address_mode ( gltf_address_mode : & gltf:: texture:: WrappingMode ) -> AddressMode {
303
+ match gltf_address_mode {
304
+ WrappingMode :: ClampToEdge => AddressMode :: ClampToEdge ,
305
+ WrappingMode :: Repeat => AddressMode :: Repeat ,
306
+ WrappingMode :: MirroredRepeat => AddressMode :: MirrorRepeat ,
307
+ }
308
+ }
309
+
266
310
fn get_primitive_topology ( mode : Mode ) -> Result < PrimitiveTopology , GltfError > {
267
311
match mode {
268
312
Mode :: Points => Ok ( PrimitiveTopology :: PointList ) ,
0 commit comments