bevy_sprinkles_editor 0.1.2

GPU particle system editor for Bevy
use bevy::prelude::*;
use bevy_sprinkles::prelude::*;

use crate::ui::widgets::inspector_field::InspectorFieldProps;
use crate::ui::widgets::variant_edit::{VariantDefinition, VariantEditProps};
use crate::ui::widgets::vector_edit::VectorSuffixes;

use super::utils::{VariantConfig, variants_from_reflect};
use super::{InspectorItem, InspectorSection, inspector_section};
use crate::ui::icons::{
    ICON_CUBE, ICON_EMPTY_AXIS, ICON_MESH_TORUS, ICON_MESH_UVSPHERE, ICON_SPHERE,
};

pub fn plugin(_app: &mut App) {}

pub fn emission_section(asset_server: &AssetServer) -> impl Bundle {
    inspector_section(
        InspectorSection::new(
            "Emission",
            vec![
                vec![
                    InspectorFieldProps::new("emission.offset")
                        .vector(VectorSuffixes::XYZ)
                        .into(),
                ],
                vec![
                    InspectorFieldProps::new("emission.scale")
                        .vector(VectorSuffixes::XYZ)
                        .into(),
                ],
                vec![InspectorItem::Variant {
                    path: "emission.shape".into(),
                    props: VariantEditProps::new("emission.shape")
                        .with_variants(emission_shape_variants()),
                }],
                vec![
                    InspectorFieldProps::new("emission.particles_amount")
                        .u32()
                        .into(),
                ],
            ],
        ),
        asset_server,
    )
}

fn emission_shape_variants() -> Vec<VariantDefinition> {
    variants_from_reflect::<EmissionShape>(&[
        (
            "Point",
            VariantConfig::default()
                .icon(ICON_EMPTY_AXIS)
                .default_value(EmissionShape::Point),
        ),
        (
            "Sphere",
            VariantConfig::default()
                .icon(ICON_SPHERE)
                .default_value(EmissionShape::Sphere { radius: 1.0 }),
        ),
        (
            "SphereSurface",
            VariantConfig::default()
                .icon(ICON_MESH_UVSPHERE)
                .default_value(EmissionShape::SphereSurface { radius: 1.0 }),
        ),
        (
            "Box",
            VariantConfig::default()
                .icon(ICON_CUBE)
                .default_value(EmissionShape::Box { extents: Vec3::ONE }),
        ),
        (
            "Ring",
            VariantConfig::default()
                .icon(ICON_MESH_TORUS)
                .override_rows(vec![
                    vec!["axis"],
                    vec!["height"],
                    vec!["radius", "inner_radius"],
                ])
                .default_value(EmissionShape::Ring {
                    axis: Vec3::Y,
                    height: 0.0,
                    radius: 1.0,
                    inner_radius: 0.0,
                }),
        ),
    ])
}