mirror of
https://github.com/bevyengine/bevy
synced 2024-12-27 13:33:08 +00:00
456971381c
# Objective Bevy's internal plugins have lots of execution-order ambiguities, which makes the ambiguity detection tool very noisy for our users. ## Solution Silence every last ambiguity that can currently be resolved. Each time an ambiguity is silenced, it is accompanied by a comment describing why it is correct. This description should be based on the public API of the respective systems. Thus, I have added documentation to some systems describing how they use some resources. # Future work Some ambiguities remain, due to issues out of scope for this PR. * The ambiguity checker does not respect `Without<>` filters, leading to false positives. * Ambiguities between `bevy_ui` and `bevy_animation` cannot be resolved, since neither crate knows that the other exists. We will need a general solution to this problem.
40 lines
1.3 KiB
Rust
40 lines
1.3 KiB
Rust
use crate::{CalculatedSize, Size, UiImage, Val};
|
|
use bevy_asset::Assets;
|
|
use bevy_ecs::{
|
|
component::Component,
|
|
query::{With, Without},
|
|
reflect::ReflectComponent,
|
|
system::{Query, Res},
|
|
};
|
|
use bevy_reflect::{Reflect, ReflectDeserialize, ReflectSerialize};
|
|
use bevy_render::texture::Image;
|
|
use bevy_text::Text;
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
/// Describes how to resize the Image node
|
|
#[derive(Component, Debug, Default, Clone, Reflect, Serialize, Deserialize)]
|
|
#[reflect(Component, Serialize, Deserialize)]
|
|
pub enum ImageMode {
|
|
/// Keep the aspect ratio of the image
|
|
#[default]
|
|
KeepAspect,
|
|
}
|
|
|
|
/// Updates calculated size of the node based on the image provided
|
|
pub fn image_node_system(
|
|
textures: Res<Assets<Image>>,
|
|
mut query: Query<(&mut CalculatedSize, &UiImage), (With<ImageMode>, Without<Text>)>,
|
|
) {
|
|
for (mut calculated_size, image) in &mut query {
|
|
if let Some(texture) = textures.get(image) {
|
|
let size = Size {
|
|
width: Val::Px(texture.texture_descriptor.size.width as f32),
|
|
height: Val::Px(texture.texture_descriptor.size.height as f32),
|
|
};
|
|
// Update only if size has changed to avoid needless layout calculations
|
|
if size != calculated_size.size {
|
|
calculated_size.size = size;
|
|
}
|
|
}
|
|
}
|
|
}
|