Skip to content

Commit 7092287

Browse files
committed
Add new ImageLoaderSettings member for loading as stacked 2d array
1 parent c0eb89e commit 7092287

File tree

3 files changed

+35
-40
lines changed

3 files changed

+35
-40
lines changed

crates/bevy_image/src/compressed_image_saver.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::{Image, ImageFormat, ImageFormatSetting, ImageLoader, ImageLoaderSettings};
22

33
use bevy_asset::saver::{AssetSaver, SavedAsset};
4+
use core::num::NonZero;
45
use futures_lite::AsyncWriteExt;
56
use thiserror::Error;
67

@@ -64,11 +65,14 @@ impl AssetSaver for CompressedImageSaver {
6465
};
6566

6667
writer.write_all(&compressed_basis_data).await?;
68+
69+
let layers = NonZero::new(image.texture_descriptor.size.depth_or_array_layers);
6770
Ok(ImageLoaderSettings {
6871
format: ImageFormatSetting::Format(ImageFormat::Basis),
6972
is_srgb,
7073
sampler: image.sampler.clone(),
7174
asset_usage: image.asset_usage,
75+
layers,
7276
})
7377
}
7478
}

crates/bevy_image/src/image_loader.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use core::num::NonZero;
2+
13
use crate::image::{Image, ImageFormat, ImageType, TextureError};
24
use bevy_asset::{io::Reader, AssetLoader, LoadContext, RenderAssetUsages};
35
use thiserror::Error;
@@ -111,6 +113,9 @@ pub struct ImageLoaderSettings {
111113
/// Where the asset will be used - see the docs on
112114
/// [`RenderAssetUsages`] for details.
113115
pub asset_usage: RenderAssetUsages,
116+
/// If the image should be loaded as a stacked 2d array
117+
/// image with the given number of layers
118+
pub layers: Option<NonZero<u32>>,
114119
}
115120

116121
impl Default for ImageLoaderSettings {
@@ -120,6 +125,7 @@ impl Default for ImageLoaderSettings {
120125
is_srgb: true,
121126
sampler: ImageSampler::Default,
122127
asset_usage: RenderAssetUsages::default(),
128+
layers: Default::default(),
123129
}
124130
}
125131
}
@@ -168,7 +174,8 @@ impl AssetLoader for ImageLoader {
168174
)?)
169175
}
170176
};
171-
Ok(Image::from_buffer(
177+
178+
let mut image = Image::from_buffer(
172179
&bytes,
173180
image_type,
174181
self.supported_compressed_formats,
@@ -179,7 +186,13 @@ impl AssetLoader for ImageLoader {
179186
.map_err(|err| FileTextureError {
180187
error: err,
181188
path: format!("{}", load_context.path().display()),
182-
})?)
189+
})?;
190+
191+
if let Some(layers) = settings.layers {
192+
image.reinterpret_stacked_2d_as_array(layers.into());
193+
}
194+
195+
Ok(image)
183196
}
184197

185198
fn extensions(&self) -> &[&str] {

examples/shader/array_texture.rs

Lines changed: 16 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
//! This example illustrates how to create a texture for use with a `texture_2d_array<f32>` shader
22
//! uniform variable.
33
4+
use core::num::NonZero;
5+
46
use bevy::{
57
prelude::*, reflect::TypePath, render::render_resource::AsBindGroup, shader::ShaderRef,
68
};
9+
use bevy_image::ImageLoaderSettings;
710

811
/// This example uses a shader source file from the assets subdirectory
912
const SHADER_ASSET_PATH: &str = "shaders/array_texture.wgsl";
@@ -15,23 +18,15 @@ fn main() {
1518
MaterialPlugin::<ArrayTextureMaterial>::default(),
1619
))
1720
.add_systems(Startup, setup)
18-
.add_systems(Update, create_array_texture)
1921
.run();
2022
}
2123

22-
#[derive(Resource)]
23-
struct LoadingTexture {
24-
is_loaded: bool,
25-
handle: Handle<Image>,
26-
}
27-
28-
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
29-
// Start loading the texture.
30-
commands.insert_resource(LoadingTexture {
31-
is_loaded: false,
32-
handle: asset_server.load("textures/array_texture.png"),
33-
});
34-
24+
fn setup(
25+
mut commands: Commands,
26+
asset_server: Res<AssetServer>,
27+
mut meshes: ResMut<Assets<Mesh>>,
28+
mut materials: ResMut<Assets<ArrayTextureMaterial>>,
29+
) {
3530
// light
3631
commands.spawn((
3732
DirectionalLight::default(),
@@ -43,34 +38,17 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
4338
Camera3d::default(),
4439
Transform::from_xyz(5.0, 5.0, 5.0).looking_at(Vec3::new(1.5, 0.0, 0.0), Vec3::Y),
4540
));
46-
}
47-
48-
fn create_array_texture(
49-
mut commands: Commands,
50-
asset_server: Res<AssetServer>,
51-
mut loading_texture: ResMut<LoadingTexture>,
52-
mut images: ResMut<Assets<Image>>,
53-
mut meshes: ResMut<Assets<Mesh>>,
54-
mut materials: ResMut<Assets<ArrayTextureMaterial>>,
55-
) {
56-
if loading_texture.is_loaded
57-
|| !asset_server
58-
.load_state(loading_texture.handle.id())
59-
.is_loaded()
60-
{
61-
return;
62-
}
63-
loading_texture.is_loaded = true;
64-
let image = images.get_mut(&loading_texture.handle).unwrap();
65-
66-
// Create a new array texture asset from the loaded texture.
67-
let array_layers = 4;
68-
image.reinterpret_stacked_2d_as_array(array_layers);
6941

7042
// Spawn some cubes using the array texture
43+
let array_layers = 4;
7144
let mesh_handle = meshes.add(Cuboid::default());
7245
let material_handle = materials.add(ArrayTextureMaterial {
73-
array_texture: loading_texture.handle.clone(),
46+
array_texture: asset_server.load_with_settings(
47+
"textures/array_texture.png",
48+
move |settings: &mut ImageLoaderSettings| {
49+
settings.layers = NonZero::new(array_layers);
50+
},
51+
),
7452
});
7553
for x in -5..=5 {
7654
commands.spawn((

0 commit comments

Comments
 (0)