bevy_feronia 0.8.2

Foliage/grass scattering tools and wind simulation shaders/materials that prioritize visual fidelity/artistic freedom, a declarative api and modularity.
Documentation
use crate::core::events::SpawnScatterAssets;
use crate::prelude::*;
use crate::scatter::events::ScatterResults;
use bevy_ecs::prelude::*;

#[cfg(feature = "trace")]
use tracing::debug;

pub fn scatter_observer<T>(
    trigger: On<ScatterResults<T>>,
    q_layer: Query<&ScatterLayer, With<ScatterLayerType<T>>>,
    q_items: Query<&ScatterItemAsset<T>, With<ScatterItem>>,
    mut queue: ResMut<SpawnScatterAssetsEventQueue<T>>,
) where
    T: ScatterMaterial,
{
    let layer = trigger.layer;
    let Ok(scatter_items) = q_layer.get(layer) else {
        #[cfg(feature = "trace")]
        debug!("ScatterLayer {layer} not found!");
        return;
    };

    #[cfg(feature = "trace")]
    debug!("ScatterObserver triggered! Queueing Spawn Messages for layer {layer}...");

    (**queue).push_back(
        SpawnScatterAssets::<T>::from(trigger).with_items(
            scatter_items
                .iter()
                .filter_map(|e| q_items.get(e).ok().cloned()),
        ),
    );
}