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

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?