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:
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
|
||||
{
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in new issue
Block a user