Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/blaind/bevy_text_mesh
A bevy 3D text mesh generator for displaying text
https://github.com/blaind/bevy_text_mesh
bevy glyphs rust tessellation ttf
Last synced: 8 days ago
JSON representation
A bevy 3D text mesh generator for displaying text
- Host: GitHub
- URL: https://github.com/blaind/bevy_text_mesh
- Owner: blaind
- License: mit
- Created: 2021-07-30T13:02:13.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-03-24T12:11:53.000Z (10 months ago)
- Last Synced: 2025-01-16T15:12:16.690Z (15 days ago)
- Topics: bevy, glyphs, rust, tessellation, ttf
- Language: Rust
- Homepage:
- Size: 2.44 MB
- Stars: 65
- Watchers: 6
- Forks: 16
- Open Issues: 15
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# bevy_text_mesh [![Build Status]][actions] [![Latest Version]][crates.io] [![Docs Version]][docs]
[build status]: https://img.shields.io/github/actions/workflow/status/blaind/bevy_text_mesh/ci.yml?branch=main
[actions]: https://github.com/blaind/bevy_text_mesh/actions?query=branch%3Amain
[latest version]: https://img.shields.io/crates/v/bevy_text_mesh.svg
[crates.io]: https://crates.io/crates/bevy_text_mesh
[docs version]: https://docs.rs/bevy_text_mesh/badge.svg
[docs]: https://docs.rs/bevy_text_meshA bevy 3D text mesh generator plugin for displaying text in 3D scenes
![Example](docs/highlight.webp)
The text mesh is generated at runtime from runtime-tessellated (and cached) TrueType font glyphs. Tessellation of glyphs is done with C-based [github.com/fetisov/ttf2mesh](https://github.com/fetisov/ttf2mesh/) library that is being interfaced through Rust-based FFI API (see [ttf2glyph-rs](https://crates.io/crates/ttf2mesh)).
## Known limitations
Consider this as a preview of the plugin for gathering feedback about the API:
- **The API will change in future - still iterating**
- Multiple `TextMesh` configuration fields are not implemented yet, see example below
- Text color update is not implemented yet
- Spacing of characters are incorrect
- Mesh cache purging is not implemented - this implementation will leak memory (see [#2](https://github.com/blaind/bevy_text_mesh/issues/2))
- WASM builds are not supported (see [#11](https://github.com/blaind/bevy_text_mesh/issues/11))## Bevy versions support table
| bevy | bevy_text_mesh |
| ---- | -------------- |
| 0.12 | 0.9.0 |
| 0.11 | 0.7.0 |
| 0.10 | 0.6.0 |
| 0.9 | 0.5.0 |
| 0.8 | 0.4.0 |
| 0.7 | 0.2.0 |
| 0.6 | 0.1.0 |
| 0.5 | 0.0.2 |## Usage
## Prequisites
Prequisites (for compiling [ttf2mesh-rs](https://crates.io/crates/ttf2mesh)):
apt-get install build-essential patch
## Running the examples
See the [examples](/examples) -folder.
```
git clone https://github.com/blaind/bevy_text_mesh.git
cd bevy_text_mesh
cargo run --example 3d_scene --release # or
cargo run --example performance --release
```## Integrating to your Bevy App
Add to Cargo.toml:
```
[dependencies]
bevy_text_mesh = "0.9.0"
```Include the library:
```rust
use bevy_text_mesh::prelude::*;
```Second, add a `TextMeshPlugin` to your app:
```rust
App::new()
...
.add_plugins(TextMeshPlugin)
...;
```Then, add the desired TrueType-fonts (with suffix `.ttf`) into your assets folder, a good convention is to store them to `assets/fonts` folder.
For example, see Fira fonts. Please read also their [LICENSE](https://github.com/mozilla/Fira/blob/master/LICENSE).
mkdir -p assets/fonts
wget https://github.com/mozilla/Fira/raw/master/ttf/FiraSans-Medium.ttf -O assets/fonts/FiraSans-Medium.ttfNext, you are ready to spawn a text in your scene at a system:
First, load a font asset:
```rust
let font: Handle = asset_server.load("fonts/FiraSans-Medium.ttf#mesh");
```Then, spawn a textmesh bundle:
```rust
commands.spawn(TextMeshBundle {
text_mesh: TextMesh::new_with_color("Hello Bevy", font, Color::rgb(1., 1., 0.)),
transform: Transform::from_xyz(-1., 1.75, 0.),
..Default::default()
});
```Or with expanded syntax:
```rust
commands.spawn(TextMeshBundle {
text_mesh: TextMesh {
text: String::from("Hello Bevy!"),
style: TextMeshStyle {
font,
font_size: SizeUnit::NonStandard(36.),
color: Color::rgb(1.0, 1.0, 0.0),
font_style: FontStyle::UPPERCASE, // only UPPERCASE & LOWERCASE implemented currently
mesh_quality: Quality::Low,
..Default::default()
},
alignment: TextMeshAlignment {
vertical: VerticalAlign::Top, // FUNCTIONALITY NOT IMPLEMENTED YET - NO EFFECT
horizontal: HorizontalAlign::Left, // FUNCTIONALITY NOT IMPLEMENTED YET - NO EFFECT
..Default::default()
},
size: TextMeshSize {
width: SizeUnit::NonStandard(135.), // partially implemented
height: SizeUnit::NonStandard(50.), // partially implemented
depth: Some(SizeUnit::NonStandard(50.0)), // must be > 0 currently, 2d mesh not supported yet
wrapping: true, // partially implemented
overflow: false, // NOT IMPLEMENTED YET
..Default::default()
},
..Default::default()
},
transform: Transform {
translation: Vec3::new(-1., 1.75, 0.),
..Default::default()
},
..Default::default()
});
```## License
Licensed under MIT license
### Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the software by you, shall be licensed as above, without any additional terms or conditions.