use bevy::prelude::*;
use glyph_brush_layout::{HorizontalAlign, VerticalAlign};
use crate::{mesh_system::TextMeshState, TextMeshFont};
pub use ttf2mesh::Quality;
#[derive(Default, Bundle, Debug)]
pub struct TextMeshBundle {
pub text_mesh: TextMesh,
pub transform: Transform,
pub global_transform: GlobalTransform,
pub text_mesh_state: TextMeshState,
}
#[derive(Debug, Component)]
pub struct TextMesh {
pub text: String,
pub style: TextMeshStyle,
pub alignment: TextMeshAlignment,
pub size: TextMeshSize,
}
impl Default for TextMesh {
fn default() -> Self {
Self {
text: "Hello World".into(),
size: TextMeshSize::default(),
style: TextMeshStyle::default(),
alignment: Default::default(),
}
}
}
impl TextMesh {
pub fn new<T: ToString>(text: T, font: Handle<TextMeshFont>) -> Self {
Self {
text: text.to_string(),
style: TextMeshStyle {
font,
..Default::default()
},
..Default::default()
}
}
#[allow(dead_code)]
pub(crate) fn new_no_font<T: ToString>(text: T) -> Self {
Self {
text: text.to_string(),
..Default::default()
}
}
pub fn new_with_color<T: ToString>(text: T, font: Handle<TextMeshFont>, color: Color) -> Self {
Self {
text: text.to_string(),
style: TextMeshStyle {
color,
font,
..Default::default()
},
..Default::default()
}
}
}
const DEFAULT_FONT_SIZE: f32 = 36.;
#[derive(Clone, Debug)]
pub struct TextMeshSize {
pub width: SizeUnit,
pub height: SizeUnit,
pub depth: Option<SizeUnit>,
pub wrapping: bool,
pub overflow: bool,
}
impl Default for TextMeshSize {
fn default() -> Self {
Self {
width: SizeUnit::NonStandard(DEFAULT_FONT_SIZE * 10.),
height: SizeUnit::NonStandard(DEFAULT_FONT_SIZE * 5.),
depth: Some(SizeUnit::NonStandard(DEFAULT_FONT_SIZE * 0.10)),
wrapping: true,
overflow: false,
}
}
}
#[derive(Clone, Debug)]
pub struct TextMeshStyle {
pub font: Handle<TextMeshFont>,
pub font_size: SizeUnit,
pub font_style: FontStyle,
pub color: Color,
pub mesh_quality: Quality,
}
impl Default for TextMeshStyle {
fn default() -> Self {
Self {
font: Default::default(),
font_size: SizeUnit::NonStandard(DEFAULT_FONT_SIZE),
font_style: FontStyle::default(),
color: Color::WHITE,
mesh_quality: Quality::Medium,
}
}
}
#[derive(Debug, Clone)]
pub enum SizeUnit {
Auto,
NonStandard(f32),
}
impl SizeUnit {
pub fn as_scalar(&self) -> Option<f32> {
match self {
SizeUnit::Auto => None,
SizeUnit::NonStandard(size) => Some(size / 72.),
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct TextMeshAlignment {
pub vertical: VerticalAlign,
pub horizontal: HorizontalAlign,
}
impl Default for TextMeshAlignment {
fn default() -> Self {
TextMeshAlignment {
vertical: VerticalAlign::Top,
horizontal: HorizontalAlign::Left,
}
}
}
bitflags! {
#[derive(Clone, Debug)]
pub struct FontStyle: u32 {
const BOLD = 0b1; const ITALIC = 0b10; const UNDERLINE = 0b100; const STRIKETHROUGH = 0b1000; const LOWERCASE = 0b10000;
const UPPERCASE = 0b100000;
}
}
impl Default for FontStyle {
fn default() -> Self {
FontStyle::empty()
}
}