perf(core): FI LOD0 attribution, exact Z-inner traversal; fix a mesh gap at the passage shaft foot (L57); R26
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
This commit is contained in:
1 parent
4e64b75044
commit
1e3e04bbac
14 files changed
+777
-48
No files matched your search
@@ -0,0 +1,56 @@
|
||||
# R26 — revised report: lattice generators
|
||||
|
||||
The earlier draft was too confident about why the shaft sweep failed and about likely runtime. The source identifies failure mechanisms, but I found no saved output for the historical 15/16 result that would tie each failed seed to one cause. The helix figures below are design calculations, not tested geometry.
|
||||
|
||||
## Legacy inventory
|
||||
|
||||
| Generator | What the code produces and how its parameters are used | Sample cost and bounds |
|
||||
|---|---|---|
|
||||
| **Maze** | `FMazeGenerationParams` describes a 3D lattice: “Each lattice node sits at a cell center and chooses one parent”; parent edges form a tree to the origin, with hashed optional loops. Defaults include 64-voxel cells, 12.5-voxel corridor radius, and loop controls. `BuildMazeStack(P, Seed, …)` adds the lattice source, roughness, carve, and optional boundary posts. Each sample checks the current cell’s cached edges and takes the minimum capsule SDF. [Params](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1355>) · [Evaluator](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:659>) · [Stack](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:9536>) | At most 24 edge capsules per sample: eight canonical neighboring nodes × three axes. Parent and loop decisions are cached per cell. Box bounds scan covered cells, up to 64³; they provide a geometric lower bound and `FLT_MAX` upper bound, then return unknown above the cap. This is not a global BVH. [Cell edge cache](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:768>) · [Box interval](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:704>) |
|
||||
| **Vertical shafts** | `FVerticalShaftParams` controls hash-grid spacing, occupancy, radii, connector chance/radius, ledge spacing/depth, and roughness. `RollShaft` hashes each XY cell for presence, jitter, and radius. The actual field is an **untapered vertical cylinder** (`sqrt(dx²+dy²)-R`) plus capsule connectors; the type comment’s “tapered capsules” does not match this evaluator. `BuildVerticalShaftStack` adds rock, shaft SDF, roughness, carve, ledges, and connector air/floors. [Params](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1658>) · [Roll and evaluator](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:2287>) · [Stack](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:9390>) | A sample tests the cached local 3×3 shaft neighborhood and its finite set of connector capsules; cache rebuilds resolve a wider, fixed parent-search neighborhood. Box bounds scan at most 64² XY cells; shaft axes are infinite in Z, and links use conservative segment bounds. Again, no global BVH. [Box interval](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:2324>) |
|
||||
|
||||
These parameter values are voxel-based legacy settings; the comments describe 64 voxels as 16 m and 80 voxels as 20 m at the 25 cm scale. Native records should use metres directly.
|
||||
|
||||
### Why the shaft route failed
|
||||
|
||||
There are two related but distinct problems in the code:
|
||||
|
||||
- The current test labels **strict-local-minimum shafts** as the “pre-fix orphan candidates.” The current shaft builder now searches farther for a more-central parent and has fallback links to the origin, so its structural graph is intended to have no orphans. [Test comment](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/Tests/VoxelForgeStrateConnectivityTest.cpp:3573>) · [Parent-tree construction](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:2550>)
|
||||
- That tree still does not ensure the **actual arrival and departure mouths** join it. The test explicitly warns that a continuous central spine does not guarantee the shaft networks at those mouths connect. Tree connectors get support at one shared, seal-safe floor level; random cross-links are at random Z and are marked as having no walkable floor. Periodic ledges are partial shelves, not a graded route between shaft elevations. [Connector floor level](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelPassageGeometry.h:131>) · [Random links](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:2645>) · [Mouth warning](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/Tests/VoxelForgeStrateConnectivityTest.cpp:2645>)
|
||||
|
||||
So the concrete failure class is **orphaned or mouth-disconnected shaft networks**, with unsupported vertical travel between levels. I cannot assign the supplied 15/16 failures to those individual causes: no saved output matching that historical sweep was present.
|
||||
|
||||
One further qualification: the current `VF_DiagnoseConnectivity` path uses the general `WalkAndClimb` traversal policy. It is not, by itself, proof of a ≤15° supported route. The native design needs a final capsule, support, headroom, and grade audit on the composed field. [Connectivity policy](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelStrateMeasure.cpp:2939>)
|
||||
|
||||
## Native design and shaft route
|
||||
|
||||
Resolve the actual mouth anchors first. Build a deterministic graph keyed by `(world seed, strate, recipe version, stable feature ID)`: cell/chamber nodes, corridor edges, shaft edges, landings, and optional ledges. Plan a mandatory spine between the mouths before adding branches. Use horizontal maze edges or ramp geometry for elevation changes; a one-cell vertical edge is not a walkable route. Add branches and loops only after the spine is feasible, and keep their floors and support explicit.
|
||||
|
||||
Make each room, corridor, or shaft ramp one filleted void feature, reusing L54’s field composition. Store conservative metre-space feature bounds with blend margins, index them in a BVH, and provide analytic intervals for primitive segment/room fields plus sound interval propagation through the blends. Use the BVH to cull absent features and `isTileShapeFree` only when no candidate can touch a tile. Keep the final field order stable. [L54 field and BVH](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux54/REPORT.md:3>) · [L44 tile-culling lesson](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux44/REPORT.md:5>)
|
||||
|
||||
**Recommended shaft spine: a continuous helix ramp.** Use a 6 m centerline radius, 3 m clear radial width, 5 m vertical pitch per turn, and **2.6 m finished floor-to-soffit clearance**. The inner edge radius is 4.5 m, so the steepest nominal grade is:
|
||||
|
||||
`atan(5 / (2π × 4.5)) ≈ 10.0°`
|
||||
(centerline grade ≈ 7.6°)
|
||||
|
||||
A 20 m descent takes four turns. A 2 m flat rest pad with eased transitions at each turn still leaves about 24.3 m of inner-edge run for each 5 m descent: approximately 11.7°, below the 15° cap.
|
||||
|
||||
The L38 overlap lesson is a real constraint: R3’s separate coil example has pitch 3.31 m and a 6 m bore height (`2r`), so neighboring voids overlap and can remove the intervening tread. The actual L38 log separately records an 8.6 cm floor-ripple failure; R3 says its synthetic overlap case does not reproduce that ripple. [R3 overlap analysis](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Research3/REPORT.md:54>) · [L38 ripple log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l38/owner-fi-real-final.log:140>)
|
||||
|
||||
For this design, pitch is 5 m and the passage’s conservative vertical envelope is at most 2.8 m: 2.6 m clear height plus 0.1 m allowance at each facing surface for a wall blend of width at most 0.4 m (`k/4`). That leaves **2.2 m between turn envelopes**. Keep the tread hard-owned by its route station: do not smooth-merge independently floor-capped coils. The 2.6 m finished clearance also exceeds the requested 2.2 m.
|
||||
|
||||
## Cost class
|
||||
|
||||
Class this as **medium when sparse, potentially medium-high when dense**. The evaluator cost is proportional to local BVH candidates and field samples in mixed tiles. Capsule-like corridors are simple to evaluate, but a dense maze adds many edges, and a multi-turn shaft keeps a large repeated region near the field boundary. L54 measured 0.727 s for a fixture with two tube edges and one room; L56 measured 0.524 s for two motifs. Those are comparison points, not a timing prediction for this generator. [L54 timing](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux54/REPORT.md:50>) · [L56 timing](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux56/REPORT.md:27>)
|
||||
|
||||
## VR read and slices
|
||||
|
||||
Use 12–16 m maze-cell spacing with about 3 m corridor width and 2.6 m clear height. Keep the repeated rhythm, then give every few cells a distinct landmark, light band, or spatial-audio cue so the layout remains legible. For shafts, make each 5 m turn visually countable with a different ring cue and views into the central depth; guard the open edge. Exposed vertical space may cause vertigo, which is acceptable to note. Meta’s current guidance cautions against spiral stair motion and recommends gentle slopes, orientation support, and comfort options; retain an optional teleport or bypass where the layout allows. [Meta locomotion guidance](https://developers.meta.com/vr/design/locomotion-virtual-environments/) · [Meta best practices](https://developers.meta.com/vr/design/locomotion-best-practices/)
|
||||
|
||||
1. **Maze spine:** one route between actual mouths, no optional branches. Verify deterministic IDs, BVH bounds, interval soundness, no endpoint snaps, capsule support, ≥2.2 m headroom, and ≤15° grade. Capture an eye-level junction and a cutaway showing the route.
|
||||
2. **Shaft spine:** integrate the four-turn helix above. Verify the final field at fine resolution for support, grade, headroom, and turn separation; include negative controls with undersized pitch and a disconnected mouth. Capture from the ramp, looking up and down, plus a side cutaway showing all four turns.
|
||||
3. **Topology and cost:** add optional branches and loops, then measure sparse and dense cases against L54/L56. Verify branches cannot sever the required route and that tiles outside feature bounds are culled. Capture one branch landmark and the route overview.
|
||||
|
||||
**Uncertainty:** I did not rerun or rebuild anything, and the proposed helix has not been validated in the field. The old 15/16 result is user-supplied; I found neither its saved sweep output nor per-seed failure diagnoses. The old voxel-to-metre scale also varies across legacy assets.
|
||||
|
||||
**Owner question:** Is a roughly 21 m outer shaft diameter acceptable for the first 20 m, four-turn descent prototype?
|
||||
Reference in new issue
Block a user