Skip to content
Snippets Groups Projects
extract.rs 2.02 KiB
Newer Older
StarToaster's avatar
StarToaster committed
use crate::{
    render::unified::pipeline::{ExtractQuadBundle, ExtractedQuad, UIQuadType},
    render_primitive::RenderPrimitive,
    styles::Corner,
};
Matthew's avatar
Matthew committed
use bevy::{
    math::Vec2,
John Mitchell's avatar
John Mitchell committed
    prelude::{Assets, Entity, Rect, Res},
Matthew's avatar
Matthew committed
    render::{color::Color, texture::Image},
};

pub fn extract_texture_atlas(
    camera_entity: Entity,
Matthew's avatar
Matthew committed
    render_primitive: &RenderPrimitive,
    images: &Res<Assets<Image>>,
    dpi: f32,
) -> Vec<ExtractQuadBundle> {
    let mut extracted_quads = Vec::new();

    let (size, position, layout, handle) = match render_primitive {
        RenderPrimitive::TextureAtlas {
StarToaster's avatar
StarToaster committed
            size,
            position,
Matthew's avatar
Matthew committed
            layout,
            handle,
        } => (size, position, layout, handle),
        _ => panic!(""),
    };

Matthew's avatar
Matthew committed

    if image.is_none() {
        return vec![];
    }

StarToaster's avatar
StarToaster committed
    let image_size = image
        .map(|i| {
            Vec2::new(
Matthew's avatar
Matthew committed
                i.texture_descriptor.size.width as f32,
                i.texture_descriptor.size.height as f32,
Matthew's avatar
Matthew committed

    let quad = ExtractQuadBundle {
        extracted_quad: ExtractedQuad {
            camera_entity,
Matthew's avatar
Matthew committed
            rect: Rect {
                min: Vec2::new(layout.posx, layout.posy),
                max: Vec2::new(layout.posx + layout.width, layout.posy + layout.height),
            },
            uv_min: Some(Vec2::new(
StarToaster's avatar
StarToaster committed
                position.x / image_size.x,
                1.0 - ((position.y + size.y) / image_size.y),
Matthew's avatar
Matthew committed
            )),
            uv_max: Some(Vec2::new(
StarToaster's avatar
StarToaster committed
                (position.x + size.x) / image_size.x,
                1.0 - (position.y / image_size.y),
Matthew's avatar
Matthew committed
            )),
StarToaster's avatar
StarToaster committed
            color: Color::WHITE,
            vertex_index: 0,
            char_id: 0,
            z_index: layout.z_index,
            font_handle: None,
            quad_type: UIQuadType::Image,
            type_index: 0,
            border_radius: Corner::default(),
StarToaster's avatar
StarToaster committed
            image: Some(handle.clone_weak()),
Matthew's avatar
Matthew committed
        },
    };
    extracted_quads.push(quad);

    extracted_quads
}