Skip to content

Commit 199e5cd

Browse files
authored
Merge pull request #102 from nathanaelneveux/fix/issue-85-single-texture-layer
Fix single-layer voxel texture arrays
2 parents 4328ccb + 361e16e commit 199e5cd

2 files changed

Lines changed: 25 additions & 7 deletions

File tree

src/plugin.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use bevy::{
88
use crate::{
99
configuration::{DefaultWorld, VoxelWorldConfig},
1010
voxel_material::{
11-
prepare_texture, set_repeat_sampler, LoadingTexture, StandardVoxelMaterial,
11+
prepare_texture, prepare_voxel_texture, LoadingTexture, StandardVoxelMaterial,
1212
TextureLayers, VOXEL_TEXTURE_SHADER_HANDLE,
1313
},
1414
voxel_world::*,
@@ -178,8 +178,9 @@ where
178178
RenderAssetUsages::default(),
179179
)
180180
.unwrap();
181-
set_repeat_sampler(&mut image);
182-
let _ = image.reinterpret_stacked_2d_as_array(4);
181+
prepare_voxel_texture(&mut image, 4).expect(
182+
"default voxel texture should be a valid 4-layer array texture",
183+
);
183184
let mut image_assets =
184185
app.world_mut().resource_mut::<Assets<Image>>();
185186
image_assets.add(image)

src/voxel_material.rs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
use bevy::image::ImageAddressMode;
1+
use bevy::image::{ImageAddressMode, TextureReinterpretationError};
22
use bevy::{
33
asset::uuid_handle,
44
mesh::{MeshVertexAttribute, MeshVertexBufferLayoutRef, VertexAttributeDescriptor},
55
pbr::{MaterialExtension, MaterialExtensionKey, MaterialExtensionPipeline},
66
prelude::*,
77
reflect::TypePath,
88
render::render_resource::{
9-
AsBindGroup, RenderPipelineDescriptor, SpecializedMeshPipelineError, VertexFormat,
9+
AsBindGroup, RenderPipelineDescriptor, SpecializedMeshPipelineError,
10+
TextureViewDescriptor, TextureViewDimension, VertexFormat,
1011
},
1112
};
1213
use bevy_shader::{Shader, ShaderDefVal, ShaderRef};
@@ -96,11 +97,27 @@ pub(crate) fn prepare_texture(
9697
{
9798
return;
9899
}
99-
loading_texture.is_loaded = true;
100100

101101
let image = images.get_mut(&loading_texture.handle).unwrap();
102+
if let Err(err) = prepare_voxel_texture(image, texture_layers.0) {
103+
warn_once!("Failed to prepare voxel texture as a texture array: {err}");
104+
}
105+
106+
loading_texture.is_loaded = true;
107+
}
108+
109+
pub(crate) fn prepare_voxel_texture(
110+
image: &mut Image,
111+
texture_layers: u32,
112+
) -> Result<(), TextureReinterpretationError> {
102113
set_repeat_sampler(image);
103-
let _ = image.reinterpret_stacked_2d_as_array(texture_layers.0);
114+
image.reinterpret_stacked_2d_as_array(texture_layers)?;
115+
image.texture_view_descriptor = Some(TextureViewDescriptor {
116+
dimension: Some(TextureViewDimension::D2Array),
117+
..default()
118+
});
119+
120+
Ok(())
104121
}
105122

106123
pub(crate) fn set_repeat_sampler(image: &mut Image) {

0 commit comments

Comments
 (0)