/bevy_procedural_grass

A bevy plugin for rendering grass

Primary LanguageRustApache License 2.0Apache-2.0

bevy_procedural_grass

crates.io Doc

A plugin for bevy 0.12 that generates grass on top of any mesh.

bevy_procedural_grass

Usage

Add bevy_procedural_grass dependency to Cargo.toml:

[dependencies]
bevy_procedural_grass = "0.2.0"

Generate grass on top of entity:

use bevy::prelude::*;
use bevy_procedural_grass::prelude::*;

fn main() {
    App::new()
        .add_plugins((
            DefaultPlugins,
            ProceduralGrassPlugin::default(), // add grass plugin
        ))
        .add_systems(Startup, setup)
        .run();
}

fn setup(
    mut commands: Commands,
    mut meshes: ResMut<Assets<Mesh>>,
) {
    let plane = commands.spawn(
        PbrBundle {
            mesh: meshes.add(Mesh::from(shape::Plane::default())),
            ..default()
        }, 
    ).id();

    // spawn grass
    commands.spawn(GrassBundle {
        mesh: meshes.add(GrassMesh::mesh(7)), // how many segments you want in the mesh (no. of verts = segments * 2 + 1)
        grass: Grass {
            entity: Some(plane.clone()), // set entity that grass will generate on top of.
            ..default()
        },
        lod: GrassLODMesh::new(meshes.add(GrassMesh::mesh(3))), // optional: enables LOD
        ..default()
    });

    // create object that displaces grass
    commands.spawn((
        PbrBundle {
            mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })),
            material: materials.add(StandardMaterial::from(Color::WHITE)),
            ..default()
        },
    ));
}

Features

  • Grass positions generated based of mesh
  • Wind Animation
  • Lighting/Shadows for directional lights
  • GPU Instancing
  • Frustum/Distance Culling
  • LOD

TODO

  • Lighting for point and spot lights (Currently only supports directional lights).
  • Improve Animation.
  • Grass Clumping for less uniform grass generation.
  • Grass Interaction, allow grass to move out of the way of other entites.
  • Density Map.
  • Compute Shaders, use compute shaders to generate grass instance data each frame to optimize memory usage.

Resources