core: coarser smooth-route tolerance + shell support bound (L119, evaluator v224)

Chord error 2.5 -> 10 cm, shell work skipped outside the 0-0.75 m band. Sweep pairs -39%, prepare -60%,
near-ready 3-8% faster than L115 but still +13..+22% vs L109. Floor offset 7.88 mm; captures match L115
by eye; fast tier, walk audits, Clang/GCC W1/W8/W12 determinism green. Not for merge yet.

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-30 05:35:59 +01:00
1 parent 6e52fb48b2
commit 707bc61553
40 files changed
+2352 -54

No files matched your search

+46 -6
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,8.0,1.0,floorProfile,0.025);
controls,routeEnd,8.0,1.0,floorProfile,0.100);
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,8.0,1.0,floorProfile,0.025);
controls,routeEnd,8.0,1.0,floorProfile,0.100);
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,8.0,1.0,floorProfile,0.025);
controls,routeEnd,8.0,1.0,floorProfile,0.100);
if(!segments.empty())
{
blend.mouthX=segments.front().a[0];
@@ -3605,7 +3605,45 @@ namespace StandaloneStreamBenchmark
}
else ++audit.missingFloorSamples;
}
if(i%4!=0)continue;
}
}
// Keep wall probe density tied to route distance, not to the number
// of adaptive spline segments. A coarser chord tolerance may leave
// long segments around a mouth; fixed stations still exercise the
// same wall geometry without weakening the coverage requirement.
for(std::size_t endpoint=0;endpoint<2;++endpoint)
{
for(double localDistance=0.0;
localDistance<=PassageMouthProfileReachMetres+1.0e-9;
localDistance+=1.0)
{
const double routeDistance=endpoint==0?localDistance
:lowerMouthDistance-localDistance;
if(routeDistance<0.0||routeDistance>lowerMouthDistance)continue;
const auto upper=std::lower_bound(path.begin(),path.end(),routeDistance,
[](const FProfilePose& pose,double value)
{return pose.distance<value;});
const auto b=upper==path.end()?path.end()-1:upper;
const auto a=b==path.begin()?b:b-1;
const double span=b->distance-a->distance;
const double t=span>1.0e-12
?std::clamp((routeDistance-a->distance)/span,0.0,1.0):0.0;
const double dx=b->x-a->x,dy=b->y-a->y;
const double tangentLength=std::hypot(dx,dy);
if(tangentLength<=1.0e-6)
{
audit.missingWallSamples+=2;
continue;
}
const double nx=-dy/tangentLength,ny=dx/tangentLength;
FProfilePose pose;
pose.distance=routeDistance;
pose.x=std::lerp(a->x,b->x,t);
pose.y=std::lerp(a->y,b->y,t);
pose.z=std::lerp(a->z,b->z,t);
pose.floorZ=std::lerp(a->floorZ,b->floorZ,t);
pose.radius=std::lerp(a->radius,b->radius,t);
pose.segmentIndex=t<0.5?a->segmentIndex:b->segmentIndex;
for(std::size_t side=0;side<2;++side)
{
const double sign=side==0?-1.0:1.0;
@@ -3613,10 +3651,12 @@ namespace StandaloneStreamBenchmark
// above its floor. Probe at mid-wall height so this check
// measures those walls instead of the absent roof-height
// shell at the centreline.
const double radius=findWallRadius(pose,sign*nx,sign*ny,0.50);
const double radius=findWallRadius(
pose,sign*nx,sign*ny,0.50);
if(std::isfinite(radius))
{
wallProfiles[endpoint][side].push_back({localDistance,radius});
wallProfiles[endpoint][side].push_back(
{localDistance,radius});
++audit.wallSamples;
}
else ++audit.missingWallSamples;