Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Example with repeated texture (#13176)
# Objective Fixes #11136 . Fixes #11161. ## Solution - Set image sampler with repeated mode for u and v - set uv_transform of StandardMaterial to resizing params ## Testing Got this view on example run ![image](https://github.com/bevyengine/bevy/assets/17225606/a5f7c414-7966-4c31-97e1-320241ddc75b)
- Loading branch information
1 parent
d1099ac
commit 088960f
Showing
4 changed files
with
111 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
//! By default Bevy loads images to textures that clamps the image to the edges | ||
//! This example shows how to configure it to repeat the image instead. | ||
|
||
use bevy::{ | ||
math::Affine2, | ||
prelude::*, | ||
render::texture::{ | ||
ImageAddressMode, ImageLoaderSettings, ImageSampler, ImageSamplerDescriptor, | ||
}, | ||
}; | ||
|
||
fn main() { | ||
App::new() | ||
.add_plugins(DefaultPlugins) | ||
.add_systems(Startup, setup) | ||
.run(); | ||
} | ||
|
||
fn setup( | ||
mut commands: Commands, | ||
asset_server: Res<AssetServer>, | ||
mut meshes: ResMut<Assets<Mesh>>, | ||
mut materials: ResMut<Assets<StandardMaterial>>, | ||
) { | ||
let image_with_default_sampler = | ||
asset_server.load("textures/fantasy_ui_borders/panel-border-010.png"); | ||
|
||
// central cube with not repeated texture | ||
commands.spawn(PbrBundle { | ||
mesh: meshes.add(Cuboid::new(1.0, 1.0, 1.0)), | ||
material: materials.add(StandardMaterial { | ||
base_color_texture: Some(image_with_default_sampler.clone()), | ||
..default() | ||
}), | ||
transform: Transform::from_translation(Vec3::ZERO), | ||
..default() | ||
}); | ||
|
||
// left cube with repeated texture | ||
commands.spawn(PbrBundle { | ||
mesh: meshes.add(Cuboid::new(1.0, 1.0, 1.0)), | ||
material: materials.add(StandardMaterial { | ||
base_color_texture: Some(asset_server.load_with_settings( | ||
"textures/fantasy_ui_borders/panel-border-010-repeated.png", | ||
|s: &mut _| { | ||
*s = ImageLoaderSettings { | ||
sampler: ImageSampler::Descriptor(ImageSamplerDescriptor { | ||
// rewriting mode to repeat image, | ||
address_mode_u: ImageAddressMode::Repeat, | ||
address_mode_v: ImageAddressMode::Repeat, | ||
..default() | ||
}), | ||
..default() | ||
} | ||
}, | ||
)), | ||
|
||
// uv_transform used here for proportions only, but it is full Affine2 | ||
// that's why you can use rotation and shift also | ||
uv_transform: Affine2::from_scale(Vec2::new(2., 3.)), | ||
..default() | ||
}), | ||
transform: Transform::from_xyz(-1.5, 0.0, 0.0), | ||
..default() | ||
}); | ||
|
||
// right cube with scaled texture, because with default sampler | ||
commands.spawn(PbrBundle { | ||
mesh: meshes.add(Cuboid::new(1.0, 1.0, 1.0)), | ||
material: materials.add(StandardMaterial { | ||
// there is no sampler set, that's why | ||
// by default you see only one small image in a row/column | ||
// and other space is filled by image edge | ||
base_color_texture: Some(image_with_default_sampler), | ||
|
||
// uv_transform used here for proportions only, but it is full Affine2 | ||
// that's why you can use rotation and shift also | ||
uv_transform: Affine2::from_scale(Vec2::new(2., 3.)), | ||
..default() | ||
}), | ||
transform: Transform::from_xyz(1.5, 0.0, 0.0), | ||
..default() | ||
}); | ||
|
||
// light | ||
commands.spawn(PointLightBundle { | ||
point_light: PointLight { | ||
shadows_enabled: true, | ||
..default() | ||
}, | ||
transform: Transform::from_xyz(4.0, 8.0, 4.0), | ||
..default() | ||
}); | ||
// camera | ||
commands.spawn(Camera3dBundle { | ||
transform: Transform::from_xyz(0.0, 1.5, 4.0).looking_at(Vec3::ZERO, Vec3::Y), | ||
..default() | ||
}); | ||
} |