From 6cd9e4da76911b82c06933e79266bc788057eedb Mon Sep 17 00:00:00 2001 From: Fr0zka Date: Sun, 1 Nov 2026 09:31:56 +0100 Subject: [PATCH] proto: liminal pass 2 - hills to the horizon, swept road over a cloud floor, pillar grid (L142) Captures stream LOD0-8 (hills repeat at 80 m to the horizon). Road: cubic swept solid deck, 376.8 m, 8 m wide, max 12.06 deg, 17 supports, cloud floor ~45 m below; walk audit 0 blocked/unsupported, 300 m negative control fails as expected. 15x15 identical pillar grid at 76 m. Owner canonical hashes unchanged; fast tier, Clang/GCC green. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1 --- .../include/VoxelForgeCore/VoxelForgeCore.h | 7 +- Standalone/Core/src/ResolvedLayoutInternal.h | 146 +++++- Standalone/Core/src/ShapeWorldInternal.h | 36 ++ .../Linux142/BuildL142Fixtures.py | 113 +++++ .../WorldAssemblerM3/Linux142/CaptureL142.py | 433 ++++++++++++++++++ .../WorldAssemblerM3/Linux142/REPORT.md | 46 ++ .../captures/flatField-monolith-eye.jpg | Bin 0 -> 26523 bytes .../captures/flatField-monolith-wide.jpg | Bin 0 -> 23358 bytes .../Linux142/captures/periodicHills-eye.jpg | Bin 0 -> 25065 bytes .../Linux142/captures/periodicHills-wide.jpg | Bin 0 -> 60906 bytes .../Linux142/captures/pillar-grid-eye.jpg | Bin 0 -> 43604 bytes .../Linux142/captures/pillar-grid-wide.jpg | Bin 0 -> 39595 bytes .../Linux142/captures/road-in-clouds-eye.jpg | Bin 0 -> 34408 bytes .../Linux142/captures/road-in-clouds-wide.jpg | Bin 0 -> 39598 bytes Standalone/Source/StreamBenchmarkHeadless.cpp | 73 ++- Standalone/Source/StreamBenchmarkPipeline.h | 129 ++++-- Standalone/Source/WorldAssemblyPrototype.h | 244 ++++++++-- 17 files changed, 1129 insertions(+), 98 deletions(-) create mode 100644 Standalone/Research/WorldAssemblerM3/Linux142/BuildL142Fixtures.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux142/CaptureL142.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux142/REPORT.md create mode 100644 Standalone/Research/WorldAssemblerM3/Linux142/captures/flatField-monolith-eye.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux142/captures/flatField-monolith-wide.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux142/captures/periodicHills-eye.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux142/captures/periodicHills-wide.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux142/captures/pillar-grid-eye.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux142/captures/pillar-grid-wide.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux142/captures/road-in-clouds-eye.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux142/captures/road-in-clouds-wide.jpg diff --git a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h index cb2b2dd..204242d 100644 --- a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h +++ b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h @@ -891,6 +891,7 @@ namespace VoxelForgeCore inline constexpr std::uint32_t ResolvedLayoutStampVocabularyVersionV1 = 1; inline constexpr std::uint32_t ResolvedLayoutStampVocabularyVersionV2 = 2; inline constexpr std::uint32_t ResolvedLayoutStampVocabularyVersionV3 = 3; + inline constexpr std::uint32_t ResolvedLayoutStampVocabularyVersionV4 = 4; inline constexpr std::uint32_t ResolvedLayoutCavernGraphVocabularyVersionV1 = 1; inline constexpr std::uint32_t ResolvedLayoutOreVeinVocabularyVersionV1 = 1; enum class ResolvedLayoutValidationModeV3 : std::uint8_t { compatibility, strict }; @@ -904,7 +905,8 @@ namespace VoxelForgeCore fillPillar = 3, fillDais = 4, fillMonolith = 5, - fillPlatform = 6 + fillPlatform = 6, + fillSweptDeckSegment = 7 }; struct ResolvedLayoutStampRequestV1 @@ -914,6 +916,8 @@ namespace VoxelForgeCore ResolvedSdfStampKindV1 kind = ResolvedSdfStampKindV1::carveEllipsoid; // A preferred center and a bounded deterministic search radius. std::array anchorPositionMicrometres{}; + // Present only for fillSweptDeckSegment; defines its directed centerline. + std::array, 2> sweepEndpointsMicrometres{}; std::int64_t placementRadiusMicrometres = 0; std::array halfExtentsMicrometres{}; std::int64_t smoothWidthMicrometres = 0; @@ -933,6 +937,7 @@ namespace VoxelForgeCore std::int32_t strateIndex = -1; ResolvedSdfStampKindV1 kind = ResolvedSdfStampKindV1::carveEllipsoid; std::array positionMicrometres{}; + std::array, 2> sweepEndpointsMicrometres{}; std::array boundsMinimumMicrometres{}; std::array boundsMaximumMicrometres{}; std::array halfExtentsMicrometres{}; diff --git a/Standalone/Core/src/ResolvedLayoutInternal.h b/Standalone/Core/src/ResolvedLayoutInternal.h index 5fcb719..5074335 100644 --- a/Standalone/Core/src/ResolvedLayoutInternal.h +++ b/Standalone/Core/src/ResolvedLayoutInternal.h @@ -176,7 +176,7 @@ namespace { const auto value=static_cast(kind); return value>=static_cast(ResolvedSdfStampKindV1::carveEllipsoid) - &&value<=static_cast(ResolvedSdfStampKindV1::fillPlatform); + &&value<=static_cast(ResolvedSdfStampKindV1::fillSweptDeckSegment); } bool LayoutStampIsMotif(ResolvedSdfStampKindV1 kind) {return kind==ResolvedSdfStampKindV1::fillMonolith @@ -598,6 +598,14 @@ namespace <<",\"irregularity_wavelength_um\":"<(stamp.yawQuarterTurns); + if(stamp.kind==ResolvedSdfStampKindV1::fillSweptDeckSegment) + out<<",\"sweep_endpoints_um\":[[" + <=ResolvedLayoutStampVocabularyVersionV3) out<<",\"rounding_radius_um\":"< stampIds; for(const auto& stamp:stamps) { @@ -1145,6 +1154,8 @@ bool ResolvedLayoutSnapshotV3::validate(ResolvedLayoutValidationModeV3 mode, else stampIds.push_back(stamp.stableId); const bool motif=LayoutStampIsMotif(stamp.kind); if(!LayoutStampKindValid(stamp.kind)||stamp.yawQuarterTurns>3 + ||(stamp.kind==ResolvedSdfStampKindV1::fillSweptDeckSegment + &&stampVocabularyVersion0 &&stamp.irregularityWavelengthMicrometres<=0)) add("stamp_parameters",stamp.stableId+" has invalid or unbounded geometry parameters"); + if(stamp.kind==ResolvedSdfStampKindV1::fillSweptDeckSegment) + { + double lengthSquared=0.0; + for(std::size_t axis=0;axis<3;++axis) + { + const auto a=stamp.sweepEndpointsMicrometres[0][axis]; + const auto b=stamp.sweepEndpointsMicrometres[1][axis]; + if(a<-1000000000000ll||a>1000000000000ll + ||b<-1000000000000ll||b>1000000000000ll) + add("stamp_sweep",stamp.stableId+" has an unbounded endpoint"); + const double delta=static_cast(stamp.sweepEndpointsMicrometres[1][axis]) + -stamp.sweepEndpointsMicrometres[0][axis]; + lengthSquared+=delta*delta; + } + if(!(lengthSquared>0.0) + ||std::sqrt(lengthSquared)>2.0*stamp.halfExtentsMicrometres[0]+1.0) + add("stamp_sweep",stamp.stableId+" has invalid endpoints or longitudinal extent"); + } if(motif) { const auto minimumExtent=*std::min_element(stamp.halfExtentsMicrometres.begin(), @@ -1186,16 +1215,39 @@ bool ResolvedLayoutSnapshotV3::validate(ResolvedLayoutValidationModeV3 mode, const std::int64_t pad=motif ?(stamp.smoothWidthMicrometres+5)/6+stamp.irregularityAmplitudeMicrometres :stamp.smoothWidthMicrometres+stamp.irregularityAmplitudeMicrometres; - const std::array extents={ - stamp.halfExtentsMicrometres[stamp.yawQuarterTurns%2?1:0]+pad, - stamp.halfExtentsMicrometres[stamp.yawQuarterTurns%2?0:1]+pad, - stamp.halfExtentsMicrometres[2]+pad}; - for(std::size_t axis=0;axis<3;++axis) - if(stamp.boundsMinimumMicrometres[axis] - !=stamp.positionMicrometres[axis]-extents[axis] - ||stamp.boundsMaximumMicrometres[axis] - !=stamp.positionMicrometres[axis]+extents[axis]) - add("stamp_bounds",stamp.stableId+" conservative bounds do not match its parameters"); + if(stamp.kind==ResolvedSdfStampKindV1::fillSweptDeckSegment) + { + double radiusSquared=0.0; + for(const auto extent:stamp.halfExtentsMicrometres) + { + const double expanded=static_cast(extent+pad); + radiusSquared+=expanded*expanded; + } + const auto radius=static_cast(std::ceil(std::sqrt(radiusSquared))); + for(std::size_t axis=0;axis<3;++axis) + { + const auto minimum=std::min(stamp.sweepEndpointsMicrometres[0][axis], + stamp.sweepEndpointsMicrometres[1][axis]); + const auto maximum=std::max(stamp.sweepEndpointsMicrometres[0][axis], + stamp.sweepEndpointsMicrometres[1][axis]); + if(stamp.boundsMinimumMicrometres[axis]!=minimum-radius + ||stamp.boundsMaximumMicrometres[axis]!=maximum+radius) + add("stamp_bounds",stamp.stableId+" conservative sweep bounds do not match its parameters"); + } + } + else + { + const std::array extents={ + stamp.halfExtentsMicrometres[stamp.yawQuarterTurns%2?1:0]+pad, + stamp.halfExtentsMicrometres[stamp.yawQuarterTurns%2?0:1]+pad, + stamp.halfExtentsMicrometres[2]+pad}; + for(std::size_t axis=0;axis<3;++axis) + if(stamp.boundsMinimumMicrometres[axis] + !=stamp.positionMicrometres[axis]-extents[axis] + ||stamp.boundsMaximumMicrometres[axis] + !=stamp.positionMicrometres[axis]+extents[axis]) + add("stamp_bounds",stamp.stableId+" conservative bounds do not match its parameters"); + } std::string safetyReason; if(!LayoutStampSafe(*this,stamp,&safetyReason)) add("stamp_placement",stamp.stableId+" is unsafe: "+safetyReason); @@ -1497,6 +1549,13 @@ std::optional ResolvedLayoutSnapshotV3::FromJson( target[axis]=values[axis].Integer(); }; readTriplet("position_um",stamp.positionMicrometres); + const auto& sweepEndpoints=v.Get("sweep_endpoints_um").AsArray(); + for(std::size_t endpoint=0;endpoint<2&&endpoint3 ||request.placementRadiusMicrometres<0 ||request.placementRadiusMicrometres>100000000 + ||(request.kind==ResolvedSdfStampKindV1::fillSweptDeckSegment + &&request.placementRadiusMicrometres!=0) ||request.smoothWidthMicrometres<0||request.smoothWidthMicrometres>10000000 ||request.irregularityAmplitudeMicrometres<0 ||request.irregularityAmplitudeMicrometres>10000000 @@ -1648,6 +1712,23 @@ bool ResolveResolvedLayoutStampsV1(ResolvedLayoutSnapshotV3& layout,std::int32_t for(const auto coordinate:request.anchorPositionMicrometres) if(coordinate<-1000000000000ll||coordinate>1000000000000ll) {error="stamp request "+request.stableId+" has an unbounded anchor";return false;} + if(request.kind==ResolvedSdfStampKindV1::fillSweptDeckSegment) + { + double lengthSquared=0.0; + for(std::size_t axis=0;axis<3;++axis) + { + const auto a=request.sweepEndpointsMicrometres[0][axis]; + const auto b=request.sweepEndpointsMicrometres[1][axis]; + if(a<-1000000000000ll||a>1000000000000ll + ||b<-1000000000000ll||b>1000000000000ll) + {error="stamp request "+request.stableId+" has an unbounded sweep endpoint";return false;} + const double delta=static_cast(b)-a; + lengthSquared+=delta*delta; + } + if(!(lengthSquared>0.0) + ||std::sqrt(lengthSquared)>2.0*request.halfExtentsMicrometres[0]+1.0) + {error="stamp request "+request.stableId+" has invalid swept-segment extents";return false;} + } // The shared JSON value type stores numbers as IEEE-754 doubles; keep the // serialized seed in its exact integer range so the canonical round trip holds. @@ -1666,6 +1747,7 @@ bool ResolveResolvedLayoutStampsV1(ResolvedLayoutSnapshotV3& layout,std::int32_t { ResolvedLayoutStampV1 stamp;stamp.stableId=request.stableId; stamp.strateIndex=request.strateIndex;stamp.kind=request.kind; + stamp.sweepEndpointsMicrometres=request.sweepEndpointsMicrometres; stamp.halfExtentsMicrometres=request.halfExtentsMicrometres; stamp.smoothWidthMicrometres=request.smoothWidthMicrometres; stamp.irregularityAmplitudeMicrometres=request.irregularityAmplitudeMicrometres; @@ -1687,14 +1769,36 @@ bool ResolveResolvedLayoutStampsV1(ResolvedLayoutSnapshotV3& layout,std::int32_t stamp.positionMicrometres[axis]=request.anchorPositionMicrometres[axis]+offset[axis]; const std::int64_t pad=stamp.smoothWidthMicrometres +stamp.irregularityAmplitudeMicrometres; - const std::array extents={ - stamp.halfExtentsMicrometres[stamp.yawQuarterTurns%2?1:0]+pad, - stamp.halfExtentsMicrometres[stamp.yawQuarterTurns%2?0:1]+pad, - stamp.halfExtentsMicrometres[2]+pad}; - for(std::size_t axis=0;axis<3;++axis) + if(stamp.kind==ResolvedSdfStampKindV1::fillSweptDeckSegment) { - stamp.boundsMinimumMicrometres[axis]=stamp.positionMicrometres[axis]-extents[axis]; - stamp.boundsMaximumMicrometres[axis]=stamp.positionMicrometres[axis]+extents[axis]; + double radiusSquared=0.0; + for(const auto extent:stamp.halfExtentsMicrometres) + { + const double expanded=static_cast(extent+pad); + radiusSquared+=expanded*expanded; + } + const std::int64_t radius=static_cast(std::ceil(std::sqrt(radiusSquared))); + for(std::size_t axis=0;axis<3;++axis) + { + const auto minimum=std::min(stamp.sweepEndpointsMicrometres[0][axis], + stamp.sweepEndpointsMicrometres[1][axis]); + const auto maximum=std::max(stamp.sweepEndpointsMicrometres[0][axis], + stamp.sweepEndpointsMicrometres[1][axis]); + stamp.boundsMinimumMicrometres[axis]=minimum-radius; + stamp.boundsMaximumMicrometres[axis]=maximum+radius; + } + } + else + { + const std::array extents={ + stamp.halfExtentsMicrometres[stamp.yawQuarterTurns%2?1:0]+pad, + stamp.halfExtentsMicrometres[stamp.yawQuarterTurns%2?0:1]+pad, + stamp.halfExtentsMicrometres[2]+pad}; + for(std::size_t axis=0;axis<3;++axis) + { + stamp.boundsMinimumMicrometres[axis]=stamp.positionMicrometres[axis]-extents[axis]; + stamp.boundsMaximumMicrometres[axis]=stamp.positionMicrometres[axis]+extents[axis]; + } } if(!LayoutStampSafe(candidate,stamp))continue; candidate.stamps.push_back(std::move(stamp));placed=true;break; diff --git a/Standalone/Core/src/ShapeWorldInternal.h b/Standalone/Core/src/ShapeWorldInternal.h index 37bad31..b9a8c8a 100644 --- a/Standalone/Core/src/ShapeWorldInternal.h +++ b/Standalone/Core/src/ShapeWorldInternal.h @@ -3535,6 +3535,7 @@ private: { const VoxelForgeCore::ResolvedLayoutStampV1* record=nullptr; std::array positionVoxels{},halfExtentsVoxels{}; + std::array,2> sweepEndpointsVoxels{}; float smoothWidthVoxels=0.0f; float irregularityAmplitudeVoxels=0.0f; float irregularityWavelengthVoxels=0.0f; @@ -3700,9 +3701,15 @@ private: StampSpatialBounds.push_back(bound); FStampRuntime runtime;runtime.record=&stamp; for(std::size_t axis=0;axis<3;++axis) + { runtime.positionVoxels[axis]=static_cast( static_cast(stamp.positionMicrometres[axis]) /Owner->CoreVoxelSizeMicrons); + for(std::size_t endpoint=0;endpoint<2;++endpoint) + runtime.sweepEndpointsVoxels[endpoint][axis]=static_cast( + static_cast(stamp.sweepEndpointsMicrometres[endpoint][axis]) + /Owner->CoreVoxelSizeMicrons); + } const std::size_t xAxis=stamp.yawQuarterTurns%2?1:0; const std::size_t yAxis=stamp.yawQuarterTurns%2?0:1; runtime.halfExtentsVoxels={ @@ -7152,6 +7159,35 @@ private: std::min(0.35f,std::min({stamp.halfExtentsVoxels[0], stamp.halfExtentsVoxels[1],stamp.halfExtentsVoxels[2]})*0.15f)); break; + case VoxelForgeCore::ResolvedSdfStampKindV1::fillSweptDeckSegment: + { + std::array tangent{},side{},up{},delta{}; + float lengthSquared=0.0f,horizontalSquared=0.0f; + for(std::size_t axis=0;axis<3;++axis) + { + delta[axis]=stamp.sweepEndpointsVoxels[1][axis] + -stamp.sweepEndpointsVoxels[0][axis]; + lengthSquared+=delta[axis]*delta[axis]; + if(axis<2)horizontalSquared+=delta[axis]*delta[axis]; + } + const float segmentLength=std::sqrt(lengthSquared); + const float horizontalLength=std::sqrt(horizontalSquared); + if(!(segmentLength>1.0e-5f&&horizontalLength>1.0e-5f)) + return std::numeric_limits::infinity(); + for(std::size_t axis=0;axis<3;++axis)tangent[axis]=delta[axis]/segmentLength; + side={-delta[1]/horizontalLength,delta[0]/horizontalLength,0.0f}; + up={-tangent[2]*side[1],tangent[2]*side[0], + tangent[0]*side[1]-tangent[1]*side[0]}; + const std::array offset={ + x-stamp.positionVoxels[0],y-stamp.positionVoxels[1],z-stamp.positionVoxels[2]}; + const auto dot=[&](const std::array& axis) + {return offset[0]*axis[0]+offset[1]*axis[1]+offset[2]*axis[2];}; + const float rounded=std::min(0.35f, + std::min(stamp.halfExtentsVoxels[1],stamp.halfExtentsVoxels[2])*0.15f); + distance=StampRoundedBoxSdf(dot(tangent),dot(side),dot(up), + stamp.halfExtentsVoxels,rounded); + break; + } default:return std::numeric_limits::infinity(); } if(stamp.irregularityAmplitudeVoxels>0.0f) diff --git a/Standalone/Research/WorldAssemblerM3/Linux142/BuildL142Fixtures.py b/Standalone/Research/WorldAssemblerM3/Linux142/BuildL142Fixtures.py new file mode 100644 index 0000000..b07c54e --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux142/BuildL142Fixtures.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python3 +"""Build the L142 liminal pictures and walk-audit controls.""" +from __future__ import annotations + +import argparse +import json +import os +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[4] +OWNER = Path(os.environ.get("VOXELFORGE_OWNER_DATA", + ROOT / "Standalone/data/owner_world.json")) +OUT_DEFAULT = Path(os.environ.get("VOXELFORGE_VERIFY_OUT", ROOT / "Saved/Linux/l142")) + +FLAT_FIELD = { + "version": 1, + "kind": "flatField", + "minimum_arena_clearance_m": 0.0, +} + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--out", type=Path, default=OUT_DEFAULT / "fixtures") + args = parser.parse_args() + args.out.mkdir(parents=True, exist_ok=True) + base = json.loads(OWNER.read_text(encoding="utf-8")) + + monolith = dict(base) + monolith["surface_profile_override"] = dict(FLAT_FIELD) + monolith["motif_family_override"] = { + "version": 1, + "strate_index": 0, + "placement_policy": "seed,strate,stable_id", + "motifs": [{ + "stable_id": "liminal/oversized-familiar-monolith-v1", + "kind": "cappedCylinder", + "radius_m": 1.6, + "height_m": 26.0, + "route_side_offset_m": 42.0, + "placement_radius_m": 0.0, + "fillet_radius_m": 0.6, + "blend_width_m": 1.2, + "minimum_spacing_m": 0.0, + "yaw_quarter_turns": 0, + "attachment": "seated_floor", + }], + } + + hills = dict(base) + hills["surface_profile_override"] = { + "version": 1, + "kind": "periodicHills", + "amplitude_x_m": 2.2, + "amplitude_y_m": 2.2, + "wavelength_x_m": 80.0, + "wavelength_y_m": 80.0, + "minimum_arena_clearance_m": 0.0, + } + + road_override = { + "stable_id": "liminal/road-clouds-v2", + "strate_index": 0, + "start_xy_m": [120.0, 340.0], + "path_length_m": 360.0, + "curve_control_offset_m": 84.0, + "deck_height_above_field_m": 44.0, + "rise_control_m": 22.0, + "half_width_m": 4.0, + "half_thickness_m": 1.0, + "sample_spacing_m": 2.0, + "support_spacing_m": 24.0, + "support_radius_m": 0.55, + } + road = dict(base) + road["surface_profile_override"] = dict(FLAT_FIELD) + road["liminal_road_override"] = dict(road_override) + + short_control = dict(base) + short_control["surface_profile_override"] = dict(FLAT_FIELD) + short_override = dict(road_override) + short_override["path_length_m"] = 180.0 + short_control["liminal_road_override"] = short_override + + pillars = dict(base) + pillars["surface_profile_override"] = dict(FLAT_FIELD) + pillars["liminal_pillar_grid_override"] = { + "stable_id": "liminal/horizon-pillar-grid-v1", + "strate_index": 0, + "center_xy_m": [700.0, 800.0], + "rows": 15, + "columns": 15, + "spacing_m": 76.0, + "radius_m": 5.5, + "height_m": 40.0, + } + + fixtures = ( + ("flatField-monolith", monolith), + ("periodicHills", hills), + ("road-in-clouds", road), + ("road-short-control", short_control), + ("pillar-grid", pillars), + ) + for name, fixture in fixtures: + path = args.out / f"liminal-{name}.json" + path.write_text(json.dumps(fixture, indent=2) + "\n", encoding="utf-8") + print(f"[L142Fixture] name={name} file={path} status=PASS") + + +if __name__ == "__main__": + main() diff --git a/Standalone/Research/WorldAssemblerM3/Linux142/CaptureL142.py b/Standalone/Research/WorldAssemblerM3/Linux142/CaptureL142.py new file mode 100644 index 0000000..ced17b1 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux142/CaptureL142.py @@ -0,0 +1,433 @@ +#!/usr/bin/env python3 +"""Run L142 liminal determinism checks, walk audits and multi-LOD captures.""" +from __future__ import annotations + +import argparse +import hashlib +import json +import math +import os +from pathlib import Path +import re +import subprocess +import sys +import time + + +ROOT = Path(__file__).resolve().parents[4] +OUT_DEFAULT = Path(os.environ.get("VOXELFORGE_VERIFY_OUT", ROOT / "Saved/Linux/l142")) +CAPTURE_DEFAULT = Path(__file__).resolve().parent / "captures" +LIMIT = ["taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--"] +Q_PER_METRE = 1024.0 +FOG_COLOR = "0.66,0.73,0.77" + +sys.path.insert(0, str(ROOT / "Standalone/Tools/verify")) +from runner import bounded_run, current_stamp, first_stamp + + +def fmt(values) -> str: + return ",".join(f"{value:.6f}" for value in values) + + +def sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as stream: + for block in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +def run_step(name: str, command: list[object], log: Path, *, env: dict[str, str], + stamped: bool = False, timeout_seconds: int = 1740, + expected_exit: int = 0) -> str: + expected_stamp = current_stamp() if stamped else None + if stamped: + binary = Path(str(command[0])) + probe = bounded_run([str(binary), "--print-source-stamp"], timeout=15) + if probe is None or probe.returncode != 0 or first_stamp(probe.stdout or "") != expected_stamp: + raise RuntimeError(f"{name} refused a stale executable: {binary}") + started = time.monotonic() + log.parent.mkdir(parents=True, exist_ok=True) + with log.open("w", encoding="utf-8") as stream: + result = subprocess.run([*LIMIT, f"timeout", f"{timeout_seconds}s", + *map(str, command)], cwd=ROOT, env=env, + stdout=stream, stderr=subprocess.STDOUT, + timeout=timeout_seconds + 5, check=False) + elapsed = time.monotonic() - started + output = log.read_text(encoding="utf-8", errors="replace") + print(f"[L142Run] step={name} elapsed_s={elapsed:.3f} exit={result.returncode} log={log}", + flush=True) + if stamped and (first_stamp(output) != expected_stamp or current_stamp() != expected_stamp): + raise RuntimeError(f"{name} source stamp mismatch; see {log}") + if result.returncode != expected_exit: + raise RuntimeError(f"{name} exit={result.returncode}, expected={expected_exit}; see {log}") + return output + + +def route_frame(manifest_path: Path) -> tuple[tuple[float, float, float], + tuple[float, float, float]]: + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + strata = [entry for entry in manifest["plan"]["strates"] + if entry.get("route") and len(entry["route"]) >= 2] + if not strata: + raise RuntimeError(f"no planned SurfaceWorld route in {manifest_path}") + route = strata[0]["route"] + points = [tuple(float(value) / Q_PER_METRE for value in item["position_q"]) + for item in route] + lengths = [math.dist(a, b) for a, b in zip(points, points[1:])] + total = sum(lengths) + if total <= 1.0e-6: + raise RuntimeError(f"degenerate planned route in {manifest_path}") + + def at(distance: float) -> tuple[float, float, float]: + remaining = max(0.0, min(total, distance)) + for index, (a, b, length) in enumerate(zip(points, points[1:], lengths)): + if remaining <= length or index == len(lengths) - 1: + if length <= 1.0e-9: + return b + t = remaining / length + return tuple(a[axis] + (b[axis] - a[axis]) * t for axis in range(3)) + remaining -= length + return points[-1] + + center = at(total * 0.5) + before, after = at(total * 0.5 - 1.0), at(total * 0.5 + 1.0) + dx, dy = after[0] - before[0], after[1] - before[1] + length = math.hypot(dx, dy) + if length <= 1.0e-9: + raise RuntimeError(f"degenerate route tangent in {manifest_path}") + return center, (dx / length, dy / length, 0.0) + + +def camera_angles(camera, target) -> tuple[float, float]: + dx, dy, dz = (target[index] - camera[index] for index in range(3)) + return math.degrees(math.atan2(dx, dy)), math.degrees(math.atan2(dz, math.hypot(dx, dy))) + + +def point_toward(camera, target) -> tuple[float, ...]: + yaw, pitch = camera_angles(camera, target) + return (*camera, yaw, pitch) + + +def stamp(layout: dict, stable_id: str) -> dict: + for record in layout.get("stamps", []): + if record.get("stable_id") == stable_id: + return record + raise RuntimeError(f"missing resolved stamp {stable_id}") + + +def make_views(name: str, manifest_path: Path, layout_path: Path): + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + layout = json.loads(layout_path.read_text(encoding="utf-8")) + center, tangent = route_frame(manifest_path) + tx, ty, _ = tangent + nx, ny = -ty, tx + base_height = manifest["recipe"]["surface_profile"]["h0_q"] / Q_PER_METRE + if name == "flatField-monolith": + monolith = stamp(layout, "liminal/oversized-familiar-monolith-v1") + sx, sy, _ = (value / 1.0e6 for value in monolith["position_um"]) + floor = monolith["floor_um"] / 1.0e6 + eye_camera = (sx - tx * 36.0, sy - ty * 36.0, floor + 1.6) + eye_target = (sx, sy, floor + 10.5) + wide_camera = (sx - tx * 42.0 - nx * 18.0, + sy - ty * 42.0 - ny * 18.0, floor + 42.0) + wide_target = (sx, sy, floor + 8.0) + return { + "eye": (eye_camera, eye_target, 20), + "wide": (wide_camera, wide_target, 24), + "height_center": floor, + "height_range": 38.0, + } + if name == "periodicHills": + # Route points are capsule centers: +0.72 m places the view at 1.60 m above ground. + eye_camera = (center[0], center[1], center[2] + 0.72) + eye_target = (center[0] - tx * 360.0, center[1] - ty * 360.0, + center[2] + 0.72) + wide_camera = (center[0] - tx * 36.0 - nx * 28.0, + center[1] - ty * 36.0 - ny * 28.0, center[2] + 30.0) + wide_target = (center[0] - tx * 310.0, center[1] - ty * 310.0, + center[2] + 0.72) + return { + "eye": (eye_camera, eye_target, 20), + "wide": (wide_camera, wide_target, 28), + "height_center": base_height, + "height_range": 6.0, + } + if name == "road-in-clouds": + deck = sorted((row for row in layout.get("stamps", []) + if row.get("stable_id", "").startswith("liminal/road-clouds-v2/deck/")), + key=lambda row: row["stable_id"]) + if len(deck) < 2: + raise RuntimeError("road layout has no resolved swept platform chain") + points = [tuple(value / 1.0e6 for value in row["position_um"]) + for row in deck] + tops = [point[2] + row["half_extents_um"][2] / 1.0e6 + for point, row in zip(points, deck)] + index = max(1, len(points) // 12) + camera_dx = points[index + 1][0] - points[index - 1][0] + camera_dy = points[index + 1][1] - points[index - 1][1] + camera_tangent_length = math.hypot(camera_dx, camera_dy) + camera_tx, camera_ty = (camera_dx / camera_tangent_length, + camera_dy / camera_tangent_length) + camera_nx, camera_ny = -camera_ty, camera_tx + eye_camera = (points[index][0] + camera_nx * 3.2, + points[index][1] + camera_ny * 3.2, tops[index] + 1.6) + eye_target = (points[index][0] + camera_tx * 90.0 + camera_nx * 60.0, + points[index][1] + camera_ty * 90.0 + camera_ny * 60.0, + tops[index] - 44.0) + middle = len(points) // 2 + dx = points[middle + 1][0] - points[middle - 1][0] + dy = points[middle + 1][1] - points[middle - 1][1] + tangent_length = math.hypot(dx, dy) + tx, ty = dx / tangent_length, dy / tangent_length + nx, ny = -ty, tx + wide_target_index = min(len(points) - 1, middle + 30) + wide_camera = (points[middle][0] - tx * 35.0 + nx * 30.0, + points[middle][1] - ty * 35.0 + ny * 30.0, + tops[middle] + 25.0) + wide_target = (points[wide_target_index][0], points[wide_target_index][1], + tops[wide_target_index] - 5.0) + return { + "eye": (eye_camera, eye_target, 3), + "wide": (wide_camera, wide_target, 3), + "height_center": base_height + 23.0, + "height_range": 60.0, + "road_deck": tops[middle], + "road_width": 2.0 * deck[middle]["half_extents_um"][1] / 1.0e6, + } + if name == "pillar-grid": + pillars = [row for row in layout.get("stamps", []) + if row.get("stable_id", "").startswith("liminal/horizon-pillar-grid-v1/pillar/")] + if len(pillars) < 9: + raise RuntimeError("pillar-grid layout has too few resolved supports") + xs = [row["position_um"][0] / 1.0e6 for row in pillars] + ys = [row["position_um"][1] / 1.0e6 for row in pillars] + floor = min((row["position_um"][2] - row["half_extents_um"][2]) / 1.0e6 + for row in pillars) + cx, cy = (min(xs) + max(xs)) * 0.5, (min(ys) + max(ys)) * 0.5 + eye_camera = (min(xs) - 78.0, cy, floor + 1.6) + eye_target = (max(xs) + 90.0, cy, floor + 1.6) + wide_camera = (cx - 280.0, cy - 420.0, floor + 230.0) + wide_target = (cx, cy, floor + 6.0) + return { + "eye": (eye_camera, eye_target, 3), + "wide": (wide_camera, wide_target, 3), + "height_center": floor + 12.0, + "height_range": 42.0, + } + raise RuntimeError(f"no capture framing for fixture {name}") + + +def headless_command(binary: Path, fixture: Path, camera, mesh: Path, + manifest: Path, layout: Path, workers: int, + clip_radius: int, *, hash_tiles: bool = False, + audit_road: bool = False, max_level: int = 0, + far_lods: bool = False, + max_clip_override: int | None = None) -> list[object]: + max_clip_level = (max_clip_override if max_clip_override is not None else + 8 if far_lods else max_level) + command: list[object] = [binary, fixture, f"--workers={workers}", + "--seed=0", "--world-assembler-prototype", "--stream-benchmark", "--stream-pipeline", + "--force-generate", f"--clip-radius={clip_radius}", + f"--max-clip-level={max_clip_level}", + f"--max-level={max_level}", "--render-distance-chunks=0", + f"--camera={fmt(point_toward(camera, (camera[0], camera[1] + 1.0, camera[2])))}", + f"--mesh-export={mesh}", f"--world-assembler-manifest-output={manifest}", + f"--resolved-layout-output={layout}"] + if hash_tiles: + command.append("--stream-hash-tiles") + if audit_road: + command.append("--audit-liminal-road-walk") + return command + + +def determinism_digest(output: str, manifest_path: Path, + layout_path: Path) -> tuple[str, str, str]: + tile_hashes = sorted(line for line in output.splitlines() + if line.startswith("[PipelineTileHash] ")) + if not manifest_path.is_file() or not layout_path.is_file() or not tile_hashes: + raise RuntimeError("determinism run omitted manifest, layout or per-tile hashes") + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + layout = json.loads(layout_path.read_text(encoding="utf-8")) + manifest_digest = (manifest["content_hash"],manifest["recipe"]["content_hash"], + manifest["plan"]["content_hash"]) + return ("|".join(manifest_digest),layout["stable_identity"],"\n".join(tile_hashes)) + + +def run_determinism(name: str, fixture: Path, view, *, binaries: dict[str, Path], + out: Path, env: dict[str, str]) -> None: + camera, _, _ = view["eye"] + clip_radius = 1 + max_clip = 0 + baseline = None + cells = 0 + for compiler, workers in ((compiler, workers) + for compiler in ("clang", "gcc") + for workers in (1, 8, 12)): + tag = f"{name}-{compiler}-w{workers}" + run_dir = out / "determinism" / tag + run_dir.mkdir(parents=True, exist_ok=True) + mesh = run_dir / "feature.vfmesh" + manifest = run_dir / "manifest.json" + layout = run_dir / "layout.json" + command = headless_command(binaries[compiler], fixture,camera,mesh,manifest, + layout,workers,max_clip,hash_tiles=True) + output = run_step(tag,command,out/"logs"/f"determinism-{tag}.log", + env=env,stamped=True) + digest = determinism_digest(output,manifest,layout) + if baseline is None: + baseline = digest + elif digest != baseline: + raise RuntimeError(f"{name} diverged at {compiler} W{workers}; see determinism logs") + cells += 1 + print(f"[L142Determinism] fixture={name} compiler_worker_cells={cells} identical=yes status=PASS", + flush=True) + + +def export_and_capture(name: str, fixture: Path, views: dict, *, + headless: Path, renderer: Path, out: Path, + artifact_dir: Path, env: dict[str, str]) -> None: + for view_name in ("eye", "wide"): + camera, target, clip_radius = views[view_name] + clip_radius = min(clip_radius,3) + stem = f"{name}-{view_name}" + mesh = out / "capture-meshes" / f"{stem}.vfmesh" + manifest = out / "capture-manifests" / f"{stem}.json" + layout = out / "capture-layouts" / f"{stem}.json" + png = out / "capture-png" / f"{stem}.png" + image = artifact_dir / f"{stem}.jpg" + for path in (mesh,manifest,layout,png,image): + path.parent.mkdir(parents=True,exist_ok=True) + command = headless_command(headless,fixture,camera,mesh,manifest,layout,12, + clip_radius,max_level=-1,far_lods=True, + max_clip_override=(2 if name == "road-in-clouds" and view_name == "wide" + else 3 if name == "road-in-clouds" else None)) + output = run_step(f"capture-{stem}-export",command, + out/"logs"/f"capture-{stem}-export.log",env=env,stamped=True) + if not mesh.is_file() or mesh.stat().st_size == 0: + raise RuntimeError(f"{stem} produced an empty mesh") + yaw, pitch = camera_angles(camera,target) + height_center = views["height_center"] + height_range = views["height_range"] + if name == "road-in-clouds": + fog_start,fog_end,fog_color=(24,260,"0.88,0.93,0.95") + elif name == "pillar-grid": + fog_start,fog_end,fog_color=220,1250,"0.82,0.88,0.91" + elif name == "periodicHills": + fog_start,fog_end,fog_color=210,1000,"0.78,0.84,0.88" + else: + fog_start,fog_end,fog_color=30,105,FOG_COLOR + renderer_command = [renderer,mesh,png,"--size=1600x900","--fov-deg=72", + f"--camera-m={fmt(camera)}",f"--yaw-deg={yaw:.6f}", + f"--pitch-deg={pitch:.6f}","--tile-skirts=on","--shade=readable", + "--headlamp=off","--height-tint=on",f"--height-center-m={height_center:.6f}", + f"--height-range-m={height_range:.6f}","--light-direction=-0.42,-0.58,0.70", + "--fog=on",f"--fog-start-m={fog_start}",f"--fog-end-m={fog_end}", + f"--fog-color={fog_color}"] + run_step(f"capture-{stem}-render",renderer_command, + out/"logs"/f"capture-{stem}-render.log",env=env,stamped=True) + run_step(f"capture-{stem}-jpeg",["ffmpeg","-nostdin","-hide_banner","-loglevel", + "error","-y","-i",png,"-frames:v","1","-q:v","4",image], + out/"logs"/f"capture-{stem}-jpeg.log",env=env) + quality = run_step(f"capture-{stem}-quality", + [sys.executable,ROOT/"Standalone/Tools/verify/capture_quality.py",image], + out/"logs"/f"capture-{stem}-quality.log",env=env) + if "[CaptureQuality]" not in quality or not image.is_file() \ + or image.stat().st_size > 300_000: + raise RuntimeError(f"{stem} capture failed quality or size checks") + eye_height = "1.600m" if view_name == "eye" else "wide" + print(f"[L142Capture] fixture={name} view={view_name} eye_height={eye_height} " + f"camera_m=({fmt(camera)}) target_m=({fmt(target)}) bytes={image.stat().st_size} " + f"sha256={sha256(image)} status=PASS",flush=True) + + +def run_road_walk_audit(fixture: Path, view, *, headless: Path, + out: Path, env: dict[str, str]) -> None: + camera = view["eye"][0] + run_dir = out / "road-walk-audit" + run_dir.mkdir(parents=True,exist_ok=True) + output = run_step("road-walk-audit",headless_command(headless,fixture,camera, + run_dir/"audit.vfmesh",run_dir/"manifest.json",run_dir/"layout.json",12,1, + audit_road=True),out/"logs"/"road-walk-audit.log",env=env,stamped=True) + if not re.search(r"\[LiminalRoadWalkAudit\].*status=PASS",output): + raise RuntimeError("raised road failed the Core capsule walk audit") + + +def run_road_short_negative_control(fixture: Path, view, *, headless: Path, + out: Path, env: dict[str, str]) -> None: + camera = view["eye"][0] + run_dir = out / "road-short-negative-control" + run_dir.mkdir(parents=True,exist_ok=True) + output = run_step("road-short-negative-control", + headless_command(headless,fixture,camera,run_dir/"control.vfmesh", + run_dir/"manifest.json",run_dir/"layout.json",12,1,audit_road=True), + out/"logs"/"road-short-negative-control.log",env=env,stamped=True, + expected_exit=14) + match = re.search(r"\[LiminalRoadWalkAudit\].*path_length_m=([0-9.]+).*status=FAIL",output) + if not match or float(match.group(1)) >= 300.0: + raise RuntimeError("short-road negative control did not falsify the length gate") + print(f"[L142RoadNegativeControl] path_length_m={match.group(1)} " + "expected=FAIL status=PASS",flush=True) + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--out", type=Path, default=OUT_DEFAULT) + parser.add_argument("--artifact-dir", type=Path, default=CAPTURE_DEFAULT) + parser.add_argument("--headless-clang", type=Path, required=True) + parser.add_argument("--headless-gcc", type=Path, required=True) + parser.add_argument("--renderer", type=Path, required=True) + args = parser.parse_args() + + out = args.out.resolve() + artifact_dir = args.artifact_dir.resolve() + fixture_dir = out / "fixtures" + for directory in (out,fixture_dir,artifact_dir): + directory.mkdir(parents=True,exist_ok=True) + env = os.environ.copy() + env["VOXELFORGE_VERIFY_OUT"] = str(out) + env["VOXELFORGE_OWNER_DATA"] = str(ROOT/"Standalone/data/owner_world.json") + env["LP_NUM_THREADS"] = "12" + env["XDG_CACHE_HOME"] = str(out/"xdg-cache") + run_step("build-fixtures",[sys.executable, + ROOT/"Standalone/Research/WorldAssemblerM3/Linux142/BuildL142Fixtures.py", + f"--out={fixture_dir}"],out/"logs"/"build-fixtures.log",env=env) + + binaries = {"clang":args.headless_clang.resolve(),"gcc":args.headless_gcc.resolve()} + fixtures = { + "flatField-monolith":fixture_dir/"liminal-flatField-monolith.json", + "periodicHills":fixture_dir/"liminal-periodicHills.json", + "road-in-clouds":fixture_dir/"liminal-road-in-clouds.json", + "pillar-grid":fixture_dir/"liminal-pillar-grid.json", + } + probed = {} + for name,fixture in fixtures.items(): + probe_dir=out/"plan-probes"/name + probe_dir.mkdir(parents=True,exist_ok=True) + camera=(0.0,0.0,-500.0) + output=run_step(f"plan-probe-{name}",headless_command(binaries["clang"],fixture, + camera,probe_dir/"probe.vfmesh",probe_dir/"manifest.json", + probe_dir/"layout.json",12,1),out/"logs"/f"plan-probe-{name}.log", + env=env,stamped=True) + if "[WorldAssemblerFullManifest]" not in output: + raise RuntimeError(f"{name} probe omitted its full plan manifest") + probed[name]=make_views(name,probe_dir/"manifest.json",probe_dir/"layout.json") + + for name,fixture in fixtures.items(): + run_determinism(name,fixture,probed[name],binaries=binaries,out=out,env=env) + run_road_walk_audit(fixtures["road-in-clouds"],probed["road-in-clouds"], + headless=binaries["clang"],out=out,env=env) + run_road_short_negative_control(fixture_dir/"liminal-road-short-control.json", + probed["road-in-clouds"],headless=binaries["clang"],out=out,env=env) + for name,fixture in fixtures.items(): + export_and_capture(name,fixture,probed[name],headless=binaries["clang"], + renderer=args.renderer.resolve(),out=out,artifact_dir=artifact_dir,env=env) + return 0 + + +if __name__ == "__main__": + try: + raise SystemExit(main()) + except Exception as error: + print(f"[L142Capture] status=FAIL error={error}",file=sys.stderr,flush=True) + raise SystemExit(1) diff --git a/Standalone/Research/WorldAssemblerM3/Linux142/REPORT.md b/Standalone/Research/WorldAssemblerM3/Linux142/REPORT.md new file mode 100644 index 0000000..44de717 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux142/REPORT.md @@ -0,0 +1,46 @@ +# L142 — liminal pass 2 + +| Hills: eye height | Hills: wide | +|---|---| +| ![Periodic hills from eye height](captures/periodicHills-eye.jpg) | ![Periodic hills to the horizon](captures/periodicHills-wide.jpg) | + +| Road: eye height | Road: wide | +|---|---| +| ![Road edge over the cloud floor](captures/road-in-clouds-eye.jpg) | ![Swept road deck and supports above the cloud floor](captures/road-in-clouds-wide.jpg) | + +| Pillar grid: eye height | Pillar grid: wide | +|---|---| +| ![Pillars repeating along the horizon](captures/pillar-grid-eye.jpg) | ![Pillar grid from above](captures/pillar-grid-wide.jpg) | + +| Monolith: eye height | Monolith: wide | +|---|---| +| ![The retained monolith slice at eye height](captures/flatField-monolith-eye.jpg) | ![The retained monolith slice wide](captures/flatField-monolith-wide.jpg) | + +## Result + +The wide hill capture shows the validated 80 m repeating profile continuing across the horizon. The capture now streams LOD 0–8; the profile period and validator are unchanged. + +The road is a cubic swept path made from overlapping solid deck segments, not a chain of platform stamps. The earlier platform chain produced top steps; the swept deck passes the surface-sampled walk audit. Its wide view is capped at LOD 2 to keep the deck legible, so that frame shows a local section; the full route length is measured by the audit. + +The R47 addition is a 15×15 grid of identical pillars, spaced 76 m apart across a 1,064 m span. The monolith eye and wide views are retained as the first liminal slice. + +## Measurements + +- **Road:** 376.827 m horizontal path length, 8.000 m width, and 12.061° maximum sampled surface grade against the 15° limit. The deck rises and falls along the cubic profile. It has 17 supports at about 24 m spacing; the flat cloud floor is 44 m below the deck centerline (about 45 m below the walking surface), with pale fog in both views. +- **Walk audit:** 901 surface stations at no more than 0.5 m spacing; 56,763 capsule samples; 0 blocked samples, 0 unsupported samples across 5,871 support probes, 0 grade failures, and 0 missed surface probes. The 180 m short-road control measured 210.341 m and failed the 300 m gate as expected. +- **Capture quality:** all eight fixtures/views passed the image-quality gate at 1600×900. Hills and pillars stream through LOD 8; road eye and wide views use caps 3 and 2 respectively. +- **Determinism:** the monolith, hills, road, and pillar fixtures each matched across Clang and GCC at W1, W8, and W12 (six compiler/worker cells per fixture), on source stamp `72f239e9534faa27e3796fe29207403b190558403841aeebc87d8e75e98e34c7`. + +## Checks + +- Clang 19 and GCC builds passed with floating-point contraction off, four build jobs, and the L142 source stamp. +- `Standalone/Tools/verify/verify.py fast --out Saved/Linux/l142 --overall-timeout 1740` passed. Both current owner fixtures produced all 12 canonical hash rows matching the pinned L130-v227 baseline; W1 and W12 also matched each other. +- The fast summary retains non-gating differences against older L46/L53 diagnostic baselines; the current pinned L130 canonical checks pass. +- The L142 capture runner passed the walk audit, the short-road negative control, all four determinism comparisons, and all eight image-quality checks. Final logs are in `Saved/Linux/l142/logs/`. +- No Unreal build or performance timing matrix was run. No Unreal `Source/` files changed. The inherited single-run near-ready timing step was removed from this picture-and-geometry runner rather than treated as a timing result. + +## Remaining limits + +The road wide capture frames a local section at LOD 2 to retain a continuous deck; the 376.827 m length is established by the full-route walk audit. Captures use the standalone Linux renderer rather than an Unreal viewport. + +Changed Unreal `Source/` files: none. diff --git a/Standalone/Research/WorldAssemblerM3/Linux142/captures/flatField-monolith-eye.jpg b/Standalone/Research/WorldAssemblerM3/Linux142/captures/flatField-monolith-eye.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13eb05226c68fa203b35cb08c2c8e4b0d13fc301 GIT binary patch literal 26523 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 literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux142/captures/flatField-monolith-wide.jpg b/Standalone/Research/WorldAssemblerM3/Linux142/captures/flatField-monolith-wide.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3975e8ae20d5aff093f2c6b6a46c1988bb15d244 GIT binary patch literal 23358 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 BeH{P* literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux142/captures/periodicHills-eye.jpg b/Standalone/Research/WorldAssemblerM3/Linux142/captures/periodicHills-eye.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92ba34ac5a8a18214eabea40811f3d28c32b284d GIT binary patch literal 25065 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 b8d^9dSVcWNEtAsrTKpWq&bx? literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux142/captures/periodicHills-wide.jpg b/Standalone/Research/WorldAssemblerM3/Linux142/captures/periodicHills-wide.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c066a5fcf6028b8c2de48ce7f842f6d8bffc31d GIT binary patch literal 60906 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

