fix: incorrect sprite size for aabb when sprite has rect and no custom_size (#12738)
# Objective Fixes #12736 ## Solution Use sprite rect to calculate sprite size for aabb when custom_size is None
This commit is contained in:
parent
221d925e90
commit
7e9f6328da
@ -194,14 +194,18 @@ pub fn calculate_bounds_2d(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (entity, sprite, texture_handle, atlas) in &sprites_to_recalculate_aabb {
|
for (entity, sprite, texture_handle, atlas) in &sprites_to_recalculate_aabb {
|
||||||
if let Some(size) = sprite.custom_size.or_else(|| match atlas {
|
if let Some(size) = sprite
|
||||||
|
.custom_size
|
||||||
|
.or_else(|| sprite.rect.map(|rect| rect.size()))
|
||||||
|
.or_else(|| match atlas {
|
||||||
// We default to the texture size for regular sprites
|
// We default to the texture size for regular sprites
|
||||||
None => images.get(texture_handle).map(|image| image.size_f32()),
|
None => images.get(texture_handle).map(|image| image.size_f32()),
|
||||||
// We default to the drawn rect for atlas sprites
|
// We default to the drawn rect for atlas sprites
|
||||||
Some(atlas) => atlas
|
Some(atlas) => atlas
|
||||||
.texture_rect(&atlases)
|
.texture_rect(&atlases)
|
||||||
.map(|rect| rect.size().as_vec2()),
|
.map(|rect| rect.size().as_vec2()),
|
||||||
}) {
|
})
|
||||||
|
{
|
||||||
let aabb = Aabb {
|
let aabb = Aabb {
|
||||||
center: (-sprite.anchor.as_vec() * size).extend(0.0).into(),
|
center: (-sprite.anchor.as_vec() * size).extend(0.0).into(),
|
||||||
half_extents: (0.5 * size).extend(0.0).into(),
|
half_extents: (0.5 * size).extend(0.0).into(),
|
||||||
@ -226,7 +230,7 @@ impl ExtractComponent for SpriteSource {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
|
|
||||||
use bevy_math::Vec2;
|
use bevy_math::{Rect, Vec2, Vec3A};
|
||||||
use bevy_utils::default;
|
use bevy_utils::default;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -336,4 +340,52 @@ mod test {
|
|||||||
// Check that the AABBs are not equal
|
// Check that the AABBs are not equal
|
||||||
assert_ne!(first_aabb, second_aabb);
|
assert_ne!(first_aabb, second_aabb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn calculate_bounds_2d_correct_aabb_for_sprite_with_custom_rect() {
|
||||||
|
// Setup app
|
||||||
|
let mut app = App::new();
|
||||||
|
|
||||||
|
// Add resources and get handle to image
|
||||||
|
let mut image_assets = Assets::<Image>::default();
|
||||||
|
let image_handle = image_assets.add(Image::default());
|
||||||
|
app.insert_resource(image_assets);
|
||||||
|
let mesh_assets = Assets::<Mesh>::default();
|
||||||
|
app.insert_resource(mesh_assets);
|
||||||
|
let texture_atlas_assets = Assets::<TextureAtlasLayout>::default();
|
||||||
|
app.insert_resource(texture_atlas_assets);
|
||||||
|
|
||||||
|
// Add system
|
||||||
|
app.add_systems(Update, calculate_bounds_2d);
|
||||||
|
|
||||||
|
// Add entities
|
||||||
|
let entity = app
|
||||||
|
.world_mut()
|
||||||
|
.spawn((
|
||||||
|
Sprite {
|
||||||
|
rect: Some(Rect::new(0., 0., 0.5, 1.)),
|
||||||
|
anchor: Anchor::TopRight,
|
||||||
|
..default()
|
||||||
|
},
|
||||||
|
image_handle,
|
||||||
|
))
|
||||||
|
.id();
|
||||||
|
|
||||||
|
// Create AABB
|
||||||
|
app.update();
|
||||||
|
|
||||||
|
// Get the AABB
|
||||||
|
let aabb = *app
|
||||||
|
.world_mut()
|
||||||
|
.get_entity(entity)
|
||||||
|
.expect("Could not find entity")
|
||||||
|
.get::<Aabb>()
|
||||||
|
.expect("Could not find AABB");
|
||||||
|
|
||||||
|
// Verify that the AABB is at the expected position
|
||||||
|
assert_eq!(aabb.center, Vec3A::new(-0.25, -0.5, 0.));
|
||||||
|
|
||||||
|
// Verify that the AABB has the expected size
|
||||||
|
assert_eq!(aabb.half_extents, Vec3A::new(0.25, 0.5, 0.));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user