use bevy::prelude::*;
use bevy::sprite_render::AlphaMode2d;
use bevy_rich_text3d::{Text3d, TextAtlas};
#[derive(Component)]
pub(crate) struct NeedsGlyphRefresh;
#[derive(Component)]
pub(crate) struct NeedsTextMaterial;
pub(crate) fn refresh_text_glyphs_system(
mut commands: Commands,
mut text_query: Query<(Entity, &mut Text3d), Added<NeedsGlyphRefresh>>,
) {
for (entity, mut text) in text_query.iter_mut() {
if let Some(s) = text.get_single_mut() {
let current = s.clone();
s.clear();
*s = current;
}
commands.entity(entity).remove::<NeedsGlyphRefresh>();
debug!("Refreshed glyphs for text entity {:?}", entity);
}
}
pub(crate) fn assign_text_material_system(
mut commands: Commands,
mut color_materials: ResMut<Assets<ColorMaterial>>,
text_query: Query<Entity, (With<Text3d>, With<NeedsTextMaterial>)>,
) {
for entity in text_query.iter() {
let mat = color_materials.add(ColorMaterial {
texture: Some(TextAtlas::DEFAULT_IMAGE.clone()),
alpha_mode: AlphaMode2d::Blend,
..Default::default()
});
commands
.entity(entity)
.insert(MeshMaterial2d(mat))
.remove::<NeedsTextMaterial>();
debug!("Assigned text material to entity {:?}", entity);
}
}
type TextMeshQuery<'w, 's> =
Query<'w, 's, (&'static Mesh2d, &'static mut Visibility), (With<Text3d>, Changed<Mesh2d>)>;
pub(crate) fn show_text_when_ready_system(mut text_query: TextMeshQuery) {
for (mesh, mut visibility) in text_query.iter_mut() {
if mesh.0 != Handle::default() && *visibility == Visibility::Hidden {
*visibility = Visibility::Inherited;
}
}
}