# hbm:stratum_3d

Places blocks where three noise fields form a sparse 3D deposit.

## Fields

| Field | Meaning and default | Range |
| - | - | - |
| `domain_x` | Noise domain sampled on the Y/Z plane. | |
| `domain_y` | Noise domain sampled on the X/Z plane. | |
| `domain_z` | Noise domain sampled on the X/Y plane. | |
| `replaceable` | Vanilla rule test selecting blocks to replace. | |
| `replaceable.predicate_type` | Vanilla rule-test type. | |
| `replaceable.tag` (Optional) | Block tag for tag_match. | |
| `replaceable.block` (Optional) | Block ID for block_match. | |
| `scale_h` | Horizontal noise sampling scale. | finite `f64` |
| `scale_v` | Vertical noise sampling scale. | finite `f64` |
| `state` | Block state placed in the deposit. | |
| `state.id` | Registered block ID. | |
| `state.properties` (Optional) | Block-state property names and string values. | |
| `threshold` | Minimum product of the three noise values for placement. | finite `f64` |

The top-level `type` selects this feature; the remaining fields belong beside it.

## Domain validation

Each domain used by `domain_x` or `domain_z` must keep the same axis and the same `scale_h`/`scale_v` pair across all loaded 3D-stratum definitions. `domain_x` and `domain_z` use distinct IDs, including when both scales are equal. Reusing a domain on the same axis with the same scales is supported.

Conflicts fail worldgen registry loading when the world opens. The error names the domain, both features, their axis fields and their sampling scales. `domain_y` may reuse a domain independently of these axis and scale restrictions.

## Example

Source path: `data/hbm/worldgen/feature/stratum_bauxite.json`

```json
{
  "type": "hbm:stratum_3d",
  "domain_x": "hbm:noise/stratum_bauxite/x",
  "domain_y": "hbm:noise/stratum_bauxite/y",
  "domain_z": "hbm:noise/stratum_bauxite/z",
  "replaceable": {
    "predicate_type": "minecraft:tag_match",
    "tag": "minecraft:base_stone_overworld"
  },
  "scale_h": 0.03,
  "scale_v": 0.15,
  "state": "hbm:stone_resource_bauxite",
  "threshold": 300.0
}
```
