11 KiB
15 - Caves & Carving
Iris carves caves itself during mantle generation via MantleCarvingComponent and IrisCaveCarver3D. Density fields from IrisCaveProfile decide solid vs air/water/lava. Cave biomes paint floors, ceilings, decorators, and objects inside carved space. Vanilla and mod noise carvers never run over Iris terrain.
Related: 11 - Dimensions.md, 12 - Regions.md, 13 - Biomes.md, 14 - Generators & Noise.md, 16 - Surfaces, Decorators & Deposits.md, 17 - Trees, Fungi, Coral, Crystals, Formations, Ruins.md, 20 - Object Placement.md, 22 - Native Structures & Datapacks.md.
Architecture (author-relevant)
- Dimension
carvingEnabledmust be true (default). - Per column, Iris resolves a cave profile from biome → region → dimension (
enabledprofiles only). - Profiles blend across neighbors;
IrisCaveCarver3Dsamples 3D density and writes carve flags into the mantle. - Cave biomes (region
caveBiomes, dimensioncarvingY-band overrides, surface biomecarvingBiome) supply materials and content for carved voxels. - Fluid placement inside caves follows profile water/lava rules and surface-clearance guards.
Empty pack folders such as caves/ or ravines/ are not separate registrant types. Carving is profile-driven JSON on dimensions/biomes/regions, not standalone cave files.
Vanilla carvers never run
Iris does not implement Minecraft NoiseGeneratorSettings carver sampling. Generated biome JSON keeps empty carvers arrays. applyCarvers on the Iris chunk generator is a no-op for Iris-owned terrain. Pack authors must use caveProfile (and related cave biomes), not vanilla carver JSON or datapack carver features. See also platform notes in 30 - Platform Differences.md / API matrix.
Dimension gates
| Field | Type | Default | Notes |
|---|---|---|---|
carvingEnabled |
boolean | true |
Master switch for all profile carving |
caveProfile |
IrisCaveProfile |
disabled defaults | Global/default profile |
carving |
IrisDimensionCarvingEntry[] |
[] |
Absolute world-Y cave biome bands |
caveBiomeStyle |
IrisGeneratorStyle |
cellular | Picks among region cave biomes |
requireObjectSurfaceSupport |
boolean | true |
Refuse surface objects over carve openings |
objectSurfaceSupportBuffer |
int 0..16 | 2 |
Minimum solid buffer for surface objects |
upperDimensionCarving |
boolean | false |
Carve through ceiling/upper terrain when set |
useMantle |
boolean | true |
Mantle required for carving/objects |
Cave profile (IrisCaveProfile)
Snippet key: cave-profile. Appears on dimension, region, and biome. Resolution prefers the most specific enabled profile in the mantle path (biome/region/dimension blend).
| Field | Type | Default | Notes |
|---|---|---|---|
enabled |
boolean | false |
Must be true to carve |
verticalRange |
IrisRange |
0..384 |
Global carve Y band for the profile |
verticalEdgeFade |
int 0..128 | 20 |
Soft edge near min/max |
verticalEdgeFadeStrength |
double 0..1 | 0.18 |
Fade strength |
baseDensityStyle |
IrisGeneratorStyle |
cellular iris double | Primary density field |
detailDensityStyle |
IrisGeneratorStyle |
simplex | Detail field |
warpStyle |
IrisGeneratorStyle |
flat | Coordinate warp |
baseWeight |
double ≥ 0 | 1 |
Base field multiplier |
detailWeight |
double ≥ 0 | 0.35 |
Detail multiplier |
warpStrength |
double ≥ 0 | 0 |
Warp amount |
densityThreshold |
IrisStyledRange |
±0.2 cellular | Carve cutoff band |
thresholdBias |
double 0..1 | 0.16 |
Extra bias subtracted before tests |
sampleStep |
int 1..8 | 1 |
Vertical density step |
adaptiveSampling |
boolean | true |
Coarse predictor then refine |
adaptiveSampleStep |
int 2..4 | 2 |
Horizontal predictor grid |
adaptiveThresholdMargin |
double 0..1 | 0.04 |
Ambiguity margin |
surfaceClearance |
int 0..64 | 4 |
Min solid below terrain before carve |
allowSurfaceBreak |
boolean | true |
Permit selected surface openings |
surfaceBreakStyle |
style | simplex zoomed | Where openings may occur |
surfaceBreakNoiseThreshold |
double -1..1 | 0.62 |
Min noise for break columns |
surfaceBreakDepth |
int 0..64 | 18 |
Depth window for break logic |
surfaceBreakThresholdBoost |
double 0..1 | 0.2 |
Easier carve near surface break |
objectMinDepthBelowSurface |
int 0..64 | 6 |
Cave-object depth gate |
modules |
IrisCaveFieldModule[] |
[] |
Extra density layers |
defaultObjectAnchor |
IrisCaveAnchorMode |
FLOOR |
Cave object anchor default |
defaultObjectPlaceMode |
ObjectPlaceMode |
null | Prefer stilt modes for cave props |
anchorScanStep |
int 1..8 | 1 |
Vertical anchor search step |
anchorSearchAttempts |
int 1..64 | 6 |
Random column retries per chunk |
allowWater |
boolean | true |
Cave water below fluid height |
waterMinDepthBelowSurface |
int 0..64 | 12 |
Depth before cave water |
waterRequiresFloor |
boolean | true |
Solid floor under water |
allowLava |
boolean | true |
Cave lava by lava height rules |
Density module (IrisCaveFieldModule)
| Field | Type | Default | Notes |
|---|---|---|---|
style |
IrisGeneratorStyle |
cellular | Module density |
weight |
double ≥ 0 | 1 |
Contribution |
threshold |
double -1..1 | 0 |
Pre-blend offset |
verticalRange |
IrisRange |
0..384 |
Module Y window |
invert |
boolean | false |
Invert before weighting |
Anchor modes (IrisCaveAnchorMode)
| Value | Meaning |
|---|---|
PROFILE_DEFAULT |
Use profile default |
FLOOR |
Solid support below carved cell |
CEILING |
Solid support above |
CENTER |
No immediate floor/ceiling support |
ANY |
Any carved anchor |
Dimension carving entries (IrisDimensionCarvingEntry)
Absolute world-Y cave biome overrides independent of surface biome.
| Field | Type | Default | Notes |
|---|---|---|---|
id |
string | "" |
Stable id (child references) |
enabled |
boolean | true |
Toggle |
biome |
biome key | "" |
Cave biome applied in band |
worldYRange |
IrisRange |
-64..320 |
Absolute world Y |
children |
string[] | [] |
Child entry ids (cycles allowed, depth-limited) |
childShrinkFactor |
double | 1.5 |
Child patch scale |
childStyle |
style | cellular | Child patch shape |
childRecursionDepth |
int | 3 |
Max child resolve depth |
Cave biomes (content)
Cave biomes are normal biome JSON used only underground:
| Mechanism | Location | Role |
|---|---|---|
Region caveBiomes |
region JSON | Pool selected by caveBiomeStyle |
Biome carvingBiome |
surface biome | Optional fixed carve biome under that surface |
Biome caveMinDepthBelowSurface |
surface biome | Min depth before that carve biome applies |
Dimension carving[] |
dimension | Y-band force biomes |
Biome caveProfile |
any biome | Local carve density override when enabled |
layers / caveCeilingLayers / wall |
cave biome | Floor / ceiling / wall materials |
decorators with partOf: CEILING |
cave biome | Hang from ceilings |
objects / proceduralObjects |
cave biome | Cave props (carvingSupport: CARVING_ONLY) |
Surface biomes still provide height generators; cave biomes typically omit height generators or use fillers—the carve step removes solid first.
Overworld examples
Dimension switch and deepdark band (dimensions/overworld.json):
{
"carvingEnabled": true,
"caveProfile": {
"enabled": true,
"verticalRange": { "min": 6, "max": 700 },
"baseDensityStyle": { "style": "PERLIN_IRIS", "zoom": 0.72 },
"detailDensityStyle": { "style": "SIMPLEX", "zoom": 0.54 },
"warpStyle": { "style": "FRACTAL_WATER", "zoom": 0.5 },
"baseWeight": 0.9,
"detailWeight": 0.11,
"warpStrength": 0.24,
"densityThreshold": {
"min": -0.14,
"max": -0.06,
"style": { "style": "SIMPLEX", "zoom": 0.74 }
},
"thresholdBias": 0.14,
"sampleStep": 3,
"surfaceClearance": 5,
"allowSurfaceBreak": true,
"surfaceBreakStyle": { "style": "SIMPLEX", "zoom": 0.88 },
"surfaceBreakNoiseThreshold": 0.6,
"surfaceBreakDepth": 16,
"surfaceBreakThresholdBoost": 0.1,
"objectMinDepthBelowSurface": 14,
"defaultObjectAnchor": "FLOOR",
"defaultObjectPlaceMode": "ORGANIC_STILT",
"anchorSearchAttempts": 12,
"allowWater": true,
"waterMinDepthBelowSurface": 20,
"waterRequiresFloor": true,
"allowLava": true,
"modules": [
{
"style": { "style": "SIMPLEX_VASCULAR", "zoom": 1.08 },
"weight": 0.08,
"threshold": 0.03,
"verticalRange": { "min": 24, "max": 660 },
"invert": false
}
],
"verticalEdgeFade": 24,
"verticalEdgeFadeStrength": 0.18
},
"carving": [
{
"id": "global-deepdark-band",
"enabled": true,
"biome": "carving/standard-deepdark",
"worldYRange": { "min": -250, "max": -175 }
}
]
}
Region cave pool (regions/temperate.json):
{
"caveBiomes": [
"carving/rocky-cavebiome",
"carving/deep",
"carving/drip",
"carving/chalk-gardens",
"carving/moss-pillars"
]
}
Cave biome content (biomes/carving/amethyst.json excerpt): floor/wall amethyst, floor buds, ceiling-facing clusters via "partOf": "CEILING", caveCeilingLayers for roof materials.
Authoring workflow
- Enable dimension
caveProfilewith a vertical range covering playable Y. - Add
modulesfor tunnels/rooms instead of raisingdetailWeightalone. - List themed biomes under each region's
caveBiomes(and optional dimensioncarvingbands). - Paint cave biomes with
layers,caveCeilingLayers,wall, ceiling/floor decorators, and cave-only objects. - For surface sinkholes, keep
allowSurfaceBreaktrue and tunesurfaceBreak*noise; for sealed caves raisesurfaceClearanceand disable surface break. - Place cave objects with
carvingSupport: CARVING_ONLYand stilt place modes (FAST_MIN_STILT/ORGANIC_STILT) to avoid floating props. - Verify: studio regen, check openings, waterfalls (
waterRequiresFloor), and lava depth.
Tuning knobs (quick)
| Goal | Adjust |
|---|---|
| Larger caverns | Lower densityThreshold band / raise bias toward carve |
| Thinner tunnels | Raise threshold, lower detailWeight, add inverted modules |
| Fewer surface holes | Raise surfaceBreakNoiseThreshold, lower surfaceBreakDepth, or allowSurfaceBreak: false |
| Safer cave props | Raise objectMinDepthBelowSurface, set place mode + anchor |
| Dry caves | allowWater: false |
| Performance | Higher sampleStep, keep adaptive sampling on, simpler styles |
Practical notes
- Profile
enabled: false(the Java default) produces no profile carving even if cave biomes are listed. - Cave biome layers still need solid carve first; they do not create voids alone.
- Upper-dimension carving is optional and off in overworld.
- Pack JSON may contain unknown keys; only fields on
IrisCaveProfileapply.