bevy_vello 0.13.1

Render assets and scenes in Bevy with Vello
use bevy::{
    prelude::*,
    render::{Render, RenderApp, RenderSystems},
};

use super::{VelloSvg, VelloSvgAnchor, asset_loader::VelloSvgLoader, render};
use crate::{
    integrations::svg::{UiVelloSvg, VelloSvg2d, systems},
    render::extract::VelloExtractStep,
};

pub struct SvgIntegrationPlugin;

impl Plugin for SvgIntegrationPlugin {
    fn build(&self, app: &mut App) {
        #[cfg(feature = "picking")]
        app.add_plugins(crate::picking::WorldPickingPlugin::<VelloSvg2d>::default());

        app.init_asset_loader::<VelloSvgLoader>()
            .init_asset::<VelloSvg>()
            .register_type::<UiVelloSvg>()
            .register_type::<VelloSvg2d>()
            .register_type::<VelloSvgAnchor>()
            .add_systems(
                PostUpdate,
                (
                    (
                        systems::update_svg_2d_aabb_on_asset_load,
                        systems::update_svg_2d_aabb_on_change,
                    )
                        .in_set(bevy::camera::visibility::VisibilitySystems::CalculateBounds),
                    systems::update_ui_svg_content_size_on_change
                        .in_set(bevy::ui::UiSystems::Content),
                ),
            );

        let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
            return;
        };

        render_app
            .add_systems(
                ExtractSchedule,
                (
                    render::extract_world_svg_assets,
                    render::extract_ui_svg_assets,
                )
                    .in_set(VelloExtractStep::ExtractAssets),
            )
            .add_systems(
                Render,
                (render::prepare_asset_affines).in_set(RenderSystems::Prepare),
            );
    }
}