Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JustifyText::Center doesn't place a text in the center of Text2dBounds #14266

Open
m2ym opened this issue Jul 10, 2024 · 5 comments · May be fixed by #17365
Open

JustifyText::Center doesn't place a text in the center of Text2dBounds #14266

m2ym opened this issue Jul 10, 2024 · 5 comments · May be fixed by #17365
Assignees
Labels
A-Text Rendering and layout for characters C-Bug An unexpected or incorrect behavior D-Modest A "normal" level of difficulty; suitable for simple features or challenging fixes P-Regression Functionality that used to work but no longer does. Add a test for this! S-Ready-For-Implementation This issue is ready for an implementation PR. Go for it!
Milestone

Comments

@m2ym
Copy link

m2ym commented Jul 10, 2024

Bevy version

v0.14.0

What you did

  • Tried to place a text in the center of some bounds (Text2dBounds)
use bevy::prelude::*;
use bevy::sprite::Anchor;
use bevy::text::Text2dBounds;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(Startup, setup)
        .run();
}

fn setup(mut commands: Commands) {
    commands.spawn(Camera2dBundle::default());

    commands.spawn(Text2dBundle {
        text: Text::from_section(
            "hello",
            TextStyle {
                font_size: 60.0,
                ..default()
            },
        )
        .with_justify(JustifyText::Center),
        text_2d_bounds: Text2dBounds {
            size: Vec2::new(600., 200.),
        },
        text_anchor: Anchor::Center,
        ..default()
    });
}

What went wrong

The text ("hello" in the code above) is not placed at the center, but at the right.

v0_14_0

In v0.13.2, the text is rendered as expected.

v0_13_2

@m2ym m2ym added C-Bug An unexpected or incorrect behavior S-Needs-Triage This issue needs to be labelled labels Jul 10, 2024
@mgi388
Copy link
Contributor

mgi388 commented Jul 10, 2024

@m2ym out of interest does the response #14251 (comment) help in your case?

@ickshonpe ickshonpe added A-Text Rendering and layout for characters and removed S-Needs-Triage This issue needs to be labelled labels Jul 10, 2024
@ickshonpe
Copy link
Contributor

ickshonpe commented Jul 10, 2024

This is a bug. JustifyText isn't meant to affect single lines of text. The Anchor component controls Text2d's alignment relative to the position of its transform.

The Text2dBounds constraint seems to be the problem. Without it the text is centered in Bevy 14 like in the second screenshot:

fn setup(mut commands: Commands) {
    commands.spawn(Camera2dBundle::default());

    commands.spawn(Text2dBundle {
        text: Text::from_section(
            "hello",
            TextStyle {
                font_size: 60.0,
                ..default()
            },
        ),
        text_anchor: Anchor::Center,
        ..default()
    });
}

@ickshonpe
Copy link
Contributor

ickshonpe commented Jul 10, 2024

This is really odd:

use bevy::color::palettes;
use bevy::math::vec2;
use bevy::prelude::*;
use bevy::sprite::Anchor;
use bevy::text::Text2dBounds;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(Startup, setup)
        .run();
}

fn setup(mut commands: Commands) {
    commands.spawn(Camera2dBundle::default());

    let size = vec2(600., 200.);
    commands.spawn(SpriteBundle {
        sprite: Sprite {
            color: palettes::css::NAVY.into(),
            custom_size: Some(size),
            anchor: Anchor::Center,
            ..Default::default()
        },
        transform: Transform::from_translation(300. * Vec3::Y),
        
        ..Default::default()
    });

    commands.spawn(SpriteBundle {
        sprite: Sprite {
            color: palettes::css::NAVY.into(),
            custom_size: Some(size),
            anchor: Anchor::Center,
            ..Default::default()
        },
        ..Default::default()
    });

    commands.spawn(Text2dBundle {
        text: Text::from_section(
            "hello",
            TextStyle {
                font_size: 60.0,
                ..default()
            },
        )
        .with_justify(JustifyText::Center),
        text_2d_bounds: Text2dBounds {
            size: Vec2::new(600., 200.),
        },
        text_anchor: Anchor::Center,
        ..default()
    });
}
hello

z-ordering

@ickshonpe
Copy link
Contributor

As a temporary fix you can add this system to PostUpdate after update_text2d_layout:

fn fix_text2d_layout(
    mut query: Query<&mut TextLayoutInfo, (Changed<TextLayoutInfo>, With<Anchor>)>,
) {
    for mut layout_info in query.iter_mut() {
        let mut min_x = f32::MAX;
        for glyph in layout_info.glyphs.iter() {
            min_x = (glyph.position.x - 0.5 * glyph.size.x).min(min_x);
        }

        for glyph in layout_info.glyphs.iter_mut() {
            glyph.position.x -= min_x;
        }
    }
}

Should work with both bevy 0.14 and main.

@m2ym
Copy link
Author

m2ym commented Jul 11, 2024

@ickshonpe The temporary fix works. Thanks for your work and a very quick response!

@rparrett rparrett added the P-Regression Functionality that used to work but no longer does. Add a test for this! label Jul 14, 2024
@alice-i-cecile alice-i-cecile added this to the 0.14.1 milestone Jul 14, 2024
@alice-i-cecile alice-i-cecile modified the milestones: 0.14.1, 0.14.2 Aug 2, 2024
@alice-i-cecile alice-i-cecile added S-Ready-For-Implementation This issue is ready for an implementation PR. Go for it! D-Modest A "normal" level of difficulty; suitable for simple features or challenging fixes labels Sep 2, 2024
@mockersf mockersf modified the milestones: 0.14.2, 0.14.3 Sep 5, 2024
@JMS55 JMS55 modified the milestones: 0.14.3, 0.15 Sep 29, 2024
@alice-i-cecile alice-i-cecile modified the milestones: 0.15, 0.16 Oct 8, 2024
@ickshonpe ickshonpe linked a pull request Jan 14, 2025 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-Text Rendering and layout for characters C-Bug An unexpected or incorrect behavior D-Modest A "normal" level of difficulty; suitable for simple features or challenging fixes P-Regression Functionality that used to work but no longer does. Add a test for this! S-Ready-For-Implementation This issue is ready for an implementation PR. Go for it!
Projects
None yet
Development

Successfully merging a pull request may close this issue.

7 participants