a*gkIH0^TluevPE-TKlgAflYj9P_sLo$j$ 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 literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux142/captures/pillar-grid-wide.jpg b/Standalone/Research/WorldAssemblerM3/Linux142/captures/pillar-grid-wide.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5b1a2cd5c611875b2a00da9e3d551a4e08b58235 GIT binary patch literal 39595 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 F`9Egh%>@7e literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux142/captures/road-in-clouds-eye.jpg b/Standalone/Research/WorldAssemblerM3/Linux142/captures/road-in-clouds-eye.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5413752eb091f2829612777c0e500a4ea9218d76 GIT binary patch literal 34408 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 literal 0 HcmV?d00001 diff --git a/Standalone/Source/StreamBenchmarkHeadless.cpp b/Standalone/Source/StreamBenchmarkHeadless.cpp index bc48c9d..d8ed139 100644 --- a/Standalone/Source/StreamBenchmarkHeadless.cpp +++ b/Standalone/Source/StreamBenchmarkHeadless.cpp @@ -1882,8 +1882,11 @@ int main(int argc,char** argv) ownerJsonRoot.Get("motif_family_override").Data); const bool hasLiminalRoad=!std::holds_alternative( ownerJsonRoot.Get("liminal_road_override").Data); - if(hasMotifFamily&&hasLiminalRoad) - {std::fprintf(stderr,"motif_family_override and liminal_road_override cannot be combined\n");return 2;} + const bool hasLiminalPillarGrid=!std::holds_alternative( + ownerJsonRoot.Get("liminal_pillar_grid_override").Data); + if((hasMotifFamily&&hasLiminalRoad)||(hasMotifFamily&&hasLiminalPillarGrid) + ||(hasLiminalRoad&&hasLiminalPillarGrid)) + {std::fprintf(stderr,"liminal content overrides must be used in separate fixtures\n");return 2;} if(hasMotifFamily) { std::vector requests; @@ -1914,22 +1917,62 @@ int main(int argc,char** argv) } if(hasLiminalRoad) { - std::vector requests(1); - if(!StandaloneWorldAssemblyPrototype::BuildLiminalRoadRequest(ownerJsonRoot, - *ownerWorld,worldAssembly,resolvedLayout,requests.front(),error) + std::vector requests; + if(!StandaloneWorldAssemblyPrototype::BuildLiminalRoadRequests(ownerJsonRoot, + *ownerWorld,worldAssembly,resolvedLayout,requests,error) ||!VoxelForgeCore::ResolveResolvedLayoutStampsV1( resolvedLayout,seed,requests,error)) {std::fprintf(stderr,"Liminal road resolution failed: %s\n",error.c_str());return 2;} - const auto& road=resolvedLayout.stamps.front(); - std::printf("[LiminalRoadResolved] vocabulary=%u id=%s strate=%d shape=rounded_dais " - "center_m=(%.3f,%.3f,%.3f) top_m=%.3f span_m=%.3f width_m=%.3f " - "grade_deg=0.000 placement=free route_keepout=PASS band_clearance=PASS status=PASS\n", - resolvedLayout.stampVocabularyVersion,road.stableId.c_str(),road.strateIndex, - road.positionMicrometres[0]/1.0e6,road.positionMicrometres[1]/1.0e6, - road.positionMicrometres[2]/1.0e6, - (road.positionMicrometres[2]+road.halfExtentsMicrometres[2])/1.0e6, - 2.0*road.halfExtentsMicrometres[0]/1.0e6, - 2.0*road.halfExtentsMicrometres[1]/1.0e6); + std::vector deck; + std::size_t supportCount=0; + const std::string deckPrefix="liminal/road-clouds-v2/deck/"; + const std::string supportPrefix="liminal/road-clouds-v2/support/"; + for(const auto& stamp:resolvedLayout.stamps) + { + if(stamp.stableId.starts_with(deckPrefix))deck.push_back(&stamp); + else if(stamp.stableId.starts_with(supportPrefix))++supportCount; + } + std::sort(deck.begin(),deck.end(),[](const auto* a,const auto* b) + {return a->stableIdstableId;}); + double pathLength=0.0,maxGradeDegrees=0.0; + for(std::size_t i=0;isweepEndpointsMicrometres[1][0] + -segment->sweepEndpointsMicrometres[0][0])/1.0e6; + const double dy=(segment->sweepEndpointsMicrometres[1][1] + -segment->sweepEndpointsMicrometres[0][1])/1.0e6; + const double dz=std::abs(segment->sweepEndpointsMicrometres[1][2] + -segment->sweepEndpointsMicrometres[0][2])/1.0e6; + const double horizontal=std::hypot(dx,dy); + pathLength+=horizontal; + maxGradeDegrees=std::max(maxGradeDegrees, + std::atan2(dz,horizontal)*57.29577951308232); + } + const double width=deck.empty()?0.0: + 2.0*deck.front()->halfExtentsMicrometres[1]/1.0e6; + std::printf("[LiminalRoadResolved] vocabulary=%u id=liminal/road-clouds-v2 " + "strate=%d shape=swept_deck_segments deck_segments=%zu supports=%zu " + "path_length_m=%.3f width_m=%.3f grade_max_deg=%.3f " + "placement=free route_keepout=PASS band_clearance=PASS status=%s\n", + resolvedLayout.stampVocabularyVersion, + deck.empty()?-1:deck.front()->strateIndex,deck.size(),supportCount,pathLength, + width,maxGradeDegrees,deck.size()>1&&pathLength>=300.0&&width>=3.0 + &&maxGradeDegrees<=15.0?"PASS":"FAIL"); + if(deck.size()<2||pathLength<80.0||width<3.0||maxGradeDegrees>15.0) + {std::fprintf(stderr,"Liminal road resolved outside the walkable road bounds\n");return 2;} + } + if(hasLiminalPillarGrid) + { + std::vector requests; + if(!StandaloneWorldAssemblyPrototype::BuildLiminalPillarGridRequests(ownerJsonRoot, + *ownerWorld,worldAssembly,resolvedLayout,requests,error) + ||!VoxelForgeCore::ResolveResolvedLayoutStampsV1( + resolvedLayout,seed,requests,error)) + {std::fprintf(stderr,"Liminal pillar-grid resolution failed: %s\n",error.c_str());return 2;} + std::printf("[LiminalPillarGridResolved] vocabulary=%u pillars=%zu shape=identical_vertical_cylinders " + "placement=regular_grid route_keepout=PASS band_clearance=PASS status=PASS\n", + resolvedLayout.stampVocabularyVersion,resolvedLayout.stamps.size()); } if(options.LandmarkChamberDemo) { diff --git a/Standalone/Source/StreamBenchmarkPipeline.h b/Standalone/Source/StreamBenchmarkPipeline.h index e151fbd..dab5001 100644 --- a/Standalone/Source/StreamBenchmarkPipeline.h +++ b/Standalone/Source/StreamBenchmarkPipeline.h @@ -2966,53 +2966,122 @@ namespace StandaloneStreamBenchmark { bool found=false; bool passed=true; + std::vector deck; + constexpr std::string_view DeckPrefix="liminal/road-clouds-v2/deck/"; for(const auto& road:ResolvedLayout->stamps) { - if(road.stableId!="liminal/raised-road-v1")continue; + if(road.stableId.starts_with(DeckPrefix))deck.push_back(&road); + } + if(!deck.empty()) + { found=true; - const bool longAxisX=(road.yawQuarterTurns&1u)==0; - const double centerX=road.positionMicrometres[0]/1.0e6; - const double centerY=road.positionMicrometres[1]/1.0e6; - const double centerZ=road.positionMicrometres[2]/1.0e6; - const double halfLength=road.halfExtentsMicrometres[longAxisX?0:1]/1.0e6; - const double halfWidth=road.halfExtentsMicrometres[longAxisX?1:0]/1.0e6; - const double deckZ=centerZ+road.halfExtentsMicrometres[2]/1.0e6; - constexpr double CapsuleRadiusMetres=0.34; + std::sort(deck.begin(),deck.end(),[](const auto* a,const auto* b) + {return a->stableIdstableId;}); constexpr double CapsuleHeightMetres=1.76; constexpr double HalfCapsuleHeightMetres=CapsuleHeightMetres*0.5; - constexpr double EndInsetMetres=1.0; + constexpr double SlopeCapsuleClearanceMetres=0.12; std::vector> roadPath; - const double inset=std::min(EndInsetMetres,halfLength*0.25); - for(const double along:{-halfLength+inset,halfLength-inset}) - roadPath.push_back({(centerX+(longAxisX?along:0.0))/coreMetres, - (centerY+(longAxisX?0.0:along))/coreMetres, - (deckZ+HalfCapsuleHeightMetres)/coreMetres}); + roadPath.reserve(deck.size()*4); + std::vector> centerline; + centerline.reserve(deck.size()+1); + bool surfacePathValid=true; + for(std::size_t i=0;ikind!=VoxelForgeCore::ResolvedSdfStampKindV1::fillSweptDeckSegment) + surfacePathValid=false; + const auto point=[&](std::size_t endpoint) + {return std::array{ + segment->sweepEndpointsMicrometres[endpoint][0]/1.0e6, + segment->sweepEndpointsMicrometres[endpoint][1]/1.0e6, + segment->sweepEndpointsMicrometres[endpoint][2]/1.0e6};}; + const auto a=point(0),b=point(1); + if(i==0)centerline.push_back(a); + else if(std::abs(centerline.back()[0]-a[0])>1.0e-6 + ||std::abs(centerline.back()[1]-a[1])>1.0e-6 + ||std::abs(centerline.back()[2]-a[2])>1.0e-6) + surfacePathValid=false; + centerline.push_back(b); + } + double pathLengthMetres=0.0,maxGradeDegrees=0.0; + std::uint64_t surfaceProbes=0,surfaceMisses=0; + const auto surfaceTopAt=[&](double xMetres,double yMetres, + double nominalTop,double& surfaceTop) + { + ++surfaceProbes; + double low=nominalTop-0.25,high=nominalTop+1.0; + if(Shape.densityAt({xMetres/coreMetres,yMetres/coreMetres, + low/coreMetres})>=0.0f + ||Shape.densityAt({xMetres/coreMetres,yMetres/coreMetres, + high/coreMetres})<0.0f) + {++surfaceMisses;return false;} + for(int iteration=0;iteration<20;++iteration) + { + const double middle=(low+high)*0.5; + if(Shape.densityAt({xMetres/coreMetres,yMetres/coreMetres, + middle/coreMetres})<0.0f)low=middle; + else high=middle; + } + surfaceTop=high; + return true; + }; + const double halfThickness=deck.front()->halfExtentsMicrometres[2]/1.0e6; + for(std::size_t segment=1;segment(1, + static_cast(std::ceil(horizontal/0.5))); + for(std::uint64_t step=0;step<=intervals;++step) + { + if(segment>1&&step==0)continue; + const double t=static_cast(step)/intervals; + const double x=a[0]+dx*t,y=a[1]+dy*t; + const double nominalTop=a[2]+(b[2]-a[2])*t+halfThickness; + double actualTop=nominalTop; + if(!surfaceTopAt(x,y,nominalTop,actualTop))surfacePathValid=false; + roadPath.push_back({x/coreMetres,y/coreMetres, + (actualTop+HalfCapsuleHeightMetres + +SlopeCapsuleClearanceMetres)/coreMetres}); + } + } + for(std::size_t i=1;i=2.0*CapsuleRadiusMetres - &&gradeDegrees<=15.0&&roadAudit.passed; - std::printf("[LiminalRoadWalkAudit] id=%s stations=%llu capsule_samples=%llu " + const double widthMetres=2.0*deck.front()->halfExtentsMicrometres[1]/1.0e6; + passed=std::all_of(deck.begin(),deck.end(),[](const auto* road) + {return road->kind==VoxelForgeCore::ResolvedSdfStampKindV1::fillSweptDeckSegment;}) + &&pathLengthMetres>=300.0&&widthMetres>=3.0 + &&maxGradeDegrees<=15.0&&surfacePathValid&&roadAudit.passed; + std::printf("[LiminalRoadWalkAudit] id=liminal/road-clouds-v2 " + "deck_stamps=%zu path_length_m=%.3f stations=%llu capsule_samples=%llu " "blocked=%llu support_samples=%llu unsupported=%llu grade_failures=%llu " - "width_m=%.3f capsule_diameter_m=%.3f grade_deg=%.3f grade_limit_deg=15.000 " - "status=%s\n",road.stableId.c_str(), + "surface_probes=%llu surface_misses=%llu width_m=%.3f minimum_width_m=3.000 " + "max_grade_deg=%.3f grade_limit_deg=15.000 status=%s\n", + deck.size(),pathLengthMetres, static_cast(roadAudit.centers), static_cast(roadAudit.capsuleSamples), static_cast(roadAudit.blocked), static_cast(roadAudit.supportSamples), static_cast(roadAudit.unsupported), - static_cast(roadAudit.gradeFailures),widthMetres, - 2.0*CapsuleRadiusMetres,gradeDegrees,passed?"PASS":"FAIL"); + static_cast(roadAudit.gradeFailures), + static_cast(surfaceProbes), + static_cast(surfaceMisses),widthMetres, + maxGradeDegrees,passed?"PASS":"FAIL"); } if(!found&&required) { - std::printf("[LiminalRoadWalkAudit] status=FAIL reason=road_stamp_missing\n"); + std::printf("[LiminalRoadWalkAudit] status=FAIL reason=road_path_missing\n"); return false; } return passed; diff --git a/Standalone/Source/WorldAssemblyPrototype.h b/Standalone/Source/WorldAssemblyPrototype.h index bafe419..8897078 100644 --- a/Standalone/Source/WorldAssemblyPrototype.h +++ b/Standalone/Source/WorldAssemblyPrototype.h @@ -587,13 +587,15 @@ namespace StandaloneWorldAssemblyPrototype return true; } - inline bool BuildLiminalRoadRequest(const VFJson::Value& root, + inline bool BuildLiminalRoadRequests(const VFJson::Value& root, const FStandaloneOwnerWorld& owner, const VoxelForgeCore::WorldAssemblyManifest& assembly, const VoxelForgeCore::ResolvedLayoutSnapshotV3& layout, - VoxelForgeCore::ResolvedLayoutStampRequestV1& request,std::string& error) + std::vector& requests, + std::string& error) { using namespace VoxelForgeCore; + requests.clear(); const VFJson::Value& overrideValue=root.Get("liminal_road_override"); if(!overrideValue.IsObject()) {error="liminal_road_override must be an object";return false;} @@ -604,49 +606,229 @@ namespace StandaloneWorldAssemblyPrototype const VFJson::Value& strateValue=overrideValue.Get("strate_index"); const auto* id=std::get_if(&overrideValue.Get("stable_id").Data); - const auto& position=overrideValue.Get("position_xy_m").AsArray(); - const auto& extents=overrideValue.Get("half_extents_m").AsArray(); - const VFJson::Value& heightValue=overrideValue.Get("deck_height_above_field_m"); - const VFJson::Value& yawValue=overrideValue.Get("yaw_quarter_turns"); - if(!strateValue.IsNumber()||!id||id->empty()||position.size()!=2||extents.size()!=3 - ||!heightValue.IsNumber()||!std::isfinite(heightValue.Number()) - ||!yawValue.IsNumber()||yawValue.Integer()<0||yawValue.Integer()>3) - {error="liminal road requires stable_id, strate_index, position, extents, deck height and yaw";return false;} + const auto& position=overrideValue.Get("start_xy_m").AsArray(); + const auto readNumber=[&](const char* key,double fallback,double& result) + { + const VFJson::Value& value=overrideValue.Get(key); + if(std::holds_alternative(value.Data)) + {result=fallback;return true;} + if(!value.IsNumber()||!std::isfinite(value.Number()))return false; + result=value.Number();return true; + }; + double pathLength=0.0,curveControl=0.0,deckHeight=0.0,riseControl=0.0; + double halfWidth=0.0,halfThickness=0.0,sampleSpacing=0.0; + double supportSpacing=0.0,supportRadius=0.0; + if(!strateValue.IsNumber()||!id||id->empty()||position.size()!=2 + ||!readNumber("path_length_m",360.0,pathLength) + ||!readNumber("curve_control_offset_m",84.0,curveControl) + ||!readNumber("deck_height_above_field_m",44.0,deckHeight) + ||!readNumber("rise_control_m",22.0,riseControl) + ||!readNumber("half_width_m",3.2,halfWidth) + ||!readNumber("half_thickness_m",0.65,halfThickness) + ||!readNumber("sample_spacing_m",1.0,sampleSpacing) + ||!readNumber("support_spacing_m",24.0,supportSpacing) + ||!readNumber("support_radius_m",0.55,supportRadius)) + {error="liminal road requires a valid identity, start, and finite path parameters";return false;} for(const auto& value:position) if(!value.IsNumber()||!std::isfinite(value.Number())) - {error="liminal road position_xy_m must contain finite metre values";return false;} - for(const auto& value:extents) - if(!value.IsNumber()||!std::isfinite(value.Number()) - ||value.Number()<0.5||value.Number()>100.0) - {error="liminal road half_extents_m must contain values from 0.5 to 100 metres";return false;} - if(heightValue.Number()<1.0||heightValue.Number()>100.0) - {error="liminal road deck height must be from 1 to 100 metres above the field";return false;} + {error="liminal road start_xy_m must contain finite metre values";return false;} + if(std::abs(position[0].Number())>5000.0||std::abs(position[1].Number())>5000.0 + ||pathLength<80.0||pathLength>1000.0||curveControl<0.0||curveControl>200.0 + ||deckHeight<30.0||deckHeight>60.0||riseControl<0.0||riseControl>30.0 + ||halfWidth<1.5||halfWidth>10.0||halfThickness<0.5||halfThickness>3.0 + ||sampleSpacing<1.0||sampleSpacing>6.0 + ||supportSpacing<8.0||supportSpacing>60.0 + ||supportRadius<0.5||supportRadius>1.5) + {error="liminal road dimensions are outside the bounded walkable-road ranges";return false;} const auto strateIndex=static_cast(strateValue.Integer()); const auto strate=std::find_if(layout.strates.begin(),layout.strates.end(), [strateIndex](const auto& value){return value.strateIndex==strateIndex &&value.generatorKind=="SurfaceWorld";}); if(strate==layout.strates.end()) {error="liminal_road_override must select a resolved SurfaceWorld strate";return false;} - if(extents[0].Number()<10.0||extents[1].Number()<0.75 - ||extents[0].Number()<=extents[1].Number()*4.0) - {error="liminal road must be long and narrow, with at least 1.5 metres half-width";return false;} const auto metresToMicrometres=[](double value) {return static_cast(std::llround(value*1000000.0));}; const std::int64_t fieldFloorMicrometres=static_cast(std::llround( static_cast(assembly.recipe.surfaceProfile.h0Subvoxels) *owner.CoreVoxelSizeMicrons/WorldAssemblySubvoxelsPerVoxel)); - request={}; - request.stableId=*id; - request.strateIndex=strateIndex; - request.kind=ResolvedSdfStampKindV1::fillDais; - request.anchorPositionMicrometres={metresToMicrometres(position[0].Number()), - metresToMicrometres(position[1].Number()), - fieldFloorMicrometres+metresToMicrometres(heightValue.Number()) - -metresToMicrometres(extents[2].Number())}; - request.halfExtentsMicrometres={metresToMicrometres(extents[0].Number()), - metresToMicrometres(extents[1].Number()),metresToMicrometres(extents[2].Number())}; - request.yawQuarterTurns=static_cast(yawValue.Integer()); + const std::int64_t startX=metresToMicrometres(position[0].Number()); + const std::int64_t startY=metresToMicrometres(position[1].Number()); + const std::int64_t lengthUm=metresToMicrometres(pathLength); + const std::int64_t lateralUm=metresToMicrometres(curveControl); + const std::int64_t deckBaseUm=fieldFloorMicrometres+metresToMicrometres(deckHeight); + const std::int64_t riseUm=metresToMicrometres(riseControl); + const std::int64_t halfWidthUm=metresToMicrometres(halfWidth); + const std::int64_t halfThicknessUm=metresToMicrometres(halfThickness); + const std::uint32_t steps=static_cast(std::ceil(pathLength/sampleSpacing)); + const auto lerpInteger=[steps](std::int64_t a,std::int64_t b,std::uint32_t i) + { + const std::int64_t numerator=(b-a)*static_cast(i); + const std::int64_t rounded=numerator>=0 + ?numerator+static_cast(steps/2) + :numerator-static_cast(steps/2); + return a+rounded/static_cast(steps); + }; + const auto bezier=[&](const std::array& controls,std::uint32_t i) + { + const std::int64_t a=lerpInteger(controls[0],controls[1],i); + const std::int64_t b=lerpInteger(controls[1],controls[2],i); + const std::int64_t c=lerpInteger(controls[2],controls[3],i); + const std::int64_t d=lerpInteger(a,b,i); + const std::int64_t e=lerpInteger(b,c,i); + return lerpInteger(d,e,i); + }; + const std::array xControls={startX, + startX+lengthUm/3,startX+(2*lengthUm)/3,startX+lengthUm}; + const std::array yControls={startY,startY+lateralUm, + startY-lateralUm,startY}; + const std::array zControls={deckBaseUm,deckBaseUm+riseUm, + deckBaseUm-riseUm,deckBaseUm}; + std::vector> path; + path.reserve(static_cast(steps)+1); + const auto halfUp=[](std::int64_t numerator,std::int64_t denominator) + {return (numerator>=0?numerator+denominator/2:numerator-denominator/2)/denominator;}; + for(std::uint32_t i=0;i<=steps;++i) + { + const auto t=static_cast(i); + const auto n=static_cast(steps); + path.push_back({xControls[0]+halfUp(lengthUm*t,n), + bezier(yControls,i),bezier(zControls,i)}); + } + const auto makeStamp=[&](std::string stableId,ResolvedSdfStampKindV1 kind, + const std::array& positionUm, + const std::array& halfExtentsUm,std::int64_t smoothWidthUm) + { + ResolvedLayoutStampRequestV1 request; + request.stableId=std::move(stableId);request.strateIndex=strateIndex; + request.kind=kind;request.anchorPositionMicrometres=positionUm; + request.halfExtentsMicrometres=halfExtentsUm; + request.smoothWidthMicrometres=smoothWidthUm; + requests.push_back(std::move(request)); + }; + const std::int64_t deckSmoothUm=250000; + const std::int64_t segmentOverlapUm=350000; + for(std::uint32_t i=1;i(b[0]-a[0]); + const double dy=static_cast(b[1]-a[1]); + const double dz=static_cast(b[2]-a[2]); + const std::int64_t halfLengthUm=static_cast(std::ceil( + std::sqrt(dx*dx+dy*dy+dz*dz)*0.5))+segmentOverlapUm; + ResolvedLayoutStampRequestV1 request; + request.stableId=*id+"/deck/"+std::to_string(10000+i-1).substr(1); + request.strateIndex=strateIndex; + request.kind=ResolvedSdfStampKindV1::fillSweptDeckSegment; + request.anchorPositionMicrometres={ + (a[0]+b[0])/2,(a[1]+b[1])/2,(a[2]+b[2])/2}; + request.sweepEndpointsMicrometres={a,b}; + request.halfExtentsMicrometres={halfLengthUm,halfWidthUm,halfThicknessUm}; + request.smoothWidthMicrometres=deckSmoothUm; + requests.push_back(std::move(request)); + } + const std::int64_t supportBaseUm=fieldFloorMicrometres-2000000; + const std::int64_t supportRadiusUm=metresToMicrometres(supportRadius); + double distanceSinceSupport=supportSpacing; + std::uint32_t supportIndex=0; + for(std::uint32_t i=0;i0) + { + const auto& a=path[i-1];const auto& b=path[i]; + const double dx=static_cast(b[0]-a[0]); + const double dy=static_cast(b[1]-a[1]); + distanceSinceSupport+=std::hypot(dx,dy)/1000000.0; + } + if(i!=0&&i+1!=path.size()&&distanceSinceSupport& requests, + std::string& error) + { + using namespace VoxelForgeCore; + requests.clear(); + const VFJson::Value& overrideValue=root.Get("liminal_pillar_grid_override"); + if(!overrideValue.IsObject()) + {error="liminal_pillar_grid_override must be an object";return false;} + if(assembly.recipe.surfaceProfile.version!=1 + ||assembly.recipe.surfaceProfile.kind!=WorldAssemblySurfaceProfileKindV1::flatField + ||owner.CoreVoxelSizeMicrons==0) + {error="the liminal pillar grid requires a valid flatField SurfaceWorld recipe";return false;} + const auto* id=std::get_if(&overrideValue.Get("stable_id").Data); + const VFJson::Value& strateValue=overrideValue.Get("strate_index"); + const auto& center=overrideValue.Get("center_xy_m").AsArray(); + const auto readNumber=[&](const char* key,double fallback,double& result) + { + const VFJson::Value& value=overrideValue.Get(key); + if(std::holds_alternative(value.Data)) + {result=fallback;return true;} + if(!value.IsNumber()||!std::isfinite(value.Number()))return false; + result=value.Number();return true; + }; + double spacing=0.0,radius=0.0,height=0.0; + const VFJson::Value& rowsValue=overrideValue.Get("rows"); + const VFJson::Value& columnsValue=overrideValue.Get("columns"); + if(!id||id->empty()||!strateValue.IsNumber()||center.size()!=2 + ||!readNumber("spacing_m",76.0,spacing) + ||!readNumber("radius_m",4.0,radius) + ||!readNumber("height_m",28.0,height) + ||!rowsValue.IsNumber()||!columnsValue.IsNumber()) + {error="liminal pillar grid requires an identity, center, dimensions and counts";return false;} + for(const auto& value:center) + if(!value.IsNumber()||!std::isfinite(value.Number())) + {error="liminal pillar grid center_xy_m must contain finite metre values";return false;} + const int rows=static_cast(rowsValue.Integer()); + const int columns=static_cast(columnsValue.Integer()); + if(rows<3||rows>15||columns<3||columns>15||spacing<32.0||spacing>120.0 + ||radius<2.0||radius>12.0||height<12.0||height>60.0 + ||std::abs(center[0].Number())>5000.0||std::abs(center[1].Number())>5000) + {error="liminal pillar grid dimensions are outside their bounded ranges";return false;} + const auto strateIndex=static_cast(strateValue.Integer()); + const auto strate=std::find_if(layout.strates.begin(),layout.strates.end(), + [strateIndex](const auto& value){return value.strateIndex==strateIndex + &&value.generatorKind=="SurfaceWorld";}); + if(strate==layout.strates.end()) + {error="liminal_pillar_grid_override must select a resolved SurfaceWorld strate";return false;} + const auto toMicrometres=[](double value) + {return static_cast(std::llround(value*1000000.0));}; + const std::int64_t floorUm=static_cast(std::llround( + static_cast(assembly.recipe.surfaceProfile.h0Subvoxels) + *owner.CoreVoxelSizeMicrons/WorldAssemblySubvoxelsPerVoxel)); + const std::int64_t spacingUm=toMicrometres(spacing); + const std::int64_t radiusUm=toMicrometres(radius); + const std::int64_t halfHeightUm=toMicrometres(height*0.5); + const int rowStart=-(rows/2),columnStart=-(columns/2); + for(int row=0;row