diff --git a/Standalone/Core/include/VoxelForgeCore/PassageSpline.h b/Standalone/Core/include/VoxelForgeCore/PassageSpline.h new file mode 100644 index 0000000..19c34cb --- /dev/null +++ b/Standalone/Core/include/VoxelForgeCore/PassageSpline.h @@ -0,0 +1,205 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace VoxelForgeCore::PassageSpline +{ + using FPoint = std::array; + inline constexpr std::size_t ArcTableSteps = 32; + inline constexpr double UpperMouthFloorBlendRadiusMetres = 3.5; + + struct FSegment + { + FPoint a{},b{}; + double alongMetres=0.0,lengthMetres=0.0; + std::size_t controlSpan=0; + double tA=0.0,tB=1.0; + double plannedFloorA=0.0,plannedFloorB=0.0; + }; + + inline double KnotSpan(const FPoint& a,const FPoint& b,double unitsPerMetre) + { + const double dx=(b[0]-a[0])/unitsPerMetre; + const double dy=(b[1]-a[1])/unitsPerMetre; + return std::max(1.0e-6,std::sqrt(std::sqrt(dx*dx+dy*dy))); + } + + inline FPoint EvaluateRaw(std::span controls,std::size_t span, + double t,double unitsPerMetre) + { + const auto& p1=controls[span]; + const auto& p2=controls[span+1]; + const auto& p0=controls[span==0?0:span-1]; + const auto& p3=controls[std::min(span+2,controls.size()-1)]; + const double dt0=KnotSpan(p0,p1,unitsPerMetre); + const double dt1=KnotSpan(p1,p2,unitsPerMetre); + const double dt2=KnotSpan(p2,p3,unitsPerMetre); + const double t2=t*t,t3=t2*t; + FPoint result{}; + for(const std::size_t axis:{0u,1u,3u}) + { + const double m1=dt1*((p1[axis]-p0[axis])/dt0 + -(p2[axis]-p0[axis])/(dt0+dt1) + +(p2[axis]-p1[axis])/dt1); + const double m2=dt1*((p2[axis]-p1[axis])/dt1 + -(p3[axis]-p1[axis])/(dt1+dt2) + +(p3[axis]-p2[axis])/dt2); + result[axis]=(2.0*t3-3.0*t2+1.0)*p1[axis] + +(-2.0*t3+3.0*t2)*p2[axis] + +(t3-2.0*t2+t)*m1+(t3-t2)*m2; + } + result[2]=std::lerp(p1[2],p2[2],t); + result[3]=std::clamp(result[3],std::min(p1[3],p2[3]), + std::max(p1[3],p2[3])); + return result; + } + + inline bool ClosestRouteHeightAtXY(std::span> route, + double x,double y,double& height,double& distanceSquared) + { + if(route.empty())return false; + distanceSquared=std::numeric_limits::infinity(); + const auto consider=[&](const std::array& point) + { + const double dx=x-point[0],dy=y-point[1]; + const double candidate=dx*dx+dy*dy; + if(candidate1.0e-12 + ?std::clamp(((x-a[0])*dx+(y-a[1])*dy)/lengthSquared,0.0,1.0):0.0; + const std::array point={a[0]+t*dx,a[1]+t*dy, + std::lerp(a[2],b[2],t)}; + consider(point); + } + return std::isfinite(distanceSquared); + } + + inline double BlendUpperMouthFloorAtXY( + std::span> receivingRoute,double x,double y, + double plannedFloor,double mouthX,double mouthY,double mouthFloor, + double tangentX,double tangentY, + double blendRadiusMetres,double playerCenterAboveFloorMetres, + double unitsPerMetre=1.0) + { + if(receivingRoute.empty()||!(blendRadiusMetres>0.0) + ||!(unitsPerMetre>0.0))return plannedFloor; + const double dx=(x-mouthX)/unitsPerMetre; + const double dy=(y-mouthY)/unitsPerMetre; + if(dx*tangentX+dy*tangentY>=0.0)return plannedFloor; + const double dz=(plannedFloor-mouthFloor)/unitsPerMetre; + const double distance=std::sqrt(dx*dx+dy*dy+dz*dz); + double routeHeight=0.0,routeDistanceSquared=0.0; + if(distance>blendRadiusMetres + ||!ClosestRouteHeightAtXY(receivingRoute,x,y,routeHeight, + routeDistanceSquared) + ||routeDistanceSquared>std::pow(2.0*blendRadiusMetres*unitsPerMetre,2.0)) + return plannedFloor; + const double t=std::clamp(distance/blendRadiusMetres,0.0,1.0); + const double blend=t*t*(3.0-2.0*t); + const double receivingFloor=routeHeight + -playerCenterAboveFloorMetres*unitsPerMetre; + return std::lerp(plannedFloor,receivingFloor,blend); + } + + inline std::vector BuildSegments(std::span controls, + std::size_t spanCount,double spacingMetres,double unitsPerMetre=1.0, + std::span plannedFloorProfile={}) + { + std::vector result; + if(controls.size()<2||!(spacingMetres>0.0)||!(unitsPerMetre>0.0))return result; + spanCount=std::min(spanCount,controls.size()-1); + double alongMetres=0.0; + for(std::size_t span=0;span horizontalArc{}; + auto previous=EvaluateRaw(controls,span,0.0,unitsPerMetre); + for(std::size_t step=1;step<=ArcTableSteps;++step) + { + const auto current=EvaluateRaw(controls,span, + static_cast(step)/ArcTableSteps,unitsPerMetre); + const double dx=(current[0]-previous[0])/unitsPerMetre; + const double dy=(current[1]-previous[1])/unitsPerMetre; + horizontalArc[step]=horizontalArc[step-1]+std::sqrt(dx*dx+dy*dy); + previous=current; + } + const double spanLength=horizontalArc.back(); + const std::size_t segmentCount=std::max(1, + static_cast(std::ceil(spanLength/spacingMetres))); + std::vector points; + std::vector parameters; + points.reserve(segmentCount+1); + parameters.reserve(segmentCount+1); + points.push_back(EvaluateRaw(controls,span,0.0,unitsPerMetre)); + parameters.push_back(0.0); + for(std::size_t segment=1;segment<=segmentCount;++segment) + { + const double targetArc=spanLength*static_cast(segment) + /segmentCount; + const auto upper=std::lower_bound(horizontalArc.begin()+1, + horizontalArc.end(),targetArc); + const std::size_t upperIndex=static_cast( + upper-horizontalArc.begin()); + const std::size_t lowerIndex=upperIndex-1; + const double arcSpan=horizontalArc[upperIndex]-horizontalArc[lowerIndex]; + const double arcT=arcSpan>1.0e-12 + ?std::clamp((targetArc-horizontalArc[lowerIndex])/arcSpan,0.0,1.0):0.0; + const double t=(static_cast(lowerIndex)+arcT)/ArcTableSteps; + points.push_back(EvaluateRaw(controls,span,t,unitsPerMetre)); + parameters.push_back(t); + } + std::vector sampledHorizontalArc(points.size(),0.0); + for(std::size_t i=1;i1.0e-12 + ?sampledHorizontalArc[i]/sampledSpanLength:parameters[i]; + points[i][2]=std::lerp(controls[span][2],controls[span+1][2],progress); + } + for(std::size_t i=1;i1.0e-12 + ?sampledHorizontalArc[index]/sampledSpanLength:parameters[index]; + return std::lerp(plannedFloorProfile[span], + plannedFloorProfile[span+1],progress); + }; + result.push_back({points[i-1],points[i],alongMetres,length,span, + parameters[i-1],parameters[i],floorAt(i-1),floorAt(i)}); + alongMetres+=length; + } + } + return result; + } +} diff --git a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h index d39d106..41f83af 100644 --- a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h +++ b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h @@ -12,6 +12,7 @@ #include #include "VoxelForgeCore/Linux77Profiler.h" +#include "VoxelForgeCore/PassageSpline.h" // UBT supplies this export/import macro for the runtime module. The standalone target has no // module boundary, so leave it empty there. UBT fournit la macro; le viewer autonome reste neutre. @@ -468,9 +469,9 @@ 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. - // Version 218 resamples passages on a smooth spline and uses open-air half-pipe shells. // Version 218 sweeps passages around a dense smooth spline and limits exposed shells to a trough. - inline constexpr std::uint32_t WorldAssemblyEvaluatorVersion = 218; + // Version 219 smooths passage XY while mapping each planned height chord over its sampled horizontal arc. + inline constexpr std::uint32_t WorldAssemblyEvaluatorVersion = 219; enum class FieldChannel : std::uint32_t { diff --git a/Standalone/Core/src/ShapeWorldInternal.h b/Standalone/Core/src/ShapeWorldInternal.h index a40e2b5..cf0ecfa 100644 --- a/Standalone/Core/src/ShapeWorldInternal.h +++ b/Standalone/Core/src/ShapeWorldInternal.h @@ -7,6 +7,7 @@ #include "VoxelStrateManager.h" #include "VoxelDensityPrimitives.h" #include "VoxelForgeCore/VoxelForgeCore.h" +#include "VoxelForgeCore/PassageSpline.h" #include "VoxelForgeFieldShared.h" #include "VoxelForgeCore/FloatingIslandInstrumentation.h" #include "VoxelForgeCore/Linux77Profiler.h" @@ -1223,11 +1224,16 @@ public: double unionDistance=std::numeric_limits::infinity(); double unionShellDistance=std::numeric_limits::infinity(); const std::uint32_t reliefSeed=static_cast(Owner?Owner->Seed:0); + const auto* queryStratum=FindBoundStratumForManagerZ(Z); for(std::size_t passageIndex=0;passageIndexpassages.size(); ++passageIndex) { const auto& passage=ResolvedLayout->passages[passageIndex]; if(passage.controlPoints.size()<2)continue; + if(queryStratum&&queryStratum->Resolved + &&queryStratum->Resolved->passageCapabilities.hasNativeCaveField + &&passage.lowerStrateIndex==queryStratum->StrateIndex) + continue; if(passageProfile)++passageProfile->passageIterations; if(passageTileScopeMatches&&!passageTileQueries->hasRouteFeature(passageIndex)) continue; @@ -1291,7 +1297,7 @@ public: const double floorDepth=PassageFlatFloorDepthSubvoxels( constants,segmentIndex,floorT,floorRadius,qPerMetre); const double floorCenterZ=PassageFlatFloorCenterZSubvoxels( - constants,segmentIndex,floorT,segment,floorDepth,qPerMetre); + constants,segmentIndex,floorT,segment,qx,qy,floorDepth,qPerMetre); const double flatDistance=PassageFlatBottomDistance( static_cast(roundDistance),floorCenterZ,qz,floorDepth,qPerMetre); if(flatDistance(roundDistance),floorCenterZ,qz,floorDepth,qPerMetre); const double alongMetres=segment.authoredAlongMetres @@ -1453,17 +1459,22 @@ public: // solid only in air, so it leaves host rock unchanged. Taking the union // before writing either polarity makes every tunnel interior beat every // overlapping tunnel shell. - // Preserve native graph air inside the passage interior before any shell - // can change its sign. Outside that interior, the shell may cover host air. - if(nativeTunnelFieldDensity>=0.0f&&unionDistance<=0.0) + // Preserve both native graph air and passage interior before any shell + // can change their sign. If they overlap, their positive air fields combine. + if(nativeTunnelFieldDensity>=0.0f) { - const float passageAir=static_cast(-unionDistance/Q); + const float passageAir=unionDistance<=0.0 + ?static_cast(-unionDistance/Q) + :std::numeric_limits::lowest(); return std::max(nativeTunnelFieldDensity,passageAir); } if(nativeFloorSupport!=std::numeric_limits::lowest() &&nativeFloorSupport<0.0f) return std::min(nativeFloorSupport,unionDistance<=0.0 ?static_cast(-unionDistance/Q):density); + if(nativeTunnelFieldDensity!=std::numeric_limits::lowest()) + return unionDistance<=0.0 + ?static_cast(-unionDistance/Q):density; if(unionDistance<=0.0) return static_cast(-unionDistance/Q); if(unionShellDistance<0.0&&density>=0.0f) @@ -3368,50 +3379,23 @@ private: { double floorDepthMetres=0.0,totalPathLengthMetres=0.0; double authoredTotalPathLengthMetres=0.0; - double upperMouthFloorDepthMetres=0.0,lowerMouthFloorDepthMetres=0.0; + double upperMouthX=0.0,upperMouthY=0.0; + double upperMouthPlannedFloor=0.0; + double upperMouthTangentX=0.0,upperMouthTangentY=0.0; + std::vector> upperMouthReceivingRoute; std::size_t routeEndControlIndex=0; }; struct FPassageSegmentData { std::array a{},b{},delta{}; std::array sweepMinimumSubvoxels{},sweepMaximumSubvoxels{}; - double authoredCenterZA=0.0,authoredCenterZDelta=0.0; + double authoredFloorZA=0.0,authoredFloorZDelta=0.0; double authoredAlongMetres=0.0,authoredLengthMetres=0.0; double radiusA=0.0,radiusB=0.0,radiusDelta=0.0; double lengthSq=0.0,horizontalLengthSq=0.0; double lengthSubvoxels=0.0,horizontalLength=0.0; bool routeSegment=false; }; - static double PassageCentripetalKnotSpan( - const std::array& a,const std::array& b) - { - const double dx=b[0]-a[0],dy=b[1]-a[1],dz=b[2]-a[2]; - return std::max(1.0e-6,DeterministicSqrt(DeterministicSqrt( - dx*dx+dy*dy+dz*dz))); - } - static std::array PassageCentripetalCatmullRom( - const std::array& p0,const std::array& p1, - const std::array& p2,const std::array& p3, - double t,double dt0,double dt1,double dt2) - { - std::array result{}; - const double t2=t*t,t3=t2*t; - for(std::size_t axis=0;axis<4;++axis) - { - const double m1=dt1*((p1[axis]-p0[axis])/dt0 - -(p2[axis]-p0[axis])/(dt0+dt1) - +(p2[axis]-p1[axis])/dt1); - const double m2=dt1*((p2[axis]-p1[axis])/dt1 - -(p3[axis]-p1[axis])/(dt1+dt2) - +(p3[axis]-p2[axis])/dt2); - result[axis]=(2.0*t3-3.0*t2+1.0)*p1[axis] - +(-2.0*t3+3.0*t2)*p2[axis] - +(t3-2.0*t2+t)*m1+(t3-t2)*m2; - } - result[3]=std::clamp(result[3],std::min(p1[3],p2[3]), - std::max(p1[3],p2[3])); - return result; - } static double PassageFlatFloorDepthSubvoxels( const FPassageComposerConstants& constants,std::size_t segmentIndex,double t, double radiusSubvoxels,double qPerMetre) @@ -3423,37 +3407,23 @@ private: std::max(0.0,radiusSubvoxels-0.23*qPerMetre)); } - static double PassageRouteFloorDepthMetres( - const FPassageComposerConstants& constants,double alongMetres,double radiusMetres) - { - const double localRadiusDepth=std::max(0.0,radiusMetres-0.23); - const double mouthDistance=std::max(0.0,std::min(alongMetres, - constants.authoredTotalPathLengthMetres-alongMetres)); - const double linear=std::clamp(mouthDistance/5.0,0.0,1.0); - const double ramp=linear*linear*(3.0-2.0*linear); - const double target=alongMetres<=constants.authoredTotalPathLengthMetres*0.5 - ?constants.upperMouthFloorDepthMetres - :constants.lowerMouthFloorDepthMetres; - // The mouth coordinate is the player center 1.13 m above the floor. - // Let its ramp reach the full radius there, then ease to radius-0.23 m - // through the body over five metres. - const double mouthDepth=std::clamp(target,0.0,std::max(0.0,radiusMetres)); - return std::lerp(mouthDepth,localRadiusDepth,ramp); - } - static double PassageFlatFloorCenterZSubvoxels( const FPassageComposerConstants& constants,std::size_t segmentIndex,double floorT, - const FPassageSegmentData& segment,double floorDepthSubvoxels,double qPerMetre) + const FPassageSegmentData& segment,double queryXSubvoxels,double queryYSubvoxels, + double floorDepthSubvoxels,double qPerMetre) { if(!segment.routeSegment||qPerMetre<=0.0) return segment.a[2]+floorT*segment.delta[2]; - const double radiusMetres=(segment.radiusA+floorT*segment.radiusDelta)/qPerMetre; - const double alongMetres=segment.authoredAlongMetres - +floorT*segment.authoredLengthMetres; - const double routeDepth=PassageRouteFloorDepthMetres( - constants,alongMetres,radiusMetres); - return segment.authoredCenterZA+floorT*segment.authoredCenterZDelta - -routeDepth*qPerMetre+floorDepthSubvoxels; + const double plannedFloor=segment.authoredFloorZA + +floorT*segment.authoredFloorZDelta; + const double mouthBlendFloor=VoxelForgeCore::PassageSpline::BlendUpperMouthFloorAtXY( + constants.upperMouthReceivingRoute,queryXSubvoxels,queryYSubvoxels, + plannedFloor,constants.upperMouthX,constants.upperMouthY, + constants.upperMouthPlannedFloor, + constants.upperMouthTangentX,constants.upperMouthTangentY, + VoxelForgeCore::PassageSpline::UpperMouthFloorBlendRadiusMetres,1.13, + qPerMetre); + return mouthBlendFloor+floorDepthSubvoxels; } static float PassageFlatBottomDistance(float roundDistanceSubvoxels, @@ -4529,7 +4499,7 @@ private: if(!ResolvedLayout) { if(tracePreparation) - std::printf("[L111PassagePrepare] passages=0 control_spans=0 segments=0 spacing_m=1.00 bytes=0 prepare_ms=%.3f\n", + std::printf("[L112PassagePrepare] passages=0 control_spans=0 segments=0 spacing_m=1.00 bytes=0 prepare_ms=%.3f\n", std::chrono::duration( std::chrono::steady_clock::now()-preparationStart).count()); return; @@ -4541,7 +4511,6 @@ private: const double qPerMetre=Q*1000000.0/ std::max(1,ResolvedLayout->coreVoxelSizeMicrometres); constexpr double PassageSegmentSpacingMetres=1.0; - constexpr std::size_t ArcLengthTableSteps=32; std::size_t preparedSegments=0,controlSpans=0; for(std::size_t passageIndex=0;passageIndexpassages.size(); ++passageIndex) @@ -4558,87 +4527,76 @@ private: auto& constants=PassageComposerConstants[passageIndex]; constants.routeEndControlIndex=routeEnd; - struct FRawPassageSegment - { - std::array a{},b{}; - double alongMetres=0.0,lengthMetres=0.0; - std::size_t span=0; - double tA=0.0,tB=1.0; - bool routeSegment=false; - }; - std::vector> controls; + using FRawPassageSegment=VoxelForgeCore::PassageSpline::FSegment; + std::vector controls; controls.reserve(passage.controlPoints.size()); + std::vector plannedFloorProfile; + plannedFloorProfile.reserve(passage.controlPoints.size()); for(const auto& point:passage.controlPoints) + { controls.push_back({static_cast(point.positionSubvoxels[0]), static_cast(point.positionSubvoxels[1]), static_cast(point.positionSubvoxels[2]), static_cast(point.radiusSubvoxels)}); - std::vector rawSegments; - rawSegments.reserve((passage.controlPoints.size()-1)*10); + plannedFloorProfile.push_back(static_cast( + point.positionSubvoxels[2]-point.radiusSubvoxels)); + } + const double authoredUpperMouthFloorDepth=std::max(0.0, + static_cast(passage.controlPoints.front().positionSubvoxels[2] + -passage.upperMouthSubvoxels[2])/qPerMetre+1.13); + double upperMouthFloorDepth=authoredUpperMouthFloorDepth; + const auto upperStratum=std::find_if(ResolvedLayout->strates.begin(), + ResolvedLayout->strates.end(),[&](const auto& stratum) + {return stratum.strateIndex==passage.upperStrateIndex;}); + if(upperStratum!=ResolvedLayout->strates.end() + &&upperStratum->generatorKind=="FloatingIslands") + { + std::vector> route; + for(const auto& anchor:upperStratum->anchors) + if(anchor.kind=="route_point"&&anchor.values.size()>=3) + route.push_back({static_cast(anchor.values[0]), + static_cast(anchor.values[1]), + static_cast(anchor.values[2])}); + constants.upperMouthReceivingRoute=route; + double routeHeight=0.0,distanceSquared=0.0; + if(VoxelForgeCore::PassageSpline::ClosestRouteHeightAtXY(route, + controls.front()[0],controls.front()[1],routeHeight,distanceSquared) + &&distanceSquared<=std::pow(controls.front()[3]+2.0*qPerMetre,2.0)) + upperMouthFloorDepth=std::max(upperMouthFloorDepth, + std::max(0.0,(controls.front()[2]-routeHeight)/qPerMetre+1.13)); + } + controls.front()[3]=std::max(controls.front()[3], + upperMouthFloorDepth*qPerMetre); + const auto sampledSegments=VoxelForgeCore::PassageSpline::BuildSegments( + controls,controls.size()-1,PassageSegmentSpacingMetres,qPerMetre, + plannedFloorProfile); + constants.upperMouthX=controls.front()[0]; + constants.upperMouthY=controls.front()[1]; + constants.upperMouthPlannedFloor=plannedFloorProfile.front(); + if(!sampledSegments.empty()) + { + constants.upperMouthTangentX=sampledSegments.front().b[0] + -sampledSegments.front().a[0]; + constants.upperMouthTangentY=sampledSegments.front().b[1] + -sampledSegments.front().a[1]; + } + std::vector rawSegments=sampledSegments; std::vector> routeRadiusSamples; routeRadiusSamples.push_back({0.0,controls.front()[3]/qPerMetre}); - double alongMetres=0.0,authoredTotalPathLengthMetres=0.0; - const auto curvePoint=[&](std::size_t span,double t) + std::size_t preparedSpan=std::numeric_limits::max(); + double authoredTotalPathLengthMetres=0.0; + for(const auto& raw:rawSegments) { - const auto& p1=controls[span]; - const auto& p2=controls[span+1]; - const auto& p0=controls[span==0?0:span-1]; - const auto& p3=controls[std::min(span+2,controls.size()-1)]; - return PassageCentripetalCatmullRom(p0,p1,p2,p3,t, - PassageCentripetalKnotSpan(p0,p1), - PassageCentripetalKnotSpan(p1,p2), - PassageCentripetalKnotSpan(p2,p3)); - }; - for(std::size_t span=0;span+1 arcLength{}; - auto previous=curvePoint(span,0.0); - for(std::size_t step=1;step<=ArcLengthTableSteps;++step) + if(raw.controlSpan!=preparedSpan) { - const auto current=curvePoint(span, - static_cast(step)/ArcLengthTableSteps); - const double dx=(current[0]-previous[0])/qPerMetre; - const double dy=(current[1]-previous[1])/qPerMetre; - const double dz=(current[2]-previous[2])/qPerMetre; - arcLength[step]=arcLength[step-1] - +DeterministicSqrt(dx*dx+dy*dy+dz*dz); - previous=current; + preparedSpan=raw.controlSpan; + ++controlSpans; } - const double spanLength=arcLength.back(); - const std::size_t segmentCount=std::max(1, - static_cast(std::ceil( - spanLength/PassageSegmentSpacingMetres))); - auto a=curvePoint(span,0.0); - double aT=0.0; - for(std::size_t segment=1;segment<=segmentCount;++segment) - { - const double targetArc=spanLength*static_cast(segment) - /segmentCount; - const auto upper=std::lower_bound(arcLength.begin()+1, - arcLength.end(),targetArc); - const std::size_t upperIndex=static_cast( - upper-arcLength.begin()); - const std::size_t lowerIndex=upperIndex-1; - const double arcSpan=arcLength[upperIndex]-arcLength[lowerIndex]; - const double arcT=arcSpan>1.0e-12 - ?std::clamp((targetArc-arcLength[lowerIndex])/arcSpan,0.0,1.0):0.0; - const double t=(static_cast(lowerIndex)+arcT) - /ArcLengthTableSteps; - const auto b=curvePoint(span,t); - const double dx=(b[0]-a[0])/qPerMetre; - const double dy=(b[1]-a[1])/qPerMetre; - const double dz=(b[2]-a[2])/qPerMetre; - const double length=DeterministicSqrt(dx*dx+dy*dy+dz*dz); - rawSegments.push_back({a,b,alongMetres,length,span,aT,t,span::infinity(); @@ -4650,131 +4608,35 @@ private: minimumBodyRadius=std::min(minimumBodyRadius,sample[1]); } if(!std::isfinite(minimumBodyRadius))minimumBodyRadius=minimumRadius; - // Keep one flat-floor depth through the body and ease it into both mouths. + // Keep a stable body depth and limit it smoothly by the local bore radius. constants.floorDepthMetres=std::max(0.5,minimumBodyRadius-0.23); - constants.upperMouthFloorDepthMetres=std::max(0.0, - static_cast(passage.controlPoints.front().positionSubvoxels[2] - -passage.upperMouthSubvoxels[2])/qPerMetre+1.13); - constants.lowerMouthFloorDepthMetres=std::max(0.0, - static_cast(passage.controlPoints[routeEnd].positionSubvoxels[2] - -passage.lowerMouthSubvoxels[2])/qPerMetre+1.13); - const auto nativeCaveMouth=std::find_if(ResolvedLayout->cavernEdges.begin(), - ResolvedLayout->cavernEdges.end(),[&](const auto& edge) - { - return edge.strateIndex==passage.lowerStrateIndex - &&edge.startAnchorStableId==passage.stableId+"/lower-mouth" - &&!edge.polylineMicrometres.empty(); - }); - if(nativeCaveMouth!=ResolvedLayout->cavernEdges.end()) - { - const double routeFloorMetres=static_cast( - passage.controlPoints[routeEnd].positionSubvoxels[2])/qPerMetre; - const double nativeFloorMetres=static_cast( - nativeCaveMouth->polylineMicrometres.front()[2])/1000000.0; - constants.lowerMouthFloorDepthMetres=std::max(0.0, - routeFloorMetres-nativeFloorMetres); - } - - struct FRouteFloorSample - { - std::array point{}; - double alongMetres=0.0,desiredFloorZMetres=0.0; - }; - std::vector routeFloorSamples; - routeFloorSamples.reserve(rawSegments.size()+1); - const auto appendRouteFloorSample=[&](const std::array& point, - double along) - { - const double radiusMetres=point[3]/qPerMetre; - const double routeDepth=PassageRouteFloorDepthMetres(constants,along, - radiusMetres); - routeFloorSamples.push_back({point,along,point[2]/qPerMetre-routeDepth}); - }; - for(const auto& raw:rawSegments) - { - if(!raw.routeSegment)break; - if(routeFloorSamples.empty())appendRouteFloorSample(raw.a,raw.alongMetres); - appendRouteFloorSample(raw.b,raw.alongMetres+raw.lengthMetres); - } - if(routeFloorSamples.size()>1) - { - constexpr double MaximumWalkGradeTangent=0.2586407821; - std::vector horizontalGradeLimits(routeFloorSamples.size()-1); - std::vector remainingGradeAllowance(routeFloorSamples.size(),0.0); - for(std::size_t i=0;i+10;--i) - remainingGradeAllowance[i-1]=remainingGradeAllowance[i] - +horizontalGradeLimits[i-1]; - std::vector walkableFloor(routeFloorSamples.size()); - walkableFloor.front()=routeFloorSamples.front().desiredFloorZMetres; - walkableFloor.back()=routeFloorSamples.back().desiredFloorZMetres; - for(std::size_t i=1;i+1( @@ -11523,7 +11386,8 @@ inline void FStandaloneShapeWorld::FScopedPassageTileQueries::prepareSweptTubeBa constants,candidate.segmentIndex,floorT,floorRadius,qPerMetre); const double floorCenterZ= FStandaloneShapeWorld::PassageFlatFloorCenterZSubvoxels( - constants,candidate.segmentIndex,floorT,segment,floorDepth,qPerMetre); + constants,candidate.segmentIndex,floorT,segment,qx,qy,floorDepth, + qPerMetre); const double flatDistance=FStandaloneShapeWorld::PassageFlatBottomDistance( static_cast(signedDistance),floorCenterZ,qz,floorDepth,qPerMetre); if(profile)++profileStats_->passageSweepSegmentSamplePairs; diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/REPORT.md b/Standalone/Research/WorldAssemblerM3/Linux112/REPORT.md new file mode 100644 index 0000000..629df8a --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux112/REPORT.md @@ -0,0 +1,44 @@ +# Linux 112 — horizontal spline, planned floor profile + +## Shape and audits + +The passage now follows a dense centripetal spline in XY. Height stays piecewise linear on the planner's horizontal arc-length profile; radius and floor depth blend smoothly. Open-air sections have a floor slab and 1 m side walls, with no roof, and passage interiors take priority over shells. Version is v219; source stamp is `c31c8baca8f8308dca62edc6d286c8e84a8214ede7ca444fdaf337ae743ccee1`. + +The audit samples the same generated centreline. No walkability thresholds were loosened: the grade limit remains 15°, headroom remains 0.30 m for Caves and 2.20 m for Lattice, and the shell, mouth, naturalness, and ripple gates remain in place. The owner route has zero blocked, unsupported, or grade-failure samples. The native Caves route passes at 15.000° maximum grade and 0.300 m minimum headroom; native Lattice passes with zero support failures at 10.028° maximum grade and 2.200 m headroom. All three passage interfaces pass shell, mouth, naturalness, and ripple audits. The FI blocked control at passage/1-2 remains detected (16,380 blocked capsule samples); all three blocked controls were detected. + +The native Caves field owns its corridor so the transition shell cannot clip it; the passage interior still opens within its own stratum. Lattice's authored support below the floor remains solid. These preserve the same walkability and support requirements. + +## Captures + +[Capture index](captures/INDEX.md): 110 images verified (60 L109 before, 50 L112 after), covering mouths, 25/50/75% stations, and every open-air section. This includes 32 verified 4 m close-ups (18 before, 14 after) of the outside and interior walls. For the close-ups, the nominal route target snaps to a nearby mesh triangle; the camera remains 4.00 m from the mesh within 0.02 m, with wall-normal alignment at least 0.25. + +## Readiness + +Five interleaved L80 pairs per cell, all four strata, W8 and W12. Values are median seconds, L109 binary → L112 binary; near is LOD0–2 ready and whole is whole-view ready. + +| Stratum | W8 near | W8 whole | W12 near | W12 whole | +|---|---:|---:|---:|---:| +| SW | 0.779 → 0.822 | 1.837 → 1.826 | 0.802 → 0.845 | 1.768 → 1.835 | +| FI | 0.972 → 1.063 | 1.935 → 2.022 | 0.924 → 0.992 | 1.792 → 1.884 | +| TN | 1.021 → 1.092 | 1.869 → 1.970 | 0.931 → 1.023 | 1.758 → 1.866 | +| VS | 0.832 → 0.921 | 1.764 → 1.827 | 0.783 → 0.861 | 1.666 → 1.741 | + +L109's prior report recorded W12 near-ready at 0.863 s for FI and 0.895 s for TN. In this matrix the L109 binary remeasured at 0.924 s and 0.931 s; L112 measured 0.992 s and 1.023 s. That is +7.4% and +9.9% against the matched rerun, or +15.0% and +14.3% against the prior report values. + +## Candidate lists + +Feature and route-segment lists have the same counts. Each cell shows L109 → L112; totals are candidates across profiled tiles. + +| Stratum | Profiled tiles | Total candidates | p95 per tile | Maximum per tile | +|---|---:|---:|---:|---:| +| SW | 1,763 → 1,742 | 583 → 4,216 | 3 → 18 | 21 → 185 | +| FI | 1,590 → 1,573 | 1,036 → 7,068 | 4 → 22 | 47 → 420 | +| TN | 1,492 → 1,480 | 869 → 4,784 | 4 → 22 | 23 → 116 | +| VS | 1,660 → 1,660 | 644 → 3,133 | 4 → 18 | 16 → 82 | + +## Verification + +- Fast tier: PASS, 264 checks. +- Clang/GCC W1/W8/W12 determinism: all 18 runs passed; hashes match within each configuration. +- Linux VFHostEditor build: succeeded with `-NoUBA -MaxParallelActions=4` after timing. +- No commit was created. diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/RunL112CandidateLists.py b/Standalone/Research/WorldAssemblerM3/Linux112/RunL112CandidateLists.py new file mode 100644 index 0000000..a4329a3 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux112/RunL112CandidateLists.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +"""Compare per-tile passage candidate-list sizes for L109 and L112.""" +from __future__ import annotations + +import json +import math +import re +import statistics +import subprocess +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / "Saved/Linux/l112/candidate-lists" +DATA = ROOT / "Standalone/data/owner_world.json" +BINARIES = { + "L109": ROOT / "Saved/Linux/l109/bin-final/VoxelForgeCoreHeadless-l109-clang", + "L112": ROOT / "Saved/Linux/l112/bin-clang/VoxelForgeCoreHeadless-l112-clang", +} +CAMERAS = { + 0: (8.0, 16.0, -372.2626953125), + 1: (25.8369140625, 3.19921875, -737.0), + 2: (19.166015625, -14.2001953125, -753.3740234375), + 3: (-20.0625, -5.068359375, -900.353515625), +} +LIST = re.compile(r"^\[PassageComposerTile\].*?features=(\d+) route_candidates=(\d+)", re.M) + + +def percentile(values: list[int], fraction: float) -> int: + ordered = sorted(values) + if not ordered: + return 0 + return ordered[min(len(ordered) - 1, + max(0, math.ceil(fraction * len(ordered)) - 1))] + + +def run(strate: int, version: str) -> dict: + OUT.mkdir(parents=True, exist_ok=True) + log = OUT / f"{version}-s{strate}.log" + camera = ",".join(f"{v:.12f}" for v in CAMERAS[strate]) + ",0,0" + command = [ + "taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + "timeout", "1740s", str(BINARIES[version]), str(DATA), + "--world-assembler-prototype", "--stream-benchmark", "--stream-pipeline", + "--workers=12", "--clip-radius=3", "--max-clip-level=8", "--max-level=8", + f"--camera={camera}", "--profile-passage-composer", "--stream-scheduler-policy=3", + ] + started = time.monotonic() + with log.open("w", encoding="utf-8") as stream: + result = subprocess.run(command, cwd=ROOT, stdout=stream, + stderr=subprocess.STDOUT, check=False, timeout=1740) + output = log.read_text(encoding="utf-8", errors="replace") + features = [int(row[0]) for row in LIST.findall(output)] + routes = [int(row[1]) for row in LIST.findall(output)] + if result.returncode or not features: + raise SystemExit(f"candidate-list profile missing: {log}; exit={result.returncode}") + row = { + "strate": strate, "version": version, "profiled_tiles": len(features), + "feature_candidates": {"sum": sum(features), "min": min(features), + "median": statistics.median(features), "p95": percentile(features, .95), + "max": max(features)}, + "route_segment_candidates": {"sum": sum(routes), "min": min(routes), + "median": statistics.median(routes), "p95": percentile(routes, .95), + "max": max(routes)}, + "elapsed_s": round(time.monotonic() - started, 3), + "log": str(log.relative_to(ROOT)), + } + print("[L112CandidateLists] " + json.dumps(row, sort_keys=True), flush=True) + return row + + +def main() -> int: + if any(not path.is_file() for path in (*BINARIES.values(), DATA)): + raise SystemExit("missing L109/L112 candidate-list input") + rows = [run(strate, version) for strate in range(4) + for version in ("L109", "L112")] + (OUT / "summary.json").write_text(json.dumps(rows, indent=2) + "\n", + encoding="utf-8") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/RunL112Captures.py b/Standalone/Research/WorldAssemblerM3/Linux112/RunL112Captures.py new file mode 100644 index 0000000..b57a7c9 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux112/RunL112Captures.py @@ -0,0 +1,839 @@ +#!/usr/bin/env python3 +"""Capture L109 and L112 routes, every open-air section, and verified 4 m wall views.""" +from __future__ import annotations + +import json +import math +import re +from array import array +import struct +import subprocess +import sys +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +RESEARCH = Path(__file__).resolve().parent +CAPTURES = RESEARCH / "captures" +SAVED = ROOT / "Saved/Linux/l112/captures" +DATA = ROOT / "Standalone/data/owner_world.json" +BINARIES = { + "before": ROOT / "Saved/Linux/l109/bin-final/VoxelForgeCoreHeadless-l109-clang", + "after": ROOT / "Saved/Linux/l112/bin-clang/VoxelForgeCoreHeadless-l112-clang", +} +LAYOUTS = { + "before": ROOT / "Saved/Linux/l109/audit-layout-final-stamp.json", + "after": ROOT / "Saved/Linux/l112/audit-layout-candidate.json", +} +AUDIT_LOGS = { + "before": ROOT / "Saved/Linux/l109/audit-owner4-final-stamp.log", + "after": ROOT / "Saved/Linux/l112/audit-owner-clang.log", +} +RENDERERS = { + "before": ROOT / "Saved/Linux/l109/bin-final/VoxelForgeOffscreenCapture-l109-clang", + "after": ROOT / "Saved/Linux/l112/bin-clang/VoxelForgeOffscreenCapture-l112-clang", +} +SECTION = re.compile( + r"^\[PassageOpenAirSection\] id=(\S+) section=(\d+) start_m=([\d.]+) " + r"end_m=([\d.]+) samples=(\d+) midpoint_xyz_m=\(([^)]*)\) " + r"midpoint_radius_m=([\d.]+)", re.M) +DRAWN = re.compile(r"drawn_triangles=(\d+)") +QUALITY_METRICS = re.compile(r"stddev_luma=([\d.]+).*coverage_luma_gt12=([\d.]+)") + + +def vector(text: str) -> tuple[float, float, float]: + return tuple(float(value) for value in text.split(",")) + + +def add(a, b): + return tuple(x + y for x, y in zip(a, b)) + + +def sub(a, b): + return tuple(x - y for x, y in zip(a, b)) + + +def mul(a, scale): + return tuple(x * scale for x in a) + + +def norm(a): + length = math.sqrt(sum(x * x for x in a)) + if length <= 1.0e-9: + return (0.0, 1.0, 0.0) + return tuple(value / length for value in a) + + +def angles(camera, target): + delta = sub(target, camera) + horizontal = math.hypot(delta[0], delta[1]) + return (math.degrees(math.atan2(delta[0], delta[1])), + math.degrees(math.atan2(delta[2], horizontal))) + + +def fmt(values) -> str: + return ",".join(f"{value:.6f}" for value in values) + + +def mesh_triangle_count(mesh: Path) -> int: + """Read only the VFMSH headers and count indexed triangles.""" + with mesh.open("rb") as stream: + magic = stream.read(8) + materials = magic == b"VFMSH002" + if magic not in (b"VFMSH001", b"VFMSH002"): + raise RuntimeError(f"unsupported mesh scene header: {mesh}") + version, _voxel_um, tile_count = struct.unpack("<3I", stream.read(12)) + if version != (2 if materials else 1): + raise RuntimeError(f"mesh scene version mismatch: {mesh}") + stream.seek(40, 1) + triangles = 0 + for _ in range(tile_count): + stream.seek(16, 1) + surface_count, _skirts, vertex_count, index_count, mask_count = struct.unpack( + "<5I", stream.read(20)) + triangles += index_count // 3 + stream.seek(vertex_count * 24 + (10 * vertex_count if materials else 0) + + index_count * 4 + mask_count, 1) + if stream.read(1): + raise RuntimeError(f"trailing data in mesh scene: {mesh}") + return triangles + + +def dot(a, b): + return sum(x * y for x, y in zip(a, b)) + + +def closest_point_triangle(point, a, b, c): + def closest_segment(start, end, first_weight, second_weight): + edge = sub(end, start) + length_squared = dot(edge, edge) + t = (min(1.0, max(0.0, dot(sub(point, start), edge) / length_squared)) + if length_squared > 1.0e-16 else 0.0) + position = add(start, mul(edge, t)) + weights = [0.0, 0.0, 0.0] + weights[first_weight], weights[second_weight] = 1.0 - t, t + return position, tuple(weights) + + ab, ac = sub(b, a), sub(c, a) + cross = ((ab[1] * ac[2] - ab[2] * ac[1]), + (ab[2] * ac[0] - ab[0] * ac[2]), + (ab[0] * ac[1] - ab[1] * ac[0])) + if dot(cross, cross) <= 1.0e-16: + candidates = [closest_segment(a, b, 0, 1), + closest_segment(b, c, 1, 2), + closest_segment(c, a, 2, 0)] + return min(candidates, key=lambda candidate: + dot(sub(candidate[0], point), sub(candidate[0], point))) + ap = sub(point, a) + d1, d2 = dot(ab, ap), dot(ac, ap) + if d1 <= 0.0 and d2 <= 0.0: + return a, (1.0, 0.0, 0.0) + bp = sub(point, b) + d3, d4 = dot(ab, bp), dot(ac, bp) + if d3 >= 0.0 and d4 <= d3: + return b, (0.0, 1.0, 0.0) + vc = d1 * d4 - d3 * d2 + if vc <= 0.0 and d1 >= 0.0 and d3 <= 0.0: + denominator = d1 - d3 + if denominator <= 1.0e-16: + return a, (1.0, 0.0, 0.0) + v = d1 / denominator + return add(a, mul(ab, v)), (1.0 - v, v, 0.0) + cp = sub(point, c) + d5, d6 = dot(ab, cp), dot(ac, cp) + if d6 >= 0.0 and d5 <= d6: + return c, (0.0, 0.0, 1.0) + vb = d5 * d2 - d1 * d6 + if vb <= 0.0 and d2 >= 0.0 and d6 <= 0.0: + denominator = d2 - d6 + if denominator <= 1.0e-16: + return a, (1.0, 0.0, 0.0) + w = d2 / denominator + return add(a, mul(ac, w)), (1.0 - w, 0.0, w) + va = d3 * d6 - d5 * d4 + if va <= 0.0 and d4 - d3 >= 0.0 and d5 - d6 >= 0.0: + denominator = (d4 - d3) + (d5 - d6) + if denominator <= 1.0e-16: + return b, (0.0, 1.0, 0.0) + w = (d4 - d3) / denominator + edge = sub(c, b) + return add(b, mul(edge, w)), (0.0, 1.0 - w, w) + face_denominator = va + vb + vc + if face_denominator <= 1.0e-16: + candidates = [closest_segment(a, b, 0, 1), + closest_segment(b, c, 1, 2), + closest_segment(c, a, 2, 0)] + return min(candidates, key=lambda candidate: + dot(sub(candidate[0], point), sub(candidate[0], point))) + denominator = 1.0 / face_denominator + v, w = vb * denominator, vc * denominator + weights = (1.0 - v - w, v, w) + closest = tuple(weights[0] * a[axis] + weights[1] * b[axis] + + weights[2] * c[axis] for axis in range(3)) + return closest, weights + + +def nearest_surface_anchor(mesh: Path, point, margin_m=200.0, *, + preferred_normal=None, minimum_alignment=-1.0) -> dict: + """Return the nearest point on a VFMSH surface triangle and its normal.""" + best_distance_sq = float("inf") + best_position = best_normal = None + with mesh.open("rb") as stream: + magic = stream.read(8) + materials = magic == b"VFMSH002" + if magic not in (b"VFMSH001", b"VFMSH002"): + raise RuntimeError(f"unsupported mesh scene header: {mesh}") + version, voxel_um, tile_count = struct.unpack("<3I", stream.read(12)) + if version != (2 if materials else 1): + raise RuntimeError(f"mesh scene version mismatch: {mesh}") + stream.seek(40, 1) + for _ in range(tile_count): + key = struct.unpack("<4i", stream.read(16)) + surface_count, _skirts, vertex_count, index_count, mask_count = struct.unpack( + "<5I", stream.read(20)) + extent = (32 << key[3]) * voxel_um / 1_000_000.0 + origin = (key[0] * extent, key[1] * extent, key[2] * extent) + if any(point[axis] < origin[axis] - margin_m or + point[axis] > origin[axis] + extent + margin_m for axis in range(3)): + stream.seek(vertex_count * 24 + (10 * vertex_count if materials else 0) + + index_count * 4 + mask_count, 1) + continue + positions = array("f") + positions.frombytes(stream.read(vertex_count * 12)) + normals = array("f") + normals.frombytes(stream.read(vertex_count * 12)) + if materials: + stream.seek(vertex_count * 10, 1) + indices = array("I") + indices.frombytes(stream.read(index_count * 4)) + stream.seek(mask_count, 1) + if struct.pack("=I", 1) != struct.pack("= surface_count or vertex_index >= vertex_count + for vertex_index in triangle): + continue + a, b, c = (vertex(vertex_index) for vertex_index in triangle) + position, weights = closest_point_triangle(point, a, b, c) + delta = sub(position, point) + distance_sq = dot(delta, delta) + if distance_sq >= best_distance_sq: + continue + raw_normals = [vertex_normal(vertex_index) for vertex_index in triangle] + raw_normal = tuple(sum(weights[corner] * raw_normals[corner][axis] + for corner in range(3)) for axis in range(3)) + if dot(raw_normal, raw_normal) < 1.0e-10: + raw_normal = ( + (b[1] - a[1]) * (c[2] - a[2]) - (b[2] - a[2]) * (c[1] - a[1]), + (b[2] - a[2]) * (c[0] - a[0]) - (b[0] - a[0]) * (c[2] - a[2]), + (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0])) + if dot(raw_normal, raw_normal) < 1.0e-10: + continue + candidate_normal = norm(raw_normal) + if preferred_normal is not None: + alignment = dot(candidate_normal, preferred_normal) + if abs(alignment) < minimum_alignment: + continue + if alignment < 0.0: + candidate_normal = mul(candidate_normal, -1.0) + best_distance_sq = distance_sq + best_position = position + best_normal = candidate_normal + if best_position is None: + raise RuntimeError(f"no nearby surface vertices in mesh scene: {mesh}") + return {"position_m": best_position, "normal": best_normal, + "distance_m": math.sqrt(best_distance_sq)} + + +def sanitize(value: str) -> str: + return re.sub(r"[^A-Za-z0-9_-]+", "-", value).strip("-").replace("/", "-") + + +def route_height_at_xy(route, x, y): + if not route: + return None + if len(route) == 1: + point = route[0] + return point[2], (x - point[0]) ** 2 + (y - point[1]) ** 2 + best = (float("inf"), None) + for a, b in zip(route, route[1:]): + dx, dy = b[0] - a[0], b[1] - a[1] + length_sq = dx * dx + dy * dy + t = min(1.0, max(0.0, ((x - a[0]) * dx + (y - a[1]) * dy) / length_sq)) \ + if length_sq > 1.0e-12 else 0.0 + px, py = a[0] + t * dx, a[1] + t * dy + distance_sq = (x - px) ** 2 + (y - py) ** 2 + if distance_sq < best[0]: + best = (distance_sq, a[2] + (b[2] - a[2]) * t) + return best[1], best[0] + + +def upper_mouth_floor_depth(layout: dict, passage: dict, controls) -> float: + scale = layout["core_voxel_size_um"] / 256.0 / 1_000_000.0 + authored = max(0.0, controls[0][0][2] - passage["upper_mouth_q"][2] * scale + 1.13) + stratum = next((row for row in layout["strates"] + if row["strate_index"] == passage["upper_strate_index"]), None) + if stratum is None or stratum["generator_kind"] != "FloatingIslands": + return authored + route = [tuple(value * scale for value in anchor["values"][:3]) + for anchor in stratum.get("anchors", []) + if anchor.get("kind") == "route_point" and len(anchor.get("values", [])) >= 3] + projected = route_height_at_xy(route, controls[0][0][0], controls[0][0][1]) + if projected is None or projected[1] > (controls[0][1] + 2.0) ** 2: + return authored + route_depth = max(0.0, controls[0][0][2] - projected[0] + 1.13) + return max(authored, route_depth) + + +def route_controls(layout: dict, passage: dict, *, adjust_upper_mouth=False): + scale = layout["core_voxel_size_um"] / 256.0 / 1_000_000.0 + controls = [(tuple(value * scale for value in row["position_q"]), + row["radius_q"] * scale) for row in passage["control_points"]] + lower_q = passage["lower_mouth_q"] + player_center_above_floor_q = round( + 1.13 * 256.0 * 1_000_000.0 / layout["core_voxel_size_um"]) + lower_index = next((index for index, row in enumerate(passage["control_points"]) + if row["position_q"][0] == lower_q[0] + and row["position_q"][1] == lower_q[1] + and row["position_q"][2] - row["radius_q"] + + player_center_above_floor_q == lower_q[2]), None) + if lower_index is None: + raise RuntimeError(f"{passage['stable_id']}: lower mouth control is unbound") + if lower_index < 1: + raise RuntimeError(f"{passage['stable_id']}: incomplete route controls") + if adjust_upper_mouth: + controls[0] = (controls[0][0], max(controls[0][1], + upper_mouth_floor_depth(layout, passage, controls))) + return controls, lower_index + + +def route_for(layout: dict, passage: dict) -> list[tuple[tuple[float, float, float], float]]: + controls, lower_index = route_controls(layout, passage) + return controls[:lower_index + 1] + + +def spline_knot_span(a, b): + return max(1.0e-6, math.sqrt(math.sqrt((b[0] - a[0]) ** 2 + + (b[1] - a[1]) ** 2))) + + +def spline_point(controls, span, t): + as_point = lambda index: (*controls[index][0], controls[index][1]) + p0, p1, p2, p3 = (as_point(max(0, span - 1)), as_point(span), + as_point(span + 1), as_point(min(span + 2, len(controls) - 1))) + dt0, dt1, dt2 = (spline_knot_span(p0, p1), spline_knot_span(p1, p2), + spline_knot_span(p2, p3)) + t2, t3 = t * t, t * t * t + result = [0.0] * 4 + for axis in (0, 1, 3): + m1 = dt1 * ((p1[axis] - p0[axis]) / dt0 + - (p2[axis] - p0[axis]) / (dt0 + dt1) + + (p2[axis] - p1[axis]) / dt1) + m2 = dt1 * ((p2[axis] - p1[axis]) / dt1 + - (p3[axis] - p1[axis]) / (dt1 + dt2) + + (p3[axis] - p2[axis]) / dt2) + result[axis] = ((2 * t3 - 3 * t2 + 1) * p1[axis] + + (-2 * t3 + 3 * t2) * p2[axis] + + (t3 - 2 * t2 + t) * m1 + (t3 - t2) * m2) + result[2] = p1[2] + (p2[2] - p1[2]) * t + result[3] = min(max(result[3], min(p1[3], p2[3])), max(p1[3], p2[3])) + return result + + +def smooth_route(layout: dict, passage: dict): + """Mirror PassageSpline::BuildSegments from the runtime shared sampler.""" + scale = layout["core_voxel_size_um"] / 256.0 / 1_000_000.0 + planned_floor_profile = [ + (row["position_q"][2] - row["radius_q"]) * scale + for row in passage["control_points"]] + controls, route_end = route_controls(layout, passage, adjust_upper_mouth=True) + result = [] + along = 0.0 + arc_steps = 32 + for span in range(route_end): + arc = [0.0] + previous = spline_point(controls, span, 0.0) + for step in range(1, arc_steps + 1): + current = spline_point(controls, span, step / arc_steps) + arc.append(arc[-1] + math.hypot(current[0] - previous[0], + current[1] - previous[1])) + previous = current + segment_count = max(1, math.ceil(arc[-1])) + points = [spline_point(controls, span, 0.0)] + parameters = [0.0] + for segment in range(1, segment_count + 1): + target = min(arc[-1], arc[-1] * segment / segment_count) + upper = next(index for index in range(1, len(arc)) + if arc[index] >= target) + lower = upper - 1 + width = arc[upper] - arc[lower] + fraction = min(1.0, max(0.0, (target - arc[lower]) / width)) if width > 1e-12 else 0.0 + t = (lower + fraction) / arc_steps + points.append(spline_point(controls, span, t)) + parameters.append(t) + sampled_arc = [0.0] + for a, b in zip(points, points[1:]): + sampled_arc.append(sampled_arc[-1] + math.hypot(b[0] - a[0], b[1] - a[1])) + horizontal_length = sampled_arc[-1] + for index, point in enumerate(points): + progress = sampled_arc[index] / horizontal_length if horizontal_length > 1e-12 else parameters[index] + point[2] = controls[span][0][2] + (controls[span + 1][0][2] + - controls[span][0][2]) * progress + point.append(planned_floor_profile[span] + + (planned_floor_profile[span + 1] + - planned_floor_profile[span]) * progress) + if not result: + result.append((tuple(points[0][:3]), points[0][3], 0.0, points[0][4])) + for a, b in zip(points, points[1:]): + length = math.dist(a[:3], b[:3]) + along += length + result.append((tuple(b[:3]), b[3], along, b[4])) + return result + + +def derived_smooth_route(route, passage, layout): + total = route[-1][2] + interior_radii = [radius for _, radius, distance, _ in route + if distance >= 10.0 and total - distance >= 10.0] + body_depth = max(0.5, min(interior_radii or [radius for _, radius, _, _ in route]) - 0.23) + result = [] + for point, radius, distance, planned_floor in route: + local_radius_depth = max(0.0, radius - 0.23) + tube_depth = min(body_depth, local_radius_depth) + center = (point[0], point[1], planned_floor + tube_depth) + result.append((center, radius, distance, planned_floor)) + return result, body_depth + + +def route_lengths(route): + lengths = [((b[2] - a[2]) if len(a) > 2 and len(b) > 2 + else math.dist(a[0], b[0])) for a, b in zip(route, route[1:])] + prefix = [0.0] + for length in lengths: + prefix.append(prefix[-1] + length) + return lengths, prefix + + +def at_distance(route, lengths, prefix, distance): + distance = max(0.0, min(distance, prefix[-1])) + for index, length in enumerate(lengths): + if distance <= prefix[index + 1] or index + 1 == len(lengths): + t = 0.0 if length <= 1.0e-9 else (distance - prefix[index]) / length + a, b = route[index], route[index + 1] + return (tuple(a[0][axis] + (b[0][axis] - a[0][axis]) * t + for axis in range(3)), + a[1] + (b[1] - a[1]) * t) + return route[-1] + + +def tangent_at(route, lengths, prefix, distance): + before = at_distance(route, lengths, prefix, max(0.0, distance - 0.25))[0] + after = at_distance(route, lengths, prefix, min(prefix[-1], distance + 0.25))[0] + return norm(sub(after, before)) + + +def derived_route(route, passage, layout): + """Apply L109's fixed-depth floor offset to raw layout controls.""" + lengths, prefix = route_lengths(route) + total = prefix[-1] + body_radii = [radius for index, (_, radius) in enumerate(route) + if prefix[index] >= 10.0 and total - prefix[index] >= 10.0] + body_depth = max(0.5, min(body_radii or [radius for _, radius in route]) - 0.23) + scale = layout["core_voxel_size_um"] / 256.0 / 1_000_000.0 + upper_z = passage["upper_mouth_q"][2] * scale + lower_z = passage["lower_mouth_q"][2] * scale + upper_target = max(0.0, route[0][0][2] - upper_z + 1.13) + lower_target = max(0.0, route[-1][0][2] - lower_z + 1.13) + transformed = [] + for index, (point, radius) in enumerate(route): + local_radius_depth = max(0.0, radius - 0.23) + mouth_distance = max(0.0, min(prefix[index], total - prefix[index])) + u = max(0.0, min(1.0, mouth_distance / 5.0)) + ramp = u * u * (3.0 - 2.0 * u) + target = upper_target if prefix[index] <= total * 0.5 else lower_target + mouth_depth = max(0.0, min(radius, target)) + route_depth = mouth_depth + (local_radius_depth - mouth_depth) * ramp + tube_depth = min(body_depth, local_radius_depth) + transformed.append(((point[0], point[1], point[2] - route_depth + tube_depth), + radius)) + return transformed, body_depth + + +def make_views(layout: dict, audit_sections: list[dict], *, use_derived_shape: bool, + use_spline: bool, + include_open_air: bool = True) -> list[dict]: + views = [] + passages = sorted(layout["passages"], key=lambda item: item["stable_id"]) + for passage in passages: + raw_route = smooth_route(layout, passage) if use_spline else route_for(layout, passage) + if use_derived_shape: + route, body_depth = (derived_smooth_route(raw_route, passage, layout) + if use_spline else derived_route(raw_route, passage, layout)) + else: + route = raw_route + body_depth = max(point[1] for point in route) + def floor_depth(radius: float) -> float: + if not use_derived_shape: + return radius + return min(body_depth, max(0.0, radius - 0.23)) + lengths, prefix = route_lengths(route) + total = prefix[-1] + passage_id = passage["stable_id"] + safe_id = sanitize(passage_id) + + for end_name, distance, outward_sign in ( + ("upper-mouth", 0.0, -1.0), ("lower-mouth", total, 1.0)): + center, radius = at_distance(route, lengths, prefix, distance) + tangent = tangent_at(route, lengths, prefix, distance) + outward = mul(tangent, outward_sign) + floor_z = center[2] - floor_depth(radius) + eye = (center[0] + outward[0] * 4.5, + center[1] + outward[1] * 4.5, + floor_z + 1.55) + if end_name == "lower-mouth": + eye = add(eye, add(mul(outward, 5.0), (0.0, 0.0, 2.0))) + target = (center[0] - outward[0] * 2.0, + center[1] - outward[1] * 2.0, + floor_z + 1.45) + yaw, pitch = angles(eye, target) + views.append({"name": f"{safe_id}-{end_name}", "passage": passage_id, + "kind": "mouth", "station": end_name, + "camera": eye, "target": target, "yaw": yaw, "pitch": pitch, + "focus": center, "center_z": center[2]}) + + for fraction in (0.25, 0.50, 0.75): + distance = total * fraction + center, radius = at_distance(route, lengths, prefix, distance) + tangent = tangent_at(route, lengths, prefix, distance) + depth = floor_depth(radius) + floor_z = center[2] - depth + horizontal = norm((-tangent[1], tangent[0], 0.0)) + eye = (center[0] + horizontal[0] * 0.75, + center[1] + horizontal[1] * 0.75, floor_z + 1.60) + target_center, target_radius = at_distance(route, lengths, prefix, + min(total, distance + 14.0)) + target_depth = floor_depth(target_radius) + target = (target_center[0] + horizontal[0] * 2.35, + target_center[1] + horizontal[1] * 2.35, + target_center[2] - target_depth + 1.80) + yaw, pitch = angles(eye, target) + views.append({"name": f"{safe_id}-station-{int(fraction * 100)}", + "passage": passage_id, "kind": "station", + "station": f"{int(fraction * 100)}%", "camera": eye, + "target": target, "yaw": yaw, "pitch": pitch, + "focus": center, "center_z": center[2], + "route_distance_m": distance, + "route_length_m": total, + "requested_route_distance_m": distance}) + + if not include_open_air: + continue + for section in (item for item in audit_sections if item["passage"] == passage_id): + distance = 0.5 * (section["start_m"] + section["end_m"]) + center, radius = (section["midpoint"], section["radius_m"]) + tangent = tangent_at(route, lengths, prefix, distance) + side = norm((-tangent[1], tangent[0], 0.0)) + depth = floor_depth(radius) + section_id = section["section"] + interior_eye = (center[0], center[1], center[2] - depth + 1.25) + interior_target = add(interior_eye, mul(tangent, 7.0)) + side_eye = add(center, add(mul(side, radius + 5.0), (0.0, 0.0, 1.2))) + oblique_eye = add(center, add(mul(side, -(radius + 3.5)), (0.0, 0.0, 4.0))) + targets = (add(center, (0.0, 0.0, 0.1)), + add(center, mul(tangent, 2.0)), interior_target) + for view_index, (eye, target) in enumerate(zip( + (side_eye, oblique_eye, interior_eye), targets), start=1): + yaw, pitch = angles(eye, target) + views.append({"name": f"{safe_id}-openair-{section_id}-view-{view_index}", + "passage": passage_id, "kind": "open-air", + "station": f"section-{section_id}/view-{view_index}", + "camera": eye, "target": target, "yaw": yaw, + "pitch": pitch, "focus": center, + "center_z": center[2], "open_air_section": section_id, + "route_distance_m": distance, + "requested_route_distance_m": distance, + "route_length_m": total}) + floor_z = center[2] - depth + outside_target = add(center, add(mul(side, radius), (0.0, 0.0, -depth + 0.5))) + outside_eye = add(outside_target, mul(side, 4.0)) + interior_radius = math.sqrt(max(0.0, radius * radius + - max(0.0, depth - 0.5) ** 2)) + inside_target = add(center, add(mul(side, interior_radius), + (0.0, 0.0, -depth + 0.5))) + inside_eye = add(inside_target, + add(mul(side, -1.0), mul(tangent, math.sqrt(15.0)))) + for closeup, eye, target in (("outside", outside_eye, outside_target), + ("interior-wall", inside_eye, inside_target)): + yaw, pitch = angles(eye, target) + views.append({"name": f"{safe_id}-openair-{section_id}-4m-{closeup}", + "passage": passage_id, "kind": "open-air-close", + "station": f"section-{section_id}/4m-{closeup}", + "camera": eye, "target": target, "yaw": yaw, + "pitch": pitch, "focus": center, "center_z": center[2], + "open_air_section": section_id, "closeup_side": closeup, + "closeup_preferred_normal": side if closeup == "outside" + else mul(side, -1.0), + "camera_target_distance_m": math.dist(eye, target), + "route_distance_m": distance, + "requested_route_distance_m": distance, + "route_length_m": total}) + return views + + +def run_process(name: str, command: list[str], log: Path, *, allow_failure=False) -> str: + wrapped = ["taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + "timeout", "1740s", *map(str, command)] + started = time.monotonic() + with log.open("w", encoding="utf-8") as stream: + result = subprocess.run(wrapped, cwd=ROOT, stdout=stream, + stderr=subprocess.STDOUT, check=False, timeout=1740) + if result.returncode and not allow_failure: + raise RuntimeError(f"{name}: exit={result.returncode} log={log}") + print(f"[L112CaptureProcess] name={name} elapsed_s={time.monotonic()-started:.2f} " + f"exit={result.returncode} log={log.relative_to(ROOT)}", flush=True) + return log.read_text(encoding="utf-8", errors="replace") + + +def capture(variant: str, view: dict, layout: dict) -> dict: + variant_saved = SAVED / variant + variant_saved.mkdir(parents=True, exist_ok=True) + variant_capture = CAPTURES / variant + variant_capture.mkdir(parents=True, exist_ok=True) + scene = variant_saved / f"{view['name']}.vfmesh" + image = variant_capture / f"{view['name']}.png" + candidates = [(view["camera"], view["target"], view["focus"], + view.get("route_distance_m"), 0.0, "requested")] + if variant == "before" and view["kind"] not in ("mouth", "open-air-close"): + passage = next(item for item in layout["passages"] + if item["stable_id"] == view["passage"]) + route = route_for(layout, passage) + lengths, prefix = route_lengths(route) + total = prefix[-1] + eye_offset = sub(view["camera"], view["focus"]) + target_offset = sub(view["target"], view["focus"]) + requested = view["route_distance_m"] + for delta in (5, -5, 10, -10, 20, -20, 35, -35, 50, -50, 75, -75, + 100, -100, 150, -150, 200, -200): + distance = max(0.0, min(total, requested + delta)) + if abs(distance - requested) < 0.01: + continue + center, _radius = at_distance(route, lengths, prefix, distance) + candidates.append((add(center, eye_offset), add(center, target_offset), center, + distance, distance - requested, "route-offset")) + + attempt_errors = [] + for attempt_index, (probe_camera, probe_target, probe_focus, route_distance, + route_adjustment, attempt_kind) in enumerate(candidates): + suffix = "" if attempt_index == 0 else f"-attempt-{attempt_index:02d}" + headless_log = variant_saved / f"{view['name']}{suffix}-mesh.log" + render_log = variant_saved / f"{view['name']}{suffix}-render.log" + quality_log = variant_saved / f"{view['name']}{suffix}-quality.log" + yaw, pitch = angles(probe_camera, probe_target) + camera = (*probe_camera, yaw, pitch) + export_command = [ + str(BINARIES[variant]), str(DATA), "--world-assembler-prototype", + "--stream-benchmark", "--stream-pipeline", "--workers=12", + "--clip-radius=3", "--max-clip-level=0", "--max-level=0", "--force-generate", + "--recipe=surface-world", f"--camera={fmt(camera)}", + "--render-distance-chunks=1", f"--mesh-export={scene}", + ] + export_output = run_process(f"{variant}-{view['name']}{suffix}-mesh", export_command, + headless_log) + if "status=PASS" not in export_output or not scene.is_file(): + raise RuntimeError(f"{variant}-{view['name']}: missing successful scene export") + source_triangles = mesh_triangle_count(scene) + if source_triangles <= 0: + attempt_errors.append(f"{attempt_kind}@{route_distance}: empty mesh") + if variant == "after" or view["kind"] == "mouth": + break + continue + + actual_camera, actual_target = probe_camera, probe_target + actual_focus = probe_focus + surface_distance = None + closeup_surface_distance = None + closeup_anchor_offset = None + closeup_normal_alignment = None + closeup_distance = None + if view["kind"] == "open-air-close": + try: + wall_anchor = nearest_surface_anchor(scene, probe_target, margin_m=5.0, + preferred_normal=view["closeup_preferred_normal"], + minimum_alignment=0.25) + closeup_surface_distance = wall_anchor["distance_m"] + closeup_anchor_offset = closeup_surface_distance + closeup_normal_alignment = dot(wall_anchor["normal"], + view["closeup_preferred_normal"]) + if closeup_surface_distance > 5.0: + raise RuntimeError(f"{variant}-{view['name']}: nearest wall surface is " + f"{closeup_surface_distance:.3f} m from the route-local target") + actual_target = wall_anchor["position_m"] + actual_camera = add(actual_target, mul(wall_anchor["normal"], 4.0)) + closeup_distance = math.dist(actual_camera, actual_target) + if abs(closeup_distance - 4.0) > 0.02: + raise RuntimeError(f"{variant}-{view['name']}: camera-to-wall distance is " + f"{closeup_distance:.3f} m, expected 4 m") + except RuntimeError as error: + raise RuntimeError(f"{variant}-{view['name']}: could not verify the 4 m wall " + f"view: {error}") from error + if attempt_kind == "route-offset": + anchor = nearest_surface_anchor(scene, probe_focus) + surface_distance = anchor["distance_m"] + actual_camera = add(anchor["position_m"], mul(anchor["normal"], 12.0)) + actual_target = anchor["position_m"] + actual_focus = anchor["position_m"] + actual_yaw, actual_pitch = angles(actual_camera, actual_target) + render_command = [ + str(RENDERERS[variant]), str(scene), str(image), "--size=1920x1080", + f"--camera-m={fmt(actual_camera)}", f"--yaw-deg={actual_yaw:.6f}", + f"--pitch-deg={actual_pitch:.6f}", "--shade=readable", "--headlamp=on", + "--height-tint=on", f"--height-center-m={actual_focus[2]:.6f}", + "--height-range-m=32", + ] + render_output = run_process(f"{variant}-{view['name']}{suffix}-render", render_command, + render_log) + drawn = DRAWN.search(render_output) + if drawn is None or int(drawn.group(1)) <= 0 or not image.is_file(): + attempt_errors.append(f"{attempt_kind}@{route_distance}: no drawn geometry") + if variant == "after" or view["kind"] == "mouth": + break + continue + quality = run_process(f"{variant}-{view['name']}{suffix}-quality", [ + "python3", "-B", str(ROOT / "Standalone/Tools/verify/capture_quality.py"), + str(image)], quality_log, allow_failure=True) + quality_status = "pass" + if "status=PASS" not in quality: + metrics = QUALITY_METRICS.search(quality) + coverage = float(metrics.group(2)) if metrics else 0.0 + if coverage >= 0.001: + quality_status = "low_contrast_geometry_visible" + else: + attempt_errors.append(f"{attempt_kind}@{route_distance}: no visible pixel coverage") + if variant == "after" or view["kind"] == "mouth": + break + continue + + row = {**view, "variant": variant, "capture": str(image.relative_to(RESEARCH)), + "scene": str(scene.relative_to(ROOT)), "drawn_triangles": int(drawn.group(1)), + "source_triangles": source_triangles, "verified": True, + "pixel_quality_status": quality_status, + "route_distance_actual_m": route_distance, + "route_station_adjustment_m": route_adjustment, + "closeup_camera_target_distance_m": closeup_distance, + "closeup_target_surface_distance_m": closeup_surface_distance, + "closeup_predicted_target_offset_m": closeup_anchor_offset, + "closeup_wall_normal_alignment": closeup_normal_alignment, + "fallback_kind": attempt_kind if attempt_kind != "requested" else None, + "fallback_surface_distance_m": surface_distance, + "camera_actual_m": actual_camera, "target_actual_m": actual_target, + "logs": [str(headless_log.relative_to(ROOT)), + str(render_log.relative_to(ROOT)), + str(quality_log.relative_to(ROOT))]} + print("[L112Capture] " + json.dumps(row, sort_keys=True), flush=True) + return row + raise RuntimeError(f"{variant}-{view['name']}: no verified image; " + + "; ".join(attempt_errors)) + + +def main() -> int: + if any(not path.is_file() for path in (*BINARIES.values(), *RENDERERS.values(), + *LAYOUTS.values(), *AUDIT_LOGS.values())): + raise SystemExit("missing L109 capture binary, layout, or audit log") + all_rows = [] + variants = ("before", "after") + if "--after-only" in sys.argv[1:]: + prior_log = SAVED.parent / "captures-before-first.log" + if not prior_log.is_file(): + raise SystemExit(f"missing reusable L109 capture rows: {prior_log}") + for line in prior_log.read_text(encoding="utf-8", errors="replace").splitlines(): + if line.startswith("[L112Capture] ") or line.startswith("[L109Capture] "): + all_rows.append(json.loads(line.split(" ", 1)[1])) + if not all_rows or any(row["variant"] != "before" for row in all_rows): + raise SystemExit("saved L109 capture rows are incomplete") + variants = ("after",) + sections_by_variant = {} + for variant in ("before", "after"): + sections = [] + for passage, section, start, end, samples, midpoint, radius in SECTION.findall( + AUDIT_LOGS[variant].read_text(encoding="utf-8", errors="replace")): + sections.append({"passage": passage, "section": int(section), + "start_m": float(start), "end_m": float(end), + "samples": int(samples), "midpoint": vector(midpoint), + "radius_m": float(radius)}) + if not sections: + raise SystemExit(f"no open-air sections found in the {variant} passage audit") + sections_by_variant[variant] = sections + if variant not in variants: + continue + if variant == "after" and variants == ("after",): + expected_before = 15 + 5 * len(sections_by_variant["before"]) + if len(all_rows) != expected_before or any( + row.get("variant") != "before" or not row.get("verified") + for row in all_rows): + raise RuntimeError("saved L109 capture rows do not cover every required view") + layout = json.loads(LAYOUTS[variant].read_text(encoding="utf-8")) + include_open_air = True + views = make_views(layout, sections, use_derived_shape=True, + use_spline=variant == "after", + include_open_air=include_open_air) + expected = 5 * len(layout["passages"]) + if include_open_air: + expected += 5 * len(sections) + if len(views) != expected: + raise RuntimeError(f"unexpected camera count: {len(views)} != {expected}") + print(f"[L112CapturePlan] variant={variant} passage_views={5*len(layout['passages'])} " + f"open_air_sections={len(sections) if include_open_air else 0} " + f"open_air_views={5*len(sections) if include_open_air else 0} " + f"total={len(views)}", flush=True) + for view in views: + all_rows.append(capture(variant, view, layout)) + CAPTURES.mkdir(parents=True, exist_ok=True) + (CAPTURES / "capture-index.json").write_text( + json.dumps({"open_air_sections_by_variant": sections_by_variant, + "captures": all_rows}, indent=2) + "\n", + encoding="utf-8") + lines = ["# L112 passage captures", "", + "Each PNG was rendered from its own exported mesh. The renderer reported visible " + "triangles, and each decoded image met the pixel coverage floor. " + "`low_contrast_geometry_visible` marks images that met this floor below the " + "preferred contrast target.", ""] + for variant in ("before", "after"): + lines.extend([f"## {variant.title()}", ""]) + for row in all_rows: + if row["variant"] != variant: + continue + flag = " **OPEN AIR**" if row["kind"] == "open-air" else "" + quality_note = (f"; {row['pixel_quality_status']}" + if row["pixel_quality_status"] != "pass" else "") + lines.append(f"- [{row['station']}]({variant}/{Path(row['capture']).name}) — " + f"{row['passage']}{flag}; {row['drawn_triangles']} visible triangles" + f"{quality_note}") + lines.append("") + (CAPTURES / "INDEX.md").write_text("\n".join(lines), encoding="utf-8") + failures = [row for row in all_rows if not row["verified"]] + closeups = [row for row in all_rows if row["kind"] == "open-air-close"] + closeups_ok = (len(closeups) == 2 * sum(1 for row in all_rows + if row["kind"] == "open-air" and row["station"].endswith("view-1")) + and all(row["verified"] and abs(row["closeup_camera_target_distance_m"] - 4.0) <= 0.02 + and row["closeup_target_surface_distance_m"] <= 5.0 + and row["closeup_wall_normal_alignment"] >= 0.25 + and row["drawn_triangles"] > 0 + and row["pixel_quality_status"] in + ("pass", "low_contrast_geometry_visible") for row in closeups)) + print(f"[L112CaptureSummary] captures={len(all_rows)} verified={len(all_rows)-len(failures)} " + f"failed={len(failures)} 4m_closeups={len(closeups)} closeups_verified=" + f"{str(closeups_ok).lower()}", flush=True) + return 1 if failures or not closeups_ok else 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/RunL112HashMatrix.py b/Standalone/Research/WorldAssemblerM3/Linux112/RunL112HashMatrix.py new file mode 100644 index 0000000..9f037e1 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux112/RunL112HashMatrix.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +"""Check Clang/GCC hash identity at W1/W8/W12 and pin v219 owner hashes.""" +from __future__ import annotations + +import json +import re +import subprocess +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / "Saved/Linux/l112/hashes" +DATASETS = { + "owner4": ROOT / "Standalone/data/owner_world.json", + "owner2": ROOT / "Standalone/data/regression/owner_world_2strate_l61.json", +} +BINARIES = { + "clang": ROOT / "Saved/Linux/l112/bin-clang/VoxelForgeCoreHeadless-l112-clang", + "gcc": ROOT / "Saved/Linux/l112/bin-gcc/VoxelForgeCoreHeadless-l112-gcc", +} +HASH = re.compile(r"^\[Pipeline(?:FullDetailHash|WholeViewHash|LODHash|ExactQueryHash)\].*$", re.M) +STAMP = re.compile(r"^\[VoxelForgeSourceStamp\] sha256=(\S+)$", re.M) + + +def run(dataset: str, recipe: str, workers: int, compiler: str) -> dict: + OUT.mkdir(parents=True, exist_ok=True) + label = f"{dataset}-{recipe}-w{workers}-{compiler}" + log = OUT / f"{label}.log" + layout = OUT / f"{label}.layout.json" + command = [ + "taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + "timeout", "1740s", str(BINARIES[compiler]), str(DATASETS[dataset]), + f"--workers={workers}", "--world-assembler-prototype", "--stream-benchmark", + "--stream-pipeline", "--force-generate", "--clip-radius=3", + "--max-clip-level=8", "--max-level=8", f"--recipe={recipe}", + "--stream-hash", f"--resolved-layout-output={layout}", + ] + started = time.monotonic() + with log.open("w", encoding="utf-8") as stream: + result = subprocess.run(command, cwd=ROOT, stdout=stream, + stderr=subprocess.STDOUT, check=False, timeout=1740) + output = log.read_text(encoding="utf-8", errors="replace") + hashes = HASH.findall(output) + if result.returncode or len(hashes) != 12: + raise SystemExit(f"hash run failed or incomplete: {label}; exit={result.returncode} " + f"hashes={len(hashes)} log={log}") + row = {"dataset": dataset, "recipe": recipe, "workers": workers, + "compiler": compiler, "exit_code": result.returncode, + "hashes": hashes, "source_stamp": (STAMP.search(output).group(1) + if STAMP.search(output) else None), + "elapsed_s": round(time.monotonic() - started, 3), + "log": str(log.relative_to(ROOT))} + print("[L112HashRun] " + json.dumps(row, sort_keys=True), flush=True) + return row + + +def main() -> int: + if any(not path.is_file() for path in (*DATASETS.values(), *BINARIES.values())): + raise SystemExit("missing L112 hash input") + rows = [] + recipes = {"owner4": ("surface-world",), + "owner2": ("surface-world", "floating-islands")} + for dataset, dataset_recipes in recipes.items(): + for recipe in dataset_recipes: + for workers in (1, 8, 12): + for compiler in ("clang", "gcc"): + rows.append(run(dataset, recipe, workers, compiler)) + (OUT / "runs-partial.json").write_text( + json.dumps(rows, indent=2) + "\n", encoding="utf-8") + groups = {} + for dataset, dataset_recipes in recipes.items(): + for recipe in dataset_recipes: + key = f"{dataset}/{recipe}" + group = [row for row in rows if row["dataset"] == dataset + and row["recipe"] == recipe] + reference = group[0]["hashes"] + groups[key] = {"all_worker_compiler_hashes_match": all( + row["hashes"] == reference for row in group), + "source_stamps": sorted({row["source_stamp"] for row in group}), + "runs": [{"workers": row["workers"], "compiler": row["compiler"], + "log": row["log"]} for row in group]} + if not groups[key]["all_worker_compiler_hashes_match"]: + raise SystemExit(f"determinism mismatch: {key}") + if dataset == "owner2": + canonical = next(row for row in group if row["workers"] == 12 + and row["compiler"] == "clang") + recipe_name = "floating-islands" if recipe == "floating-islands" else "surface-world" + style = 1 if recipe_name == "surface-world" else 2 + baseline = (ROOT / "Standalone/Tools/verify/baselines/owner-hash/canonical" + / f"owner-hash-{recipe_name}-style{style}-v219.baseline") + baseline.write_text("\n".join(canonical["hashes"]) + "\n", + encoding="utf-8") + summary = {"runs": rows, "groups": groups, + "owner4_all_four_strata": "owner4/surface-world", + "owner2_canonical_pins": ["owner2/surface-world", + "owner2/floating-islands"]} + (OUT / "summary.json").write_text(json.dumps(summary, indent=2) + "\n", + encoding="utf-8") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/RunL112Timing.py b/Standalone/Research/WorldAssemblerM3/Linux112/RunL112Timing.py new file mode 100644 index 0000000..ff6bb0d --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux112/RunL112Timing.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 +"""Five interleaved L80 readiness pairs comparing L109 and L112 at W8 and W12.""" +from __future__ import annotations + +import json +import re +import statistics +import subprocess +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / "Saved/Linux/l112/timing" +DATA = ROOT / "Standalone/data/owner_world.json" +BINARIES = { + "base": ROOT / "Saved/Linux/l109/bin-final/VoxelForgeCoreHeadless-l109-clang", + "candidate": ROOT / "Saved/Linux/l112/bin-clang/VoxelForgeCoreHeadless-l112-clang", +} +CAMERAS = { + 0: (8.0, 16.0, -372.2626953125), + 1: (25.8369140625, 3.19921875, -737.0), + 2: (19.166015625, -14.2001953125, -753.3740234375), + 3: (-20.0625, -5.068359375, -900.353515625), +} +PIPELINE = re.compile(r"^\[StreamPipeline\] (.*)$", re.M) +FIELDS = re.compile(r"([a-zA-Z0-9_]+)=([^ ]+)") +NEAR = re.compile( + r"^\[WorldAssemblerNearLODReady\] lods=0-2 tiles=(\d+)/(\d+) cold_ready_s=([0-9.]+)$", + re.M, +) + + +def run(strate: int, workers: int, variant: str, phase: str, replicate: int) -> dict: + OUT.mkdir(parents=True, exist_ok=True) + label = f"s{strate}-w{workers}-{variant}-{phase}{replicate}" + log = OUT / f"{label}.log" + camera = ",".join(f"{v:.12f}" for v in CAMERAS[strate]) + ",0,0" + command = [ + "taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + "timeout", "1740s", str(BINARIES[variant]), str(DATA), + "--world-assembler-prototype", "--stream-benchmark", "--stream-pipeline", + f"--workers={workers}", "--clip-radius=3", "--max-clip-level=8", "--max-level=8", + f"--camera={camera}", "--profile-lod-work", "--stream-scheduler-policy=3", + ] + start = time.monotonic() + with log.open("w", encoding="utf-8") as output: + result = subprocess.run(command, cwd=ROOT, stdout=output, + stderr=subprocess.STDOUT, check=False, timeout=1740) + content = log.read_text(encoding="utf-8", errors="replace") + pipeline_match = PIPELINE.search(content) + near_match = NEAR.search(content) + if result.returncode or pipeline_match is None or near_match is None: + raise SystemExit(f"readiness run failed or trace missing: {log}; exit={result.returncode}") + pipeline = dict(FIELDS.findall(pipeline_match.group(1))) + row = { + "strate": strate, "workers": workers, "variant": variant, + "phase": phase, "replicate": replicate, "exit_code": result.returncode, + "wall_s": round(time.monotonic() - start, 3), + "lod02_ready_s": float(near_match.group(3)), + "whole_view_ready_s": float(pipeline["whole_view_ready"].removesuffix("s")), + "whole_tiles": int(pipeline["whole_tiles"].split("/")[0]), + "log": str(log.relative_to(ROOT)), + } + print("[L112TimingRun] " + json.dumps(row, sort_keys=True), flush=True) + return row + + +def main() -> int: + if not DATA.is_file() or any(not binary.is_file() for binary in BINARIES.values()): + raise SystemExit("missing L109/L112 data or timing binary") + rows = [] + for strate in range(4): + for workers in (8, 12): + run(strate, workers, "base", "warmup", 0) + run(strate, workers, "candidate", "warmup", 0) + for replicate in range(1, 6): + order = ("base", "candidate") if replicate % 2 else ("candidate", "base") + for variant in order: + rows.append(run(strate, workers, variant, "measured", replicate)) + (OUT / "runs-partial.json").write_text( + json.dumps(rows, indent=2) + "\n", encoding="utf-8") + summary = [] + for strate in range(4): + for workers in (8, 12): + item = {"strate": strate, "workers": workers, "pairs": 5} + for variant in ("base", "candidate"): + group = [row for row in rows if row["strate"] == strate + and row["workers"] == workers and row["variant"] == variant] + for key in ("lod02_ready_s", "whole_view_ready_s"): + values = [row[key] for row in group] + item[f"{variant}_{key}"] = values + item[f"{variant}_{key}_median"] = statistics.median(values) + for key in ("lod02_ready_s", "whole_view_ready_s"): + base = item[f"base_{key}_median"] + candidate = item[f"candidate_{key}_median"] + item[f"{key}_delta_pct"] = round(100 * (candidate / base - 1), 2) + summary.append(item) + (OUT / "summary.json").write_text( + json.dumps({"runs": rows, "summary": summary}, indent=2) + "\n", + encoding="utf-8") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/__pycache__/RunL112Captures.cpython-313.pyc b/Standalone/Research/WorldAssemblerM3/Linux112/__pycache__/RunL112Captures.cpython-313.pyc new file mode 100644 index 0000000..dfcf2a5 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/__pycache__/RunL112Captures.cpython-313.pyc differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/INDEX.md b/Standalone/Research/WorldAssemblerM3/Linux112/captures/INDEX.md new file mode 100644 index 0000000..bf5de51 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux112/captures/INDEX.md @@ -0,0 +1,119 @@ +# L112 passage captures + +Each PNG was rendered from its own exported mesh. The renderer reported visible triangles, and each decoded image met the pixel coverage floor. `low_contrast_geometry_visible` marks images that met this floor below the preferred contrast target. + +## Before + +- [upper-mouth](before/passage-0-1-0-upper-mouth.png) — passage/0-1/0; 253282 visible triangles +- [lower-mouth](before/passage-0-1-0-lower-mouth.png) — passage/0-1/0; 559326 visible triangles +- [25%](before/passage-0-1-0-station-25.png) — passage/0-1/0; 145630 visible triangles +- [50%](before/passage-0-1-0-station-50.png) — passage/0-1/0; 430386 visible triangles +- [75%](before/passage-0-1-0-station-75.png) — passage/0-1/0; 294374 visible triangles +- [section-1/view-1](before/passage-0-1-0-openair-1-view-1.png) — passage/0-1/0 **OPEN AIR**; 289074 visible triangles +- [section-1/view-2](before/passage-0-1-0-openair-1-view-2.png) — passage/0-1/0 **OPEN AIR**; 298057 visible triangles +- [section-1/view-3](before/passage-0-1-0-openair-1-view-3.png) — passage/0-1/0 **OPEN AIR**; 322309 visible triangles +- [section-1/4m-outside](before/passage-0-1-0-openair-1-4m-outside.png) — passage/0-1/0; 289074 visible triangles +- [section-1/4m-interior-wall](before/passage-0-1-0-openair-1-4m-interior-wall.png) — passage/0-1/0; 322309 visible triangles +- [section-2/view-1](before/passage-0-1-0-openair-2-view-1.png) — passage/0-1/0 **OPEN AIR**; 283642 visible triangles +- [section-2/view-2](before/passage-0-1-0-openair-2-view-2.png) — passage/0-1/0 **OPEN AIR**; 316771 visible triangles +- [section-2/view-3](before/passage-0-1-0-openair-2-view-3.png) — passage/0-1/0 **OPEN AIR**; 322309 visible triangles +- [section-2/4m-outside](before/passage-0-1-0-openair-2-4m-outside.png) — passage/0-1/0; 283642 visible triangles +- [section-2/4m-interior-wall](before/passage-0-1-0-openair-2-4m-interior-wall.png) — passage/0-1/0; 363071 visible triangles +- [section-3/view-1](before/passage-0-1-0-openair-3-view-1.png) — passage/0-1/0 **OPEN AIR**; 262299 visible triangles +- [section-3/view-2](before/passage-0-1-0-openair-3-view-2.png) — passage/0-1/0 **OPEN AIR**; 310919 visible triangles; low_contrast_geometry_visible +- [section-3/view-3](before/passage-0-1-0-openair-3-view-3.png) — passage/0-1/0 **OPEN AIR**; 363071 visible triangles +- [section-3/4m-outside](before/passage-0-1-0-openair-3-4m-outside.png) — passage/0-1/0; 298863 visible triangles +- [section-3/4m-interior-wall](before/passage-0-1-0-openair-3-4m-interior-wall.png) — passage/0-1/0; 340799 visible triangles +- [section-4/view-1](before/passage-0-1-0-openair-4-view-1.png) — passage/0-1/0 **OPEN AIR**; 378007 visible triangles +- [section-4/view-2](before/passage-0-1-0-openair-4-view-2.png) — passage/0-1/0 **OPEN AIR**; 471132 visible triangles +- [section-4/view-3](before/passage-0-1-0-openair-4-view-3.png) — passage/0-1/0 **OPEN AIR**; 382187 visible triangles +- [section-4/4m-outside](before/passage-0-1-0-openair-4-4m-outside.png) — passage/0-1/0; 309174 visible triangles +- [section-4/4m-interior-wall](before/passage-0-1-0-openair-4-4m-interior-wall.png) — passage/0-1/0; 382187 visible triangles +- [upper-mouth](before/passage-1-2-0-upper-mouth.png) — passage/1-2/0; 570417 visible triangles; low_contrast_geometry_visible +- [lower-mouth](before/passage-1-2-0-lower-mouth.png) — passage/1-2/0; 511318 visible triangles +- [25%](before/passage-1-2-0-station-25.png) — passage/1-2/0; 661032 visible triangles +- [50%](before/passage-1-2-0-station-50.png) — passage/1-2/0; 602996 visible triangles +- [75%](before/passage-1-2-0-station-75.png) — passage/1-2/0; 615520 visible triangles +- [section-1/view-1](before/passage-1-2-0-openair-1-view-1.png) — passage/1-2/0 **OPEN AIR**; 629052 visible triangles +- [section-1/view-2](before/passage-1-2-0-openair-1-view-2.png) — passage/1-2/0 **OPEN AIR**; 588414 visible triangles +- [section-1/view-3](before/passage-1-2-0-openair-1-view-3.png) — passage/1-2/0 **OPEN AIR**; 616234 visible triangles +- [section-1/4m-outside](before/passage-1-2-0-openair-1-4m-outside.png) — passage/1-2/0; 629052 visible triangles +- [section-1/4m-interior-wall](before/passage-1-2-0-openair-1-4m-interior-wall.png) — passage/1-2/0; 573086 visible triangles +- [upper-mouth](before/passage-2-3-0-upper-mouth.png) — passage/2-3/0; 59562 visible triangles +- [lower-mouth](before/passage-2-3-0-lower-mouth.png) — passage/2-3/0; 294522 visible triangles; low_contrast_geometry_visible +- [25%](before/passage-2-3-0-station-25.png) — passage/2-3/0; 55484 visible triangles; low_contrast_geometry_visible +- [50%](before/passage-2-3-0-station-50.png) — passage/2-3/0; 457754 visible triangles +- [75%](before/passage-2-3-0-station-75.png) — passage/2-3/0; 475706 visible triangles +- [section-1/view-1](before/passage-2-3-0-openair-1-view-1.png) — passage/2-3/0 **OPEN AIR**; 104612 visible triangles +- [section-1/view-2](before/passage-2-3-0-openair-1-view-2.png) — passage/2-3/0 **OPEN AIR**; 81078 visible triangles +- [section-1/view-3](before/passage-2-3-0-openair-1-view-3.png) — passage/2-3/0 **OPEN AIR**; 94962 visible triangles; low_contrast_geometry_visible +- [section-1/4m-outside](before/passage-2-3-0-openair-1-4m-outside.png) — passage/2-3/0; 104612 visible triangles; low_contrast_geometry_visible +- [section-1/4m-interior-wall](before/passage-2-3-0-openair-1-4m-interior-wall.png) — passage/2-3/0; 99334 visible triangles +- [section-2/view-1](before/passage-2-3-0-openair-2-view-1.png) — passage/2-3/0 **OPEN AIR**; 475688 visible triangles +- [section-2/view-2](before/passage-2-3-0-openair-2-view-2.png) — passage/2-3/0 **OPEN AIR**; 479134 visible triangles +- [section-2/view-3](before/passage-2-3-0-openair-2-view-3.png) — passage/2-3/0 **OPEN AIR**; 479134 visible triangles +- [section-2/4m-outside](before/passage-2-3-0-openair-2-4m-outside.png) — passage/2-3/0; 475688 visible triangles +- [section-2/4m-interior-wall](before/passage-2-3-0-openair-2-4m-interior-wall.png) — passage/2-3/0; 486364 visible triangles +- [section-3/view-1](before/passage-2-3-0-openair-3-view-1.png) — passage/2-3/0 **OPEN AIR**; 485216 visible triangles +- [section-3/view-2](before/passage-2-3-0-openair-3-view-2.png) — passage/2-3/0 **OPEN AIR**; 479198 visible triangles +- [section-3/view-3](before/passage-2-3-0-openair-3-view-3.png) — passage/2-3/0 **OPEN AIR**; 490436 visible triangles; low_contrast_geometry_visible +- [section-3/4m-outside](before/passage-2-3-0-openair-3-4m-outside.png) — passage/2-3/0; 485216 visible triangles +- [section-3/4m-interior-wall](before/passage-2-3-0-openair-3-4m-interior-wall.png) — passage/2-3/0; 490436 visible triangles +- [section-4/view-1](before/passage-2-3-0-openair-4-view-1.png) — passage/2-3/0 **OPEN AIR**; 475298 visible triangles +- [section-4/view-2](before/passage-2-3-0-openair-4-view-2.png) — passage/2-3/0 **OPEN AIR**; 495856 visible triangles +- [section-4/view-3](before/passage-2-3-0-openair-4-view-3.png) — passage/2-3/0 **OPEN AIR**; 496236 visible triangles; low_contrast_geometry_visible +- [section-4/4m-outside](before/passage-2-3-0-openair-4-4m-outside.png) — passage/2-3/0; 475298 visible triangles +- [section-4/4m-interior-wall](before/passage-2-3-0-openair-4-4m-interior-wall.png) — passage/2-3/0; 475316 visible triangles + +## After + +- [upper-mouth](after/passage-0-1-0-upper-mouth.png) — passage/0-1/0; 244874 visible triangles +- [lower-mouth](after/passage-0-1-0-lower-mouth.png) — passage/0-1/0; 551596 visible triangles +- [25%](after/passage-0-1-0-station-25.png) — passage/0-1/0; 135136 visible triangles +- [50%](after/passage-0-1-0-station-50.png) — passage/0-1/0; 316508 visible triangles +- [75%](after/passage-0-1-0-station-75.png) — passage/0-1/0; 257040 visible triangles +- [section-1/view-1](after/passage-0-1-0-openair-1-view-1.png) — passage/0-1/0 **OPEN AIR**; 278629 visible triangles +- [section-1/view-2](after/passage-0-1-0-openair-1-view-2.png) — passage/0-1/0 **OPEN AIR**; 287396 visible triangles +- [section-1/view-3](after/passage-0-1-0-openair-1-view-3.png) — passage/0-1/0 **OPEN AIR**; 311780 visible triangles +- [section-1/4m-outside](after/passage-0-1-0-openair-1-4m-outside.png) — passage/0-1/0; 278629 visible triangles +- [section-1/4m-interior-wall](after/passage-0-1-0-openair-1-4m-interior-wall.png) — passage/0-1/0; 311780 visible triangles +- [section-2/view-1](after/passage-0-1-0-openair-2-view-1.png) — passage/0-1/0 **OPEN AIR**; 278629 visible triangles +- [section-2/view-2](after/passage-0-1-0-openair-2-view-2.png) — passage/0-1/0 **OPEN AIR**; 311780 visible triangles +- [section-2/view-3](after/passage-0-1-0-openair-2-view-3.png) — passage/0-1/0 **OPEN AIR**; 311780 visible triangles +- [section-2/4m-outside](after/passage-0-1-0-openair-2-4m-outside.png) — passage/0-1/0; 278629 visible triangles +- [section-2/4m-interior-wall](after/passage-0-1-0-openair-2-4m-interior-wall.png) — passage/0-1/0; 350192 visible triangles +- [section-3/view-1](after/passage-0-1-0-openair-3-view-1.png) — passage/0-1/0 **OPEN AIR**; 210501 visible triangles +- [section-3/view-2](after/passage-0-1-0-openair-3-view-2.png) — passage/0-1/0 **OPEN AIR**; 189354 visible triangles +- [section-3/view-3](after/passage-0-1-0-openair-3-view-3.png) — passage/0-1/0 **OPEN AIR**; 189354 visible triangles +- [section-3/4m-outside](after/passage-0-1-0-openair-3-4m-outside.png) — passage/0-1/0; 156696 visible triangles +- [section-3/4m-interior-wall](after/passage-0-1-0-openair-3-4m-interior-wall.png) — passage/0-1/0; 156658 visible triangles +- [upper-mouth](after/passage-1-2-0-upper-mouth.png) — passage/1-2/0; 595932 visible triangles +- [lower-mouth](after/passage-1-2-0-lower-mouth.png) — passage/1-2/0; 546268 visible triangles +- [25%](after/passage-1-2-0-station-25.png) — passage/1-2/0; 655074 visible triangles +- [50%](after/passage-1-2-0-station-50.png) — passage/1-2/0; 604662 visible triangles +- [75%](after/passage-1-2-0-station-75.png) — passage/1-2/0; 612135 visible triangles +- [section-1/view-1](after/passage-1-2-0-openair-1-view-1.png) — passage/1-2/0 **OPEN AIR**; 623352 visible triangles +- [section-1/view-2](after/passage-1-2-0-openair-1-view-2.png) — passage/1-2/0 **OPEN AIR**; 576164 visible triangles; low_contrast_geometry_visible +- [section-1/view-3](after/passage-1-2-0-openair-1-view-3.png) — passage/1-2/0 **OPEN AIR**; 570605 visible triangles +- [section-1/4m-outside](after/passage-1-2-0-openair-1-4m-outside.png) — passage/1-2/0; 623352 visible triangles +- [section-1/4m-interior-wall](after/passage-1-2-0-openair-1-4m-interior-wall.png) — passage/1-2/0; 612135 visible triangles +- [section-2/view-1](after/passage-1-2-0-openair-2-view-1.png) — passage/1-2/0 **OPEN AIR**; 628316 visible triangles +- [section-2/view-2](after/passage-1-2-0-openair-2-view-2.png) — passage/1-2/0 **OPEN AIR**; 585440 visible triangles +- [section-2/view-3](after/passage-1-2-0-openair-2-view-3.png) — passage/1-2/0 **OPEN AIR**; 613722 visible triangles +- [section-2/4m-outside](after/passage-1-2-0-openair-2-4m-outside.png) — passage/1-2/0; 585802 visible triangles +- [section-2/4m-interior-wall](after/passage-1-2-0-openair-2-4m-interior-wall.png) — passage/1-2/0; 574472 visible triangles +- [upper-mouth](after/passage-2-3-0-upper-mouth.png) — passage/2-3/0; 59568 visible triangles +- [lower-mouth](after/passage-2-3-0-lower-mouth.png) — passage/2-3/0; 294004 visible triangles; low_contrast_geometry_visible +- [25%](after/passage-2-3-0-station-25.png) — passage/2-3/0; 55514 visible triangles; low_contrast_geometry_visible +- [50%](after/passage-2-3-0-station-50.png) — passage/2-3/0; 458230 visible triangles +- [75%](after/passage-2-3-0-station-75.png) — passage/2-3/0; 475838 visible triangles +- [section-1/view-1](after/passage-2-3-0-openair-1-view-1.png) — passage/2-3/0 **OPEN AIR**; 104612 visible triangles +- [section-1/view-2](after/passage-2-3-0-openair-1-view-2.png) — passage/2-3/0 **OPEN AIR**; 76426 visible triangles +- [section-1/view-3](after/passage-2-3-0-openair-1-view-3.png) — passage/2-3/0 **OPEN AIR**; 94962 visible triangles +- [section-1/4m-outside](after/passage-2-3-0-openair-1-4m-outside.png) — passage/2-3/0; 104612 visible triangles; low_contrast_geometry_visible +- [section-1/4m-interior-wall](after/passage-2-3-0-openair-1-4m-interior-wall.png) — passage/2-3/0; 94962 visible triangles; low_contrast_geometry_visible +- [section-2/view-1](after/passage-2-3-0-openair-2-view-1.png) — passage/2-3/0 **OPEN AIR**; 476214 visible triangles +- [section-2/view-2](after/passage-2-3-0-openair-2-view-2.png) — passage/2-3/0 **OPEN AIR**; 479366 visible triangles +- [section-2/view-3](after/passage-2-3-0-openair-2-view-3.png) — passage/2-3/0 **OPEN AIR**; 479366 visible triangles +- [section-2/4m-outside](after/passage-2-3-0-openair-2-4m-outside.png) — passage/2-3/0; 476214 visible triangles +- [section-2/4m-interior-wall](after/passage-2-3-0-openair-2-4m-interior-wall.png) — passage/2-3/0; 486990 visible triangles diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-lower-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-lower-mouth.png new file mode 100644 index 0000000..eccd3c0 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-lower-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-4m-interior-wall.png new file mode 100644 index 0000000..e10071a Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-4m-outside.png new file mode 100644 index 0000000..a25faeb Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-view-1.png new file mode 100644 index 0000000..b2f9837 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-view-2.png new file mode 100644 index 0000000..3b394f1 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-view-3.png new file mode 100644 index 0000000..7bc7c9f Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-1-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-4m-interior-wall.png new file mode 100644 index 0000000..e7ac719 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-4m-outside.png new file mode 100644 index 0000000..58e65cb Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-view-1.png new file mode 100644 index 0000000..87476c9 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-view-2.png new file mode 100644 index 0000000..c904473 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-view-3.png new file mode 100644 index 0000000..8e8a59f Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-2-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-4m-interior-wall.png new file mode 100644 index 0000000..b370fe5 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-4m-outside.png new file mode 100644 index 0000000..eea6716 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-view-1.png new file mode 100644 index 0000000..20f5ecd Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-view-2.png new file mode 100644 index 0000000..2dc7280 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-view-3.png new file mode 100644 index 0000000..6d222d2 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-3-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-4m-interior-wall.png new file mode 100644 index 0000000..0073250 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-4m-outside.png new file mode 100644 index 0000000..50f97d3 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-view-1.png new file mode 100644 index 0000000..f7c85d9 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-view-2.png new file mode 100644 index 0000000..1bf0938 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-view-3.png new file mode 100644 index 0000000..6a5f9d1 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-openair-4-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-station-25.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-station-25.png new file mode 100644 index 0000000..6d5b759 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-station-25.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-station-50.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-station-50.png new file mode 100644 index 0000000..44c7050 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-station-50.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-station-75.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-station-75.png new file mode 100644 index 0000000..72f1e02 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-station-75.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-upper-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-upper-mouth.png new file mode 100644 index 0000000..4a21f52 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-0-1-0-upper-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-lower-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-lower-mouth.png new file mode 100644 index 0000000..2ab98a0 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-lower-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-4m-interior-wall.png new file mode 100644 index 0000000..2e156af Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-4m-outside.png new file mode 100644 index 0000000..b4da33f Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-view-1.png new file mode 100644 index 0000000..8d8bbd7 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-view-2.png new file mode 100644 index 0000000..9dafe3d Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-view-3.png new file mode 100644 index 0000000..43909f5 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-1-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-4m-interior-wall.png new file mode 100644 index 0000000..9d1043a Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-4m-outside.png new file mode 100644 index 0000000..e89577e Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-view-1.png new file mode 100644 index 0000000..8fc4c66 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-view-2.png new file mode 100644 index 0000000..226da7d Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-view-3.png new file mode 100644 index 0000000..f171a9b Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-openair-2-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-station-25.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-station-25.png new file mode 100644 index 0000000..aeeed93 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-station-25.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-station-50.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-station-50.png new file mode 100644 index 0000000..6422188 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-station-50.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-station-75.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-station-75.png new file mode 100644 index 0000000..5b2f35c Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-station-75.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-upper-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-upper-mouth.png new file mode 100644 index 0000000..a0c4f1a Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-1-2-0-upper-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-lower-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-lower-mouth.png new file mode 100644 index 0000000..70a3431 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-lower-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-4m-interior-wall.png new file mode 100644 index 0000000..0829ac3 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-4m-outside.png new file mode 100644 index 0000000..23440bc Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-view-1.png new file mode 100644 index 0000000..96e6e48 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-view-2.png new file mode 100644 index 0000000..5b6337f Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-view-3.png new file mode 100644 index 0000000..1f19638 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-1-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-4m-interior-wall.png new file mode 100644 index 0000000..e54a164 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-4m-outside.png new file mode 100644 index 0000000..69e235d Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-view-1.png new file mode 100644 index 0000000..b06dba2 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-view-2.png new file mode 100644 index 0000000..6ddebea Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-view-3.png new file mode 100644 index 0000000..c76a392 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-openair-2-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-station-25.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-station-25.png new file mode 100644 index 0000000..794aeb3 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-station-25.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-station-50.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-station-50.png new file mode 100644 index 0000000..897b55b Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-station-50.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-station-75.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-station-75.png new file mode 100644 index 0000000..bbf4e47 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-station-75.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-upper-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-upper-mouth.png new file mode 100644 index 0000000..50b6f6e Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/after/passage-2-3-0-upper-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-lower-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-lower-mouth.png new file mode 100644 index 0000000..e92cfe1 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-lower-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-4m-interior-wall.png new file mode 100644 index 0000000..aac4121 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-4m-outside.png new file mode 100644 index 0000000..286c351 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-view-1.png new file mode 100644 index 0000000..38ff704 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-view-2.png new file mode 100644 index 0000000..bcc62fb Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-view-3.png new file mode 100644 index 0000000..0b85bb1 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-1-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-4m-interior-wall.png new file mode 100644 index 0000000..efe106d Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-4m-outside.png new file mode 100644 index 0000000..82d39f5 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-view-1.png new file mode 100644 index 0000000..868c4f4 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-view-2.png new file mode 100644 index 0000000..1111c70 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-view-3.png new file mode 100644 index 0000000..42b43fc Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-2-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-4m-interior-wall.png new file mode 100644 index 0000000..0e3b675 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-4m-outside.png new file mode 100644 index 0000000..cd380a8 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-view-1.png new file mode 100644 index 0000000..f498353 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-view-2.png new file mode 100644 index 0000000..a077c37 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-view-3.png new file mode 100644 index 0000000..bef0390 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-3-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-4m-interior-wall.png new file mode 100644 index 0000000..eea76a0 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-4m-outside.png new file mode 100644 index 0000000..d556c2c Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-view-1.png new file mode 100644 index 0000000..43049af Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-view-2.png new file mode 100644 index 0000000..934a77f Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-view-3.png new file mode 100644 index 0000000..31322cf Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-openair-4-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-station-25.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-station-25.png new file mode 100644 index 0000000..697ccbd Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-station-25.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-station-50.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-station-50.png new file mode 100644 index 0000000..1a96e59 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-station-50.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-station-75.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-station-75.png new file mode 100644 index 0000000..0a47b71 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-station-75.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-upper-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-upper-mouth.png new file mode 100644 index 0000000..92eebd9 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-0-1-0-upper-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-lower-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-lower-mouth.png new file mode 100644 index 0000000..b42b0db Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-lower-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-4m-interior-wall.png new file mode 100644 index 0000000..44f94a1 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-4m-outside.png new file mode 100644 index 0000000..b3077cd Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-view-1.png new file mode 100644 index 0000000..f81c7cf Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-view-2.png new file mode 100644 index 0000000..8c0052e Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-view-3.png new file mode 100644 index 0000000..bd130d0 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-openair-1-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-station-25.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-station-25.png new file mode 100644 index 0000000..745cd66 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-station-25.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-station-50.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-station-50.png new file mode 100644 index 0000000..d32a16b Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-station-50.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-station-75.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-station-75.png new file mode 100644 index 0000000..bb01e66 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-station-75.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-upper-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-upper-mouth.png new file mode 100644 index 0000000..0b0430c Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-1-2-0-upper-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-lower-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-lower-mouth.png new file mode 100644 index 0000000..6a11c52 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-lower-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-4m-interior-wall.png new file mode 100644 index 0000000..650adc1 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-4m-outside.png new file mode 100644 index 0000000..78008c6 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-view-1.png new file mode 100644 index 0000000..e958856 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-view-2.png new file mode 100644 index 0000000..e201769 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-view-3.png new file mode 100644 index 0000000..006b05a Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-1-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-4m-interior-wall.png new file mode 100644 index 0000000..e018324 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-4m-outside.png new file mode 100644 index 0000000..805438d Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-view-1.png new file mode 100644 index 0000000..5a069a4 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-view-2.png new file mode 100644 index 0000000..054aba4 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-view-3.png new file mode 100644 index 0000000..0fc9685 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-2-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-4m-interior-wall.png new file mode 100644 index 0000000..947f4f1 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-4m-outside.png new file mode 100644 index 0000000..0911f75 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-view-1.png new file mode 100644 index 0000000..ba11b0c Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-view-2.png new file mode 100644 index 0000000..fe7f56c Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-view-3.png new file mode 100644 index 0000000..0f4416a Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-3-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-4m-interior-wall.png new file mode 100644 index 0000000..4da66c6 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-4m-outside.png new file mode 100644 index 0000000..25cae09 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-view-1.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-view-1.png new file mode 100644 index 0000000..0f6a894 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-view-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-view-2.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-view-2.png new file mode 100644 index 0000000..4288fe7 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-view-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-view-3.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-view-3.png new file mode 100644 index 0000000..2e69508 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-openair-4-view-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-station-25.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-station-25.png new file mode 100644 index 0000000..794aeb3 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-station-25.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-station-50.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-station-50.png new file mode 100644 index 0000000..333947a Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-station-50.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-station-75.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-station-75.png new file mode 100644 index 0000000..4d97c05 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-station-75.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-upper-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-upper-mouth.png new file mode 100644 index 0000000..5f8dc22 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux112/captures/before/passage-2-3-0-upper-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux112/captures/capture-index.json b/Standalone/Research/WorldAssemblerM3/Linux112/captures/capture-index.json new file mode 100644 index 0000000..00c6ed0 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux112/captures/capture-index.json @@ -0,0 +1,6756 @@ +{ + "open_air_sections_by_variant": { + "before": [ + { + "passage": "passage/0-1/0", + "section": 1, + "start_m": 7.226, + "end_m": 10.217, + "samples": 13, + "midpoint": [ + 6.375, + 7.507, + -373.204 + ], + "radius_m": 1.958 + }, + { + "passage": "passage/0-1/0", + "section": 2, + "start_m": 13.456, + "end_m": 17.443, + "samples": 17, + "midpoint": [ + 5.121, + 0.955, + -374.039 + ], + "radius_m": 2.31 + }, + { + "passage": "passage/0-1/0", + "section": 3, + "start_m": 23.174, + "end_m": 24.918, + "samples": 8, + "midpoint": [ + 3.519, + -7.417, + -375.105 + ], + "radius_m": 2.761 + }, + { + "passage": "passage/0-1/0", + "section": 4, + "start_m": 1036.913, + "end_m": 1489.321, + "samples": 1838, + "midpoint": [ + -24.253, + -7.219, + -598.622 + ], + "radius_m": 3.5 + }, + { + "passage": "passage/1-2/0", + "section": 1, + "start_m": 101.82, + "end_m": 104.499, + "samples": 12, + "midpoint": [ + 9.136, + -11.613, + -749.434 + ], + "radius_m": 3.173 + }, + { + "passage": "passage/2-3/0", + "section": 1, + "start_m": 7.677, + "end_m": 34.747, + "samples": 108, + "midpoint": [ + -2.846, + -13.149, + -814.246 + ], + "radius_m": 3.0 + }, + { + "passage": "passage/2-3/0", + "section": 2, + "start_m": 368.909, + "end_m": 376.66, + "samples": 32, + "midpoint": [ + -9.545, + 9.558, + -877.248 + ], + "radius_m": 3.0 + }, + { + "passage": "passage/2-3/0", + "section": 3, + "start_m": 393.828, + "end_m": 396.51, + "samples": 7, + "midpoint": [ + -11.172, + -10.684, + -881.259 + ], + "radius_m": 3.0 + }, + { + "passage": "passage/2-3/0", + "section": 4, + "start_m": 444.932, + "end_m": 447.654, + "samples": 11, + "midpoint": [ + 9.72, + 10.251, + -890.42 + ], + "radius_m": 3.0 + } + ], + "after": [ + { + "passage": "passage/0-1/0", + "section": 1, + "start_m": 6.905, + "end_m": 9.618, + "samples": 12, + "midpoint": [ + 7.282, + 7.839, + -373.185 + ], + "radius_m": 1.93 + }, + { + "passage": "passage/0-1/0", + "section": 2, + "start_m": 13.078, + "end_m": 15.794, + "samples": 12, + "midpoint": [ + 6.611, + 1.753, + -374.166 + ], + "radius_m": 2.253 + }, + { + "passage": "passage/0-1/0", + "section": 3, + "start_m": 1041.174, + "end_m": 1489.448, + "samples": 1979, + "midpoint": [ + -22.039, + -12.355, + -599.25 + ], + "radius_m": 3.5 + }, + { + "passage": "passage/1-2/0", + "section": 1, + "start_m": 81.367, + "end_m": 85.596, + "samples": 19, + "midpoint": [ + -9.52, + -9.729, + -745.879 + ], + "radius_m": 3.0 + }, + { + "passage": "passage/1-2/0", + "section": 2, + "start_m": 104.041, + "end_m": 104.778, + "samples": 4, + "midpoint": [ + 9.488, + -11.155, + -749.755 + ], + "radius_m": 3.139 + }, + { + "passage": "passage/2-3/0", + "section": 1, + "start_m": 7.733, + "end_m": 25.281, + "samples": 74, + "midpoint": [ + -7.267, + -11.478, + -813.609 + ], + "radius_m": 3.0 + }, + { + "passage": "passage/2-3/0", + "section": 2, + "start_m": 372.675, + "end_m": 377.341, + "samples": 21, + "midpoint": [ + -9.548, + 9.557, + -877.478 + ], + "radius_m": 3.0 + } + ] + }, + "captures": [ + { + "name": "passage-0-1-0-upper-mouth", + "passage": "passage/0-1/0", + "kind": "mouth", + "station": "upper-mouth", + "camera": [ + 8.839199674686244, + 20.385640196824248, + -371.842578125 + ], + "target": [ + 7.627022366806115, + 14.050826579189224, + -371.942578125 + ], + "yaw": -169.1673035961807, + "pitch": -0.8882703208739064, + "focus": [ + 8.0, + 16.0, + -372.122578125 + ], + "center_z": -372.122578125, + "variant": "before", + "capture": "captures/before/passage-0-1-0-upper-mouth.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-upper-mouth.vfmesh", + "drawn_triangles": 253282, + "source_triangles": 310752, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 8.839199674686244, + 20.385640196824248, + -371.842578125 + ], + "target_actual_m": [ + 7.627022366806115, + 14.050826579189224, + -371.942578125 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-upper-mouth-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-upper-mouth-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-upper-mouth-quality.log" + ] + }, + { + "name": "passage-0-1-0-lower-mouth", + "passage": "passage/0-1/0", + "kind": "mouth", + "station": "lower-mouth", + "camera": [ + 32.29870756948553, + 9.932859678359986, + -735.514490514727 + ], + "target": [ + 24.47653648208193, + 1.781610133503092, + -736.6798828125 + ], + "yaw": -136.18021933793756, + "pitch": -5.889606445716861, + "focus": [ + 25.836914062499947, + 3.199218749999943, + -734.8598828125 + ], + "center_z": -734.8598828125, + "variant": "before", + "capture": "captures/before/passage-0-1-0-lower-mouth.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-lower-mouth.vfmesh", + "drawn_triangles": 559326, + "source_triangles": 611506, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 32.29870756948553, + 9.932859678359986, + -735.514490514727 + ], + "target_actual_m": [ + 24.47653648208193, + 1.781610133503092, + -736.6798828125 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-lower-mouth-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-lower-mouth-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-lower-mouth-quality.log" + ] + }, + { + "name": "passage-0-1-0-station-25", + "passage": "passage/0-1/0", + "kind": "station", + "station": "25%", + "camera": [ + -14.832678263995309, + -18.72062618817443, + -462.7942446741164 + ], + "target": [ + -21.89083852694916, + -7.989572734179358, + -465.1289462328135 + ], + "yaw": -33.33421057217368, + "pitch": -10.302233434343137, + "focus": [ + -14.365775643756486, + -18.133683309169903, + -461.1242446741164 + ], + "center_z": -461.1242446741164, + "route_distance_m": 503.59931612822896, + "route_length_m": 2014.3972645129159, + "requested_route_distance_m": 503.59931612822896, + "variant": "before", + "capture": "captures/before/passage-0-1-0-station-25.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-station-25.vfmesh", + "drawn_triangles": 145630, + "source_triangles": 194558, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 503.59931612822896, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -14.832678263995309, + -18.72062618817443, + -462.7942446741164 + ], + "target_actual_m": [ + -21.89083852694916, + -7.989572734179358, + -465.1289462328135 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-station-25-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-station-25-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-station-25-quality.log" + ] + }, + { + "name": "passage-0-1-0-station-50", + "passage": "passage/0-1/0", + "kind": "station", + "station": "50%", + "camera": [ + -5.478551888892594, + 21.511593715955158, + -553.9658220811451 + ], + "target": [ + 7.751504608756267, + 21.398972718233775, + -556.3002867114685 + ], + "yaw": 90.48771915686082, + "pitch": -10.006569463318558, + "focus": [ + -5.390306191921176, + 20.7668033447996, + -552.2958220811452 + ], + "center_z": -552.2958220811452, + "route_distance_m": 1007.1986322564579, + "route_length_m": 2014.3972645129159, + "requested_route_distance_m": 1007.1986322564579, + "variant": "before", + "capture": "captures/before/passage-0-1-0-station-50.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-station-50.vfmesh", + "drawn_triangles": 430386, + "source_triangles": 541436, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1007.1986322564579, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -5.478551888892594, + 21.511593715955158, + -553.9658220811451 + ], + "target_actual_m": [ + 7.751504608756267, + 21.398972718233775, + -556.3002867114685 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-station-50-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-station-50-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-station-50-quality.log" + ] + }, + { + "name": "passage-0-1-0-station-75", + "passage": "passage/0-1/0", + "kind": "station", + "station": "75%", + "camera": [ + 16.41045488666863, + -13.591590559867178, + -645.1369534883806 + ], + "target": [ + 6.2905981482465405, + -21.544778689774127, + -647.4714776908803 + ], + "yaw": -128.16377958476315, + "pitch": -10.28040282125882, + "focus": [ + 15.809745384875612, + -13.142538119215107, + -643.4669534883807 + ], + "center_z": -643.4669534883807, + "route_distance_m": 1510.7979483846868, + "route_length_m": 2014.3972645129159, + "requested_route_distance_m": 1510.7979483846868, + "variant": "before", + "capture": "captures/before/passage-0-1-0-station-75.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-station-75.vfmesh", + "drawn_triangles": 294374, + "source_triangles": 369990, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1510.7979483846868, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 16.41045488666863, + -13.591590559867178, + -645.1369534883806 + ], + "target_actual_m": [ + 6.2905981482465405, + -21.544778689774127, + -647.4714776908803 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-station-75-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-station-75-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-station-75-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-1-view-1", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-1/view-1", + "camera": [ + 13.209009551818514, + 6.199300705187415, + -372.004 + ], + "target": [ + 6.375, + 7.507, + -373.104 + ], + "yaw": -79.16730359618066, + "pitch": -8.983620476603383, + "focus": [ + 6.375, + 7.507, + -373.204 + ], + "center_z": -373.204, + "open_air_section": 1, + "route_distance_m": 8.7215, + "requested_route_distance_m": 8.7215, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-1-view-1.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-view-1.vfmesh", + "drawn_triangles": 289074, + "source_triangles": 360606, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 8.7215, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 13.209009551818514, + 6.199300705187415, + -372.004 + ], + "target_actual_m": [ + 6.375, + 7.507, + -373.104 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-view-1-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-view-1-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-view-1-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-1-view-2", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-1/view-2", + "camera": [ + 1.0142606878664209, + 8.532786540828843, + -369.204 + ], + "target": [ + 6.002022366806118, + 5.557826579189251, + -373.4522149486675 + ], + "yaw": 120.81404399724752, + "pitch": -36.18521056311671, + "focus": [ + 6.375, + 7.507, + -373.204 + ], + "center_z": -373.204, + "open_air_section": 1, + "route_distance_m": 8.7215, + "requested_route_distance_m": 8.7215, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-1-view-2.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-view-2.vfmesh", + "drawn_triangles": 298057, + "source_triangles": 371201, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 8.7215, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 1.0142606878664209, + 8.532786540828843, + -369.204 + ], + "target_actual_m": [ + 6.002022366806118, + 5.557826579189251, + -373.4522149486675 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-view-2-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-view-2-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-view-2-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-1-view-3", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-1/view-3", + "camera": [ + 6.375, + 7.507, + -373.682 + ], + "target": [ + 5.069578283821414, + 0.6848930271623788, + -374.5507523203363 + ], + "yaw": -169.16730359618066, + "pitch": -7.1292164823138044, + "focus": [ + 6.375, + 7.507, + -373.204 + ], + "center_z": -373.204, + "open_air_section": 1, + "route_distance_m": 8.7215, + "requested_route_distance_m": 8.7215, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-1-view-3.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-view-3.vfmesh", + "drawn_triangles": 322309, + "source_triangles": 406051, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 8.7215, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 6.375, + 7.507, + -373.682 + ], + "target_actual_m": [ + 5.069578283821414, + 0.6848930271623788, + -374.5507523203363 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-view-3-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-view-3-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-view-3-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-1-4m-outside", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-1/4m-outside", + "camera": [ + 12.226829392028558, + 6.387242541176576, + -374.432 + ], + "target": [ + 8.298108752868734, + 7.1390098851332215, + -374.432 + ], + "yaw": -79.16730359618066, + "pitch": 0.0, + "focus": [ + 6.375, + 7.507, + -373.204 + ], + "center_z": -373.204, + "open_air_section": 1, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.9821801597899559, + -0.18794183598916137, + 0.0 + ], + "camera_target_distance_m": 4.000000000000001, + "route_distance_m": 8.7215, + "requested_route_distance_m": 8.7215, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-1-4m-outside.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-4m-outside.vfmesh", + "drawn_triangles": 289074, + "source_triangles": 360606, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 8.7215, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.999999999999993, + "closeup_target_surface_distance_m": 1.099219737390483, + "closeup_predicted_target_offset_m": 1.099219737390483, + "closeup_wall_normal_alignment": 0.6786316477708347, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 11.011816777527464, + 7.963487706581901, + -376.64806417591785 + ], + "target_actual_m": [ + 8.255026817321777, + 8.0, + -373.75 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-4m-outside-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-4m-outside-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-4m-outside-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-1-4m-interior-wall", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-1/4m-interior-wall", + "camera": [ + 6.16842641619789, + 3.6337628862872573, + -374.9126661812345 + ], + "target": [ + 7.872874656921727, + 7.220379149133182, + -374.432 + ], + "yaw": 25.418216346738422, + "pitch": 6.901714476028475, + "focus": [ + 6.375, + 7.507, + -373.204 + ], + "center_z": -373.204, + "open_air_section": 1, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.9821801597899559, + 0.18794183598916137, + -0.0 + ], + "camera_target_distance_m": 3.9999999999999987, + "route_distance_m": 8.7215, + "requested_route_distance_m": 8.7215, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-1-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-4m-interior-wall.vfmesh", + "drawn_triangles": 322309, + "source_triangles": 406051, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 8.7215, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.9999999999999925, + "closeup_target_surface_distance_m": 1.104071077786548, + "closeup_predicted_target_offset_m": 1.104071077786548, + "closeup_wall_normal_alignment": 0.6786316477708347, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 5.498236857116091, + 8.036512293418099, + -370.85193582408215 + ], + "target_actual_m": [ + 8.255026817321777, + 8.0, + -373.75 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-1-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-2-view-1", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-2/view-1", + "camera": [ + 12.300736968064577, + -0.41885482108077465, + -372.839 + ], + "target": [ + 5.121, + 0.955, + -373.93899999999996 + ], + "yaw": -79.16730359618062, + "pitch": -8.557593063277757, + "focus": [ + 5.121, + 0.955, + -374.039 + ], + "center_z": -374.039, + "open_air_section": 2, + "route_distance_m": 15.4495, + "requested_route_distance_m": 15.4495, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-2-view-1.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-view-1.vfmesh", + "drawn_triangles": 283642, + "source_triangles": 349878, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 15.4495, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 12.300736968064577, + -0.41885482108077465, + -372.839 + ], + "target_actual_m": [ + 5.121, + 0.955, + -373.93899999999996 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-view-1-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-view-1-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-view-1-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-2-view-2", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-2/view-2", + "camera": [ + -0.5854667283796422, + 2.0469420670970315, + -370.039 + ], + "target": [ + 4.748022366806118, + -0.9941734208107486, + -374.2872149486675 + ], + "yaw": 119.69146427854264, + "pitch": -34.6808549169467, + "focus": [ + 5.121, + 0.955, + -374.039 + ], + "center_z": -374.039, + "open_air_section": 2, + "route_distance_m": 15.4495, + "requested_route_distance_m": 15.4495, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-2-view-2.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-view-2.vfmesh", + "drawn_triangles": 316771, + "source_triangles": 399589, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 15.4495, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -0.5854667283796422, + 2.0469420670970315, + -370.039 + ], + "target_actual_m": [ + 4.748022366806118, + -0.9941734208107486, + -374.2872149486675 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-view-2-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-view-2-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-view-2-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-2-view-3", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-2/view-3", + "camera": [ + 5.121, + 0.955, + -374.86899999999997 + ], + "target": [ + 3.8155782838214094, + -5.86710697283762, + -375.73775232033626 + ], + "yaw": -169.1673035961806, + "pitch": -7.1292164823138044, + "focus": [ + 5.121, + 0.955, + -374.039 + ], + "center_z": -374.039, + "open_air_section": 2, + "route_distance_m": 15.4495, + "requested_route_distance_m": 15.4495, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-2-view-3.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-view-3.vfmesh", + "drawn_triangles": 322309, + "source_triangles": 406051, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 15.4495, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 5.121, + 0.955, + -374.86899999999997 + ], + "target_actual_m": [ + 3.8155782838214094, + -5.86710697283762, + -375.73775232033626 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-view-3-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-view-3-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-view-3-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-2-4m-outside", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-2/4m-outside", + "camera": [ + 11.31855680827462, + -0.2309129850916125, + -375.61899999999997 + ], + "target": [ + 7.389836169114798, + 0.5208543588650356, + -375.61899999999997 + ], + "yaw": -79.16730359618062, + "pitch": 0.0, + "focus": [ + 5.121, + 0.955, + -374.039 + ], + "center_z": -374.039, + "open_air_section": 2, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.9821801597899557, + -0.18794183598916203, + 0.0 + ], + "camera_target_distance_m": 3.9999999999999996, + "route_distance_m": 15.4495, + "requested_route_distance_m": 15.4495, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-2-4m-outside.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-4m-outside.vfmesh", + "drawn_triangles": 283642, + "source_triangles": 349878, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 15.4495, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.9999999999999885, + "closeup_target_surface_distance_m": 1.3085037734738154, + "closeup_predicted_target_offset_m": 1.3085037734738154, + "closeup_wall_normal_alignment": 0.4725205931402216, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 8.58190299568095, + 2.121719373896101, + -378.46326758049844 + ], + "target_actual_m": [ + 6.2515339851379395, + 0.0, + -376.0 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-4m-outside-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-4m-outside-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-4m-outside-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-2-4m-interior-wall", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-2/4m-interior-wall", + "camera": [ + 5.071663760588935, + -2.9483247456979305, + -376.09966618123445 + ], + "target": [ + 6.776112001312775, + 0.6382915171479924, + -375.61899999999997 + ], + "yaw": 25.418216346738465, + "pitch": 6.901714476028475, + "focus": [ + 5.121, + 0.955, + -374.039 + ], + "center_z": -374.039, + "open_air_section": 2, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.9821801597899557, + 0.18794183598916203, + -0.0 + ], + "camera_target_distance_m": 3.9999999999999987, + "route_distance_m": 15.4495, + "requested_route_distance_m": 15.4495, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-2-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-4m-interior-wall.vfmesh", + "drawn_triangles": 363071, + "source_triangles": 461781, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 15.4495, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.99999999999999, + "closeup_target_surface_distance_m": 0.8749770375822671, + "closeup_predicted_target_offset_m": 0.8749770375822671, + "closeup_wall_normal_alignment": 0.44992927562510365, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 3.749137959759578, + -1.6905712289969719, + -373.5237186849657 + ], + "target_actual_m": [ + 6.000677108764648, + 0.5, + -376.0 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-2-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-3-view-1", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-3/view-1", + "camera": [ + 11.141700220129849, + -8.875616589111877, + -373.90500000000003 + ], + "target": [ + 3.519, + -7.417, + -375.005 + ], + "yaw": -79.1673035961807, + "pitch": -8.067045700553148, + "focus": [ + 3.519, + -7.417, + -375.105 + ], + "center_z": -375.105, + "open_air_section": 3, + "route_distance_m": 24.046, + "requested_route_distance_m": 24.046, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-3-view-1.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-view-1.vfmesh", + "drawn_triangles": 262299, + "source_triangles": 321447, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 24.046, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 11.141700220129849, + -8.875616589111877, + -373.90500000000003 + ], + "target_actual_m": [ + 3.519, + -7.417, + -375.005 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-view-1-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-view-1-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-view-1-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-3-view-2", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-3/view-2", + "camera": [ + -2.630429980444914, + -6.2402961648718644, + -371.105 + ], + "target": [ + 3.1460223668061196, + -9.36617342081075, + -375.3532149486675 + ], + "yaw": 118.41965303912751, + "pitch": -32.89502331212217, + "focus": [ + 3.519, + -7.417, + -375.105 + ], + "center_z": -375.105, + "open_air_section": 3, + "route_distance_m": 24.046, + "requested_route_distance_m": 24.046, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-3-view-2.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-view-2.vfmesh", + "drawn_triangles": 310919, + "source_triangles": 388345, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 24.046, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -2.630429980444914, + -6.2402961648718644, + -371.105 + ], + "target_actual_m": [ + 3.1460223668061196, + -9.36617342081075, + -375.3532149486675 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-view-2-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-view-2-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-view-2-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-3-view-3", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-3/view-3", + "camera": [ + 3.519, + -7.417, + -376.386 + ], + "target": [ + 2.2135782838214184, + -14.239106972837622, + -377.2547523203363 + ], + "yaw": -169.16730359618072, + "pitch": -7.1292164823138044, + "focus": [ + 3.519, + -7.417, + -375.105 + ], + "center_z": -375.105, + "open_air_section": 3, + "route_distance_m": 24.046, + "requested_route_distance_m": 24.046, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-3-view-3.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-view-3.vfmesh", + "drawn_triangles": 363071, + "source_triangles": 461781, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 24.046, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 3.519, + -7.417, + -376.386 + ], + "target_actual_m": [ + 2.2135782838214184, + -14.239106972837622, + -377.2547523203363 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-view-3-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-view-3-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-view-3-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-3-4m-outside", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-3/4m-outside", + "camera": [ + 10.159520060339894, + -8.687674753122714, + -377.136 + ], + "target": [ + 6.230799421180069, + -7.935907409166072, + -377.136 + ], + "yaw": -79.16730359618072, + "pitch": 0.0, + "focus": [ + 3.519, + -7.417, + -375.105 + ], + "center_z": -375.105, + "open_air_section": 3, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.982180159789956, + -0.18794183598916067, + 0.0 + ], + "camera_target_distance_m": 4.000000000000001, + "route_distance_m": 24.046, + "requested_route_distance_m": 24.046, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-3-4m-outside.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-4m-outside.vfmesh", + "drawn_triangles": 298863, + "source_triangles": 375623, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 24.046, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.999999999999986, + "closeup_target_surface_distance_m": 0.7431252768660993, + "closeup_predicted_target_offset_m": 0.7431252768660993, + "closeup_wall_normal_alignment": 0.6879553779351849, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 8.301559926890484, + -7.937797889531149, + -379.85526137236525 + ], + "target_actual_m": [ + 5.500224917936388, + -7.935638471332045, + -377.0 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-4m-outside-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-4m-outside-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-4m-outside-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-3-4m-interior-wall", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-3/4m-interior-wall", + "camera": [ + 3.6515595232019518, + -11.355130807746109, + -377.6166661812345 + ], + "target": [ + 5.356007763925787, + -7.7685145449001825, + -377.136 + ], + "yaw": 25.418216346738376, + "pitch": 6.901714476028474, + "focus": [ + 3.519, + -7.417, + -375.105 + ], + "center_z": -375.105, + "open_air_section": 3, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.982180159789956, + 0.18794183598916067, + -0.0 + ], + "camera_target_distance_m": 3.9999999999999996, + "route_distance_m": 24.046, + "requested_route_distance_m": 24.046, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-3-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-4m-interior-wall.vfmesh", + "drawn_triangles": 340799, + "source_triangles": 430763, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 24.046, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.9999999999999742, + "closeup_target_surface_distance_m": 0.12589120059539705, + "closeup_predicted_target_offset_m": 0.12589120059539705, + "closeup_wall_normal_alignment": 0.27053428417287734, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 4.062119454567632, + -8.45955209298347, + -373.30404532102955 + ], + "target_actual_m": [ + 5.282520932591845, + -7.839589106089317, + -377.06253785492095 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-3-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-4-view-1", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-4/view-1", + "camera": [ + -32.482581468460985, + -9.34596705521348, + -597.4219999999999 + ], + "target": [ + -24.253, + -7.219, + -598.5219999999999 + ], + "yaw": 75.50879325593182, + "pitch": -7.373766361330367, + "focus": [ + -24.253, + -7.219, + -598.622 + ], + "center_z": -598.622, + "open_air_section": 4, + "route_distance_m": 1263.117, + "requested_route_distance_m": 1263.117, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-4-view-1.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-view-1.vfmesh", + "drawn_triangles": 378007, + "source_triangles": 458499, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1263.117, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -32.482581468460985, + -9.34596705521348, + -597.4219999999999 + ], + "target_actual_m": [ + -24.253, + -7.219, + -598.5219999999999 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-view-1-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-view-1-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-view-1-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-4-view-2", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-4/view-2", + "camera": [ + -17.4756976142086, + -5.467380072177135, + -594.622 + ], + "target": [ + -24.74519610426594, + -5.314613221376807, + -598.9840138013261 + ], + "yaw": -88.79611947547781, + "pitch": -30.960000123282537, + "focus": [ + -24.253, + -7.219, + -598.622 + ], + "center_z": -598.622, + "open_air_section": 4, + "route_distance_m": 1263.117, + "requested_route_distance_m": 1263.117, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-4-view-2.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-view-2.vfmesh", + "drawn_triangles": 471132, + "source_triangles": 576768, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1263.117, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -17.4756976142086, + -5.467380072177135, + -594.622 + ], + "target_actual_m": [ + -24.74519610426594, + -5.314613221376807, + -598.9840138013261 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-view-2-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-view-2-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-view-2-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-4-view-3", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-4/view-3", + "camera": [ + -24.253, + -7.219, + -600.6419999999999 + ], + "target": [ + -25.975686364930784, + -0.5536462748188242, + -601.9090483046415 + ], + "yaw": -14.491206744068183, + "pitch": -10.428414406509091, + "focus": [ + -24.253, + -7.219, + -598.622 + ], + "center_z": -598.622, + "open_air_section": 4, + "route_distance_m": 1263.117, + "requested_route_distance_m": 1263.117, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-4-view-3.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-view-3.vfmesh", + "drawn_triangles": 382187, + "source_triangles": 466847, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1263.117, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -24.253, + -7.219, + -600.6419999999999 + ], + "target_actual_m": [ + -25.975686364930784, + -0.5536462748188242, + -601.9090483046415 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-view-3-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-view-3-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-view-3-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-4-4m-outside", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-4/4m-outside", + "camera": [ + -31.51439541334793, + -9.095735636953071, + -601.3919999999999 + ], + "target": [ + -27.6416511928957, + -8.094809963911434, + -601.3919999999999 + ], + "yaw": 75.50879325593182, + "pitch": 0.0, + "focus": [ + -24.253, + -7.219, + -598.622 + ], + "center_z": -598.622, + "open_air_section": 4, + "closeup_side": "outside", + "closeup_preferred_normal": [ + -0.9681860551130573, + -0.25023141826040934, + 0.0 + ], + "camera_target_distance_m": 4.0, + "route_distance_m": 1263.117, + "requested_route_distance_m": 1263.117, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-4-4m-outside.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-4m-outside.vfmesh", + "drawn_triangles": 309174, + "source_triangles": 380146, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1263.117, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000027, + "closeup_target_surface_distance_m": 0.2167936962313581, + "closeup_predicted_target_offset_m": 0.2167936962313581, + "closeup_wall_normal_alignment": 0.7087101938626713, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -29.84592210087621, + -10.26659976537498, + -603.5729649494914 + ], + "target_actual_m": [ + -27.50374180447916, + -8.0, + -601.2541900654693 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-4m-outside-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-4m-outside-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-4m-outside-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-4-4m-interior-wall", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-4/4m-interior-wall", + "camera": [ + -26.309300153834595, + -3.816288494479615, + -602.0930367118167 + ], + "target": [ + -26.324352551502578, + -7.754349051912634, + -601.3919999999999 + ], + "yaw": -179.7810001534144, + "pitch": 10.09374101112515, + "focus": [ + -24.253, + -7.219, + -598.622 + ], + "center_z": -598.622, + "open_air_section": 4, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + 0.9681860551130573, + 0.25023141826040934, + -0.0 + ], + "camera_target_distance_m": 4.000000000000007, + "route_distance_m": 1263.117, + "requested_route_distance_m": 1263.117, + "route_length_m": 2014.3972645129159, + "variant": "before", + "capture": "captures/before/passage-0-1-0-openair-4-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-4m-interior-wall.vfmesh", + "drawn_triangles": 382187, + "source_triangles": 466847, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1263.117, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000032, + "closeup_target_surface_distance_m": 0.051112078454061474, + "closeup_predicted_target_offset_m": 0.051112078454061474, + "closeup_wall_normal_alignment": 0.6123283223290849, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -24.141782780412917, + -6.539714983582917, + -598.3334145921336 + ], + "target_actual_m": [ + -26.353346402157452, + -7.771008131701157, + -601.4306558695245 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/before/passage-0-1-0-openair-4-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-1-2-0-upper-mouth", + "passage": "passage/1-2/0", + "kind": "mouth", + "station": "upper-mouth", + "camera": [ + 23.155674552687962, + -16.14908662400146, + -731.7810546875 + ], + "target": [ + 17.392833879360907, + -13.33402139627713, + -731.8810546875 + ], + "yaw": -63.965152623598414, + "pitch": -0.8932686436727578, + "focus": [ + 19.166015625, + -14.2001953125, + -730.5610546875 + ], + "center_z": -730.5610546875, + "variant": "before", + "capture": "captures/before/passage-1-2-0-upper-mouth.png", + "scene": "Saved/Linux/l112/captures/before/passage-1-2-0-upper-mouth.vfmesh", + "drawn_triangles": 570417, + "source_triangles": 630011, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 23.155674552687962, + -16.14908662400146, + -731.7810546875 + ], + "target_actual_m": [ + 17.392833879360907, + -13.33402139627713, + -731.8810546875 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-1-2-0-upper-mouth-mesh.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-upper-mouth-render.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-upper-mouth-quality.log" + ] + }, + { + "name": "passage-1-2-0-lower-mouth", + "passage": "passage/1-2/0", + "kind": "mouth", + "station": "lower-mouth", + "camera": [ + 27.669370041560203, + -17.931687050798093, + -752.0090260818968 + ], + "target": [ + 17.37583574782943, + -13.414618104437244, + -753.05390625 + ], + "yaw": -66.30689197709175, + "pitch": -5.3105178623917535, + "focus": [ + 19.166015625, + -14.2001953125, + -751.73390625 + ], + "center_z": -751.73390625, + "variant": "before", + "capture": "captures/before/passage-1-2-0-lower-mouth.png", + "scene": "Saved/Linux/l112/captures/before/passage-1-2-0-lower-mouth.vfmesh", + "drawn_triangles": 511318, + "source_triangles": 542780, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 27.669370041560203, + -17.931687050798093, + -752.0090260818968 + ], + "target_actual_m": [ + 17.37583574782943, + -13.414618104437244, + -753.05390625 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-1-2-0-lower-mouth-mesh.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-lower-mouth-render.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-lower-mouth-quality.log" + ] + }, + { + "name": "passage-1-2-0-station-25", + "passage": "passage/1-2/0", + "kind": "station", + "station": "25%", + "camera": [ + 13.839984288397812, + 6.587904286061814, + -736.8018138353019 + ], + "target": [ + 2.363156319326185, + 14.183439358820996, + -739.2050534708565 + ], + "yaw": -56.5028177078219, + "pitch": -9.905162260563504, + "focus": [ + 14.477989100250685, + 6.982175588660137, + -735.631813835302 + ], + "center_z": -735.631813835302, + "route_distance_m": 28.46821190286393, + "route_length_m": 113.87284761145573, + "requested_route_distance_m": 28.46821190286393, + "variant": "before", + "capture": "captures/before/passage-1-2-0-station-25.png", + "scene": "Saved/Linux/l112/captures/before/passage-1-2-0-station-25.vfmesh", + "drawn_triangles": 661032, + "source_triangles": 762668, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 28.46821190286393, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 13.839984288397812, + 6.587904286061814, + -736.8018138353019 + ], + "target_actual_m": [ + 2.363156319326185, + 14.183439358820996, + -739.2050534708565 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-1-2-0-station-25-mesh.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-station-25-render.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-station-25-quality.log" + ] + }, + { + "name": "passage-1-2-0-station-50", + "passage": "passage/1-2/0", + "kind": "station", + "station": "50%", + "camera": [ + -8.371258739883528, + 11.724083505834441, + -742.0951650605518 + ], + "target": [ + -12.783765342228843, + -1.6446342816727475, + -744.4990059410221 + ], + "yaw": -161.73390326754287, + "pitch": -9.689827619924415, + "focus": [ + -8.819483630432973, + 12.325410744109856, + -740.9251650605519 + ], + "center_z": -740.9251650605519, + "route_distance_m": 56.93642380572786, + "route_length_m": 113.87284761145573, + "requested_route_distance_m": 56.93642380572786, + "variant": "before", + "capture": "captures/before/passage-1-2-0-station-50.png", + "scene": "Saved/Linux/l112/captures/before/passage-1-2-0-station-50.vfmesh", + "drawn_triangles": 602996, + "source_triangles": 681672, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 56.93642380572786, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -8.371258739883528, + 11.724083505834441, + -742.0951650605518 + ], + "target_actual_m": [ + -12.783765342228843, + -1.6446342816727475, + -744.4990059410221 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-1-2-0-station-50-mesh.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-station-50-render.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-station-50-quality.log" + ] + }, + { + "name": "passage-1-2-0-station-75", + "passage": "passage/1-2/0", + "kind": "station", + "station": "75%", + "camera": [ + -6.586769568915752, + -10.735033108069532, + -747.3888312649981 + ], + "target": [ + 7.430752597530391, + -10.891774630023567, + -749.7924798389191 + ], + "yaw": 90.6406448523091, + "pitch": -9.729542154499603, + "focus": [ + -6.9939308656579335, + -11.364889979457965, + -746.2188312649981 + ], + "center_z": -746.2188312649981, + "route_distance_m": 85.4046357085918, + "route_length_m": 113.87284761145573, + "requested_route_distance_m": 85.4046357085918, + "variant": "before", + "capture": "captures/before/passage-1-2-0-station-75.png", + "scene": "Saved/Linux/l112/captures/before/passage-1-2-0-station-75.vfmesh", + "drawn_triangles": 615520, + "source_triangles": 696694, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 85.4046357085918, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -6.586769568915752, + -10.735033108069532, + -747.3888312649981 + ], + "target_actual_m": [ + 7.430752597530391, + -10.891774630023567, + -749.7924798389191 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-1-2-0-station-75-mesh.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-station-75-render.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-station-75-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-1-view-1", + "passage": "passage/1-2/0", + "kind": "open-air", + "station": "section-1/view-1", + "camera": [ + 5.970328502711869, + -4.077984872526297, + -748.2339999999999 + ], + "target": [ + 9.136, + -11.613, + -749.334 + ], + "yaw": 157.21135612217134, + "pitch": -7.6653476882049, + "focus": [ + 9.136, + -11.613, + -749.434 + ], + "center_z": -749.434, + "open_air_section": 1, + "route_distance_m": 103.1595, + "requested_route_distance_m": 103.1595, + "route_length_m": 113.87284761145573, + "variant": "before", + "capture": "captures/before/passage-1-2-0-openair-1-view-1.png", + "scene": "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-view-1.vfmesh", + "drawn_triangles": 629052, + "source_triangles": 721352, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 103.1595, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 5.970328502711869, + -4.077984872526297, + -748.2339999999999 + ], + "target_actual_m": [ + 9.136, + -11.613, + -749.334 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-view-1-mesh.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-view-1-render.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-view-1-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-1-view-2", + "passage": "passage/1-2/0", + "kind": "open-air", + "station": "section-1/view-2", + "camera": [ + 11.720672201321875, + -17.765105217867614, + -745.434 + ], + "target": [ + 10.94776719052517, + -10.851825714648527, + -749.8056360513408 + ], + "yaw": -6.379180837289254, + "pitch": -32.14682033821005, + "focus": [ + 9.136, + -11.613, + -749.434 + ], + "center_z": -749.434, + "open_air_section": 1, + "route_distance_m": 103.1595, + "requested_route_distance_m": 103.1595, + "route_length_m": 113.87284761145573, + "variant": "before", + "capture": "captures/before/passage-1-2-0-openair-1-view-2.png", + "scene": "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-view-2.vfmesh", + "drawn_triangles": 588414, + "source_triangles": 654974, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 103.1595, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 11.720672201321875, + -17.765105217867614, + -745.434 + ], + "target_actual_m": [ + 10.94776719052517, + -10.851825714648527, + -749.8056360513408 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-view-2-mesh.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-view-2-render.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-view-2-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-1-view-3", + "passage": "passage/1-2/0", + "kind": "open-air", + "station": "section-1/view-3", + "camera": [ + 9.136, + -11.613, + -750.954 + ], + "target": [ + 15.477185166838094, + -8.948890001269849, + -752.2547261796929 + ], + "yaw": 67.21135612217135, + "pitch": -10.708828804851287, + "focus": [ + 9.136, + -11.613, + -749.434 + ], + "center_z": -749.434, + "open_air_section": 1, + "route_distance_m": 103.1595, + "requested_route_distance_m": 103.1595, + "route_length_m": 113.87284761145573, + "variant": "before", + "capture": "captures/before/passage-1-2-0-openair-1-view-3.png", + "scene": "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-view-3.vfmesh", + "drawn_triangles": 616234, + "source_triangles": 698168, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 103.1595, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 9.136, + -11.613, + -750.954 + ], + "target_actual_m": [ + 15.477185166838094, + -8.948890001269849, + -752.2547261796929 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-view-3-mesh.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-view-3-render.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-view-3-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-1-4m-outside", + "passage": "passage/1-2/0", + "kind": "open-air-close", + "station": "section-1/4m-outside", + "camera": [ + 6.357661366689372, + -4.999924812263689, + -751.704 + ], + "target": [ + 7.906992822599383, + -8.687684571213255, + -751.704 + ], + "yaw": 157.21135612217134, + "pitch": 0.0, + "focus": [ + 9.136, + -11.613, + -749.434 + ], + "center_z": -749.434, + "open_air_section": 1, + "closeup_side": "outside", + "closeup_preferred_normal": [ + -0.3873328639775028, + 0.9219399397373916, + 0.0 + ], + "camera_target_distance_m": 3.9999999999999996, + "route_distance_m": 103.1595, + "requested_route_distance_m": 103.1595, + "route_length_m": 113.87284761145573, + "variant": "before", + "capture": "captures/before/passage-1-2-0-openair-1-4m-outside.png", + "scene": "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-4m-outside.vfmesh", + "drawn_triangles": 629052, + "source_triangles": 721352, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 103.1595, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.0, + "closeup_target_surface_distance_m": 0.3297392655628349, + "closeup_predicted_target_offset_m": 0.3297392655628349, + "closeup_wall_normal_alignment": 0.9257124649048741, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 7.8586145006242, + -5.017894162140777, + -751.6522969837506 + ], + "target_actual_m": [ + 7.898985787247995, + -9.017300820452297, + -751.708122969365 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-4m-outside-mesh.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-4m-outside-render.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-4m-outside-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-1-4m-interior-wall", + "passage": "passage/1-2/0", + "kind": "open-air-close", + "station": "section-1/4m-interior-wall", + "camera": [ + 12.173093223920612, + -9.017003903520504, + -752.4236701188466 + ], + "target": [ + 8.277288281888616, + -9.569071629146903, + -751.704 + ], + "yaw": -98.06558218574223, + "pitch": 10.36495618281995, + "focus": [ + 9.136, + -11.613, + -749.434 + ], + "center_z": -749.434, + "open_air_section": 1, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + 0.3873328639775028, + -0.9219399397373916, + -0.0 + ], + "camera_target_distance_m": 4.000000000000004, + "route_distance_m": 103.1595, + "requested_route_distance_m": 103.1595, + "route_length_m": 113.87284761145573, + "variant": "before", + "capture": "captures/before/passage-1-2-0-openair-1-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-4m-interior-wall.vfmesh", + "drawn_triangles": 573086, + "source_triangles": 634798, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 103.1595, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.9999999999999987, + "closeup_target_surface_distance_m": 0.5763280269776941, + "closeup_predicted_target_offset_m": 0.5763280269776941, + "closeup_wall_normal_alignment": 0.9856460223931174, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 9.119253550190452, + -12.892454942281582, + -751.7213326583923 + ], + "target_actual_m": [ + 8.214412385318102, + -8.996203988275933, + -751.6991748208959 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/before/passage-1-2-0-openair-1-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-2-3-0-upper-mouth", + "passage": "passage/2-3/0", + "kind": "mouth", + "station": "upper-mouth", + "camera": [ + -24.510890451086325, + -4.955138452601283, + -811.975390625 + ], + "target": [ + -18.085437577294964, + -5.118679784954985, + -812.075390625 + ], + "yaw": 91.4579836961561, + "pitch": -0.8913396541976134, + "focus": [ + -20.0625, + -5.068359375, + -810.755390625 + ], + "center_z": -810.755390625, + "variant": "before", + "capture": "captures/before/passage-2-3-0-upper-mouth.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-upper-mouth.vfmesh", + "drawn_triangles": 59562, + "source_triangles": 71470, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -24.510890451086325, + -4.955138452601283, + -811.975390625 + ], + "target_actual_m": [ + -18.085437577294964, + -5.118679784954985, + -812.075390625 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-upper-mouth-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-upper-mouth-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-upper-mouth-quality.log" + ] + }, + { + "name": "passage-2-3-0-lower-mouth", + "passage": "passage/2-3/0", + "kind": "mouth", + "station": "lower-mouth", + "camera": [ + -29.049715742915396, + -2.779103580443535, + -899.0170545422176 + ], + "target": [ + -18.170454580438843, + -5.550307963327683, + -900.0333984375 + ], + "yaw": 104.29068028993358, + "pitch": -5.172857326977102, + "focus": [ + -20.062499999999982, + -5.068359375000004, + -898.7133984375 + ], + "center_z": -898.7133984375, + "variant": "before", + "capture": "captures/before/passage-2-3-0-lower-mouth.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-lower-mouth.vfmesh", + "drawn_triangles": 294522, + "source_triangles": 315506, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -29.049715742915396, + -2.779103580443535, + -899.0170545422176 + ], + "target_actual_m": [ + -18.170454580438843, + -5.550307963327683, + -900.0333984375 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-lower-mouth-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-lower-mouth-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-lower-mouth-quality.log" + ] + }, + { + "name": "passage-2-3-0-station-25", + "passage": "passage/2-3/0", + "kind": "station", + "station": "25%", + "camera": [ + 3.3629477943069905, + -13.28264789111628, + -833.6924223707634 + ], + "target": [ + 14.057544579024707, + -4.268177781320185, + -836.0006826204402 + ], + "yaw": 49.87247810025953, + "pitch": -9.371026953528995, + "focus": [ + 3.463454182082567, + -14.025883026195553, + -832.5224223707635 + ], + "center_z": -832.5224223707635, + "route_distance_m": 122.71082287166668, + "route_length_m": 490.8432914866667, + "requested_route_distance_m": 122.71082287166668, + "variant": "before", + "capture": "captures/before/passage-2-3-0-station-25.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-station-25.vfmesh", + "drawn_triangles": 55484, + "source_triangles": 66458, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 122.71082287166668, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 3.3629477943069905, + -13.28264789111628, + -833.6924223707634 + ], + "target_actual_m": [ + 14.057544579024707, + -4.268177781320185, + -836.0006826204402 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-station-25-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-station-25-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-station-25-quality.log" + ] + }, + { + "name": "passage-2-3-0-station-50", + "passage": "passage/2-3/0", + "kind": "station", + "station": "50%", + "camera": [ + 14.714964374766744, + 4.426031524861205, + -855.6817931947601 + ], + "target": [ + 3.8569544509891096, + 13.535757747237458, + -857.9904777239444 + ], + "yaw": -50.003796291172236, + "pitch": -9.251614459440251, + "focus": [ + 15.448414166573603, + 4.582720397786105, + -854.5117931947601 + ], + "center_z": -854.5117931947601, + "route_distance_m": 245.42164574333336, + "route_length_m": 490.8432914866667, + "requested_route_distance_m": 245.42164574333336, + "variant": "before", + "capture": "captures/before/passage-2-3-0-station-50.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-station-50.vfmesh", + "drawn_triangles": 457754, + "source_triangles": 479058, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 245.42164574333336, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 14.714964374766744, + 4.426031524861205, + -855.6817931947601 + ], + "target_actual_m": [ + 3.8569544509891096, + 13.535757747237458, + -857.9904777239444 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-station-50-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-station-50-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-station-50-quality.log" + ] + }, + { + "name": "passage-2-3-0-station-75", + "passage": "passage/2-3/0", + "kind": "station", + "station": "75%", + "camera": [ + -5.760169952738466, + 11.295442453574074, + -877.6716971250207 + ], + "target": [ + -12.206687475534688, + -0.996781882252304, + -879.9807693267177 + ], + "yaw": -152.32574657735572, + "pitch": -9.445159710566168, + "focus": [ + -6.190732087251391, + 11.909540367854586, + -876.5016971250208 + ], + "center_z": -876.5016971250208, + "route_distance_m": 368.13246861500005, + "route_length_m": 490.8432914866667, + "requested_route_distance_m": 368.13246861500005, + "variant": "before", + "capture": "captures/before/passage-2-3-0-station-75.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-station-75.vfmesh", + "drawn_triangles": 475706, + "source_triangles": 506686, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 368.13246861500005, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -5.760169952738466, + 11.295442453574074, + -877.6716971250207 + ], + "target_actual_m": [ + -12.206687475534688, + -0.996781882252304, + -879.9807693267177 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-station-75-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-station-75-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-station-75-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-1-view-1", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-1/view-1", + "camera": [ + -1.189937432971333, + -5.322285697427915, + -813.0459999999999 + ], + "target": [ + -2.846, + -13.149, + -814.146 + ], + "yaw": -168.05293971491665, + "pitch": -7.829076510059767, + "focus": [ + -2.846, + -13.149, + -814.246 + ], + "center_z": -814.246, + "open_air_section": 1, + "route_distance_m": 21.212, + "requested_route_distance_m": 21.212, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-1-view-1.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-view-1.vfmesh", + "drawn_triangles": 104612, + "source_triangles": 129366, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 21.212, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -1.189937432971333, + -5.322285697427915, + -813.0459999999999 + ], + "target_actual_m": [ + -2.846, + -13.149, + -814.146 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-view-1-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-view-1-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-view-1-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-1-view-2", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-1/view-2", + "camera": [ + -4.1915508357107925, + -19.508205370839818, + -810.246 + ], + "target": [ + -0.9210204431637441, + -13.556308413611612, + -814.6045436681405 + ], + "yaw": 28.788521091259426, + "pitch": -32.69176164676129, + "focus": [ + -2.846, + -13.149, + -814.246 + ], + "center_z": -814.246, + "open_air_section": 1, + "route_distance_m": 21.212, + "requested_route_distance_m": 21.212, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-1-view-2.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-view-2.vfmesh", + "drawn_triangles": 81078, + "source_triangles": 99432, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 21.212, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -4.1915508357107925, + -19.508205370839818, + -810.246 + ], + "target_actual_m": [ + -0.9210204431637441, + -13.556308413611612, + -814.6045436681405 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-view-2-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-view-2-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-view-2-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-1-view-3", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-1/view-3", + "camera": [ + -2.846, + -13.149, + -815.766 + ], + "target": [ + 3.891428448926896, + -14.574579447640645, + -817.0209028384919 + ], + "yaw": 101.94706028508335, + "pitch": -10.327349081567025, + "focus": [ + -2.846, + -13.149, + -814.246 + ], + "center_z": -814.246, + "open_air_section": 1, + "route_distance_m": 21.212, + "requested_route_distance_m": 21.212, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-1-view-3.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-view-3.vfmesh", + "drawn_triangles": 94962, + "source_triangles": 118068, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 21.212, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -2.846, + -13.149, + -815.766 + ], + "target_actual_m": [ + 3.891428448926896, + -14.574579447640645, + -817.0209028384919 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-view-3-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-view-3-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-view-3-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-1-4m-outside", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-1/4m-outside", + "camera": [ + -1.3969452538499163, + -6.300624985249425, + -816.516 + ], + "target": [ + -2.22497653736425, + -10.213982136535467, + -816.516 + ], + "yaw": -168.05293971491665, + "pitch": 0.0, + "focus": [ + -2.846, + -13.149, + -814.246 + ], + "center_z": -814.246, + "open_air_section": 1, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.20700782087858338, + 0.9783392878215105, + 0.0 + ], + "camera_target_distance_m": 4.0, + "route_distance_m": 21.212, + "requested_route_distance_m": 21.212, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-1-4m-outside.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-4m-outside.vfmesh", + "drawn_triangles": 104612, + "source_triangles": 129366, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 21.212, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.9999999999999805, + "closeup_target_surface_distance_m": 0.21863746532605915, + "closeup_predicted_target_offset_m": 0.21863746532605915, + "closeup_wall_normal_alignment": 0.5616963397392034, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -1.6846709702918434, + -8.159235090682637, + -813.3879076292367 + ], + "target_actual_m": [ + -2.2544507075828024, + -10.33520463791381, + -816.695551440244 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-4m-outside-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-4m-outside-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-4m-outside-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-1-4m-interior-wall", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-1/4m-interior-wall", + "camera": [ + 1.0807247315156623, + -12.997171456076, + -817.2103168277982 + ], + "target": [ + -2.439974330314031, + -11.230082816910521, + -816.516 + ], + "yaw": -63.34727833660725, + "pitch": 9.995987331937334, + "focus": [ + -2.846, + -13.149, + -814.246 + ], + "center_z": -814.246, + "open_air_section": 1, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.20700782087858338, + -0.9783392878215105, + -0.0 + ], + "camera_target_distance_m": 4.000000000000006, + "route_distance_m": 21.212, + "requested_route_distance_m": 21.212, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-1-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-4m-interior-wall.vfmesh", + "drawn_triangles": 99334, + "source_triangles": 123368, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 21.212, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000003, + "closeup_target_surface_distance_m": 0.39080816806882795, + "closeup_predicted_target_offset_m": 0.39080816806882795, + "closeup_wall_normal_alignment": 0.684565492215496, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -3.529921390663112, + -13.549857433706853, + -819.0758935568331 + ], + "target_actual_m": [ + -2.4258698745683085, + -10.984576961360762, + -816.2122583936168 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-1-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-2-view-1", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-2/view-1", + "camera": [ + -2.9130850464832285, + 5.083885109955194, + -876.048 + ], + "target": [ + -9.545, + 9.558, + -877.148 + ], + "yaw": -55.995061323335754, + "pitch": -7.829076510059767, + "focus": [ + -9.545, + 9.558, + -877.248 + ], + "center_z": -877.248, + "open_air_section": 2, + "route_distance_m": 372.7845, + "requested_route_distance_m": 372.7845, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-2-view-1.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-view-1.vfmesh", + "drawn_triangles": 475688, + "source_triangles": 507502, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 372.7845, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -2.9130850464832285, + 5.083885109955194, + -876.048 + ], + "target_actual_m": [ + -9.545, + 9.558, + -877.148 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-view-1-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-view-1-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-view-1-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-2-view-2", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-2/view-2", + "camera": [ + -14.933430899732377, + 13.193218348161405, + -873.248 + ], + "target": [ + -10.645401808697681, + 7.926890520398333, + -877.6066052494994 + ], + "yaw": 140.84630886232915, + "pitch": -32.69214209091069, + "focus": [ + -9.545, + 9.558, + -877.248 + ], + "center_z": -877.248, + "open_air_section": 2, + "route_distance_m": 372.7845, + "requested_route_distance_m": 372.7845, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-2-view-2.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-view-2.vfmesh", + "drawn_triangles": 479134, + "source_triangles": 506272, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 372.7845, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -14.933430899732377, + 13.193218348161405, + -873.248 + ], + "target_actual_m": [ + -10.645401808697681, + 7.926890520398333, + -877.6066052494994 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-view-2-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-view-2-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-view-2-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-2-view-3", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-2/view-3", + "camera": [ + -9.545, + 9.558, + -878.768 + ], + "target": [ + -13.396406330441884, + 3.8491168213941664, + -880.0231183732476 + ], + "yaw": -145.99506132333573, + "pitch": -10.329142313691902, + "focus": [ + -9.545, + 9.558, + -877.248 + ], + "center_z": -877.248, + "open_air_section": 2, + "route_distance_m": 372.7845, + "requested_route_distance_m": 372.7845, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-2-view-3.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-view-3.vfmesh", + "drawn_triangles": 479134, + "source_triangles": 506272, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 372.7845, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -9.545, + 9.558, + -878.768 + ], + "target_actual_m": [ + -13.396406330441884, + 3.8491168213941664, + -880.0231183732476 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-view-3-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-view-3-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-view-3-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-2-4m-outside", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-2/4m-outside", + "camera": [ + -3.7420744156728247, + 5.643149471210794, + -879.518 + ], + "target": [ + -7.05803189243121, + 7.880206916233197, + -879.518 + ], + "yaw": -55.995061323335754, + "pitch": 0.0, + "focus": [ + -9.545, + 9.558, + -877.248 + ], + "center_z": -877.248, + "open_air_section": 2, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.8289893691895964, + -0.5592643612556008, + 0.0 + ], + "camera_target_distance_m": 4.0, + "route_distance_m": 372.7845, + "requested_route_distance_m": 372.7845, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-2-4m-outside.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-4m-outside.vfmesh", + "drawn_triangles": 475688, + "source_triangles": 507502, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 372.7845, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.9999999999999987, + "closeup_target_surface_distance_m": 1.2985903598285988, + "closeup_predicted_target_offset_m": 1.2985903598285988, + "closeup_wall_normal_alignment": 0.5540615952253409, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -7.048834538896178, + 5.179718947010304, + -879.432382591364 + ], + "target_actual_m": [ + -7.02557587321013, + 9.176983429370068, + -879.5784500159857 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-4m-outside-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-4m-outside-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-4m-outside-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-2-4m-interior-wall", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-2/4m-interior-wall", + "camera": [ + -10.87892643836146, + 5.861691886541483, + -880.2124360795867 + ], + "target": [ + -7.919018129560545, + 8.461057450455034, + -879.518 + ], + "yaw": 48.71068029668619, + "pitch": 9.997721822254437, + "focus": [ + -9.545, + 9.558, + -877.248 + ], + "center_z": -877.248, + "open_air_section": 2, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.8289893691895964, + 0.5592643612556008, + -0.0 + ], + "camera_target_distance_m": 4.000000000000005, + "route_distance_m": 372.7845, + "requested_route_distance_m": 372.7845, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-2-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-4m-interior-wall.vfmesh", + "drawn_triangles": 486364, + "source_triangles": 515880, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 372.7845, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.999999999999999, + "closeup_target_surface_distance_m": 0.7484696644179646, + "closeup_predicted_target_offset_m": 0.7484696644179646, + "closeup_wall_normal_alignment": 0.5468393137974433, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -7.844397023781797, + 13.208794016256846, + -879.5542227782431 + ], + "target_actual_m": [ + -7.903971927571609, + 9.20935408756137, + -879.5237090502709 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-2-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-3-view-1", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-3/view-1", + "camera": [ + -4.259540253679528, + -6.656854577309242, + -880.059 + ], + "target": [ + -11.172, + -10.684, + -881.159 + ], + "yaw": -120.224745904394, + "pitch": -7.829076510059767, + "focus": [ + -11.172, + -10.684, + -881.259 + ], + "center_z": -881.259, + "open_air_section": 3, + "route_distance_m": 395.169, + "requested_route_distance_m": 395.169, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-3-view-1.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-view-1.vfmesh", + "drawn_triangles": 485216, + "source_triangles": 518310, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 395.169, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -4.259540253679528, + -6.656854577309242, + -880.059 + ], + "target_actual_m": [ + -11.172, + -10.684, + -881.159 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-view-1-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-view-1-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-view-1-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-3-view-2", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-3/view-2", + "camera": [ + -16.788373543885385, + -13.95605565593624, + -877.259 + ], + "target": [ + -10.181507700208023, + -12.384146737382467, + -881.6173658401976 + ], + "yaw": 76.6169764950821, + "pitch": -32.69066303746625, + "focus": [ + -11.172, + -10.684, + -881.259 + ], + "center_z": -881.259, + "open_air_section": 3, + "route_distance_m": 395.169, + "requested_route_distance_m": 395.169, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-3-view-2.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-view-2.vfmesh", + "drawn_triangles": 479198, + "source_triangles": 497212, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 395.169, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -16.788373543885385, + -13.95605565593624, + -877.259 + ], + "target_actual_m": [ + -10.181507700208023, + -12.384146737382467, + -881.6173658401976 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-view-2-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-view-2-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-view-2-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-3-view-3", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-3/view-3", + "camera": [ + -11.172, + -10.684, + -882.779 + ], + "target": [ + -7.70527695072808, + -16.63451358083864, + -884.0332804406917 + ], + "yaw": 149.77525409560604, + "pitch": -10.322170838480888, + "focus": [ + -11.172, + -10.684, + -881.259 + ], + "center_z": -881.259, + "open_air_section": 3, + "route_distance_m": 395.169, + "requested_route_distance_m": 395.169, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-3-view-3.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-view-3.vfmesh", + "drawn_triangles": 490436, + "source_triangles": 519892, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 395.169, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -11.172, + -10.684, + -882.779 + ], + "target_actual_m": [ + -7.70527695072808, + -16.63451358083864, + -884.0332804406917 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-view-3-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-view-3-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-view-3-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-3-4m-outside", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-3/4m-outside", + "camera": [ + -5.123597721969588, + -7.160247755145587, + -883.529 + ], + "target": [ + -8.579827595129824, + -9.173820466490966, + -883.529 + ], + "yaw": -120.224745904394, + "pitch": 0.0, + "focus": [ + -11.172, + -10.684, + -881.259 + ], + "center_z": -881.259, + "open_air_section": 3, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.864057468290059, + 0.5033931778363446, + 0.0 + ], + "camera_target_distance_m": 4.0, + "route_distance_m": 395.169, + "requested_route_distance_m": 395.169, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-3-4m-outside.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-4m-outside.vfmesh", + "drawn_triangles": 485216, + "source_triangles": 518310, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 395.169, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000001, + "closeup_target_surface_distance_m": 0.21370595699941178, + "closeup_predicted_target_offset_m": 0.21370595699941178, + "closeup_wall_normal_alignment": 0.6967986735426744, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -7.5347876884777225, + -5.095624431260692, + -883.6515043714523 + ], + "target_actual_m": [ + -8.5, + -8.97568453916576, + -883.5353202385876 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-4m-outside-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-4m-outside-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-4m-outside-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-3-4m-interior-wall", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-3/4m-interior-wall", + "camera": [ + -8.423212847701345, + -13.492356510441905, + -884.2229724654675 + ], + "target": [ + -9.477235470231792, + -9.696643332609971, + -883.529 + ], + "yaw": -15.519316154639963, + "pitch": 9.990978711588388, + "focus": [ + -11.172, + -10.684, + -881.259 + ], + "center_z": -881.259, + "open_air_section": 3, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.864057468290059, + -0.5033931778363446, + -0.0 + ], + "camera_target_distance_m": 3.999999999999996, + "route_distance_m": 395.169, + "requested_route_distance_m": 395.169, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-3-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-4m-interior-wall.vfmesh", + "drawn_triangles": 490436, + "source_triangles": 519892, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 395.169, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.0, + "closeup_target_surface_distance_m": 1.111400216475651, + "closeup_predicted_target_offset_m": 1.111400216475651, + "closeup_wall_normal_alignment": 0.9285343847245275, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -11.213041949597612, + -12.006856406716684, + -883.4572259543174 + ], + "target_actual_m": [ + -8.75, + -8.856381157025917, + -883.5462768139893 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-3-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-4-view-1", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-4/view-1", + "camera": [ + 5.6333128025989625, + 3.3735740461566257, + -889.2199999999999 + ], + "target": [ + 9.72, + 10.251, + -890.3199999999999 + ], + "yaw": 30.71952465304602, + "pitch": -7.8290765100597675, + "focus": [ + 9.72, + 10.251, + -890.42 + ], + "center_z": -890.42, + "open_air_section": 4, + "route_distance_m": 446.293, + "requested_route_distance_m": 446.293, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-4-view-1.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-view-1.vfmesh", + "drawn_triangles": 475298, + "source_triangles": 507112, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 446.293, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 5.6333128025989625, + 3.3735740461566257, + -889.2199999999999 + ], + "target_actual_m": [ + 9.72, + 10.251, + -890.3199999999999 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-view-1-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-view-1-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-view-1-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-4-view-2", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-4/view-2", + "camera": [ + 13.040433347888344, + 15.838908587497741, + -886.42 + ], + "target": [ + 8.028477501069965, + 11.25613235429748, + -890.7784139868335 + ], + "yaw": -132.43882376014432, + "pitch": -32.69096048480686, + "focus": [ + 9.72, + 10.251, + -890.42 + ], + "center_z": -890.42, + "open_air_section": 4, + "route_distance_m": 446.293, + "requested_route_distance_m": 446.293, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-4-view-2.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-view-2.vfmesh", + "drawn_triangles": 495856, + "source_triangles": 530508, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 446.293, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 13.040433347888344, + 15.838908587497741, + -886.42 + ], + "target_actual_m": [ + 8.028477501069965, + 11.25613235429748, + -890.7784139868335 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-view-2-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-view-2-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-view-2-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-4-view-3", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-4/view-3", + "camera": [ + 9.72, + 10.251, + -891.9399999999999 + ], + "target": [ + 3.7996712537448776, + 13.768963240041181, + -893.1944489539172 + ], + "yaw": -59.280475346953985, + "pitch": -10.32357283123646, + "focus": [ + 9.72, + 10.251, + -890.42 + ], + "center_z": -890.42, + "open_air_section": 4, + "route_distance_m": 446.293, + "requested_route_distance_m": 446.293, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-4-view-3.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-view-3.vfmesh", + "drawn_triangles": 496236, + "source_triangles": 531424, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 446.293, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 9.72, + 10.251, + -891.9399999999999 + ], + "target_actual_m": [ + 3.7996712537448776, + 13.768963240041181, + -893.1944489539172 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-view-3-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-view-3-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-view-3-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-4-4m-outside", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-4/4m-outside", + "camera": [ + 6.144148702274093, + 4.233252290387048, + -892.6899999999999 + ], + "target": [ + 8.187492300974611, + 7.671965267308734, + -892.6899999999999 + ], + "yaw": 30.719524653046015, + "pitch": 0.0, + "focus": [ + 9.72, + 10.251, + -890.42 + ], + "center_z": -890.42, + "open_air_section": 4, + "closeup_side": "outside", + "closeup_preferred_normal": [ + -0.5108358996751298, + -0.8596782442304217, + 0.0 + ], + "camera_target_distance_m": 3.999999999999999, + "route_distance_m": 446.293, + "requested_route_distance_m": 446.293, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-4-4m-outside.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-4m-outside.vfmesh", + "drawn_triangles": 475298, + "source_triangles": 507112, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 446.293, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.999999999999969, + "closeup_target_surface_distance_m": 2.7431385655379885, + "closeup_predicted_target_offset_m": 2.7431385655379885, + "closeup_wall_normal_alignment": 0.27070559761624624, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 6.657064522391594, + 7.603943299491346, + -886.5753044006359 + ], + "target_actual_m": [ + 8.723573849747169, + 7.63555424139971, + -890.0 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-4m-outside-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-4m-outside-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-4m-outside-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-4-4m-interior-wall", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-4/4m-interior-wall", + "camera": [ + 5.953261824576057, + 11.370933570205146, + -893.3840657010269 + ], + "target": [ + 8.718045158946516, + 8.564824891510526, + -892.6899999999999 + ], + "yaw": 135.4250171034422, + "pitch": 9.992334780054298, + "focus": [ + 9.72, + 10.251, + -890.42 + ], + "center_z": -890.42, + "open_air_section": 4, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + 0.5108358996751298, + 0.8596782442304217, + -0.0 + ], + "camera_target_distance_m": 3.999999999999991, + "route_distance_m": 446.293, + "requested_route_distance_m": 446.293, + "route_length_m": 490.8432914866667, + "variant": "before", + "capture": "captures/before/passage-2-3-0-openair-4-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-4m-interior-wall.vfmesh", + "drawn_triangles": 475316, + "source_triangles": 506296, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 446.293, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000006, + "closeup_target_surface_distance_m": 2.6750073628142315, + "closeup_predicted_target_offset_m": 2.6750073628142315, + "closeup_wall_normal_alignment": 0.3031820710235188, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 8.728378023171791, + 9.651746412116331, + -893.8555657051302 + ], + "target_actual_m": [ + 8.292627617084863, + 8.5, + -890.0498329523252 + ], + "logs": [ + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/before/passage-2-3-0-openair-4-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-0-1-0-upper-mouth", + "passage": "passage/0-1/0", + "kind": "mouth", + "station": "upper-mouth", + "camera": [ + 8.335073547378155, + 20.44994601927027, + -371.842578125 + ], + "target": [ + 7.851078423387487, + 14.022246213657658, + -371.942578125 + ], + "yaw": -175.69384905314672, + "pitch": -0.8888009211775196, + "focus": [ + 8.0, + 16.0, + -372.1224609375 + ], + "center_z": -372.1224609375, + "variant": "after", + "capture": "captures/after/passage-0-1-0-upper-mouth.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-upper-mouth.vfmesh", + "drawn_triangles": 244874, + "source_triangles": 300692, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 8.335073547378155, + 20.44994601927027, + -371.842578125 + ], + "target_actual_m": [ + 7.851078423387487, + 14.022246213657658, + -371.942578125 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-upper-mouth-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-upper-mouth-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-upper-mouth-quality.log" + ] + }, + { + "name": "passage-0-1-0-lower-mouth", + "passage": "passage/0-1/0", + "kind": "mouth", + "station": "lower-mouth", + "camera": [ + 32.6815683216108, + 9.56067063407582, + -735.4811957974861 + ], + "target": [ + 24.395934218476675, + 1.8599657217735117, + -736.6798828125 + ], + "yaw": -132.9045214795435, + "pitch": -6.049035133760526, + "focus": [ + 25.8369140625, + 3.19921875, + -736.2942543532574 + ], + "center_z": -736.2942543532574, + "variant": "after", + "capture": "captures/after/passage-0-1-0-lower-mouth.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-lower-mouth.vfmesh", + "drawn_triangles": 551596, + "source_triangles": 601134, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 32.6815683216108, + 9.56067063407582, + -735.4811957974861 + ], + "target_actual_m": [ + 24.395934218476675, + 1.8599657217735117, + -736.6798828125 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-lower-mouth-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-lower-mouth-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-lower-mouth-quality.log" + ] + }, + { + "name": "passage-0-1-0-station-25", + "passage": "passage/0-1/0", + "kind": "station", + "station": "25%", + "camera": [ + -14.773420908313007, + -19.15622259434896, + -462.9505434032349 + ], + "target": [ + -22.332571996402073, + -8.365303107352405, + -465.2710323468326 + ], + "yaw": -35.01164133311156, + "pitch": -9.988838244260211, + "focus": [ + -14.252149448584996, + -18.61698603654429, + -462.71491494399237 + ], + "center_z": -462.71491494399237, + "route_distance_m": 506.6753072603284, + "route_length_m": 2026.7012290413136, + "requested_route_distance_m": 506.6753072603284, + "variant": "after", + "capture": "captures/after/passage-0-1-0-station-25.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-station-25.vfmesh", + "drawn_triangles": 135136, + "source_triangles": 181364, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 506.6753072603284, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -14.773420908313007, + -19.15622259434896, + -462.9505434032349 + ], + "target_actual_m": [ + -22.332571996402073, + -8.365303107352405, + -465.2710323468326 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-station-25-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-station-25-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-station-25-quality.log" + ] + }, + { + "name": "passage-0-1-0-station-50", + "passage": "passage/0-1/0", + "kind": "station", + "station": "50%", + "camera": [ + -5.87968914032497, + 21.857993246713395, + -554.13630134032 + ], + "target": [ + 7.315979337237899, + 21.580426280018035, + -556.4572725224375 + ], + "yaw": 91.20502199933122, + "pitch": -9.973491174456086, + "focus": [ + -5.762536970286937, + 21.11719950412685, + -553.9006728810774 + ], + "center_z": -553.9006728810774, + "route_distance_m": 1013.3506145206568, + "route_length_m": 2026.7012290413136, + "requested_route_distance_m": 1013.3506145206568, + "variant": "after", + "capture": "captures/after/passage-0-1-0-station-50.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-station-50.vfmesh", + "drawn_triangles": 316508, + "source_triangles": 404356, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1013.3506145206568, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -5.87968914032497, + 21.857993246713395, + -554.13630134032 + ], + "target_actual_m": [ + 7.315979337237899, + 21.580426280018035, + -556.4572725224375 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-station-50-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-station-50-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-station-50-quality.log" + ] + }, + { + "name": "passage-0-1-0-station-75", + "passage": "passage/0-1/0", + "kind": "station", + "station": "75%", + "camera": [ + 16.79632298277704, + -13.630908634595473, + -645.3200745693888 + ], + "target": [ + 6.584565856030696, + -21.9376366230758, + -647.640607952583 + ], + "yaw": -129.12654304255443, + "pitch": -9.997579084277536, + "focus": [ + 16.22588361858051, + -13.143980578538871, + -645.0844461101462 + ], + "center_z": -645.0844461101462, + "route_distance_m": 1520.0259217809853, + "route_length_m": 2026.7012290413136, + "requested_route_distance_m": 1520.0259217809853, + "variant": "after", + "capture": "captures/after/passage-0-1-0-station-75.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-station-75.vfmesh", + "drawn_triangles": 257040, + "source_triangles": 329218, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1520.0259217809853, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 16.79632298277704, + -13.630908634595473, + -645.3200745693888 + ], + "target_actual_m": [ + 6.584565856030696, + -21.9376366230758, + -647.640607952583 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-station-75-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-station-75-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-station-75-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-1-view-1", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-1/view-1", + "camera": [ + 14.177038985763101, + 7.143775299052934, + -371.985 + ], + "target": [ + 7.282, + 7.839, + -373.085 + ], + "yaw": -84.24234320176159, + "pitch": -9.01932243138141, + "focus": [ + 7.282, + 7.839, + -373.185 + ], + "center_z": -373.185, + "open_air_section": 1, + "route_distance_m": 8.2615, + "requested_route_distance_m": 8.2615, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-1-view-1.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-view-1.vfmesh", + "drawn_triangles": 278629, + "source_triangles": 346431, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 8.2615, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 14.177038985763101, + 7.143775299052934, + -371.985 + ], + "target_actual_m": [ + 7.282, + 7.839, + -373.085 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-view-1-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-view-1-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-view-1-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-1-view-2", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-1/view-2", + "camera": [ + 1.8793936951380026, + 8.383743163945537, + -369.185 + ], + "target": [ + 7.083023812394741, + 5.865611297170759, + -373.44218768304876 + ], + "yaw": 115.82318961848594, + "pitch": -36.368805894026266, + "focus": [ + 7.282, + 7.839, + -373.185 + ], + "center_z": -373.185, + "open_air_section": 1, + "route_distance_m": 8.2615, + "requested_route_distance_m": 8.2615, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-1-view-2.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-view-2.vfmesh", + "drawn_triangles": 287396, + "source_triangles": 358400, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 8.2615, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 1.8793936951380026, + 8.383743163945537, + -369.185 + ], + "target_actual_m": [ + 7.083023812394741, + 5.865611297170759, + -373.44218768304876 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-view-2-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-view-2-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-view-2-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-1-view-3", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-1/view-3", + "camera": [ + 7.282, + 7.839, + -373.635 + ], + "target": [ + 6.585583343381591, + 0.9321395400976531, + -374.5351568906707 + ], + "yaw": -174.2423432017616, + "pitch": -7.388343353280002, + "focus": [ + 7.282, + 7.839, + -373.185 + ], + "center_z": -373.185, + "open_air_section": 1, + "route_distance_m": 8.2615, + "requested_route_distance_m": 8.2615, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-1-view-3.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-view-3.vfmesh", + "drawn_triangles": 311780, + "source_triangles": 392506, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 8.2615, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 7.282, + 7.839, + -373.635 + ], + "target_actual_m": [ + 6.585583343381591, + 0.9321395400976531, + -374.5351568906707 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-view-3-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-view-3-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-view-3-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-1-4m-outside", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-1/4m-outside", + "camera": [ + 13.182083865162365, + 7.244096323720621, + -374.385 + ], + "target": [ + 9.202263382759421, + 7.645380422391366, + -374.385 + ], + "yaw": -84.24234320176159, + "pitch": 0.0, + "focus": [ + 7.282, + 7.839, + -373.185 + ], + "center_z": -373.185, + "open_air_section": 1, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.9949551206007362, + -0.10032102466768629, + 0.0 + ], + "camera_target_distance_m": 3.9999999999999996, + "route_distance_m": 8.2615, + "requested_route_distance_m": 8.2615, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-1-4m-outside.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-4m-outside.vfmesh", + "drawn_triangles": 278629, + "source_triangles": 346431, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 8.2615, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.9999999999999996, + "closeup_target_surface_distance_m": 0.7515085626476259, + "closeup_predicted_target_offset_m": 0.7515085626476259, + "closeup_wall_normal_alignment": 0.9914561643267705, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 13.001904038143014, + 8.028532071234862, + -374.0476239046015 + ], + "target_actual_m": [ + 9.013093948364258, + 8.0, + -373.75 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-4m-outside-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-4m-outside-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-4m-outside-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-1-4m-interior-wall", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-1/4m-interior-wall", + "camera": [ + 7.405691935288184, + 3.966226119787983, + -374.8830418066488 + ], + "target": [ + 8.785962786332426, + 7.687355885946053, + -374.385 + ], + "yaw": 20.351222510561445, + "pitch": 7.1524858702584835, + "focus": [ + 7.282, + 7.839, + -373.185 + ], + "center_z": -373.185, + "open_air_section": 1, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.9949551206007362, + 0.10032102466768629, + -0.0 + ], + "camera_target_distance_m": 4.000000000000003, + "route_distance_m": 8.2615, + "requested_route_distance_m": 8.2615, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-1-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-4m-interior-wall.vfmesh", + "drawn_triangles": 311780, + "source_triangles": 392506, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 8.2615, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.9999999999999987, + "closeup_target_surface_distance_m": 0.743343733960606, + "closeup_predicted_target_offset_m": 0.743343733960606, + "closeup_wall_normal_alignment": 0.9914561643267705, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 5.024283858585503, + 7.971467928765139, + -373.4523760953985 + ], + "target_actual_m": [ + 9.013093948364258, + 8.0, + -373.75 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-1-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-2-view-1", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-2/view-1", + "camera": [ + 13.81216559375693, + 0.8874232608882145, + -372.966 + ], + "target": [ + 6.611, + 1.753, + -374.066 + ], + "yaw": -83.14595676247222, + "pitch": -8.623838343279465, + "focus": [ + 6.611, + 1.753, + -374.166 + ], + "center_z": -374.166, + "open_air_section": 2, + "route_distance_m": 14.436, + "requested_route_distance_m": 14.436, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-2-view-1.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-view-1.vfmesh", + "drawn_triangles": 278629, + "source_triangles": 346431, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 14.436, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 13.81216559375693, + 0.8874232608882145, + -372.966 + ], + "target_actual_m": [ + 6.611, + 1.753, + -374.066 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-view-1-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-view-1-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-view-1-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-2-view-2", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-2/view-2", + "camera": [ + 0.8991144821613641, + 2.4395659699586516, + -370.166 + ], + "target": [ + 6.3761872034956015, + -0.2005250368401441, + -374.52461243848546 + ], + "yaw": 115.73527173937683, + "pitch": -35.63513396653433, + "focus": [ + 6.611, + 1.753, + -374.166 + ], + "center_z": -374.166, + "open_air_section": 2, + "route_distance_m": 14.436, + "requested_route_distance_m": 14.436, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-2-view-2.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-view-2.vfmesh", + "drawn_triangles": 311780, + "source_triangles": 392506, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 14.436, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 0.8991144821613641, + 2.4395659699586516, + -370.166 + ], + "target_actual_m": [ + 6.3761872034956015, + -0.2005250368401441, + -374.52461243848546 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-view-2-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-view-2-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-view-2-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-2-view-3", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-2/view-3", + "camera": [ + 6.611, + 1.753, + -374.75162845924257 + ], + "target": [ + 5.789155212234605, + -5.084337628940504, + -376.00677199394175 + ], + "yaw": -173.14595676247222, + "pitch": -10.329351655646626, + "focus": [ + 6.611, + 1.753, + -374.166 + ], + "center_z": -374.166, + "open_air_section": 2, + "route_distance_m": 14.436, + "requested_route_distance_m": 14.436, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-2-view-3.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-view-3.vfmesh", + "drawn_triangles": 311780, + "source_triangles": 392506, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 14.436, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 6.611, + 1.753, + -374.75162845924257 + ], + "target_actual_m": [ + 5.789155212234605, + -5.084337628940504, + -376.00677199394175 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-view-3-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-view-3-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-view-3-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-2-4m-outside", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-2/4m-outside", + "camera": [ + 12.8193122098114, + 1.0067637736569703, + -375.50162845924257 + ], + "target": [ + 8.84789867402928, + 1.4841258247319933, + -375.50162845924257 + ], + "yaw": -83.14595676247222, + "pitch": 0.0, + "focus": [ + 6.611, + 1.753, + -374.166 + ], + "center_z": -374.166, + "open_air_section": 2, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.9928533839455302, + -0.11934051276875574, + 0.0 + ], + "camera_target_distance_m": 4.0, + "route_distance_m": 14.436, + "requested_route_distance_m": 14.436, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-2-4m-outside.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-4m-outside.vfmesh", + "drawn_triangles": 278629, + "source_triangles": 346431, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 14.436, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000009, + "closeup_target_surface_distance_m": 1.0954207812570795, + "closeup_predicted_target_offset_m": 1.0954207812570795, + "closeup_wall_normal_alignment": 0.5096506905478002, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 10.316430262687657, + 3.180776532410437, + -378.42551295829554 + ], + "target_actual_m": [ + 8.001025199890137, + 1.0, + -376.0 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-4m-outside-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-4m-outside-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-4m-outside-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-2-4m-interior-wall", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-2/4m-interior-wall", + "camera": [ + 6.964882710490212, + -2.1271777965928074, + -376.1960784602411 + ], + "target": [ + 8.412449119604705, + 1.5364666576789914, + -375.50162845924257 + ], + "yaw": 21.55979422592298, + "pitch": 9.997924306647324, + "focus": [ + 6.611, + 1.753, + -374.166 + ], + "center_z": -374.166, + "open_air_section": 2, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.9928533839455302, + 0.11934051276875574, + -0.0 + ], + "camera_target_distance_m": 3.9999999999999987, + "route_distance_m": 14.436, + "requested_route_distance_m": 14.436, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-2-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-4m-interior-wall.vfmesh", + "drawn_triangles": 350192, + "source_triangles": 445232, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 14.436, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.999999999999987, + "closeup_target_surface_distance_m": 0.8280897194612481, + "closeup_predicted_target_offset_m": 0.8280897194612481, + "closeup_wall_normal_alignment": 0.6621482949540899, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 5.041511761376583, + 1.1856761795197162, + -373.0783207113634 + ], + "target_actual_m": [ + 7.751120738544031, + 1.534688106544318, + -376.0 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-2-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-3-view-1", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-3/view-1", + "camera": [ + -29.016924787180837, + -17.208716685638674, + -598.05 + ], + "target": [ + -22.039, + -12.355, + -599.15 + ], + "yaw": 55.178232541175774, + "pitch": -7.373766361330367, + "focus": [ + -22.039, + -12.355, + -599.25 + ], + "center_z": -599.25, + "open_air_section": 3, + "route_distance_m": 1265.3110000000001, + "requested_route_distance_m": 1265.3110000000001, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-3-view-1.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-view-1.vfmesh", + "drawn_triangles": 210501, + "source_triangles": 262807, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1265.3110000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -29.016924787180837, + -17.208716685638674, + -598.05 + ], + "target_actual_m": [ + -22.039, + -12.355, + -599.15 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-view-1-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-view-1-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-view-1-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-3-view-2", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-3/view-2", + "camera": [ + -16.292473704674606, + -8.357821553003445, + -595.25 + ], + "target": [ + -23.162403628923403, + -10.739943634747398, + -599.6099405834007 + ], + "yaw": -109.12379416410603, + "pitch": -30.947627602730336, + "focus": [ + -22.039, + -12.355, + -599.25 + ], + "center_z": -599.25, + "open_air_section": 3, + "route_distance_m": 1265.3110000000001, + "requested_route_distance_m": 1265.3110000000001, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-3-view-2.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-view-2.vfmesh", + "drawn_triangles": 189354, + "source_triangles": 238324, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1265.3110000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -16.292473704674606, + -8.357821553003445, + -595.25 + ], + "target_actual_m": [ + -23.162403628923403, + -10.739943634747398, + -599.6099405834007 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-view-2-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-view-2-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-view-2-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-3-view-3", + "passage": "passage/0-1/0", + "kind": "open-air", + "station": "section-3/view-3", + "camera": [ + -22.039, + -12.355, + -599.8356284592426 + ], + "target": [ + -25.970912701231907, + -6.70230272161589, + -601.0954205011448 + ], + "yaw": -34.821767458824226, + "pitch": -10.368029386382458, + "focus": [ + -22.039, + -12.355, + -599.25 + ], + "center_z": -599.25, + "open_air_section": 3, + "route_distance_m": 1265.3110000000001, + "requested_route_distance_m": 1265.3110000000001, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-3-view-3.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-view-3.vfmesh", + "drawn_triangles": 189354, + "source_triangles": 238324, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1265.3110000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -22.039, + -12.355, + -599.8356284592426 + ], + "target_actual_m": [ + -25.970912701231907, + -6.70230272161589, + -601.0954205011448 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-view-3-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-view-3-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-view-3-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-3-4m-outside", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-3/4m-outside", + "camera": [ + -28.19599245927721, + -16.637691193210596, + -600.5856284592426 + ], + "target": [ + -24.9122631476627, + -14.353589223498279, + -600.5856284592426 + ], + "yaw": 55.17823254117577, + "pitch": 0.0, + "focus": [ + -22.039, + -12.355, + -599.25 + ], + "center_z": -599.25, + "open_air_section": 3, + "closeup_side": "outside", + "closeup_preferred_normal": [ + -0.8209323279036278, + -0.5710254924280793, + 0.0 + ], + "camera_target_distance_m": 4.0, + "route_distance_m": 1265.3110000000001, + "requested_route_distance_m": 1265.3110000000001, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-3-4m-outside.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-4m-outside.vfmesh", + "drawn_triangles": 156696, + "source_triangles": 196328, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1265.3110000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.999999999999989, + "closeup_target_surface_distance_m": 0.19024061574976878, + "closeup_predicted_target_offset_m": 0.19024061574976878, + "closeup_wall_normal_alignment": 0.8867453188356844, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -27.424064445340754, + -16.658813034913997, + -602.2859722225862 + ], + "target_actual_m": [ + -24.785626505535024, + -14.240353099760217, + -600.5 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-4m-outside-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-4m-outside-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-4m-outside-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-3-4m-interior-wall", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-3/4m-interior-wall", + "camera": [ + -26.04935611703069, + -10.503775697900165, + -601.28265040181 + ], + "target": [ + -24.694826671989663, + -14.202344393233052, + -600.5856284592426 + ], + "yaw": 159.88571784104565, + "pitch": 10.035334894495504, + "focus": [ + -22.039, + -12.355, + -599.25 + ], + "center_z": -599.25, + "open_air_section": 3, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + 0.8209323279036278, + 0.5710254924280793, + -0.0 + ], + "camera_target_distance_m": 4.0, + "route_distance_m": 1265.3110000000001, + "requested_route_distance_m": 1265.3110000000001, + "route_length_m": 2026.7012290413136, + "variant": "after", + "capture": "captures/after/passage-0-1-0-openair-3-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-4m-interior-wall.vfmesh", + "drawn_triangles": 156658, + "source_triangles": 198088, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1265.3110000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.999999999999988, + "closeup_target_surface_distance_m": 0.03447160931397061, + "closeup_predicted_target_offset_m": 0.03447160931397061, + "closeup_wall_normal_alignment": 0.8640470577938766, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -22.16608291175724, + -11.835991531939918, + -598.6539123835992 + ], + "target_actual_m": [ + -24.716274302444134, + -14.222318752507483, + -600.6037755242438 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/after/passage-0-1-0-openair-3-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-1-2-0-upper-mouth", + "passage": "passage/1-2/0", + "kind": "mouth", + "station": "upper-mouth", + "camera": [ + 23.382701629372992, + -15.537907964013215, + -731.7810546875 + ], + "target": [ + 17.291932956389783, + -13.605656356271904, + -731.8810546875 + ], + "yaw": -72.39875236992931, + "pitch": -0.8965858034836333, + "focus": [ + 19.166015625, + -14.2001953125, + -730.5610546875 + ], + "center_z": -730.5610546875, + "variant": "after", + "capture": "captures/after/passage-1-2-0-upper-mouth.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-upper-mouth.vfmesh", + "drawn_triangles": 595932, + "source_triangles": 664560, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 23.382701629372992, + -15.537907964013215, + -731.7810546875 + ], + "target_actual_m": [ + 17.291932956389783, + -13.605656356271904, + -731.8810546875 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-upper-mouth-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-upper-mouth-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-upper-mouth-quality.log" + ] + }, + { + "name": "passage-1-2-0-lower-mouth", + "passage": "passage/1-2/0", + "kind": "mouth", + "station": "lower-mouth", + "camera": [ + 27.171071433601465, + -19.00546282978966, + -751.8773596007359 + ], + "target": [ + 17.480740717926007, + -13.188560045702177, + -753.05390625 + ], + "yaw": -59.02448758369992, + "pitch": -5.943042074548474, + "focus": [ + 19.166015625, + -14.2001953125, + -751.73390625 + ], + "center_z": -751.73390625, + "variant": "after", + "capture": "captures/after/passage-1-2-0-lower-mouth.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-lower-mouth.vfmesh", + "drawn_triangles": 546268, + "source_triangles": 592894, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 27.171071433601465, + -19.00546282978966, + -751.8773596007359 + ], + "target_actual_m": [ + 17.480740717926007, + -13.188560045702177, + -753.05390625 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-lower-mouth-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-lower-mouth-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-lower-mouth-quality.log" + ] + }, + { + "name": "passage-1-2-0-station-25", + "passage": "passage/1-2/0", + "kind": "station", + "station": "25%", + "camera": [ + 14.113736360885516, + 6.28488001817556, + -736.9318566664899 + ], + "target": [ + 2.8375390569633967, + 14.668469005956942, + -739.318388075095 + ], + "yaw": -53.37006031730614, + "pitch": -9.639411679864782, + "focus": [ + 14.810173613706882, + 6.563223605999366, + -735.76185666649 + ], + "center_z": -735.76185666649, + "route_distance_m": 28.742403046133614, + "route_length_m": 114.96961218453445, + "requested_route_distance_m": 28.742403046133614, + "variant": "after", + "capture": "captures/after/passage-1-2-0-station-25.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-station-25.vfmesh", + "drawn_triangles": 655074, + "source_triangles": 754544, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 28.742403046133614, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 14.113736360885516, + 6.28488001817556, + -736.9318566664899 + ], + "target_actual_m": [ + 2.8375390569633967, + 14.668469005956942, + -739.318388075095 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-station-25-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-station-25-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-station-25-quality.log" + ] + }, + { + "name": "passage-1-2-0-station-50", + "passage": "passage/1-2/0", + "kind": "station", + "station": "50%", + "camera": [ + -8.167639189328659, + 12.234449393806269, + -742.2421769171431 + ], + "target": [ + -12.719097109722199, + -1.058412445588001, + -744.6306758761227 + ], + "yaw": -161.09886549116882, + "pitch": -9.647718818107231, + "focus": [ + -8.641894120979037, + 12.815467689391955, + -741.0721769171431 + ], + "center_z": -741.0721769171431, + "route_distance_m": 57.48480609226723, + "route_length_m": 114.96961218453445, + "requested_route_distance_m": 57.48480609226723, + "variant": "after", + "capture": "captures/after/passage-1-2-0-station-50.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-station-50.vfmesh", + "drawn_triangles": 604662, + "source_triangles": 685224, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 57.48480609226723, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -8.167639189328659, + 12.234449393806269, + -742.2421769171431 + ], + "target_actual_m": [ + -12.719097109722199, + -1.058412445588001, + -744.6306758761227 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-station-50-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-station-50-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-station-50-quality.log" + ] + }, + { + "name": "passage-1-2-0-station-75", + "passage": "passage/1-2/0", + "kind": "station", + "station": "75%", + "camera": [ + -6.988640302303379, + -10.765776249210223, + -747.5570701728814 + ], + "target": [ + 7.082949158733629, + -11.036833196961979, + -749.9491196202687 + ], + "yaw": 91.10353551175237, + "pitch": -9.645811664959123, + "focus": [ + -7.4007113577862444, + -11.392432012156066, + -746.3870701728814 + ], + "center_z": -746.3870701728814, + "route_distance_m": 86.22720913840084, + "route_length_m": 114.96961218453445, + "requested_route_distance_m": 86.22720913840084, + "variant": "after", + "capture": "captures/after/passage-1-2-0-station-75.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-station-75.vfmesh", + "drawn_triangles": 612135, + "source_triangles": 691923, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 86.22720913840084, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -6.988640302303379, + -10.765776249210223, + -747.5570701728814 + ], + "target_actual_m": [ + 7.082949158733629, + -11.036833196961979, + -749.9491196202687 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-station-75-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-station-75-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-station-75-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-1-view-1", + "passage": "passage/1-2/0", + "kind": "open-air", + "station": "section-1/view-1", + "camera": [ + -4.012736377201166, + -3.9264102860018895, + -744.679 + ], + "target": [ + -9.52, + -9.729, + -745.779 + ], + "yaw": -136.49578370469135, + "pitch": -7.829076510059767, + "focus": [ + -9.52, + -9.729, + -745.879 + ], + "center_z": -745.879, + "open_air_section": 1, + "route_distance_m": 83.48150000000001, + "requested_route_distance_m": 83.48150000000001, + "route_length_m": 114.96961218453445, + "variant": "after", + "capture": "captures/after/passage-1-2-0-openair-1-view-1.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-view-1.vfmesh", + "drawn_triangles": 623352, + "source_triangles": 711724, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 83.48150000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -4.012736377201166, + -3.9264102860018895, + -744.679 + ], + "target_actual_m": [ + -9.52, + -9.729, + -745.779 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-view-1-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-view-1-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-view-1-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-1-view-2", + "passage": "passage/1-2/0", + "kind": "open-air", + "station": "section-1/view-2", + "camera": [ + -13.994651693524052, + -14.443604142623464, + -741.879 + ], + "target": [ + -8.094413332043812, + -11.082030626763467, + -746.2491496659267 + ], + "yaw": 60.32831225573483, + "pitch": -32.76344960660182, + "focus": [ + -9.52, + -9.729, + -745.879 + ], + "center_z": -745.879, + "open_air_section": 1, + "route_distance_m": 83.48150000000001, + "requested_route_distance_m": 83.48150000000001, + "route_length_m": 114.96961218453445, + "variant": "after", + "capture": "captures/after/passage-1-2-0-openair-1-view-2.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-view-2.vfmesh", + "drawn_triangles": 576164, + "source_triangles": 644692, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 83.48150000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -13.994651693524052, + -14.443604142623464, + -741.879 + ], + "target_actual_m": [ + -8.094413332043812, + -11.082030626763467, + -746.2491496659267 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-view-2-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-view-2-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-view-2-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-1-view-3", + "passage": "passage/1-2/0", + "kind": "open-air", + "station": "section-1/view-3", + "camera": [ + -9.52, + -9.729, + -747.399 + ], + "target": [ + -4.5304466621533415, + -14.464607193672137, + -748.6945238307434 + ], + "yaw": 133.50421629530865, + "pitch": -10.665495352457787, + "focus": [ + -9.52, + -9.729, + -745.879 + ], + "center_z": -745.879, + "open_air_section": 1, + "route_distance_m": 83.48150000000001, + "requested_route_distance_m": 83.48150000000001, + "route_length_m": 114.96961218453445, + "variant": "after", + "capture": "captures/after/passage-1-2-0-openair-1-view-3.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-view-3.vfmesh", + "drawn_triangles": 570605, + "source_triangles": 638189, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 83.48150000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -9.52, + -9.729, + -747.399 + ], + "target_actual_m": [ + -4.5304466621533415, + -14.464607193672137, + -748.6945238307434 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-view-3-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-view-3-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-view-3-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-1-4m-outside", + "passage": "passage/1-2/0", + "kind": "open-air-close", + "station": "section-1/4m-outside", + "camera": [ + -4.7011443300510205, + -4.651734000251653, + -748.149 + ], + "target": [ + -7.454776141450437, + -7.553028857250708, + -748.149 + ], + "yaw": -136.49578370469135, + "pitch": 0.0, + "focus": [ + -9.52, + -9.729, + -745.879 + ], + "center_z": -745.879, + "open_air_section": 1, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.6884079528498542, + 0.7253237142497637, + 0.0 + ], + "camera_target_distance_m": 3.9999999999999996, + "route_distance_m": 83.48150000000001, + "requested_route_distance_m": 83.48150000000001, + "route_length_m": 114.96961218453445, + "variant": "after", + "capture": "captures/after/passage-1-2-0-openair-1-4m-outside.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-4m-outside.vfmesh", + "drawn_triangles": 623352, + "source_triangles": 711724, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 83.48150000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000037, + "closeup_target_surface_distance_m": 0.5979370452655519, + "closeup_predicted_target_offset_m": 0.5979370452655519, + "closeup_wall_normal_alignment": 0.42190567041017063, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -5.2402003673605835, + -7.419699358529216, + -744.2592769877698 + ], + "target_actual_m": [ + -7.5, + -7.601630046981916, + -747.5547597816745 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-4m-outside-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-4m-outside-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-4m-outside-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-1-4m-interior-wall", + "passage": "passage/1-2/0", + "kind": "open-air-close", + "station": "section-1/4m-interior-wall", + "camera": [ + -6.097526120437678, + -11.651804466912369, + -748.8657917458692 + ], + "target": [ + -8.169754879372643, + -8.306348210480857, + -748.149 + ], + "yaw": -31.774732032092412, + "pitch": 10.323045367792538, + "focus": [ + -9.52, + -9.729, + -745.879 + ], + "center_z": -745.879, + "open_air_section": 1, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.6884079528498542, + -0.7253237142497637, + -0.0 + ], + "camera_target_distance_m": 4.000000000000005, + "route_distance_m": 83.48150000000001, + "requested_route_distance_m": 83.48150000000001, + "route_length_m": 114.96961218453445, + "variant": "after", + "capture": "captures/after/passage-1-2-0-openair-1-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-4m-interior-wall.vfmesh", + "drawn_triangles": 612135, + "source_triangles": 691923, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 83.48150000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000001, + "closeup_target_surface_distance_m": 0.6529446089467095, + "closeup_predicted_target_offset_m": 0.6529446089467095, + "closeup_wall_normal_alignment": 0.781464055310911, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -8.531084729501915, + -12.940973897704662, + -748.3218199263141 + ], + "target_actual_m": [ + -8.186284222607911, + -8.958624012538072, + -748.1734892060998 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-1-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-2-view-1", + "passage": "passage/1-2/0", + "kind": "open-air", + "station": "section-2/view-1", + "camera": [ + 6.37266079290948, + -3.635825668681128, + -748.555 + ], + "target": [ + 9.488, + -11.155, + -749.655 + ], + "yaw": 157.49482804323503, + "pitch": -7.696985964433935, + "focus": [ + 9.488, + -11.155, + -749.755 + ], + "center_z": -749.755, + "open_air_section": 2, + "route_distance_m": 104.40950000000001, + "requested_route_distance_m": 104.40950000000001, + "route_length_m": 114.96961218453445, + "variant": "after", + "capture": "captures/after/passage-1-2-0-openair-2-view-1.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-view-1.vfmesh", + "drawn_triangles": 628316, + "source_triangles": 719702, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 104.40950000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 6.37266079290948, + -3.635825668681128, + -748.555 + ], + "target_actual_m": [ + 9.488, + -11.155, + -749.655 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-view-1-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-view-1-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-view-1-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-2-view-2", + "passage": "passage/1-2/0", + "kind": "open-air", + "station": "section-2/view-2", + "camera": [ + 12.029188966196578, + -17.288406854113035, + -745.755 + ], + "target": [ + 11.303971870631361, + -10.402607766721497, + -750.1239879298538 + ], + "yaw": -6.01226603270804, + "pitch": -32.25202716463738, + "focus": [ + 9.488, + -11.155, + -749.755 + ], + "center_z": -749.755, + "open_air_section": 2, + "route_distance_m": 104.40950000000001, + "requested_route_distance_m": 104.40950000000001, + "route_length_m": 114.96961218453445, + "variant": "after", + "capture": "captures/after/passage-1-2-0-openair-2-view-2.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-view-2.vfmesh", + "drawn_triangles": 585440, + "source_triangles": 649826, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 104.40950000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 12.029188966196578, + -17.288406854113035, + -745.755 + ], + "target_actual_m": [ + 11.303971870631361, + -10.402607766721497, + -750.1239879298538 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-view-2-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-view-2-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-view-2-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-2-view-3", + "passage": "passage/1-2/0", + "kind": "open-air", + "station": "section-2/view-3", + "camera": [ + 9.488, + -11.155, + -751.275 + ], + "target": [ + 15.843901547209768, + -8.52162718352524, + -752.5664577544884 + ], + "yaw": 67.49482804323503, + "pitch": -10.63163088784527, + "focus": [ + 9.488, + -11.155, + -749.755 + ], + "center_z": -749.755, + "open_air_section": 2, + "route_distance_m": 104.40950000000001, + "requested_route_distance_m": 104.40950000000001, + "route_length_m": 114.96961218453445, + "variant": "after", + "capture": "captures/after/passage-1-2-0-openair-2-view-3.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-view-3.vfmesh", + "drawn_triangles": 613722, + "source_triangles": 693804, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 104.40950000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 9.488, + -11.155, + -751.275 + ], + "target_actual_m": [ + 15.843901547209768, + -8.52162718352524, + -752.5664577544884 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-view-3-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-view-3-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-view-3-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-2-4m-outside", + "passage": "passage/1-2/0", + "kind": "open-air-close", + "station": "section-2/4m-outside", + "camera": [ + 6.755427620172105, + -4.559670653485019, + -752.025 + ], + "target": [ + 8.286494929222613, + -8.255050592700584, + -752.025 + ], + "yaw": 157.49482804323503, + "pitch": 0.0, + "focus": [ + 9.488, + -11.155, + -749.755 + ], + "center_z": -749.755, + "open_air_section": 2, + "closeup_side": "outside", + "closeup_preferred_normal": [ + -0.3827668272626269, + 0.9238449848038914, + 0.0 + ], + "camera_target_distance_m": 4.0, + "route_distance_m": 104.40950000000001, + "requested_route_distance_m": 104.40950000000001, + "route_length_m": 114.96961218453445, + "variant": "after", + "capture": "captures/after/passage-1-2-0-openair-2-4m-outside.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-4m-outside.vfmesh", + "drawn_triangles": 585802, + "source_triangles": 657076, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 104.40950000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.0, + "closeup_target_surface_distance_m": 0.5569723033142947, + "closeup_predicted_target_offset_m": 0.5569723033142947, + "closeup_wall_normal_alignment": 0.8300132989203148, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 5.456826350119467, + -6.285898707784279, + -752.1262448423768 + ], + "target_actual_m": [ + 8.786704307765559, + -8.5, + -752.027917557296 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-4m-outside-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-4m-outside-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-4m-outside-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-2-4m-interior-wall", + "passage": "passage/1-2/0", + "kind": "open-air-close", + "station": "section-2/4m-interior-wall", + "camera": [ + 12.557525361540653, + -8.61890578995272, + -752.7395420536377 + ], + "target": [ + 8.658144128209829, + -9.15206209980055, + -752.025 + ], + "yaw": -97.78568510593111, + "pitch": 10.290292405231583, + "focus": [ + 9.488, + -11.155, + -749.755 + ], + "center_z": -749.755, + "open_air_section": 2, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + 0.3827668272626269, + -0.9238449848038914, + -0.0 + ], + "camera_target_distance_m": 4.000000000000001, + "route_distance_m": 104.40950000000001, + "requested_route_distance_m": 104.40950000000001, + "route_length_m": 114.96961218453445, + "variant": "after", + "capture": "captures/after/passage-1-2-0-openair-2-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-4m-interior-wall.vfmesh", + "drawn_triangles": 574472, + "source_triangles": 635712, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 104.40950000000001, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000001, + "closeup_target_surface_distance_m": 0.3789200867234511, + "closeup_predicted_target_offset_m": 0.3789200867234511, + "closeup_wall_normal_alignment": 0.9970173084578355, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 10.235234629238544, + -12.420762087601563, + -752.017966381381 + ], + "target_actual_m": [ + 8.423532662676926, + -8.854568760433747, + -752.0190329743256 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/after/passage-1-2-0-openair-2-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-2-3-0-upper-mouth", + "passage": "passage/2-3/0", + "kind": "mouth", + "station": "upper-mouth", + "camera": [ + -24.46109203696401, + -5.5818896409784315, + -811.975390625 + ], + "target": [ + -18.107570205793774, + -4.840123701231809, + -812.075390625 + ], + "yaw": 83.34093327385727, + "pitch": -0.8956388887564393, + "focus": [ + -20.0625, + -5.068359375, + -810.755390625 + ], + "center_z": -810.755390625, + "variant": "after", + "capture": "captures/after/passage-2-3-0-upper-mouth.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-upper-mouth.vfmesh", + "drawn_triangles": 59568, + "source_triangles": 71508, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -24.46109203696401, + -5.5818896409784315, + -811.975390625 + ], + "target_actual_m": [ + -18.107570205793774, + -4.840123701231809, + -812.075390625 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-upper-mouth-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-upper-mouth-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-upper-mouth-quality.log" + ] + }, + { + "name": "passage-2-3-0-lower-mouth", + "passage": "passage/2-3/0", + "kind": "mouth", + "station": "lower-mouth", + "camera": [ + -28.636475339787903, + -1.3354368899879738, + -898.8144448742513 + ], + "target": [ + -18.25745256004465, + -5.854237792897269, + -900.0333984375 + ], + "yaw": 113.5272620393567, + "pitch": -6.145978083088789, + "focus": [ + -20.0625, + -5.068359375, + -898.7133984375 + ], + "center_z": -898.7133984375, + "variant": "after", + "capture": "captures/after/passage-2-3-0-lower-mouth.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-lower-mouth.vfmesh", + "drawn_triangles": 294004, + "source_triangles": 314734, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -28.636475339787903, + -1.3354368899879738, + -898.8144448742513 + ], + "target_actual_m": [ + -18.25745256004465, + -5.854237792897269, + -900.0333984375 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-lower-mouth-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-lower-mouth-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-lower-mouth-quality.log" + ] + }, + { + "name": "passage-2-3-0-station-25", + "passage": "passage/2-3/0", + "kind": "station", + "station": "25%", + "camera": [ + 3.019701774592388, + -13.591453110374651, + -833.8488531811187 + ], + "target": [ + 14.00155446639769, + -4.75985656647419, + -836.142478466213 + ], + "yaw": 51.19378873289192, + "pitch": -9.244130451366324, + "focus": [ + 3.0967290150193443, + -14.33748716069153, + -832.6788531811187 + ], + "center_z": -832.6788531811187, + "route_distance_m": 123.53373286582855, + "route_length_m": 494.1349314633142, + "requested_route_distance_m": 123.53373286582855, + "variant": "after", + "capture": "captures/after/passage-2-3-0-station-25.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-station-25.vfmesh", + "drawn_triangles": 55514, + "source_triangles": 66412, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 123.53373286582855, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 3.019701774592388, + -13.591453110374651, + -833.8488531811187 + ], + "target_actual_m": [ + 14.00155446639769, + -4.75985656647419, + -836.142478466213 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-station-25-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-station-25-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-station-25-quality.log" + ] + }, + { + "name": "passage-2-3-0-station-50", + "passage": "passage/2-3/0", + "kind": "station", + "station": "50%", + "camera": [ + 15.037366176324477, + 4.106782632885063, + -855.8546237305741 + ], + "target": [ + 4.302090316791295, + 13.21257795312749, + -858.1474627779044 + ], + "yaw": -49.69497333173356, + "pitch": -9.251013429114066, + "focus": [ + 15.752039052912956, + 4.334252805586342, + -854.6846237305741 + ], + "center_z": -854.6846237305741, + "route_distance_m": 247.0674657316571, + "route_length_m": 494.1349314633142, + "requested_route_distance_m": 247.0674657316571, + "variant": "after", + "capture": "captures/after/passage-2-3-0-station-50.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-station-50.vfmesh", + "drawn_triangles": 458230, + "source_triangles": 479098, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 247.0674657316571, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 15.037366176324477, + 4.106782632885063, + -855.8546237305741 + ], + "target_actual_m": [ + 4.302090316791295, + 13.21257795312749, + -858.1474627779044 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-station-50-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-station-50-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-station-50-quality.log" + ] + }, + { + "name": "passage-2-3-0-station-75", + "passage": "passage/2-3/0", + "kind": "station", + "station": "75%", + "camera": [ + -5.729592517417305, + 11.518390950074156, + -877.8627102922013 + ], + "target": [ + -12.468742929423927, + -0.8048224106496764, + -880.1601105631271 + ], + "yaw": -151.3272360910958, + "pitch": -9.289478775200905, + "focus": [ + -6.104061615549714, + 12.168216230087099, + -876.6927102922014 + ], + "center_z": -876.6927102922014, + "route_distance_m": 370.6011985974857, + "route_length_m": 494.1349314633142, + "requested_route_distance_m": 370.6011985974857, + "variant": "after", + "capture": "captures/after/passage-2-3-0-station-75.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-station-75.vfmesh", + "drawn_triangles": 475838, + "source_triangles": 506104, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 370.6011985974857, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -5.729592517417305, + 11.518390950074156, + -877.8627102922013 + ], + "target_actual_m": [ + -12.468742929423927, + -0.8048224106496764, + -880.1601105631271 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-station-75-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-station-75-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-station-75-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-1-view-1", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-1/view-1", + "camera": [ + -2.9979042861664693, + -4.712290740348933, + -812.409 + ], + "target": [ + -7.267, + -11.478, + -813.509 + ], + "yaw": -147.74847917454895, + "pitch": -7.829076510059765, + "focus": [ + -7.267, + -11.478, + -813.609 + ], + "center_z": -813.609, + "open_air_section": 1, + "route_distance_m": 16.506999999999998, + "requested_route_distance_m": 16.506999999999998, + "route_length_m": 494.1349314633142, + "variant": "after", + "capture": "captures/after/passage-2-3-0-openair-1-view-1.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-view-1.vfmesh", + "drawn_triangles": 104612, + "source_triangles": 129352, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 16.506999999999998, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -2.9979042861664693, + -4.712290740348933, + -812.409 + ], + "target_actual_m": [ + -7.267, + -11.478, + -813.509 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-view-1-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-view-1-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-view-1-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-1-view-2", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-1/view-2", + "camera": [ + -10.735640267489744, + -16.97513877346649, + -809.609 + ], + "target": [ + -5.6026931633198105, + -12.528161174579008, + -813.9657131351471 + ], + "yaw": 49.09566798491317, + "pitch": -32.68045244303501, + "focus": [ + -7.267, + -11.478, + -813.609 + ], + "center_z": -813.609, + "open_air_section": 1, + "route_distance_m": 16.506999999999998, + "requested_route_distance_m": 16.506999999999998, + "route_length_m": 494.1349314633142, + "variant": "after", + "capture": "captures/after/passage-2-3-0-openair-1-view-2.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-view-2.vfmesh", + "drawn_triangles": 76426, + "source_triangles": 93942, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 16.506999999999998, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -10.735640267489744, + -16.97513877346649, + -809.609 + ], + "target_actual_m": [ + -5.6026931633198105, + -12.528161174579008, + -813.9657131351471 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-view-2-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-view-2-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-view-2-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-1-view-3", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-1/view-3", + "camera": [ + -7.267, + -11.478, + -815.129 + ], + "target": [ + -1.441926071619335, + -15.153564111026531, + -816.3774959730146 + ], + "yaw": 122.25152082545104, + "pitch": -10.27404912928437, + "focus": [ + -7.267, + -11.478, + -813.609 + ], + "center_z": -813.609, + "open_air_section": 1, + "route_distance_m": 16.506999999999998, + "requested_route_distance_m": 16.506999999999998, + "route_length_m": 494.1349314633142, + "variant": "after", + "capture": "captures/after/passage-2-3-0-openair-1-view-3.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-view-3.vfmesh", + "drawn_triangles": 94962, + "source_triangles": 118054, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 16.506999999999998, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -7.267, + -11.478, + -815.129 + ], + "target_actual_m": [ + -1.441926071619335, + -15.153564111026531, + -816.3774959730146 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-view-3-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-view-3-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-view-3-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-1-4m-outside", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-1/4m-outside", + "camera": [ + -3.5315412503956605, + -5.558004397805316, + -815.879 + ], + "target": [ + -5.666089107312426, + -8.94085902763085, + -815.879 + ], + "yaw": -147.74847917454895, + "pitch": 0.0, + "focus": [ + -7.267, + -11.478, + -813.609 + ], + "center_z": -813.609, + "open_air_section": 1, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.5336369642291914, + 0.8457136574563834, + 0.0 + ], + "camera_target_distance_m": 4.000000000000001, + "route_distance_m": 16.506999999999998, + "requested_route_distance_m": 16.506999999999998, + "route_length_m": 494.1349314633142, + "variant": "after", + "capture": "captures/after/passage-2-3-0-openair-1-4m-outside.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-4m-outside.vfmesh", + "drawn_triangles": 104612, + "source_triangles": 129352, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 16.506999999999998, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.999999999999996, + "closeup_target_surface_distance_m": 0.29683911895713316, + "closeup_predicted_target_offset_m": 0.29683911895713316, + "closeup_wall_normal_alignment": 0.67494340532841, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -3.8308683215077686, + -7.14211062127575, + -813.2125534154507 + ], + "target_actual_m": [ + -5.8142006488753735, + -9.08294977482132, + -816.0934449891276 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-4m-outside-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-4m-outside-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-4m-outside-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-1-4m-interior-wall", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-1/4m-interior-wall", + "camera": [ + -3.5310437260816867, + -12.698557095195458, + -816.5697720158989 + ], + "target": [ + -6.220323092573257, + -9.819215067750013, + -815.879 + ], + "yaw": -43.04519612653523, + "pitch": 9.944433062490045, + "focus": [ + -7.267, + -11.478, + -813.609 + ], + "center_z": -813.609, + "open_air_section": 1, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.5336369642291914, + -0.8457136574563834, + -0.0 + ], + "camera_target_distance_m": 3.9999999999999996, + "route_distance_m": 16.506999999999998, + "requested_route_distance_m": 16.506999999999998, + "route_length_m": 494.1349314633142, + "variant": "after", + "capture": "captures/after/passage-2-3-0-openair-1-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-4m-interior-wall.vfmesh", + "drawn_triangles": 94962, + "source_triangles": 118054, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 16.506999999999998, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.9999999999999925, + "closeup_target_surface_distance_m": 0.41884655036552404, + "closeup_predicted_target_offset_m": 0.41884655036552404, + "closeup_wall_normal_alignment": 0.7463542809089274, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -8.06908339833993, + -11.810743463701222, + -818.2117291711875 + ], + "target_actual_m": [ + -6.01271131624994, + -9.578237281759943, + -815.6064940555799 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-1-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-2-view-1", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-2/view-1", + "camera": [ + -3.8431494955986567, + 3.9485527351653085, + -876.2779999999999 + ], + "target": [ + -9.548, + 9.557, + -877.3779999999999 + ], + "yaw": -45.48821883657469, + "pitch": -7.829076510059767, + "focus": [ + -9.548, + 9.557, + -877.478 + ], + "center_z": -877.478, + "open_air_section": 2, + "route_distance_m": 375.00800000000004, + "requested_route_distance_m": 375.00800000000004, + "route_length_m": 494.1349314633142, + "variant": "after", + "capture": "captures/after/passage-2-3-0-openair-2-view-1.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-view-1.vfmesh", + "drawn_triangles": 476214, + "source_triangles": 507486, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 375.00800000000004, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -3.8431494955986567, + 3.9485527351653085, + -876.2779999999999 + ], + "target_actual_m": [ + -9.548, + 9.557, + -877.3779999999999 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-view-1-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-view-1-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-view-1-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-2-view-2", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-2/view-2", + "camera": [ + -14.183191034826091, + 14.113863402678188, + -873.478 + ], + "target": [ + -10.927615416535147, + 8.153670462741282, + -877.8348298086144 + ], + "yaw": 151.35575752769614, + "pitch": -32.6811732818988, + "focus": [ + -9.548, + 9.557, + -877.478 + ], + "center_z": -877.478, + "open_air_section": 2, + "route_distance_m": 375.00800000000004, + "requested_route_distance_m": 375.00800000000004, + "route_length_m": 494.1349314633142, + "variant": "after", + "capture": "captures/after/passage-2-3-0-openair-2-view-2.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-view-2.vfmesh", + "drawn_triangles": 479366, + "source_triangles": 505714, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 375.00800000000004, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -14.183191034826091, + 14.113863402678188, + -873.478 + ], + "target_actual_m": [ + -10.927615416535147, + 8.153670462741282, + -877.8348298086144 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-view-2-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-view-2-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-view-2-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-2-view-3", + "passage": "passage/2-3/0", + "kind": "open-air", + "station": "section-2/view-3", + "camera": [ + -9.548, + 9.557, + -878.9979999999999 + ], + "target": [ + -14.376653957873012, + 4.645346619594482, + -880.2469043301503 + ], + "yaw": -135.4882188365747, + "pitch": -10.277446062572244, + "focus": [ + -9.548, + 9.557, + -877.478 + ], + "center_z": -877.478, + "open_air_section": 2, + "route_distance_m": 375.00800000000004, + "requested_route_distance_m": 375.00800000000004, + "route_length_m": 494.1349314633142, + "variant": "after", + "capture": "captures/after/passage-2-3-0-openair-2-view-3.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-view-3.vfmesh", + "drawn_triangles": 479366, + "source_triangles": 505714, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 375.00800000000004, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -9.548, + 9.557, + -878.9979999999999 + ], + "target_actual_m": [ + -14.376653957873012, + 4.645346619594482, + -880.2469043301503 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-view-3-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-view-3-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-view-3-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-2-4m-outside", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-2/4m-outside", + "camera": [ + -4.5562558086488245, + 4.649608643269644, + -879.7479999999999 + ], + "target": [ + -7.408681060849496, + 7.453832275686991, + -879.7479999999999 + ], + "yaw": -45.48821883657468, + "pitch": 0.0, + "focus": [ + -9.548, + 9.557, + -877.478 + ], + "center_z": -877.478, + "open_air_section": 2, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.7131063130501679, + -0.7010559081043365, + 0.0 + ], + "camera_target_distance_m": 4.0, + "route_distance_m": 375.00800000000004, + "requested_route_distance_m": 375.00800000000004, + "route_length_m": 494.1349314633142, + "variant": "after", + "capture": "captures/after/passage-2-3-0-openair-2-4m-outside.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-4m-outside.vfmesh", + "drawn_triangles": 476214, + "source_triangles": 507486, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 375.00800000000004, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000001, + "closeup_target_surface_distance_m": 1.7270706511220406, + "closeup_predicted_target_offset_m": 1.7270706511220406, + "closeup_wall_normal_alignment": 0.6707823544913467, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -7.471987180266219, + 5.182171434598743, + -879.6783661883575 + ], + "target_actual_m": [ + -7.306491283931798, + 9.177780848974395, + -879.7662098907449 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-4m-outside-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-4m-outside-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-4m-outside-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-2-4m-interior-wall", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-2/4m-interior-wall", + "camera": [ + -11.53403153171888, + 6.16546709214774, + -880.4389979530969 + ], + "target": [ + -8.149311452462896, + 8.181947147565394, + -879.7479999999999 + ], + "yaw": 59.21521540250373, + "pitch": 9.947718755981942, + "focus": [ + -9.548, + 9.557, + -877.478 + ], + "center_z": -877.478, + "open_air_section": 2, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.7131063130501679, + 0.7010559081043365, + -0.0 + ], + "camera_target_distance_m": 3.9999999999999964, + "route_distance_m": 375.00800000000004, + "requested_route_distance_m": 375.00800000000004, + "route_length_m": 494.1349314633142, + "variant": "after", + "capture": "captures/after/passage-2-3-0-openair-2-4m-interior-wall.png", + "scene": "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-4m-interior-wall.vfmesh", + "drawn_triangles": 486990, + "source_triangles": 515888, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 375.00800000000004, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.9999999999999996, + "closeup_target_surface_distance_m": 1.0276132856323636, + "closeup_predicted_target_offset_m": 1.0276132856323636, + "closeup_wall_normal_alignment": 0.7200130865712391, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -8.257090453232413, + 13.208090455668112, + -879.7612152592583 + ], + "target_actual_m": [ + -8.149311452462896, + 9.209558486938477, + -879.75 + ], + "logs": [ + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-4m-interior-wall-mesh.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-4m-interior-wall-render.log", + "Saved/Linux/l112/captures/after/passage-2-3-0-openair-2-4m-interior-wall-quality.log" + ] + } + ] +} diff --git a/Standalone/Source/StreamBenchmarkPipeline.h b/Standalone/Source/StreamBenchmarkPipeline.h index a860758..8453638 100644 --- a/Standalone/Source/StreamBenchmarkPipeline.h +++ b/Standalone/Source/StreamBenchmarkPipeline.h @@ -4,6 +4,7 @@ #include "StreamingWorld.h" #include "LinuxScreenSpaceGate.h" #include "../Core/src/VoxelForgeFieldShared.h" +#include "../Core/include/VoxelForgeCore/PassageSpline.h" #include #include @@ -2968,292 +2969,186 @@ namespace StandaloneStreamBenchmark const auto qToMetres=[&](std::int64_t q) {return static_cast(q)*World.CoreVoxelSizeMicrons /(VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel*1000000.0);}; - const auto passageSplineControl=[&]( - const VoxelForgeCore::ResolvedLayoutPassageV1& passage,std::size_t index) + const auto passageUpperMouthFloorDepth=[&]( + const VoxelForgeCore::ResolvedLayoutPassageV1& passage) { - const auto& point=passage.controlPoints[index]; - return std::array{qToMetres(point.positionSubvoxels[0]), - qToMetres(point.positionSubvoxels[1]), - qToMetres(point.positionSubvoxels[2]), - qToMetres(point.radiusSubvoxels)}; + const double controlZ=qToMetres( + passage.controlPoints.front().positionSubvoxels[2]); + const double authoredMouthDepth=std::max(0.0,controlZ + -qToMetres(passage.upperMouthSubvoxels[2])+1.13); + const auto upperStratum=std::find_if(ResolvedLayout->strates.begin(), + ResolvedLayout->strates.end(),[&](const auto& stratum) + {return stratum.strateIndex==passage.upperStrateIndex;}); + if(upperStratum==ResolvedLayout->strates.end() + ||upperStratum->generatorKind!="FloatingIslands") + return authoredMouthDepth; + std::vector> route; + for(const auto& anchor:upperStratum->anchors) + if(anchor.kind=="route_point"&&anchor.values.size()>=3) + route.push_back({qToMetres(anchor.values[0]), + qToMetres(anchor.values[1]),qToMetres(anchor.values[2])}); + double routeHeight=0.0,distanceSquared=0.0; + const double mouthX=qToMetres(passage.controlPoints.front().positionSubvoxels[0]); + const double mouthY=qToMetres(passage.controlPoints.front().positionSubvoxels[1]); + if(!VoxelForgeCore::PassageSpline::ClosestRouteHeightAtXY( + route,mouthX,mouthY,routeHeight,distanceSquared) + ||distanceSquared>std::pow( + qToMetres(passage.controlPoints.front().radiusSubvoxels)+2.0,2.0)) + return authoredMouthDepth; + const double routeAlignedDepth=std::max(0.0,controlZ-routeHeight+1.13); + return std::max(authoredMouthDepth,routeAlignedDepth); }; - const auto passageSplineKnotSpan=[](const std::array& a, - const std::array& b) + const auto passageSplineControls=[&]( + const VoxelForgeCore::ResolvedLayoutPassageV1& passage) { - const double dx=b[0]-a[0],dy=b[1]-a[1],dz=b[2]-a[2]; - return std::max(1.0e-6,std::sqrt(std::sqrt(dx*dx+dy*dy+dz*dz))); + std::vector controls; + controls.reserve(passage.controlPoints.size()); + for(const auto& point:passage.controlPoints) + controls.push_back({qToMetres(point.positionSubvoxels[0]), + qToMetres(point.positionSubvoxels[1]), + qToMetres(point.positionSubvoxels[2]), + qToMetres(point.radiusSubvoxels)}); + if(!controls.empty()) + controls.front()[3]=std::max(controls.front()[3], + passageUpperMouthFloorDepth(passage)); + return controls; }; - const auto passageSplinePoint=[&]( - const VoxelForgeCore::ResolvedLayoutPassageV1& passage, - std::size_t span,double t) + const auto passageSplineFloorProfile=[&]( + const VoxelForgeCore::ResolvedLayoutPassageV1& passage) { - const auto p0=passageSplineControl(passage,span==0?0:span-1); - const auto p1=passageSplineControl(passage,span); - const auto p2=passageSplineControl(passage,span+1); - const auto p3=passageSplineControl(passage, - std::min(span+2,passage.controlPoints.size()-1)); - const double dt0=passageSplineKnotSpan(p0,p1); - const double dt1=passageSplineKnotSpan(p1,p2); - const double dt2=passageSplineKnotSpan(p2,p3); - const double t2=t*t,t3=t2*t; - std::array result{}; - for(std::size_t axis=0;axis<4;++axis) - { - const double m1=dt1*((p1[axis]-p0[axis])/dt0 - -(p2[axis]-p0[axis])/(dt0+dt1) - +(p2[axis]-p1[axis])/dt1); - const double m2=dt1*((p2[axis]-p1[axis])/dt1 - -(p3[axis]-p1[axis])/(dt1+dt2) - +(p3[axis]-p2[axis])/dt2); - result[axis]=(2.0*t3-3.0*t2+1.0)*p1[axis] - +(-2.0*t3+3.0*t2)*p2[axis] - +(t3-2.0*t2+t)*m1+(t3-t2)*m2; - } - result[3]=std::clamp(result[3],std::min(p1[3],p2[3]), - std::max(p1[3],p2[3])); - return result; + std::vector profile; + profile.reserve(passage.controlPoints.size()); + for(const auto& point:passage.controlPoints) + profile.push_back(qToMetres(point.positionSubvoxels[2] + -point.radiusSubvoxels)); + return profile; }; - constexpr std::size_t PassageSplineArcSteps=32; const auto passageBodyFloorDepth=[&]( const VoxelForgeCore::ResolvedLayoutPassageV1& passage) { if(passage.controlPoints.size()<2)return 0.0; const std::size_t routeEnd=std::clamp( passage.lowerMouthControlIndex,1,passage.controlPoints.size()-1); - std::vector distances(routeEnd+1,0.0); - for(std::size_t i=1;i<=routeEnd;++i) - { - auto previous=passageSplinePoint(passage,i-1,0.0); - double spanLength=0.0; - for(std::size_t step=1;step<=PassageSplineArcSteps;++step) - { - const auto current=passageSplinePoint(passage,i-1, - static_cast(step)/PassageSplineArcSteps); - const double dx=current[0]-previous[0]; - const double dy=current[1]-previous[1]; - const double dz=current[2]-previous[2]; - spanLength+=std::sqrt(dx*dx+dy*dy+dz*dz); - previous=current; - } - distances[i]=distances[i-1]+spanLength; - } double minimumRadius=std::numeric_limits::infinity(); double minimumBodyRadius=minimumRadius; - for(std::size_t i=0;i<=routeEnd;++i) + double totalLength=0.0; + const auto controls=passageSplineControls(passage); + const auto floorProfile=passageSplineFloorProfile(passage); + const auto segments=VoxelForgeCore::PassageSpline::BuildSegments( + controls,routeEnd,1.0,1.0,floorProfile); + const auto consider=[&](double distance,double radius) { - const double radius=qToMetres( - passage.controlPoints[i].radiusSubvoxels); minimumRadius=std::min(minimumRadius,radius); - if(distances[i]>=10.0&&distances[routeEnd]-distances[i]>=10.0) + if(distance>=10.0&&totalLength-distance>=10.0) minimumBodyRadius=std::min(minimumBodyRadius,radius); - } + }; + for(const auto& segment:segments)totalLength=segment.alongMetres + +segment.lengthMetres; + consider(0.0,controls.front()[3]); + for(const auto& segment:segments) + consider(segment.alongMetres+segment.lengthMetres,segment.b[3]); if(!std::isfinite(minimumBodyRadius))minimumBodyRadius=minimumRadius; return std::max(0.5,minimumBodyRadius-0.23); }; - const auto passageMouthFloorDepths=[&]( - const VoxelForgeCore::ResolvedLayoutPassageV1& passage) - { - const std::size_t routeEnd=std::clamp( - passage.lowerMouthControlIndex,1,passage.controlPoints.size()-1); - const double upper=qToMetres( - passage.controlPoints.front().positionSubvoxels[2] - -passage.upperMouthSubvoxels[2])+1.13; - const double lower=qToMetres( - passage.controlPoints[routeEnd].positionSubvoxels[2] - -passage.lowerMouthSubvoxels[2])+1.13; - double lowerDepth=std::max(0.0,lower); - const auto nativeCaveMouth=std::find_if(ResolvedLayout->cavernEdges.begin(), - ResolvedLayout->cavernEdges.end(),[&](const auto& edge) - { - return edge.strateIndex==passage.lowerStrateIndex - &&edge.startAnchorStableId==passage.stableId+"/lower-mouth" - &&!edge.polylineMicrometres.empty(); - }); - if(nativeCaveMouth!=ResolvedLayout->cavernEdges.end()) - { - const double routeFloor=qToMetres( - passage.controlPoints[routeEnd].positionSubvoxels[2]); - const double nativeFloor=static_cast( - nativeCaveMouth->polylineMicrometres.front()[2])/1000000.0; - lowerDepth=std::max(0.0,routeFloor-nativeFloor); - } - return std::array{{std::max(0.0,upper),lowerDepth}}; - }; - const auto passageFloorDepthAt=[](double alongMetres,double totalMetres, - double radiusMetres,double bodyDepthMetres,double upperMouthDepth, - double lowerMouthDepth) - { - const double fromMouth=std::max(0.0,std::min(alongMetres, - totalMetres-alongMetres)); - const double linear=std::clamp(fromMouth/5.0,0.0,1.0); - const double ramp=linear*linear*(3.0-2.0*linear); - const double mouthTarget=alongMetres<=totalMetres*0.5 - ?upperMouthDepth:lowerMouthDepth; - // The authored route grades its walk floor as centreline-radius+0.23 m. - // This is the floor path the derived flat tube must preserve. - const double localBodyDepth=std::max(0.0,radiusMetres-0.23); - const double mouthDepth=std::clamp(mouthTarget,0.0, - std::max(0.0,radiusMetres)); - (void)bodyDepthMetres; - return std::lerp(mouthDepth,localBodyDepth,ramp); - }; const auto passageTubeDepthAt=[](double radiusMetres,double bodyDepthMetres) { return std::min(bodyDepthMetres, std::max(0.0,radiusMetres-0.23)); }; - const auto passageRouteDistances=[&]( - const VoxelForgeCore::ResolvedLayoutPassageV1& passage) - { - std::vector distances(passage.controlPoints.size(),0.0); - if(passage.controlPoints.size()<2)return distances; - for(std::size_t i=1;i(step)/PassageSplineArcSteps); - const double dx=current[0]-previous[0]; - const double dy=current[1]-previous[1]; - const double dz=current[2]-previous[2]; - spanLength+=std::sqrt(dx*dx+dy*dy+dz*dz); - previous=current; - } - distances[i]=distances[i-1]+spanLength; - } - return distances; - }; - const auto passageEffectiveCenterZ=[&]( - const VoxelForgeCore::ResolvedLayoutPassageV1& passage, - std::size_t pointIndex,const std::vector& routeDistances, - double totalRouteLength,double bodyDepth, - const std::array& mouthFloorDepths) - { - const auto& point=passage.controlPoints[pointIndex]; - const double radius=qToMetres(point.radiusSubvoxels); - const double routeFloorDepth=passageFloorDepthAt( - routeDistances[pointIndex],totalRouteLength,radius,bodyDepth, - mouthFloorDepths[0],mouthFloorDepths[1]); - return qToMetres(point.positionSubvoxels[2])-routeFloorDepth - +passageTubeDepthAt(radius,bodyDepth); - }; struct FPassageAuditRoutePoint { - double x=0.0,y=0.0,z=0.0,radius=0.0,distance=0.0; + double x=0.0,y=0.0,z=0.0,floorZ=0.0,radius=0.0,distance=0.0; std::size_t segmentIndex=0; }; const auto passageSmoothRoute=[&]( - const VoxelForgeCore::ResolvedLayoutPassageV1& passage, - double bodyDepth,const std::array& mouthFloorDepths) + const VoxelForgeCore::ResolvedLayoutPassageV1& passage,double bodyDepth) { std::vector route; if(passage.controlPoints.size()<2)return route; const std::size_t routeEnd=std::clamp( passage.lowerMouthControlIndex,1,passage.controlPoints.size()-1); - constexpr double AuditRouteSpacingMetres=1.0; - auto previous=passageSplinePoint(passage,0,0.0); - route.push_back({previous[0],previous[1],previous[2],previous[3],0.0,0}); - double distance=0.0; - for(std::size_t span=0;span arcLength{}; - auto arcPrevious=passageSplinePoint(passage,span,0.0); - for(std::size_t step=1;step<=PassageSplineArcSteps;++step) - { - const auto current=passageSplinePoint(passage,span, - static_cast(step)/PassageSplineArcSteps); - const double dx=current[0]-arcPrevious[0]; - const double dy=current[1]-arcPrevious[1]; - const double dz=current[2]-arcPrevious[2]; - arcLength[step]=arcLength[step-1] - +std::sqrt(dx*dx+dy*dy+dz*dz); - arcPrevious=current; - } - const double spanLength=arcLength.back(); - const std::size_t steps=std::max(1, - static_cast(std::ceil( - spanLength/AuditRouteSpacingMetres))); - for(std::size_t sample=1;sample<=steps;++sample) - { - const double targetArc=spanLength*static_cast(sample)/steps; - const auto upper=std::lower_bound(arcLength.begin()+1, - arcLength.end(),targetArc); - const std::size_t upperIndex=static_cast( - upper-arcLength.begin()); - const std::size_t lowerIndex=upperIndex-1; - const double arcSpan=arcLength[upperIndex]-arcLength[lowerIndex]; - const double arcT=arcSpan>1.0e-12 - ?std::clamp((targetArc-arcLength[lowerIndex])/arcSpan,0.0,1.0):0.0; - const double t=(static_cast(lowerIndex)+arcT) - /PassageSplineArcSteps; - const auto current=passageSplinePoint(passage,span,t); - const double dx=current[0]-previous[0]; - const double dy=current[1]-previous[1]; - const double dz=current[2]-previous[2]; - distance+=std::sqrt(dx*dx+dy*dy+dz*dz); - route.push_back({current[0],current[1],current[2],current[3], - distance,span+1}); - previous=current; - } - } - const double totalLength=route.empty()?0.0:route.back().distance; - std::vector desiredFloor(route.size()); - std::vector horizontalGradeLimits(route.size()>0?route.size()-1:0); - std::vector remainingGradeAllowance(route.size(),0.0); - constexpr double MaximumWalkGradeTangent=0.2586407821; - for(std::size_t i=0;i0;--i) - remainingGradeAllowance[i-1]=remainingGradeAllowance[i] - +horizontalGradeLimits[i-1]; - if(route.size()>1) - { - std::vector walkableFloor(route.size()); - walkableFloor.front()=desiredFloor.front(); - walkableFloor.back()=desiredFloor.back(); - for(std::size_t i=1;i+1> allPassageRouteDistances; std::vector allPassageBodyFloorDepths; std::vector> allPassageSmoothRoutes; - allPassageRouteDistances.reserve(ResolvedLayout->passages.size()); + struct FUpperMouthFloorBlend + { + std::vector> receivingRoute; + double mouthX=0.0,mouthY=0.0,mouthFloor=0.0; + double tangentX=0.0,tangentY=0.0; + }; + std::vector allUpperMouthFloorBlends; allPassageBodyFloorDepths.reserve(ResolvedLayout->passages.size()); allPassageSmoothRoutes.reserve(ResolvedLayout->passages.size()); + allUpperMouthFloorBlends.reserve(ResolvedLayout->passages.size()); for(const auto& passage:ResolvedLayout->passages) { - allPassageRouteDistances.push_back(passageRouteDistances(passage)); const double bodyDepth=passageBodyFloorDepth(passage); allPassageBodyFloorDepths.push_back(bodyDepth); - allPassageSmoothRoutes.push_back(passageSmoothRoute(passage,bodyDepth, - passageMouthFloorDepths(passage))); + allPassageSmoothRoutes.push_back(passageSmoothRoute(passage,bodyDepth)); + FUpperMouthFloorBlend blend; + const auto upperStratum=std::find_if(ResolvedLayout->strates.begin(), + ResolvedLayout->strates.end(),[&](const auto& stratum) + {return stratum.strateIndex==passage.upperStrateIndex;}); + if(upperStratum!=ResolvedLayout->strates.end() + &&upperStratum->generatorKind=="FloatingIslands") + { + for(const auto& anchor:upperStratum->anchors) + if(anchor.kind=="route_point"&&anchor.values.size()>=3) + blend.receivingRoute.push_back({ + qToMetres(anchor.values[0]),qToMetres(anchor.values[1]), + qToMetres(anchor.values[2])}); + const auto controls=passageSplineControls(passage); + const auto floorProfile=passageSplineFloorProfile(passage); + const std::size_t routeEnd=std::clamp( + passage.lowerMouthControlIndex,1,passage.controlPoints.size()-1); + const auto segments=VoxelForgeCore::PassageSpline::BuildSegments( + controls,routeEnd,1.0,1.0,floorProfile); + if(!segments.empty()) + { + blend.mouthX=segments.front().a[0]; + blend.mouthY=segments.front().a[1]; + blend.mouthFloor=floorProfile.front(); + blend.tangentX=segments.front().b[0]-segments.front().a[0]; + blend.tangentY=segments.front().b[1]-segments.front().a[1]; + } + } + allUpperMouthFloorBlends.push_back(std::move(blend)); } + const auto passageFloorAtXY=[&](std::size_t passageIndex,double x,double y, + double plannedFloor) + { + if(passageIndex>=allUpperMouthFloorBlends.size())return plannedFloor; + const auto& blend=allUpperMouthFloorBlends[passageIndex]; + return VoxelForgeCore::PassageSpline::BlendUpperMouthFloorAtXY( + blend.receivingRoute,x,y,plannedFloor,blend.mouthX,blend.mouthY, + blend.mouthFloor, + blend.tangentX,blend.tangentY, + VoxelForgeCore::PassageSpline::UpperMouthFloorBlendRadiusMetres, + 1.13); + }; const auto interpolatePassageRoute=[]( const std::vector& route,double distance) { @@ -3268,6 +3163,7 @@ namespace StandaloneStreamBenchmark const double t=span>1.0e-9?(distance-a.distance)/span:0.0; return FPassageAuditRoutePoint{ std::lerp(a.x,b.x,t),std::lerp(a.y,b.y,t),std::lerp(a.z,b.z,t), + std::lerp(a.floorZ,b.floorZ,t), std::lerp(a.radius,b.radius,t),distance,b.segmentIndex}; }; const auto passageInteriorWinsAt=[&](double xMetres,double yMetres, @@ -3283,7 +3179,6 @@ namespace StandaloneStreamBenchmark if(passage.controlPoints.size()<2)continue; const auto& route=allPassageSmoothRoutes[passageIndex]; if(route.size()<2)continue; - const double bodyDepth=allPassageBodyFloorDepths[passageIndex]; double bestDistance=std::numeric_limits::infinity(); double bestRoundDistance=0.0,bestCenterZ=0.0; std::size_t bestSegment=std::numeric_limits::max(); @@ -3304,14 +3199,12 @@ namespace StandaloneStreamBenchmark const double floorT=horizontalLengthSquared>1.0e-12 ?std::clamp(((xMetres-a.x)*dx+(yMetres-a.y)*dy) /horizontalLengthSquared,0.0,1.0):t; - const double floorCenterZ=a.z+floorT*dz; - const double floorRadius=std::lerp(a.radius,b.radius,floorT); - const double floorDepth=passageTubeDepthAt(floorRadius,bodyDepth); + const double floorCenterZ=passageFloorAtXY(passageIndex, + xMetres,yMetres,std::lerp(a.floorZ,b.floorZ,floorT)); const double roundDistance=std::sqrt((xMetres-centerX)*(xMetres-centerX) +(yMetres-centerY)*(yMetres-centerY) +(zMetres-centerZ)*(zMetres-centerZ))-radius; - const double floorPlaneZ=floorCenterZ-floorDepth; - const double floorDistance=floorPlaneZ-zMetres; + const double floorDistance=floorCenterZ-zMetres; const double h=std::max(CornerBlendMetres- std::abs(roundDistance-floorDistance),0.0)/CornerBlendMetres; const double flatDistance=std::max(roundDistance,floorDistance) @@ -3353,15 +3246,13 @@ namespace StandaloneStreamBenchmark const auto& bFloor=route[bestSegment]; const double floorDx=bFloor.x-aFloor.x; const double floorDy=bFloor.y-aFloor.y; - const double floorDz=bFloor.z-aFloor.z; const double horizontalSquared=floorDx*floorDx+floorDy*floorDy; const double floorT=horizontalSquared>1.0e-12 ?std::clamp(((xMetres-aFloor.x)*floorDx +(yMetres-aFloor.y)*floorDy)/horizontalSquared,0.0,1.0):t; - const double floorRadius=std::lerp(aFloor.radius,bFloor.radius,floorT); - const double floorDepth=passageTubeDepthAt(floorRadius,bodyDepth); - const double floorCenterZ=aFloor.z+floorT*floorDz; - const double floorDistance=floorCenterZ-floorDepth-zMetres; + const double floorCenterZ=passageFloorAtXY(passageIndex, + xMetres,yMetres,std::lerp(aFloor.floorZ,bFloor.floorZ,floorT)); + const double floorDistance=floorCenterZ-zMetres; const double blend=std::max(CornerBlendMetres- std::abs(roughRoundDistance-floorDistance),0.0)/CornerBlendMetres; const double shapedDistance=std::max(roughRoundDistance,floorDistance) @@ -3441,51 +3332,25 @@ namespace StandaloneStreamBenchmark { FPassageMouthProfileAudit audit; if(passage.controlPoints.size()<2)return audit; - const std::size_t end=std::min(passage.lowerMouthControlIndex, - passage.controlPoints.size()-1); - if(end<1)return audit; - const auto routeDistances=passageRouteDistances(passage); - const double totalRouteLength=routeDistances.empty()?0.0: - routeDistances[end]; - const double bodyFloorDepth=passageBodyFloorDepth(passage); - const auto mouthFloorDepths=passageMouthFloorDepths(passage); + const std::size_t passageIndex=static_cast( + &passage-ResolvedLayout->passages.data()); + if(passageIndex>=allPassageSmoothRoutes.size())return audit; + const auto& smoothRoute=allPassageSmoothRoutes[passageIndex]; + if(smoothRoute.size()<3)return audit; struct FProfilePose { - double distance=0.0,x=0.0,y=0.0,z=0.0,radius=0.0; + double distance=0.0,x=0.0,y=0.0,z=0.0,floorZ=0.0,radius=0.0; std::size_t segmentIndex=0; }; std::vector path; - path.reserve(end*8+1); - double distance=0.0; - for(std::size_t segment=0;segment1.0e-8))continue; - const std::size_t steps=std::max(1, - static_cast(std::ceil(length/PassageProfileSpacingMetres))); - for(std::size_t step=segment==0?0:1;step<=steps;++step) - { - const double t=static_cast(step)/steps; - path.push_back({distance+length*t,std::lerp(ax,bx,t), - std::lerp(ay,by,t),std::lerp(az,bz,t),std::lerp(ar,br,t), - segment+1}); - } - distance+=length; + path.push_back({point.distance,point.x,point.y,point.z, + point.floorZ,point.radius,point.segmentIndex}); } if(path.size()<3)return audit; - const double lowerMouthDistance=distance; + const double lowerMouthDistance=path.back().distance; constexpr double DensitySearchStepMetres=0.0625; const auto densityMetres=[&](double x,double y,double z) { @@ -3495,8 +3360,7 @@ namespace StandaloneStreamBenchmark }; const auto firstFloorCrossing=[&](const FProfilePose& pose,double x,double y)->double { - const double expectedFloor=pose.z-passageTubeDepthAt( - pose.radius,bodyFloorDepth); + const double expectedFloor=pose.floorZ; const double maximumRise=std::min(2.0*pose.radius-0.25, std::max(0.75,pose.radius-1.20+0.50)); double previousZ=expectedFloor-1.50; @@ -3520,18 +3384,20 @@ namespace StandaloneStreamBenchmark } return highestFloor; }; - const auto findWallRadius=[&](const FProfilePose& pose,double nx,double ny) + const auto findWallRadius=[&](const FProfilePose& pose,double nx,double ny, + double wallHeightMetres) { const double maximum=pose.radius+2.0; double previousRadius=0.0; - double previous=densityMetres(pose.x,pose.y,pose.z); + const double wallZ=pose.floorZ+wallHeightMetres; + double previous=densityMetres(pose.x,pose.y,wallZ); if(!std::isfinite(previous)||previous<0.0) return std::numeric_limits::quiet_NaN(); for(double radius=DensitySearchStepMetres;radius<=maximum; radius+=DensitySearchStepMetres) { const double current=densityMetres(pose.x+nx*radius, - pose.y+ny*radius,pose.z); + pose.y+ny*radius,wallZ); if(!std::isfinite(current))return std::numeric_limits::quiet_NaN(); if(previous>=0.0&¤t<=0.0) { @@ -3580,8 +3446,7 @@ namespace StandaloneStreamBenchmark const double lateral=lane==0?0.0:lane==1?0.75:-0.75; const double sampleX=pose.x+nx*lateral; const double sampleY=pose.y+ny*lateral; - const double expectedFloor=pose.z-passageTubeDepthAt( - pose.radius,bodyFloorDepth); + const double expectedFloor=pose.floorZ; ++audit.expectedFloorSamples; ++endpointFloorExpected[endpoint]; if(passageInteriorWinsAt(sampleX,sampleY,expectedFloor+0.125, @@ -3596,7 +3461,7 @@ namespace StandaloneStreamBenchmark if(lane!=0&&localDistance>=4.0&&localDistance<=5.5) std::printf("[PassageMouthProfileProbe] id=%s endpoint=%s d_m=%.3f lane_m=%.2f x_m=%.3f y_m=%.3f route_floor_m=%.3f field_floor_m=%.3f\n", passage.stableId.c_str(),endpoint==0?"upper":"lower", - localDistance,lateral,sampleX,sampleY,pose.z-pose.radius,floor); + localDistance,lateral,sampleX,sampleY,pose.floorZ,floor); if(std::isfinite(floor)) { floorProfiles[endpoint][lane].push_back({localDistance,floor}); @@ -3608,7 +3473,11 @@ namespace StandaloneStreamBenchmark for(std::size_t side=0;side<2;++side) { const double sign=side==0?-1.0:1.0; - const double radius=findWallRadius(pose,sign*nx,sign*ny); + // The open-air half-pipe has side walls only one metre + // 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); if(std::isfinite(radius)) { wallProfiles[endpoint][side].push_back({localDistance,radius}); @@ -3684,8 +3553,8 @@ namespace StandaloneStreamBenchmark const auto& a=path[i-1]; const auto& b=path[i]; const double dx=b.x-a.x,dy=b.y-a.y; - const double floorA=a.z-passageTubeDepthAt(a.radius,bodyFloorDepth)+1.13; - const double floorB=b.z-passageTubeDepthAt(b.radius,bodyFloorDepth)+1.13; + const double floorA=a.floorZ+1.13; + const double floorB=b.floorZ+1.13; const double dz=floorB-floorA; const double horizontal=std::hypot(dx,dy); if(horizontal>1.0e-6&&std::abs(dz)/horizontal @@ -3761,18 +3630,17 @@ namespace StandaloneStreamBenchmark constexpr double FloorRippleAmplitudeLimitMetres=0.025; struct FPathPoint { - double x=0.0,y=0.0,z=0.0,radius=0.0,distance=0.0; + double x=0.0,y=0.0,z=0.0,floorZ=0.0,radius=0.0,distance=0.0; std::size_t segmentIndex=0; }; const auto& passage=ResolvedLayout->passages[passageIndex]; const auto& smoothRoute=allPassageSmoothRoutes[passageIndex]; if(smoothRoute.size()<2)return audit; - const double bodyFloorDepth=allPassageBodyFloorDepths[passageIndex]; std::vector path; path.reserve(smoothRoute.size()); for(const auto& point:smoothRoute) { - path.push_back({point.x,point.y,point.z,point.radius, + path.push_back({point.x,point.y,point.z,point.floorZ,point.radius, point.distance,point.segmentIndex}); } const double total=path.back().distance; @@ -3787,7 +3655,8 @@ namespace StandaloneStreamBenchmark const double length=b.distance-a.distance; const double t=length>1.0e-9?(distance-a.distance)/length:0.0; return FPathPoint{std::lerp(a.x,b.x,t),std::lerp(a.y,b.y,t), - std::lerp(a.z,b.z,t),std::lerp(a.radius,b.radius,t),distance, + std::lerp(a.z,b.z,t),std::lerp(a.floorZ,b.floorZ,t), + std::lerp(a.radius,b.radius,t),distance, b.segmentIndex}; }; const auto sinusoidAmplitude=[&](const std::vector>& samples, @@ -3979,8 +3848,7 @@ namespace StandaloneStreamBenchmark // The support strip is segment-built and is not itself a true // signed-distance field, so a fixed centerline radius misses // the stepped top that the player actually walks on. - const double expectedFloor=pose.z-passageTubeDepthAt( - pose.radius,bodyFloorDepth); + const double expectedFloor=pose.floorZ; const bool floorInteriorWins=passageInteriorWinsAt(pose.x,pose.y, expectedFloor+0.125,passageIndex,pose.segmentIndex); if(floorInteriorWins) @@ -4175,18 +4043,16 @@ namespace StandaloneStreamBenchmark value=std::clamp(value,0.0,1.0); return value*value*(3.0-2.0*value); }; - bool ambiguous=false,expectedSolid=false,interiorAir=false,mouthBlend=false; + bool ambiguous=false,expectedSolid=false,mouthBlend=false; + if(passageInteriorWinsAt(xMetres,yMetres,zMetres))return 0; for(std::size_t passageIndex=0; passageIndexpassages.size();++passageIndex) { const auto& passage=ResolvedLayout->passages[passageIndex]; if(passage.controlPoints.size()<2)continue; - const double bodyDepth=allPassageBodyFloorDepths[passageIndex]; const auto& path=allPassageSmoothRoutes[passageIndex]; if(path.size()<2)continue; const double totalLength=path.back().distance; - double bestFlatDistance=std::numeric_limits::infinity(); - double bestFloorDistance=0.0,bestMouthDistance=0.0; for(std::size_t segment=1;segment1.0e-12 ?std::clamp(((xMetres-ax)*dx+(yMetres-ay)*dy) /horizontalSquared,0.0,1.0):t; - const double floorRadius=std::lerp(a.radius,b.radius,floorT); - const double floorCenterZ=std::lerp(a.z,b.z,floorT); + const double floorCenterZ=passageFloorAtXY(passageIndex, + xMetres,yMetres,std::lerp(a.floorZ,b.floorZ,floorT)); const double along=std::lerp(a.distance,b.distance,t); - const double floorDepth=passageTubeDepthAt(floorRadius,bodyDepth); const double roundDistance=std::sqrt((xMetres-centerX)*(xMetres-centerX) +(yMetres-centerY)*(yMetres-centerY) +(zMetres-centerZ)*(zMetres-centerZ))-radius; - const double floorDistance=floorCenterZ-floorDepth-zMetres; + const double floorDistance=floorCenterZ-zMetres; const double blend=std::max(CornerBlendMetres- std::abs(roundDistance-floorDistance),0.0)/CornerBlendMetres; const double flatDistance=std::max(roundDistance,floorDistance) +blend*blend*blend*(CornerBlendMetres/6.0); const double mouthDistance=std::max(0.0,std::min(along, totalLength-along)); - if(flatDistance=0.0&&wallElevation<=1.0 + ?smoothFade:0.0; + const double thickness=0.75*std::max(wallThickness, + smoothFade*floorBlend); + if(flatDistance+ReliefBoundMetres=0.0&&wallElevation<=1.0 - ?smoothFade:0.0; - const double floorThickness=smoothFade*floorBlend; - const double thickness=0.75*std::max(wallThickness,floorThickness); - if(bestFlatDistance+ReliefBoundMetres1.0e-12 ?std::clamp(((sampleX-a.x)*dx+(sampleY-a.y)*dy) /horizontalLengthSquared,0.0,1.0):t; - const double floorAlong=a.distance+alongLength*floorT; - const double floorRadius=std::lerp(a.radius,b.radius,floorT); - const double floorCenterZ=std::lerp(a.z,b.z,floorT); - const double floorDepth=passageTubeDepthAt(floorRadius, - bodyFloorDepth); - const double floorZ=floorCenterZ-floorDepth; + const double floorZ=passageFloorAtXY(passageIndex, + sampleX,sampleY,std::lerp(a.floorZ,b.floorZ,floorT)); const VoxelForgeCore::Vec3d position{ sampleX/coreMetres,sampleY/coreMetres, (floorZ-depth)/coreMetres}; @@ -4341,7 +4190,8 @@ namespace StandaloneStreamBenchmark } const double nx=-dy/tangentLength,ny=dx/tangentLength; const double floorDepth=passageTubeDepthAt(radius,bodyFloorDepth); - const double floorZ=centerZ-floorDepth; + const double floorZ=passageFloorAtXY(passageIndex,centerX,centerY, + std::lerp(a.floorZ,b.floorZ,t)); struct FWallProbe {double side=0.0,height=0.0;bool roof=false;}; const std::array wallProbes{{ {0.0,0.0,true},{-1.0,0.25,false},{1.0,0.25,false}, @@ -4419,12 +4269,10 @@ namespace StandaloneStreamBenchmark { const auto& passage=ResolvedLayout->passages[passageIndex]; const auto& smoothRoute=allPassageSmoothRoutes[passageIndex]; - const double bodyFloorDepth=allPassageBodyFloorDepths[passageIndex]; std::vector> path;path.reserve(smoothRoute.size()); for(const auto& point:smoothRoute) { - const double playerZ=point.z - -passageTubeDepthAt(point.radius,bodyFloorDepth)+1.13; + const double playerZ=point.floorZ+1.13; path.push_back({point.x/coreMetres,point.y/coreMetres, playerZ/coreMetres}); } @@ -4581,10 +4429,19 @@ namespace StandaloneStreamBenchmark shellAudit.firstViolations[i][1],shellAudit.firstViolations[i][2], shellAudit.firstViolations[i][3]); for(std::size_t i=0;i(routeAudit.gradeFailures),binding?"PASS":"FAIL", routeAudit.passed&&binding?"PASS":"FAIL"); for(std::size_t i=0;ipassages) + for(std::size_t passageIndex=0; + passageIndexpassages.size();++passageIndex) { + const auto& passage=ResolvedLayout->passages[passageIndex]; + const auto& smoothRoute=allPassageSmoothRoutes[passageIndex]; std::vector> path;path.reserve(passage.controlPoints.size()); - const auto routeDistances=passageRouteDistances(passage); - const double routeLength=routeDistances.empty()?0.0:routeDistances[ - std::clamp(passage.lowerMouthControlIndex,1, - passage.controlPoints.size()-1)]; - const double bodyFloorDepth=passageBodyFloorDepth(passage); - const auto mouthFloorDepths=passageMouthFloorDepths(passage); - const std::size_t routeEnd=std::clamp( - passage.lowerMouthControlIndex,1,passage.controlPoints.size()-1); - for(std::size_t pointIndex=0;pointIndex<=routeEnd;++pointIndex) + path.reserve(smoothRoute.size()); + for(const auto& point:smoothRoute) { - const auto& point=passage.controlPoints[pointIndex]; - const double centerZ=qToMetres(point.positionSubvoxels[2]); - const double floorDepth=passageFloorDepthAt(routeDistances[pointIndex], - routeLength,qToMetres(point.radiusSubvoxels),bodyFloorDepth, - mouthFloorDepths[0],mouthFloorDepths[1]); - const double playerZ=centerZ-floorDepth+1.13; - path.push_back({qToMetres(point.positionSubvoxels[0])/coreMetres, - qToMetres(point.positionSubvoxels[1])/coreMetres,playerZ/coreMetres}); + const double playerZ=point.floorZ+1.13; + path.push_back({point.x/coreMetres,point.y/coreMetres, + playerZ/coreMetres}); } const FWalkAudit blockedAudit=auditPlayerPath(blockedWorld,path, 0.125,0.125,0.25,3,0.45); diff --git a/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v219.baseline b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v219.baseline new file mode 100644 index 0000000..feb0a8c --- /dev/null +++ b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v219.baseline @@ -0,0 +1,12 @@ +[PipelineFullDetailHash] tiles=960 density=0x91931a57a067fd92 mesh=0xa818654be89790ac payload=0x370ff80451105a39 topology=0x06e507557aa70173 +[PipelineWholeViewHash] tiles=2370 density=0x0a15a039462fe17e mesh=0xf30b861767091847 payload=0x5a892d42cdfb43f0 topology=0x9b9e2bca48cd4261 +[PipelineLODHash] lod=0 tiles=512 density=0x2fd4c78685a43cfe mesh=0x50478cff1c1f8ca0 payload=0x54e48e57e0af26de topology=0x860c011cfdb9833a +[PipelineLODHash] lod=1 tiles=448 density=0x4b8d9a6dcd2942ad mesh=0x17e89b7087bfe711 payload=0x2389c109eb780db6 topology=0x7eccd4cf560d0630 +[PipelineLODHash] lod=2 tiles=320 density=0x547c5c876701abd8 mesh=0x33d6150a2e67a02c payload=0x02664763a1a9cb97 topology=0xcf631628b8b93755 +[PipelineLODHash] lod=3 tiles=208 density=0xb00099f8ed2a1e4f mesh=0x4c87fe067b3c7663 payload=0x2e9ce94c84dfdc29 topology=0xc25000e325b8240e +[PipelineLODHash] lod=4 tiles=240 density=0xfb11591772a3d18e mesh=0xebf2baee8764591b payload=0xe491d7ac9c0061ad topology=0xd618ac33b95ce494 +[PipelineLODHash] lod=5 tiles=144 density=0x2f8b7b7fb1e67258 mesh=0x4cd508cbe97344fd payload=0x2b6e96a6050458c9 topology=0x4ff6d0eda8988573 +[PipelineLODHash] lod=6 tiles=96 density=0x0114a34c8b8d6113 mesh=0xb1fec4d01ae1fa44 payload=0x3e50cfd429b8e950 topology=0x08090c96d15c1618 +[PipelineLODHash] lod=7 tiles=96 density=0x3836ed8cfce73418 mesh=0x40bc6589c5fc1aac payload=0x677349bcae16790f topology=0x36e3aa53192e6a6b +[PipelineLODHash] lod=8 tiles=306 density=0x144f3c1fd722708b mesh=0xef77b28bf7fd9453 payload=0xe3f47b37fcd61489 topology=0x5a3c73e295494e04 +[PipelineExactQueryHash] probes=9 density=0x7b7c50ac24ccadcc unclamped=0x7b7c50ac24ccadcc detail=0xefcba20c0c70c415 collision=0xe604823a249029bf path=direct-Core-queries diff --git a/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v219.baseline b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v219.baseline new file mode 100644 index 0000000..1c35852 --- /dev/null +++ b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v219.baseline @@ -0,0 +1,12 @@ +[PipelineFullDetailHash] tiles=960 density=0xace56c8f205238ad mesh=0xa9c603a1248de6b8 payload=0xea55f1f4fcc6a894 topology=0x5ea7bc78a1b678ae +[PipelineWholeViewHash] tiles=2370 density=0x51237b896a190321 mesh=0xfd53f271fba5a8aa payload=0xb7b84a6b6ee6c445 topology=0xe90c5c4fc617b317 +[PipelineLODHash] lod=0 tiles=512 density=0xcd6ab28cfa504aca mesh=0xf03dc80a669fca31 payload=0x397aded1c3d2d297 topology=0xb4a1dc84fabc1fe3 +[PipelineLODHash] lod=1 tiles=448 density=0xce6e713828b2a20a mesh=0x1cf408c25d67d18c payload=0x8a2b5d20571c997e topology=0x51cd985fe8e7d100 +[PipelineLODHash] lod=2 tiles=320 density=0x000c1cc799606f1d mesh=0x27d2dc114337aa7b payload=0xa1e0dccf666e4d8d topology=0x575342ccac6ab8de +[PipelineLODHash] lod=3 tiles=208 density=0x0ae55cf5f2c889d4 mesh=0x9e6f17d0ba9d72e1 payload=0x8197d920d1c76399 topology=0x88102d22bdef4ab4 +[PipelineLODHash] lod=4 tiles=240 density=0x0be8798407724eaf mesh=0x131c303cbbe51434 payload=0x2a90ecf0a2411ca0 topology=0xe3e054a371152e08 +[PipelineLODHash] lod=5 tiles=144 density=0xf20897ad272103a9 mesh=0x13d00b6253ae1f72 payload=0x0db3880693a962fa topology=0x462bd87a80f15e89 +[PipelineLODHash] lod=6 tiles=96 density=0xc040fcac457d6313 mesh=0x1ed132eeb718fb62 payload=0xcd0214e35577c6e3 topology=0x2c56c69e6fdcfd64 +[PipelineLODHash] lod=7 tiles=96 density=0xc2d419446355fdb8 mesh=0x4ea44452574fc84b payload=0xfd9779bedfc9ae0f topology=0x8948546e770c9b72 +[PipelineLODHash] lod=8 tiles=306 density=0x62db31696f2da831 mesh=0xd373f9e9481532fe payload=0x540a60526e0e3e46 topology=0xc725cb901e6dc335 +[PipelineExactQueryHash] probes=9 density=0xc949c4df2ce6f9d9 unclamped=0xc949c4df2ce6f9d9 detail=0x114c501e2d830d94 collision=0xe6011d3a248d4849 path=direct-Core-queries diff --git a/Standalone/Tools/verify/verify.py b/Standalone/Tools/verify/verify.py index 07b6d9c..a3da90a 100644 --- a/Standalone/Tools/verify/verify.py +++ b/Standalone/Tools/verify/verify.py @@ -122,11 +122,11 @@ RECIPE_RE = re.compile( def owner_hash_baseline(recipe: str, style: int) -> tuple[Path, str]: if recipe == "surface-world" and style == 1: - return (BASELINES / "owner-hash/canonical/owner-hash-surface-world-style1-v218.baseline", - "L111-v218-smooth-spline-half-pipe") + return (BASELINES / "owner-hash/canonical/owner-hash-surface-world-style1-v219.baseline", + "L112-v219-horizontal-spline-planned-grade-half-pipe") if recipe == "floating-islands" and style == 2: - return (BASELINES / "owner-hash/canonical/owner-hash-floating-islands-style2-v218.baseline", - "L111-v218-smooth-spline-half-pipe") + return (BASELINES / "owner-hash/canonical/owner-hash-floating-islands-style2-v219.baseline", + "L112-v219-horizontal-spline-planned-grade-half-pipe") raise VerificationFailure(f"no pinned owner hash baseline for {recipe} style {style}")