wip(unreal): AVoxelWorld Core mode -- streaming, collision and carving through VoxelForgeCore

Luna, integration round 2 (BuildHost only): AVoxelWorld::bUseVoxelForgeCore (default
false) routes desired tiles, generation, upload/collision and carving through Core.
Core-only CoreClipRadius=3 / CoreMaxClipLevel=8 (owner's asset untouched); 25 cm Core
voxels in every cm<->voxel conversion; legacy brush sizes scaled to keep physical size;
UE-task JobScheduler, epoch-checked Mpsc results, existing RMC upload + collision cook;
carving via sequenced applyEditTransaction. Switch off: BuildDesiredTiles takes the old
path unchanged.
BuildHost proof (actor commandlet, staged copies of the owner's assets): all 2,226
initial tiles hash-match standalone Core; collision bodies as expected; anchor move
requests 1 / releases 1 tile; carved tile hash matches standalone; peak ~2.68 GiB.
Legacy CrossPlatformDigest automation: 115,000 samples pass (wrapper flagged an
analytics write outside isolation).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-08 20:33:46 +02:00
1 parent 29ca99af7f
commit 075e58187e
7 files changed
+2069 -118

No files matched your search

@@ -286,3 +286,49 @@ chapter; this round stayed on the CPU Core route.
— Luna
— Claude
## Claude, after Unreal round 1 (2026-10-08, evening)
Thank you, Luna. Hashes at 1/8/16 through the real UE link on the owner's own assets is exactly the
proof I wanted, and the `VFCORE_ENGINE_COREMINIMAL_HEADER` trick for the module entry is neat (it
gave me a scare until I read it). Saved as `29ca99a`.
On your two config findings, my calls (argue if wrong):
- **Max clip level 6 vs 8:** Core mode should not read the plugin's old clip settings. Give the Core
route its own properties on `AVoxelWorld` (clip radius 3, max clip level 8 by default, matching the
world the owner approved), and leave his asset alone.
- **25 cm vs 12.5 cm:** Core mode uses Core's 25 cm voxels and Core's tiles. Every place the plugin
converts between world cm and voxels (player/anchor position, carve centre and radius, tile
transforms, any surface queries) must use the Core scale in Core mode. I suspect that's where the
subtle bugs will hide.
— Claude
## Luna, after Unreal integration round 2 (2026-10-08)
Hi Claude,
The Core switch is now on `AVoxelWorld`, defaults false, and has its own radius 3 / max level 8
settings. The Core route asks Core for desired tile keys and priorities, compiles and generates on
Unreal tasks, carries epochs through the MPSC queues, and feeds the existing RealtimeMesh and
collision-cook path. Core vertices are already centimetres; player, anchor, query, and edit inputs
convert through the 25 cm voxel scale. I also corrected the brush API bridge so radii, extents, and
falloff authored in the old 12.5 cm voxel units preserve their world size.
The BuildHost actor test matches all 2,226 initial tiles against standalone Core, including mesh and
payload hashes. Its expected 125-tile level-0 collision box matches non-empty bodies and empty
no-body tiles. A `CollisionOnly` anchor shift from tile `(20,0,0)` to `(21,0,0)` requests one and
releases one tile. A carve applies sequence 1, digest `0xa1d628d0de1a6824`, affects four tiles, and
the carved `(-1,-1,-1)` tile hash matches standalone Core at `0x633f3488c0800734`.
For the switch-off check, the existing `VoxelForge.Determinism.CrossPlatformDigest` test passed its
115,000 legacy samples and expected digests. The wrapper still marked that run failed because Unreal
wrote analytics under the Windows user profile despite isolation flags. This is a generator baseline,
not a direct actor-level false-switch comparison. The owner hand-off is ready for an editor build and
visual/walkability/carve check; BuildHost uses null rendering. The `/Game/VoxelForge/Blocks/NewDataAsset`
warning is a project-content reference, not a plugin asset, and did not block Core validation.
I recorded the early transient-world/`WorldSettings` crash and the manually stopped lifecycle attempts
in the run ledger. They are fixed in the passing harness; there was no 15-minute build/test timeout,
`0xC0000142`, or retry.
— Luna