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::prelude::*;
use bevy_color::palettes::css::{PURPLE, RED};
use bevy_ecs::prelude::*;
use bevy_gizmos::prelude::*;
use bevy_math::*;
use bevy_transform::prelude::*;
use std::f32::consts::{FRAC_PI_2, FRAC_PI_8};

pub fn show_aabb_gizmos(
    mut cmd: Commands,
    q: Query<Entity, Without<ShowAabbGizmo>>,
    cfg: Res<ChunkDebugConfig>,
) {
    for e in &q {
        cmd.entity(e).insert(ShowAabbGizmo {
            color: cfg.aabb_color.into(),
        });
    }
}

pub fn hide_aabb_gizmos(mut cmd: Commands, q: Query<Entity, With<ShowAabbGizmo>>) {
    for e in &q {
        cmd.entity(e).remove::<ShowAabbGizmo>();
    }
}

pub fn draw_chunks(
    mut gizmos: Gizmos,
    q: Query<(&ChunkSize, &ChunkLevel, &GlobalTransform, &ChunkOf), With<Chunk>>,
    q_chunk_config: Query<&BaseChunkSize, With<ChunkLodConfig>>,
    debug_cfg: Res<ChunkDebugConfig>,
) {
    for (chunk_size, chunk_level, tf, root_chunk) in &q {
        let base_chunk_size = q_chunk_config.get(**root_chunk).unwrap();
        gizmos.cube(
            Transform::from_translation(tf.translation())
                .with_rotation(tf.rotation())
                .with_scale(**chunk_size as f32 * **base_chunk_size),
            debug_cfg.lod_colors[**chunk_level as usize],
        );
    }
}

pub fn draw_lod_ranges(
    mut gizmos: Gizmos,
    q_center: Query<&GlobalTransform, With<Center>>,
    q_root_config: Query<(&LodConfig, &ChunkLodConfig)>,
) {
    let Ok(center_tf) = q_center.single() else {
        return;
    };
    let center_pos = center_tf.translation();

    let Ok((lod_config, chunk_lod_config)) = q_root_config.single() else {
        return;
    };

    for (i, dist) in lod_config
        .distance
        .iter()
        .map(|d| **d)
        .take_while(|d| *d < f32::MAX)
        .enumerate()
    {
        gizmos.sphere(
            Isometry3d {
                translation: center_pos.into(),
                rotation: Quat::from_rotation_x(FRAC_PI_2)
                    * Quat::from_rotation_z(FRAC_PI_8)
                    * Quat::from_rotation_z(FRAC_PI_8 * 0.2 * i as f32),
            },
            dist,
            PURPLE,
        );
    }

    for (i, dist) in chunk_lod_config
        .0
        .iter()
        .map(|d| **d)
        .take_while(|d| *d < f32::MAX)
        .enumerate()
    {
        gizmos.sphere(
            Isometry3d {
                translation: center_pos.into(),
                rotation: Quat::from_rotation_x(FRAC_PI_2)
                    * Quat::from_rotation_z(FRAC_PI_8 * 0.2 * i as f32),
            },
            dist,
            RED,
        );
    }
}