feat(explore): a commandlet -- 91x faster, and the first real PICTURE
Every experiment in this project cost a build + full-suite cycle. The
landing task took 52 of them over ~9 hours. And nobody could SEE the world:
every visual judgement all session was made on density SLICES -- diagrams,
not pictures. That is how a floor heaving 1.4 m every two metres got
described as "roughness visible but modest" while Jahni spotted it in
thirty seconds by walking it.
-run=VoxelForgeExplore, editor-only module, three modes, one build many runs:
render raymarched PNGs, fixed 0.25-voxel step + 10 bisection iterations
(NOT sphere tracing -- the op stack yields density, not a signed
distance, so a long step tunnels through walls). Three views, each
with a 1.76 m human marker in frame, because every scale mistake
here came from numbers with no body beside them.
walk an agent using the EXISTING VF player-fit stencil, never its own
movement model -- two definitions of "can a player stand here"
would drift and we could not tell which was lying.
export OBJ through the canonical UVoxelMarchingCubesMesher. No second
mesher; a forked meshing invariant is the bug this project keeps
paying for. 23.2 MB, 106,762 verts, 200,842 tris for 128^3.
⭐ THE NUMBER THAT JUSTIFIES IT: the full automation run takes 4,396 s
(73m16s). The commandlet does all three modes in 48.1 s wall, 5.9 s of
which is engine startup. ~91x faster. And I had guessed the suite cost
~90 s -- it is 73 MINUTES. The iteration loop was far more expensive than
I knew.
First real walk metrics on the Maze (seed 0, slot 4):
distance 214 m · tortuosity 4.98 · dead ends 0.935/100 m
narrow-gap events 0 · reachable fit fraction 3.01%
result NotConnectedAtThisResolution
Tortuosity ~5 is a genuinely winding route, which is right for a maze.
3% reachable is not.
Editor Development build clean. SHIPPING build clean with the receipt
containing VoxelForge and NOT VoxelForgeEditor -- the instrument cannot
reach a packaged game. Automation 32/32, 0 failed.
⚠️ Codex initially shipped this UNBUILT, and correctly: I omitted the
## Validation section from that spec, so it fell back to CLAUDE.md's
"NEVER build or compile". 100+ compile errors from three causes -- bare
TCondensedJsonPrintPolicy and TJsonWriter needing their template
arguments, and a missing UObject/Package.h. That include is the SECOND
miss this session, so CODEMAP §6 now carries the gotcha.
⚠️ Unrelated, found in passing: VoxelForge.uplugin does not declare
RealtimeMeshComponent although the runtime module uses it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K8V9my1PL68pmQb2gutZZV
This commit is contained in:
1 parent
413c15de24
commit
bd547c35c4
9 files changed
+2327
-24
No files matched your search
@@ -972,6 +972,41 @@ generic biome field), not just SurfaceWorld. Empty `Biomes[]` ⇒ all-zero colou
|
||||
- **Status:** C++ ✅ BUILT & WORKING (ticked 2026-07-27). The master material graph is still
|
||||
editor-side work and is deliberately NOT ticked — that half is Jahni's, not the code's.
|
||||
|
||||
### 8.16 Explorer commandlet — one authoritative field, three consumers
|
||||
`-run=VoxelForgeExplore` lives in the separate `VoxelForgeEditor` module, so the commandlet and its
|
||||
PNG/JSON/OBJ writers are editor/commandlet-only and cannot enter a Game or Shipping link. It creates
|
||||
only transient settings, definitions, manager, generator, diff layer, and mesher objects; no authored
|
||||
asset, live manager, generator, or diff layer is mutated. The transient world keeps
|
||||
`WorldRadiusVoxels=0` and `InterStrateGapChunks=0`, preserving the lateral-region gate.
|
||||
|
||||
- **Render.** The renderer samples `UVoxelGenerator::GetDensityAt` at a fixed 0.25-voxel default
|
||||
step (overrideable down to 0.125), detects the MC density sign crossing, and refines it with ten
|
||||
bisection iterations. It never treats density as an SDF and never sphere-traces. Each of three
|
||||
deterministic views overlays a projected 1.76 m human-height marker; the JSON records the step,
|
||||
metre conversion, refinement count, and marker projection status.
|
||||
- **Walk.** `VF_MeasurePlayerFitWalkWithSampler` builds the existing step-1 capsule/floor-fit stencil
|
||||
and uses the same six-neighbour/full-resolution route gate as the existing diagnostics. Its
|
||||
deterministic depth-first agent walk counts metres travelled (including branch backtracking),
|
||||
dead ends per 100 m, the arrival component's reachable fit volume, and traversed edges touching a
|
||||
narrow-gap proxy below 1.5× the 0.68 m capsule width. The proxy is explicitly axis-aligned air span;
|
||||
it is not a second player-fit or movement definition. The explorer passes the shared measurement
|
||||
`MaxCells` refusal at a 32,000,000-cell default cap, with a conservative 20-byte/cell estimate
|
||||
against a documented 768 MiB working-memory budget. Reachable fit volume is explicitly the bounded
|
||||
fitted route window because `WorldRadiusVoxels=0` deliberately has no finite whole-world volume.
|
||||
- **Export.** `UVoxelMarchingCubesMesher::GenerateMesh` is the only mesher. Because that canonical
|
||||
entry point deliberately clamps one call to a 32³ tile, a 128³ request is four-by-four-by-four
|
||||
canonical calls whose returned vertices/triangles are streamed with an index offset; no second
|
||||
mesher or density evaluator exists. The bounded result is metre-space OBJ with source winding,
|
||||
voxel-space UVs, normals, and ground/ceiling material groups, accompanied by a manifest containing seed,
|
||||
archetype, slot, bounds, and player dimensions. Tile skirts are disabled at the export boundary
|
||||
because they are a render seam aid that would extend beyond the manifest box. A conservative
|
||||
preflight cap is checked before the canonical mesher is called.
|
||||
|
||||
The report and export manifest use fixed-order writers and serialize twice in-process to assert the
|
||||
deterministic contract. Timings are console diagnostics only; putting wall-clock durations in the report would
|
||||
break byte identity. The browser viewer remains a separate display-only consumer: it must load this
|
||||
OBJ/manifest and never evaluate density or generate geometry.
|
||||
|
||||
## 9. Multiplayer model (listen-server first, dedicated-friendly)
|
||||
|
||||
> **Status: transport is DESIGN ONLY — nothing is networked in-tree yet** (no `Replicated`/`HasAuthority`/RPCs; a
|
||||
|
||||
Reference in new issue
Block a user