Skip to content
Snippets Groups Projects
extract.rs 2.33 KiB
Newer Older
StarArawn's avatar
StarArawn committed
use bevy::{
    math::Vec2,
John Mitchell's avatar
John Mitchell committed
    prelude::{Assets, Entity, 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(
    camera_entity: Entity,
    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();
    let (background_color, text_layout, layout, font, properties, subpixel) = match render_primitive
    {
Gino Valente's avatar
Gino Valente committed
        RenderPrimitive::Text {
            color,
            text_layout,
            layout,
            font,
            properties,
Gino Valente's avatar
Gino Valente committed
            ..
        } => (color, text_layout, layout, font, *properties, subpixel),
Gino Valente's avatar
Gino Valente committed
        _ => 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 forced = font_mapping.get_subpixel_forced(&font_handle);

    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 {
                camera_entity,
                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: if *subpixel || forced {
                    UIQuadType::TextSubpixel
                } else {
                    UIQuadType::Text
                },
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
}