use bevy::prelude::*;
use bevy_fontmesh::{FontMeshPlugin, TextAnchor, TextMesh, TextMeshStyle};
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugins(FontMeshPlugin::<StandardMaterial>::default())
.add_systems(Startup, setup)
.run();
}
fn setup(
mut commands: Commands,
asset_server: Res<AssetServer>,
mut materials: ResMut<Assets<StandardMaterial>>,
mut meshes: ResMut<Assets<Mesh>>,
) {
commands
.spawn(Camera3d::default())
.insert(Transform::from_xyz(0.0, 5.0, 15.0).looking_at(Vec3::ZERO, Vec3::Y));
commands
.spawn(PointLight {
intensity: 1500.0,
shadow_maps_enabled: true,
..default()
})
.insert(Transform::from_xyz(4.0, 8.0, 4.0));
let font = asset_server.load("fonts/FiraMono-Medium.ttf");
let base_material = MeshMaterial3d(materials.add(StandardMaterial {
base_color: Color::WHITE,
perceptual_roughness: 0.1,
double_sided: true,
cull_mode: None,
..default()
}));
let pivot_mesh = meshes.add(Sphere::new(0.1));
let pivot_mat = MeshMaterial3d(materials.add(StandardMaterial {
base_color: Color::srgb(1.0, 0.0, 0.0), unlit: true,
..default()
}));
let mut spawn_example = |text: &str, anchor: TextAnchor, pos: Vec3| {
commands.spawn((
TextMesh {
text: text.to_string(),
font: font.clone(),
style: TextMeshStyle {
depth: 0.1,
subdivision: 20,
anchor,
..default()
},
},
base_material.clone(),
Transform::from_translation(pos),
));
commands.spawn((
Mesh3d(pivot_mesh.clone()),
pivot_mat.clone(),
Transform::from_translation(pos),
));
};
spawn_example(
"Hello\nWorld",
TextAnchor::TopLeft,
Vec3::new(-10.0, 1.3, 0.0),
);
spawn_example("Hello\nWorld", TextAnchor::Center, Vec3::new(0.0, 2.5, 0.0));
spawn_example(
"Hello\nWorld",
TextAnchor::BottomRight,
Vec3::new(10.0, 3.7, 0.0),
);
spawn_example(
"Hello\nfrom\nFontMesh",
TextAnchor::Center,
Vec3::new(0.0, -4.0, 0.0),
);
}