1
1
use crate :: { ParseFieldError , TextureAtlasAttribute } ;
2
2
use proc_macro2:: { Ident , TokenStream } ;
3
3
use quote:: quote;
4
+ use syn:: { spanned:: Spanned , Lit , LitStr } ;
4
5
5
6
#[ derive( PartialEq , Debug ) ]
6
7
pub ( crate ) struct TextureAtlasLayoutAssetField {
@@ -16,12 +17,12 @@ pub(crate) struct TextureAtlasLayoutAssetField {
16
17
}
17
18
18
19
#[ derive( Debug , PartialEq , Eq , Clone , Copy ) ]
19
- pub ( crate ) enum SamplerType {
20
+ pub ( crate ) enum FilterType {
20
21
Linear ,
21
22
Nearest ,
22
23
}
23
24
24
- impl TryFrom < String > for SamplerType {
25
+ impl TryFrom < String > for FilterType {
25
26
type Error = & ' static str ;
26
27
fn try_from ( value : String ) -> Result < Self , Self :: Error > {
27
28
match value. as_str ( ) {
@@ -32,11 +33,20 @@ impl TryFrom<String> for SamplerType {
32
33
}
33
34
}
34
35
36
+ #[ derive( Debug , PartialEq , Eq , Clone , Copy , Default ) ]
37
+ pub ( crate ) enum WrapMode {
38
+ #[ default]
39
+ Clamp ,
40
+ #[ allow( dead_code) ]
41
+ Repeat ,
42
+ }
43
+
35
44
#[ derive( PartialEq , Debug ) ]
36
45
pub ( crate ) struct ImageAssetField {
37
46
pub field_ident : Ident ,
38
47
pub asset_path : String ,
39
- pub sampler : Option < SamplerType > ,
48
+ pub filter : Option < FilterType > ,
49
+ pub wrap : Option < WrapMode > ,
40
50
pub array_texture_layers : Option < u32 > ,
41
51
}
42
52
@@ -124,18 +134,19 @@ impl AssetField {
124
134
let field_ident = image. field_ident . clone ( ) ;
125
135
let asset_path = image. asset_path . clone ( ) ;
126
136
let layers = image. array_texture_layers . unwrap_or_default ( ) ;
127
- let sampler = match image. sampler {
128
- Some ( SamplerType :: Linear ) | None => quote ! ( ImageSampler :: linear ( ) ) ,
129
- Some ( SamplerType :: Nearest ) => quote ! ( ImageSampler :: nearest ( ) ) ,
137
+ let filter = match image. filter {
138
+ Some ( FilterType :: Linear ) | None => quote ! ( ImageFilterMode :: Linear ) ,
139
+ Some ( FilterType :: Nearest ) => quote ! ( ImageFilterMode :: Nearest ) ,
130
140
} ;
131
- let descriptor = match image. sampler {
132
- Some ( SamplerType :: Linear ) | None => quote ! ( ImageSamplerDescriptor :: linear ( ) ) ,
133
- Some ( SamplerType :: Nearest ) => quote ! ( ImageSamplerDescriptor :: nearest ( ) ) ,
141
+ let wrap = match image. wrap {
142
+ Some ( WrapMode :: Clamp ) | None => quote ! ( ImageAddressMode :: ClampToEdge ) ,
143
+ Some ( WrapMode :: Repeat ) => quote ! ( ImageAddressMode :: Repeat ) ,
134
144
} ;
135
- let is_sampler_set = image. sampler . is_some ( ) ;
145
+ let is_sampler_set = image. filter . is_some ( ) || image. wrap . is_some ( ) ;
146
+ let label = Lit :: Str ( LitStr :: new ( & field_ident. to_string ( ) , token_stream. span ( ) ) ) ;
136
147
137
148
quote ! ( #token_stream #field_ident : {
138
- use bevy:: render:: texture:: { ImageSampler , ImageSamplerDescriptor } ;
149
+ use bevy:: render:: texture:: { ImageAddressMode , ImageFilterMode , ImageSampler , ImageSamplerDescriptor } ;
139
150
let mut system_state = :: bevy:: ecs:: system:: SystemState :: <(
140
151
ResMut <:: bevy:: prelude:: Assets <:: bevy:: prelude:: Image >>,
141
152
Res <:: bevy:: prelude:: AssetServer >,
@@ -149,19 +160,30 @@ impl AssetField {
149
160
image. reinterpret_stacked_2d_as_array( #layers) ;
150
161
}
151
162
163
+ let this_descriptor = ImageSamplerDescriptor {
164
+ label: Some ( #label. to_string( ) ) ,
165
+ address_mode_u: #wrap,
166
+ address_mode_v: #wrap,
167
+ address_mode_w: #wrap,
168
+ mag_filter: #filter,
169
+ min_filter: #filter,
170
+ mipmap_filter: #filter,
171
+ ..:: std:: default :: Default :: default ( )
172
+ } ;
173
+
152
174
if ( #is_sampler_set) {
153
175
let is_different_sampler = if let ImageSampler :: Descriptor ( descriptor) = & image. sampler {
154
- !descriptor. as_wgpu( ) . eq( & #descriptor . as_wgpu( ) )
176
+ !descriptor. as_wgpu( ) . eq( & this_descriptor . as_wgpu( ) )
155
177
} else {
156
- false
178
+ true
157
179
} ;
158
180
159
181
if is_different_sampler {
160
182
let mut cloned_image = image. clone( ) ;
161
- cloned_image. sampler = #sampler ;
183
+ cloned_image. sampler = ImageSampler :: Descriptor ( this_descriptor ) ;
162
184
handle = images. add( cloned_image) ;
163
185
} else {
164
- image. sampler = #sampler ;
186
+ image. sampler = ImageSampler :: Default ;
165
187
}
166
188
}
167
189
@@ -539,7 +561,8 @@ pub(crate) struct AssetBuilder {
539
561
pub padding_y : Option < u32 > ,
540
562
pub offset_x : Option < u32 > ,
541
563
pub offset_y : Option < u32 > ,
542
- pub sampler : Option < SamplerType > ,
564
+ pub filter : Option < FilterType > ,
565
+ pub wrap : Option < WrapMode > ,
543
566
pub array_texture_layers : Option < u32 > ,
544
567
}
545
568
@@ -665,11 +688,12 @@ impl AssetBuilder {
665
688
self . is_mapped . into ( ) ,
666
689
) ) ;
667
690
}
668
- if self . sampler . is_some ( ) || self . array_texture_layers . is_some ( ) {
691
+ if self . filter . is_some ( ) || self . array_texture_layers . is_some ( ) {
669
692
return Ok ( AssetField :: Image ( ImageAssetField {
670
693
field_ident : self . field_ident . unwrap ( ) ,
671
694
asset_path : self . asset_path . unwrap ( ) ,
672
- sampler : self . sampler ,
695
+ filter : self . filter ,
696
+ wrap : self . wrap ,
673
697
array_texture_layers : self . array_texture_layers ,
674
698
} ) ) ;
675
699
}
@@ -929,14 +953,16 @@ mod test {
929
953
let builder_linear = AssetBuilder {
930
954
field_ident : Some ( Ident :: new ( "test" , Span :: call_site ( ) ) ) ,
931
955
asset_path : Some ( "some/image.png" . to_owned ( ) ) ,
932
- sampler : Some ( SamplerType :: Linear ) ,
956
+ filter : Some ( FilterType :: Linear ) ,
957
+ wrap : None ,
933
958
..Default :: default ( )
934
959
} ;
935
960
936
961
let builder_nearest = AssetBuilder {
937
962
field_ident : Some ( Ident :: new ( "test" , Span :: call_site ( ) ) ) ,
938
963
asset_path : Some ( "some/image.png" . to_owned ( ) ) ,
939
- sampler : Some ( SamplerType :: Nearest ) ,
964
+ filter : Some ( FilterType :: Nearest ) ,
965
+ wrap : None ,
940
966
..Default :: default ( )
941
967
} ;
942
968
@@ -960,7 +986,8 @@ mod test {
960
986
AssetField :: Image ( ImageAssetField {
961
987
field_ident: Ident :: new( "test" , Span :: call_site( ) ) ,
962
988
asset_path: "some/image.png" . to_owned( ) ,
963
- sampler: Some ( SamplerType :: Linear ) ,
989
+ filter: Some ( FilterType :: Linear ) ,
990
+ wrap: None ,
964
991
array_texture_layers: None
965
992
} )
966
993
) ;
@@ -969,7 +996,8 @@ mod test {
969
996
AssetField :: Image ( ImageAssetField {
970
997
field_ident: Ident :: new( "test" , Span :: call_site( ) ) ,
971
998
asset_path: "some/image.png" . to_owned( ) ,
972
- sampler: Some ( SamplerType :: Nearest ) ,
999
+ filter: Some ( FilterType :: Nearest ) ,
1000
+ wrap: None ,
973
1001
array_texture_layers: None
974
1002
} )
975
1003
) ;
@@ -978,7 +1006,8 @@ mod test {
978
1006
AssetField :: Image ( ImageAssetField {
979
1007
field_ident: Ident :: new( "test" , Span :: call_site( ) ) ,
980
1008
asset_path: "some/image.png" . to_owned( ) ,
981
- sampler: None ,
1009
+ filter: None ,
1010
+ wrap: None ,
982
1011
array_texture_layers: Some ( 42 )
983
1012
} )
984
1013
) ;
0 commit comments