From ff52c9b57639877ff20eb35b5c0249f2dc5ef724 Mon Sep 17 00:00:00 2001 From: Fr0zka Date: Mon, 2 Nov 2026 10:11:37 +0100 Subject: [PATCH] proto: liminal looks - pool rooms, backrooms grid, staircase to nowhere, terraced hills (L161) Stamp vocabulary v7 (opt-in fillBox, carveBox, fillSteps; carveArch reused); flat-field liminal stamp fixtures; capsule walk audit with doorway-width gate (1.2 m control fails as expected). Clang/GCC W1/W8/W12 identical; owner canonical hashes unchanged; fast tier 273/273. Terraced wide view not yet legible. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1 --- .../include/VoxelForgeCore/VoxelForgeCore.h | 10 +- Standalone/Core/src/ResolvedLayoutInternal.h | 33 +- Standalone/Core/src/ShapeWorldInternal.h | 27 +- .../Linux161/BuildL161Fixtures.py | 226 +++++++++++++ .../WorldAssemblerM3/Linux161/CaptureL161.py | 320 ++++++++++++++++++ .../WorldAssemblerM3/Linux161/REPORT.md | 31 ++ .../Linux161/captures/backrooms-grid-eye.jpg | Bin 0 -> 26205 bytes .../Linux161/captures/backrooms-grid-wide.jpg | Bin 0 -> 25827 bytes .../Linux161/captures/pool-rooms-eye.jpg | Bin 0 -> 37559 bytes .../Linux161/captures/pool-rooms-wide.jpg | Bin 0 -> 38988 bytes .../captures/staircase-to-nowhere-eye.jpg | Bin 0 -> 49258 bytes .../captures/staircase-to-nowhere-wide.jpg | Bin 0 -> 50535 bytes .../Linux161/captures/terraced-hills-eye.jpg | Bin 0 -> 42669 bytes .../Linux161/captures/terraced-hills-wide.jpg | Bin 0 -> 58446 bytes Standalone/Source/StreamBenchmarkHeadless.cpp | 37 +- Standalone/Source/StreamBenchmarkPipeline.h | 86 ++++- Standalone/Source/WorldAssemblyPrototype.h | 103 ++++++ 17 files changed, 861 insertions(+), 12 deletions(-) create mode 100644 Standalone/Research/WorldAssemblerM3/Linux161/BuildL161Fixtures.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux161/CaptureL161.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux161/REPORT.md create mode 100644 Standalone/Research/WorldAssemblerM3/Linux161/captures/backrooms-grid-eye.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux161/captures/backrooms-grid-wide.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux161/captures/pool-rooms-eye.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux161/captures/pool-rooms-wide.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux161/captures/staircase-to-nowhere-eye.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux161/captures/staircase-to-nowhere-wide.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux161/captures/terraced-hills-eye.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux161/captures/terraced-hills-wide.jpg diff --git a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h index bb96727..422cdf2 100644 --- a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h +++ b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h @@ -968,6 +968,7 @@ namespace VoxelForgeCore inline constexpr std::uint32_t ResolvedLayoutStampVocabularyVersionV4 = 4; inline constexpr std::uint32_t ResolvedLayoutStampVocabularyVersionV5 = 5; inline constexpr std::uint32_t ResolvedLayoutStampVocabularyVersionV6 = 6; + inline constexpr std::uint32_t ResolvedLayoutStampVocabularyVersionV7 = 7; inline constexpr std::uint32_t ResolvedLayoutCavernGraphVocabularyVersionV1 = 1; inline constexpr std::uint32_t ResolvedLayoutOreVeinVocabularyVersionV1 = 1; enum class ResolvedLayoutValidationModeV3 : std::uint8_t { compatibility, strict }; @@ -982,7 +983,10 @@ namespace VoxelForgeCore fillDais = 4, fillMonolith = 5, fillPlatform = 6, - fillSweptDeckSegment = 7 + fillSweptDeckSegment = 7, + fillBox = 8, + carveBox = 9, + fillSteps = 10 }; struct ResolvedLayoutStampRequestV1 @@ -1005,6 +1009,9 @@ namespace VoxelForgeCore std::int64_t irregularityWavelengthMicrometres = 0; std::int64_t roundingRadiusMicrometres = 0; std::int64_t minimumSpacingMicrometres = 0; + // Vocabulary 7: fillSteps divides the X and Z extents into this many + // identical treads and risers. Other stamp kinds keep this at zero. + std::uint16_t stepCount = 0; // 0 = free placement, 1 = seated on the authored flat profile floor. std::uint8_t attachmentPolicy = 0; std::int64_t floorMicrometres = 0; @@ -1027,6 +1034,7 @@ namespace VoxelForgeCore std::int64_t irregularityWavelengthMicrometres = 0; std::int64_t roundingRadiusMicrometres = 0; std::int64_t minimumSpacingMicrometres = 0; + std::uint16_t stepCount = 0; std::uint8_t attachmentPolicy = 0; std::int64_t floorMicrometres = 0; std::uint64_t irregularitySeed = 0; diff --git a/Standalone/Core/src/ResolvedLayoutInternal.h b/Standalone/Core/src/ResolvedLayoutInternal.h index 813a129..d4fea3d 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::fillSweptDeckSegment); + &&value<=static_cast(ResolvedSdfStampKindV1::fillSteps); } bool LayoutStampIsMotif(ResolvedSdfStampKindV1 kind) {return kind==ResolvedSdfStampKindV1::fillMonolith @@ -711,6 +711,8 @@ namespace <<",\"minimum_spacing_um\":"<(stamp.attachmentPolicy) <<",\"floor_um\":"< stampIds; for(const auto& stamp:stamps) { @@ -1292,8 +1295,18 @@ bool ResolvedLayoutSnapshotV3::validate(ResolvedLayoutValidationModeV3 mode, if(!LayoutStampKindValid(stamp.kind)||stamp.yawQuarterTurns>3 ||(stamp.kind==ResolvedSdfStampKindV1::fillSweptDeckSegment &&stampVocabularyVersion128 + ||stamp.roundingRadiusMicrometres!=0)) + ||(stamp.kind!=ResolvedSdfStampKindV1::fillSteps&&stamp.stepCount!=0)) + add("stamp_steps",stamp.stableId+" has an invalid step count or rounding mode"); bool validExtents=true; for(const auto extent:stamp.halfExtentsMicrometres) validExtents=validExtents&&extent>=500000&&extent<=100000000; @@ -1777,6 +1790,7 @@ std::optional ResolvedLayoutSnapshotV3::FromJson( stamp.floorMicrometres=LayoutInt(v,"floor_um"); stamp.irregularitySeed=static_cast(LayoutInt(v,"irregularity_seed")); stamp.yawQuarterTurns=static_cast(LayoutInt(v,"yaw_quarter_turns")); + stamp.stepCount=static_cast(LayoutInt(v,"step_count")); s.stamps.push_back(std::move(stamp)); } for(const auto& v:root.Get("cavern_rooms").AsArray()) @@ -1901,7 +1915,13 @@ bool ResolveResolvedLayoutStampsV1(ResolvedLayoutSnapshotV3& layout,std::int32_t }); const bool hasSweptDeck=std::any_of(ordered.begin(),ordered.end(),[](const auto& request) {return request.kind==ResolvedSdfStampKindV1::fillSweptDeckSegment;}); - candidate.stampVocabularyVersion=hasContinuousSweptDeck + const bool hasVocabulary7Stamp=std::any_of(ordered.begin(),ordered.end(),[](const auto& request) + {return request.kind==ResolvedSdfStampKindV1::fillBox + ||request.kind==ResolvedSdfStampKindV1::carveBox + ||request.kind==ResolvedSdfStampKindV1::fillSteps;}); + candidate.stampVocabularyVersion=hasVocabulary7Stamp + ?ResolvedLayoutStampVocabularyVersionV7 + :hasContinuousSweptDeck ?(hasNonMonotoneSweptDeck?ResolvedLayoutStampVocabularyVersionV6 :ResolvedLayoutStampVocabularyVersionV5) :hasSweptDeck?ResolvedLayoutStampVocabularyVersionV4 @@ -1914,6 +1934,10 @@ bool ResolveResolvedLayoutStampsV1(ResolvedLayoutSnapshotV3& layout,std::int32_t &&ordered[requestIndex-1].stableId==request.stableId)) {error="stamp requests require non-empty unique stable IDs";return false;} if(!LayoutStampKindValid(request.kind)||request.yawQuarterTurns>3 + ||(request.kind==ResolvedSdfStampKindV1::fillSteps + ?(request.stepCount<2||request.stepCount>128 + ||request.roundingRadiusMicrometres!=0) + :request.stepCount!=0) ||request.placementRadiusMicrometres<0 ||request.placementRadiusMicrometres>100000000 ||(request.kind==ResolvedSdfStampKindV1::fillSweptDeckSegment @@ -1998,6 +2022,7 @@ bool ResolveResolvedLayoutStampsV1(ResolvedLayoutSnapshotV3& layout,std::int32_t stamp.smoothWidthMicrometres=request.smoothWidthMicrometres; stamp.irregularityAmplitudeMicrometres=request.irregularityAmplitudeMicrometres; stamp.irregularityWavelengthMicrometres=request.irregularityWavelengthMicrometres; + stamp.stepCount=request.stepCount; stamp.irregularitySeed=baseSeed;stamp.yawQuarterTurns=request.yawQuarterTurns; std::array offset{}; if(request.placementRadiusMicrometres>0) diff --git a/Standalone/Core/src/ShapeWorldInternal.h b/Standalone/Core/src/ShapeWorldInternal.h index 29d4977..768fb94 100644 --- a/Standalone/Core/src/ShapeWorldInternal.h +++ b/Standalone/Core/src/ShapeWorldInternal.h @@ -7157,6 +7157,23 @@ private: const float top=std::max(StampEllipsoidSdf(x,y,z,halfSize),-z); return SmoothMinDistance(lower,top,round*2.0f); } + static float StampStepsSdf(float x,float y,float z, + const std::array& halfSize,std::uint16_t stepCount) + { + if(stepCount<2||stepCount>128)return std::numeric_limits::infinity(); + const float treadWidth=(2.0f*halfSize[0])/stepCount; + const float riserHeight=(2.0f*halfSize[2])/stepCount; + float distance=std::numeric_limits::infinity(); + for(std::uint16_t step=0;step extent={treadWidth*0.5f,halfSize[1],stepHeight*0.5f}; + distance=std::min(distance,StampRoundedBoxSdf(x-centerX,y,z-centerZ,extent,0.0f)); + } + return distance; + } static float StampContinuousSweptDeckSdf(const FStampRuntime& stamp, float x,float y,float z) { @@ -7295,6 +7312,13 @@ private: case VoxelForgeCore::ResolvedSdfStampKindV1::fillPlatform: distance=StampRoundedBoxSdf(localX,localY,localZ, stamp.halfExtentsVoxels,stamp.roundingRadiusVoxels);break; + case VoxelForgeCore::ResolvedSdfStampKindV1::fillBox: + case VoxelForgeCore::ResolvedSdfStampKindV1::carveBox: + distance=StampRoundedBoxSdf(localX,localY,localZ, + stamp.halfExtentsVoxels,stamp.roundingRadiusVoxels);break; + case VoxelForgeCore::ResolvedSdfStampKindV1::fillSteps: + distance=StampStepsSdf(localX,localY,localZ,stamp.halfExtentsVoxels, + stamp.record->stepCount);break; case VoxelForgeCore::ResolvedSdfStampKindV1::fillDais: if(ResolvedLayout&&ResolvedLayout->stampVocabularyVersion >=VoxelForgeCore::ResolvedLayoutStampVocabularyVersionV2) @@ -7471,7 +7495,8 @@ private: ||worldMicrometres[axis]>record.boundsMaximumMicrometres[axis])return; const float distance=StampSdf(runtime,X,Y,Z); if(record.kind==VoxelForgeCore::ResolvedSdfStampKindV1::carveEllipsoid - ||record.kind==VoxelForgeCore::ResolvedSdfStampKindV1::carveArch) + ||record.kind==VoxelForgeCore::ResolvedSdfStampKindV1::carveArch + ||record.kind==VoxelForgeCore::ResolvedSdfStampKindV1::carveBox) composed=SmoothMaxDistance(composed,-distance,runtime.smoothWidthVoxels); else composed=SmoothMinDistance(composed,distance,runtime.smoothWidthVoxels); diff --git a/Standalone/Research/WorldAssemblerM3/Linux161/BuildL161Fixtures.py b/Standalone/Research/WorldAssemblerM3/Linux161/BuildL161Fixtures.py new file mode 100644 index 0000000..985d3ed --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux161/BuildL161Fixtures.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python3 +"""Build four standalone liminal geometry fixtures and their capsule-walk specs.""" +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/l161")) +FLAT_FIELD = {"version": 1, "kind": "flatField", "minimum_arena_clearance_m": 0.0} + + +def stamp(stamps: list[dict], stable_id: str, kind: str, x: float, y: float, + z: float, half: tuple[float, float, float], *, yaw: int = 0, + steps: int | None = None) -> None: + row = { + "stable_id": stable_id, + "kind": kind, + "anchor_xy_m": [x, y], + "z_offset_m": z, + "half_extents_m": list(half), + "yaw_quarter_turns": yaw, + } + if steps is not None: + row["step_count"] = steps + stamps.append(row) + + +def fixture(name: str, stamps: list[dict], walk_points: list[tuple[float, float, float]], + doors: list[dict], *, center: tuple[float, float], wide_camera: tuple[float, float, float], + eye_camera: tuple[float, float, float], eye_target_offset: tuple[float, float, float], + wide_target_offset: tuple[float, float, float], + eye_clip: int, wide_clip: int) -> tuple[str, dict, dict]: + root = json.loads(OWNER.read_text(encoding="utf-8")) + root["surface_profile_override"] = dict(FLAT_FIELD) + root["liminal_stamp_fixture_override"] = { + "version": 1, + "strate_index": 0, + "stamps": stamps, + } + walk = { + "version": 1, + "path_points_offset_m": [list(point) for point in walk_points], + "door_prefixes": doors, + } + views = { + "center_xy_m": list(center), + "eye_camera_offset_m": list(eye_camera), + "wide_camera_offset_m": list(wide_camera), + "eye_target_offset_m": list(eye_target_offset), + "wide_target_offset_m": list(wide_target_offset), + "eye_clip_radius": eye_clip, + "wide_clip_radius": wide_clip, + } + return name, root, {"walk": walk, "views": views} + + +def pool_rooms() -> tuple[str, dict, dict]: + stamps: list[dict] = [] + cx, cy, cell, cells = 520.0, 440.0, 20.0, 7 + half = cell * cells * 0.5 + wall_height, wall_half_thickness = 9.0, 1.2 + for line in range(cells + 1): + offset = (line - cells * 0.5) * cell + stamp(stamps, f"liminal/pool-rooms-v1/00-wall-x/{line:02d}", "fillBox", + cx + offset, cy, wall_height * 0.5, + (wall_half_thickness, half, wall_height * 0.5)) + stamp(stamps, f"liminal/pool-rooms-v1/00-wall-y/{line:02d}", "fillBox", + cx, cy + offset, wall_height * 0.5, + (half, wall_half_thickness, wall_height * 0.5)) + for row in range(cells): + y = cy + (row - (cells - 1) * 0.5) * cell + for line in range(cells + 1): + x = cx + (line - cells * 0.5) * cell + stamp(stamps, f"liminal/pool-rooms-v1/01-doorway-x/{row:02d}-{line:02d}", + "carveArch", x, y + 7.0, 4.0, (3.6, 1.55, 4.0), yaw=1) + stamp(stamps, f"liminal/pool-rooms-v1/01-doorway-y/{line:02d}-{row:02d}", + "carveArch", cx + (row - (cells - 1) * 0.5) * cell, + cy + (line - cells * 0.5) * cell, 4.0, + (3.6, 1.55, 4.0)) + for row in range(cells): + y = cy + (row - (cells - 1) * 0.5) * cell + for column in range(cells): + x = cx + (column - (cells - 1) * 0.5) * cell + stamp(stamps, f"liminal/pool-rooms-v1/02-roof/{row:02d}-{column:02d}", + "fillBox", x, y, 9.4, (10.0, 10.0, 0.5)) + stamp(stamps, f"liminal/pool-rooms-v1/03-skylight/{row:02d}-{column:02d}", + "carveBox", x, y, 9.4, (5.5, 5.5, 1.0)) + stamp(stamps, f"liminal/pool-rooms-v1/04-basin/{row:02d}-{column:02d}", + "carveBox", x, y, -1.0, (5.5, 5.5, 1.5)) + path_y = cy + 7.0 + walk = [(-half - 2.0 + cx, path_y, 0.88), (half + 2.0 + cx, path_y, 0.88)] + doors = [ + {"prefix": "liminal/pool-rooms-v1/01-doorway-x/", "width_axis": 0, + "minimum_width_m": 1.5}, + {"prefix": "liminal/pool-rooms-v1/01-doorway-y/", "width_axis": 0, + "minimum_width_m": 1.5}, + ] + return fixture("pool-rooms", stamps, walk, doors, center=(cx, cy), + wide_camera=(-60.0, 7.0, 3.0), eye_camera=(-40.0, 7.0, 1.6), + eye_target_offset=(60.0, 7.0, 0.8), + wide_target_offset=(65.0, 7.0, 1.2), eye_clip=4, wide_clip=7) + + +def backrooms(width: float = 4.0, name: str = "backrooms-grid") -> tuple[str, dict, dict]: + stamps: list[dict] = [] + cx, cy, cell, cells = 820.0, 420.0, 18.0, 7 + half, wall_half = cell * cells * 0.5, 1.2 + wall_height = 5.5 + for line in range(cells + 1): + offset = (line - cells * 0.5) * cell + stamp(stamps, f"liminal/backrooms-grid-v1/00-wall-x/{line:02d}", "fillBox", + cx + offset, cy, wall_height * 0.5, + (wall_half, half, wall_height * 0.5)) + stamp(stamps, f"liminal/backrooms-grid-v1/00-wall-y/{line:02d}", "fillBox", + cx, cy + offset, wall_height * 0.5, + (half, wall_half, wall_height * 0.5)) + door_half = width * 0.5 + for row in range(cells): + y = cy + (row - (cells - 1) * 0.5) * cell + for line in range(cells + 1): + x = cx + (line - cells * 0.5) * cell + stamp(stamps, f"liminal/backrooms-grid-v1/01-door-x/{row:02d}-{line:02d}", + "carveBox", x, y, 1.25, (1.6, door_half, 1.25)) + stamp(stamps, f"liminal/backrooms-grid-v1/01-door-y/{line:02d}-{row:02d}", + "carveBox", cx + (row - (cells - 1) * 0.5) * cell, + cy + (line - cells * 0.5) * cell, 1.25, + (door_half, 1.6, 1.25)) + stamp(stamps, "liminal/backrooms-grid-v1/02-ceiling", "fillBox", + cx, cy, 5.9, (half, half, 0.5)) + walk = [(cx - half - 2.0, cy, 0.88), (cx + half + 2.0, cy, 0.88)] + doors = [ + {"prefix": "liminal/backrooms-grid-v1/01-door-x/", "width_axis": 1, + "minimum_width_m": 1.5}, + {"prefix": "liminal/backrooms-grid-v1/01-door-y/", "width_axis": 0, + "minimum_width_m": 1.5}, + ] + return fixture(name, stamps, walk, doors, center=(cx, cy), + wide_camera=(-42.0, -6.0, 1.6), eye_camera=(-54.0, 0.0, 1.6), + eye_target_offset=(102.0, 0.0, 1.6), + wide_target_offset=(80.0, 20.0, 0.0), eye_clip=6, wide_clip=6) + + +def nowhere_stairs() -> tuple[str, dict, dict]: + stamps: list[dict] = [] + cx, cy = 300.0, -760.0 + stamp(stamps, "liminal/staircase-nowhere-v1/00-stair", "fillSteps", + cx, cy, 6.0, (32.0, 4.0, 6.0), steps=64) + stamp(stamps, "liminal/staircase-nowhere-v1/04-landing", "fillBox", + cx + 40.5, cy, 11.5, (9.0, 4.5, 0.5)) + stamp(stamps, "liminal/staircase-nowhere-v1/02-arch-wall", "fillBox", + cx + 38.0, cy, 7.5, (1.2, 6.5, 7.5)) + stamp(stamps, "liminal/staircase-nowhere-v1/03-doorway-arch", "carveArch", + cx + 38.0, cy, 7.0, (5.0, 5.0, 7.0), yaw=1) + # Begin high enough to clear the first riser with the audit capsule, then + # walk the same ascending staircase through the arch and onto the landing. + points = [(cx - 32.5, cy, 0.88 + 12.0 / 64.0 + 0.05)] + tread, rise = 64.0 / 64, 12.0 / 64 + for index in range(64): + points.append((cx - 32.0 + (index + 0.5) * tread, + cy, 0.88 + (index + 1) * rise + 0.05)) + points.extend([(cx + 34.0, cy, 12.93), (cx + 38.0, cy, 12.93), + (cx + 44.0, cy, 12.93)]) + doors = [{"prefix": "liminal/staircase-nowhere-v1/03-doorway-arch", "width_axis": 0, + "minimum_width_m": 1.5}] + return fixture("staircase-to-nowhere", stamps, points, doors, center=(cx, cy), + wide_camera=(-8.0, -32.0, 36.0), eye_camera=(10.0, 0.0, 9.7), + eye_target_offset=(38.0, 0.0, 13.6), + wide_target_offset=(42.0, 0.0, 11.0), eye_clip=4, wide_clip=6) + + +def terraced_hills() -> tuple[str, dict, dict]: + stamps: list[dict] = [] + cx, cy, rows, spacing = -520.0, -500.0, 9, 96.0 + half_run, half_width, half_rise, steps = 48.0, 40.0, 8.0, 80 + for row in range(rows): + y = cy + (row - (rows - 1) * 0.5) * spacing + stamp(stamps, f"liminal/terraced-hills-v1/ridge/{row:02d}/rise-west", + "fillSteps", cx - half_run, y, half_rise, + (half_run, half_width, half_rise), steps=steps) + stamp(stamps, f"liminal/terraced-hills-v1/ridge/{row:02d}/rise-east", + "fillSteps", cx + half_run, y, half_rise, + (half_run, half_width, half_rise), yaw=2, steps=steps) + points = [(cx - 100.0, cy, 0.93)] + tread, rise = (2.0 * half_run) / steps, (2.0 * half_rise) / steps + for index in range(steps): + points.append((cx - 2.0 * half_run + (index + 0.5) * tread, + cy, 0.93 + (index + 1) * rise)) + for index in reversed(range(steps)): + points.append((cx + 2.0 * half_run - (index + 0.5) * tread, + cy, 0.93 + (index + 1) * rise)) + points.append((cx + 100.0, cy, 0.93)) + return fixture("terraced-hills", stamps, points, [], center=(cx, cy), + wide_camera=(-40.0, 0.0, 20.0), eye_camera=(-60.0, 0.0, 7.8), + eye_target_offset=(0.0, 0.0, 14.5), + wide_target_offset=(100.0, 0.0, -10.0), eye_clip=4, wide_clip=3) + + +def write(path: Path, value: dict) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(value, indent=2) + "\n", encoding="utf-8") + + +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) + specs = args.out / "walk-specs" + fixtures = [pool_rooms(), backrooms(), nowhere_stairs(), terraced_hills()] + fixtures.append(backrooms(width=1.2, name="backrooms-narrow-control")) + for name, world, metadata in fixtures: + write(args.out / f"liminal-{name}.json", world) + write(specs / f"{name}.json", metadata["walk"]) + write(args.out / "views" / f"{name}.json", metadata["views"]) + print(f"[L161Fixture] name={name} stamps=" + f"{len(world['liminal_stamp_fixture_override']['stamps'])} status=PASS") + + +if __name__ == "__main__": + main() diff --git a/Standalone/Research/WorldAssemblerM3/Linux161/CaptureL161.py b/Standalone/Research/WorldAssemblerM3/Linux161/CaptureL161.py new file mode 100644 index 0000000..9babcaa --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux161/CaptureL161.py @@ -0,0 +1,320 @@ +#!/usr/bin/env python3 +"""Run L161 stamp-fixture determinism, walk audits and two-view 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/l161")) +CAPTURE_DEFAULT = Path(__file__).resolve().parent / "captures" +LIMIT = ["taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--"] +Q_PER_METRE = 1024.0 +FOG_COLOR = "0.78,0.84,0.87" + +sys.path.insert(0, str(ROOT / "Standalone/Tools/verify")) +from runner import 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, expected_exit: int = 0, + timeout_seconds: int = 1740) -> str: + expected_stamp = current_stamp() if stamped else None + if stamped: + probe = subprocess.run([str(command[0]), "--print-source-stamp"], cwd=ROOT, + capture_output=True, text=True, timeout=15, check=False) + if probe.returncode != 0 or first_stamp(probe.stdout) != expected_stamp: + raise RuntimeError(f"{name} refused a stale executable: {command[0]}") + log.parent.mkdir(parents=True, exist_ok=True) + started = time.monotonic() + with log.open("w", encoding="utf-8") as stream: + result = subprocess.run([*LIMIT, "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"[L161Run] 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 camera_for(view: dict, floor: float, name: str, kind: str) -> tuple[float, float, float]: + center_x, center_y = view["center_xy_m"] + offset = view[f"{kind}_camera_offset_m"] + z = floor + offset[2] + if name == "backrooms-grid" or name == "backrooms-narrow-control": + z = floor + offset[2] + return center_x + offset[0], center_y + offset[1], z + + +def target_for(view: dict, floor: float, name: str, kind: str) -> tuple[float, float, float]: + center_x, center_y = view["center_xy_m"] + offset = view[f"{kind}_target_offset_m"] + return center_x + offset[0], center_y + offset[1], floor + offset[2] + + +def headless_command(binary: Path, fixture: Path, camera, mesh: Path, + manifest: Path, layout: Path, workers: int, clip_radius: int, + *, max_level: int = 0, hash_tiles: bool = False, + audit_path: Path | None = None) -> list[object]: + 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_level}", f"--max-level={max_level}", + "--render-distance-chunks=0", + f"--camera={fmt((*camera, 0.0, 0.0))}", 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_path is not None: + command.append(f"--audit-liminal-stamp-walk={audit_path}") + return command + + +def 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, resolved layout or tile hashes") + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + layout = json.loads(layout_path.read_text(encoding="utf-8")) + manifest_digest = "|".join((manifest["content_hash"], + manifest["recipe"]["content_hash"], manifest["plan"]["content_hash"])) + return manifest_digest, layout["stable_identity"], "\n".join(tile_hashes) + + +def write_walk_audit(spec_path: Path, manifest_path: Path, audit_path: Path) -> None: + spec = json.loads(spec_path.read_text(encoding="utf-8")) + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + surface = manifest["recipe"]["surface_profile"] + floor = surface["h0_q"] / Q_PER_METRE + lines = ["# P records are world metres; doorway width axes use the resolved stamp's local extents."] + for gate in spec["door_prefixes"]: + lines.append(f"D {gate['prefix']} {gate['width_axis']} {gate['minimum_width_m']:.6f}") + for x, y, z_offset in spec["path_points_offset_m"]: + lines.append(f"P {x:.6f} {y:.6f} {floor + z_offset:.6f}") + audit_path.parent.mkdir(parents=True, exist_ok=True) + audit_path.write_text("\n".join(lines) + "\n", encoding="utf-8") + + +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 build_plan(binary: Path, name: str, fixture: Path, view: dict, + out: Path, env: dict[str, str]) -> tuple[Path, Path, dict, dict]: + run_dir = out / "plan-probes" / name + run_dir.mkdir(parents=True, exist_ok=True) + manifest, layout = run_dir / "manifest.json", run_dir / "layout.json" + mesh = run_dir / "probe.vfmesh" + camera = (view["center_xy_m"][0], view["center_xy_m"][1], -500.0) + output = run_step(f"plan-{name}", headless_command(binary, fixture, camera, + mesh, manifest, layout, 12, 1), out / "logs" / f"plan-{name}.log", + env=env, stamped=True) + if "[LiminalStampFixtureResolved] vocabulary=7" not in output: + raise RuntimeError(f"{name} did not resolve with stamp vocabulary 7") + if not manifest.is_file() or not layout.is_file(): + raise RuntimeError(f"{name} plan probe omitted its outputs") + manifest_value = json.loads(manifest.read_text(encoding="utf-8")) + layout_value = json.loads(layout.read_text(encoding="utf-8")) + return manifest, layout, manifest_value, layout_value + + +def run_determinism(name: str, fixture: Path, view: dict, floor: float, + binaries: dict[str, Path], out: Path, env: dict[str, str]) -> None: + camera = camera_for(view, floor, name, "eye") + baseline = None + 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, manifest, layout = (run_dir / "fixture.vfmesh", + run_dir / "manifest.json", run_dir / "layout.json") + output = run_step(tag, headless_command(binaries[compiler], fixture, + camera, mesh, manifest, layout, workers, 1, + hash_tiles=True), out / "logs" / f"determinism-{tag}.log", + env=env, stamped=True) + result = digest(output, manifest, layout) + if baseline is None: + baseline = result + elif result != baseline: + raise RuntimeError(f"{name} diverged at {compiler} W{workers}; see determinism logs") + print(f"[L161Determinism] fixture={name} compiler_worker_cells=6 identical=yes status=PASS", + flush=True) + + +def run_walk_audit(name: str, fixture: Path, view: dict, floor: float, + spec: Path, binary: Path, out: Path, env: dict[str, str], + *, expected_exit: int = 0) -> str: + camera = camera_for(view, floor, name, "eye") + run_dir = out / "walk-audits" / name + run_dir.mkdir(parents=True, exist_ok=True) + manifest = run_dir / "manifest.json" + layout = run_dir / "layout.json" + mesh = run_dir / "audit.vfmesh" + audit_path = run_dir / "walk.path" + # Use a fixture-specific manifest, so the path uses the exact authored floor height. + plan = out / "plan-probes" / name / "manifest.json" + if not plan.is_file(): + raise RuntimeError(f"{name} has no resolved manifest for its walk audit") + write_walk_audit(spec, plan, audit_path) + output = run_step(f"walk-{name}", headless_command(binary, fixture, camera, + mesh, manifest, layout, 12, 1, audit_path=audit_path), + out / "logs" / f"walk-{name}.log", env=env, stamped=True, + expected_exit=expected_exit) + expected_status = "FAIL" if expected_exit else "PASS" + if not re.search(rf"\[LiminalStampWalkAudit\].*status={expected_status}\b", output): + raise RuntimeError(f"{name} walk audit did not report expected {expected_status}") + return output + + +def capture(name: str, fixture: Path, view: dict, floor: float, *, kind: str, + binary: Path, renderer: Path, out: Path, artifact_dir: Path, + env: dict[str, str]) -> None: + camera = camera_for(view, floor, name, kind) + target = target_for(view, floor, name, kind) + clip_radius = int(view[f"{kind}_clip_radius"]) + max_level = 1 if name == "terraced-hills" and kind == "wide" else 0 + stem = f"{name}-{kind}" + run_dir = out / "captures" / stem + run_dir.mkdir(parents=True, exist_ok=True) + mesh, manifest, layout = (run_dir / "capture.vfmesh", + run_dir / "manifest.json", run_dir / "layout.json") + png = run_dir / "capture.png" + image = artifact_dir / f"{stem}.jpg" + output = run_step(f"capture-export-{stem}", headless_command(binary, + fixture, camera, mesh, manifest, layout, 12, clip_radius, + max_level=max_level), out / "logs" / f"capture-export-{stem}.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) + if name == "backrooms-grid": + fog_start, fog_end, fog_color = 90, 500, "0.82,0.83,0.76" + elif name == "pool-rooms": + fog_start, fog_end, fog_color = 90, 480, "0.76,0.84,0.87" + elif name == "staircase-to-nowhere": + fog_start, fog_end, fog_color = 110, 700, "0.78,0.84,0.87" + else: + fog_start, fog_end, fog_color = 160, 1050, "0.78,0.84,0.89" + 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={floor + 3.0:.6f}", "--height-range-m=30.0", + "--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-render-{stem}", renderer_command, + out / "logs" / f"capture-render-{stem}.log", env=env, stamped=True) + run_step(f"capture-jpeg-{stem}", ["ffmpeg", "-nostdin", "-hide_banner", + "-loglevel", "error", "-y", "-i", png, "-frames:v", "1", "-q:v", "4", image], + out / "logs" / f"capture-jpeg-{stem}.log", env=env) + quality = run_step(f"capture-quality-{stem}", [sys.executable, + ROOT / "Standalone/Tools/verify/capture_quality.py", image], + out / "logs" / f"capture-quality-{stem}.log", env=env) + if "[CaptureQuality]" not in quality or not image.is_file() or image.stat().st_size > 300_000: + raise RuntimeError(f"{stem} failed image quality or size checks") + print(f"[L161Capture] fixture={name} view={kind} camera_m=({fmt(camera)}) " + f"target_m=({fmt(target)}) bytes={image.stat().st_size} " + f"sha256={sha256(image)} 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, artifact_dir = args.out.resolve(), 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, + Path(__file__).resolve().parent / "BuildL161Fixtures.py", + f"--out={fixture_dir}"], out / "logs" / "build-fixtures.log", env=env) + + binaries = {"clang": args.headless_clang.resolve(), "gcc": args.headless_gcc.resolve()} + fixtures = {name: fixture_dir / f"liminal-{name}.json" for name in + ("pool-rooms", "backrooms-grid", "staircase-to-nowhere", "terraced-hills")} + views = {} + floors = {} + for name, fixture_path in fixtures.items(): + view = json.loads((fixture_dir / "views" / f"{name}.json").read_text(encoding="utf-8")) + manifest_path, _, manifest, layout = build_plan(binaries["clang"], name, + fixture_path, view, out, env) + view["center_xy_m"] = view["center_xy_m"] + floors[name] = manifest["recipe"]["surface_profile"]["h0_q"] / Q_PER_METRE + if layout["stamp_vocabulary_version"] != 7 or not layout["stamps"]: + raise RuntimeError(f"{name} plan lacks resolved vocabulary-7 stamps") + write_walk_audit(fixture_dir / "walk-specs" / f"{name}.json", + manifest_path, out / "walk-audits" / name / "walk.path") + views[name] = view + print(f"[L161Plan] fixture={name} stamps={len(layout['stamps'])} " + f"floor_m={floors[name]:.3f} layout={layout['stable_identity']} status=PASS") + + for name, fixture_path in fixtures.items(): + run_walk_audit(name, fixture_path, views[name], floors[name], + fixture_dir / "walk-specs" / f"{name}.json", binaries["clang"], out, env) + run_determinism(name, fixture_path, views[name], floors[name], binaries, out, env) + + narrow_name = "backrooms-narrow-control" + narrow_fixture = fixture_dir / f"liminal-{narrow_name}.json" + narrow_view = json.loads((fixture_dir / "views" / f"{narrow_name}.json").read_text(encoding="utf-8")) + narrow_manifest, _, narrow_manifest_value, _ = build_plan(binaries["clang"], + narrow_name, narrow_fixture, narrow_view, out, env) + narrow_floor = narrow_manifest_value["recipe"]["surface_profile"]["h0_q"] / Q_PER_METRE + run_walk_audit(narrow_name, narrow_fixture, narrow_view, narrow_floor, + fixture_dir / "walk-specs" / f"{narrow_name}.json", binaries["clang"], + out, env, expected_exit=14) + print("[L161DoorwayNegativeControl] width_m=1.200 minimum_m=1.500 expected=FAIL status=PASS") + + for name, fixture_path in fixtures.items(): + for kind in ("eye", "wide"): + capture(name, fixture_path, views[name], floors[name], kind=kind, + binary=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"[L161Capture] status=FAIL error={error}", file=sys.stderr, flush=True) + raise SystemExit(1) diff --git a/Standalone/Research/WorldAssemblerM3/Linux161/REPORT.md b/Standalone/Research/WorldAssemblerM3/Linux161/REPORT.md new file mode 100644 index 0000000..582c123 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux161/REPORT.md @@ -0,0 +1,31 @@ +# L161 — More liminal looks + +| Look | Eye height | Wide | +|---|---|---| +| Pool rooms | ![Pool rooms at eye height](captures/pool-rooms-eye.jpg) | ![Pool rooms wide](captures/pool-rooms-wide.jpg) | +| Backrooms grid | ![Backrooms corridor at eye height](captures/backrooms-grid-eye.jpg) | ![Backrooms grid wide](captures/backrooms-grid-wide.jpg) | +| Staircase to nowhere | ![Staircase at eye height](captures/staircase-to-nowhere-eye.jpg) | ![Staircase wide](captures/staircase-to-nowhere-wide.jpg) | +| Terraced hills | ![Terraced hills at eye height](captures/terraced-hills-eye.jpg) | ![Terraced hills wide](captures/terraced-hills-wide.jpg) | + +## Result + +Four standalone SurfaceWorld fixtures resolve from the shared stamp vocabulary. They use repeated rooms and basins, a doorway grid, a freestanding stair and arch, and nine stepped ridges. This round authored no inter-strate passages or owner content. + +## Changes + +- Stamp vocabulary v7 adds `fillBox`, `carveBox`, and `fillSteps`; the existing `carveArch` is reused. The new kinds are opt-in. +- Added a flat-field liminal stamp-fixture override and a capsule walk audit with doorway-width gates. The audit checks support, collision, grade, and authored opening widths. +- Fixtures contain 275 pool-room stamps, 129 backrooms stamps, 4 staircase/arch stamps, and 18 terrace stamps. + +## Verification + +- Clang 19 and GCC 14 builds passed with FP contraction off. Both binaries carry source stamp `8e9e114c1357`. +- Each fixture matched across Clang/GCC at W1, W8, and W12: manifest, resolved-layout identity, and tile hashes were identical in all six cells. +- Positive capsule audits passed. Pool doorways measured 7.2 m, backrooms doorways 4.0 m, and the arch opening 10.0 m. The narrow 1.2 m backrooms control failed the 1.5 m minimum as expected. The terrace walk had zero blocked samples, unsupported samples, or grade failures. +- All eight 1600×900 captures passed image quality checks; files are 25.3–58.4 KB. Capture and audit logs are under `Saved/Linux/l161/logs/`. +- Fast tier passed: 273 checks in 346.6 s. Both owner generators matched their pinned L130/v227 canonical baselines exactly (12/12 rows), and W1/W12 signatures matched. Summary: `Saved/Linux/l161/fast-tier/fast-summary.json`. +- `git diff --check` passed. No Unreal `Source/` files changed; no Unreal build or medium/full verification tier was run. + +## Remaining risk + +The captures show untextured geometry with simple fog. The terraced wide capture uses clip radius 3 and max LOD 1 to stay within the standalone shape-build bound, so the long-range horizon read still needs an art review. diff --git a/Standalone/Research/WorldAssemblerM3/Linux161/captures/backrooms-grid-eye.jpg b/Standalone/Research/WorldAssemblerM3/Linux161/captures/backrooms-grid-eye.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0201742221a0c792eb3a20848d75529268ed294a GIT binary patch literal 26205 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 Ap8x;= literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux161/captures/pool-rooms-eye.jpg b/Standalone/Research/WorldAssemblerM3/Linux161/captures/pool-rooms-eye.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14cb03d78e5c1133274a9ea7d42f5111e80f37dd GIT binary patch literal 37559 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 X$}2q?er(YD>d$Dl>q~CazdHU6M)3;J literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux161/captures/pool-rooms-wide.jpg b/Standalone/Research/WorldAssemblerM3/Linux161/captures/pool-rooms-wide.jpg new file mode 100644 index 0000000000000000000000000000000000000000..479c33ba594feee93d127a6353bd6fc2f6606db6 GIT binary patch literal 38988 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�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 literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux161/captures/staircase-to-nowhere-wide.jpg b/Standalone/Research/WorldAssemblerM3/Linux161/captures/staircase-to-nowhere-wide.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ade83b18e80b1f4f9b929befd5df33ffa162a846 GIT binary patch literal 50535 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�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

