wip(assembler): M2 round 4 -- WorldAssemblerHybridV2: exact contacts, tagged tiles 1.18-1.27x MC

The round-3 'field contact error' measured hit-to-anchor distance; V2 contacts are 0 cm and on the zero
isosurface. Tagged-tile cost 5.7-6.7x -> 1.175-1.270x MC; organic 0.998x. Bound, shelf-thickness and route
audits rerun with negative controls; W1/W8/W16 stable; V1 and MarchingCubesV1 unchanged.

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-10 10:41:43 +02:00
1 parent 22a6b30494
commit 4661a445be
48 files changed
+106493 -71

No files matched your search

@@ -62,14 +62,14 @@ namespace VoxelForgeCore
std::uint32_t skirtTriangleCount = 0;
};
// Versioned render-mesher choices. marchingCubesV1 preserves the production Core path;
// worldAssemblerHybridV1 applies feature-aware DC only to tagged type-2 plan boxes at LOD0.
// Choix versionnes du mailleur. marchingCubesV1 conserve la voie Core actuelle;
// worldAssemblerHybridV1 applique le DC aux boites type 2 balisees, uniquement en LOD0.
// Versioned render-mesher choices. V1 is the original feature-aware DC path. V2 keeps MC
// topology and snaps eligible LOD0 roots to tagged type-2 box planes.
// Choix versionnes du mailleur. V1 est la voie DC initiale; V2 conserve MC et cale les racines.
enum class MesherRecipe : std::uint8_t
{
marchingCubesV1 = 0,
worldAssemblerHybridV1 = 1
worldAssemblerHybridV1 = 1,
worldAssemblerHybridV2 = 2
};
struct SharpFeatureBox
+7 -3
View File
@@ -904,10 +904,11 @@ namespace VoxelForgeCore
const FVoxelTileKey nativeKey=ToNative(key);
const FIntVector origin=nativeKey.OriginVoxels();
if(options.mesherRecipe!=MesherRecipe::marchingCubesV1
&&options.mesherRecipe!=MesherRecipe::worldAssemblerHybridV1)
&&options.mesherRecipe!=MesherRecipe::worldAssemblerHybridV1
&&options.mesherRecipe!=MesherRecipe::worldAssemblerHybridV2)
{error="tile mesher recipe version is unsupported";return std::nullopt;}
TArray<FVoxelHybridSharpFeatureBox> sharpFeatures;
if(options.mesherRecipe==MesherRecipe::worldAssemblerHybridV1&&level==0&&impl_->worldAssembly)
if(options.mesherRecipe!=MesherRecipe::marchingCubesV1&&level==0&&impl_->worldAssembly)
{
constexpr std::int64_t SubvoxelsPerVoxel=WorldAssemblySubvoxelsPerVoxel;
const std::array<std::int64_t,3> tileMin={
@@ -946,7 +947,10 @@ namespace VoxelForgeCore
// Les pages analytiques omettent le plan natif ; utiliser la base uniquement pour
// les tuiles balisees afin d'echantillonner le champ correspondant aux tags.
tileShapeContext=impl_->shape.get();
mesher.SetHybridSharpFeatures(MoveTemp(sharpFeatures));
if(options.mesherRecipe==MesherRecipe::worldAssemblerHybridV2)
mesher.SetHybridSharpFeatureSnap(MoveTemp(sharpFeatures));
else
mesher.SetHybridSharpFeatures(MoveTemp(sharpFeatures));
}
}
const FStandaloneShapeWorld& tileShape=*tileShapeContext;