Skip to content
Snippets Groups Projects
mod.rs 3.95 KiB
Newer Older
TheRawMeatball's avatar
TheRawMeatball committed
use crate::{BevyContext, FontMapping, ImageManager};
StarArawn's avatar
StarArawn committed
use bevy::{
TheRawMeatball's avatar
TheRawMeatball committed
    math::Vec2,
    prelude::{Assets, Commands, Plugin, Res},
StarToaster's avatar
StarToaster committed
    render::{color::Color, texture::Image, Extract, RenderApp, RenderStage},
TheRawMeatball's avatar
TheRawMeatball committed
    sprite::Rect,
    window::Windows,
StarArawn's avatar
StarArawn committed
};
TheRawMeatball's avatar
TheRawMeatball committed
use bevy_kayak_renderer::{
    render::unified::pipeline::{ExtractQuadBundle, ExtractedQuad, UIQuadType},
    Corner,
StarArawn's avatar
StarArawn committed
};
TheRawMeatball's avatar
TheRawMeatball committed
use kayak_core::render_primitive::RenderPrimitive;
use kayak_font::KayakFont;
StarArawn's avatar
StarArawn committed

TheRawMeatball's avatar
TheRawMeatball committed
pub mod font;
pub mod image;
mod nine_patch;
mod quad;
StarToaster's avatar
StarToaster committed
mod texture_atlas;
StarArawn's avatar
StarArawn committed

TheRawMeatball's avatar
TheRawMeatball committed
pub struct BevyKayakUIExtractPlugin;
StarArawn's avatar
StarArawn committed

TheRawMeatball's avatar
TheRawMeatball committed
impl Plugin for BevyKayakUIExtractPlugin {
    fn build(&self, app: &mut bevy::prelude::App) {
        app.add_plugin(font::TextRendererPlugin)
            .add_plugin(image::ImageRendererPlugin);
StarArawn's avatar
StarArawn committed

TheRawMeatball's avatar
TheRawMeatball committed
        let render_app = app.sub_app_mut(RenderApp);
        render_app.add_system_to_stage(RenderStage::Extract, extract);
StarArawn's avatar
StarArawn committed
    }
}

TheRawMeatball's avatar
TheRawMeatball committed
pub fn extract(
    mut commands: Commands,
StarToaster's avatar
StarToaster committed
    context: Extract<Option<Res<BevyContext>>>,
    fonts: Extract<Res<Assets<KayakFont>>>,
    font_mapping: Extract<Res<FontMapping>>,
    image_manager: Extract<Res<ImageManager>>,
    images: Extract<Res<Assets<Image>>>,
    windows: Extract<Res<Windows>>,
TheRawMeatball's avatar
TheRawMeatball committed
) {
    if context.is_none() {
        return;
    }
StarArawn's avatar
StarArawn committed

StarToaster's avatar
StarToaster committed
    let context = context.as_ref().unwrap();
StarArawn's avatar
StarArawn committed

TheRawMeatball's avatar
TheRawMeatball committed
    let render_primitives = if let Ok(context) = context.kayak_context.read() {
        context.widget_manager.build_render_primitives()
    } else {
        vec![]
    };
StarArawn's avatar
StarArawn committed

TheRawMeatball's avatar
TheRawMeatball committed
    // dbg!(&render_primitives);
StarArawn's avatar
StarArawn committed

TheRawMeatball's avatar
TheRawMeatball committed
    let dpi = if let Some(window) = windows.get_primary() {
        window.scale_factor() as f32
    } else {
        1.0
    };
StarArawn's avatar
StarArawn committed

TheRawMeatball's avatar
TheRawMeatball committed
    let mut extracted_quads = Vec::new();
    for render_primitive in render_primitives {
        match render_primitive {
            RenderPrimitive::Text { .. } => {
                let text_quads = font::extract_texts(&render_primitive, &fonts, &font_mapping, dpi);
                extracted_quads.extend(text_quads);
            }
            RenderPrimitive::Image { .. } => {
                let image_quads = image::extract_images(&render_primitive, &image_manager, dpi);
                extracted_quads.extend(image_quads);
            }
            RenderPrimitive::Quad { .. } => {
                let quad_quads = quad::extract_quads(&render_primitive, 1.0);
                extracted_quads.extend(quad_quads);
            }
            RenderPrimitive::NinePatch { .. } => {
                let nine_patch_quads =
                    nine_patch::extract_nine_patch(&render_primitive, &image_manager, &images, dpi);
                extracted_quads.extend(nine_patch_quads);
            }
Matthew's avatar
Matthew committed
            RenderPrimitive::TextureAtlas { .. } => {
StarToaster's avatar
StarToaster committed
                let texture_atlas_quads = texture_atlas::extract_texture_atlas(
                    &render_primitive,
                    &image_manager,
                    &images,
                    dpi,
                );
Matthew's avatar
Matthew committed
                extracted_quads.extend(texture_atlas_quads);
            }
TheRawMeatball's avatar
TheRawMeatball committed
            RenderPrimitive::Clip { layout } => {
                extracted_quads.push(ExtractQuadBundle {
                    extracted_quad: ExtractedQuad {
                        rect: Rect {
                            min: Vec2::new(layout.posx, layout.posy) * dpi,
                            max: Vec2::new(layout.posx + layout.width, layout.posy + layout.height)
                                * dpi,
                        },
                        color: Color::default(),
                        vertex_index: 0,
                        char_id: 0,
                        z_index: layout.z_index,
                        font_handle: None,
                        quad_type: UIQuadType::Clip,
                        type_index: 0,
                        border_radius: Corner::default(),
                        image: None,
                        uv_min: None,
                        uv_max: None,
                    },
                });
            }
            _ => {}
StarArawn's avatar
StarArawn committed
        }
    }
TheRawMeatball's avatar
TheRawMeatball committed

    commands.spawn_batch(extracted_quads);
StarArawn's avatar
StarArawn committed
}