bevy_sprinkles_editor 0.3.0

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};
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() -> (impl Bundle, InspectorSection) {
    (
        (),
        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(),
                ],
            ],
        ),
    )
}

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::default_sphere()),
        ),
        (
            "SphereSurface",
            VariantConfig::default()
                .icon(ICON_MESH_UVSPHERE)
                .default_value(EmissionShape::default_sphere_surface()),
        ),
        (
            "Box",
            VariantConfig::default()
                .icon(ICON_CUBE)
                .default_value(EmissionShape::default_box()),
        ),
        (
            "Ring",
            VariantConfig::default()
                .icon(ICON_MESH_TORUS)
                .override_rows(vec![
                    vec!["axis"],
                    vec!["height"],
                    vec!["radius", "inner_radius"],
                ])
                .default_value(EmissionShape::default_ring()),
        ),
    ])
}