0^_tXZlwiO_62+M&q2b< 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 ownerJsonRoot.Get("liminal_pillar_grid_override").Data); + const bool hasLiminalStampFixture=!std::holds_alternative( + ownerJsonRoot.Get("liminal_stamp_fixture_override").Data); if((hasMotifFamily&&hasLiminalRoad)||(hasMotifFamily&&hasLiminalPillarGrid) - ||(hasLiminalRoad&&hasLiminalPillarGrid)) + ||(hasLiminalRoad&&hasLiminalPillarGrid) + ||(hasLiminalStampFixture&&(hasMotifFamily||hasLiminalRoad||hasLiminalPillarGrid))) {std::fprintf(stderr,"liminal content overrides must be used in separate fixtures\n");return 2;} - if(hasCoreLiminalField&&(hasMotifFamily||hasLiminalRoad||hasLiminalPillarGrid)) + if(hasCoreLiminalField&&(hasMotifFamily||hasLiminalRoad||hasLiminalPillarGrid + ||hasLiminalStampFixture)) {std::fprintf(stderr,"Core.Liminal.Field owns its variant geometry and cannot be combined with prototype content overrides\n");return 2;} if(hasMotifFamily) { @@ -2138,6 +2147,27 @@ int main(int argc,char** argv) "placement=regular_grid route_keepout=PASS band_clearance=PASS status=PASS\n", resolvedLayout.stampVocabularyVersion,resolvedLayout.stamps.size()); } + if(hasLiminalStampFixture) + { + std::vector requests; + if(!StandaloneWorldAssemblyPrototype::BuildLiminalStampFixtureRequests(ownerJsonRoot, + *ownerWorld,worldAssembly,resolvedLayout,requests,error) + ||!VoxelForgeCore::ResolveResolvedLayoutStampsV1( + resolvedLayout,seed,requests,error)) + {std::fprintf(stderr,"Liminal stamp fixture resolution failed: %s\n",error.c_str());return 2;} + const std::size_t boxFills=static_cast(std::count_if( + resolvedLayout.stamps.begin(),resolvedLayout.stamps.end(),[](const auto& stamp) + {return stamp.kind==VoxelForgeCore::ResolvedSdfStampKindV1::fillBox;})); + const std::size_t boxCarves=static_cast(std::count_if( + resolvedLayout.stamps.begin(),resolvedLayout.stamps.end(),[](const auto& stamp) + {return stamp.kind==VoxelForgeCore::ResolvedSdfStampKindV1::carveBox;})); + const std::size_t stairs=static_cast(std::count_if( + resolvedLayout.stamps.begin(),resolvedLayout.stamps.end(),[](const auto& stamp) + {return stamp.kind==VoxelForgeCore::ResolvedSdfStampKindV1::fillSteps;})); + std::printf("[LiminalStampFixtureResolved] vocabulary=%u records=%zu box_fills=%zu box_carves=%zu steps=%zu placement=bounded_flat_field status=PASS\n", + resolvedLayout.stampVocabularyVersion,resolvedLayout.stamps.size(), + boxFills,boxCarves,stairs); + } if(options.LandmarkChamberDemo) { std::vector requests; @@ -2639,5 +2669,6 @@ int main(int argc,char** argv) options.MovingCameraSpeedMetersPerSecond,options.MovingCameraDurationSeconds, options.MovingCameraDwellSeconds,options.ColdWorkerTimeline, options.AuditPassageSourceClamp,options.AuditPassageCarveReach, - options.AuditPassageTileSeams,options.AuditLiminalRoadWalk); + options.AuditPassageTileSeams,options.AuditLiminalRoadWalk, + options.LiminalStampWalkAuditPath); } diff --git a/Standalone/Source/StreamBenchmarkPipeline.h b/Standalone/Source/StreamBenchmarkPipeline.h index 166b5d4..d861a64 100644 --- a/Standalone/Source/StreamBenchmarkPipeline.h +++ b/Standalone/Source/StreamBenchmarkPipeline.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -2385,7 +2386,8 @@ namespace StandaloneStreamBenchmark double MovingCameraDurationSeconds=12.0,double MovingCameraDwellSeconds=5.0, bool bColdWorkerTimeline=false,bool bAuditPassageSourceClamp=false, bool bAuditPassageCarveReach=false,bool bAuditPassageTileSeams=false, - bool bAuditLiminalRoadWalk=false) + bool bAuditLiminalRoadWalk=false, + const std::filesystem::path& LiminalStampWalkAuditPath={}) { using Clock=std::chrono::steady_clock; const std::clock_t ColdCpuOrigin=std::clock(); @@ -2555,7 +2557,8 @@ namespace StandaloneStreamBenchmark ||bAuditOreVeinYield||bAuditLandmarkReachability||bAuditStrateTransitions ||bAuditResolvedLayoutPassages||bAuditResolvedLayoutBoundaries ||bAuditTileShapeReadiness||bAuditBasePageEquivalence||bAuditRouteParity - ||bAuditPassageSourceClamp||bAuditPassageCarveReach||bAuditLiminalRoadWalk; + ||bAuditPassageSourceClamp||bAuditPassageCarveReach||bAuditLiminalRoadWalk + ||!LiminalStampWalkAuditPath.empty(); const bool bDeferFarWorld=bIncludeFarWorld&&!bMovingCameraTrace&&!bFarWorldAudit; VoxelForgeCore::ShapeBuildRequest ShapeRequest; ShapeRequest.minVoxel={FineMin.X,FineMin.Y,FineMin.Z}; @@ -2821,7 +2824,8 @@ namespace StandaloneStreamBenchmark Streamer.Stop(); return passed?0:11; } - if(bAuditResolvedLayoutPassages||bAuditLiminalRoadWalk) + if(bAuditResolvedLayoutPassages||bAuditLiminalRoadWalk + ||!LiminalStampWalkAuditPath.empty()) { if(ResolvedLayout==nullptr||!CoreSnapshot.resolvedLayout()) {Streamer.Stop();std::fprintf(stderr,"[ResolvedWalkAudit] missing resolved-layout snapshot\n");return 2;} @@ -3230,6 +3234,82 @@ namespace StandaloneStreamBenchmark } return passed; }; + if(!LiminalStampWalkAuditPath.empty()) + { + struct FDoorwayWidthGate + { + std::string prefix; + std::uint32_t widthAxis=0; + double minimumWidthMetres=0.0; + }; + std::ifstream auditFile(LiminalStampWalkAuditPath); + std::vector> walkPath; + std::vector doorwayGates; + bool inputValid=static_cast(auditFile); + std::string line; + while(inputValid&&std::getline(auditFile,line)) + { + if(line.empty()||line[0]=='#')continue; + std::istringstream fields(line); + char record=0;fields>>record; + if(record=='P') + { + std::array point{}; + fields>>point[0]>>point[1]>>point[2]; + inputValid=inputValid&&static_cast(fields) + &&std::isfinite(point[0])&&std::isfinite(point[1]) + &&std::isfinite(point[2]); + if(inputValid) + walkPath.push_back({point[0]/coreMetres, + point[1]/coreMetres,point[2]/coreMetres}); + } + else if(record=='D') + { + FDoorwayWidthGate gate; + fields>>gate.prefix>>gate.widthAxis>>gate.minimumWidthMetres; + inputValid=inputValid&&static_cast(fields) + &&!gate.prefix.empty()&&gate.widthAxis<2 + &&std::isfinite(gate.minimumWidthMetres) + &&gate.minimumWidthMetres>=1.5; + if(inputValid)doorwayGates.push_back(std::move(gate)); + } + else inputValid=false; + } + std::uint64_t doorwayCount=0; + double narrowestDoorway=std::numeric_limits::infinity(); + bool doorwayWidthsPass=inputValid; + for(const auto& gate:doorwayGates) + { + std::uint64_t found=0; + for(const auto& stamp:ResolvedLayout->stamps) + { + if(!stamp.stableId.starts_with(gate.prefix))continue; + ++found;++doorwayCount; + const double width=2.0*stamp.halfExtentsMicrometres[gate.widthAxis]/1.0e6; + narrowestDoorway=std::min(narrowestDoorway,width); + if(width+1.0e-90; + } + if(doorwayCount==0)narrowestDoorway=0.0; + const FWalkAudit walkAudit=inputValid&&walkPath.size()>=2 + ?auditPlayerPath(Shape,walkPath,0.125,0.125,1.125,3,0.45):FWalkAudit{}; + const bool passed=inputValid&&doorwayWidthsPass&&walkAudit.passed; + std::printf("[LiminalStampWalkAudit] path_points=%zu stations=%llu capsule_samples=%llu " + "blocked=%llu support_samples=%llu unsupported=%llu grade_failures=%llu " + "doorways=%llu narrowest_doorway_m=%.3f minimum_doorway_m=1.500 " + "status=%s\n",walkPath.size(), + static_cast(walkAudit.centers), + static_cast(walkAudit.capsuleSamples), + static_cast(walkAudit.blocked), + static_cast(walkAudit.supportSamples), + static_cast(walkAudit.unsupported), + static_cast(walkAudit.gradeFailures), + static_cast(doorwayCount),narrowestDoorway, + passed?"PASS":"FAIL"); + Streamer.Stop(); + return passed?0:14; + } if(bAuditLiminalRoadWalk&&!bAuditResolvedLayoutPassages) { const bool passed=auditLiminalRoadWalk(true); diff --git a/Standalone/Source/WorldAssemblyPrototype.h b/Standalone/Source/WorldAssemblyPrototype.h index 5c5e262..aa6dc89 100644 --- a/Standalone/Source/WorldAssemblyPrototype.h +++ b/Standalone/Source/WorldAssemblyPrototype.h @@ -822,6 +822,109 @@ namespace StandaloneWorldAssemblyPrototype return true; } + inline bool BuildLiminalStampFixtureRequests(const VFJson::Value& root, + const FStandaloneOwnerWorld& owner, + const VoxelForgeCore::WorldAssemblyManifest& assembly, + const VoxelForgeCore::ResolvedLayoutSnapshotV3& layout, + std::vector& requests, + std::string& error) + { + using namespace VoxelForgeCore; + requests.clear(); + const VFJson::Value& fixture=root.Get("liminal_stamp_fixture_override"); + if(!fixture.IsObject()||!fixture.Get("version").IsNumber() + ||fixture.Get("version").Integer()!=1||!fixture.Get("stamps").IsArray()) + {error="liminal_stamp_fixture_override must be a version-1 object with a stamps array";return false;} + if(assembly.recipe.surfaceProfile.version!=1 + ||assembly.recipe.surfaceProfile.kind!=WorldAssemblySurfaceProfileKindV1::flatField + ||owner.CoreVoxelSizeMicrons==0) + {error="liminal stamp fixtures require a valid flatField SurfaceWorld recipe";return false;} + const VFJson::Value& strateValue=fixture.Get("strate_index"); + if(!strateValue.IsNumber()) + {error="liminal stamp fixture must select a resolved SurfaceWorld strate";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 stamp fixture strate is not a resolved SurfaceWorld strate";return false;} + const auto toMicrometres=[](double value) + {return static_cast(std::llround(value*1000000.0));}; + const std::int64_t floorMicrometres=static_cast(std::llround( + static_cast(assembly.recipe.surfaceProfile.h0Subvoxels) + *owner.CoreVoxelSizeMicrons/WorldAssemblySubvoxelsPerVoxel)); + const auto readOptionalMetres=[&](const VFJson::Value& object,const char* key, + double fallback,double& result) + { + const VFJson::Value& value=object.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; + }; + for(const auto& entry:fixture.Get("stamps").AsArray()) + { + if(!entry.IsObject()) + {error="liminal stamp fixture contains a malformed stamp record";return false;} + const auto* id=std::get_if(&entry.Get("stable_id").Data); + const auto* kind=std::get_if(&entry.Get("kind").Data); + const VFJson::Value& anchor=entry.Get("anchor_xy_m"); + const VFJson::Value& extents=entry.Get("half_extents_m"); + double zOffset=0.0,rounding=0.0,smooth=0.0; + if(!id||id->empty()||!kind||anchor.AsArray().size()!=2 + ||extents.AsArray().size()!=3 + ||!readOptionalMetres(entry,"z_offset_m",0.0,zOffset) + ||!readOptionalMetres(entry,"rounding_radius_m",0.0,rounding) + ||!readOptionalMetres(entry,"smooth_width_m",0.0,smooth)) + {error="liminal stamp fixture record requires an identity, kind, anchor, extents and finite metre values";return false;} + for(const auto& value:anchor.AsArray()) + if(!value.IsNumber()||!std::isfinite(value.Number())) + {error="liminal stamp anchor_xy_m must contain finite metre values";return false;} + for(const auto& value:extents.AsArray()) + if(!value.IsNumber()||!std::isfinite(value.Number())||value.Number()<=0.0) + {error="liminal stamp half_extents_m must contain positive finite metre values";return false;} + if(std::abs(anchor.AsArray()[0].Number())>5000.0 + ||std::abs(anchor.AsArray()[1].Number())>5000.0 + ||std::abs(zOffset)>1000.0||rounding<0.0||smooth<0.0) + {error="liminal stamp fixture values exceed their bounded ranges";return false;} + ResolvedLayoutStampRequestV1 request; + request.stableId=*id;request.strateIndex=strateIndex; + request.anchorPositionMicrometres={ + toMicrometres(anchor.AsArray()[0].Number()), + toMicrometres(anchor.AsArray()[1].Number()), + floorMicrometres+toMicrometres(zOffset)}; + request.halfExtentsMicrometres={toMicrometres(extents.AsArray()[0].Number()), + toMicrometres(extents.AsArray()[1].Number()), + toMicrometres(extents.AsArray()[2].Number())}; + request.roundingRadiusMicrometres=toMicrometres(rounding); + request.smoothWidthMicrometres=toMicrometres(smooth); + const VFJson::Value& yaw=entry.Get("yaw_quarter_turns"); + if(!std::holds_alternative(yaw.Data)) + { + if(!yaw.IsNumber()||yaw.Integer()<0||yaw.Integer()>3) + {error="liminal stamp yaw_quarter_turns must be an integer from zero through three";return false;} + request.yawQuarterTurns=static_cast(yaw.Integer()); + } + if(*kind=="fillBox")request.kind=ResolvedSdfStampKindV1::fillBox; + else if(*kind=="carveBox")request.kind=ResolvedSdfStampKindV1::carveBox; + else if(*kind=="carveArch")request.kind=ResolvedSdfStampKindV1::carveArch; + else if(*kind=="fillSteps") + { + request.kind=ResolvedSdfStampKindV1::fillSteps; + const VFJson::Value& count=entry.Get("step_count"); + if(!count.IsNumber()||count.Integer()<2||count.Integer()>128) + {error="fillSteps requires step_count from two through 128";return false;} + request.stepCount=static_cast(count.Integer()); + } + else + {error="liminal stamp kind must be fillBox, carveBox, carveArch or fillSteps";return false;} + requests.push_back(std::move(request)); + } + if(requests.empty()) + {error="liminal stamp fixture must resolve at least one stamp";return false;} + return true; + } + inline bool BuildCoreLiminalFieldRequests( const VoxelForgeCore::WorldAssemblyManifest& assembly, const FStandaloneOwnerWorld& owner,