1+ use crate :: ImageLoader ;
2+
13#[ cfg( feature = "basis-universal" ) ]
24use super :: basis:: * ;
35#[ cfg( feature = "dds" ) ]
46use super :: dds:: * ;
57#[ cfg( feature = "ktx2" ) ]
68use super :: ktx2:: * ;
9+ use bevy_app:: { App , Plugin } ;
710#[ cfg( not( feature = "bevy_reflect" ) ) ]
811use bevy_reflect:: TypePath ;
912#[ cfg( feature = "bevy_reflect" ) ]
1013use bevy_reflect:: { std_traits:: ReflectDefault , Reflect } ;
1114
12- use bevy_asset:: { Asset , RenderAssetUsages } ;
15+ use bevy_asset:: { uuid_handle , Asset , AssetApp , Assets , Handle , RenderAssetUsages } ;
1316use bevy_color:: { Color , ColorToComponents , Gray , LinearRgba , Srgba , Xyza } ;
1417use bevy_ecs:: resource:: Resource ;
1518use bevy_math:: { AspectRatio , UVec2 , UVec3 , Vec2 } ;
@@ -35,6 +38,84 @@ impl BevyDefault for TextureFormat {
3538 }
3639}
3740
41+ /// A handle to a 1 x 1 transparent white image.
42+ ///
43+ /// Like [`Handle<Image>::default`], this is a handle to a fallback image asset.
44+ /// While that handle points to an opaque white 1 x 1 image, this handle points to a transparent 1 x 1 white image.
45+ // Number randomly selected by fair WolframAlpha query. Totally arbitrary.
46+ pub const TRANSPARENT_IMAGE_HANDLE : Handle < Image > =
47+ uuid_handle ! ( "d18ad97e-a322-4981-9505-44c59a4b5e46" ) ;
48+
49+ /// Adds the [`Image`] as an asset and makes sure that they are extracted and prepared for the GPU.
50+ pub struct ImagePlugin {
51+ /// The default image sampler to use when [`ImageSampler`] is set to `Default`.
52+ pub default_sampler : ImageSamplerDescriptor ,
53+ }
54+
55+ impl Default for ImagePlugin {
56+ fn default ( ) -> Self {
57+ ImagePlugin :: default_linear ( )
58+ }
59+ }
60+
61+ impl ImagePlugin {
62+ /// Creates image settings with linear sampling by default.
63+ pub fn default_linear ( ) -> ImagePlugin {
64+ ImagePlugin {
65+ default_sampler : ImageSamplerDescriptor :: linear ( ) ,
66+ }
67+ }
68+
69+ /// Creates image settings with nearest sampling by default.
70+ pub fn default_nearest ( ) -> ImagePlugin {
71+ ImagePlugin {
72+ default_sampler : ImageSamplerDescriptor :: nearest ( ) ,
73+ }
74+ }
75+ }
76+
77+ impl Plugin for ImagePlugin {
78+ fn build ( & self , app : & mut App ) {
79+ #[ cfg( feature = "exr" ) ]
80+ app. init_asset_loader :: < crate :: ExrTextureLoader > ( ) ;
81+
82+ #[ cfg( feature = "hdr" ) ]
83+ app. init_asset_loader :: < crate :: HdrTextureLoader > ( ) ;
84+
85+ app. init_asset :: < Image > ( ) ;
86+ #[ cfg( feature = "bevy_reflect" ) ]
87+ app. register_asset_reflect :: < Image > ( ) ;
88+
89+ let mut image_assets = app. world_mut ( ) . resource_mut :: < Assets < Image > > ( ) ;
90+
91+ image_assets
92+ . insert ( & Handle :: default ( ) , Image :: default ( ) )
93+ . unwrap ( ) ;
94+ image_assets
95+ . insert ( & TRANSPARENT_IMAGE_HANDLE , Image :: transparent ( ) )
96+ . unwrap ( ) ;
97+
98+ #[ cfg( feature = "compressed_image_saver" ) ]
99+ if let Some ( processor) = app
100+ . world ( )
101+ . get_resource :: < bevy_asset:: processor:: AssetProcessor > ( )
102+ {
103+ processor. register_processor :: < bevy_asset:: processor:: LoadTransformAndSave <
104+ ImageLoader ,
105+ bevy_asset:: transformer:: IdentityAssetTransformer < Image > ,
106+ crate :: CompressedImageSaver ,
107+ > > ( crate :: CompressedImageSaver . into ( ) ) ;
108+ processor. set_default_processor :: < bevy_asset:: processor:: LoadTransformAndSave <
109+ ImageLoader ,
110+ bevy_asset:: transformer:: IdentityAssetTransformer < Image > ,
111+ crate :: CompressedImageSaver ,
112+ > > ( "png" ) ;
113+ }
114+
115+ app. preregister_asset_loader :: < ImageLoader > ( ImageLoader :: SUPPORTED_FILE_EXTENSIONS ) ;
116+ }
117+ }
118+
38119pub const TEXTURE_ASSET_INDEX : u64 = 0 ;
39120pub const SAMPLER_ASSET_INDEX : u64 = 1 ;
40121
0 commit comments