passages: smooth 12 m lower-mouth radius taper; all four-strate passages pass (L68, v213)

The FI->TN wall beat (4.77 cm at 7.06 m) was the lower-mouth flare: the full mouth radius
was assigned to the penultimate control point, a one-segment radius jump. The shared route
builder now blends to the mouth radius over 12 m with a smoothstep. Wall ripple 1-2:
7.27 -> 1.62 cm. All three passages pass support/blocked/grade/ripple/naturalness; controls
detected. Fast tier 269/269 incl. the new-plan stage; W1/W8/W12 equal, Clang and GCC.
Hash pins: FI style 2 re-pinned at v213.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-27 03:17:27 +01:00
1 parent 087333bf8a
commit bd7bba994c
10 files changed
+677 -12

No files matched your search

@@ -403,7 +403,7 @@ namespace VoxelForgeCore
// Version 210 keeps bulk native-cave sampling on the scalar field path at strata edges.
// Version 211 makes coordinate biasing in the shared cell hash unsigned, removing signed-overflow UB.
// Version 212 balances generated entry routes against existing walk lanes and preserves their shared treads.
inline constexpr std::uint32_t WorldAssemblyEvaluatorVersion = 212;
inline constexpr std::uint32_t WorldAssemblyEvaluatorVersion = 213;
enum class FieldChannel : std::uint32_t
{
+19 -1
View File
@@ -3188,7 +3188,7 @@ bool PlanResolvedLayoutPassagesV1(ResolvedLayoutSnapshotV3& layout,std::int32_t
for(std::size_t i=0;i<xy.size();++i)
{
std::int64_t radius=(i<=1||i==lowerMouthIndex
||i+1>=xy.size()-1)?mouthRadius:midRadius;
||(i>lowerMouthIndex&&i+1>=xy.size()-1))?mouthRadius:midRadius;
if(surfaceGroundDeparture&&i<lowerMouthIndex)
{
const double t=std::clamp(static_cast<double>(cumulative[i])
@@ -3197,6 +3197,24 @@ bool PlanResolvedLayoutPassagesV1(ResolvedLayoutSnapshotV3& layout,std::int32_t
radius=surfacePortalRadius+static_cast<std::int64_t>(std::llround(
(midRadius-surfacePortalRadius)*smooth));
}
// Grow the lower bore into its mouth over fixed route distance. Assigning
// the full mouth radius to the penultimate point creates a segment-length
// flare whose cubic-detrended profile can read as a short-period wall beat.
if(i<=lowerMouthIndex)
{
constexpr std::int64_t LowerMouthRadiusBlendLengthMetres=12;
const std::uint64_t blendLength=static_cast<std::uint64_t>(
std::max<std::int64_t>(LowerMouthRadiusBlendLengthMetres*qPerMetre,
2*mouthRadius));
const std::uint64_t distanceToLowerMouth=mouthHorizontal-cumulative[i];
if(distanceToLowerMouth<blendLength)
{
const double t=static_cast<double>(distanceToLowerMouth)/blendLength;
const double smooth=t*t*(3.0-2.0*t);
radius=midRadius+static_cast<std::int64_t>(std::llround(
(mouthRadius-midRadius)*(1.0-smooth)));
}
}
std::int64_t playerZ=0;
if(i>lowerMouthIndex)
playerZ=lowerLandingPoints[i-lowerMouthIndex-1][2];