Skip to content

Commit 73f7fd0

Browse files
authored
Move ImageLoader and CompressedImageSaver to bevy_image. (#15812)
# Objective This is a follow-up to #15650. While the core `Image` stuff moved from `bevy_render` to `bevy_image`, the `ImageLoader` and the `CompressedImageSaver` remained in `bevy_render`. ## Solution I moved `ImageLoader` and `CompressedImageSaver` to `bevy_image` and re-exported everything out from `bevy_render`. The second step isn't strictly necessary, but `bevy_render` is already doing this for all the other `bevy_image` types, so I kept it the same for consistency. Unfortunately I had to give `ImageLoader` a constructor so I can keep the `RenderDevice` stuff in `bevy_render`. ## Testing It compiles! ## Migration Guide - `ImageLoader` can no longer be initialized directly through `init_asset_loader`. Now you must use `app.register_asset_loader(ImageLoader::new(supported_compressed_formats))` (check out the implementation of `bevy_render::ImagePlugin`). This only affects you if you are initializing the loader manually and does not affect users of `bevy_render::ImagePlugin`. ## Followup work - We should be able to move most of the `ImagePlugin` to `bevy_image`. This would likely require an `ImagePlugin` and a `RenderImagePlugin` or something though.
1 parent 345f935 commit 73f7fd0

File tree

5 files changed

+34
-36
lines changed

5 files changed

+34
-36
lines changed

crates/bevy_render/src/texture/compressed_image_saver.rs renamed to crates/bevy_image/src/compressed_image_saver.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use super::{Image, ImageFormat, ImageFormatSetting, ImageLoader, ImageLoaderSettings};
1+
use crate::{Image, ImageFormat, ImageFormatSetting, ImageLoader, ImageLoaderSettings};
2+
23
use bevy_asset::saver::{AssetSaver, SavedAsset};
34
use derive_more::derive::{Display, Error, From};
45
use futures_lite::AsyncWriteExt;

crates/bevy_render/src/texture/image_loader.rs renamed to crates/bevy_image/src/image_loader.rs

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
1-
use bevy_asset::{io::Reader, AssetLoader, LoadContext};
2-
use bevy_ecs::prelude::{FromWorld, World};
1+
use crate::image::{Image, ImageFormat, ImageType, TextureError};
2+
use bevy_asset::{io::Reader, AssetLoader, LoadContext, RenderAssetUsages};
33
use derive_more::derive::{Display, Error, From};
44

5-
use crate::{
6-
render_asset::RenderAssetUsages,
7-
renderer::RenderDevice,
8-
texture::{Image, ImageFormat, ImageType, TextureError},
9-
};
10-
115
use super::{CompressedImageFormats, ImageSampler};
126
use serde::{Deserialize, Serialize};
137

@@ -17,6 +11,15 @@ pub struct ImageLoader {
1711
supported_compressed_formats: CompressedImageFormats,
1812
}
1913

14+
impl ImageLoader {
15+
/// Creates a new image loader that supports the provided formats.
16+
pub fn new(supported_compressed_formats: CompressedImageFormats) -> Self {
17+
Self {
18+
supported_compressed_formats,
19+
}
20+
}
21+
}
22+
2023
#[derive(Serialize, Deserialize, Default, Debug)]
2124
pub enum ImageFormatSetting {
2225
#[default]
@@ -106,19 +109,6 @@ impl AssetLoader for ImageLoader {
106109
}
107110
}
108111

109-
impl FromWorld for ImageLoader {
110-
fn from_world(world: &mut World) -> Self {
111-
let supported_compressed_formats = match world.get_resource::<RenderDevice>() {
112-
Some(render_device) => CompressedImageFormats::from_features(render_device.features()),
113-
114-
None => CompressedImageFormats::NONE,
115-
};
116-
Self {
117-
supported_compressed_formats,
118-
}
119-
}
120-
}
121-
122112
/// An error that occurs when loading a texture from a file.
123113
#[derive(Error, Display, Debug)]
124114
#[display("Error reading image file {path}: {error}, this is an error in `bevy_render`.")]

crates/bevy_image/src/lib.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,29 @@ mod image;
66
pub use self::image::*;
77
#[cfg(feature = "basis-universal")]
88
mod basis;
9+
#[cfg(feature = "basis-universal")]
10+
mod compressed_image_saver;
911
#[cfg(feature = "dds")]
1012
mod dds;
1113
#[cfg(feature = "exr")]
1214
mod exr_texture_loader;
1315
#[cfg(feature = "hdr")]
1416
mod hdr_texture_loader;
17+
mod image_loader;
1518
#[cfg(feature = "ktx2")]
1619
mod ktx2;
1720

18-
#[cfg(feature = "ktx2")]
19-
pub use self::ktx2::*;
21+
#[cfg(feature = "basis-universal")]
22+
pub use compressed_image_saver::*;
2023
#[cfg(feature = "dds")]
2124
pub use dds::*;
2225
#[cfg(feature = "exr")]
2326
pub use exr_texture_loader::*;
2427
#[cfg(feature = "hdr")]
2528
pub use hdr_texture_loader::*;
29+
pub use image_loader::*;
30+
#[cfg(feature = "ktx2")]
31+
pub use ktx2::*;
2632

2733
pub(crate) mod image_texture_conversion;
2834
pub use image_texture_conversion::IntoDynamicImageError;

crates/bevy_render/Cargo.toml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ keywords = ["bevy"]
1010

1111
[features]
1212
# Texture formats (require more than just image support)
13-
basis-universal = ["dep:basis-universal", "bevy_image/basis-universal"]
13+
basis-universal = ["bevy_image/basis-universal"]
1414
dds = ["bevy_image/dds"]
1515
exr = ["bevy_image/exr"]
1616
hdr = ["bevy_image/hdr"]
@@ -85,8 +85,6 @@ derive_more = { version = "1", default-features = false, features = [
8585
] }
8686
futures-lite = "2.0.1"
8787
ktx2 = { version = "0.3.0", optional = true }
88-
# For transcoding of UASTC/ETC1S universal formats, and for .basis file support
89-
basis-universal = { version = "0.3.0", optional = true }
9088
encase = { version = "0.10", features = ["glam"] }
9189
# For wgpu profiling using tracing. Use `RUST_LOG=info` to also capture the wgpu spans.
9290
profiling = { version = "1", features = [

crates/bevy_render/src/texture/mod.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
#[cfg(feature = "basis-universal")]
2-
mod compressed_image_saver;
31
mod fallback_image;
42
mod gpu_image;
5-
mod image_loader;
63
mod texture_attachment;
74
mod texture_cache;
85

@@ -12,15 +9,15 @@ pub use bevy_image::ExrTextureLoader;
129
#[cfg(feature = "hdr")]
1310
pub use bevy_image::HdrTextureLoader;
1411
pub use bevy_image::{
15-
BevyDefault, CompressedImageFormats, Image, ImageAddressMode, ImageFilterMode, ImageFormat,
16-
ImageSampler, ImageSamplerDescriptor, ImageType, IntoDynamicImageError, TextureError,
17-
TextureFormatPixelInfo,
12+
BevyDefault, CompressedImageFormats, FileTextureError, Image, ImageAddressMode,
13+
ImageFilterMode, ImageFormat, ImageFormatSetting, ImageLoader, ImageLoaderError,
14+
ImageLoaderSettings, ImageSampler, ImageSamplerDescriptor, ImageType, IntoDynamicImageError,
15+
TextureError, TextureFormatPixelInfo,
1816
};
1917
#[cfg(feature = "basis-universal")]
20-
pub use compressed_image_saver::*;
18+
pub use bevy_image::{CompressedImageSaver, CompressedImageSaverError};
2119
pub use fallback_image::*;
2220
pub use gpu_image::*;
23-
pub use image_loader::*;
2421
pub use texture_attachment::*;
2522
pub use texture_cache::*;
2623

@@ -121,7 +118,13 @@ impl Plugin for ImagePlugin {
121118

122119
fn finish(&self, app: &mut App) {
123120
if !ImageFormat::SUPPORTED.is_empty() {
124-
app.init_asset_loader::<ImageLoader>();
121+
let supported_compressed_formats = match app.world().get_resource::<RenderDevice>() {
122+
Some(render_device) => {
123+
CompressedImageFormats::from_features(render_device.features())
124+
}
125+
None => CompressedImageFormats::NONE,
126+
};
127+
app.register_asset_loader(ImageLoader::new(supported_compressed_formats));
125128
}
126129

127130
if let Some(render_app) = app.get_sub_app_mut(RenderApp) {

0 commit comments

Comments
 (0)