Fixes incorrect glyph positioning for text2d (#6273)
# Objective Fixes #6272 ## Solution Revert to old way of positioning text for Text2D rendered text. Co-authored-by: Michel van der Hulst <hulstmichel@gmail.com>
This commit is contained in:
		
							parent
							
								
									c6e0da4bcb
								
							
						
					
					
						commit
						0981789ec7
					
				| @ -7,7 +7,10 @@ use glyph_brush_layout::{ | ||||
|     FontId, GlyphPositioner, Layout, SectionGeometry, SectionGlyph, SectionText, ToSectionText, | ||||
| }; | ||||
| 
 | ||||
| use crate::{error::TextError, Font, FontAtlasSet, GlyphAtlasInfo, TextAlignment, TextSettings}; | ||||
| use crate::{ | ||||
|     error::TextError, Font, FontAtlasSet, GlyphAtlasInfo, TextAlignment, TextSettings, | ||||
|     YAxisOrientation, | ||||
| }; | ||||
| 
 | ||||
| pub struct GlyphBrush { | ||||
|     fonts: Vec<FontArc>, | ||||
| @ -53,6 +56,7 @@ impl GlyphBrush { | ||||
|         texture_atlases: &mut Assets<TextureAtlas>, | ||||
|         textures: &mut Assets<Image>, | ||||
|         text_settings: &TextSettings, | ||||
|         y_axis_orientation: YAxisOrientation, | ||||
|     ) -> Result<Vec<PositionedGlyph>, TextError> { | ||||
|         if glyphs.is_empty() { | ||||
|             return Ok(Vec::new()); | ||||
| @ -75,15 +79,18 @@ impl GlyphBrush { | ||||
| 
 | ||||
|         let mut min_x = std::f32::MAX; | ||||
|         let mut min_y = std::f32::MAX; | ||||
|         let mut max_y = std::f32::MIN; | ||||
|         for sg in &glyphs { | ||||
|             let glyph = &sg.glyph; | ||||
| 
 | ||||
|             let scaled_font = sections_data[sg.section_index].3; | ||||
|             min_x = min_x.min(glyph.position.x); | ||||
|             min_y = min_y.min(glyph.position.y - scaled_font.ascent()); | ||||
|             max_y = max_y.max(glyph.position.y - scaled_font.descent()); | ||||
|         } | ||||
|         min_x = min_x.floor(); | ||||
|         min_y = min_y.floor(); | ||||
|         max_y = max_y.floor(); | ||||
| 
 | ||||
|         let mut positioned_glyphs = Vec::new(); | ||||
|         for sg in glyphs { | ||||
| @ -120,7 +127,12 @@ impl GlyphBrush { | ||||
|                 let size = Vec2::new(glyph_rect.width(), glyph_rect.height()); | ||||
| 
 | ||||
|                 let x = bounds.min.x + size.x / 2.0 - min_x; | ||||
|                 let y = bounds.min.y + size.y / 2.0 - min_y; | ||||
| 
 | ||||
|                 let y = match y_axis_orientation { | ||||
|                     YAxisOrientation::BottomToTop => max_y - bounds.max.y + size.y / 2.0, | ||||
|                     YAxisOrientation::TopToBottom => bounds.min.y + size.y / 2.0 - min_y, | ||||
|                 }; | ||||
| 
 | ||||
|                 let position = adjust.position(Vec2::new(x, y)); | ||||
| 
 | ||||
|                 positioned_glyphs.push(PositionedGlyph { | ||||
|  | ||||
| @ -56,6 +56,14 @@ impl Default for TextSettings { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// Text is rendered for two different view projections, normal `Text2DBundle` is rendered with a
 | ||||
| /// `BottomToTop` y axis, and UI is rendered with a `TopToBottom` y axis. This matters for text because
 | ||||
| /// the glyph positioning is different in either layout.
 | ||||
| pub enum YAxisOrientation { | ||||
|     TopToBottom, | ||||
|     BottomToTop, | ||||
| } | ||||
| 
 | ||||
| impl Plugin for TextPlugin { | ||||
|     fn build(&self, app: &mut App) { | ||||
|         app.add_asset::<Font>() | ||||
|  | ||||
| @ -11,7 +11,7 @@ use glyph_brush_layout::{FontId, SectionText}; | ||||
| 
 | ||||
| use crate::{ | ||||
|     error::TextError, glyph_brush::GlyphBrush, scale_value, Font, FontAtlasSet, PositionedGlyph, | ||||
|     TextAlignment, TextSection, TextSettings, | ||||
|     TextAlignment, TextSection, TextSettings, YAxisOrientation, | ||||
| }; | ||||
| 
 | ||||
| #[derive(Default, Resource)] | ||||
| @ -50,6 +50,7 @@ impl TextPipeline { | ||||
|         texture_atlases: &mut Assets<TextureAtlas>, | ||||
|         textures: &mut Assets<Image>, | ||||
|         text_settings: &TextSettings, | ||||
|         y_axis_orientation: YAxisOrientation, | ||||
|     ) -> Result<TextLayoutInfo, TextError> { | ||||
|         let mut scaled_fonts = Vec::new(); | ||||
|         let sections = sections | ||||
| @ -105,6 +106,7 @@ impl TextPipeline { | ||||
|             texture_atlases, | ||||
|             textures, | ||||
|             text_settings, | ||||
|             y_axis_orientation, | ||||
|         )?; | ||||
| 
 | ||||
|         Ok(TextLayoutInfo { glyphs, size }) | ||||
|  | ||||
| @ -23,7 +23,7 @@ use bevy_window::{WindowId, WindowScaleFactorChanged, Windows}; | ||||
| 
 | ||||
| use crate::{ | ||||
|     Font, FontAtlasSet, HorizontalAlign, Text, TextError, TextLayoutInfo, TextPipeline, | ||||
|     TextSettings, VerticalAlign, | ||||
|     TextSettings, VerticalAlign, YAxisOrientation, | ||||
| }; | ||||
| 
 | ||||
| /// The calculated size of text drawn in 2D scene.
 | ||||
| @ -182,6 +182,7 @@ pub fn update_text2d_layout( | ||||
|                 ), | ||||
|                 None => Vec2::new(f32::MAX, f32::MAX), | ||||
|             }; | ||||
| 
 | ||||
|             match text_pipeline.queue_text( | ||||
|                 &fonts, | ||||
|                 &text.sections, | ||||
| @ -192,6 +193,7 @@ pub fn update_text2d_layout( | ||||
|                 &mut *texture_atlases, | ||||
|                 &mut *textures, | ||||
|                 text_settings.as_ref(), | ||||
|                 YAxisOrientation::BottomToTop, | ||||
|             ) { | ||||
|                 Err(TextError::NoSuchFont) => { | ||||
|                     // There was an error processing the text layout, let's add this entity to the
 | ||||
|  | ||||
| @ -8,7 +8,10 @@ use bevy_ecs::{ | ||||
| use bevy_math::Vec2; | ||||
| use bevy_render::texture::Image; | ||||
| use bevy_sprite::TextureAtlas; | ||||
| use bevy_text::{Font, FontAtlasSet, Text, TextError, TextLayoutInfo, TextPipeline, TextSettings}; | ||||
| use bevy_text::{ | ||||
|     Font, FontAtlasSet, Text, TextError, TextLayoutInfo, TextPipeline, TextSettings, | ||||
|     YAxisOrientation, | ||||
| }; | ||||
| use bevy_window::Windows; | ||||
| 
 | ||||
| #[derive(Debug, Default)] | ||||
| @ -118,6 +121,7 @@ pub fn text_system( | ||||
|                 &mut *texture_atlases, | ||||
|                 &mut *textures, | ||||
|                 text_settings.as_ref(), | ||||
|                 YAxisOrientation::TopToBottom, | ||||
|             ) { | ||||
|                 Err(TextError::NoSuchFont) => { | ||||
|                     // There was an error processing the text layout, let's add this entity to the
 | ||||
|  | ||||
| @ -19,8 +19,10 @@ fn main() { | ||||
| 
 | ||||
| #[derive(Component)] | ||||
| struct AnimateTranslation; | ||||
| 
 | ||||
| #[derive(Component)] | ||||
| struct AnimateRotation; | ||||
| 
 | ||||
| #[derive(Component)] | ||||
| struct AnimateScale; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Michel van der Hulst
						Michel van der Hulst