Biome System Upgrades

intermediate feature

Voxel Play 4 · Features

Voxel 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:

AxisFieldsRange
AltitudealtitudeMin, altitudeMaxWorld units (e.g. -500 to 500)
MoisturemoistureMin, moistureMax0 to 1 (normalized)
TemperaturetemperatureMin, temperatureMax0 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:

FieldVP3VP4Description
voxelTopYesYesSurface voxel (e.g. grass, sand)
voxelDirtYesYesUnderground voxel (e.g. dirt, stone)
voxelShore-NewShore voxel for surfaces adjacent to water. Allows per-biome beach materials (sand for deserts, gravel for mountains).
voxelLakeBed-NewUnderwater floor voxel, distinct from underground dirt
voxelWater-NewWater 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:

  1. Altitude (0-1): typically from a height calculation or World Y node
  2. Moisture (0-1): from a 2D noise node representing humidity
  3. Temperature (0-1, optional): from any noise or calculation node

The node outputs a biome index (0..N) that references the World Definition's biome array. Connect this output to the Voxel ID, Vegetation ID or Tree ID terminals to drive per-biome block selection, plant placement and tree generation.

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:

FieldDescription
Voxel DefinitionThe voxel type for this layer (e.g. Granite, Limestone)
ProbabilityWeight (0-1) relative to other layers at the same altitude
Altitude Min / MaxY range where this layer applies (default -500 to 500)

How It Works

During terrain generation, for each underground voxel position:

  1. Biome-specific underground voxels (voxelDirtAdditional) are applied first, consuming their configured probability.
  2. Any remaining probability is filled from the global geological layers, proportionally rescaled to the remaining space.
  3. If no global layer covers that altitude, the biome's voxelDirt is 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

Was this page helpful?