wip(assembler): round L29 -- strate transitions honoured at the bedrock/ceiling interface

EVoxelStrateTransition from the upper strate shapes the bedrock(N)/ceiling(N+1) interface in the
shared composition layer: Hard flat; Gradient = smooth 2D hash surface (16 m owner width, about 4 m
measured undulation); Interleaved = 3D domain-warped fingered overlap within the width. Each band
keeps >= 2 Core voxels solid; faces return to the seam near passage mouths. Interface audit over
512 m: 0 hole columns for all modes; wider-than-declared and too-thin controls rejected. All passage,
route, proof and validator audits pass; deterministic Clang = GCC. Evaluator 15. Cost +4% SW,
+1.3% FI vs L28. Open: ring-like artifact on the FI floor capture; transition look unverified.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CSFYgsdW8ejZSyiMf4qRSX
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-21 09:16:12 +02:00
1 parent f23ab7b9fa
commit 63c7e563d0
16 files changed
+794 -42

No files matched your search

@@ -1106,13 +1106,21 @@ bool AttachValidatedWorldAssembly(const UVoxelSettings* Settings,
Item.transitionWidthMicrometres = static_cast<std::int64_t>(Item.transitionBlendChunks)
* Item.managerChunkWidthMicrometres;
Item.transitionWarpAmplitudeMicrometres = Item.transitionMode == "Interleaved"
? 2 * Item.managerChunkWidthMicrometres : 0;
Item.transitionInterpenetrationMicrometres = 0;
Item.transitionHonouredInCore = Slot.Definition->TransitionType == EVoxelStrateTransition::Hard;
Item.transitionFallsBackToHard = Slot.Definition->TransitionType != EVoxelStrateTransition::Hard;
? std::min(Item.transitionWidthMicrometres / 2, Item.managerChunkWidthMicrometres) : 0;
Item.transitionInterpenetrationMicrometres = Item.transitionMode == "Interleaved"
? Item.transitionWidthMicrometres
: Item.transitionMode == "Gradient" ? Item.transitionWidthMicrometres / 4 : 0;
Item.transitionFallsBackToHard = Item.transitionMode != "Hard"
&& Item.transitionWidthMicrometres <= 0;
Item.transitionHonouredInCore = Item.transitionMode == "Hard"
|| !Item.transitionFallsBackToHard;
Item.transitionDispatchPath = Item.transitionFallsBackToHard
? "declared Gradient/Interleaved recorded; Core uses an explicit Hard transition fallback with zero interpenetration"
: "declared Hard transition is applied at this interface";
? "declared zero-width transition uses an explicit Hard fallback"
: Item.transitionMode == "Hard"
? "declared Hard transition preserves the flat shared bedrock/ceiling interface"
: Item.transitionMode == "Interleaved"
? "shared composition overlaps both facing bands with deterministic domain-warped fingers inside the declared width"
: "shared composition moves both band faces together with the smooth declared-width transition field";
Item.managerLookup = "UVoxelStrateManager::GetGeneratorTypeForChunk; transition is controlled by upper strate";
if (Type == ECaveGeneratorType::SurfaceWorld)
{
+13 -14
View File
@@ -201,15 +201,19 @@ enum class ECaveGeneratorType : uint8
};
/**
* EVoxelStrateTransition — How two adjacent strates blend at their shared boundary.
* EVoxelStrateTransition — How two adjacent strates meet at their shared boundary.
*
* Each strate boundary can use a different transition style. The transition type
* is defined on the UPPER strate's definition and controls the boundary between
* itself and the strate below it.
*
* Gradient: Smooth linear interpolation of generation params across TransitionBlendChunks.
* This is the classic approach — no seam visible, but also no dramatic
* geological feature at the boundary. Best for similar-looking strates.
* In the Core composition path, TransitionBlendChunks defines the full permitted
* crossing depth between the upper bedrock and lower ceiling bands. Each band keeps
* its authored thickness and the solid bands always overlap or touch. The legacy manager
* may also blend generation parameters for Gradient; Core does not blend unrelated fields.
*
* Gradient: A low-amplitude smooth height field moves the shared interface and both
* content-facing band surfaces. Best for gentle geological variation.
*
* Hard: No blending at all. The strate's params apply right up to the boundary,
* then instantly switch to the neighbor's params. The abrupt change in
@@ -217,26 +221,21 @@ enum class ECaveGeneratorType : uint8
* discontinuity at the boundary. Best for strates that should feel like
* distinct geological layers with a visible dividing line.
*
* Interleaved: The boundary position is warped by a 3D noise field, so "fingers"
* of one strate reach into the other. Some XY columns transition early,
* others late, creating an irregular, interlocking boundary. The warp
* amplitude is ~2 chunks, and Z frequency is lower than XY to produce
* horizontal finger-like intrusions. Best for strates that should feel
* like they grew into each other over geological time.
* Interleaved: A deterministic 3D domain-warped hash field sets the overlap depth per XY
* column from zero to the declared width, creating irregular fingers.
* Best for strates that should feel grown together.
*/
UENUM(BlueprintType)
enum class EVoxelStrateTransition : uint8
{
// Smooth linear interpolation of all generation params across the blend zone.
// No visible boundary — params change gradually over TransitionBlendChunks distance.
// Smoothly undulates the shared bedrock/ceiling interface in the Core composition path.
Gradient UMETA(DisplayName = "Gradient (smooth blend)"),
// No blending — params switch instantly at the boundary.
// Creates natural cliffs, ledges, or material discontinuities.
Hard UMETA(DisplayName = "Hard (sharp boundary with cliff)"),
// 3D noise warps the boundary position per XY column.
// Creates finger-like intrusions of one strate into the other.
// A 3D domain-warped hash field creates finger-like intrusions within the declared width.
Interleaved UMETA(DisplayName = "Interleaved (domain-warped fingers)")
};