From 37a223046c0e4d9bbb0ccb4c30891af48fae14dc Mon Sep 17 00:00:00 2001 From: Fr0zka Date: Wed, 21 Oct 2026 02:39:44 +0200 Subject: [PATCH] wip(L26, side branch): every passage style walkable in both recipes (0/0/0); SW bridges look wrong All 4 styles x both recipes pass capsule, open-air and naturalness audits, and full-view hashes are deterministic. But the SW passage crosses 355 m of open SurfaceWorld sky as a ~2 km fragmented rock ramp, which is not natural. L27 replaces long bridges with a shared ceiling-to-ground rock column. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01CSFYgsdW8ejZSyiMf4qRSX --- ARCHITECTURE.md | 24 ++ CODEMAP.md | 14 + Standalone/BuildLinux.sh | 5 +- .../include/VoxelForgeCore/VoxelForgeCore.h | 19 +- Standalone/Core/src/ShapeWorldInternal.h | 327 +++++++++++++++++- Standalone/Core/src/VoxelForgeCore.cpp | 62 ++++ .../WorldAssemblerM3/Linux26/REPORT.md | 144 ++++++++ .../Linux26/captures/fi-pillar-exterior.jpg | Bin 0 -> 35857 bytes .../captures/sw-natural-bridge-wide.jpg | Bin 0 -> 70192 bytes .../Linux26/captures/sw-passage-inside.jpg | Bin 0 -> 47519 bytes .../Linux26/captures/sw-passage-outside.jpg | Bin 0 -> 90937 bytes Standalone/Source/OwnerWorldLoader.h | 23 ++ Standalone/Source/StreamBenchmarkPipeline.h | 301 +++++++++++++++- 13 files changed, 878 insertions(+), 41 deletions(-) create mode 100644 Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md create mode 100644 Standalone/Research/WorldAssemblerM3/Linux26/captures/fi-pillar-exterior.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux26/captures/sw-natural-bridge-wide.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux26/captures/sw-passage-inside.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux26/captures/sw-passage-outside.jpg diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 4086eec..a913b24 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -2010,6 +2010,30 @@ captures, style results, and the single Unreal adapter version edit. [`Standalone/Research/WorldAssemblerM3/Linux25/REPORT.md`](Standalone/Research/WorldAssemblerM3/Linux25/REPORT.md) records the evidence and caveats. +### 8.44 Walkable passages as tunnels in rock — World Assembler L26 + +L25 correctly stopped support from appearing in native air, but its SurfaceWorld-recipe passages +still crossed a long open volume in the SurfaceWorld arrival strata. The segment map places that gap +inside SurfaceWorld (about `-146` to `-497 m`), after the TunnelNetwork transition; it is not TunnelNetwork +cave air. Both ends meet native rock. The shared Core planner now finds contiguous unsupported ranges +from the native field sign and caches them by resolved-layout identity. It adds a deterministic, +relief-bearing rock span only across those ranges. The span is at least 5 m wide, several metres thick, +and joins native rock at both ends. The passage carve then opens the bore through the added density, +leaving a grounded floor and rock walls/ceiling. SurfaceWorld away from the passage remains unchanged. + +Native route support remains gated on pre-passage solid density. Before adding any support density, the +composer also checks the resolved player capsule, so neighboring floor segments cannot restore rock +inside the avatar path. This keeps all four style overrides walkable in both recipes. The bridge audit +measures its authored density field at 256 route sections, checks the 5 m width and connected ends, and +records a relief-bearing thickness range; the open-air audit still runs the L24 negative control. + +The shared evaluator is version 13; FloatingIslands geometry remains version 7 and resolved-layout +schema V3 is unchanged. These changes are in Core and the standalone audit/capture path; no Unreal +adapter edit is required. The L26 report contains the eight-style table, hashes, captures and run history. + +[`Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md`](Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md) +records the final evidence. + ## 9. Multiplayer model (listen-server first, dedicated-friendly) > **Status: transport is DESIGN ONLY — nothing is networked in-tree yet** (no `Replicated`/`HasAuthority`/RPCs; a diff --git a/CODEMAP.md b/CODEMAP.md index 083dab3..092e38d 100644 --- a/CODEMAP.md +++ b/CODEMAP.md @@ -1194,6 +1194,20 @@ The shared evaluator is version 12 and FI geometry version is 7; resolved-layout unchanged. See ARCHITECTURE §8.43 and [`Standalone/Research/WorldAssemblerM3/Linux25/REPORT.md`](Standalone/Research/WorldAssemblerM3/Linux25/REPORT.md). +### 3.27 Tunnels in native rock with grounded passage bridges — World Assembler L26 + +| Symbol | Canonical file | Role | +|---|---|---| +| `BuildPassageBridgePlan` / `PassageBridgeSignedDistance` | `Standalone/Core/src/ShapeWorldInternal.h` | Uses native density sign to plan cached, connected rock spans only across unsupported route ranges; shared by both recipes and all passage styles. | +| `PassageBridgeCache` | `Standalone/Source/OwnerWorldLoader.h` | Shares deterministic ranges by resolved-layout identity across shape instances. | +| `ApplyResolvedStratePassageCarves` | `Standalone/Core/src/ShapeWorldInternal.h` | Adds bridge density before carving the bore; gates native floor support on solid input and player-capsule clearance. | +| `auditPassageBridges` / `auditPassageOpenAir` / `--audit-resolved-layout-passages` | `Standalone/Source/StreamBenchmarkPipeline.h` | Measures bridge width, thickness, relief and connected ends; checks capsule support, open air, naturalness, route binding and the L24 negative control. | +| `PassageBridgeRangeAuditV1` / `passageBridgeRanges()` / `isPassageBridgeSample()` | `Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h`, `Standalone/Core/src/VoxelForgeCore.cpp` | Exposes audit-only bridge ranges and density queries to the standalone validator. | + +The shared evaluator is version 13; FloatingIslands geometry remains version 7 and resolved-layout +schema V3 is unchanged. See ARCHITECTURE §8.44 and +[`Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md`](Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md). + ## 4. The density pipeline (most-edited hot path) ### 4.1 `GetDensityWithParams` (TunnelNetwork) — VoxelGenerator.cpp:3749 diff --git a/Standalone/BuildLinux.sh b/Standalone/BuildLinux.sh index 9e96f42..be69f95 100755 --- a/Standalone/BuildLinux.sh +++ b/Standalone/BuildLinux.sh @@ -36,8 +36,9 @@ command -v ar >/dev/null || { printf 'ar not found\n' >&2; exit 2; } command -v pkg-config >/dev/null || { printf 'pkg-config not found\n' >&2; exit 2; } pkg-config --exists egl glesv2 libpng || { printf 'EGL, GLESv2, and libpng development files are required\n' >&2; exit 2; } -BUILD_DIR="$ROOT/Build/linux-$VARIANT" -BIN_DIR="$ROOT/bin/linux" +BUILD_ROOT="${VOXELFORGE_BUILD_ROOT:-$ROOT/Build}" +BIN_DIR="${VOXELFORGE_BIN_DIR:-$ROOT/bin/linux}" +BUILD_DIR="$BUILD_ROOT/linux-$VARIANT" mkdir -p "$BUILD_DIR/wrappers" "$BUILD_DIR/objects" "$BIN_DIR" INCLUDES=( diff --git a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h index a700e8f..c36434b 100644 --- a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h +++ b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h @@ -249,8 +249,8 @@ namespace VoxelForgeCore // L'assembleur v1 encode coordonnees et scalaires en 1/256 de voxel, independamment des tuiles. inline constexpr std::int64_t WorldAssemblySubvoxelsPerVoxel = 256; inline constexpr std::uint32_t WorldAssemblySchemaVersion = 2; - // Version 12 gates passage supports on native rock and anchors the FI spiral inside a measured root. - inline constexpr std::uint32_t WorldAssemblyEvaluatorVersion = 12; + // Version 13 adds connected relief-bearing rock spans across native open-air passage gaps. + inline constexpr std::uint32_t WorldAssemblyEvaluatorVersion = 13; enum class FieldChannel : std::uint32_t { @@ -666,6 +666,17 @@ namespace VoxelForgeCore std::vector controlPoints; }; + struct PassageBridgeRangeAuditV1 + { + std::size_t passageIndex = 0; + std::size_t firstSegment = 0; + std::size_t lastSegment = 0; + std::uint64_t unsupportedSamples = 0; + double unsupportedLengthMetres = 0.0; + std::array startPointSubvoxels{}; + std::array endPointSubvoxels{}; + }; + struct ResolvedLayoutPassageConfigV1 { std::int32_t upperStrateIndex = -1; @@ -1314,6 +1325,10 @@ namespace VoxelForgeCore ShapeBuildStats buildStats() const; float densityAt(Vec3d voxelPosition) const; + // Audit-only view of connected rock spans planned for passage support. + std::vector passageBridgeRanges() const; + bool isPassageBridgeSample(std::size_t passageIndex, std::size_t segmentIndex, + Vec3d voxelPosition) const; // Audit-only selector provenance for the same point evaluator; never used by meshing. std::string densityDispatchPathAt(Vec3d voxelPosition) const; // Analytic source distance without the occupancy-preserving near-zero clamp or packed proxy. diff --git a/Standalone/Core/src/ShapeWorldInternal.h b/Standalone/Core/src/ShapeWorldInternal.h index aa0020b..75c07b7 100644 --- a/Standalone/Core/src/ShapeWorldInternal.h +++ b/Standalone/Core/src/ShapeWorldInternal.h @@ -41,6 +41,27 @@ public: double SealThickness=0.0; }; + const std::vector& GetPassageBridgeRanges() const + {return PassageBridgeRanges;} + + bool IsResolvedPassageBridgeSample(std::size_t PassageIndex,std::size_t SegmentIndex, + const VoxelForgeCore::Vec3d& Position) const + { + if(IsPassageBridgeSegment(PassageIndex,SegmentIndex) + &&PassageBridgeSignedDistance(PassageIndex,SegmentIndex, + static_cast(Position.x),static_cast(Position.y), + static_cast(Position.z))<=0.0)return true; + for(const auto& range:PassageBridgeRanges) + { + if(range.passageIndex!=PassageIndex)continue; + for(std::size_t segment=range.firstSegment;segment<=range.lastSegment;++segment) + if(segment!=SegmentIndex&&PassageBridgeSignedDistance(PassageIndex,segment, + static_cast(Position.x),static_cast(Position.y), + static_cast(Position.z))<=0.0)return true; + } + return false; + } + double GetCoreVoxelSizeCm() const { return Owner == nullptr || Owner->CoreVoxelSizeMicrons == 0 @@ -168,20 +189,19 @@ public: for(const auto& passage:ResolvedLayout->passages) composeRouteMouthSupport(passage.upperStrateIndex, passage.upperMouthSubvoxels,true); - for(const auto& passage:ResolvedLayout->passages) + for(std::size_t passageIndex=0;passageIndexpassages.size();++passageIndex) { + const auto& passage=ResolvedLayout->passages[passageIndex]; if(passage.controlPoints.size()<2)continue; - const double placementRadiusQ=static_cast(passage.placementRadiusSubvoxels) - +static_cast(passage.midRadiusSubvoxels); - if(qx*qx+qy*qy>placementRadiusQ*placementRadiusQ) - continue; const double firstFloorQ=passage.controlPoints.front().positionSubvoxels[2] -passage.controlPoints.front().radiusSubvoxels+playerCenterAboveFloorQ; const double lastFloorQ=passage.controlPoints.back().positionSubvoxels[2] -passage.controlPoints.back().radiusSubvoxels+playerCenterAboveFloorQ; if(qz>firstFloorQ+2.0*passage.mouthRadiusSubvoxels ||qz(passage.controlPoints.size())-1; @@ -204,8 +224,10 @@ public: const std::ptrdiff_t carveEnd=std::min(lowerMouthIndex-1, (carveLow-passage.controlPoints.begin())+1); double bestSignedDistance=std::numeric_limits::infinity(); + double bestPlayerCapsuleSignedDistance=std::numeric_limits::infinity(); double bestT=0.0; std::ptrdiff_t bestIndex=0; + std::ptrdiff_t bestSupportSegmentIndex=0; bool hasSupportFloor=false; double bestSupportDensity=0.0; const auto considerCarveSegment=[&](std::ptrdiff_t index) @@ -225,12 +247,37 @@ public: const double ex=qx-cx,ey=qy-cy,ez=qz-cz; const double radius=static_cast(a.radiusSubvoxels) +t*(b.radiusSubvoxels-a.radiusSubvoxels); + const double horizontalLengthSq=dx*dx+dy*dy; + const double playerT=horizontalLengthSq>0.0 + ?std::clamp(((qx-ax)*dx+(qy-ay)*dy)/horizontalLengthSq,0.0,1.0):t; + const double playerDx=qx-(ax+playerT*dx); + const double playerDy=qy-(ay+playerT*dy); + const double playerRadius=static_cast(a.radiusSubvoxels) + +playerT*(b.radiusSubvoxels-a.radiusSubvoxels); + const double playerCenterZ=az+playerT*dz-playerRadius+playerCenterAboveFloorQ; + const double playerVertical=std::max(0.0, + std::abs(qz-playerCenterZ)-0.54*qPerMetre); + const double playerCapsuleDistance=DeterministicSqrt( + playerDx*playerDx+playerDy*playerDy+playerVertical*playerVertical) + -0.34*qPerMetre; + bestPlayerCapsuleSignedDistance=std::min(bestPlayerCapsuleSignedDistance, + playerCapsuleDistance); const double signedDistance=DeterministicSqrt(ex*ex+ey*ey+ez*ez)-radius; if(signedDistance(8,lowerMouthIndex);++index) + considerCarveSegment(index); + const std::ptrdiff_t mouthSearchBegin=std::max(0,lowerMouthIndex-8); + const std::ptrdiff_t mouthSearchEnd=std::min(lastIndex, + lowerMouthIndex+8); + for(std::ptrdiff_t index=mouthSearchBegin;index(std::clamp(relief,-1.0f,1.0f))*0.24*qPerMetre*wallReliefWeight; + if(IsPassageBridgeSegment(passageIndex,static_cast(bestIndex))) + { + const double bridgeDistance=PassageBridgeSignedDistance(passageIndex, + static_cast(bestIndex),X,Y,Z); + composed=std::min(composed,static_cast(bridgeDistance/Q)); + } // Positive density is air; rough rock is cut with full side/ceiling detail and // gentler relief on the gravity-facing wall so the supported tread stays open. composed=std::max(composed,static_cast(-roughSignedDistance/Q)); @@ -264,7 +317,10 @@ public: const double radiusB=segmentB.radiusSubvoxels; // Keep the tread within the probe band and below the capsule's // lowest sampled point. - const double floorOffset=0.20; + const double floorOffset=IsPassageBridgeSegment(passageIndex, + static_cast(index)) + ?PassageBridgeDeckOffsetMetres(passageIndex,static_cast(index)) + :0.20; const double horizontalLengthSq=dx*dx+dy*dy; const double supportT=horizontalLengthSq>0.0 ?std::clamp(((qx-segmentA.positionSubvoxels[0])*dx @@ -304,6 +360,7 @@ public: if(supportDistanceSq>=bestSupportDistanceSquared)return; bestSupportDistanceSquared=supportDistanceSq; hasSupportFloor=true; + bestSupportSegmentIndex=index; bestSupportDensity=std::clamp(Z-floorVoxels, -supportThicknessVoxels,0.0); }; @@ -330,7 +387,11 @@ public: considerSupportSegment(index); // Keep route treads inside the native rock envelope. Carving may reopen the // floor above this point, but a support cannot create a new surface in air. - if(hasSupportFloor&&density<0.0f) + const bool bridgeFloorSupport=hasSupportFloor + &&IsPassageBridgeSegment(passageIndex, + static_cast(bestSupportSegmentIndex)); + if(hasSupportFloor&&bestPlayerCapsuleSignedDistance>=0.05*qPerMetre + &&(density<0.0f||bridgeFloorSupport)) composed=std::min(composed,static_cast(bestSupportDensity)); } return composed; @@ -343,6 +404,10 @@ public: { if(!ResolvedLayout||ResolvedLayout->passages.empty())return false; constexpr double Q=static_cast(VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel); + const double voxelsPerMetre=Owner&&Owner->CoreVoxelSizeMicrons>0 + ?1000000.0/Owner->CoreVoxelSizeMicrons:4.0; + const double bridgeHalfWidthVoxels=3.5*voxelsPerMetre; + const double bridgeFootDepthVoxels=(5.0-0.13)*voxelsPerMetre; for(const auto& passage:ResolvedLayout->passages) { for(std::size_t i=1;i(std::max(a.radiusSubvoxels,b.radiusSubvoxels))/Q; const double floorThicknessVoxels=Owner&&Owner->CoreVoxelSizeMicrons>0 ?1000000.0/Owner->CoreVoxelSizeMicrons:4.0; + // A resolved passage bridge extends to a 3.5 m half-width and almost 5 m + // below the bore floor. Keep those cells shape-dependent for classification + // and streaming even before its bridge ranges have been compiled. + const double horizontalExtent=std::max(radius,bridgeHalfWidthVoxels); + const double footDepth=std::max(floorThicknessVoxels,bridgeFootDepthVoxels); const double low[3]={ - std::min(a.positionSubvoxels[0],b.positionSubvoxels[0])/Q-radius, - std::min(a.positionSubvoxels[1],b.positionSubvoxels[1])/Q-radius, - std::min(a.positionSubvoxels[2],b.positionSubvoxels[2])/Q-radius-floorThicknessVoxels}; + std::min(a.positionSubvoxels[0],b.positionSubvoxels[0])/Q-horizontalExtent, + std::min(a.positionSubvoxels[1],b.positionSubvoxels[1])/Q-horizontalExtent, + std::min(a.positionSubvoxels[2],b.positionSubvoxels[2])/Q-radius-footDepth}; const double high[3]={ - std::max(a.positionSubvoxels[0],b.positionSubvoxels[0])/Q+radius, - std::max(a.positionSubvoxels[1],b.positionSubvoxels[1])/Q+radius, + std::max(a.positionSubvoxels[0],b.positionSubvoxels[0])/Q+horizontalExtent, + std::max(a.positionSubvoxels[1],b.positionSubvoxels[1])/Q+horizontalExtent, std::max(a.positionSubvoxels[2],b.positionSubvoxels[2])/Q+radius}; bool overlap=true; for(int axis=0;axis<3;++axis) @@ -715,6 +785,7 @@ public: if(RoundTunnelsEnabled) BuildRoundTunnelPrimitives(); BuildSpatialBins(LineBinSize); + BuildPassageBridgePlan(); Stats.LocalLineBinSeconds=std::chrono::duration(Clock::now()-Substage).count(); Stats.ShapeSeconds=std::chrono::duration(Clock::now()-Stage).count(); Stats.PrimitiveCount=Primitives.size(); @@ -1622,6 +1693,218 @@ public: } private: + bool IsPassageBridgeSegment(std::size_t PassageIndex,std::size_t SegmentIndex) const + { + return std::any_of(PassageBridgeRanges.begin(),PassageBridgeRanges.end(), + [PassageIndex,SegmentIndex](const auto& range) + {return range.passageIndex==PassageIndex + &&SegmentIndex>=range.firstSegment&&SegmentIndex<=range.lastSegment;}); + } + + double PassageBridgeDeckOffsetMetres(std::size_t PassageIndex, + std::size_t SegmentIndex) const + { + for(const auto& range:PassageBridgeRanges) + { + if(range.passageIndex!=PassageIndex||SegmentIndex>range.lastSegment)continue; + if(SegmentIndex>=range.firstSegment)return 0.13; + } + return 0.20; + } + + double PassageBridgeSignedDistance(std::size_t PassageIndex,std::size_t SegmentIndex, + float X,float Y,float Z) const + { + if(!ResolvedLayout||PassageIndex>=ResolvedLayout->passages.size()) + return std::numeric_limits::infinity(); + const auto& passage=ResolvedLayout->passages[PassageIndex]; + if(SegmentIndex+1>=passage.controlPoints.size()) + return std::numeric_limits::infinity(); + constexpr double Q=static_cast(VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel); + const double qPerMetre=Q*1000000.0/std::max(1, + ResolvedLayout->coreVoxelSizeMicrometres); + const auto& a=passage.controlPoints[SegmentIndex]; + const auto& b=passage.controlPoints[SegmentIndex+1]; + const double ax=static_cast(a.positionSubvoxels[0]); + const double ay=static_cast(a.positionSubvoxels[1]); + const double dx=static_cast(b.positionSubvoxels[0])-ax; + const double dy=static_cast(b.positionSubvoxels[1])-ay; + const double horizontalLengthSq=dx*dx+dy*dy; + const double qx=static_cast(X)*Q,qy=static_cast(Y)*Q; + const double qz=static_cast(Z)*Q; + const double t=horizontalLengthSq>0.0 + ?std::clamp(((qx-ax)*dx+(qy-ay)*dy)/horizontalLengthSq,0.0,1.0):0.0; + const double centerX=ax+t*dx,centerY=ay+t*dy; + const double centerZ=a.positionSubvoxels[2]+t*( + static_cast(b.positionSubvoxels[2])-a.positionSubvoxels[2]); + const double radius=a.radiusSubvoxels+t*( + static_cast(b.radiusSubvoxels)-a.radiusSubvoxels); + // Embed the deck 13 cm above the bore bottom: within the 25 cm support + // probe, while leaving 16 cm between it and the capsule's lowest sample. + const double floorQ=centerZ-radius + +PassageBridgeDeckOffsetMetres(PassageIndex,SegmentIndex)*qPerMetre; + const double relief=std::clamp(static_cast(VF_FieldSurfaceRelief(X,Y,Z, + static_cast(Owner?Owner->Seed:0))),-1.0,1.0); + const double halfWidth=(3.30+0.20*relief)*qPerMetre; + const double thickness=(4.0+1.0*relief)*qPerMetre; + const double horizontalDistance=DeterministicSqrt((qx-centerX)*(qx-centerX) + +(qy-centerY)*(qy-centerY)); + const double sideDistance=horizontalDistance-halfWidth; + const double topDistance=qz-floorQ; + const double bottomDistance=floorQ-thickness-qz; + const double verticalDistance=std::max(topDistance,bottomDistance); + const double outside=DeterministicSqrt( + std::max(sideDistance,0.0)*std::max(sideDistance,0.0) + +std::max(verticalDistance,0.0)*std::max(verticalDistance,0.0)); + const double inside=std::min(std::max(sideDistance,verticalDistance),0.0); + return outside+inside; + } + + float NativePassageDensityAt(float X,float Y,float Z) const + { + float density=0.0f; + if(!NativeFloatingIslandDensityAt(X,Y,Z,density) + &&!NativeSurfaceDensityAt(X,Y,Z,density)) + { + if(UsesLegacySurfaceField(X,Y,Z)&&Owner&&Owner->Generator) + density=Owner->Generator->GetDensityAt(X,Y,Z); + else + density=AnalyticDensityAt(X,Y,Z,true,nullptr,nullptr,nullptr, + false,false); + } + return ApplyResolvedStrateBoundaryBand(density,X,Y,Z); + } + + void BuildPassageBridgePlan() + { + PassageBridgeRanges.clear(); + if(!Owner||!ResolvedLayout||ResolvedLayout->passages.empty() + ||!Owner->PassageBridgeCache)return; + auto& cache=*Owner->PassageBridgeCache; + std::lock_guard lock(cache.mutex); + const auto cached=cache.byLayout.find(ResolvedLayout->stableIdentity); + if(cached!=cache.byLayout.end()) + {PassageBridgeRanges=cached->second;return;} + + constexpr double Q=static_cast(VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel); + const double qPerMetre=Q*1000000.0/std::max(1, + ResolvedLayout->coreVoxelSizeMicrometres); + const auto inSurfaceWorldStratum=[&](double zSubvoxels) + { + const double zMicrometres=zSubvoxels + *ResolvedLayout->coreVoxelSizeMicrometres/Q; + return std::any_of(ResolvedLayout->strates.begin(),ResolvedLayout->strates.end(), + [zMicrometres](const auto& stratum) + {return stratum.generatorKind=="SurfaceWorld" + &&zMicrometres>=stratum.interiorBottomMicrometres + &&zMicrometres,5> supportOffsets{{ + {{0.0,0.0}},{{0.45,0.0}},{{-0.45,0.0}},{{0.0,0.45}},{{0.0,-0.45}}}}; + constexpr std::array supportDepthsMetres{{0.125,0.25}}; + struct FPathSample + { + std::size_t segment=0; + std::array point{}; + bool nativeSupported=false; + }; + const auto nativeSupportedAt=[&](const std::array& point) + { + const double floorQ=point[2]-point[3]+0.13*qPerMetre; + std::uint32_t supported=0; + for(const auto& offset:supportOffsets) + { + bool hasSolid=false; + for(const double depth:supportDepthsMetres) + { + const double sampleZ=floorQ-depth*qPerMetre; + // Bridge spans address the measured SurfaceWorld void. Other native + // strata retain their own route/cave composition and are excluded here. + if(!inSurfaceWorldStratum(sampleZ)){hasSolid=true;break;} + float density=1.0f; + if(!NativeSurfaceDensityAt( + static_cast((point[0]+offset[0]*qPerMetre)/Q), + static_cast((point[1]+offset[1]*qPerMetre)/Q), + static_cast(sampleZ/Q),density))continue; + if(density<0.0f){hasSolid=true;break;} + } + supported+=hasSolid; + } + return supported>=3; + }; + for(std::size_t passageIndex=0;passageIndexpassages.size(); + ++passageIndex) + { + const auto& passage=ResolvedLayout->passages[passageIndex]; + if(passage.controlPoints.size()<2)continue; + std::vector samples; + samples.reserve(passage.controlPoints.size()*2); + const auto pointAt=[&](std::size_t segment,double t) + { + const auto& a=passage.controlPoints[segment]; + const auto& b=passage.controlPoints[segment+1]; + FPathSample sample;sample.segment=segment; + for(std::size_t axis=0;axis<3;++axis) + sample.point[axis]=a.positionSubvoxels[axis]+t*( + static_cast(b.positionSubvoxels[axis]) + -a.positionSubvoxels[axis]); + sample.point[3]=a.radiusSubvoxels+t*( + static_cast(b.radiusSubvoxels)-a.radiusSubvoxels); + sample.nativeSupported=nativeSupportedAt(sample.point); + return sample; + }; + samples.push_back(pointAt(0,0.0)); + for(std::size_t segment=0;segment+1(b.positionSubvoxels[0])-a.positionSubvoxels[0]; + const double dy=static_cast(b.positionSubvoxels[1])-a.positionSubvoxels[1]; + const double dz=static_cast(b.positionSubvoxels[2])-a.positionSubvoxels[2]; + const double lengthMetres=DeterministicSqrt(dx*dx+dy*dy+dz*dz)/qPerMetre; + const std::size_t intervals=std::max(1, + static_cast(std::ceil(lengthMetres/0.5))); + for(std::size_t step=1;step<=intervals;++step) + samples.push_back(pointAt(segment,static_cast(step)/intervals)); + } + std::size_t cursor=0; + while(cursor=samples.size())continue; + double gapLength=0.0; + for(std::size_t index=gapBegin;index<=gapEnd;++index) + { + const auto& a=samples[index-1].point; + const auto& b=samples[index].point; + const double dx=b[0]-a[0],dy=b[1]-a[1],dz=b[2]-a[2]; + gapLength+=DeterministicSqrt(dx*dx+dy*dy+dz*dz)/qPerMetre; + } + if(gapLength<1.0)continue; + FStandalonePassageBridgeRange range; + range.passageIndex=passageIndex; + range.firstSegment=samples[gapBegin-1].segment; + range.lastSegment=samples[cursor].segment; + range.unsupportedSamples=gapEnd-gapBegin+1; + range.unsupportedLengthMetres=gapLength; + range.startPoint=samples[gapBegin-1].point; + range.endPoint=samples[cursor].point; + PassageBridgeRanges.push_back(range); + std::printf("[PassageRockBridgePlan] id=%s first_segment=%zu last_segment=%zu unsupported_samples=%llu gap_length_m=%.3f connected_start=1 connected_end=1 width_m=6.000 thickness_m=3.000..5.000 status=PLANNED\n", + passage.stableId.c_str(),range.firstSegment,range.lastSegment, + static_cast(range.unsupportedSamples),gapLength); + } + if(std::none_of(PassageBridgeRanges.begin(),PassageBridgeRanges.end(), + [passageIndex](const auto& range){return range.passageIndex==passageIndex;})) + std::printf("[PassageRockBridgePlan] id=%s spans=0 status=NOT_REQUIRED\n", + passage.stableId.c_str()); + } + cache.byLayout.emplace(ResolvedLayout->stableIdentity,PassageBridgeRanges); + } + static uint64 PackLatticeKey(int32 X,int32 Y,int32 Z) { constexpr uint64 Mask=0x1FFFFFull; @@ -1656,17 +1939,19 @@ private: float* OutDetailDisplacement=nullptr, float* OutCaveInfluence=nullptr, float* OutFloorInfluence=nullptr, - bool bApplyEdits=true) const + bool bApplyEdits=true,bool bApplyComposition=true) const { if(SharedDensitySource)return SharedDensitySource->AnalyticDensityAt(X,Y,Z, - bClampNearZero,OutDetailDisplacement,OutCaveInfluence,OutFloorInfluence,bApplyEdits); + bClampNearZero,OutDetailDisplacement,OutCaveInfluence,OutFloorInfluence, + bApplyEdits,bApplyComposition); if(OutDetailDisplacement)*OutDetailDisplacement=0.0f; if(OutCaveInfluence)*OutCaveInfluence=0.0f; if(OutFloorInfluence)*OutFloorInfluence=0.0f; float IslandDensity=0.0f; if(NativeFloatingIslandDensityAt(X,Y,Z,IslandDensity)) { - const float composed=ApplyResolvedStrateComposition(IslandDensity,X,Y,Z); + const float composed=bApplyComposition + ?ApplyResolvedStrateComposition(IslandDensity,X,Y,Z):IslandDensity; return bApplyEdits?ApplyEditBrushes(composed,X,Y,Z):composed; } if(UsesLegacySurfaceField(X,Y,Z)) @@ -1674,11 +1959,13 @@ private: float NativeDensity=0.0f; if(NativeSurfaceDensityAt(X,Y,Z,NativeDensity)) { - NativeDensity=ApplyResolvedStrateComposition(NativeDensity,X,Y,Z); + if(bApplyComposition) + NativeDensity=ApplyResolvedStrateComposition(NativeDensity,X,Y,Z); return bApplyEdits?ApplyEditBrushes(NativeDensity,X,Y,Z):NativeDensity; } const float Density=Owner->Generator->GetDensityAt(X,Y,Z); - const float composed=ApplyResolvedStrateComposition(Density,X,Y,Z); + const float composed=bApplyComposition + ?ApplyResolvedStrateComposition(Density,X,Y,Z):Density; return bApplyEdits?ApplyEditBrushes(composed,X,Y,Z):composed; } const bool bInsideFine=X>=Min[0]&&X<=Max[0]&&Y>=Min[1]&&Y<=Max[1] @@ -1693,7 +1980,8 @@ private: if((Density<0.0f)!=bRock||(bClampNearZero&&std::abs(Density)<0.05f)) Density=(bRock?-1.0f:1.0f)*std::max(std::abs(Density), bClampNearZero?0.05f:1.0e-7f); - const float composed=ApplyResolvedStrateComposition(Density,X,Y,Z); + const float composed=bApplyComposition + ?ApplyResolvedStrateComposition(Density,X,Y,Z):Density; return bApplyEdits?ApplyEditBrushes(composed,X,Y,Z):composed; } ESurfaceFamily SurfaceFamily=ESurfaceFamily::Strata;float SurfaceSDF=100000.0f; @@ -1723,7 +2011,7 @@ private: if((Density<0.0f)!=bRock||(bClampNearZero&&std::abs(Density)<0.05f)) Density=(bRock?-1.0f:1.0f)*std::max(std::abs(Density), bClampNearZero?0.05f:1.0e-7f); - Density=ApplyResolvedStrateComposition(Density,X,Y,Z); + if(bApplyComposition)Density=ApplyResolvedStrateComposition(Density,X,Y,Z); return bApplyEdits?ApplyEditBrushes(Density,X,Y,Z):Density; } @@ -5863,6 +6151,7 @@ private: std::vector FarConnectorSegments; std::unordered_map,FBinHash> FarConnectorSpatialBins; std::vector EditBrushes; + std::vector PassageBridgeRanges; std::array AxisBins; std::unordered_map SpatialBins; std::unordered_map CriticalAirBins; diff --git a/Standalone/Core/src/VoxelForgeCore.cpp b/Standalone/Core/src/VoxelForgeCore.cpp index c6e8c89..156c0d3 100644 --- a/Standalone/Core/src/VoxelForgeCore.cpp +++ b/Standalone/Core/src/VoxelForgeCore.cpp @@ -1164,6 +1164,44 @@ namespace VoxelForgeCore } return false; } + + bool ResolvedPassageTouchesBox(const ResolvedLayoutSnapshotV3& layout, + const FIntVector& minimum,const FIntVector& maximum,std::uint32_t coreVoxelSizeMicrons) + { + if(layout.passages.empty())return false; + constexpr double Q=static_cast(WorldAssemblySubvoxelsPerVoxel); + const double voxelsPerMetre=coreVoxelSizeMicrons>0 + ?1000000.0/coreVoxelSizeMicrons:4.0; + const double bridgeHalfWidthVoxels=3.5*voxelsPerMetre; + const double bridgeFootDepthVoxels=(5.0-0.13)*voxelsPerMetre; + const double tileMinimum[3]={static_cast(minimum.X), + static_cast(minimum.Y),static_cast(minimum.Z)}; + const double tileMaximum[3]={static_cast(maximum.X), + static_cast(maximum.Y),static_cast(maximum.Z)}; + for(const auto& passage:layout.passages) + for(std::size_t segment=1;segment(std::max( + a.radiusSubvoxels,b.radiusSubvoxels))/Q; + const double horizontalExtent=std::max(radius,bridgeHalfWidthVoxels); + const double low[3]={ + std::min(a.positionSubvoxels[0],b.positionSubvoxels[0])/Q-horizontalExtent, + std::min(a.positionSubvoxels[1],b.positionSubvoxels[1])/Q-horizontalExtent, + std::min(a.positionSubvoxels[2],b.positionSubvoxels[2])/Q-radius + -bridgeFootDepthVoxels}; + const double high[3]={ + std::max(a.positionSubvoxels[0],b.positionSubvoxels[0])/Q+horizontalExtent, + std::max(a.positionSubvoxels[1],b.positionSubvoxels[1])/Q+horizontalExtent, + std::max(a.positionSubvoxels[2],b.positionSubvoxels[2])/Q+radius}; + bool overlap=true; + for(int axis=0;axis<3;++axis) + overlap&=high[axis]>=tileMinimum[axis]&&low[axis]<=tileMaximum[axis]; + if(overlap)return true; + } + return false; + } } bool World::compile(const ShapeBuildRequest& request,const JobScheduler& scheduler,std::string& error) @@ -1246,6 +1284,8 @@ namespace VoxelForgeCore if(IntersectsBox(feature.minimumSubvoxels,feature.maximumSubvoxels, subMinimum,subMaximum))return false; if(RouteTouchesBox(*selectedPlan,subMinimum,subMaximum))return false; + if(ResolvedPassageTouchesBox(*impl_->resolvedLayout,boundsMin,boundsMax, + impl_->owner->CoreVoxelSizeMicrons))return false; if(OwnerPassageTouchesBox(*impl_->owner,boundsMin,boundsMax))return false; FStandaloneShapeWorld proofGeometry; if(!proofGeometry.BuildShapeDependencyProof(*impl_->owner,boundsMin,boundsMax, @@ -1502,6 +1542,28 @@ namespace VoxelForgeCore float World::densityAt(Vec3d position) const { return impl_&&impl_->shapeReady.load(std::memory_order_acquire)&&impl_->shape?impl_->shape->DensityAt(static_cast(position.x),static_cast(position.y),static_cast(position.z)):0.0f; } + std::vector World::passageBridgeRanges() const + { + std::vector result; + if(!impl_||!impl_->shapeReady.load(std::memory_order_acquire)||!impl_->shape)return result; + const auto& ranges=impl_->shape->GetPassageBridgeRanges(); + result.reserve(ranges.size()); + for(const auto& range:ranges) + { + PassageBridgeRangeAuditV1 value; + value.passageIndex=range.passageIndex;value.firstSegment=range.firstSegment; + value.lastSegment=range.lastSegment;value.unsupportedSamples=range.unsupportedSamples; + value.unsupportedLengthMetres=range.unsupportedLengthMetres; + value.startPointSubvoxels=range.startPoint;value.endPointSubvoxels=range.endPoint; + result.push_back(value); + } + return result; + } + bool World::isPassageBridgeSample(std::size_t passageIndex,std::size_t segmentIndex, + Vec3d position) const + {return impl_&&impl_->shapeReady.load(std::memory_order_acquire)&&impl_->shape + &&impl_->shape->IsResolvedPassageBridgeSample(passageIndex,segmentIndex, + {position.x,position.y,position.z});} std::string World::densityDispatchPathAt(Vec3d position) const { return impl_&&impl_->shapeReady.load(std::memory_order_acquire)&&impl_->shape ?impl_->shape->DensityDispatchPathAt(static_cast(position.x),static_cast(position.y),static_cast(position.z)) diff --git a/Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md b/Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md new file mode 100644 index 0000000..2d62bf3 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md @@ -0,0 +1,144 @@ +# World Assembler L26 — passages walkable in rock + +**All four styles pass for both recipes.** Clang and GCC report zero blocked capsule samples, zero +unsupported samples, zero grade failures, zero open-air violations, passing naturalness, and passing +route bindings. The L24 open-air control and L23 smooth-wall control were detected. + +## Where support was missing + +In the owner SurfaceWorld recipe, the default Spiral passage has 1,083 control points. Its unsupported +bridge range is segments 98–1077, a 1,957.395 m gap. Segment 98 is at about `(0,-5,-142.7) m`; segment +1077 is at `(-4.6,-1.9,-497.4) m`. Both are inside the SurfaceWorld stratum (`-632..-120 m`), below +its native terrain. The gap starts after the TunnelNetwork transition; it is neither TunnelNetwork +cave air nor a stratum seam. The first L25 failure sample had only 2/5 native support probes, and +following samples had 0/5. Their dispatch path was `SurfaceWorld-native`. + +Core now scans the native field sign and adds a deterministic bridge only over contiguous unsupported +ranges. The shared density field gives the bridge at least 5 m width, 3–5 m planned thickness and +surface relief. The audit measured two connected ends, at least 5 m width, 256/256 cross-sections, +3.5–6 m thickness and 2.5 m relief on the default Spiral. All four SurfaceWorld styles use connected +bridges; Floating Islands already has supporting rock and needs none. The capsule clearance gate also +checks the resolved player capsule, fixing FI styles 0/1/3 at their bent mouth segments. + +The first bridge export still contained no passage mesh because tile readiness classified all nearby +tiles as native-only. Resolved passage and bridge bounds now keep those tiles shape-dependent. The final +local export changed `shape_free_desired` from 27/27 to 4/27 and contains the composed bridge density. + +## Eight-row audit + +Counts are from the Clang W12 run; GCC W12 matched every row. `B/U/G` means blocked, unsupported and +grade failures. Route bindings are required bindings passed / required bindings. + +| Recipe | Style | Capsule samples | Support samples | B/U/G | Open-air samples / violations | Wall relief | Bindings | Bridge segments / length | +|---|---:|---:|---:|---:|---:|---:|---:|---| +| SurfaceWorld | 0 | 301,140 | 32,765 | 0/0/0 | 3,887,808 / 0 | 0.472 m | 1/1 | 30–293 / 2,004.318 m | +| SurfaceWorld | 1 | 284,949 | 31,046 | 0/0/0 | 3,707,328 / 0 | 0.449 m | 1/1 | 33–357 / 1,945.857 m | +| SurfaceWorld | 2 | 275,877 | 30,072 | 0/0/0 | 3,664,064 / 0 | 0.410 m | 1/1 | 98–1077 / 1,957.395 m | +| SurfaceWorld | 3 | 287,154 | 31,298 | 0/0/0 | 3,741,792 / 0 | 0.552 m | 1/1 | 34–373 / 1,980.607 m | +| Floating Islands | 0 | 50,589 | 4,407 | 0/0/0 | 695,616 / 0 | 0.779 m | 2/2 | none | +| Floating Islands | 1 | 57,015 | 5,060 | 0/0/0 | 742,016 / 0 | 0.806 m | 2/2 | none | +| Floating Islands | 2 | 61,173 | 5,318 | 0/0/0 | 813,632 / 0 | 0.767 m | 2/2 | none | +| Floating Islands | 3 | 54,369 | 4,325 | 0/0/0 | 743,456 / 0 | 0.681 m | 2/2 | none | + +Every row passed naturalness (0 m flat run; relief threshold 0.2 m), route binding and strict layout +validation. The validator accepted with zero issues and rejected its malformed controls 9/9. Each L24 +open-air negative control and L23 smooth-wall negative control was detected. + +## Captures + +All are 16:9 JPEGs below 300 KB in `captures/`: + +| Capture | View | Size | SHA-256 | +|---|---|---:|---| +| `sw-passage-outside.jpg` | Midspan from outside, 1920×1080 | 90,937 B | `28378eeee755faf7446c0b2ce0eb8d2368c79b42f7de4c15e8b2f4d58fb7754d` | +| `sw-passage-inside.jpg` | Eye-height at first bridged segment, 1600×900 | 47,519 B | `ccadc33c36366a0ca7b2fcda0a21e4cea67bda107f0e20015171fd620d495249` | +| `sw-natural-bridge-wide.jpg` | Wide midspan view, 1920×1080 | 70,192 B | `f4a66fec1adebfbdf5806bb2e7c5a6470e3e8d9dcd60f495d930bbb1d0c5669e` | +| `fi-pillar-exterior.jpg` | Floating Islands pillar exterior, 1600×900 | 35,857 B | `b977ff34acee1294a24c2465b1c9d3d78014cff4b8eceb667f317a0a0b46cc67` | + +## Determinism and regressions + +The L25 hash command was rerun with the L26 binaries for both recipes, W1/W8/W12, Clang/GCC: + +```sh +timeout 1800s taskset -c 0-11 env LP_NUM_THREADS=12 prlimit --as=6442450944 -- \ + Saved/Linux/bin/VoxelForgeCoreHeadless-linux26- \ + --world-assembler-prototype --stream-benchmark --stream-pipeline --stream-hash --force-generate \ + --clip-radius=3 --max-clip-level=8 --far-horizon-lod8-step=0 --workers=N \ + --recipe= Standalone/data/owner_world.json +``` + +All six runs per recipe matched. Hash vectors are density / mesh / payload / topology; full detail is +960 tiles and whole view is 2,370 tiles. + +| Recipe | Full detail | Whole view | Exact query: density / unclamped / detail / collision | +|---|---|---|---| +| SurfaceWorld | `ace56c8f205238ad / a9c603a1248de6b8 / ea55f1f4fcc6a894 / 5ea7bc78a1b678ae` | `307d5df80e0165b4 / 1d61f30e5733beca / 3aaef136176c4b12 / aa5ff7c2a821196f` | `c949c4df2ce6f9d9 / c949c4df2ce6f9d9 / 114c501e2d830d94 / e6011d3a248d4849` | +| Floating Islands | `d18e722b37a2479e / 0e410a8e80a3e7f7 / 0751926f0c67d8a4 / f01208bc2f7841ec` | `51decfb71d282506 / 69448ec1c7fc954f / e2ff37c98fe8e494 / 5beeb7f94fdbf3d4` | `7b7c50ac24ccadcc / 7b7c50ac24ccadcc / efcba20c0c70c415 / e604823a249029bf` | + +The 24 m crossing passed for both compilers and recipes. Each processed 314 moving tiles, with identical +compiler hashes. Moving-tile vectors (density / mesh / payload / topology): SurfaceWorld +`3561ea23485e359f / e8331620fb0fb908 / 765f7dad67c852aa / 3ccc09ac81c05d71`; Floating Islands +`e3d0ea833bca4215 / 6b3d0f148ed83d93 / d6ed85f16acd895e / 9745683036522461`. + +SurfaceWorld away from the passage was compared directly between L25 Clang and final L26 Clang at +`--camera=10000,10000,-100,0,0`. Full detail, whole view, all LOD0–8 rows and exact-query hashes were +identical (12/12). Full-detail vector: `1c6abc5e9c657e98 / a1624a3c19bbe554 / bf98934c9d846f3a / +bbdc2a6b821c66d6`; whole-view vector: `40c2be0c7bbdaf28 / 7d9ac2a85020dc7d / c378e48bab2d194f / +81014ec4b888107a`; exact-query vector: `482500abbe835b11 / c4948c7179963784 / efcba20c0c70c415 / +137e8f6c0b03a624`. + +Strict validation passed on both compilers and recipes. L13 route parity passed on both compilers/recipes: +8/8 page pairs, 14 higher-LOD pairs, one edit pair, 782,026 exact-query samples and zero mismatches. +For L9 proofs, the passage-centered view has no eligible native blocks. At the same 10 km away-from-route +view, SurfaceWorld checked 4,848 blocks / 6,452,688 samples with 1,296 fallbacks and zero violations +on both compilers. Floating Islands had its expected 21,504 unknown fallbacks and zero violations. +Final headless binary SHA-256: Clang `fc0a5a74f17566384e094cb2429d8925147dd3eb32fb925417393e00c9bb19d5`; GCC +`54843bef3a64087e55d3eb9a76fb0856162b6ad9aeb03d6e1c204c3e91d21ca5`. + +Clang built with FP contraction off; GCC used its default FP mode. Both built and started without the L3 +FP-contract self-test rejecting them. Core evaluator version is 13; FI geometry remains 7 and layout +schema V3 is unchanged. Changes are shared Core, standalone audits, Linux build output configuration, +and ARCHITECTURE §8.44 / CODEMAP §3.27. No Unreal files changed, and no async path was added. The L4 +`FLazy`, L7 cache, L9/L12 proofs, L11 readiness/crash handling, L13 binding, L18/L19 ceiling, +L21/L22 layout and bands, L23–L25 passage/helix, §8.10 and CLAUDE.md async rules remain intact. + +## Failed and retried runs + +- The first build command used an invalid `clang` variant; corrected to Clang/GCC variants. Early build + iterations R3–R6 had compiler errors and were corrected before final binaries were produced. +- An unsupported `--world-assembler-audit` option exited 2; the correct option is + `--audit-resolved-layout-passages`. One early invocation omitted that flag and performed no passage + audit. Early bridge probes also segfaulted while crossing stratum dispatch; final audits use bounded + resolved-layout queries. +- Support iterations R22–R30 exposed successive failures: FI style 0 had 767, then 27, then 5 blocked / + 33 unsupported samples; an offset experiment caused 746 unsupported samples; a control-point capsule + reference left 7 blocked samples. Correcting the capsule reference cleared those. R30 still had SW + bridge sections 254/255, four SW style-1 mouth blocks, and an invalid SW style-2 bridge thickness + sample. R31 corrected them; final matrix is clean. +- The first final audit batch labeled FI JSON files as Floating Islands but omitted `--recipe`, so those + invocations used SurfaceWorld. All 16 style audits were rerun with explicit recipe flags. An initial + proof run used `--force-generate`, which disables L9 block auditing; it was repeated without that flag. + The validator-only command also exited 2 until the required streaming flags were included; all four + corrected strict-validator runs passed. +- `FloorProfileBlend` still reports its L25 alternate-style failures: SurfaceWorld style 1 is 2.544 vox + over the 2.000 threshold and style 3 is 3.645 vox. Both values are identical in the L25 logs; they are + pre-existing and are not capsule, support, open-air or naturalness failures. +- Initial capture attempts used a wrong yaw and missed/partially missed the FI export volume. After + correcting the view and centering the export, the final captures above were rendered. Several inside + camera placements showed wall-only or void-only views; the selected interior frame is at the first + bridged segment. + +No run exceeded 30 minutes or remained stuck for 15 minutes. Exports and logs are under `Saved/Linux/`; +this round added only this report and the four small JPEGs under `Standalone/`. An unrelated pre-existing +untracked `Linux18/exports/` directory was left untouched. No Unreal edits, commit, push or stash were made. + +## Orchestrator review (Claude) — side branch, not merged + +- The audits pass (8/8 rows at 0/0/0), but the SW "natural bridge" is a ~2 km rock ramp spiralling through the + open SurfaceWorld sky from the ceiling (≈−143 m) to the ground (≈−497 m). `sw-natural-bridge-wide.jpg` and + `sw-passage-outside.jpg` show fragmented floating slabs with thin shard spikes: not natural, and visible + from far away. +- Decision (delegated by the owner): one shared mechanism for every strate. When a passage must cross a large + open void inside a strate, it descends inside a natural rock column (ceiling-to-ground, like a + stalactite/stalagmite pair joined), with the spiral tunnel inside, generalising the L25 FI anchor root. + No long bridges through open air. Implemented in L27 on `wip/l25-helix`. diff --git a/Standalone/Research/WorldAssemblerM3/Linux26/captures/fi-pillar-exterior.jpg b/Standalone/Research/WorldAssemblerM3/Linux26/captures/fi-pillar-exterior.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11f91180d6b9e5cf5fd53d871efe1aa79f73a6cc GIT binary patch literal 35857 zcmeFZ2V7HI);D}Y6H!s5NtKHVLX3z=uii@$3~&Jn5SoJ0BAp0?mQk-X0R`#xQbh<6 zA@rsYB3%ds482Py^v-vjd1rnz&y@F>_xZl}d!Ctle!nF9>~oUrz4l)Ftp9(lwT}mm zkAQRV2TyEeB(F=#UzfZg2^zd_VqF`@H~O zIR^pg=l}+KM*0&cm>EygL%vtCo&SM>QBs)Q;O2wdOzywq`1oV7)aw(M#ywUIOS*sc z;g^i_FCEqpSJU!OUl%P9Xa0`EBPSMC1?a4aSS~?G2V5!md(L#Y%t1)LP zUc}S-ol4AHm0l92?rBNn4HC_5MMSqhsIZXg>X5Y3#jd0zS%;i8$d3K=3&-COGGyT6 z7j&wz-Hw7)ma>hH-N5^)S{rI;ZwE@U7Oqz(#9F<)F?z>4Ez^A^@1=B&Ym|(RIzps6 zQUT!{CpukprfH`MNWOToHE7`a!qI-_F;LiX3$U3c!K^!2NDHj+%!toR1R@CkoID*vKY ziyMdaxcLRyk3E|_3+#V}QIdx~`@h6|$fHhnk@86}OFS$LmJ-e;5r~wB9(B zJ@|5OU?&RK8z41Oc#b;tCuR z2+r*Jp`o+v?5#GpHPrrW9Jq2|(S12k6qU@0L$S*ca?xyT{4;jG>T2|g-<*hut9kp;2bv^XU%PZUK??Se~n|5TiL;(h}k+-Uq7 zw4z1don^!ly@?w!cW(~W=ot=57^(uQz&VWPvLhLcc% z;wqgAA3?K8I!0Q}Om|eJC>Rg~h|T+;gpA39CLsWxwh zR>(!-Znhf}{!pjEc(KG^G{5%88^*Ob^~4gE9K$Gt&}1Z8AtWTyQ%WiGhb3iIE%HWe z(*4G8MmwL}ihK)nveP9@p}MO9Tm924xKdW$o@)(S$wGh?v$_yisCiakzpiw0Vs*B$ z*8jk&I!ALeIBtATwsxw8vs@o8sdyv;AIK$4ufKfK5*Wx|pfr;AsVV{`A#)7eug32$ zhaZ*59t3Bv7G)vZy50w_>?I=t0!z4{u5WBekBf^eW+-Jmp(DFaf&Ce)AHjQ`lDGX# z33i8{oGnQlCV630RGquI9;yjWdfs7g)#6!n@gc8tVMWwFJ@ptE-K^hC2%3_Q#rT)4 z79Jk_4$bd+7_}I*rMefGcZ7OllG&mnWqJ&pv(##7q*k$}ZMFnw&AD6EEzLa>aOR89 z!*PN$FMnp=eekgS@YSipx}Z~Yq}$yGoS)T|TKKtPqD1&JIq(`js>;LNd9@5{l&MqjK!FcOEU6KW) zZ(cz#reOR)OaGZF(@ucJy_QBIZk49KfQeWbSaN_gW1=z@Wda3RX6H6*_snvA%JF`b zmm?Ri3;3*iSklcaEfnmXC?ZzQRlO8Y*N`nBz8|4P>_RU#<*6W(t%@sW-_C4Uic1&P z*cUBX201527UZ_Qkma0ATH&Xnh-?;w5k8;Ai1(|rx!d}g)!vrXV^JR; zZA}#FiERfgDu$7+reZwxJS(YLj~Ck0QI&_#VL!`&yAv;WGG!mvDh*z7Y$YqXOBd-7 zZK{)XeJ;7rP$NX@uCn}@*8WQs&+G+;zgv*2KTDqN`dB2P#kuCTf|(c#rEDsUzK1-E z_8R?ZyYRrmXLW;0seN3mWIkH`t=aW#I#-SFV}^lA7tfxfH4U3a5QNUnm5kDYDWWcrJZw}tby;d9r+36rE4WwG8(_n9(tb?Te437Z>~ zp{%DiavrGOky&^4JmHO_n~ZPqbTl(8lm8hnpzU`>SRS`q`&gb;Jc(_R9XP!sN~99w z&(7)(0XxHO1h0Vp(-ZUV8kKO9%j%ef8FZJxrj*%`)+cm+Xz*Z)vUH88wU4+`ebL@2 z90}E>mCWVu&MsY~OP1)mw{6egN#HkfQtxX0VUA2Tns!5(`2?9$tB!`Hc8Zc^E)1DO z_8sw4ZNr2sFZnDf>}uqF3W$2#H7M3QS*BDRE~AL@S?hsm_b$tFg{#loh{*fAlWDFI zSPU@fKE&sbPc9uQxvf}5t;*K=jYJgFd^{#b>a4^git+rIAft^Fs5S=zw9ku%bF*n7 znx%Fn*-Lv223<$=OE7AFott5G?LAt#i5P8Iuzlg-S@hV*+=!!neFB#&;S=F8o^3wJ z5+SO0ZrXbB1o{{V_;L(T?2ds~nYk4O%XWJ|)sAn9uBPQU5@$&9XDTx56^x?#Qc1t~ z$mKPfGwMdY=zlv`6&cqJ-|-kL1s5?G?5?i2WJS2TUO7A84qeo*8^iDWYoE+@Y1gW< zM+#p$oa!t#Z>}kbc|q>_q$K*0ymY96(JRlHhp|gH_S&>L6qQRxT}Il-O7iu33_Z2x zTq(9dj^xl3R15sLjiSO7gY|Xwa;40>%Qi12$B9YtAK1FnZg+UpjdH5yU(aP-=tiTH zH@@cgB1B&}zv#vgEA=We(V($cUQ2gf(VO5S+LmV`YAjPoDW&bUAL&msm>8C{nXje> z-Ej`)x>~pwU#j1@hLtRjldD4~B<$O!1cehm_AI3HA7-#lwa=~9np5p!{LHQRwzNK} zO5D(JOgb>j+)Q0vR(ZVh1W2a3DweK{uSJy%s0Zl+Kip^Zs%NGvSjAqg!*ZIdF;mFZ zPCmBjZF`R)n8`xV(!=hFu8Z-h2lbr^hl*e53EJbUA-`m1TtYUrq9o4&1XPawTaq=O z8odb;gWG=(Ed7+vbJG+u3{>NK-rp&iJbdlsRZYM9~QB|IQ+tcH(b*|@*lU7Mr7%SYhw@}&Ag~MI; zatf4amD#rR2K}TL2?a<)LJpJ-Nht;`sszf<0gm+w&NFU7K^`xynkUMg(NPp~+J_v*@x4&W8L_X2J`uTXu(}tOt*B*eimOtIlU6(u5M?+xa1MS-=06be+TU4tZ>h!BwqLho zghEz$P(=BApzy6E3R$%Xf01)%@{=(6)>e0iO|dDBsp=8Q&)ObuKZoks*r;bfQj(ES z*;<_9@JwtWyveCpVcX`1?b$2$xeeB#L_yHr2^dP; z(*M$U^tsm1vYs;bC2gax)bkCp4F9455!2m2cr7cxR(WoUxjrYu0;1h{W_N5n-D^_I=B?CqwcunZz2`X|src!O)|X`%G2n zg@TF^6>C-5wV#Up10*z5FvJNTG<$({pmRHsz^|0G0&JG+r*pX&59vqdil~wrx9%47 zpao3ia>OKMlHHN8w>w&=cRY60u`1cdYbBf8go>MRUE7hD7G4vHG+eHIxB=gETY8A_ zxOQsLc~$xx`gWHCPQ(u&{W2spiJNKGv7w8S#rs>AZk<$|v~W_sAI zao{2OIV5`hXGX4Z;8ApJ+g-y=+?-DmwJaowTEd&ut}hlEbs;WA=AGB* zu2z0jY=Mq`1pcl&oTS1ZB)1yY)nBl&d37v3=K4um=!YCP-uwoT4NI(c_8sX!i%WHkKAIT|c_doTM|7jTMtdagVkF7u-mM zuR}oyK)_O~cpzE76=D#~(AAPt@jC;3{Xt3QSDY3xNYZr={I=Hcf#7TMg%Rt9Ig4iU|HR?lo2d2Fb$_r8XXg8gx!bP z9X0-hY%P^LMb2xRJn<(;`)x}lI(w-SX6Ey9nXg}LhVC{YJ$mdwbU0ef#5>)-bX~Of zXw~ofb-}Yun|vdO*O23sngEmyZP#t3G2v#vbnAne!>;YnzDJ38*G3DDUQ&LN@UCx@ zQ@3flUWwUg6u-X2d$uC0W%_AZG9bFOEsQU>bLZ6t_7L0nasZ@W-3A1Bvnh2c@oQCwm%gY zP4WWX?E#1%@|fvTpz~^MpWf3|nL;ctL)cBs zi0*NxWtiZIJKyY9^%#rSdhhsl$=>V58r{kR7?JBBow0%EVdLX&N&m0TTnUL0luPl! zR}0kxMx;94(lgK9ph!2eZ#B7Y?UX}!n#GNVakh&g)(Kai&#RqF1%yBY48o^}J%a^+ z%MfEMM^6LGoHHPH16+@Ekq!`|O8%bpMKm!mE0?6R**BgBYsd6v!!e#SVH$bvjeeR3 z#byb3xoIijL)IsWyS9XU3^lH>!`WONeB7qO;repm6ZiboMRTuv-}XDT^G<6SL?-T_ zObZc|Vc7Vj3_)aFsd8||pfpYH+rJdlRXmKZ2uiAs((PNNX+n1=%@avJN!Bmq3TDPi zSC`R5+?p4VHBxQwIj0zTp^a=$N{T7+D%+G|Q<90ol=U_*ID|%}D2cNA*Q)4DH%9M# zF!7fqp$s>NoX}3~a2HW)8z^V_H*NB#_lFuI@2w=PrYY^syVff3*je6Lc#M<&D1TlO zG&xtRVrtebIA*I0UyavIQswbkxB(~e>q?TZpt?LGd&3a+DRAP1H%`6ZPs7tyFps>? zjj1jBL;3v$e{vxs5MUrBOj$W z+qTWDXaeSto{EwJo*LKbG&OZD)LA(s%x+_Eg}Y^nz<@KEv}^tVciEj6h%`0kGRrzG zkG*Gvt^APrsw6`)&QJ~?ptrkf2y?)TMT$kZ#x+<3SaY8N;h~n(F;IdYJ-DDci>;~r zCFRn)!zr)8l)#Hw^AZ8;FUv?_#g_VV1p8aDOQ$uaH|uiSqRyfgoPEbbKSsZ9 zweN_o;fyq=5i*ruulvS7Sy8sfbn#RrYsE>!y+U7lMWvsyb5<-}FKq{X4kMXDhSHO> zphEoN*j&jAEL%DZx_dFaBRFeba=sE8f5p9rj1S_(I}F?JRVO2S^>*RAEKn|)!&Br< zIfWs2Q0b#&`?=61%NBy>kV)jxRqWC zF$WXV|qY7^cxi+s~5JD3ZZ~?sL##>q(?ei+0 zH?w|DQ#to9rK5isUzKCPX0N>Bi8w}XB5^NJt~@6`938Pt3+qVkY~=>m+irUi*qCC0<{u`cd(ceBb6|o}?DLvOo&HxOjbbtV-PS+bE(cu9O1@@ZL?X(UBMrZbk(9U# z4TWLICZY(sBK_ip#Ia*Q-M;Sn_KR3b$wWsOS#e0+(4(n8J&H?VXC-b|xWr~ukjUdT zKbcsIR=IkkXmLbD;FPt93UY`}ycQ93*VD>KmE8ETw~edCdGHehXJg>Iy_o8)qjJIP z>F-j!($dNkHdY5aWmh;@Jdp|ZX-x2>o=&dKf zYJY?jT3Oq0+1 zp?0hU@g|nZdsWlgz7#T@ZZ=jYxE{BaK=Jqa&~HA35WBGHV$c=NzvCL0ipSSeDuO

