feat(core): ore vein records and a materialAt query, off by default (L50); research R18, R19
Versioned capsule vein records (stable ID, resource ID, endpoints, radius, seeded irregularity) resolved into the snapshot only when requested, placed beside the route and away from passages, landings and landmarks (forced-passage control rejected). The bound field table gains materialAt (host + two resource IDs + Q16 weights) behind a per-tile BVH; mesh export v2 carries per-vertex materials; a measurement-only yield computes removed resource volume (0 on already-air space). With veins on, every density, mesh, payload and topology hash is unchanged; demo off: owner hashes identical to L47. fast/medium/full PASS. Research R18 (cavern-graph planner) and R19 (why FloatingIslands costs ~10x SurfaceWorld). 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
b9ccff4ad6
commit
ca85e876ad
15 files changed
+1573
-19
No files matched your search
@@ -0,0 +1,51 @@
|
||||
# VoxelForge L50: ore veins in Core, slice 1
|
||||
|
||||
Scope: Core only on `assembler/world`. The owner demo is opt-in with `--ore-veins-demo`; no Unreal integration or mining gameplay is included.
|
||||
|
||||
## Representation and placement
|
||||
|
||||
Vocabulary v1 currently has one shape, `capsule`. A resolved record carries its stable ID, strate index, resource material ID, two endpoints, radius, irregularity amplitude and wavelength, blend width, seed, and conservative micrometre bounds. The `ore_veins` canonical field is emitted only when records exist. Stable IDs sort canonically; irregularity seeds derive from world seed, strate, and stable ID.
|
||||
|
||||
The seed-0 SW demo resolves three records in strate 1. Bounds include radius, irregularity, and blend:
|
||||
|
||||
| Stable ID | Resource | Endpoints (m) | Radius | Bounds (µm, half-open x × y × z) | Irregularity seed |
|
||||
|---|---:|---|---:|---|---:|
|
||||
| `ore/sw-arrival-route-copper-v1` | 1 copper | (16.510, 21.173, -502.909) → (18.277, 22.940, -502.950) | 0.65 m | `[15159830,19627354) × [19822674,24290198) × [-504300299,-501558872)` | 6689110868732322 |
|
||||
| `ore/sw-arrival-route-cobalt-v1` | 2 cobalt | (25.092, 21.192, -503.626) → (26.852, 22.952, -503.394) | 0.75 m | `[23641575,28301747) × [19741941,24402113) × [-505075523,-501944042)` | 2641701047127768 |
|
||||
| `ore/sw-chamber-approach-quartz-v1` | 3 quartz | (1.402, 27.019, -502.525) → (1.481, 29.459, -503.062) | 0.80 m | `[-98238,2981467) × [25518936,30959266) × [-504561729,-501024663)` | 882664590774173 |
|
||||
|
||||
Amplitude is 0.10 m; wavelengths are 1.4 m for copper/cobalt and 1.8 m for quartz; blend width is 0.60 m. A bounded, seeded candidate search biases capsules beside the route and toward side pockets/chamber approach. It rejects clear passage and mouth clearance, landing regions, and landmark/cavern footprints, using the resolved bounds. The forced-clear-passage control was rejected (1/1).
|
||||
|
||||
## Query, mesh, yield
|
||||
|
||||
The bound field table exposes deterministic `materialAt(x,y,z)`: host material, up to two resource IDs, and Q16 blend weights. A per-tile BVH narrows candidate veins; tiles with no vein bounds skip the query. Density and its sign are untouched. L44 shape-free and culling paths do not inspect veins: they depend only on density/geometry, and material lookup is a separate surface attribute query.
|
||||
|
||||
Mesh export v2 stores host ID plus two resource-ID/weight pairs per surface vertex, sampled at the vertex. The standalone renderer colors copper orange, cobalt blue, and quartz turquoise; v1 export remains available without ore.
|
||||
|
||||
Mining yield is measurement-only: a fixed 0.25 m grid evaluates the edit sphere before/after solid state and accumulates weighted removed resource volume by ID. The audited copper edit used a 1.25 m sphere and measured 0.000071 m³ (one removed solid sample, Q16 weight sum 296). This is a coarse-grid measurement, not a tuned reward amount. Repeating it on already-air space returned 0.000000 m³.
|
||||
|
||||
## Proofs and cost
|
||||
|
||||
With the demo off, owner SurfaceWorld W1/W12 hashes match L47: density `0x7dc75e2c09302258`, mesh `0x0cb34c40ceec4ce3`, payload `0x9d23e8c46b515cf1`, topology `0x2962c9464991eedd`.
|
||||
|
||||
At the 125-tile ore audit camera `(19.725, 19.725, -501.566)`, enabling veins leaves all geometry hashes unchanged:
|
||||
|
||||
| State | Density | Mesh | Payload | Topology | Material |
|
||||
|---|---|---|---|---|---|
|
||||
| Demo off | `0x5f9f1fdc0aabc8f0` | `0xed9e30865c98c2af` | `0xb8e3715300641fed` | `0x48584cc4e11c330c` | `0x58803ee275e9ba0a` |
|
||||
| Demo on | `0x5f9f1fdc0aabc8f0` | `0xed9e30865c98c2af` | `0xb8e3715300641fed` | `0x48584cc4e11c330c` | `0x5bfc71cbd5615b02` |
|
||||
|
||||
The random-camera and cavern sweeps ran with the demo enabled; material hash rows agreed across W1/W8/W12. Broad sweep positions outside all vein bounds recorded zero material queries. The ore audit changed six tile material hashes while preserving every density, mesh, payload, and topology tile hash.
|
||||
|
||||
At this audit, the on path queried 19,396 vertices and checked 24,871 candidates in 4.562 ms. 111/125 tiles had no vein candidate and recorded 0 ms query time; demo off queried zero vertices (also 0 ms). The off audit material hash above is the new empty-material result; the four owner geometry hashes remain the L47 values.
|
||||
|
||||
## Verification, captures, failures
|
||||
|
||||
- Fast: PASS, 211.2 s. Medium: PASS, 589.7 s. Full: PASS, 1,639.0 s; 1,084 checks, 0 failures. All tiers used source stamp `5f0f388366a4a6e7fb842459f035679e88da6b2a20af44e90e419c35f7c2fc06`.
|
||||
- Clean source stamp: `5f0f388366a4a6e7fb842459f035679e88da6b2a20af44e90e419c35f7c2fc06`; Clang 19 and GCC 14 builds passed.
|
||||
- Eye-height approach-wall capture: [`tunnel-quartz-eye.png`](captures/tunnel-quartz-eye.png). Wide arrival/approach capture: [`tunnel-approach-wide.png`](captures/tunnel-approach-wide.png). Mining-yield log: `Saved/Linux/l50/ore-tunnel-export.log`.
|
||||
- Failed runs: early seeded placements intersected the lower passage-mouth clearance and were rejected before moving the accepted candidate; the final demo passes the forced-clear-passage control. The first medium run caught a renderer shader-scope error, fixed before the clean rebuild and passing medium run. An initial off-angle surface capture was replaced after inspecting the exported material vertices.
|
||||
|
||||
## Orchestrator review (Claude)
|
||||
|
||||
Accepted, off by default. The stamp matches the final Clang and GCC builds (`5f0f3883…`). With veins on, all four geometry hashes are unchanged; only the material hash moves. Demo-off owner hashes are identical to L47. **Paused as a feature** after this slice: the owner made all-generators-at-about-1-s the priority (2026-10-24).
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 191 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 125 KiB |
@@ -0,0 +1,49 @@
|
||||
# Research R18 — Core cavern graph planner
|
||||
|
||||
**Read-only report.** The R17 question is settled: authors provide motifs, size ranges and rules; Core places the rooms and routes from the seed, strate and stable IDs. This fits the composer’s generated-strate vision in [COMPOSER-NOTES.md](/home/jahni/VoxelM/Plugins/VoxelForge/COMPOSER-NOTES.md:18).
|
||||
|
||||
## Planner algorithm
|
||||
|
||||
1. **Freeze the planning inputs.** Use integer micrometres for the resolved strate content bounds, arrival and departure mouths, existing passages, stamps, and motif limits. Leave clearance inside the resolved ceiling and bedrock bands. Key each random choice by `(world seed, strate ID, motif stable ID, feature role/ordinal)` so one choice does not shift when another motif is added. Sort inputs and final records by stable ID.
|
||||
|
||||
2. **Build the guaranteed spine first.** Plan a grade-limited route between the actual resolved mouths. Use a bounded waypoint search through the usable volume, allowing contact with existing passages only at named mouths. Place at least one room on the route: current strict graph validation requires both a room and an edge. Split the route at room portals into edges, with matched floor heights and enough overlap for the player capsule.
|
||||
|
||||
3. **Place additional rooms.** Use bounded 3D Poisson-disk sampling for candidate centers, then draw motif and dimensions from their authored ranges with feature-keyed randomness. Reject candidates whose expanded bounds leave the content band, collide with a fill stamp or passage, overlap another room, or lack clearance. Treat carve stamps as usable space only where a deliberate connection is allowed. Bridson’s sampler is relevant for its minimum-spacing samples and spatial search grid; variable room sizes require a variable-radius spacing check. [Bridson, *Fast Poisson Disk Sampling in Arbitrary Dimensions*](https://www.cs.ubc.ca/~rbridson/docs/bridson-siggraph07-poissondisk.pdf)
|
||||
|
||||
4. **Attach branches and form loops.** Make 3D Delaunay neighbors candidate connections; reject edges that fail grade, clearance, protected-band or portal checks. Connect accepted off-spine rooms to the spine with a constrained, deterministic spanning tree. Add a bounded number of extra feasible links afterward to create loops; leaves naturally provide dead ends. Space colonisation can bias branch growth toward unfilled parts of the strate, but the spine and clearance checks remain authoritative. This combines the POI/Delaunay/A* ideas in the cave-generation literature with a required path and a spanning-tree connection policy; that combination is a VoxelForge design inference. [Santamaría-Ibirika et al., *Procedural Playable Cave Systems*](https://santosgrueiro.com/papers/2014/2014-Santam-Cave.pdf) · [Runions et al., *Modeling Trees with a Space Colonization Algorithm*](https://www.algorithmicbotany.org/papers/colonization.egwnp2007.html)
|
||||
|
||||
5. **Emit and check the records.** Convert accepted features into the existing room and edge records, derive conservative bounds, then validate graph endpoints, connectivity, grade, floor continuity, clearance and protected-band separation. Give each record a stable semantic ID; sort records and all equal-cost choices deterministically.
|
||||
|
||||
This order follows Spelunky’s documented practice of generating a safe exit path before adding randomized interest. Deep Rock Galactic offers a useful room-and-tunnel model: room templates have exits that connect through winding tunnels. Minecraft’s cheese, spaghetti and noodle caves suggest useful scale families for chambers and passages. [Spelunky 2 interview](https://blog.playstation.com/archive/2018/08/29/first-look-at-spelunky-2-gameplay-plus-new-derek-yu-interview/) · [Deep Rock Galactic cave-generation article](https://store.steampowered.com/news/posts/?appgroupname=Deep+Rock+Galactic&appids=548430&enddate=1730296516&feed=steam_community_announcements) · [Minecraft, *Caves & Cliffs: Part II*](https://www.minecraft.net/en-us/article/caves---cliffs--part-ii-out-today-java)
|
||||
|
||||
## Grade routing in 3D
|
||||
|
||||
A 15° walk grade allows at most `tan(15°) ≈ 0.268 m` of vertical change per metre of horizontal run. Check the maximum local grade along each smoothed edge, including its joins—not just endpoint heights or average grade. A 10 m elevation change therefore needs at least 37.3 m of horizontal run.
|
||||
|
||||
Place backbone-room floors along a grade-feasible route, and constrain their heights to that profile. When the direct route lacks enough run, use broad switchbacks whose legs progress monotonically in height. Keep legs far enough apart to avoid overlapping XY projections and ambiguous floor ownership; use separate smooth edges for separate legs.
|
||||
|
||||
Avoid tight helical coils in the first planner. R3 links L38’s 0.939 m floor-ripple period to the coil’s segment spacing and explains how a nearby turn can win floor ownership. Its proposed floor-near ownership rule improved a synthetic case, but did not prove a fix on the real route. [R3](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Research3/REPORT.md:5>) · [R3 coil analysis](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Research3/REPORT.md:9>)
|
||||
|
||||
If the mouths, bounds and grade limit admit no route, reject that candidate; keep the 15° limit fixed.
|
||||
|
||||
## Fit with Core and the artifact
|
||||
|
||||
The resolved snapshot already carries cavern rooms and edges, and includes them in canonical layout identity. The current `ResolveResolvedCavernGraphV1` copies supplied positions, derives irregularity seeds and bounds, then validates records; it does not choose room positions or routes. A separate Core planning entry point can produce those records before snapshot finalization. [Snapshot records](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h:945) · [Current resolver](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ResolvedLayoutInternal.h:1294) · [R17 finding](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Research17/REPORT.md:13)
|
||||
|
||||
Run planning after passages and stamps are resolved, before `Layout.finalize` and JSON export. `isTileShapeFree` already rejects tiles whose padded bounds touch graph bounds. Keep those bounds conservative: include supports, blends, relief and junctions. The graph tile-list builder currently scans graph feature bounds per tile; a graph BVH would reduce candidate work as networks grow. Keep candidate order stable after the spatial query. [Adapter order](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:1259) · [Shape-free proof](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/VoxelForgeCore.cpp:1396) · [Graph tile list](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:3431)
|
||||
|
||||
The floor/wall artifact remains unresolved. L47 found sawtooth teeth at the wall foot beyond its floor rails. L48’s rounded-cap trial still failed the whole-surface gate and increased flagged area. L48 describes L49’s next idea—build the bore and floor as one filleted SDF before stamps—but no L49 report or artifact is present in this checkout, so that remains unverified. [L47](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux47/REPORT.md:31) · [L48 results and L49 proposal](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux48/REPORT.md:13)
|
||||
|
||||
For planned rooms and edges, preserve native solid under the walking floor wherever possible; make the floor part of each shape’s profile, with narrow support fallback. Build the floor, bore and rounded wall-foot as one shape. Avoid a hard post-pass floor cap, tangent-only room/edge contact, and wall relief near the walk plane. R16 gives a practical geometric fillet target of at least `2h`, preferably `3h`: at the 25 cm base spacing, 0.5–0.75 m. These are sampling targets, not guarantees; coarse LODs need separate filtering or feature-aware handling. [R16 composition and sizing](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Research16/REPORT.md:3) · [Current composition order](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:1787)
|
||||
|
||||
## Verification plan and implementation slices
|
||||
|
||||
- **Graph:** Check endpoint IDs, connectedness, spine reachability, loop counts, room/edge clearance, and mouth joins. Treat links as undirected for reachability; current validation requires an edge’s end ID to name a same-strate room, while its start ID only has to be nonempty.
|
||||
- **Walkability:** Flood-fill the final composed field from arrival to departure using the project’s player-fit capsule (0.34 m radius × 1.76 m height), support and headroom checks. Graph connectivity alone does not prove a traversable route. [R12 verification guidance](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Research12/REPORT.md:51) · [Capsule dimensions](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Research1/REPORT.md:10)
|
||||
- **Geometry and determinism:** Sweep seeds, including tight bounds and maximum mouth-height differences. Check edge grades, ceiling/bedrock clearance, wall-foot defects and floor profiles. Extend the L48 audit from its current one-room/one-edge assumption to all graph surfaces; check LOD0 and transitions. Compare layout, density, mesh and topology hashes across worker counts and reordered inputs.
|
||||
- **Cost:** Measure planner time separately from tile evaluation. Run five paired graph-off/on views with matching tiles; report total and density time, graph BVH candidates, per-feature evaluations and memory. The current edge evaluator searches the curve per sample, so track cost as room and edge counts rise. No graph-scale cost result is established by this read-only review.
|
||||
- **Slices:** First, one mandatory spine with one room and no optional links. Second, Poisson room placement and connected branches. Third, loops, graph BVH and the generalized whole-surface audit. Run the seed sweep and paired cost measurements before enabling optional topology.
|
||||
|
||||
**Questions for the owner:** None blocking; the R17 authoring decision settles the main open question.
|
||||
|
||||
Read-only research only; no source edits, builds or tests were made.
|
||||
@@ -0,0 +1,77 @@
|
||||
# R19 — why FloatingIslands costs about 10×
|
||||
|
||||
## Log evidence
|
||||
|
||||
The closest same-view comparison is the unprofiled W12 pair in the L28 logs: [FloatingIslands](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/linux28-plain-baseline-floating-islands-l27-p1.log:30>) and [SurfaceWorld](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/linux28-plain-baseline-surface-world-l27-p1.log:24>). Both generate **2,370 tiles**, including **960 full-detail tiles**.
|
||||
|
||||
| Measure | FloatingIslands | SurfaceWorld |
|
||||
|---|---:|---:|
|
||||
| Plan preparation | 222 ms | 41 ms |
|
||||
| Shape build | 0.891 s | 0.396 s |
|
||||
| First tile ready | 1.280 s | 0.471 s |
|
||||
| Near neighborhood ready | 1.556 s | 0.486 s |
|
||||
| Whole view ready | 18.971 s | 1.867 s |
|
||||
| Full-detail meshing worker sum | 138.139 s | 2.872 s |
|
||||
| Full-detail classification worker sum | 98 ms | 9 ms |
|
||||
|
||||
The shape builds have the same 138.2 million nodes and 18,420 primitives. FI’s extra shape time is mostly the surface-band stage (679 ms vs 209 ms); it does not explain the roughly 17 seconds of extra whole-view time. Later five-pair timings also retain about a 10× gap: 16.543 s FI vs 1.530 s SW ([L30 report](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux30/REPORT.md:40>)).
|
||||
|
||||
Per-LOD worker sums are aggregate worker time, **not wall time**:
|
||||
|
||||
| LOD | Tiles, both | FI worker sum | SW worker sum |
|
||||
|---:|---:|---:|---:|
|
||||
| 0 | 512 | 66.31 s | 1.98 s |
|
||||
| 1 | 448 | 72.76 s | 1.09 s |
|
||||
| 2 | 320 | 4.60 s | 1.26 s |
|
||||
| 3 | 208 | 3.81 s | 1.29 s |
|
||||
| 4 | 240 | 3.21 s | 2.69 s |
|
||||
| 5 | 144 | 1.14 s | 1.12 s |
|
||||
| 6 | 96 | 3.40 s | 2.78 s |
|
||||
| 7 | 96 | 8.98 s | 1.25 s |
|
||||
| 8 | 306 | 48.43 s | 3.28 s |
|
||||
|
||||
LOD0–1 accounts for most of the gap: its meshing-exclusive worker time is 138.13 s FI vs 2.87 s SW. LOD7–8 adds another large difference: 57.41 s vs 4.53 s total worker time. FI’s LOD8 log also reports 21.27 s of `column_eval_exclusive_ms`, vs 0.57 s for SW. That counter measures Heightfield2D column computation, **not** the FI island-column cache; the existing baseline logs do not split far-shell work finely enough to assign that cost further.
|
||||
|
||||
FI is mostly air by design, but the logs do not count whole-view empty meshes. They do show FI with **zero whole-tile skips** and **25,536 unknown boxes** in the timed run. A separate L9 proof audit reports **21,504 FI fallback/unknown blocks and zero checked blocks**; SW checked 26,977 blocks / 35.9 million samples with zero violations ([Linux28 proof summary](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux28/REPORT.md:79>), [Linux25 summary](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux25/REPORT.md:29>)). So the measured problem is clear: FI’s air is not being cheaply certified and skipped. The exact whole-view empty-tile count still needs `--mesh-coverage`.
|
||||
|
||||
## Cost model
|
||||
|
||||
- `FloatingIslandFieldV1::interval` returns unknown whenever a box intersects any island or connector influence AABB; it proves air only outside all those bounds ([`FloatingIslandsInternal.h:interval`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/FloatingIslandsInternal.h:2099>), [`ShapeWorldInternal.h:ClassifyBoxDetailed`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:4919>)). Broad bounds therefore leave many actual-air boxes ambiguous.
|
||||
- The owner plan has four islands. `buildFeatureTileList` disables candidate evaluation for plans of four or fewer, so the standard run does not use its per-tile group bounds to prune those island evaluations ([`FloatingIslandsInternal.h:buildFeatureTileList`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/FloatingIslandsInternal.h:1925>), [`WorldAssemblerInternal.h:find`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/WorldAssemblerInternal.h:33>)). On the current geometry-v2+ path, each island evaluates five root lobes; four islands mean up to 20 root SDF evaluations per field query, plus connector work ([`IslandDensity` / `FieldDensity`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/FloatingIslandsInternal.h:711>).
|
||||
- There is also avoidable repeated work: `DensityAtLatticeX8` calls `NativeFloatingIslandDensityAt` to detect an FI lane, then calls `DensityAtLattice` for each lane, which evaluates the native FI field again. Reusing the preflight result could remove a duplicate evaluation for lanes inside the FI field ([`DensityAtLatticeX8`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:3100>), [mesher call site](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/VoxelForge/Private/VoxelMarchingCubesMesher.cpp:1289>)).
|
||||
- The native-only shortcut is SurfaceWorld-only and limited to LOD0. FI is not eligible, but the timed run reports zero shape-free desired tiles for both recipes, so this is not the main cause of this run’s gap ([`NativeOnlyBoundsForTile` / `isTileShapeFree`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/VoxelForgeCore.cpp:1098>)).
|
||||
- Far work is a real second target: FI’s island plan prevents the native-surface-horizon shortcut from skipping far-shell repair at LOD7+, while ground/cap refinement also runs for LOD4+. The static run’s `--far-horizon-lod8-step=0` does not remove those paths ([`generateTile`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/VoxelForgeCore.cpp:1960>)). Profile the shell and column sub-stages before attributing the LOD8 cost more narrowly.
|
||||
- Page proofs are not on the static benchmark path: it has no region crossing. Existing page-route audits pass, but they do not explain the static whole-view timing ([`compileTileRegion`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/VoxelForgeCore.cpp:1487>), [Research11](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Research11/REPORT.md:9>)).
|
||||
|
||||
## Ranked work
|
||||
|
||||
1. **Tight conservative interval bounds, then coarse-to-fine proofs.** Certify empty air blocks outside actual island, helix, column, floor, ceiling and band support; refine only boxes whose bounds cross zero. This has the largest potential gain because it can avoid meshing air. Proof soundness is the main risk: preserve exact sampling for mixed boxes and validate proof audits, appearance and hashes.
|
||||
2. **Reuse the X8 FI preflight samples.** This is a direct source-level duplication and should be a lower-risk exact-output optimization. It can approach a 2× reduction in FI field work on affected lanes, but cannot by itself reach 1 s.
|
||||
3. **Use per-tile island-group pruning; add a BVH if plans grow.** First measure the existing group-bound path that the four-island setting currently disables. A new BVH is more useful as island/connector counts rise; for four islands, test the existing certificates first.
|
||||
4. **Profile and simplify LOD7–8 far-shell work.** It may save seconds, but cannot close the full 10× gap alone; changing LOD8 representation also risks visible horizon changes.
|
||||
5. **Measure before adding caches.** The shared XY column cache is already present. L7 showed a 19% SW whole-view improvement, while L29’s cache experiment did not improve cost; neither establishes a comparable FI gain ([L7 report](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux7/REPORT.md:40>)).
|
||||
6. **GPU later.** First remove redundant field work and skip proven air. GPU work adds dispatch, transfer and exact-parity costs without fixing loose bounds.
|
||||
|
||||
## Builder measurement plan
|
||||
|
||||
Run five fresh-process W12 timing pairs, alternating recipes, without hashing or profiling:
|
||||
|
||||
```sh
|
||||
taskset -c 0-11 env LP_NUM_THREADS=12 <headless-binary> \
|
||||
--world-assembler-prototype --stream-benchmark --stream-pipeline \
|
||||
--force-generate --clip-radius=3 --max-clip-level=8 \
|
||||
--far-horizon-lod8-step=0 --workers=12 --recipe=floating-islands \
|
||||
Standalone/data/owner_world.json
|
||||
```
|
||||
|
||||
Repeat with `--recipe=surface-world`. Then profile each recipe separately with `--profile-lod-work --mesh-coverage`; compare per-LOD density samples, MC grid/cell/gradient/interpolation work, shell calls, ground/cap columns, and non-empty mesh tiles. Profiling adds overhead, so use those runs for attribution, not headline timings. The headless parser has no generic `--profile` flag; the relevant switch is `--profile-lod-work` ([`StreamBenchmarkHeadless.cpp`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/StreamBenchmarkHeadless.cpp:869>)). Heightfield column counters do not expose FI’s `IslandColumnCache` hits; use the stack sample or add a focused diagnostic for island-cache hits/misses and root/connector evaluations if needed.
|
||||
|
||||
For proof coverage, rerun without `--force-generate` and add `--audit-uniform-block-proofs --mesh-coverage`; `--force-generate` disables the block audit. For travel, add `--camera-step=8,0,0` and then `--camera-step=24,0,0`, with `--profile-lod-work`. Compare entering-tile count, completion count, wall time, per-LOD work and queue backlog. Existing moving output is aggregate; smoothness also needs per-entering-tile queue wait and submit-to-complete p50/p95 latency.
|
||||
|
||||
For hotspot stacks, run the same unprofiled FI and SW commands under `perf record -F 99 -g --call-graph dwarf`, then inspect with `perf report --stdio --sort symbol`. Treat this as hotspot evidence, not a timing comparison; `perf-record(1)` documents the call-graph modes ([manual](https://man7.org/linux/man-pages/man1/perf-record.1.html)).
|
||||
|
||||
## What ≤1 s requires
|
||||
|
||||
FI needs roughly a **94% wall-time reduction** from 16–18 s; the 12-worker LOD totals in the reference log are about 213 worker-seconds, versus roughly 12 worker-seconds for an ideal one-second budget. SW also needs about a 40% reduction from the owner’s 1.7–1.8 s. A cold FI shape build alone took 0.89 s in the reference run, so strict sub-second whole-view generation also requires reducing or overlapping shape work.
|
||||
|
||||
For VR and fast travel, measure the near ring and newly entering tiles separately from completion of all 2,370 view tiles. Prioritize nearby work and let far LODs refine asynchronously; validate 8 m and 24 m movement, deterministic hashes across worker/compiler configurations, and tail tile latency. No edits, builds or binaries were run for this report.
|
||||
Reference in new issue
Block a user