passages: rounded half-pipe crest (L113, v220); floor bands diagnosed, speed not recovered

Open-air walls: 0.75 m rounded shell, relief fades over the top 0.25 m - the needle spikes are
gone. Every owner plan passes the 15 deg forward-grade check (max ~10.7 deg) and all walk audits.
Floor bands: median 1.25 m interval, ~0.21 m drop on a ~10.4 deg floor = one 0.25 m voxel row
projected along the grade (not control points, not slab thickness) - not yet fixed. Exact
segment-to-tile filter did not reduce candidates; removed. Timings this round are unreliable
(a gitea process used ~43% CPU throughout). Fast tier PASS; Clang/GCC deterministic; UE builds.

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-29 21:57:13 +01:00
1 parent 16554cd426
commit 36d954cf2f
114 files changed
+7814 -63

No files matched your search

+25 -17
View File
@@ -3035,7 +3035,7 @@ namespace StandaloneStreamBenchmark
const auto controls=passageSplineControls(passage);
const auto floorProfile=passageSplineFloorProfile(passage);
const auto segments=VoxelForgeCore::PassageSpline::BuildSegments(
controls,routeEnd,1.0,1.0,floorProfile);
controls,routeEnd,8.0,1.0,floorProfile,0.025);
const auto consider=[&](double distance,double radius)
{
minimumRadius=std::min(minimumRadius,radius);
@@ -3070,7 +3070,7 @@ namespace StandaloneStreamBenchmark
const auto controls=passageSplineControls(passage);
const auto floorProfile=passageSplineFloorProfile(passage);
const auto segments=VoxelForgeCore::PassageSpline::BuildSegments(
controls,routeEnd,1.0,1.0,floorProfile);
controls,routeEnd,8.0,1.0,floorProfile,0.025);
const auto effectiveCenterZ=[&](const auto& point,double plannedFloor)
{
return plannedFloor+passageTubeDepthAt(point[3],bodyDepth);
@@ -3125,7 +3125,7 @@ namespace StandaloneStreamBenchmark
const std::size_t routeEnd=std::clamp<std::size_t>(
passage.lowerMouthControlIndex,1,passage.controlPoints.size()-1);
const auto segments=VoxelForgeCore::PassageSpline::BuildSegments(
controls,routeEnd,1.0,1.0,floorProfile);
controls,routeEnd,8.0,1.0,floorProfile,0.025);
if(!segments.empty())
{
blend.mouthX=segments.front().a[0];
@@ -3232,16 +3232,6 @@ namespace StandaloneStreamBenchmark
bestRoundDistance+radius);
const double verticalWallAlignment=std::clamp(
-(zMetres-centerZ)/distanceToCenter,0.0,1.0);
const double wallReliefWeight=0.05+0.95
*(1.0-verticalWallAlignment);
const float relief=VF_FieldPassageWallRelief(
static_cast<float>(xMetres/coreMetres),
static_cast<float>(yMetres/coreMetres),
static_cast<float>(zMetres/coreMetres),
static_cast<std::uint32_t>(World.Seed));
const double roughRoundDistance=bestRoundDistance
+static_cast<double>(std::clamp(relief,-1.0f,1.0f))
*WallReliefMetres*wallReliefWeight;
const auto& aFloor=route[bestSegment-1];
const auto& bFloor=route[bestSegment];
const double floorDx=bFloor.x-aFloor.x;
@@ -3252,6 +3242,21 @@ namespace StandaloneStreamBenchmark
+(yMetres-aFloor.y)*floorDy)/horizontalSquared,0.0,1.0):t;
const double floorCenterZ=passageFloorAtXY(passageIndex,
xMetres,yMetres,std::lerp(aFloor.floorZ,bFloor.floorZ,floorT));
const double wallElevationMetres=zMetres-floorCenterZ;
const double crestFade=std::clamp((1.0-wallElevationMetres)/0.25,
0.0,1.0);
const double smoothCrestFade=crestFade*crestFade
*(3.0-2.0*crestFade);
const double wallReliefWeight=(0.05+0.95
*(1.0-verticalWallAlignment))*smoothCrestFade;
const float relief=VF_FieldPassageWallRelief(
static_cast<float>(xMetres/coreMetres),
static_cast<float>(yMetres/coreMetres),
static_cast<float>(zMetres/coreMetres),
static_cast<std::uint32_t>(World.Seed));
const double roughRoundDistance=bestRoundDistance
+static_cast<double>(std::clamp(relief,-1.0f,1.0f))
*WallReliefMetres*wallReliefWeight;
const double floorDistance=floorCenterZ-zMetres;
const double blend=std::max(CornerBlendMetres-
std::abs(roughRoundDistance-floorDistance),0.0)/CornerBlendMetres;
@@ -4033,6 +4038,7 @@ namespace StandaloneStreamBenchmark
};
constexpr double PassageShellAuditSpacingMetres=0.25;
constexpr std::array<double,2> PassageShellAuditDepthsMetres{{0.125,0.375}};
constexpr float PassageShellDensityTolerance=1.0e-6f;
const auto expectedPassageShellAt=[&](double xMetres,double yMetres,
double zMetres)
{
@@ -4170,8 +4176,8 @@ namespace StandaloneStreamBenchmark
const bool shellExpected=depth+0.011
<expectedFloorThickness(along,depth);
const float density=Field.densityAt(position);
if((shellExpected&&density>=0.0f)
||(!shellExpected&&density<0.0f))
if((shellExpected&&density>=PassageShellDensityTolerance)
||(!shellExpected&&density<-PassageShellDensityTolerance))
{
++audit.floorViolations;
if(audit.firstViolationCount<audit.firstViolations.size())
@@ -4227,8 +4233,10 @@ namespace StandaloneStreamBenchmark
const int shellExpected=expectedPassageShellAt(
sampleX,sampleY,sampleZ);
if(shellExpected>=0
&&((shellExpected==1&&density>=0.0f)
||(shellExpected==0&&density<0.0f)))
&&((shellExpected==1
&&density>=PassageShellDensityTolerance)
||(shellExpected==0
&&density<-PassageShellDensityTolerance)))
{
++audit.wallViolations;
if(audit.firstWallViolationCount