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:
1 parent
16554cd426
commit
36d954cf2f
114 files changed
+7814
-63
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user