Sampled cycle attribution of FI LOD0 field work: grid fill 83%, boundary 13%, skirts 4%; island roots, columns and helix dominate, the column cache path is real but secondary (no thrashing). FI-only Z-inner traversal at LOD0 (same lattice samples, exact) cuts FI whole view 5.35 -> 5.03 s and moving p50 by 12%; global Z-inner and <=4-island culling were measured and rejected. The meshing band now includes the planned passage support column's conservative bounds, closing a real gap where the arrival shaft meets the floor (WorldAssemblyEvaluatorVersion 208 -> 209). fast/medium/full PASS, Clang and GCC. Research R26 (self-checked): native lattice (maze/shaft) generator design. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
38 lines
8.5 KiB
Markdown
38 lines
8.5 KiB
Markdown
# VoxelForge R26 — lattice generator family
|
||
|
||
## Legacy inventory
|
||
|
||
| Family | Generator and output | Per-sample work and bounds |
|
||
|---|---|---|
|
||
| **Maze** | [`BuildMazeStack`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:9536>) composes solid rock, `FLatticeCorridorSource`, three-octave SDF roughness, and carving. The deterministic 3D lattice has origin-directed parent edges plus optional loops. Parameters include cell size, corridor radius, roughness, and boundary seal. | Hot path: floor to the containing cell and test up to 24 cached corridor capsules; roughness noise runs near the corridor surface. A cache miss rebuilds up to 24 edge decisions. Its box propagation scans up to 64³ cells and returns a geometric lower bound with an unbounded upper bound; oversized queries become unknown. No feature BVH. [Parameters](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1355>) · [source and bounds](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:659>) |
|
||
| **Vertical shafts** | [`BuildVerticalShaftStack`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:9390>) composes rock, hash-placed full-height shafts and connector capsules, roughness and carving, periodic partial ledges, connector air/floor modifiers, and optional structural posts. Parameters include shaft spacing/radii, connector radius, ledge spacing/depth, roughness, and seal. | Hot path checks the local 3×3 shaft neighborhood and its connector capsules, then applies roughness, ledge, and connector operations. A cell-cache rebuild does the broader hash-grid and parent-link work. Box propagation scans up to 64² XY cells and also returns a lower bound with an unbounded upper bound; it has no BVH. [Parameters](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1658>) · [field](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:2252>) · [ledge and connector modifiers](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:2693>) |
|
||
|
||
These are code-level cost descriptions, not legacy per-sample benchmarks; I found no comparable timing for either generator.
|
||
|
||
## Native design and shaft walkability
|
||
|
||
Add a native lattice recipe with immutable, stable-ID graph records resolved from `(seed, strate, recipe version, cell, feature ID)`. Put the **required spine between the actual resolved arrival and departure anchors first**. Use a finite graph search to choose its cells and edges; A* is a standard option for this [graph-search problem](https://www.cs.auckland.ac.nz/courses/compsci709s2c/resources/Mike.d/astarNilsson.pdf). Add branches and loops only after that spine exists. Attach branches to it, and give any navigable dead end a supported landing or a clear return path.
|
||
|
||
Represent each room, corridor, and shaft as one filleted void feature with a stable ID. Reuse L54’s analytic SDF construction: cap each void against its floor with smooth-max, then union voids; L54 used a 2.4 m smooth width and measured a 0.702 m composed fillet. Keep route floors out of roughness displacement. [L54 field and fillet](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux54/REPORT.md:5>) [L54 construction details](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux54/REPORT.md:19>)
|
||
|
||
Store dimensions, floor profiles, blend widths, and padded bounds in the native resolved layout, following the existing micrometre-based cavern records. Build a BVH over bounds that include blend, floor support, and any bounded roughness. Use exact primitive intervals where available, propagate sound intervals through the composed field, and return unknown when a bound cannot be proven. Reuse the cave candidate lookup, field-classification, and tile-shape-free path; the BVH culls absent features, while interval proofs decide whether a tile is all air or solid. [Cavern records](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h:855>) · [BVH](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:3743>) · [interval classification](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:5125>) · [`isTileShapeFree`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/VoxelForgeCore.cpp:1423>)
|
||
|
||
**The shaft route must not depend on falling.** The historical note reports arrival-to-departure failures on 15 of 16 seeds. The code’s diagnosis explains the structural gap: a large connected origin-spine component still does not guarantee that shaft networks at the measured passage mouths join. A full-height air column is not standing support; periodic one-sided ledges and sparse horizontal links do not establish a continuous route. [Connectivity diagnosis](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/Tests/VoxelForgeStrateConnectivityTest.cpp:2647>) [Landing-point constraints](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelCaveMorphology.cpp:6063>)
|
||
|
||
For a walkable descent without custom gravity, make the shaft a view well around a **continuous ramp**: a helix or broad switchbacks between landings. Enforce `|rise| / horizontal run ≤ tan(15°)` on every route segment. For example, a 4 m rise needs at least 14.9 m of horizontal run; a 4 m-radius helix rises 4 m per 25.1 m turn, about 9°. Verify the final composed field with a capsule flood fill from the actual mouths, plus local grade, support, and headroom checks—the method L54 used for caves. [L54 route audit](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux54/REPORT.md:21>)
|
||
|
||
## Cost and VR read
|
||
|
||
**Performance class: medium; unmeasured.** Use the measured L54 cave whole-view time (0.727 s) and L56 motif time (0.524 s) as comparison points, not forecasts. [Caves](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux54/REPORT.md:50>) · [Motifs](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux56/REPORT.md:27>) Capsule and cylinder fields are simpler per active feature than L54’s curved edges, but a dense lattice, many ramps, and broad mixed regions can outweigh that. Sparse BVH candidates and tight intervals are the main cost controls.
|
||
|
||
For an initial scale, try a maze pitch near 16 m, 3.5–5 m clear corridors, and a shaft spacing near 20 m; those pitch values match the legacy defaults’ documented Core scale. Repeat a consistent grid rhythm, then vary a few junctions and landmark bays so it reads as a maze rather than a featureless corridor set. Pair local junction markers with an occasional global landmark; a recent VR wayfinding study reports that landmark usefulness varies with navigation strategy. [Wayfinding study](https://www.sciencedirect.com/science/article/pii/S0272494425001446)
|
||
|
||
For shafts, expose the central void and repeated landing tiers, with visible handrails and human-scale references. Treat vertigo as an intended effect to assess, not a reason to drop the design: a 42-person VR height study found increased distress and physiological responses on an exposed platform up to 40 m, strongest among participants with greater height intolerance. [Study](https://pubmed.ncbi.nlm.nih.gov/35095450/) Keep the walking route clear and forward-readable; Meta’s guidance recommends gentle slopes, distant walls, and spatial sound cues for orientation. [Meta locomotion guidance](https://developers.meta.com/vr/design/locomotion-best-practices/)
|
||
|
||
## Slices and verification
|
||
|
||
1. **Maze slice:** a small multi-level lattice with the real arrival-to-departure spine, one optional branch, and one loop. Check deterministic layouts, interval soundness against brute-force samples, BVH candidates, tile-shape coverage, and final-field capsule reachability with grade ≤15°. Capture an eye-height junction view and a high oblique cutaway showing the route and repeated cells.
|
||
2. **Shaft slice:** two or three shaft cells joined by one helix or switchback descent. Run the same checks, then repeat the mouth-to-mouth walkability audit across the historical 16-seed matrix. Capture the ramp at eye height, a view across the shaft to its tiers, and a cutaway showing the complete route.
|
||
3. **Density pass:** add branches and additional levels only after both slices pass; repeat interval, determinism, route, and whole-view timing checks at the denser preset. Frame captures to show route support as well as scale.
|
||
|
||
**Question for the owner:** should the first playable slice be the maze or the shaft descent? |