Crate bevy_rich_text3d

Source
Expand description

§bevy_rich_text3d

Crates.io Docs Bevy tracking

Mesh based raster rich text implementation for bevy.

§Overview

This crate is similar to bevy_text but aims to be more user friendly and powerful.

Unlike bevy_text, this crate renders text as a Mesh and an Image atlas. This not only works with StandardMaterial but also can be empowered by user defined shaders.

We render each glyph as a separate quad, meaning in shaders, we can easily manipulate individual glyphs for different effects. Additionally we support exporting specific values like glyph count, glyph position or user defined magic numbers via the uv1 field.

§Getting Started

Add plugins:

app.add_plugins(Text3dPlugin{
    default_atlas_dimension: (1024, 1024),
    load_system_fonts: true,
    load_font_directories: vec!["assets/fonts".to_owned()]
    ..Default::default()
})

Spawn a Text3d.

commands.spawn(
    Text3d::new("Hello, World!"),
    // Mesh2d also works
    Mesh3d::default(),
    MeshMaterial3d(materials.add(
        StandardMaterial {
            base_color_texture: Some(TextAtlas::DEFAULT_IMAGE.clone()),
            alpha_mode: AlphaMode::Blend,
            ..Default::default()
        }
    ))
)

§Rich Text

Rich text can be created from a string using the Text3d::parse function. We support a simple syntax like {style:value} which is equivalent to <style>value</style> in html, and {value}, which acts as a dynamic value that can be fetched from the world.

See documentation on Text3d::parse for up-to-date syntax.

§Dependencies

  • cosmic_text

Cosmic text is used for layout.

  • zeno

Used for tesselation, this is the same render engine as bevy_text, cosmic_text and swash. We use this crate directly since we do not use swash.

  • bevy

Bevy’s asset system functions as an alternative to swash.

§Glyph Atlas

We store rendered glyphs inside a texture atlas in the component TextAtlasHandle. If you did not create a new one, all glyphs will be cached inside the same default texture, and you can use the convenient TextAtlas::DEFAULT_IMAGE as the image in your materials.

However, if you need more control over where your glyphs are stored, you can manually create a TextAtlas and Image alongside your Text3d, they can be managed the same way as other assets.

§FAQ

  • How do I add fonts?

Either add them in the plugin or add them via Res<TextRenderer>::db_mut(), see cosmic_text’s documentation for details.

  • Some characters are missing when text changes

You must add TouchTextMaterial*dPlugin to get around a change detection issue in bevy. This is a band-aid solution intended to be removed later as we wait for a fix upstream.

  • My glyphs are blurry

You may want to manually set the scale_factor in Text3dPluginSettings.

  • App stutters when text are first drawn

Asynchronous text rasterization is not implemented, future releases will attempt to address this issue.

§Versions

bevybevy_rich_text3d
0.150.1-latest

§License

Licensed under either of

at your option.

§Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Re-exports§

pub use cosmic_text;

Structs§

FetchedTextSegment
A string segment on a component, as opposed to in a Text3d.
SegmentStyle
Text style of a segment.
SharedTextSegment
Prevent Text3d from despawning a FetchedTextSegment on remove.
Text3d
A rich text component.
Text3dBounds
Determines the maximum width of rendered text, by default infinite.
Text3dDimensionOut
Size of the output mesh’s Aabb.
Text3dPlugin
Text3d Plugin, add [Text3dPluginSettings] before this to modify its behavior.
Text3dSet
SystemSet of text3d rendering in PostUpdate before transforms.
Text3dStyling
Default text style of a rich text component.
TextAnchor
Anchor of a text block, usually in (-0.5, -0.5)..=(0.5, 0.5).
TextAtlas
Backing image handle and atlas of [Text3d].
TextAtlasHandle
Component of a Handle<TextAtlas>, if left as default, will use the shared TextAtlas::DEFAULT_IMAGE as the underlying image.
TextFetch
A component that fetches data as a string from the world.
TextRenderer
Newtype for cosmic_text::FontSystem.
TouchTextMaterial2dPlugin
This plugin must be added if you want text changes to affect the material, this works by mutably dereferencing the material to signal a change.
TouchTextMaterial3dPlugin
This plugin must be added if you want text changes to affect the material, this works by mutably dereferencing the material to signal a change.

Enums§

GlyphMeta
Determines what kind of data each field in uv1 carry.
ParseError
Error emitted when parsing rich text.
Text3dSegment
A string segment in Text3d.
TextAlign
Horizontal align of text.