UI text rotation and scaling fix (#11326)
# Objective UI node text is drawn in the wrong position after rotation or scaling.  ## Solution In `extract_text_uinodes` to set the text's offset create a translation matrix and multiply it by the UI node's transform. Previously the offset was just added directly to the translation of the Node's `GlobalTransform`, which meant no scaling or rotation would be applied to the offset. <img width="961" alt="296440025-537ec11c-1ea1-469c-8eec-2ad4ae012095" src="https://github.com/bevyengine/bevy/assets/27962798/eae1a1d2-1369-47ad-8963-3862d03ec0bf"> <img width="961" alt="296440156-dd04029d-8112-4fa5-89a2-56d7acab66df" src="https://github.com/bevyengine/bevy/assets/27962798/90b1b6db-13f4-4745-9f14-7c1661baad50"> Fixes #11241
This commit is contained in:
parent
a634075a39
commit
03404c48ca
@ -21,7 +21,6 @@ use crate::{
|
|||||||
use bevy_app::prelude::*;
|
use bevy_app::prelude::*;
|
||||||
use bevy_asset::{load_internal_asset, AssetEvent, AssetId, Assets, Handle};
|
use bevy_asset::{load_internal_asset, AssetEvent, AssetId, Assets, Handle};
|
||||||
use bevy_ecs::prelude::*;
|
use bevy_ecs::prelude::*;
|
||||||
use bevy_math::Vec3Swizzles;
|
|
||||||
use bevy_math::{Mat4, Rect, URect, UVec4, Vec2, Vec3, Vec4Swizzles};
|
use bevy_math::{Mat4, Rect, URect, UVec4, Vec2, Vec3, Vec4Swizzles};
|
||||||
use bevy_render::{
|
use bevy_render::{
|
||||||
camera::Camera,
|
camera::Camera,
|
||||||
@ -636,19 +635,18 @@ pub fn extract_text_uinodes(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut affine = global_transform.affine();
|
|
||||||
|
|
||||||
// Align the text to the nearest physical pixel:
|
// Align the text to the nearest physical pixel:
|
||||||
// * Translate by minus the text node's half-size
|
// * Translate by minus the text node's half-size
|
||||||
// (The transform translates to the center of the node but the text coordinates are relative to the node's top left corner)
|
// (The transform translates to the center of the node but the text coordinates are relative to the node's top left corner)
|
||||||
// * Multiply the logical coordinates by the scale factor to get its position in physical coordinates
|
// * Multiply the logical coordinates by the scale factor to get its position in physical coordinates
|
||||||
// * Round the physical position to the nearest physical pixel
|
// * Round the physical position to the nearest physical pixel
|
||||||
// * Multiply by the rounded physical position by the inverse scale factor to return to logical coordinates
|
// * Multiply by the rounded physical position by the inverse scale factor to return to logical coordinates
|
||||||
let logical_top_left = affine.translation.xy() - 0.5 * uinode.size();
|
|
||||||
|
let logical_top_left = -0.5 * uinode.size();
|
||||||
let physical_nearest_pixel = (logical_top_left * scale_factor).round();
|
let physical_nearest_pixel = (logical_top_left * scale_factor).round();
|
||||||
let logical_top_left_nearest_pixel = physical_nearest_pixel * inverse_scale_factor;
|
let logical_top_left_nearest_pixel = physical_nearest_pixel * inverse_scale_factor;
|
||||||
affine.translation = logical_top_left_nearest_pixel.extend(0.).into();
|
let transform = Mat4::from(global_transform.affine())
|
||||||
let transform = Mat4::from(affine);
|
* Mat4::from_translation(logical_top_left_nearest_pixel.extend(0.));
|
||||||
|
|
||||||
let mut color = Color::WHITE;
|
let mut color = Color::WHITE;
|
||||||
let mut current_section = usize::MAX;
|
let mut current_section = usize::MAX;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user