wip(assembler): round S1 -- one Core voxel-size source; per-tile feature lists (islands)

AVoxelWorld::CoreVoxelSizeCm (default 25, 32 voxels/tile) flows through plan, field,
mesher, content, water, atmosphere, edits and collision. Staged-owner BuildHost passes at
20 cm (SurfaceWorld + islands, W1/W8/W16, anchors, BP edits, collision) with a fixed-25cm
negative control; default-size hashes match round 4; Core off stays legacy 12.5 cm.
Reusable BuildWorldAssemblyFeatureTileListV1; wired into FloatingIslands only so far.
256-island stress: tile p95 112.5 -> 2.0 ms, 0 mismatches, dropped-feature control fails.
Content placement measured (no populated cells): island ground search 7.25 ms/cell vs
legacy 0.29 ms -- open. Outside-review evaluation in Round5/REPORT.md.

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-18 18:48:38 +02:00
1 parent 111cf3d262
commit d6e69420e8
25 files changed
+2136 -250

No files matched your search

+36 -1
View File
@@ -120,6 +120,32 @@ public:
* launch async march tasks (capped), and apply finished results budgeted. Call every Tick. */
void UpdateDecorations(const FVector& PlayerWorldPos);
/** Headless audit of worker-cell and steady UpdateDecorations cost using the active world route.
* Audit sans rendu du coût par cellule worker et de UpdateDecorations avec la route active. */
struct FDecorationPlacementCostAudit
{
bool bNativeSurface = false;
bool bNativeFloatingIslands = false;
bool bSyntheticWorkload = false;
int32 NearEntries = 0;
int32 FarEntries = 0;
int32 SampledCells = 0;
int32 ColumnsPerCell = 0;
int32 Placements = 0;
int32 AnchorChecks = 0;
double MaximumAnchorErrorCm = 0.0;
double MaximumDensityResidual = 0.0;
double DensityQueriesPerCell = 0.0;
double SurfaceQueriesPerCell = 0.0;
double CellMedianMilliseconds = 0.0;
double CellP95Milliseconds = 0.0;
double UpdateMedianMilliseconds = 0.0;
double UpdateP95Milliseconds = 0.0;
};
bool MeasurePlacementCostForValidation(const FVector& PlayerWorldPos,
int32 SampleCellCount, int32 FrameSampleCount,
FDecorationPlacementCostAudit& OutAudit, FString& OutError);
//--- LANDMARKS (rare large objects on a coarse hash lattice — the "mini-suns") -----------
/** Stream rare landmark objects around the player. Unlike decorations, these sit on a COARSE hash
* lattice (cell = `FStrateLandmark::SpacingChunks` chunks), so cost scales with the number of
@@ -176,6 +202,12 @@ public:
bool bInstanced = false;
FTransform Xf = FTransform::Identity;
};
struct FPlacementBuildCounters
{
int32 Columns = 0;
int32 DensityQueries = 0;
int32 SurfaceQueries = 0;
};
/** A finished cell march: a snapshot of the resolved decoration list + the spawn commands. */
struct FDecoCellResult
{
@@ -259,6 +291,8 @@ private:
const UVoxelStrateDefinition* Def = nullptr; // game-thread only (biome/decoration resolve)
int32 StrateIndex = INDEX_NONE;
int32 RepChunkZ = 0; // representative chunk-Z for biome lookups
float VoxelSizeCm = VOXEL_SIZE; // active field voxel size: Core when enabled, legacy otherwise
float ActiveToOwnerVoxelScale = 1.0f; // map active Core units to the legacy generator's voxel units
float TopVoxelZ = 0.0f; // strate band, voxel coords (march range)
float BottomVoxelZ = 0.0f;
float WaterLocalZ = -FLT_MAX; // water surface, actor-local cm (-FLT_MAX = no water)
@@ -303,7 +337,8 @@ private:
const TArray<FStrateDecoration>& Entries,
const TArray<int32>& EntryBiome, uint32 InSeed,
int32 Spacing, float Step, int32 MaxCrossings, float ColumnDepth,
TArray<FDecoSpawn>& OutSpawns);
TArray<FDecoSpawn>& OutSpawns,
FPlacementBuildCounters* OutCounters = nullptr);
// Each step operates on ONE grid (G = NearGrid or FarGrid). LaunchDecoTasks throttles against the
// COMBINED in-flight count (OtherInFlight = the other grid's in-flight cells) so the two grids share