40 lines
2.3 KiB
Markdown
40 lines
2.3 KiB
Markdown
# Task 7: BspPartition Pass
|
|
|
|
**Depends on:** Task 6
|
|
|
|
## Context Files
|
|
- `.dev/2026-05-28-procgen-map-core/spec/design.md` — §4.7 (Partitioner role), §5 (data flow).
|
|
- `.dev/2026-05-28-procgen-map-core/README.md` — inter-pass data contract (this pass is the first row).
|
|
- `reikhelm-core/src/pass.rs` — `Pass`, `GenContext` (Task 6).
|
|
- `reikhelm-core/src/geometry.rs` — `Rect` (Task 2).
|
|
- `reikhelm-core/src/passes/mod.rs` — append the module declaration here.
|
|
|
|
## Files
|
|
- Create: `reikhelm-core/src/passes/bsp.rs` — `BspConfig`, `BspPartition`.
|
|
- Modify: `reikhelm-core/src/passes/mod.rs` — append `pub mod bsp;` and re-export `BspPartition`, `BspConfig`.
|
|
|
|
## What to Build
|
|
A binary-space-partition partitioner (spec §4.7). Recursively splits the map rectangle into leaves, randomly choosing split axis and position within configured limits, stopping when a leaf can't be split without violating the minimum leaf size or when max depth is reached. For each final leaf it adds a **placeholder Room region** (`kind: Room`, `bounds: <leaf rect>`, `cells: []`) to `ctx.regions` via `ctx.add_region`. It does not carve tiles — the grid stays all `Wall`. All randomness comes from the passed `rng`.
|
|
|
|
## Interface Dependencies
|
|
- **Consumes:** `Pass`, `GenContext`, `Rng` (Task 6); `Rect` (Task 2).
|
|
- **Produces:**
|
|
- `struct BspConfig { min_leaf: i32, max_depth: u32 }` (+ `Default`).
|
|
- `struct BspPartition { /* holds BspConfig */ }` — `new(cfg: BspConfig) -> Self`; `impl Pass` with `name() == "bsp_partition"`.
|
|
- **Writes to context:** one placeholder Room region per leaf in `ctx.regions`.
|
|
|
|
## Tests
|
|
- After running on an empty `GenContext` (grid all `Wall`), `ctx.regions` is non-empty and every region is `kind: Room`.
|
|
- Every leaf's `bounds` lies fully within the map and respects `min_leaf` (no dimension below the minimum).
|
|
- Leaves do not overlap and stay within map bounds.
|
|
- Determinism: same seed/sub-stream → identical leaf set (compare region bounds).
|
|
- `max_depth: 0` yields a single leaf (the whole map).
|
|
|
|
## Success Criteria
|
|
- [ ] `BspPartition` implements `Pass` and populates `ctx.regions` with non-overlapping in-bounds Room placeholders respecting `min_leaf`/`max_depth`.
|
|
- [ ] Carves no tiles.
|
|
- [ ] `pub mod bsp;` appended to `passes/mod.rs`.
|
|
- [ ] Tests pass: `cargo test -p reikhelm-core bsp`
|
|
|
|
## Commit
|
|
`"feat(core): BspPartition pass"`
|