Biome System Upgrades
intermediate featureVoxel Play 4 upgrades the biome system with 3-axis selection (altitude + moisture + temperature), per-biome shore voxels, and tighter integration with the 3D Terrain Graph via the Climate Map node.
BiomeZone and 3-Axis Selection
Each BiomeDefinition contains an array of BiomeZone entries. A BiomeZone defines a region in climate space where the biome applies:
| Axis | Fields | Range |
|---|---|---|
| Altitude | altitudeMin, altitudeMax | World units (e.g. -500 to 500) |
| Moisture | moistureMin, moistureMax | 0 to 1 (normalized) |
| Temperature | temperatureMin, temperatureMax | 0 to 1 (normalized, VP4 only) |
A position matches a biome when all three axes fall within the zone's ranges. Temperature is backward-compatible: zones where both temperature values are 0 ignore the temperature axis entirely, so existing VP3 biomes work without changes.
How Temperature Works
Temperature is not a built-in world property. It comes from the terrain graph: connect a noise node to the Climate Map's third input (Temperature). This could represent anything - actual temperature, distance from equator, elevation-based climate, or any other value you design.
Without a temperature input connected, biome selection works exactly as in VP3 (altitude + moisture only).
Per-Biome Voxel Fields
VP4 adds new per-biome voxel customization fields on BiomeDefinition:
| Field | VP3 | VP4 | Description |
|---|---|---|---|
voxelTop | Yes | Yes | Surface voxel (e.g. grass, sand) |
voxelDirt | Yes | Yes | Underground voxel (e.g. dirt, stone) |
voxelShore | - | New | Shore voxel for surfaces adjacent to water. Allows per-biome beach materials (sand for deserts, gravel for mountains). |
voxelLakeBed | - | New | Underwater floor voxel, distinct from underground dirt |
voxelWater | - | New | Water voxel override per biome (e.g. murky water in swamps) |
Climate Map Node
The Climate Map node in the 3D Terrain Graph performs biome lookup at generation time. It takes three inputs:
- Altitude (0-1): typically from a height calculation or World Y node
- Moisture (0-1): from a 2D noise node representing humidity
- Temperature (0-1, optional): from any noise or calculation node
The node provides dedicated Voxel, Vegetation, Tree and Water output ports, each returning a biome index (0..N) into the World Definition's biome array. Connect each to the matching terminal (Voxel ID, Vegetation ID, Tree ID, Water ID) to drive per-biome block selection, plant placement, tree generation and water placement.
Biome Transitions (Biome Blend)
By default, biome borders in the 3D Terrain Graph are a hard cut: each column belongs to a single biome. The Climate Map node's Biome Blend parameter softens these borders. When greater than 0, the climate inputs (altitude, moisture, temperature) are jittered by a small per-position random amount scaled by this value, so neighboring biomes interleave in a dithered band at their edges. 0 = off (hard borders); typical values are 0.02 - 0.08.
Biome Mixing (Classic Generator)
Worlds built with the classic generator (2D heightmap, not the 3D Terrain Graph) have a separate Biome Mixing option in the Voxel Play Environment inspector. When enabled, voxel types from neighboring biomes are randomly interleaved at biome borders, producing a natural speckled transition. The Mixing Spread slider (0.001 - 0.05) controls the width of the transition zone; higher values produce wider mixing bands.
This is independent from the Climate Map's Biome Blend described above. Biome Mixing applies to the classic generator only and is hidden in the inspector for 3D Terrain Graph worlds, which use the Climate Map node's Biome Blend parameter instead.
Geological Layers (Global Underground Strata)
By default, each biome controls all underground voxels within its range via voxelDirt and voxelDirtAdditional. This works well for surface-level variation (soil, sand, clay) but makes it difficult to create shared geological layers like rock types that should be consistent across biomes.
The Geological Layers array in the World Definition solves this by defining global underground layers based on absolute altitude (Y). Each layer specifies:
| Field | Description |
|---|---|
| Voxel Definition | The voxel type for this layer (e.g. Granite, Limestone) |
| Probability | Weight (0-1) relative to other layers at the same altitude |
| Altitude Min / Max | Y range where this layer applies (default -500 to 500) |
How It Works
During terrain generation, for each underground voxel position:
- Biome-specific underground voxels (
voxelDirtAdditional) are applied first, consuming their configured probability. - Any remaining probability is filled from the global geological layers, proportionally rescaled to the remaining space.
- If no global layer covers that altitude, the biome's
voxelDirtis used as final fallback.
This means biomes only need to define their surface-level materials. Deep layers like granite, slate, or limestone are configured once at the world level and shared automatically.
If a biome needs to fully override the underground (e.g. a volcanic biome with 100% basalt), set its voxelDirtAdditional probability to 1.0 for the full altitude range - the global layers will never apply.
See Also
- Terrain Graph Overview - How to build terrain graphs
- Node Reference - Complete Climate Map node parameters
- Biomes (VP3 docs) - Base biome system reference
Suggest an improvement
Help us improve this documentation page.