Files
VoxelForge/Standalone/Research/WorldAssemblerM3/Research20/REPORT.md
T
Fr0zkaandClaude Opus 5.5 75550256ef perf(core): FloatingIslands whole view 16.7 s -> 7.4 s (L51); research R20
Measured first: 45% of FI tiles are all-air, yet FloatingIslandFieldV1 returned unknown for any box near
an island AABB (25,536 unknown boxes, 0 tile skips). Conservative ranges for island bodies, root lobes,
buttresses, connectors, surface detail and smooth-min budgets now let the shared box classifier prove FI
air/solid (216 tile skips; 28.6 M audited samples, 0 violations). The X8 path reuses its FI preflight
samples. LOD7-8 far-shell and column work is skipped outside per-tile island/connector influence bounds
(farHorizonVersion 4 -> 5). FI 16.74 -> 7.36 s (-56%), FI moving entering-tile p50 halved; SW unchanged.
Peer determinism (Clang/GCC W1/W8/W12, random cameras) PASS; fast/medium/full PASS.
Research R20: world-type catalogue and dreamcore/liminal concepts (revised after a deepening pass).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
2026-10-24 20:36:54 +02:00

248 lines
41 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# VoxelForge R20 — revised report: world types and liminal landscapes
## Findings from the code
Core’s native stratum selector currently has only three kinds: `Legacy`, `SurfaceWorld`, and `FloatingIslands`. The automatic Unreal adapter builds native plans for SurfaceWorld and FloatingIslands; other archetypes fall through the legacy path. Imported manifests can carry extra stamp or cavern records, but the Strate asset adapter does not author those records as native generator families. [Core field kinds](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:142>), [automatic adapter](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:839>)
The legacy enum has eight names but fewer independent builders:
- `FlatPlain` and `CrystalChamber` both call `BuildSlabStack` with `FSlabGenerationParams`. The builder comments that their runtime path does not distinguish them; CrystalChamber does not generate crystal solids.
- `TunnelNetwork` and `Underwater` both call `BuildTunnelNetworkStack` with `FStrateGenerationParams`.
- Maze, SurfaceWorld, VerticalShafts, and FloatingIslands each have their own legacy stack. The implementations are dispatched in [VoxelGenerator.cpp](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelGenerator.cpp:2586>).
Core does already accept resolved SDF stamps and cavern graph records. Stamp lookup has a BVH, with ellipsoid, arch, pillar, and dais shapes; cavern candidates are scanned linearly. More significantly, the current classifier marks any queried box touched by a stamp or cavern feature as mixed. The BVH saves candidate work; by itself, it does not prove air or solid. [Stamp records](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h:725>), [stamp index](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:3355>), [cavern records](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h:766>), [cavern candidate list](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:3740>), [classification](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:4998>)
Core’s field sign convention is negative for solid and nonnegative for air. Research6 describes a desirable metre-native, immutable field contract with conservative intervals, but the local design note labels that work as design discussion; it is not yet a common runtime interface for every generator. [Research6 contract](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Research6/REPORT.md:22>), [design status and contract](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/DESIGN_WORLD_ASSEMBLER.md:1>)
Walkability is part of the game contract. The GDD requires every strate to have findable entrance and exit mouths; automatic generation and composer features must preserve a capsule-swept, supported route. Core’s `BuildFiniteSurfaceRoute` is SurfaceWorld-specific. The shared passage planner handles inter-strata passages, but the asset comments say Worm, Spiral, and Cascading styles are not guaranteed walkable. The route helper uses a 1.76 m capsule, about 0.34 m radius, and a maximum grade equivalent to 15°. Treat that as a current SurfaceWorld constraint, not a universal comfort standard. [GDD](</home/jahni/VoxelM/Plugins/VoxelForge/GDD.md:132>), [SurfaceWorld route](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:141>), [shared passage planner](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ResolvedLayoutInternal.h:1842>), [passage styles](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1850>)
A composition-order detail matters for new recipes: Core applies cavern graph, boundary band, passage carve, then stamps, followed by cavern floor caps. A later feature can therefore re-block a route or mouth. Reserve feature keepouts around route and passage sweeps, then check the fully composed field. [Composition order](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:1788>)
The current water renderer is a non-colliding plane that follows the player. It is not a local pool mask, swim model, or basin system. The owner has already chosen fixed seasonal water; a pool-room recipe needs local, static water rendering and any required movement, collision, and hazard support. [Water update](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelContentManager.cpp:2499>), [water asset contract](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateDefinition.h:211>), [owner’s water decision](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/DESIGN_WORLD_ASSEMBLER.md:846>)
Performance evidence also needs updating. Linux51 measured the post-optimization FI whole view at **7.355 s**, SurfaceWorld at **1.756 s**. Before that pass, FI was about 9.5 times slower than SW; afterward it was about 4.2 times slower. FI still had a 1.304 s p95 entering-tile latency on the 24 m moving run. The audit certified 21,504 blocks and sampled 28.6 million points with no violations, while the separate runtime classification still had 18,857 mixed and 240 unknown boxes. So interval bounds mattered, but the remaining cost is not all “unprovable air”: meshing and far-shell work remain too. These are Linux/headless timings, not VR frame-rate measurements. [Linux51 measurements and audit](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux51/REPORT.md:9>)
## Liminal landscape rules
“Liminal” covers several spatial grammars, not one terrain style. Banfield warns against using liminality as an umbrella for every ambiguous place; the generator should expose distinct profiles such as repeated landscape, empty civic space, threshold maze, and artificial geometry in nature. [Banfield, “From liminal spaces to the spatialities of liminality”](https://doi.org/10.1111/area.12791)
Useful landscape rules:
1. **Keep a recognizable base.** Start from a familiar hill field, corridor, pool, or chamber. Diel and Lewis’s experiments associate uncanny built places with deviations from expected spatial configurations, including unusual scale, missing or displaced features, and excessive repetition. Their work is about images of places, not VR terrain, so this is a design guide rather than a VR result. [Diel & Lewis, 2022](https://orca.cardiff.ac.uk/id/eprint/151790/)
2. **Change a few relationships at a time.** One repeated hill that is too regular, a monolith at the wrong scale, or a pool embedded in rock can feel wrong while remaining legible. Randomly changing every feature risks losing both coherence and navigation.
3. **Use familiarity mixed with mismatch.** Wu’s cultural analysis of dreamcore describes the tension between recognizable scenes and disquiet, including infrastructure that does not belong in its natural setting. [Wu, 2022](https://doi.org/10.1080/14797585.2022.2097013)
4. **Offer more than one palette.** A study of 449 adults rating 18 selected dreamcore images found warmer/comforting and darker/eerie preference dimensions. That supports configurable moods; it does not establish one canonical dreamcore palette. [Song, Choi & Li](https://doi.org/10.1177/02762374251356955)
5. **Let the player interpret, but keep the route readable.** The Yume Nikki team reported Kikiyama’s instruction to avoid explaining the dream and let players interpret scenes themselves. The Exit 8 developer describes cutting an overly difficult anomaly and adding signage where the intended response was hard to infer. Together these suggest ambiguity in meaning, with clear spatial cues for safe progression. [Yume Nikki GDC interview](https://operationrainfall.com/2018/05/14/yumenikki-dream-diary-gdc-playism-kikiyama-interview/), [The Exit 8 developer interview](https://automaton-media.com/en/interviews/interview-the-exit-8-developer-kotake-create-on-the-perks-of-being-a-solo-dev-and-how-platform-8-came-to-be/)
6. **Use abrupt shifts at authored thresholds.** Osamu Sato described using dream-diary material for LSD: Dream Emulator and dream-like jumps between places. For this game, such shifts should happen at stable doors, mouths, or thresholds, not as per-sample spatial randomness. [Osamu Sato interview](https://daily.redbullmusicacademy.com/2017/11/osamu-sato-interview/)
7. **Treat sound and emptiness as design channels.** Anemoiapolis’s creator cites childhood pools, a hometown dead mall, and an apparently endless church basement. POOLS’ developer notes describe room-size-dependent reverb and added exit signs to help players who got lost. VoxelForge already has fog, ambient light, decorations, landmarks, and ambient sound, but I found no room-dependent reverb system. [Anemoiapolis creator notes](https://andrewq.artstation.com/projects/Vydxg8), [POOLS developer notes](https://tensori.itch.io/pools/devlog)
8. **Keep impossible geometry intentional and multiplayer-stable.** The Manifold Garden GDC talk stresses repeated architecture as a navigation cue and that unusual geometry should communicate intent. Superliminal’s forced-perspective techniques depend on the camera view; the PossibleImpossibles research likewise creates viewpoint-specific visual bridges. Use such effects as scenery or set-pieces, not shared collision fields that must work from every player’s view. [Manifold Garden GDC talk](https://gdcvault.com/play/1023143/Level-Design-Workshop-Level-Design), [Superliminal technical article](https://blog.playstation.com/2020/06/30/breaking-down-the-tech-behind-superliminals-mind-bending-illusions/), [PossibleImpossibles](https://doi.org/10.1111/cgf.15052)
Pastel tint, fog, a hidden horizon, endless planes, and unusual smoothness are useful art controls, not required definitions. In this game the world is finite and internally lit; fog can hide the sealed cap, but cannot replace it. The GDD’s anomalous strates should remain rare and should not blend into neighboring strates, so the ordinary strata stay useful as a contrast. [GDD](</home/jahni/VoxelM/Plugins/VoxelForge/GDD.md:142>)
## Shared field and composition model
For the proposed recipes below, let `h(x,y)` be the walkable ground and `c(x,y)` the solid ceiling or sky-cap boundary, both measured in metres:
```text
D0(x,y,z) = min(z - h(x,y), c(x,y) - z)
```
Negative is solid; positive is air. `D0` is a signed clearance field, not a Euclidean SDF on sloped ground. A solid feature with signed distance `S` joins via `D = min(D0, S)`. A carved void with negative-inside SDF `C` joins via `D = max(D0, -C)`.
The heightfield interval for a query box with `z ∈ [zL,zU]`, `h ∈ [hL,hU]`, and `c ∈ [cL,cU]` is:
```text
Iground = [zL - hU, zU - hL]
Icap = [cL - zU, cU - zL]
ID0 = [min(Iground.lower, Icap.lower),
min(Iground.upper, Icap.upper)]
```
Outward-round the interval. If its lower bound is positive, the box is air; if its upper bound is negative, it is solid; otherwise it is mixed and must be evaluated or subdivided. For the analytic profiles below, compute exact cosine, radial, or smoothstep ranges over each box where practical.
All five recipes are proposed field behavior. They reuse existing primitives and composition where noted; none is currently a native Core recipe. Keep them inside the resolved content region with margins from the actual ceiling and bedrock bands. Where a feature deliberately meets a band, let it merge into the solid band without crossing into the adjacent strate. Plan arrival/departure mouths and route anchors first; keep features out of their swept capsule clearances, use a passage style with a walkability guarantee, then validate support and clearance after full composition. The suggested 2.2 m ordinary-route clearance and 8 m fight-space headroom are design targets, not current universal Core checks.
## Five buildable liminal profiles
The metre ranges below are proposed authoring ranges for new profiles. Existing legacy parameter structs retain their authored voxel/chunk units and need a versioned conversion before sharing metre-native recipes.
### 1. Repeating rolling hills
**Reuse and new work.** Reuse SurfaceWorld’s data flow: legacy `BuildSurfaceStack` / `FSurfaceGenerationParams`, native `BuildSurfaceProfile` and `BuildSurfaceStratumPlan`, and Core `Heightfield2D::point`, `classifyLatticeBox`, and `interval`. The current native profile is noise-based; it has no analytic periodic-hill profile. Add a versioned periodic height function and route anchors. [SurfaceWorld stack](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:9348>), [params](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1418>), [Core profile and plan](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:272>), [Core heightfield](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/WorldAssemblerInternal.h:2068>)
```text
h(x,y) = h0 + Ax*cos(2πx/Lx + φx) + Ay*cos(2πy/Ly + φy)
c(x,y) = c0
D = D0
```
Suggested values: `Ax, Ay = 0.5–3 m`; `Lx, Ly = 80–160 m`; stable phases `φx, φy`; finite strata bounds, with roughly 2–6 repetitions in the fog-visible vista. Require `G = sqrt((2πAx/Lx)^2 + (2πAy/Ly)^2) ≤ tan(15°) ≈ 0.268` along the player route. For `A=2 m`, `L=80 m` in both axes, the maximum grade is about 12.5°.
The floor can carry a supported route; the cap and bedrock bands remain as sealed boundaries. Keep minimum ground-to-cap clearance at least 2.2 m on the route and 8 m where a fight arena needs the GDD’s camera space. The existing SurfaceWorld route helper is the closest route reuse, but it does not prove this proposed periodic recipe until it is connected to the final field.
For a box, find exact cosine extrema by checking its endpoints and any included stationary points. Then use the shared heightfield interval above. The field Lipschitz bound is `L_D ≤ sqrt(1+G²)` for the ground side and `1` for the flat cap; min composition preserves the maximum bound.
At standing eye height, the player sees spotless, repeating hill crests inside a sealed, fogged cavern. The familiar ground plane and deliberate periodicity make the hills uncanny; a single out-of-pattern marker can anchor orientation without making the whole scene noisy.
### 2. Near-vertical ramp fins that rise to the ceiling
**Reuse and new work.** Reuse `BuildSlabStack` / `FSlabGenerationParams` only for the flat base-floor/ceiling idea, plus shared composition and passage handling. There is no existing tilted slab stamp: current `fillPillar` and `fillDais` do not express an oriented ramp. Add an oriented-box SDF, bounded placement, and sharp geometry support across LOD and collision. [Slab builder](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:9373>), [slab params](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1222>), [stamp SDFs](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6117>)
For a ramp box with center `p0`, half-extents `a`, and rotation `R` around the horizontal axis, let:
```text
q = abs(Rᵀ(p - p0)) - a
Sbox = length(max(q,0)) + min(max(qx,qy,qz),0)
D = min(D0, Sbox)
```
Suggested values: pitch `θ = 75–90°`; vertical rise `H = 12–32 m`; width `8–20 m`; thickness `1–2 m`; one to four repeated fins in the visible region. End the feature flush against the underside of the ceiling band, and merge its base into the floor solid without opening the bedrock band. The field can be positioned to meet the cap; it must not punch through to the neighboring strate.
This is a visual feature, not a walkable ramp. A separate floor route must bypass it and stay at or below 15°. If the player is expected to climb it, that requires a separate movement/gravity design; a 15° path needs about 45 m horizontal run for 12 m rise and 120 m for 32 m rise.
The box SDF is 1-Lipschitz. Compute its interval in the rotated box coordinates, or use a conservative center value plus the AABB half-diagonal bound. Its finite support box can be indexed in a BVH. From eye height the player sees a wall-like plane rising into the cap; repeating it with one controlled orientation and a safe bypass makes it feel designed rather than a collision error.
### 3. Flat field with lone monoliths
**Reuse and new work.** Reuse a flat SurfaceWorld profile through `BuildSurfaceProfile` and `Heightfield2D`, or legacy `BuildSlabStack`. Core already has `fillPillar`, `StampSdf`, `ApplyResolvedSdfStamps`, and `BuildStampSpatialIndex`; there is no Strate asset authoring path for those stamps, and any touched stamp box is currently classified mixed. Add a monolith placement recipe, tighter feature intervals, and asset authoring. [Stamp index and application](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:3355>), [pillar SDF](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6117>), [stamp composition](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6155>)
Use `h(x,y)=h0`, `c(x,y)=c0`. For each vertical capped cylinder centered at `(xi,yi,zi)`:
```text
ρ = sqrt((x-xi)^2 + (y-yi)^2)
qr = ρ - R
qz = abs(z-zi) - H/2
Si = sqrt(max(qr,0)^2 + max(qz,0)^2) + min(max(qr,qz),0)
D = min(D0, S1, S2, ...)
```
Suggested values: radius `R = 0.8–2 m`; height `H = 12–32 m`; spacing `80–240 m`. Seat each base on the floor and merge or stop its top at the ceiling band. Keep each route at least `R + 0.34 m` plus a safety margin away from the pillar, and reserve passage-mouth keepouts.
A cylinder SDF is 1-Lipschitz. Exact radial min/max distance from a query AABB to its center gives a tight interval; BVH support bounds cull features outside the box. On a flat path, walkability is straightforward. A solitary pillar, tiny floor references, fog hiding the cap, and no source of daylight create an intentional scale mismatch rather than a plausible support structure.
### 4. Nested terrace and pool court
**Reuse and new work.** Reuse the flat floor/cap profile and `Heightfield2D::point`; `waterFillSubvoxels` only provides the current surface fill channel, while `UVoxelContentManager::UpdateWater` renders a global player-following plane. Neither provides local pool geometry. Add the radial terrace profile, a static local water mask/render path, and any needed swimming/collision rules. [Heightfield water field](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/WorldAssemblerInternal.h:2102>), [water renderer](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelContentManager.cpp:2499>)
Let `r = sqrt((x-xc)^2+(y-yc)^2)`, and `s(t)=3t²-2t³` clamped to `[0,1]`:
```text
h(r) = hB + Σj Δj*s((r-rj)/wj)
c(r) = c0
D = D0
W = min(z-h(r), zw-z, Rp-r) # positive means inside the water volume
```
`W` is a separate water occupancy channel, not rock density. Suggested values: `2–5` terraces; each rise `Δ = 0.15–0.4 m`; transition width `w = 3–6 m`; court radius `4–12 m`; water depth `0.3–1 m`. Keep transitions from overlapping, and require `1.5Δ/w ≤ tan(15°)` for a ramped transition. For example, `Δ=0.4 m`, `w=3 m` gives a maximum grade near 11.3°.
Keep a continuous dry ring or ramp as the route between mouths; do not route through water unless swimming is an intentional movement mode. Bound `r` over each XY box using closest and farthest points from the center, then propagate through monotone `s`. The field bound is `L_D ≤ sqrt(1+G²)` for maximum terrain gradient `G`; the water mask has the same bound or `1`, whichever is larger.
The view is a set of too-regular, nested pool rims below a low sealed cap. Fixed water, empty rooms, and exact repeated geometry supply the unease. The dry route and clear mouth markings keep the geometry from reading as accidental obstruction.
### 5. Mirrored floor and ceiling relief
**Reuse and new work.** Reuse `FSurfaceGenerationParams` cap fields through `BuildSurfaceProfile` / `BuildSurfaceStratumPlan`, including ceiling undulation and ridge values. The current floor and cap profiles are independent; add a paired-phase profile. The player walks on the floor only. Walking upside down would require a new gravity and locomotion rule. [Surface profile mapping](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:272>), [ceiling parameters](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1590>)
```text
g(x,y) = Ax*cos(2πx/Lx + φx) + Ay*cos(2πy/Ly + φy)
h(x,y) = h0 + g(x,y)
c(x,y) = c0 - λg(x,y)
D = D0
```
Suggested values: `Ax, Ay = 0.5–2 m`; `Lx, Ly = 80–160 m`; `λ = 0.75–1`. Require `G ≤ tan(15°)` for the floor route and `c0-h0-(1+λ)(Ax+Ay) ≥ 2.2 m` everywhere; use at least 8 m where the arena needs it.
Use exact cosine extrema for box intervals. The ground bound is `sqrt(1+G²)`; the ceiling bound is `sqrt(1+(λG)²)`. Their minimum gives a safe bound for `D`.
The player sees a ceiling valley that mirrors the floor’s hill at the same place. Floor and cap remain closed, and the normal route is level enough to traverse. The matching phase is the impossible clue; the route stays physically ordinary.
## Catalogue and code reuse
Cost labels below estimate the **proposed Core field and proof cost**. They are not performance measurements. “Cheap” means a small analytic field with tight intervals; “medium” means a bounded graph or several local features; “expensive” means many thin/noisy features, weak intervals, broad mesh work, or additional gameplay systems. Existing SW and FI timings are called out separately.
The keys in the catalogue map to exact implementations:
- **S — SurfaceWorld:** legacy [`BuildSurfaceStack`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:9348>) with [`FSurfaceGenerationParams`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1418>); native [`BuildSurfaceProfile`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:272>), [`BuildSurfaceStratumPlan`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:320>), and [`Heightfield2D::point/classifyLatticeBox/interval`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/WorldAssemblerInternal.h:2068>).
- **P — slab:** [`BuildSlabStack`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:9373>) with [`FSlabGenerationParams`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1222>). Legacy FlatPlain and CrystalChamber use this same stack.
- **T — tunnel graph:** [`BuildTunnelNetworkStack`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:9422>) with [`FStrateGenerationParams`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:372>). Underwater uses it too. Cellular noise is a cave-surface roughness option; it does not make a bubble-room topology. Ribbing changes walls; it does not generate lava tubes.
- **M — maze:** [`BuildMazeStack`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:9536>) and [`FMazeGenerationParams`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1364>).
- **V — shafts:** [`BuildVerticalShaftStack`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:9390>) and [`FVerticalShaftParams`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1665>). The stack reuses Maze’s constant-rock, roughness, and carve operations.
- **I — islands:** [`BuildFloatingIslandStack`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelDensityOpStack.cpp:9504>) and [`FFloatingIslandParams`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1730>); native [`BuildFloatingIslandStratumPlan`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:487>) and [`FloatingIslandFieldV1::densitySubvoxelsForTile/interval`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/FloatingIslandsInternal.h:2330>).
- **D — disturbances:** [`ApplyDisturbances`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelGenerator.cpp:1050>) with [`FStrateDisturbanceParams`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:1798>). The chasm box query is conservative XY overlap; it is not a native canyon planner.
- **Cav — optional cavern records:** [`ResolvedCavernRoomV1/EdgeV1`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h:766>), [`ApplyResolvedCavernGraph`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6189>), and [`BuildCavernFeatureTileList`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:3740>). These are not a native Strate asset generator.
- **Stamp — optional SDF records:** [`BuildStampSpatialIndex`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:3355>), [`StampSdf`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6117>), and [`ApplyResolvedSdfStamps`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6155>). Existing stamp kinds are ellipsoid/arch carves and pillar/dais fills; yaw supports quarter turns.
- **R — route and composition:** SurfaceWorld-only [`BuildFiniteSurfaceRoute`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:141>); shared [`PlanResolvedLayoutPassagesV1`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ResolvedLayoutInternal.h:1842>) and [`ApplyResolvedStrateComposition`](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:1788>). The shared route law comes from the design note, not from a universal route generator.
- **Vis and water:** [`FStrateDecoration`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:2205>), [`FStrateLandmark`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:2269>), and [`ApplyFogSky`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelAtmosphereManager.cpp:127>) provide presentation. [`UpdateWater`](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelContentManager.cpp:2499>) supplies the current global water plane. Gameplay tags are metadata, not generator dispatch. [Definition and tags](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateDefinition.h:393>)
| Type and player fantasy | Exact reuse; new work | Cost, proof, route/VR risk, authoring |
|---|---|---|
| **Surface plains and mountains** — open-feeling landscape underground. | **S**. Existing terrain columns, cap, biome profile, and legacy overhang path. | **Medium today:** SW is 1.756 s for Linux51 whole view. Noise and cliffs need sound local bounds. Author `SurfaceParams` and biome profiles. |
| **Flat plains / slab** — broad fight space, columns, low or high cap. | **P**. No native slab generator. | **Cheap target** with plane/cap intervals; columns make intersecting boxes mixed. Low walkability risk. Author `SlabParams`; native recipe still needed. |
| **Giant cavern / cathedral** — huge rooms, natural ceiling and chambers. | **T + Cav**. Add native room and edge graph authoring, interval bounds, and route plan. | **Expensive with current optional graph** because touched boxes stay mixed and candidates are linear; **medium target** with sparse graph BVH and intervals. Vertical voids add fall risk. |
| **Chasms and bridges** — cross a broken floor above depth. | **D** can layer legacy chasm/bridge/ridge effects over an archetype. Add a finite Core rift graph, stable bridge supports, and route keepouts. | **Medium target** if features are bounded and sparse. Boxes near cuts are mixed. High vertigo/fall risk. Author disturbance profile plus route plan. |
| **Canyons / slot canyons** — follow a long trench through terrain. | **S** cliff controls plus **D** disturbances. No connected native canyon recipe. Add a bounded trench network and path planner. | **Medium target** with analytic trench intervals; noisy cliff intersections raise cost. Exposed drops and scale are VR risks. Author canyon graph and terrain profile. |
| **Maze** — branching underground passages. | **M** gives a deterministic lattice and optional loops; add final capsule route proof. | **Medium–high** for graph traversal and route proof. Repetition and lost orientation are risks. Author `MazeParams` plus route constraints. |
| **Vertical shaft world** — descent by ledges and links. | **V + M**. Existing shaft placement, ledges, connectors, and reused carve operations. | **Medium–high**; bounds must include complete shaft legs and ledges. High vertigo and falling risk. Author `VerticalShaftParams` and safe landings. |
| **Floating islands** — traverse suspended terrain. | **I**. Existing native field and route/island plan. | **Expensive today:** 7.355 s whole view, 1.304 s p95 entering tile at 24 m. Residual mixed boxes and mesh/far-shell work remain. Strong vertigo risk. Author `FloatingIslandParams`. |
| **Underwater tunnel** — descend through flooded cave. | **T** plus current global water plane. Add local water volume, swim/collision behavior, and dry-route policy. | **Medium field / medium-high end-to-end**. Rock graph can be bounded; water is not local today. Risk: disorientation and movement mismatch. Author `GenerationParams`, water channel, and route. |
| **Flooded karst** — sinkholes, submerged rooms, and dry ledges. | **T + Cav + water**. Add local basin masks, roof openings, and water-aware route graph. | **Expensive with current classifier; medium target** with sparse graph intervals. Openings and water boundaries create mixed bands. Risk: ceiling/floor confusion. |
| **Honeycomb / bubble rock** — walk through rounded cellular pockets. | **T** can reuse `RoughnessNoiseType=Cellular` only for surface roughness. Add explicit bounded cell or sphere-pocket topology. | **Medium** with finite cells and per-cell intervals; expensive if implemented as dense cellular noise. Claustrophobia and repetition risk. Author cell graph and pocket radii. |
| **Lava tubes** — connected conduits around a static lava channel. | **T** room/corridor graph and wall ribs are reusable details, not tube topology. Add a conduit graph and fixed lava occupancy/material. | **Medium target**, with a local mixed band around tubes; expensive for dense particles or animated effects. Risk: flicker and narrow passages. |
| **Root / fungal world** — tunnels threaded through large organic growth. | **T + Stamp + Vis** for the room graph, a few existing fills, and decorations. Add a sparse branching volume graph and bounds. | **Medium** when branches are few and thick; expensive for many thin vines because surface boxes remain mixed. Overhead collision risk. |
| **Inverted world** — a mirrored ceiling over a walkable floor. | **S** cap undulation/ridge parameters. Add paired floor/cap phase. Ceiling walking requires new gravity. | **Cheap field**, medium gameplay if gravity changes. Paired height intervals are simple. Risk: disorientation, particularly with rotation. |
| **Ruins / megastructure** — an artificial system spanning a cavern. | **M/T + Stamp + Vis**: lattice or room framework, limited primitives, landmarks. Add typed structural graph, beam/column intervals, sharp mesh/collision. | **Medium** if sparse; **expensive** if dense or if crisp geometry must survive all LODs. Collision snags and low ceilings risk. Author structure graph and motif library. |
| **Crystal chamber / forest** — stand among hanging crystals or giant prisms. | **P + Vis**. Legacy CrystalChamber is the same slab stack as FlatPlain; its comment expects decorative actors for crystals. Add oriented crystal field features. | **Medium–expensive:** thin prisms leave many mixed boxes; current sharp geometry path is narrow. Proximity and collision risk. Author crystal anchors and excluded route volumes. |
| **Salt or mud flats** — stark flat expanse with a few cracks or polygon plates. | **S** with flat parameters; no native crack-network profile. Add cracks as bounded features if physical. | **Cheap** if material-only; **medium** with physical crack geometry and certificates. Low route risk; monotony risk. Author flat profile and optional crack graph. |
| **Dunes** — repeated ridges across a broad chamber. | **S** heightfield base; add an analytic dune profile. | **Cheap–medium** for a small analytic set; expensive with warped high-frequency detail. Require route grade ≤15°. Repetition fatigue risk. |
| **Glacial caves** — broad ice halls and frozen passages. | **T + Vis** room graph and presentation. Ice friction, slide behavior, and local water are new. | **Medium** field; gameplay cost rises with sliding and slippery routes. Use dry, supported route bypasses. |
| **Fossil reef** — traverse a giant ancient reef or skeletal seabed. | **Cav + Stamp + Vis** only as optional data primitives. Add biogenic cluster graph and feature intervals. | **Medium target / expensive current** due to mixed touched boxes; many branches raise cost. Risk: route clutter and narrow collision. |
| **Mine / industrial galleries** — walk through repeated service corridors and supports. | **M/T + Stamp + Vis**; no native beam/rail network authoring. Add a room graph and bounded structural motifs. | **Medium** with repeated graph cells; exact intervals can prove empty repeated modules. Low-ceiling confinement and repetitive navigation risk. |
| **Geothermal vents** — warm shafts, chimneys, and mineral deposits. | **T** room/shaft fields. A legacy chimney evaluator exists, but current composer notes mark the related parameter route dead/excluded. New active vent graph needed. | **Medium field**, with extra cost for particles/hazards. Risk: flicker, thermal effects, and vertical drops. |
| **River / delta** — follow fixed rivers, bars, and branching channels. | **S + water**; current surface water level is not a drainage plan or local channel mesh. Add deterministic drainage graph and fixed water masks. | **Medium–expensive** due to global connectivity planning and local water boundaries. Flow appearance can create optic-flow discomfort; keep water fixed per owner. |
| **Dreamcore / liminal profile** — a familiar world with a sparse wrongness grammar. | **S/P/T + Vis** as a profile over a base recipe, not a current generator kind. Add stable anomaly rules, palette and landmark controls. | **Cheap overlay** for a few bounded motifs, but inherits base cost. Repetition fatigue and disorientation risk. Author an anomaly profile with route-preserving keepouts. |
Several catalogue names can share generator families:
- **Profiled clearance field:** surface, flat plain, dunes, salt flats, canyons, rolling liminal hills, and mirrored ceilings.
- **Cavern graph:** cathedral, karst, lava tubes, glacial caves, roots, reef, mine, and vent networks. Each can use different room, edge, material, and water channels.
- **Lattice graph:** maze and shaft variants.
- **Sparse SDF motif library:** monoliths, ramps, pillars, ruins, crystals, and liminal anomalies.
- **Static water channel:** pools, rivers, lakes, flooded karst, and lava surfaces. Local occupancy and rendering still need implementation.
- **Floating islands:** retain as a distinct placement-and-route family.
- **Liminality:** profile grammar layered over one of the families above.
## Ranked starting set
1. **Profiled heightfield family.** Highest variety per implementation cost: ordinary terrain, periodic hills, flats, dunes, and later canyons. Start by taking measured SurfaceWorld from 1.756 s toward the one-second target. Keep a calm supported route through each recipe.
2. **Native cavern graph.** Best fit for the stacked underground descent and combat spaces. It can serve cathedrals, caves, lava tubes, mines, roots, and reefs. Current cavern records need asset authoring, indexed candidate lookup, intervals, and route proof before they can be a dependable family.
3. **Slab and sparse motif family.** Fastest path to liminal prototypes: a flat base plus monoliths, pool courts, ramps, and landmarks. Add generic stamp authoring and tight final-field intervals; sharp cross-LOD geometry remains a dependency.
4. **Lattice graph family.** Reuse Maze and shaft concepts with route constraints and safe landing plans. It adds strong vertical variety but needs careful comfort and route design.
5. **Static local water channel.** One implementation can expand pools, rivers, lakes, and flooded caves. It has substantial integration work because current water is global and non-colliding.
6. **FloatingIslands.** Keep as its own high-value generator and continue optimizing it. Its measured whole-view time remains far from target.
The ranking changes with the owner’s immediate goal. For a liminal prototype, put slabs and sparse motifs first. For the main descent loop, put the cavern graph first. For one-second streaming and high-speed VR, put field intervals, route validation, and cross-LOD mesh work ahead of new noise-heavy worlds.
## VR and ranking risks
A 15° route cap is a geometric constraint, not a comfort guarantee. Current Meta guidance advises minimizing movement on slopes and stairs, keeping walls distant to reduce optic flow, and testing ceilings, ledges, and camera collision. A virtual-height study of 42 participants found elevated distress and physiological response on an exposed platform up to 40 m, with stronger effects among participants with higher height intolerance. These findings justify bypasses and comfort options, not a ban on vertical worlds. [Meta virtual-environment guidance](https://developers.meta.com/vr/design/locomotion-virtual-environments/), [Meta locomotion best practices](https://developers.meta.com/vr/design/locomotion-best-practices/), [virtual height study](https://pubmed.ncbi.nlm.nih.gov/35095450/)
Highest height/vertigo risks: shafts, chasms, canyons, floating islands, and high ramp fins. Highest orientation or repetition risks: maze, honeycomb, repeated hills, and pool rooms. Ice adds sliding risk; deep water adds visual/movement mismatch; inverted gravity adds vestibular risk. Repetition is an art tool but can become navigation fatigue: use stable landmarks and a few deviations instead of making every repeat identical.
Non-Euclidean game research found lower perceived mastery and control in experimental hyperbolic/spherical versions of two adapted 2D games, though perceived immersion and challenge did not differ significantly. This is not a VR locomotion study, but it supports keeping the actual walkable route Euclidean and placing viewpoint-specific impossibilities in authored set-pieces. [Osudin, Denisova & Child, 2025](https://eprints.whiterose.ac.uk/id/eprint/211405/)
## Design-for-performance rules
1. **Bound the final composed field.** For each query AABB, compose intervals through ground/cap, features, boundary band, passage, stamps, and edits. Skip only when the final interval is strictly positive or strictly negative. Unknown means evaluate. The local design note explicitly warns that a loose but sound range can make nearly everything mixed. [Design bounds guidance](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/DESIGN_WORLD_ASSEMBLER.md:19>)
2. **Use structured ranges first.** Cosine extrema, radial distances, capped cylinders, oriented boxes, and smoothstep ramps have cheap bounds. Use a directional Lipschitz fallback if exact intervals are too involved. For a Lipschitz field with coordinate bounds `Lx,Ly,Lz`, a box centered at `p` with half-widths `hx,hy,hz` has range `f(p) ± (Lx hx + Ly hy + Lz hz)`.
3. **Bound derivatives as well as amplitudes.** A noise amplitude envelope does not bound slope. Include the derivative of domain warps and detail terms; a warp `f(x+u(x))` needs a bound that includes the warp Jacobian.
4. **Use the BVH only to prove absence.** A BVH can show that a box cannot meet a feature. If the box does meet it, apply that feature’s interval to the final CSG field. Current stamps have the BVH but still force touched boxes to mixed; cavern candidates are both linearly scanned and mixed.
5. **Keep details in a narrow surface band.** Put expensive roughness near a bounded surface envelope. Use material variation for detail that does not need to change collision or silhouette.
6. **Plan routes before features.** Build the route, passage mouths, and arena envelopes into the plan. Reserve those regions from stamps and content; after complete composition, recheck capsule clearance and support. A route is an authored constraint, not an incidental path through open air.
7. **Treat sharp 3D features as a meshing task too.** Current sharp geometry support is narrow; most surfaces use Marching Cubes, which can bevel a 90° edge by up to about 17.7 cm at 25 cm voxel size in the documented analytic case. Tilted ramps and crystals need matching cross-LOD mesh and collision support. [Mesher constraints](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/DESIGN_WORLD_ASSEMBLER.md:317>)
8. **Measure the whole view and moving frontier.** The one-second goal applies to the full view and streaming; report first tile, near ring, and entering-tile latency too. Do not infer headset frame time from Linux/headless build or tile-generation time.
## Owner question
Should the near-vertical ramp fins be non-walkable set-pieces with a normal bypass, or should players walk on walls and ceilings? The latter changes the locomotion and gravity contract.
No repository files were changed.