#[cfg(feature = "basis-universal")] mod basis; #[cfg(feature = "basis-universal")] mod compressed_image_saver; #[cfg(feature = "dds")] mod dds; #[cfg(feature = "exr")] mod exr_texture_loader; mod fallback_image; #[cfg(feature = "hdr")] mod hdr_texture_loader; #[allow(clippy::module_inception)] mod image; mod image_loader; #[cfg(feature = "ktx2")] mod ktx2; mod texture_cache; pub(crate) mod image_texture_conversion; pub use self::image::*; #[cfg(feature = "ktx2")] pub use self::ktx2::*; #[cfg(feature = "dds")] pub use dds::*; #[cfg(feature = "exr")] pub use exr_texture_loader::*; #[cfg(feature = "hdr")] pub use hdr_texture_loader::*; #[cfg(feature = "basis-universal")] pub use compressed_image_saver::*; pub use fallback_image::*; pub use image_loader::*; pub use texture_cache::*; use crate::{ render_asset::RenderAssetPlugin, renderer::RenderDevice, Render, RenderApp, RenderSet, }; use bevy_app::{App, Plugin}; use bevy_asset::{AssetApp, Assets, Handle}; use bevy_ecs::prelude::*; // TODO: replace Texture names with Image names? /// Adds the [`Image`] as an asset and makes sure that they are extracted and prepared for the GPU. pub struct ImagePlugin { /// The default image sampler to use when [`ImageSampler`] is set to `Default`. pub default_sampler: wgpu::SamplerDescriptor<'static>, } impl Default for ImagePlugin { fn default() -> Self { ImagePlugin::default_linear() } } impl ImagePlugin { /// Creates image settings with linear sampling by default. pub fn default_linear() -> ImagePlugin { ImagePlugin { default_sampler: ImageSampler::linear_descriptor(), } } /// Creates image settings with nearest sampling by default. pub fn default_nearest() -> ImagePlugin { ImagePlugin { default_sampler: ImageSampler::nearest_descriptor(), } } } impl Plugin for ImagePlugin { fn build(&self, app: &mut App) { #[cfg(feature = "exr")] { app.init_asset_loader::(); } #[cfg(feature = "hdr")] { app.init_asset_loader::(); } app.add_plugins(RenderAssetPlugin::::default()) .register_type::() .init_asset::() .register_asset_reflect::(); app.world .resource_mut::>() .insert(Handle::default(), Image::default()); #[cfg(feature = "basis-universal")] if let Some(processor) = app .world .get_resource::() { processor.register_processor::>( CompressedImageSaver.into(), ); processor .set_default_processor::>("png"); } if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { render_app.init_resource::().add_systems( Render, update_texture_cache_system.in_set(RenderSet::Cleanup), ); } #[cfg(any( feature = "png", feature = "dds", feature = "tga", feature = "jpeg", feature = "bmp", feature = "basis-universal", feature = "ktx2", ))] app.preregister_asset_loader::(IMG_FILE_EXTENSIONS); } fn finish(&self, app: &mut App) { #[cfg(any( feature = "png", feature = "dds", feature = "tga", feature = "jpeg", feature = "bmp", feature = "basis-universal", feature = "ktx2", ))] { app.init_asset_loader::(); } if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { let default_sampler = { let device = render_app.world.resource::(); device.create_sampler(&self.default_sampler.clone()) }; render_app .insert_resource(DefaultImageSampler(default_sampler)) .init_resource::() .init_resource::() .init_resource::() .init_resource::() .init_resource::(); } } } pub trait BevyDefault { fn bevy_default() -> Self; } impl BevyDefault for wgpu::TextureFormat { fn bevy_default() -> Self { wgpu::TextureFormat::Rgba8UnormSrgb } }