zO4Z24J+eAvcBXU<=gsEq4w8NOAtTc>%A@nw>uWU}d-W713yE2R;!ZX0T#?FD*MNC4 z@5J~H%j-f?TkTRbrFIE)kU4|1*^Vq#nV2{$B{g~T?OzWVef%M$*KISvTEB5`NV@A922ZC>=-kV}SY3B3;`wq@@m{Q*^bCFxcp^kn`k7gR z3Cpz#a81OjaZkpoaZT)q1BprdY(fmgfU0}I*p^Njz(9E*=?fSKig$&GUnM^k{iMc& z`{;U~?hNpQ5VO7zy*2wQ2tM>Pg!j((7Sd&&XZb;4=Z;W>KVmF#_YPf662@rp3%y9) z8~-KXG;%(62Ya(;J?1MfqlQi0hz`8{X=v?)ym1Ov>O*;|zx@D^&PcO8Sny2$0{Cc7 z%iI49EVR>xZ(&a)9R^?qt9zhM?c^MixjGz98OgotG}1C&s+Tt{c|D$Tabdaq7y#$` zFzs!xXw(Zj>|cxQU%H0XXyfc&zwGW6(0lc1r#89Lx^!~@lhjdxQj$mUtxuFg`z?$^ zQ+*4#Qr(;2I~+RrhuKc+3~S>bPP29>hiu)U8<-{6)oGWy$N-Bw&AmkD1|iCaD1f0| zv>D)x&?(`4#n5$`BnMnds$0aKuW25GyvaiXcF9c*Kv-u3S17<84u=9~g!gH`0KC4U zQ*Y@GZh^CEEE8b=sPB|<@_V5%0ys%gwaGZ;@_P3j7Df{MYzNfmi(^G2Td|^^s9d;12+Q&-FRM7QCiIZD1&R*JU zJPe>5Rs?PPyF~dcs9qex)MZM{n~0!R&4Yt|3Y6q_ol5p93OytCec$%dEPrpG{7cV; zzv`S|{l=&pX;@M76k@xUW?12=r%S^O%vp&grqbM9V8qHHeHFjp#3zya{ZA}X0%Y{B zt%S4cK_Aq#tGhUI;gh6!33jkHbILep5(P!Qq0cG3=%1eFx1u}ZwpURTAE9X>rC6q@ zzc_5a?u;`Zmy|qrzj$kI5#C&h6{#~bxA>V(I`Z+H>nr*@Q;7h)d8`mCw%odnWt89( z4pd`=ts#c8At+LZbZP@#ap$ejNFLyULz21s7?nl@-bT2Su81i~WpGN8%(hAsAe4|0B6z>cYtY$w*)ir_1S;5KlA&qYTQSNgj!@<5 zew``oPR3u2-M>Qx>x$E|*}lG6_`62O&}@=`4Vp)CS+02SO*4*dF;x%8KOrD=qI7HY zou8HmQ9I8hTwp~yFDq%26d&0wcqb=Ugj`9PBbucd+@w83+$=kUL|w7-MT#!QKlM5^ zG3c?5%Ik<{oRRaPJuFj1xho9YiJFI``m>ojuTVhP>r`)c_>=WP-7ye&JuOI23`C}v zsFI_u!Cx_pyL*B$GUk}Xn_fE}R%qmMKhZ3)&qi2Q>EPT0)QY~yy?OVM>Jh?Z{VSnG z^`%s2!7p^(`Bt`WK=$shg69F8{R?>PZUg;Y&2hN*kOL6)z~KwMV*d=e8DNVX{N+;1 zeWtqe@2OJ4;>PR)Sp5L;wI8|DnakhIhsA1?+;S_Ds-k4chj)D)kcl$sU5(61J417 zDaFl8oeMgN7hJHpjJ&mV~#5KPlu<&ObYqxw|_ z6Q?hoCCQgPa_gkVn1%Hm?asnH6N{9*ttU|YdR}+j&!+cFxEyzVRl~)F_L3D z?YIwhJUoXJVl&xXkX!~s5ueibY}j3XW>%Er>bl z5mmTCO8t!_-!pjzGuBI4KP&|D#@+Rwx8DK~3Z_w~qzkc92daCzY8Se6T^D{b1JHT7 zEk`d8mm9YpXjazvNNmB8EiBNpE^5+7}v|7a9d#u7=uC?J%Vv_2G{8@Y|Xuy+Bv zTjE+4R4EHQk|x%fj$?W`xpND~O`|G(uyl3-*;vVzs}=O(&C{5Mt3B`2nHhNO%6^S9 z3VL;w#P4qPD3^C0;G7q|XY?-p6@8-y-@otZ{;}tRqfw;gVEq!SuL`VBw@a!0-&S>T zj)}=gcZ8jteM)=R%huDJ8}1&ZnewI(!sHD2$db@=D-!D$VxkU-K$zU8|N>bd54aSGBc1x`=$;4#~0o*$Vyh34NvI`N5RKF(}c~rtWm5 z3IN&NsOX4mpzBR-6z^hq3VpA>cn;BL0nup{eS?)Q%=`d!p94alfBqgGX=<(p0I3B+ zCll>a0K0e-7zvaMa6boxd%CWa0$o?$gbXcmAY)NTY{)8d1Yj-F^RRB>(0Jg46-z>& zUe{|72ucwh+yazbEA8?O`q94bU7R=3Ja}!;N8ulrkgAs}%f3D{|90Tta#;VO(;L>q z$G~2>>aLakqFdIti<@?4$H1WLVI&9iR*~&ff2VByGh58khn7d@YbV2GfDxYYvPrd5 zR4zc{iuFmrmAUXKcv#r$`vz_s%gkBL{0W;fkr%S4=tf_fOIQ z&Ym$AM`u9z@++n=bu5fvr^cX0_ay-^1=KTpfX>f}fH3>dj1vH(>$MMqAa6HSHmh;T z^SuGam~fxrQOui5x1L7kRDONzUi}zCQz@=3-cl)fK{lg^FPBIv$#g`PMOs4#~1ma}4>xwii zt6g!xp-hvJl+r&&84E#7q!+D!eAG3E7HA!b6C1A|w+-*B@m!lOkM9|cvx5=?;7zNh z3NI7qrZs!75 zA;MSwD(pM(`xImzRK3BzHyALQ32-;AKf4G8*~VRS?Q*C(R`w0ZDVkgq)5G#*##At{ z-zdZKXwLWC2SU|707sT4>~%FdcA?X=(LF$3*pLvzkKMq@=YWWDDHiH$Xzv01*oS5O zRfxGXKUz(|KZdA)yp(XYOo31cJYReMFjb8{FRj(Q%gw;wxcAn!6EJxU-17?1a$g$O z(j^=9b_Cshkz!o5<7r5qsi73Vqu8g^;e4k@n}gJ!Hu;pBb)%K*uZ_>UO?`}(ovuY! zgeK7t{xGwIRAh;Csz*ElEg+%a*CW<@zcKB#%he(auNKo%brOfhge@j9;=q{i!8l%P z*}D2DT-r4-__|)QXoUNSy$I{Qe%9HYzKOD2SDCuX`8t+}61-eM>6zqzLe5FFDz_luXft%mjRXMxjcCW!*U*0Fmt2aY+|uiJf=%Y#W!5PQhRJ| zJ-O-I?PLq14*`ml?e_GKcqWz+X#Cr<3b8iNw?le&QR}F2DJ!u;y^(qyBTlFeqBI8z zCM$u_r-TR%6c~GY>5aNLtfFmlOFvhEwZ%%@q<>x>zR80!tF?dj!uB+3$2fKH4V-F& zMw$P-uU0nyzdA(EpI(R`u$y-3+BiyS;EFVXO_~9Y4nq=?z^RGUPYJVz0Odh|3!s5g z5XpE;6@5IX05}1{4}@4g-T-QJssT$~>@_tyBY-IyD2xU=o3O$^fEecoH^ztW=}*Pc z0O%CKG4Yz*JvVnrPfToMFeV=)o5Nn+(FBs>up@V95KRgBw zKLA7Do97=0PC3Wr*Wi>Zx)$U3eag8%N=9~npK?i4$tcnlXIv*is(gU4*SFkj?*x8s zh4=+oYb9SUj_f5Sy_RzIi$sNWn}#(}VP=Wx9zV>9gXu!2I-W`BMh}$Owgg{66X9=Ns5CkVRXlIOQo^ZfE0L+cI5 zgFWGJ%+AbBn_eW8E7`>JPHDT_-fQjD9cRrL>#P5w&dwDk3yP&=8He(_Js=X?4lS}MO`^Fn+Epba^wVI|>n=6O1WaZo zwe44GwXDY1V!i7z+$Xrt=KH}1MYIc@V1D|eO45D8c0MRR?}jgb)>ufK!!-M$YTlI( ze)T0AShm?;pUnbi-1Rw)^P=}a&*4^tr=tU4E>PB4XU1S+b3b&5j-_2hjVpWU&a}{( zkQo4e8IrUPus8;Qc1H$dES9mX@H0fb9m@bnFaTFT6V}RXq=99p)e$%&v+}nw~n5ZleR>?wD)V42v?sn%sTuQn-kUi9>_WqTXn6RjRCB&uUkU|B~931%_H}ktmb+*5up( z4OtWhF{GC(XH#0c;({z7_wiD!xRaTzlCKookz!bN7Qzz6oUCNoB&(>xw(gRWtA5sI zgHeYDA{9(6b9ygby*%we)WrT8b7esjXC3tvu^YElp?;{OPJ}M zSZiNh3AfnH;g$aLk@>Tp{|gjP^er9(`rfSDQpz$4%?g7rcGm`jIh`A2#z$}{{TCCl zWffWB28s~bi((7IF>{g6KA42XZtg`IDQhAru4ZH735~o*oc2$q*=4||KBbqraIomg zSC!}U3RQc<&0iJZo<;o9#T0D z;AwX}42o-4Hwhz8qTuQ-l*H17l=8n4F_Uke@%}LozjjIXc|d)%8q2QhMGl{y4*-=` zLGA9$I3qb2R!HkQgXM+88~{D27=JcoAOYG5Vf3oQvb5F#XE;IuhY-*%2N><6A42YG zXE1(;ap%gg40q__N)$a`F)GiYbe?9S5U&9iGj0IA)M>QN$ZIHl;yK;vlEI%zZ_8%Y zG83|9YJ8o5)|dmw{ad*zzOuA~XkZchSM3E@6^H7=mjnV_#4fBqd>&~oVL#d0b~N0krWG7Ks+L3;Nn1ZQLK(g!t_)h)BN8!E4aye z)%ituFo|#5A2RwhjPc8+|fv7~)AW~gpomJQu83ly?y0ia-Ydl!nHlo~?*Ud-D z<`f(YyYSH|OVgqFyfEjxRxlzv_q47n0;B@s>IC_DFe$ObU_tm-SRJoz4&JvH-dSLp zn5qu%`nVW?FWx%p()FrG_$m> zhJcgzZyb$~YRwbSl?-C$z*F(5{qv@Q!$$147f zcK)G?t~}>v&-XM4s}gfWHy4;7-%IIM$`z4^>ol;+4jqLqDf@TOdWN~Q3)km%Y&iyB z2$wvT;#VjtFAPlQn)R%6xpV66TH5r6wf8reFDaasfa<(?f7Um&{c}G8L(QQID2}`-5o#GD?&pLXh-LbuF%fdE2DX;0~$AI)QacAD^w&wON6- zZQtnF+WjD-`Gr(B`w-lWaLR;~$vpzj#W>tBws*b!x)-P+-mZAilt8sy*sDtyIi+7M z)7wK0NgQi2OR}~wAT~PocIG8q{iBupcZKlZ{sMj6mc*}nY4v7R$AD4x$Jr=-3uWD0 zdG*zim!rGR!Lew``{(=lz9|No46Qe_#&DKA1jA}tuOg3)@gA$z`S0kwQZ`6I%!WtvDtbg58d5TIdOxmoh zu-|!-9mrea)O-*Zni69+(T9KA+q9~Y<$^fn^bcew)h4*OFKS)du}oUefLz!`8d(Rb zfOui8jO+k7<9bP*0B5E%|4m>-{!{6z+ft|6A4Be>imIJ~DjJq#Fl9h)ykca(0Ti}m z(1FHN29_ZMhJp)Zr8}cAPS=~WHd317>^IU4rd)#ld&gcx@gH{RpeynnsC%~BH5^2a`bZf?JIBZ<9+q%q z9|H)x5orj_-KBc~bF>)~oJ)GA#m(iPV*JspP<^#yqHH+N{T)SQXdCBZ)fmilJz2p0 z0V#@AVdX`_9MVu$O6na&_>!lT6phXMg1;4UBTwV2bo?6UK=pJ3FKtIV!{mG z!7?B~BTDEMli3w>tQc|~Wy+{gaPm8_P)eLB%YgK!OUDr{*BQAfzsk#ltdpzE9lfg) zHJ|Bdg1+g&bI=uJ;O9f^slV6o|5$%|{XP*)pT9Ohn;|*78(o27^m0XH&DFmLuByNQ z{<{^2kin`np1GS3zd7@UM#=bl3OaYO-X%_uD`w~2=9Py#hf28(rj*;}^j4?~ep7RY z7Pn{}PXlyN&%&Igr{f5P>O>p{Q7kz*wmGdyh<{f5tnyHT>X!|lnp+6JOm$w^pjnvN zQA$CAk!V*bLZ!8sqdal&C4(~bq-0{~4JX{az(* z`ju=4zGA%5r8=wGSGe#Z0JP|B(@t?kodljp@c;bMvjWf%Rd3FQl)r>(Gq5SempjqQo9Xi-G zPiv5lx=b6qYlCm+aEz>S#Hleapk;dRURx(RV1FiBnxOVe0o(A@wSduB3qhHkg^kbj zZvUB%{MkJhHvb{}Y7WSGdmN5#m=*YK$a{EwRYFCs%ir+Gt?*WD#&Z&+dO(Zoo&RdZ=Ns%yxa4Yh5 z*BNi$kTl*-tn?R5`NKWcj3us3*JFUE*MkBtEi~e%92h*7I~d~H_9vsv-KUe5@Bf~g zJv>W6(=3J`4rVqIRT~MSG?_4}>{O|`ZMYT}E}(Nl^eIXa;{>uzxGztRV#@Bn6c7;~ zCvhdaHBs%HUHOodL_*#tS;sU3wsF?a|7mfF#SEucZzKkM-M8Inpcf~_b<=c}9s`R; z9g%EL{qIBkJwnz7AhlU;N$XfP9c{_R`v#?)44etQrC`9-Yuo3LY`xw{wKE3n?-{-U zKR$$*y}3iDWW));VZcdstnj1MDTuk=6i$t+P~sdA?(vHYurS&IRrh4%&M_%;IA?Ns z{sLNdI)n3pP>hJa$9nk`prxRZ+almd`4;3an`YGWvSyI~$>OCqwHQo#zqKR${BT z9oJ4-)4{LCd=x>}&7#STAiHILsc(T?-FR8;kKyk8R%UsO#deU|9OBlwQbLlRnw-zQ1 zZZ>9)=u6dgX73acebe+b4Eq+6L{0!}`kO9;xUw*$+>YIi=K64l zzDjkXjV*%U4P2?%+4y_5*G~g}s^sDN59(dIk>u#U@jCyqi8d#iZiP4KmQa%Az@Qm2Od`Ed)XjyhARc^U0r{xaF(TQv z=$agDoMgF57J%w#&e)-mP3kUoc7d>ePG%f!%lgB64`jDt2VW0?({n5O&1`0~W&kQG zHhZ<63i4IsVl*t%o77JgvlduhWc4p&=L}=kV3wYM<9Xaei0{+Okdp}jq9k7g;Dw$C z%0O6t2S5seywxKvz+SQvDFku)^aap?37!6+6Q6cp9Cb27h>-Vl*R^>-z@P`dbQsdiizx%f4na^Ix%C}X&$)u2I+P%6cL0KFZyd@B1l3zZp5-bQ zW8B$3F97c81QNnNxKw#%z|n+ALOnTElL@P7ZD9YI>*w>zwuP z^xOI!M)J}LmEOor>Lq=$JBeKMgkjgrJ_R}2X>61^2>vb2k22y^}>-#78w zD5dn3>N=Yv(9)%UNTg;F|L3N}|2KC}9X|WkiLW9`ZA!Vs=MYdBbK{iC0-1x>_FZ8V zyQCkfvjj=K%s^NL$=3X39$S!X74eS&$<|u+c93ixM>e&)P!bAVQ);8io}@*U-hZil zU7Xy;=ARU0a;^E`t1BD3<4|Xv@kjw1|8oSt{riA3&vL^+A38Ms8l@~U`4~9GnK`)L zZf=%mz$Up@kCFE2txSNu#fic1;lz+VZwe8FLJbs>BF$L{a#xWC=idJx2!b9jxTycZ zC@KXt22g#Qw8K-q0BXv(g;D+&dhH0ke##hwRZN-j+Gm#0ChTopClm1DBW#Ri8WE?c zv1fm#m;a@KBg9&bIZ_)8xAOsDH#;eymptM#y-qH0zVI_$d0E1UPd1of829EabE)R9 zG9a9rtlU|z!;ua#(jX?>%BE&@Q_2bo*T`#$i^X}XASq>qS}!}syJA5{%9Z}D zx^lwQOE3p6hB0qA*~!sa9lrXoutTEg>cn{IyuDG!lK0;w;Xp^@m3if^Z!Z0mrop^$ zFL^t%%Qe3`v1Fu(_X|p|y5>Z2*CLsh&9&8l` zI6XmlEn;yLZ!m_>^eB-tLk{$M`&EcFq#W&tgzo*QsL-I&4^`xuqW%Ce@JirV{s|$%p%hx z>z$zEuBDJ#|MDFj(Nr5XUaIuWFZoJ81Jt;Q7jm;Ns0;{7L?QDffjXU?J1iq?z*E?% z9jw@SH~>3egyjWE;rl?e8b`4Zi`!B*80p3x@*VBBu7%DDvGm|jAUWJ)|B7BIx=R|1 zu)3Lo9-t$)o=(YtP|`UL8aUdFk;gY3!<^wX?ILUQXXHkrKc+S-5@l&+m&OfIj~^^seKByR36X^csir-}t}p0e9}%sN5Uc*$YhnzSFV`uVI~(YS8yoDyg?2 zp^2%0B!>I`-uVQ(R4uRZ79WDMUQ!GfQP6ThX?1r7rZO%1tgX|P{Z}SucdL$#ezz6b z>`BsNOC_pYRm$sk8r}|xBz8%8JCPDgBTQK)*>q-e-Y_Bm`^I5nreJ6ks0M{j;0BBa zZ2Xx&7@*@@7DsiT9ChgEDWThXHEhH4Tli`Q5uqvWQj%dHHt&~Y8G|(gU#?$2cg)|%`3BRL@ z4vhe$4X*+9q2~cdA(qw#=1}!D0N$D=bjm05lG>?{z$xfWApEZ40I(a2WqO5Wu<|0o z>eQf6eSsv~47!b?Uwx;6XZR$unbgkTX*lxD^c26tD(uRS{2(ZsxTQw7b2vJ<_egp* z>H~28FB|(`J5%xYUw*TASg&fVq=d$^iVs@(Q>HN$s-%*M#i<4)GKJ zWWWB`?U0uqE!(ZGt%Lij6_C7Nj(SGeR2mrZ7o|6=uoC*x#zciw05(?pj!wdCNGjaz zGrcpLB7i{UG_aiy1;Z{tdxLSB4^YQ4gU+-bF984aAtbdB4v4Xp6$1=EHn3QlVmC2e&kYS3&kKMfCvxuQKLy z+xmvXA{IU#dpsUJjuuskN$wuW6sZ4`iICCL#G10+b#zrxW(l}u9w+He;&7fZ&bFBh zu1CA=UD&5Ja}r=IYH8{?c7nZ7<+Z<$#3xup1b$CC+D85z4kf*oZ{O*{4f&pd5`8Zu96cjMCVt=UP;f+Q1etH)JI4N z_2lw_j7w7}W`2EujQ~v4-Oq~2pxl|Cd_LEBqFaw+v%F@lo1LqVH!7OG)a;QMy{)t| zFh0Z1fr0nkgd*_wjBEVhEd&?jz=U%gWkxO?)OQD^c2;MV`}g&-?V?Ki6Hk+%R%hJM z9w1@ah{yp6%f{25i6CLwAEyNpmQ`JG`-96`^4*6w>Z!u3LoEF83sB;&Qrg@~j3TAQ z(o@{;DQE>$252p`XTvf8*3 zI6^`7=2mPGx8C8485X5`wYL8q>Cg6f_jIw~`W;5GXUksa^b#Mazy)mxhbY719r z0~M#nU;?x$?FzE>iDzS7+r@but}3WTxi@ylq}qj*Sm%rfwYuC$QCezA6SLPUq~3)* z<(B1-I>;eynDhU9BFp^64BCFIzOscFF1R;FFGbYY1hG=JYqE8j`k|~ncGwidYF94< zS=Xh|OBaNJ&dQK5`1$fBpQP04Q75=51Ls9jfLm;R3__1>!G1^(di<619(p|bJQ=U@ zJM>68m7cBAz4#QJ2z3fUbxa55MjsjRQX9D4S4+ zXDU6)i$8BVX(G{s+}lk2jyeil&E8!eqa5!IPV&OtKusKAaC376NNRJn2lRGo0be-A z$ZDUdih);6UcTF@q-ev815jZn!hYlO3~J`g4aH|2*Q|fQ;`X%mWvl~y-=5k|Y5=DA!SgQC*Woux zD~GFkB1o#!j8MAw^^)Nt;vLKHIW9%VKXK?k$6SWH0)3H%bvESo8dtb0qCs^)EL%W| zFV<5h zsA*Vr1g|>9((5T(jQOc4T_ak09G@8`UCRh>*F$QxL_vs;*LJndDT4SnpV3ke;@|tH zUuK{{{M&BmE)T@NPttX+>Z=Ama{K9XqWQozGQNS2f8I&lgwa>YMovf^7Xc_ZH~DvB z49bGA4KkZfUyi>ocUF&hQFi&1Y(;wqxC;Qb6YSr~_#hL`z2Bk&n+m~XDdlUx^$``Y zDZjZT>`+q&$5aM+N?^nPNfykL-b%w-yxR8N2ORm7X73DW-j6I^9pc4SWD%F+|HX7M zWw!SAT#aMMq~S!hx<9=`F*MOLAu7u4O3A~6%?+zvom1DfJvKueh0+N%hl}q5R@b!LlRL64d zm*OiWXcnsRm$)OJ>&S<%)89*7s{2{K zeI_bkaF#;V9M=OACC#b;(hUPBk;~ry>P~!cZj)Yg;ZD{78OwCw`XX533AK{WvdiuE=c zQ^TMg(Wkw~(evi$aJy9LQH@N;*usQ}+;6OJ1SYV3qmT+NzAfQ{>S+bPcD-rrye!d6 zQ?{8oJwHudk+9ifD#-1zvmaZWq=R(MDT0t2Q)hT{uMr^^G!$< z%~ghPD5|0BfRQ8`ER>|_6efEQ4``f^j!w9-hVIMF8Pmzj7gZFvR?%zhFv=OI5JYI7 zUXz6>F64|$A;h_M(Py&nd{6BIPK8HYhA*CD!KRio{W9qhB`^h-ED`a}BbN;u%MW!V zKk6r12U@D_gO>LNi7?=4BurmH0z~R{s;e;4f%OJhQKO9=&MoS~lv3#RBU1GzK|P*# z9CsGNY^EY6T1k^aoICFq(W4Oc?5ERid?;@D8FIHClr1s47?cBn&g2@6+yQ7B4eQm(7ww5t)#i7 z-OrkCo*pck;*zThRo<3aidrtl^Y=8@=j6ovfukh94uI3y`l9fdJI2?|DQ!<{VRFd| z>Efy&w6Q@O7Y^)lnm8ud8Upf_FmC+!?Gs5ID@JIr-LVdbGk^Vys3NJa(;2b-Qhya) zCyR)l$s0@+S(KaOaJU1h={~}#^d7TO+kQP51w3{{i+FvxpQ*~!KDKOCRXL1Mjq5#f z1d&HDq=Ji+rp(+Uk`fm(ue@+23btl~@N;-tm!mgsx@Lj=djItf1)_ASba2{f>$yL0 zfHve-n*%Yhc7nyX>p+Ft;Zms5(*C*{3!*qW^lHU1Z)eKA`iuuH2zL^5Vv@~UHtg*( zW|$YMCN{H;DP6~U2%!_NB&e#rEwG~?GT{GY!~}&`fQ2pQc*oZH9#S@LbnYAynck>A ziS85k6A-3}OQUI&iIGkU=ouytLNy=zlVbGfx6aYggeo3YlV=h-ZIIy5ru#b$YwCZ^TIoAr>HO+)cvRsvZrHGx=3PI&a8Rp~?I5X(`-GtW-KKEf?e<3a>@=l3 zx{}i-3|vmv!6*%Dq(-d+FEooY`pl9L{Py$0KDK32B+Sj@_{>%KlwnhH^l9NNeIf1^#4vkbR?Ga8Tjxp|#ltlbY24({Vo*0K-$|93 zA7q+n>F+)K-0BZ6aFr=`G%lp=87X?b=ls1PMg$>AA96N{G-}vuZMgHj z@)G@JKO?o@{p_e}-)QPv@Km3NQx5}n*}h}6zs_&;zuhsXubQ9d!Z3uxO^YmjLs=Y^ z_yl4^!%3`J>6%%4aMt;?XeS7^u?+9z@0w@Ka0Q1TIE#18f#yNl`}^Kd=GE9T#g=#!SR_}}j@%Gv#&nO(FQoiq^g==>x>>Ke8iO;gGhAb+kl%$mK*kAqC`7PAP zf}JdN4daDUAkrO;Pc_2U=rm}+)ondlN)geHb!Qc@=v2sj%RrN7gO2!$howr)M#sIu z{mDWv=6Q7td7h7X#nv!h_c)kR-JhEQ?s|nmsgK zA*mk)vFS`vcrW|VS+eBW21oMI-N~gy8qMnrESVy}!v^by-Ax!41q+_fEhg82LSpkY z4H~Ott8~cuk#T;9hLiJwfXixUI7Aonx#vwiA#p ztmtO%rLBYf0*HjD*$0ZVQT*7ZsK(ZKzA?CB#JX)g+gR{Ar3NWZUro;W1cu~C$F*UG zvgv^*58CHXQv6~}tGzH$nGxF2mEsEYth3S)FD?Oob%TKG$b?!^pVYd?Y5K;i{GCDo9@vWt;*K(BVeB{@ac{pN|k=_^t_?Z9Kt*&u2b zagw4G4t>d+9i96=&P?-fZ2q%8%H{E0LkqE~ti|SLy)Nlvi*yb8Pfqm+mN3wBY#EbX zTHsYZ5$UfTd01YhH6Qus*JK%w(v<&kvEH@k_c!PNJ2s8=?*9Wg C#FUEw literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux26/captures/sw-natural-bridge-wide.jpg b/Standalone/Research/WorldAssemblerM3/Linux26/captures/sw-natural-bridge-wide.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b2fe0b7b511ae26a4dd459ebb5a21d97fd1dc80 GIT binary patch literal 70192 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 E4KO~G$N&HU literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux26/captures/sw-passage-inside.jpg b/Standalone/Research/WorldAssemblerM3/Linux26/captures/sw-passage-inside.jpg new file mode 100644 index 0000000000000000000000000000000000000000..edc45a47661f2b8b5a28174613b10782e1c40d1c GIT binary patch literal 47519 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�Ji9&+PtzG5S`d@PmKxUGu&Y~|PmNK;L2 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 +#include #include +#include +#include +#include struct FStandaloneParitySample { @@ -20,6 +24,23 @@ struct FStandaloneParitySample int32 StrateIndex = INDEX_NONE; }; +struct FStandalonePassageBridgeRange +{ + std::size_t passageIndex=0; + std::size_t firstSegment=0; + std::size_t lastSegment=0; + std::uint64_t unsupportedSamples=0; + double unsupportedLengthMetres=0.0; + std::array startPoint{}; + std::array endPoint{}; +}; + +struct FStandalonePassageBridgeCache +{ + std::mutex mutex; + std::unordered_map> byLayout; +}; + struct FStandaloneOwnerWorld { std::unique_ptr Settings; @@ -45,6 +66,8 @@ struct FStandaloneOwnerWorld std::uint32_t CoreVoxelSizeMicrons = 250000; std::uint32_t StrateLayoutChunkSizeMicrometres = 8000000; std::int64_t StrateLayoutChunkWidthSubvoxels = 8192; + std::shared_ptr PassageBridgeCache = + std::make_shared(); }; namespace StandaloneOwnerLoader diff --git a/Standalone/Source/StreamBenchmarkPipeline.h b/Standalone/Source/StreamBenchmarkPipeline.h index 7368c28..f659e82 100644 --- a/Standalone/Source/StreamBenchmarkPipeline.h +++ b/Standalone/Source/StreamBenchmarkPipeline.h @@ -458,15 +458,26 @@ namespace StandaloneStreamBenchmark bool hasDeepUnsupported=false; bool passed=false; }; + struct FPassageSegmentSupportAudit + { + std::uint64_t centers=0,unsupported=0,nativeUnsupported=0; + std::array firstUnsupported{}; + std::array firstNativeDensities{}; + std::uint32_t firstNativeSupportedProbes=0; + bool hasUnsupported=false; + }; const double coreMetres=static_cast(World.CoreVoxelSizeMicrons)/1000000.0; const auto auditPlayerPath=[&](const VoxelForgeCore::World& Field, const std::vector>& path, double supportStartMetres,double supportStepMetres, double supportMaximumMetres,std::uint32_t minimumSupportProbes, - double supportProbeRadiusMetres) + double supportProbeRadiusMetres, + const VoxelForgeCore::World* nativeField=nullptr, + std::vector* segmentSupport=nullptr) { FWalkAudit audit; if(path.size()<2)return audit; + if(segmentSupport)segmentSupport->assign(path.size()-1,{}); constexpr std::array heights{{-0.84,-0.60,-0.30,0.0,0.30,0.60,0.84}}; constexpr std::array,8> directions{{ {{1.0,0.0}},{{0.7071067811865475,0.7071067811865475}},{{0.0,1.0}}, @@ -510,6 +521,9 @@ namespace StandaloneStreamBenchmark const double y=(a[1]+dy*t)*coreMetres; const double z=(a[2]+dz*t)*coreMetres; ++audit.centers; + FPassageSegmentSupportAudit* segmentAudit=segmentSupport + ?&(*segmentSupport)[segment-1]:nullptr; + if(segmentAudit)++segmentAudit->centers; for(const double h:heights) { const double capOffset=std::max(0.0,std::abs(h)-0.54); @@ -526,6 +540,7 @@ namespace StandaloneStreamBenchmark {{0.0,supportProbeRadiusMetres}}, {{0.0,-supportProbeRadiusMetres}}}}; std::uint32_t supportedProbes=0; + std::uint32_t nativeSupportedProbes=0; double firstUnsupportedX=x,firstUnsupportedY=y,lastUnsupportedDensity=0.0; std::array supportMask{}; for(std::size_t offsetIndex=0;offsetIndexdensityAt({supportX/coreMetres, + supportY/coreMetres,(footZ-depth)/coreMetres})<0.0f) + {++nativeSupportedProbes;break;} + } if(supported){++supportedProbes;supportMask[offsetIndex]=true;} else{firstUnsupportedX=supportX;firstUnsupportedY=supportY;} } + if(nativeField&&segmentAudit + &&nativeSupportedProbesnativeUnsupported; if(supportedProbesunsupported; + if(!segmentAudit->hasUnsupported) + { + segmentAudit->hasUnsupported=true; + segmentAudit->firstUnsupported={x,y,footZ}; + segmentAudit->firstNativeSupportedProbes=nativeSupportedProbes; + if(nativeField) + { + constexpr std::array depths{{0.125,1.0,2.0,4.0}}; + for(std::size_t depthIndex=0;depthIndexfirstNativeDensities[depthIndex]=nativeField->densityAt({ + x/coreMetres,y/coreMetres, + (footZ-depths[depthIndex])/coreMetres}); + } + } + } if(!audit.hasDeepUnsupported&&footZ<-80.0) { audit.hasDeepUnsupported=true; @@ -682,7 +726,7 @@ namespace StandaloneStreamBenchmark } struct FPassageOpenAirAudit { - std::uint64_t supportSamples=0,violations=0,legacyViolations=0; + std::uint64_t supportSamples=0,violations=0,legacyViolations=0,bridgeSamples=0; std::uint64_t routeSupportSamples=0,routeSupportViolations=0; std::array,8> firstViolations{}; std::size_t firstViolationCount=0; @@ -708,11 +752,13 @@ namespace StandaloneStreamBenchmark {{0.9238795325112867,-0.3826834323650898}}}}; const auto auditPassageOpenAir=[&](const VoxelForgeCore::World& Field, const VoxelForgeCore::World& Native, - const VoxelForgeCore::ResolvedLayoutPassageV1& passage) + const VoxelForgeCore::ResolvedLayoutPassageV1& passage, + std::size_t passageIndex) { FPassageOpenAirAudit audit; const auto inspect=[&](double xMetres,double yMetres,double floorMetres, - double depthMetres,double supportThicknessMetres,bool routeSupport=false) + double depthMetres,double supportThicknessMetres,bool routeSupport=false, + std::size_t passageSegment=std::numeric_limits::max()) { if(depthMetres<=0.0||depthMetres>supportThicknessMetres+1.0e-6)return; ++audit.supportSamples; @@ -727,6 +773,10 @@ namespace StandaloneStreamBenchmark ++audit.legacyViolations; if(nativeDensity>=0.0f&&passageDensity<0.0f) { + const bool connectedBridge=!routeSupport + &&passageSegment!=std::numeric_limits::max() + &&Field.isPassageBridgeSample(passageIndex,passageSegment,sample); + if(connectedBridge){++audit.bridgeSamples;return;} audit.routeSupportViolations+=routeSupport; if(audit.firstViolationCount::max()) { const std::size_t radialSteps=static_cast(std::ceil( supportRadiusMetres/PassageSupportAuditSpacingMetres)); @@ -746,7 +797,8 @@ namespace StandaloneStreamBenchmark radialStep*PassageSupportAuditSpacingMetres); for(const auto& direction:PassageSupportAuditDirections) inspect(xMetres+direction[0]*radial,yMetres+direction[1]*radial, - floorMetres,depthMetres,supportThicknessMetres,routeSupport); + floorMetres,depthMetres,supportThicknessMetres,routeSupport, + passageSegment); } }; for(std::size_t segment=1;segmentstrates.begin(), @@ -841,6 +894,124 @@ namespace StandaloneStreamBenchmark } return audit; }; + struct FPassageBridgeAudit + { + std::uint64_t spans=0,connectedEnds=0,crossSections=0,crossSectionFailures=0; + double minimumThicknessMetres=std::numeric_limits::infinity(); + double maximumThicknessMetres=0.0; + double thicknessReliefPeakToPeakMetres=0.0; + bool passed=true; + }; + const auto auditPassageBridges=[&](const VoxelForgeCore::World& Field, + const VoxelForgeCore::World& Native, + const VoxelForgeCore::ResolvedLayoutPassageV1& passage, + std::size_t passageIndex) + { + FPassageBridgeAudit audit; + const double qMetres=coreMetres + /VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel; + constexpr std::array,5> supportOffsets{{ + {{0.0,0.0}},{{0.45,0.0}},{{-0.45,0.0}},{{0.0,0.45}},{{0.0,-0.45}}}}; + const auto endpointConnected=[&](const std::array& point) + { + const double x=point[0]*qMetres,y=point[1]*qMetres; + const double floor=point[2]*qMetres-point[3]*qMetres+0.13; + std::uint32_t supported=0; + for(const auto& offset:supportOffsets) + { + bool solid=false; + for(const double depth:{0.125,0.25}) + if(Native.densityAt({(x+offset[0])/coreMetres, + (y+offset[1])/coreMetres,(floor-depth)/coreMetres})<0.0f) + {solid=true;break;} + supported+=solid; + } + return supported>=3; + }; + const auto bridgeSolidAt=[&](std::size_t segment,double x,double y,double z) + { + return Field.isPassageBridgeSample(passageIndex,segment, + {x/coreMetres,y/coreMetres,z/coreMetres}); + }; + const auto thicknessAt=[&](std::size_t segment,double x,double y,double floor) + { + double thickness=0.0; + for(double depth=0.125;depth<=6.0+1.0e-6;depth+=0.125) + { + if(!bridgeSolidAt(segment,x,y,floor-depth))break; + thickness=depth; + } + return thickness; + }; + for(const auto& range:Field.passageBridgeRanges()) + { + if(range.passageIndex!=passageIndex + ||range.lastSegment+1>=passage.controlPoints.size())continue; + ++audit.spans; + const bool connectedStart=endpointConnected(range.startPointSubvoxels); + const bool connectedEnd=endpointConnected(range.endPointSubvoxels); + audit.connectedEnds+=connectedStart+connectedEnd; + const std::size_t segmentCount=range.lastSegment-range.firstSegment+1; + const std::size_t probeCount=std::min(256,segmentCount); + double spanMinimumThickness=std::numeric_limits::infinity(); + double spanMaximumThickness=0.0; + std::uint64_t spanCrossSections=0,spanCrossSectionFailures=0; + for(std::size_t probe=0;probe=3&&spanCrossSectionFailures==0 + &&spanMinimumThickness>=2.75 + &&spanMaximumThickness<=6.5 + &&audit.thicknessReliefPeakToPeakMetres>=0.20; + audit.passed&=spanPass; + std::printf("[PassageRockBridgeAudit] id=%s segments=%zu..%zu gap_m=%.3f connected_ends=%d/2 width_at_least_m=5.000 cross_sections=%llu/%llu thickness_m=%.3f..%.3f relief_p2p_m=%.3f status=%s\n", + passage.stableId.c_str(),range.firstSegment,range.lastSegment, + range.unsupportedLengthMetres,static_cast(connectedStart) + +static_cast(connectedEnd), + static_cast(spanCrossSections-spanCrossSectionFailures), + static_cast(spanCrossSections), + std::isfinite(spanMinimumThickness)?spanMinimumThickness:0.0, + spanMaximumThickness,relief, + spanPass?"PASS":"FAIL"); + } + return audit; + }; if(Assembly) for(const auto& stratum:ResolvedLayout->strates) { @@ -939,9 +1110,12 @@ namespace StandaloneStreamBenchmark }; std::uint64_t passageCount=0,passagePasses=0,blockedControls=0,naturalPasses=0; std::uint64_t openAirViolations=0,openAirLegacyViolations=0,openAirSamples=0; - std::uint64_t openAirAudits=0; - for(const auto& passage:ResolvedLayout->passages) + std::uint64_t openAirAudits=0,openAirBridgeSamples=0,bridgeSpans=0, + bridgeConnectedEnds=0; + bool bridgeAuditsPassed=true; + for(std::size_t passageIndex=0;passageIndexpassages.size();++passageIndex) { + const auto& passage=ResolvedLayout->passages[passageIndex]; std::vector> path;path.reserve(passage.controlPoints.size()); for(const auto& point:passage.controlPoints) { @@ -951,12 +1125,21 @@ namespace StandaloneStreamBenchmark path.push_back({qToMetres(point.positionSubvoxels[0])/coreMetres, qToMetres(point.positionSubvoxels[1])/coreMetres,playerZ/256.0}); } - const FWalkAudit passageAudit=auditPlayerPath(Shape,path,0.125,0.125,0.25,3,0.45); + std::vector segmentSupport; + const FWalkAudit passageAudit=auditPlayerPath(Shape,path,0.125,0.125,0.25,3,0.45, + &blockedWorld,&segmentSupport); const FPassageNaturalnessAudit naturalAudit=auditPassageNaturalness(Shape,passage); - const FPassageOpenAirAudit openAirAudit=auditPassageOpenAir(Shape,blockedWorld,passage); + const FPassageOpenAirAudit openAirAudit=auditPassageOpenAir(Shape,blockedWorld, + passage,passageIndex); + const FPassageBridgeAudit bridgeAudit=auditPassageBridges(Shape,blockedWorld, + passage,passageIndex); openAirSamples+=openAirAudit.supportSamples; openAirViolations+=openAirAudit.violations; openAirLegacyViolations+=openAirAudit.legacyViolations; + openAirBridgeSamples+=openAirAudit.bridgeSamples; + bridgeSpans+=bridgeAudit.spans; + bridgeConnectedEnds+=bridgeAudit.connectedEnds; + bridgeAuditsPassed&=bridgeAudit.passed; ++openAirAudits; const auto radialSquared=[](const std::array& p) {return p[0]*p[0]+p[1]*p[1];}; @@ -984,9 +1167,10 @@ namespace StandaloneStreamBenchmark static_cast(naturalAudit.wallSamples), static_cast(naturalAudit.missingWallSamples), naturalAudit.passed?"PASS":"FAIL"); - std::printf("[PassageOpenAirAudit] id=%s support_samples=%llu violations=%llu l24_ungated_violations=%llu route_support_samples=%llu route_support_violations=%llu spacing_m=%.3f status=%s\n", + std::printf("[PassageOpenAirAudit] id=%s support_samples=%llu violations=%llu bridge_samples=%llu l24_ungated_violations=%llu route_support_samples=%llu route_support_violations=%llu spacing_m=%.3f status=%s\n", passage.stableId.c_str(),static_cast(openAirAudit.supportSamples), static_cast(openAirAudit.violations), + static_cast(openAirAudit.bridgeSamples), static_cast(openAirAudit.legacyViolations), static_cast(openAirAudit.routeSupportSamples), static_cast(openAirAudit.routeSupportViolations), @@ -1000,8 +1184,58 @@ namespace StandaloneStreamBenchmark for(std::size_t i=0;i::infinity(); + std::size_t nearestSegment=0; + double nearestT=0.0; + double nearestPassageSdf=std::numeric_limits::infinity(); + std::size_t nearestPassageSegment=0; + for(std::size_t segment=0;segment+10.0?std::clamp( + ((sample[0]/coreMetres-a[0])*dx+(sample[1]/coreMetres-a[1])*dy + +(sample[2]/coreMetres-a[2])*dz)/lengthSquared,0.0,1.0):0.0; + const double ex=sample[0]/coreMetres-(a[0]+t*dx); + const double ey=sample[1]/coreMetres-(a[1]+t*dy); + const double ez=sample[2]/coreMetres-(a[2]+t*dz); + const double distanceSquared=ex*ex+ey*ey+ez*ez; + if(distanceSquared0.0?std::clamp( + ((sample[0]-ax)*dx+(sample[1]-ay)*dy+(sample[2]-az)*dz) + /lengthSquared,0.0,1.0):0.0; + const double ex=sample[0]-(ax+t*dx),ey=sample[1]-(ay+t*dy), + ez=sample[2]-(az+t*dz); + const double radius=qToMetres(a.radiusSubvoxels) + +(qToMetres(b.radiusSubvoxels)-qToMetres(a.radiusSubvoxels))*t; + const double signedDistance=std::sqrt(ex*ex+ey*ey+ez*ez)-radius; + if(signedDistance(item.centers), + static_cast(item.unsupported), + static_cast(item.nativeUnsupported), + sample[0],sample[1],sample[2],bridgeAtSupport?1:0, + item.firstNativeSupportedProbes,item.firstNativeDensities[0],item.firstNativeDensities[1], + item.firstNativeDensities[2],item.firstNativeDensities[3], + blockedWorld.densityDispatchPathAt({firstX,firstY,firstZ}).c_str()); + } } std::uint64_t routePoints=0,routePasses=0,routeWalkPasses=0,routeBindings=0,routeBindingFailures=0; struct FRouteAuditInput @@ -1082,7 +1340,7 @@ namespace StandaloneStreamBenchmark } const FWalkAudit routeAudit=auditPlayerPath(Shape,route,supportStartMetres, supportStepMetres,supportMaximumMetres,minimumSupportProbes, - supportProbeRadiusMetres); + supportProbeRadiusMetres,nullptr,nullptr); routeAuditInputs.push_back({stratum.strateIndex,route,supportStartMetres, supportStepMetres,supportMaximumMetres,supportProbeRadiusMetres, minimumSupportProbes}); @@ -1151,7 +1409,7 @@ namespace StandaloneStreamBenchmark qToMetres(point.positionSubvoxels[1])/coreMetres,playerZ/256.0}); } const FWalkAudit blockedAudit=auditPlayerPath(blockedWorld,path, - 0.125,0.125,0.25,3,0.45); + 0.125,0.125,0.25,3,0.45,nullptr,nullptr); blockedControls+=blockedAudit.blocked>0&&!blockedAudit.passed; std::printf("[ResolvedPassageBlockedControl] id=%s blocked_capsule_samples=%llu detected=%s\n", passage.stableId.c_str(),static_cast(blockedAudit.blocked), @@ -1161,7 +1419,7 @@ namespace StandaloneStreamBenchmark { const FWalkAudit controlRoute=auditPlayerPath(blockedWorld,input.path, input.supportStart,input.supportStep,input.supportMaximum, - input.minimumSupportProbes,input.supportProbeRadius); + input.minimumSupportProbes,input.supportProbeRadius,nullptr,nullptr); std::printf("[ResolvedStrateRouteBlockedControl] strate=%d blocked=%llu unsupported=%llu status=%s\n", input.strateIndex,static_cast(controlRoute.blocked), static_cast(controlRoute.unsupported), @@ -1171,13 +1429,19 @@ namespace StandaloneStreamBenchmark std::printf("[PassageOpenAirNegativeControl] source=L24_ungated_support unsupported_samples=%llu detected=%s\n", static_cast(openAirLegacyViolations), l24OpenAirControlDetected?"true":"false"); - std::printf("[PassageOpenAirAuditSummary] interfaces=%llu samples=%llu violations=%llu l24_negative_control=%s status=%s\n", + std::printf("[PassageOpenAirAuditSummary] interfaces=%llu samples=%llu violations=%llu bridge_samples=%llu l24_negative_control=%s status=%s\n", static_cast(openAirAudits), static_cast(openAirSamples), static_cast(openAirViolations), + static_cast(openAirBridgeSamples), l24OpenAirControlDetected?"DETECTED":"MISSED", openAirAudits==passageCount&&openAirViolations==0&&l24OpenAirControlDetected ?"PASS":"FAIL"); + std::printf("[PassageRockBridgeAuditSummary] spans=%llu connected_ends=%llu/%llu status=%s\n", + static_cast(bridgeSpans), + static_cast(bridgeConnectedEnds), + static_cast(bridgeSpans*2), + bridgeAuditsPassed?"PASS":"FAIL"); const bool l23SmoothWallDetected=!looksNatural(0.0,0.0); std::printf("[PassageNaturalnessNegativeControl] source=L23_smooth_unrelieved_wall relief_p2p_m=0.000 threshold_m=%.3f detected=%s\n", MinimumWallReliefMetres,l23SmoothWallDetected?"true":"false"); @@ -1188,6 +1452,7 @@ namespace StandaloneStreamBenchmark const bool auditPassed=passageCount>0&&passagePasses==passageCount &&naturalPasses==passageCount&&l23SmoothWallDetected &&openAirAudits==passageCount&&openAirViolations==0&&l24OpenAirControlDetected + &&bridgeAuditsPassed &&routePasses>0&&routePasses==routeWalkPasses&&routePasses==routeBindings &&routeBindingFailures==0 &&blockedCompiled&&blockedControls==passageCount;