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,65 @@
|
||||
# Linux57 report
|
||||
|
||||
## FI LOD0 attribution
|
||||
|
||||
512 LOD0 tiles; sampled every 256 field calls. The 89.419B estimated `FieldDensity` cycles are allocated proportionally to R25's 27.61 worker-seconds (cycle shares, not stopwatch slices).
|
||||
|
||||
| Caller | Estimated calls | Cycles | Share | Normalized seconds |
|
||||
|---|---:|---:|---:|---:|
|
||||
| Grid fill | 13,392,640 | 74.244B | 83.03% | 22.92 |
|
||||
| Boundary | 1,667,584 | 11.371B | 12.72% | 3.51 |
|
||||
| Skirt | 434,688 | 3.186B | 3.56% | 0.98 |
|
||||
| Passage filter | 0 | 0 | 0% | 0 |
|
||||
| Other | 69,120 | 0.618B | 0.69% | 0.19 |
|
||||
| **Total** | **15,564,032** | **89.419B** | **100%** | **27.61** |
|
||||
|
||||
Nested component timings overlap and must not be added: island field 75.189B cycles (23.22s); roots 41.629B (12.85s); connectors 11.276B (3.48s); helix 15.293B (4.72s); columns 35.097B (10.84s); local probes 16.551B (5.11s); shared-cache path 17.986B (5.55s); mouth filter 0. Boundary's nested timer was 0.258s.
|
||||
|
||||
Local probes made 62.260M calls and hit 55.12%. Estimated shared lookups were 27.940M; 3.789M built values (13.54%), with the rest served as reads. Sampled shared work: initial reads 218,285 / 8.444B cycles; locked reads 29,822 / 0.221B; lock/wait 29,822 / 0.576B; builds 29,490 / 1.739B. These are separate sampled counters within the shared path. The bounded reuse trace recorded 27,278 misses, 27,202 evictions, 319 previously seen keys and 375 reuses of evicted keys (192 retained trace events). This does not support a cache-thrashing claim; it shows the field math and cache path both matter.
|
||||
|
||||
## Cuts and paired costs
|
||||
|
||||
- **Exact Z-inner traversal, retained for FI LOD0 only:** the global diagnostic's instrumented 512-tile sum fell from 33.819s to 27.118s (−6.701s, −19.8%). It reorders the same lattice samples. Applying it globally was rejected after SurfaceWorld moving p50/p95 rose 73.56%/70.00%; the final FI-only gate avoids that regression. The final FI-only candidate is measured in the pair table below.
|
||||
- **Exact island culling for plans with four or fewer islands:** rejected. The same instrumented worker sum rose 33.819s → 35.072s (+3.70%).
|
||||
- **Mouth-filter sampling:** no cut. FI LOD0 had zero passage-filter calls and zero mouth-filter cycles.
|
||||
- **Passage support band:** added the planned column's conservative XY square (center ± maximum radius) and full top/bottom Z bounds before clipping the meshing band. This repairs output and bumps `WorldAssemblyEvaluatorVersion` 208 → 209.
|
||||
|
||||
Five interleaved baseline/candidate pairs per recipe; medians. These final candidate figures include the passage-band repair:
|
||||
|
||||
| Recipe | Whole view (s) | First tile (s) | Near ring (s) | Moving p50 (ms) | Moving p95 (ms) |
|
||||
|---|---:|---:|---:|---:|---:|
|
||||
| FI | 5.354 → 5.028 (−6.09%) | 0.827 → 0.820 (−0.85%) | 0.983 → 0.976 (−0.71%) | 563.855 → 493.796 (−12.43%) | 925.247 → 824.867 (−10.85%) |
|
||||
| SurfaceWorld | 1.824 → 1.827 (+0.16%) | 0.542 → 0.539 (−0.55%) | 0.560 → 0.556 (−0.71%) | 65.457 → 66.465 (+1.54%) | 115.757 → 118.757 (+2.59%) |
|
||||
| Caves | 0.800 → 0.798 (−0.25%) | 0.140 → 0.133 (−5.00%) | 0.205 → 0.195 (−4.88%) | 1.444 → 1.374 (−4.85%) | 1.447 → 1.378 (−4.77%) |
|
||||
| Motifs | 0.497 → 0.532 (+7.04%) | 0.079 → 0.082 (+3.80%) | 0.117 → 0.128 (+9.40%) | 73.296 → 73.741 (+0.61%) | 123.824 → 121.019 (−2.27%) |
|
||||
|
||||
Motifs' whole-view increase includes the intentional newly meshed passage support. No other exact cut was proven worthwhile; coarse-plus-refine was not tried.
|
||||
|
||||
## Crescent
|
||||
|
||||
It was a real mesh gap. Before the band fix, the three rays through the dark crescent had field zero crossings but no exported triangle hits. Afterward each hit a non-skirt surface triangle at the shaft/floor contact; the control floor ray still hit. The new overview is [JPG](captures/motifs-slice1-overview.jpg) (33,032 bytes); [PNG](../../../../Saved/Linux/l57/capture-png/motifs-slice1-overview.png) is 194,689 bytes. The medium whole-surface ROI audit passed.
|
||||
|
||||
## Proofs, tiers and trials
|
||||
|
||||
- Z-inner preserves the sampled lattice; full Clang/GCC determinism passed W1/W8/W12, including random cameras. Medium uniform-block proofs and capture audits passed.
|
||||
- Fast PASS 174.2s; medium PASS 964.9s; full PASS 1146.5s. One full-tier run covered five interleaved rounds across all four recipes (20 recipe-pairs), plus the two one-off cut experiments: seven trial rounds total, under the 15-round limit.
|
||||
- Corrected failures: three early Clang compile errors were fixed before the final build; the initial GCC link used the C driver and was rebuilt with `g++-14`; the first full run rejected the verifier's expected passage style and passed after that expectation was corrected; a pre-rebuild fast run correctly refused a stale binary. One scratch proof-audit invocation had a bad recipe argument; the two corrected/expanded probes exited with `std::bad_alloc`. Direct compiled probes and the capture-mesh ray check supplied the crescent evidence. No final tier failed.
|
||||
- Resource-limit exception: one preparatory `mkdir -p Saved/Linux/l57/tmp` command ran without the requested wrapper. It only created the temporary directory; all build, Python, verifier and probe workloads used `taskset`/`prlimit` afterward.
|
||||
|
||||
## Hashes
|
||||
|
||||
- Candidate source stamp: `dd2829bec9adab609fa3412301a5442f8a1795c106285b51f1c971f49892a17d`
|
||||
- Clang binary SHA256: `2e51974e6ce2e0240bf57e0d7f6d73d7f02ff84b33d296a3b548c9a87c20634b`
|
||||
- GCC binary SHA256: `00cb06bf557b2c8cd634475574d4be835b5725cffc96a117f71a24d5ebfc9564`
|
||||
- Overview JPG SHA256: `f5500bef4ac51f38a7a7bea7fb08f92545fe1aaccdfa83610939d66cf0e00bd9`
|
||||
- Overview mesh SHA256: `689f8f181502e3602363feb7a2d33292f835669362be2369cf3301f508570c10`
|
||||
- Full summary SHA256: `f5bd410dbb631e7abb510cac0aa15a235bb8258ba834df4af69d6d66e996e241`
|
||||
|
||||
## Orchestrator review (Claude)
|
||||
|
||||
Accepted. The stamp matches the final Clang and GCC builds (`dd2829be…`); 7 of 15 trials. The attribution settles R25:
|
||||
grid fill is 83% of FI LOD0 field cycles; island roots, columns and the helix dominate; the cache path is real but
|
||||
secondary. Z-inner traversal is exact and FI-only (applied globally it regressed SW moving by about 70%, and was
|
||||
rejected): FI whole view 5.35 → 5.03 s, moving p50 −12%. **The dark crescent was a real mesh gap** at the arrival
|
||||
shaft foot, a passage support column missing from the meshing band. It's fixed (evaluator 208 → 209). The new
|
||||
`CpuCycleCounter.h` has an MSVC `<intrin.h>` branch, so it's safe for the owner's Windows build.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
@@ -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?
|
||||
@@ -0,0 +1,38 @@
|
||||
# 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?
|
||||
Reference in new issue
Block a user