Skip to content
Snippets Groups Projects
extract.rs 2.02 KiB
Newer Older
StarArawn's avatar
StarArawn committed
use bevy::{
    math::Vec2,
StarToaster's avatar
StarToaster committed
    prelude::{Assets, Rect, Res},
StarArawn's avatar
StarArawn committed
};
Gino Valente's avatar
Gino Valente committed
use kayak_font::KayakFont;
StarArawn's avatar
StarArawn committed

StarToaster's avatar
StarToaster committed
use crate::{
StarArawn's avatar
StarArawn committed
    render::unified::pipeline::{ExtractQuadBundle, ExtractedQuad, UIQuadType},
StarToaster's avatar
StarToaster committed
    render_primitive::RenderPrimitive,
    styles::Corner,
StarArawn's avatar
StarArawn committed
};

use super::font_mapping::FontMapping;
StarArawn's avatar
StarArawn committed

pub fn extract_texts(
    render_primitive: &RenderPrimitive,
    fonts: &Res<Assets<KayakFont>>,
    font_mapping: &Res<FontMapping>,
StarArawn's avatar
StarArawn committed
    _dpi: f32,
) -> Vec<ExtractQuadBundle> {
StarArawn's avatar
StarArawn committed
    let mut extracted_texts = Vec::new();
Gino Valente's avatar
Gino Valente committed
    let (background_color, text_layout, layout, font, properties) = match render_primitive {
        RenderPrimitive::Text {
            color,
            text_layout,
            layout,
            font,
            properties,
            ..
        } => (color, text_layout, layout, font, *properties),
        _ => panic!(""),
    };
StarArawn's avatar
StarArawn committed

StarArawn's avatar
StarArawn committed
    let font_handle = font_mapping.get_handle(font.clone()).unwrap();
StarToaster's avatar
StarToaster committed
    let font = match fonts.get(&font_handle) {
        Some(font) => font,
StarToaster's avatar
StarToaster committed
        None => {
            return Vec::new();
        }
    let base_position = Vec2::new(layout.posx, layout.posy + properties.font_size);

    for glyph_rect in text_layout.glyphs() {
        let mut position = Vec2::from(glyph_rect.position);
        position += base_position;

        let size = Vec2::from(glyph_rect.size);

        extracted_texts.push(ExtractQuadBundle {
            extracted_quad: ExtractedQuad {
                font_handle: Some(font_handle.clone()),
                rect: Rect {
                    min: position,
                    max: position + size,
StarToaster's avatar
StarToaster committed
                color: *background_color,
                char_id: font.get_char_id(glyph_rect.content).unwrap(),
                z_index: layout.z_index,
                quad_type: UIQuadType::Text,
                type_index: 0,
MrGVSV's avatar
MrGVSV committed
                border_radius: Corner::default(),
                image: None,
                uv_max: None,
                uv_min: None,
            },
        });
StarArawn's avatar
StarArawn committed
    }
StarArawn's avatar
StarArawn committed
}