#terrain #bevy #component #entities #systems #heightmap #game-engine

bevy_mesh_terrain

A simple and ergonomic heightmap terrain plugin for Bevy game engine

24 releases (5 breaking)

new 0.13.18 Apr 25, 2024
0.13.14 Mar 27, 2024
0.3.4 Sep 19, 2023

#302 in Game dev

Download history 10/week @ 2024-01-27 137/week @ 2024-02-10 90/week @ 2024-02-17 267/week @ 2024-02-24 121/week @ 2024-03-02 774/week @ 2024-03-09 136/week @ 2024-03-16 451/week @ 2024-03-23 197/week @ 2024-03-30 32/week @ 2024-04-06 161/week @ 2024-04-13 118/week @ 2024-04-20

514 downloads per month

MIT license

135KB
2K SLoC

Bevy Mesh Terrain

Installing

cargo add bevy_mesh_terrain 

Bevy Versions

Terrain 0.6.x -> Bevy 0.12.x

Terrain 0.13.x -> Bevy 0.13.x

Run example

cargo run --example basic

Description

A very bevy-centric terrain plugin that takes advantage of entities, components and systems as much as possible to be as easy to understand and interact with as possible.

You spawn an entity and give it the 'TerrainConfig' and 'TerrainData' components, and then the plugin systems will spawn child entities which are each of the rendered chunks. In this way, it works similarly to a voxel chunking system ( a la minecraft) except using heightfields (2d) instead of voxels (3d).

image

Texture Types

Height Map Texture The source of height ! This is a grayscale image in R16 format and if values are totally dead black then the shader will actually make alpha == 1 right there so you can blow holes in the terrain for caves and such (youll prob want to put rock doodads there to make it look nice!)

Color/Diffuse Texture Array This is the source of the actual terrain textures. Up to 256 textures can be loaded in and painted with the splat map. So for example, grass, dirt, snow, and sand. You can edit that file of course for different looks.

Splat Map Texture This is an RGBA control map texture for the diffuse texture array using a special data protocol. This is what you edit in a 'terrain editor' to paint your grass in one area, dirt in another area, snow on mountains, etc.

Splat Map Texture Protocol

The splat map now supports up to 255 textures in a single material by using inspiration from 'Microsplat' documentation. The limitation is that only 2 textures can be blended together at any given pixel.

Splat map R channel - A float from 0.0 to 255.0 which is converted to an integer from 0-254 to specify the texture (of the 255) to use for this pixel on layer 0 Splat map G channel - A float from 0.0 to 255.0 which is converted to an integer from 0-254 to specify the texture (of the 255) to use for this pixel on layer 1 Splat map B channel - A float which is used to specify how much of the R channel layer to use here (0.0) versus how much of the G channel layer to use here (1.0). Splat map A channel - not used.

Sample textures

Sample textures from Lynoc (itch.io)

Reference Shader Material

see https://github.com/bevyengine/bevy/blob/main/examples/shader/shader_material.rs

Editor (WIP)

https://github.com/ethereumdegen/bevy_mesh_terrain_editor

Dependencies

~52–92MB
~1.5M SLoC