diff --git a/crates/bevy_sprite/src/entity.rs b/crates/bevy_sprite/src/entity.rs index af97fd7caba1a..f1eda12d66669 100644 --- a/crates/bevy_sprite/src/entity.rs +++ b/crates/bevy_sprite/src/entity.rs @@ -1,6 +1,7 @@ use crate::{ - render::SPRITE_PIPELINE_HANDLE, sprite::Sprite, ColorMaterial, TextureAtlas, - TextureAtlasSprite, QUAD_HANDLE, SPRITE_SHEET_PIPELINE_HANDLE, + render::SPRITE_PIPELINE_HANDLE, + sprite::{Sprite, SpriteResizeMode}, + ColorMaterial, TextureAtlas, TextureAtlasSprite, QUAD_HANDLE, SPRITE_SHEET_PIPELINE_HANDLE, }; use bevy_asset::Handle; use bevy_ecs::Bundle; @@ -15,6 +16,7 @@ use bevy_transform::prelude::{Rotation, Scale, Transform, Translation}; #[derive(Bundle)] pub struct SpriteComponents { pub sprite: Sprite, + pub resize_mode: SpriteResizeMode, pub mesh: Handle, // TODO: maybe abstract this out pub material: Handle, pub main_pass: MainPass, @@ -53,6 +55,7 @@ impl Default for SpriteComponents { ..Default::default() }, sprite: Default::default(), + resize_mode: Default::default(), main_pass: MainPass, material: Default::default(), transform: Default::default(), diff --git a/crates/bevy_sprite/src/lib.rs b/crates/bevy_sprite/src/lib.rs index ddd84abbcd1ae..e2abe5a36f135 100644 --- a/crates/bevy_sprite/src/lib.rs +++ b/crates/bevy_sprite/src/lib.rs @@ -20,7 +20,7 @@ pub use texture_atlas_builder::*; pub mod prelude { pub use crate::{ entity::{SpriteComponents, SpriteSheetComponents}, - ColorMaterial, Sprite, TextureAtlas, TextureAtlasSprite, + ColorMaterial, Sprite, SpriteResizeMode, TextureAtlas, TextureAtlasSprite, }; } diff --git a/crates/bevy_sprite/src/sprite.rs b/crates/bevy_sprite/src/sprite.rs index 2997d419a172d..ab59fe880198d 100644 --- a/crates/bevy_sprite/src/sprite.rs +++ b/crates/bevy_sprite/src/sprite.rs @@ -15,19 +15,37 @@ pub struct Sprite { pub size: Vec2, } +/// Determines how `Sprite` resize should be handled +#[derive(Debug)] +pub enum SpriteResizeMode { + Manual, + Automatic, +} + +impl Default for SpriteResizeMode { + fn default() -> Self { + SpriteResizeMode::Automatic + } +} + // SAFE: sprite is repr(C) and only consists of byteables unsafe impl Byteable for Sprite {} pub fn sprite_system( materials: Res>, textures: Res>, - mut query: Query<(&mut Sprite, &Handle)>, + mut query: Query<(&mut Sprite, &SpriteResizeMode, &Handle)>, ) { - for (mut sprite, handle) in &mut query.iter() { - let material = materials.get(&handle).unwrap(); - if let Some(texture_handle) = material.texture { - if let Some(texture) = textures.get(&texture_handle) { - sprite.size = texture.size; + for (mut sprite, resize_mode, handle) in &mut query.iter() { + match resize_mode { + SpriteResizeMode::Manual => continue, + SpriteResizeMode::Automatic => { + let material = materials.get(&handle).unwrap(); + if let Some(texture_handle) = material.texture { + if let Some(texture) = textures.get(&texture_handle) { + sprite.size = texture.size; + } + } } } }