refactor(opstack): the operator stack is the only density path
Every strate now generates through its operator stack: authored definitions, cooked-season entries (recipe or native) and editor composer candidates alike. The per-strate opt-in and the archetype switch it guarded are gone. - Remove UVoxelStrateDefinition::bUseOperatorStack and the season wiring that set it; UsesOperatorStackForChunk now only says whether the slot has a known archetype. - GetDensityAt always builds a stack (composer, then recipe, then the native archetype stack); a degenerate zero-height strate stays air. - Remove the startup opt-in warning, the operator_stack startup-trace field and the four "Cave Bail Not Op Stack" stats (the remaining bail is counted by Cave Bail No Stack). - Explore commandlet: drop -opstack and the operator_stack fields; VoxelForgeTest.ps1 no longer passes -opstack=1. - Tests: FTestWorld::Build loses its bool parameter; legacy-vs-stack comparisons (MazeSeam, VerticalShaftSeam, TerrainDetailLiveness, WorldEdgeSeal, TilePostReach) collapse to the single stack path. This changes terrain for any strate asset that did not already have the opt-in ticked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01URDGLsu7c4nunqNFPJEFPU
This commit is contained in:
29 files changed
+412
-817
No files matched your search
@@ -6,9 +6,9 @@
|
||||
// ---------------
|
||||
// The interesting invariants (density purity across worker threads, ClassifyTile soundness)
|
||||
// only fire on the REAL path — UVoxelGenerator::GetDensityAt — because that is where the
|
||||
// thread_local per-chunk caches live (CP_*, GSurfColCache, the diff slots, the SDF cache).
|
||||
// Calling GetSurfaceDensity / GetMazeDensity directly bypasses every one of them and would
|
||||
// test almost nothing. GetDensityAt in turn needs a live UVoxelStrateManager, whose only
|
||||
// thread_local per-chunk caches live (CP_*, the prepared stacks, the diff slots, the SDF cache).
|
||||
// Evaluating a stack directly bypasses every one of them and would test almost nothing.
|
||||
// GetDensityAt in turn needs a live UVoxelStrateManager, whose only
|
||||
// entry point is Initialize(UVoxelSettings*, int32) reading TSoftObjectPtr pools.
|
||||
//
|
||||
// So the fixture builds a whole synthetic world in memory: transient strate definitions →
|
||||
@@ -46,7 +46,7 @@ namespace VoxelForgeTest
|
||||
* generator + diff layer. No AActor, no UWorld, no PIE.
|
||||
*
|
||||
* The default layout stacks one strate of EVERY archetype (in ECaveGeneratorType order),
|
||||
* so a single fixture exercises all eight density functions and their per-chunk caches,
|
||||
* so a single fixture exercises all eight archetype stacks and their per-chunk caches,
|
||||
* plus the gap-bedrock path when InterStrateGapChunks > 0.
|
||||
*/
|
||||
struct FTestWorld
|
||||
@@ -73,8 +73,7 @@ namespace VoxelForgeTest
|
||||
* dangerous — and `VoxelForge.Determinism.LargeSeedSurvives` deliberately passes big ones
|
||||
* (up to 2e9) to prove it stays that way.
|
||||
*/
|
||||
void Build(int32 InSeed = 1337, int32 InGapChunks = 2, bool bUseOperatorStack = false,
|
||||
int32 InStrateHeightInChunks = 4)
|
||||
void Build(int32 InSeed = 1337, int32 InGapChunks = 2, int32 InStrateHeightInChunks = 4)
|
||||
{
|
||||
Settings = TStrongObjectPtr<UVoxelSettings>(
|
||||
NewObject<UVoxelSettings>(GetTransientPackage(), NAME_None, RF_Transient));
|
||||
@@ -111,10 +110,6 @@ namespace VoxelForgeTest
|
||||
// refinement and roll tests use the smaller synthetic volume as a bounded memory
|
||||
// control; the owner-facing showcase opts into 8 chunks below.
|
||||
Def->StrateHeightInChunks = FMath::Max(1, InStrateHeightInChunks);
|
||||
// L'OPT-IN de la pile d'opérateurs. Faux par défaut : les treize tests existants
|
||||
// doivent continuer à exercer le `switch`, qui reste le comportement de référence.
|
||||
// Seul le test de solidité de ClassifyTie côté pile le passe à vrai.
|
||||
Def->bUseOperatorStack = bUseOperatorStack;
|
||||
// Hard transitions: param blending across a boundary would make "which archetype
|
||||
// owns this chunk" ambiguous, and these tests want an unambiguous mapping.
|
||||
Def->TransitionType = EVoxelStrateTransition::Hard;
|
||||
|
||||
Reference in new issue
Block a user