From 088960f597fec7f979937a3f5b96f6b21810cc63 Mon Sep 17 00:00:00 2001 From: Vitaliy Sapronenko Date: Sun, 5 May 2024 20:29:26 +0300 Subject: [PATCH] Example with repeated texture (#13176) # Objective Fixes #11136 . Fixes https://github.com/bevyengine/bevy/pull/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) --- Cargo.toml | 11 ++ .../panel-border-010-repeated.png | Bin 0 -> 170 bytes examples/README.md | 1 + examples/asset/repeated_texture.rs | 99 ++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 assets/textures/fantasy_ui_borders/panel-border-010-repeated.png create mode 100644 examples/asset/repeated_texture.rs diff --git a/Cargo.toml b/Cargo.toml index baf6c4b42f..2fed3c2f77 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1381,6 +1381,17 @@ description = "Demonstrates how to process and load custom assets" category = "Assets" wasm = false +[[example]] +name = "repeated_texture" +path = "examples/asset/repeated_texture.rs" +doc-scrape-examples = true + +[package.metadata.example.repeated_texture] +name = "Repeated texture configuration" +description = "How to configure the texture to repeat instead of the default clamp to edges" +category = "Assets" +wasm = true + # Async Tasks [[example]] name = "async_compute" diff --git a/assets/textures/fantasy_ui_borders/panel-border-010-repeated.png b/assets/textures/fantasy_ui_borders/panel-border-010-repeated.png new file mode 100644 index 0000000000000000000000000000000000000000..afa859521f6fa10ad8411de51e008b4b11a5b999 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeK3?y%aJ*@^(Ea{HEjtmSN`?>!lvI6;R0X`wF zK>Gjx|4VPqzYAnBmIV0)GdMiEkp|>AdAc};Se#D&@&BQ{$cO*w3X?uRJj~8!@ZkA# z^=Y5~+xGzRMj5siMxG-@CpNO5VkvgFTs-IDA;~M1eRGUjzHH)RkUh!H;aYf%31}LF Mr>mdKI;Vst0D*!$R{#J2 literal 0 HcmV?d00001 diff --git a/examples/README.md b/examples/README.md index 39d94d14fa..8148606c7e 100644 --- a/examples/README.md +++ b/examples/README.md @@ -209,6 +209,7 @@ Example | Description [Embedded Asset](../examples/asset/embedded_asset.rs) | Embed an asset in the application binary and load it [Extra asset source](../examples/asset/extra_source.rs) | Load an asset from a non-standard asset source [Hot Reloading of Assets](../examples/asset/hot_asset_reloading.rs) | Demonstrates automatic reloading of assets when modified on disk +[Repeated texture configuration](../examples/asset/repeated_texture.rs) | How to configure the texture to repeat instead of the default clamp to edges ## Async Tasks diff --git a/examples/asset/repeated_texture.rs b/examples/asset/repeated_texture.rs new file mode 100644 index 0000000000..a2458238ba --- /dev/null +++ b/examples/asset/repeated_texture.rs @@ -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, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + 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() + }); +}