diff --git a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h index ac27df1..24aaf16 100644 --- a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h +++ b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h @@ -147,7 +147,9 @@ namespace VoxelForgeCore // by the opt-in passage composer profile, except the mesh composition itself. std::uint64_t passageSweepRouteSegmentCandidates = 0; std::uint64_t passageSweepSegmentSamplePairs = 0; + std::uint64_t passageSweepPrepareNanoseconds = 0; std::uint64_t passageSweepOutsideInfluencePairs = 0; + std::uint64_t passageSweepShellSupportSkips = 0; std::uint64_t passageSweepMinimumUpdates = 0; std::uint64_t passageSweepBaseInfluenceSamples = 0; std::uint64_t passageSweepDetailShellSamples = 0; @@ -474,8 +476,9 @@ namespace VoxelForgeCore // Version 220 adaptively samples passage curves and rounds open-air wall crests. // Version 221 ranks passage segments before floor shaping and preserves their signed exterior distance. // Version 223 projects the floor onto one continuous arc-length profile and groups - // dense passage samples into coarse tile candidates. - inline constexpr std::uint32_t WorldAssemblyEvaluatorVersion = 223; + // dense passage samples into coarse tile candidates. Version 224 keeps the same + // continuous floor while relaxing the spline chord tolerance and bounding shell work. + inline constexpr std::uint32_t WorldAssemblyEvaluatorVersion = 224; enum class FieldChannel : std::uint32_t { diff --git a/Standalone/Core/src/ShapeWorldInternal.h b/Standalone/Core/src/ShapeWorldInternal.h index c266bd8..fa2b076 100644 --- a/Standalone/Core/src/ShapeWorldInternal.h +++ b/Standalone/Core/src/ShapeWorldInternal.h @@ -4605,7 +4605,7 @@ private: const double qPerMetre=Q*1000000.0/ std::max(1,ResolvedLayout->coreVoxelSizeMicrometres); constexpr double PassageSegmentSpacingMetres=8.0; - constexpr double PassageSegmentChordErrorMetres=0.025; + constexpr double PassageSegmentChordErrorMetres=0.100; std::size_t preparedSegments=0,controlSpans=0; for(std::size_t passageIndex=0;passageIndexpassages.size(); ++passageIndex) @@ -11441,6 +11441,9 @@ inline void FStandaloneShapeWorld::FScopedPassageTileQueries::prepareSweptTubeBa constexpr double OpenAirSideWallHeightMetres=1.0; if(!shape_||step<=0||cells<=0||!std::isfinite(passageCarveReachMetres_) ||std::abs(passageCarveReachMetres_-InfluenceMetres)>1.0e-9)return; + const bool profile=profileStats_!=nullptr; + const auto prepareStart=profile?std::chrono::steady_clock::now() + :std::chrono::steady_clock::time_point{}; auto sweep=std::make_shared(); sweep->gridMinimumSubvoxels={ @@ -11463,7 +11466,6 @@ inline void FStandaloneShapeWorld::FScopedPassageTileQueries::prepareSweptTubeBa constexpr double MouthShellBlendMetres=5.0; const double wallReliefShell=0.41*qPerMetre; const double floorDetailShell=1.0*qPerMetre; - const bool profile=profileStats_!=nullptr; if(profile) { profileStats_->passageSweepRouteSegmentCandidates=routeSegmentCandidateCount_; @@ -11550,8 +11552,6 @@ inline void FStandaloneShapeWorld::FScopedPassageTileQueries::prepareSweptTubeBa FStandaloneShapeWorld::PassageFlatFloorCenterZSubvoxels( constants,segments,segmentIndex,floorT,segment, qx,qy,floorDepth,qPerMetre); - const double flatDistance=FStandaloneShapeWorld::PassageFlatBottomDistance( - static_cast(signedDistance),floorCenterZ,qz,floorDepth,qPerMetre); if(profile)++profileStats_->passageSweepSegmentSamplePairs; if(signedDistance>sweep->influenceSubvoxels) { @@ -11572,51 +11572,75 @@ inline void FStandaloneShapeWorld::FScopedPassageTileQueries::prepareSweptTubeBa sample.floorSegmentIndex=static_cast( segmentIndex); } - const double alongMetres=segment.authoredAlongMetres - +t*segment.authoredLengthMetres; - const double mouthDistanceMetres=std::max(0.0,std::min(alongMetres, - constants.totalPathLengthMetres-alongMetres)); - const double shellFade=std::clamp(mouthDistanceMetres/ - MouthShellBlendMetres,0.0,1.0); - const double smoothShellFade=shellFade*shellFade - *(3.0-2.0*shellFade); - const double floorDistanceMetres=(floorCenterZ-floorDepth-qz)/qPerMetre; - const double floorBlend=std::clamp(floorDistanceMetres/0.25,0.0,1.0); - const double smoothFloorBlend=floorBlend*floorBlend - *(3.0-2.0*floorBlend); - const double wallElevationMetres=(qz-(floorCenterZ-floorDepth)) - /qPerMetre; - const double mouthWallThickness=segment.routeSegment - ?smoothShellFade*shellThickness:0.0; - double floorExtensionFade=1.0; - if(!segment.routeSegment) + // A negative shell distance is possible only when the flattened tube + // distance lies in [0, shellThickness]. SmoothMaxDistance is at least + // max(roundDistance, floorDistance) and can raise that maximum by no + // more than cornerWidth/6. Skip its work for pairs outside this exact + // support, with a small subvoxel guard for float rounding. The final + // shell union only consumes negative distances. + constexpr double CornerBlendMetres=0.50; + const float roundDistanceFloat=static_cast(signedDistance); + const float floorDistanceFloat=static_cast(floorCenterZ-floorDepth-qz); + const double flatDistanceLowerBound=std::max( + static_cast(roundDistanceFloat), + static_cast(floorDistanceFloat)); + const double cornerWidth=static_cast(static_cast( + CornerBlendMetres*qPerMetre)); + const bool shellSupportPossible=flatDistanceLowerBound + >=-cornerWidth/6.0-1.0 + &&flatDistanceLowerBound<=shellThickness+1.0; + if(shellSupportPossible) { - const double pastMouthMetres=std::max(0.0,alongMetres - -constants.totalPathLengthMetres); - const double extensionFade=std::clamp(1.0 - -pastMouthMetres/MouthShellBlendMetres,0.0,1.0); - floorExtensionFade=extensionFade*extensionFade - *(3.0-2.0*extensionFade); + const double flatDistance=FStandaloneShapeWorld::PassageFlatBottomDistance( + roundDistanceFloat,floorCenterZ,qz,floorDepth,qPerMetre); + const double alongMetres=segment.authoredAlongMetres + +t*segment.authoredLengthMetres; + const double mouthDistanceMetres=std::max(0.0,std::min(alongMetres, + constants.totalPathLengthMetres-alongMetres)); + const double shellFade=std::clamp(mouthDistanceMetres/ + MouthShellBlendMetres,0.0,1.0); + const double smoothShellFade=shellFade*shellFade + *(3.0-2.0*shellFade); + const double floorDistanceMetres=(floorCenterZ-floorDepth-qz)/qPerMetre; + const double floorBlend=std::clamp(floorDistanceMetres/0.25,0.0,1.0); + const double smoothFloorBlend=floorBlend*floorBlend + *(3.0-2.0*floorBlend); + const double wallElevationMetres=(qz-(floorCenterZ-floorDepth)) + /qPerMetre; + const double mouthWallThickness=segment.routeSegment + ?smoothShellFade*shellThickness:0.0; + double floorExtensionFade=1.0; + if(!segment.routeSegment) + { + const double pastMouthMetres=std::max(0.0,alongMetres + -constants.totalPathLengthMetres); + const double extensionFade=std::clamp(1.0 + -pastMouthMetres/MouthShellBlendMetres,0.0,1.0); + floorExtensionFade=extensionFade*extensionFade + *(3.0-2.0*extensionFade); + } + const double floorShellThickness=smoothFloorBlend*shellThickness + *floorExtensionFade*smoothShellFade; + const double wallShellDistance= + FStandaloneShapeWorld::PassageRoundedWallShellDistance( + flatDistance,wallElevationMetres*qPerMetre, + OpenAirSideWallHeightMetres*qPerMetre,mouthWallThickness); + const double floorShellDistance=std::max( + -static_cast(flatDistance), + static_cast(flatDistance)-floorShellThickness); + const double localShellDistance=std::min(wallShellDistance, + floorShellDistance); + sample.shellSignedDistance=std::min(sample.shellSignedDistance, + localShellDistance); } - const double floorShellThickness=smoothFloorBlend*shellThickness - *floorExtensionFade*smoothShellFade; - const double wallShellDistance= - FStandaloneShapeWorld::PassageRoundedWallShellDistance( - flatDistance,wallElevationMetres*qPerMetre, - OpenAirSideWallHeightMetres*qPerMetre,mouthWallThickness); - const double floorShellDistance=std::max(-static_cast(flatDistance), - static_cast(flatDistance)-floorShellThickness); - const double localShellDistance=std::min(wallShellDistance, - floorShellDistance); - sample.shellSignedDistance=std::min(sample.shellSignedDistance, - localShellDistance); + else if(profile) + ++profileStats_->passageSweepShellSupportSkips; // Rank the tube body by round SDF. Its floor plane is selected // independently above from the nearest centerline position. if(!sample.valid||signedDistancepassageSweepNoInfluenceGridSamples= static_cast(std::count(anyPassageInfluence.begin(), anyPassageInfluence.end(),static_cast(0))); + profileStats_->passageSweepPrepareNanoseconds+=static_cast( + std::max(0,std::chrono::duration_cast( + std::chrono::steady_clock::now()-prepareStart).count())); } passageSweepData_=std::move(sweep); } diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/REPORT.md b/Standalone/Research/WorldAssemblerM3/Linux119/REPORT.md new file mode 100644 index 0000000..249c740 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux119/REPORT.md @@ -0,0 +1,43 @@ +# Linux119 — smooth half-pipe speed + +## Result + +The route now uses a 10 cm chord-error tolerance (was 2.5 cm); the 8 m spacing cap is unchanged. The evaluator is version 224. Output changed, but Clang/GCC and W1/W8/W12 hashes match. + +L119 improves on L115, but misses the L109 near-ready target in all eight stratum/worker cells: **13.3–22.0% slower than L109**. It is 2.8–7.7% faster than L115 at near-ready. Whole-view readiness remains 6.5–12.3% slower than L109. + +Five interleaved L80 measurements per cell followed one warmup per version. The timing gate recorded 1-minute load 0.82 and 98.7% CPU idle. Headless runs used CPUs 0–11, the 6 GiB address-space limit, and a 1,740 s timeout. + +| Stratum | Workers | Near L109 / L115 / L119 (s; Δ vs L109) | Whole view L109 / L115 / L119 (s; Δ vs L109) | +| --- | ---: | ---: | ---: | +| S0 | 8 | 0.761 / 0.929 / 0.880 (+15.6%) | 1.742 / 1.927 / 1.860 (+6.8%) | +| S0 | 12 | 0.785 / 0.926 / 0.890 (+13.5%) | 1.717 / 1.873 / 1.829 (+6.5%) | +| S1 | 8 | 0.951 / 1.250 / 1.158 (+21.9%) | 1.863 / 2.112 / 2.073 (+11.3%) | +| S1 | 12 | 0.899 / 1.152 / 1.097 (+22.0%) | 1.731 / 2.000 / 1.943 (+12.3%) | +| S2 | 8 | 0.994 / 1.252 / 1.177 (+18.4%) | 1.844 / 2.079 / 2.030 (+10.1%) | +| S2 | 12 | 0.914 / 1.169 / 1.079 (+18.1%) | 1.710 / 1.989 / 1.885 (+10.2%) | +| S3 | 8 | 0.812 / 0.988 / 0.960 (+18.3%) | 1.728 / 1.870 / 1.891 (+9.4%) | +| S3 | 12 | 0.772 / 0.928 / 0.874 (+13.3%) | 1.617 / 1.783 / 1.723 (+6.6%) | + +## Designs and work + +Two designs were built together. Before building, the fourfold chord tolerance increase predicted about half as many curvature-limited route segments (segment count scales roughly with the inverse square root of the error tolerance). The shell support bound was expected to skip most shell calculations: only flattened distances in the 0–0.75 m shell band can contribute, with a 1-subvoxel guard. L118 had 48.93M W8 sweep pairs and 39.3M sampled smooth-min calls. + +| Stratum | W8 LOD0–2 pairs L109 / L115=L118 / L119 (M) | Exact fallbacks L109 / L115=L118 / L119 (M) | Segment visits L109 / L115=L118 / L119 (M) | Prepare ms L118 → L119 | L119 shell-support skips | +| --- | ---: | ---: | ---: | ---: | ---: | +| S0 | 3.36 / 7.56 / 4.55 | 0.241 / 0.413 / 0.652 | 1.19 / 3.41 / 4.68 | 467 → 185 | 3.73M (81.9%) | +| S1 | 6.19 / 16.22 / 9.69 | 0.369 / 0.719 / 1.114 | 1.91 / 7.60 / 9.25 | 919 → 361 | 8.05M (83.1%) | +| S2 | 6.15 / 15.52 / 9.28 | 0.315 / 0.634 / 0.986 | 1.66 / 6.88 / 8.34 | 848 → 345 | 7.69M (82.8%) | +| S3 | 4.09 / 9.63 / 5.88 | 0.074 / 0.131 / 0.203 | 0.48 / 1.41 / 2.19 | 567 → 235 | 4.76M (80.8%) | + +L119 reduced pairs 39–40% versus L115/L118, and summed W1 prepare time fell 59.8% (2.801 s to 1.125 s). Exact fallbacks are 55–58% higher than L115/L118 and visits are 21–56% higher. Those extra fallback scans are the likely remaining readiness cost. L119 prepare time is timed directly; L109/L115 prepare time was not separately instrumented. + +## Quality and verification + +- Floor root offsets: 51 samples at each of 9 stations; maximum 7.884 mm versus L115’s 7.849 mm. +- Fast tier: PASS in 277.9 s. Walkability, floor/mouth profiles, open-air shell, ripple, naturalness, and grade audits passed; no geometry threshold was relaxed. +- Determinism: all 18 Clang/GCC W1/W8/W12 hash runs matched for owner4 surface world and both owner2 canonical recipes. Owner2 v224 baselines were added. Source stamp: `9a592cb548c6768c8c25723f4168f65da9645068cb67dcb317e91f707e7d41df`. +- Captures: 23/23 L115 view names and camera poses rendered with the L119 binary; 19 pass and 4 low-contrast-visible. L115 had 18 pass and 5 low-contrast-visible. [Compare all views side by side](captures/COMPARE.html); [L119 capture index](captures/L119/INDEX.md). +- Linux VFHostEditor: PASS, 27/27 actions in 70.98 s with `-NoUBA -MaxParallelActions=4`. Unreal ran without `prlimit`; three existing RealtimeMesh deprecation warnings remain. + +Logs and timing summaries are in `Saved/Linux/l119/`. diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/RunL119Captures.py b/Standalone/Research/WorldAssemblerM3/Linux119/RunL119Captures.py new file mode 100644 index 0000000..39f2c1a --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux119/RunL119Captures.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""Render the L115 view set with the L119 candidate binaries.""" +from __future__ import annotations + +import importlib.util +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +RESEARCH = Path(__file__).resolve().parent +SPEC = importlib.util.spec_from_file_location( + "l115_capture_runner", ROOT / "Standalone/Research/WorldAssemblerM3/Linux115/RunL115Captures.py") +if SPEC is None or SPEC.loader is None: + raise SystemExit("cannot load the L115 capture view definitions") +RUNNER = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(RUNNER) + +# Reuse L115's exact camera and station definitions, while rendering through L119. +RUNNER.CAPTURES = RESEARCH / "captures/L119" +RUNNER.SAVED = ROOT / "Saved/Linux/l119/captures" +RUNNER.HELPERS.RESEARCH = RESEARCH +RUNNER.BINARIES = { + "L115": ROOT / "Saved/Linux/l119/bin/VoxelForgeCoreHeadless-l119-clang"} +RUNNER.RENDERERS = { + "L115": ROOT / "Saved/Linux/l119/bin/VoxelForgeOffscreenCapture-l119-clang"} +RUNNER.HELPERS.BINARIES = RUNNER.BINARIES +RUNNER.HELPERS.RENDERERS = RUNNER.RENDERERS + + +def main() -> int: + result = RUNNER.main() + if result != 0: + return result + index = RUNNER.CAPTURES / "capture-index.json" + document = json.loads(index.read_text(encoding="utf-8")) + for row in document["captures"]: + row["variant"] = "L119" + index.write_text(json.dumps(document, indent=2) + "\n", encoding="utf-8") + markdown = RUNNER.CAPTURES / "INDEX.md" + lines = ["# L119 captures (L115 view set)", "", + "The 23 L115 camera poses were rendered with the L119 binary. Floor anchors " + "require an upward normal alignment of at least 0.85, target-to-floor distance " + "at most 0.25 m, and camera-to-floor distance between 2.0 and 3.2 m. Open-air " + "sections have outside and interior wall close-ups at 4 m.", ""] + for row in document["captures"]: + image = row["capture"].removeprefix("captures/L119/") + lines.append(f"- [{row['passage']} {row['station']}]({image}) — " + f"{row['kind']}; {row.get('drawn_triangles', 0)} triangles; " + f"{row['pixel_quality_status']}") + markdown.write_text("\n".join(lines) + "\n", encoding="utf-8") + return 0 + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/RunL119DensityProbe.py b/Standalone/Research/WorldAssemblerM3/Linux119/RunL119DensityProbe.py new file mode 100644 index 0000000..923abde --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux119/RunL119DensityProbe.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +"""Measure L119 floor zero crossings at three route stations per passage.""" +from __future__ import annotations + +import csv +import json +import math +import os +import re +import statistics +import subprocess +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / "Saved/Linux/l119/density-probe" +BINARY = ROOT / "Saved/Linux/l119/bin/VoxelForgeCoreHeadless-l119-clang" +DATA = ROOT / "Standalone/data/owner_world.json" +SLOPE = re.compile( + r"^\[L115DensitySlopeSample\] passage=(\S+) station=(\S+) s_m=([\d.]+) " + r".*?planned_floor_m=(-?[\d.]+) root_floor_m=(-?[\d.]+|nan) " + r"residual_m=(-?[\d.]+|nan)", re.M) + + +def main() -> int: + OUT.mkdir(parents=True, exist_ok=True) + log = OUT / "owner4-clang.log" + layout = OUT / "layout.json" + command = [ + "taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + "timeout", "1740s", str(BINARY), str(DATA), "--world-assembler-prototype", + "--stream-benchmark", "--stream-pipeline", "--workers=12", "--clip-radius=3", + "--max-clip-level=8", "--max-level=8", "--camera=8,16,-372.2626953125,0,0", + "--audit-resolved-layout-passages", f"--resolved-layout-output={layout}", + ] + with log.open("w", encoding="utf-8") as stream: + result = subprocess.run(command, cwd=ROOT, + env={**os.environ, + "VOXELFORGE_L115_DENSITY_PROFILE": "1"}, + stdout=stream, stderr=subprocess.STDOUT, + check=False, timeout=1740) + if result.returncode: + raise SystemExit(f"L119 density probe failed: {log}") + text = log.read_text(encoding="utf-8", errors="replace") + groups: dict[tuple[str, str], list[dict]] = {} + for passage, station, distance, planned, root, residual in SLOPE.findall(text): + root_value = float(root) if root != "nan" else math.nan + residual_value = float(residual) if residual != "nan" else math.nan + groups.setdefault((passage, station), []).append({ + "route_s_m": float(distance), "planned_floor_m": float(planned), + "root_floor_m": root_value, "offset_m": residual_value}) + summary = [] + with (OUT / "zero-crossing-offsets.csv").open("w", newline="", encoding="utf-8") as stream: + writer = csv.DictWriter(stream, fieldnames=("passage", "station", "route_s_m", + "planned_floor_m", "root_floor_m", "offset_m")) + writer.writeheader() + for (passage, station), samples in sorted(groups.items()): + for sample in samples: + writer.writerow({"passage": passage, "station": station, **sample}) + finite = [sample["offset_m"] for sample in samples + if math.isfinite(sample["offset_m"])] + summary.append({"passage": passage, "station": station, + "samples": len(samples), "finite_roots": len(finite), + "max_abs_offset_m": max(map(abs, finite)) if finite else None, + "median_abs_offset_m": statistics.median(map(abs, finite)) + if finite else None, + "p95_abs_offset_m": sorted(map(abs, finite))[ + min(len(finite)-1, math.ceil(0.95*len(finite))-1)] + if finite else None}) + if not summary or any(item["samples"] != 51 for item in summary): + raise RuntimeError("L119 density profile is missing 51-sample route stations") + (OUT / "zero-crossing-summary.json").write_text( + json.dumps(summary, indent=2) + "\n", encoding="utf-8") + print(f"[L119DensityProbe] exit={result.returncode} stations={len(summary)} " + f"log={log.relative_to(ROOT)}", flush=True) + return result.returncode + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/RunL119HashMatrix.py b/Standalone/Research/WorldAssemblerM3/Linux119/RunL119HashMatrix.py new file mode 100644 index 0000000..a2cf43b --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux119/RunL119HashMatrix.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +"""Check owner hash identity at W1/W8/W12 and pin the v224 owner hashes.""" +from __future__ import annotations + +import json +import re +import subprocess +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / "Saved/Linux/l119/hashes" +DATASETS = { + "owner4": ROOT / "Standalone/data/owner_world.json", + "owner2": ROOT / "Standalone/data/regression/owner_world_2strate_l61.json", +} +BINARIES = { + "clang": ROOT / "Saved/Linux/l119/bin/VoxelForgeCoreHeadless-l119-clang", + "gcc": ROOT / "Saved/Linux/l119/bin/VoxelForgeCoreHeadless-l119-gcc", +} +HASH = re.compile(r"^\[Pipeline(?:FullDetailHash|WholeViewHash|LODHash|ExactQueryHash)\].*$", re.M) +STAMP = re.compile(r"^\[VoxelForgeSourceStamp\] sha256=(\S+)$", re.M) + + +def run(dataset: str, recipe: str, workers: int, compiler: str) -> dict: + OUT.mkdir(parents=True, exist_ok=True) + label = f"{dataset}-{recipe}-w{workers}-{compiler}" + log = OUT / f"{label}.log" + layout = OUT / f"{label}.layout.json" + command = [ + "taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + "timeout", "1740s", str(BINARIES[compiler]), str(DATASETS[dataset]), + f"--workers={workers}", "--world-assembler-prototype", "--stream-benchmark", + "--stream-pipeline", "--force-generate", "--clip-radius=3", + "--max-clip-level=8", "--max-level=8", f"--recipe={recipe}", + "--stream-hash", f"--resolved-layout-output={layout}", + ] + started = time.monotonic() + with log.open("w", encoding="utf-8") as stream: + result = subprocess.run(command, cwd=ROOT, stdout=stream, + stderr=subprocess.STDOUT, check=False, timeout=1740) + output = log.read_text(encoding="utf-8", errors="replace") + hashes = HASH.findall(output) + if result.returncode or len(hashes) != 12: + raise SystemExit(f"hash run failed or incomplete: {label}; exit={result.returncode} " + f"hashes={len(hashes)} log={log}") + row = {"dataset": dataset, "recipe": recipe, "workers": workers, + "compiler": compiler, "exit_code": result.returncode, "hashes": hashes, + "source_stamp": (STAMP.search(output).group(1) + if STAMP.search(output) else None), + "elapsed_s": round(time.monotonic() - started, 3), + "log": str(log.relative_to(ROOT))} + print("[L119HashRun] " + json.dumps(row, sort_keys=True), flush=True) + return row + + +def main() -> int: + if any(not path.is_file() for path in (*DATASETS.values(), *BINARIES.values())): + raise SystemExit("missing L119 hash input") + rows = [] + recipes = {"owner4": ("surface-world",), + "owner2": ("surface-world", "floating-islands")} + for dataset, dataset_recipes in recipes.items(): + for recipe in dataset_recipes: + for workers in (1, 8, 12): + for compiler in ("clang", "gcc"): + rows.append(run(dataset, recipe, workers, compiler)) + (OUT / "runs-partial.json").write_text( + json.dumps(rows, indent=2) + "\n", encoding="utf-8") + groups = {} + for dataset, dataset_recipes in recipes.items(): + for recipe in dataset_recipes: + key = f"{dataset}/{recipe}" + group = [row for row in rows if row["dataset"] == dataset + and row["recipe"] == recipe] + reference = group[0]["hashes"] + matches = all(row["hashes"] == reference for row in group) + groups[key] = {"all_worker_compiler_hashes_match": matches, + "source_stamps": sorted({row["source_stamp"] for row in group}), + "runs": [{"workers": row["workers"], "compiler": row["compiler"], + "log": row["log"]} for row in group]} + if not matches: + raise SystemExit(f"determinism mismatch: {key}") + if dataset == "owner2": + canonical = next(row for row in group if row["workers"] == 12 + and row["compiler"] == "clang") + style = 1 if recipe == "surface-world" else 2 + baseline = (ROOT / "Standalone/Tools/verify/baselines/owner-hash/canonical" + / f"owner-hash-{recipe}-style{style}-v224.baseline") + baseline.write_text("\n".join(canonical["hashes"]) + "\n", + encoding="utf-8") + summary = {"runs": rows, "groups": groups, + "owner2_canonical_pins": ["owner2/surface-world", + "owner2/floating-islands"]} + (OUT / "summary.json").write_text(json.dumps(summary, indent=2) + "\n", + encoding="utf-8") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/RunL119PassageCounters.py b/Standalone/Research/WorldAssemblerM3/Linux119/RunL119PassageCounters.py new file mode 100644 index 0000000..872183b --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux119/RunL119PassageCounters.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +"""Collect two W8 passage-counter profiles per owner stratum.""" +from __future__ import annotations + +import json +import re +import subprocess +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / "Saved/Linux/l119/passage-counters" +DATA = ROOT / "Standalone/data/owner_world.json" +BINARY = ROOT / "Saved/Linux/l119/bin/VoxelForgeCoreHeadless-l119-clang" +CAMERAS = { + 0: (8.0, 16.0, -372.2626953125), + 1: (25.8369140625, 3.19921875, -737.0), + 2: (19.166015625, -14.2001953125, -753.3740234375), + 3: (-20.0625, -5.068359375, -900.353515625), +} +FIELDS = re.compile(r"([a-zA-Z0-9_]+)=([^ ]+)") + + +def rows(path: Path, tag: str) -> dict[str, dict[str, str]]: + result = {} + for line in path.read_text(encoding="utf-8", errors="replace").splitlines(): + if line.startswith(tag + " "): + field = dict(FIELDS.findall(line)) + result[field["key"]] = field + return result + + +def run(strate: int, replicate: int) -> dict: + OUT.mkdir(parents=True, exist_ok=True) + label = f"s{strate}-w8-profile{replicate}" + log = OUT / f"{label}.log" + camera = ",".join(f"{value:.12f}" for value in CAMERAS[strate]) + ",0,0" + command = [ + "taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + "timeout", "1740s", str(BINARY), str(DATA), + "--world-assembler-prototype", "--stream-benchmark", "--stream-pipeline", + "--workers=8", "--clip-radius=3", "--max-clip-level=8", "--max-level=8", + f"--camera={camera}", "--profile-lod-work", "--profile-passage-composer", + ] + started = time.monotonic() + with log.open("w", encoding="utf-8") as stream: + result = subprocess.run(command, cwd=ROOT, stdout=stream, + stderr=subprocess.STDOUT, check=False, timeout=1740) + if result.returncode: + raise SystemExit(f"passage-counter profile failed: {log}; exit={result.returncode}") + composer, stages = rows(log, "[PassageComposerTile]"), rows(log, "[CpuTileStages]") + selected = [] + for key, comp in composer.items(): + lod = int(key.rsplit("lod", 1)[1].rstrip(")")) + if lod > 2 or int(comp["features"]) == 0: + continue + stage = stages.get(key) + if stage is None: + raise SystemExit(f"missing CpuTileStages record for {label} {key}") + fallbacks = [int(value) for value in stage["sweep_exact_fallback_by_caller"].split(",")] + selected.append({ + "features": int(comp["features"]), + "sweep_pairs": int(comp["sweep_pairs"]), + "shell_support_skips": int(comp.get("sweep_shell_support_skips", "0")), + "exact_fallbacks": sum(fallbacks), + "segment_visits": int(comp["carve_segment_visits"]), + }) + names = ("sweep_pairs", "shell_support_skips", "exact_fallbacks", "segment_visits") + totals = {name: sum(item[name] for item in selected) for name in names} + row = {"strate": strate, "workers": 8, "replicate": replicate, + "passage_tiles_lod02": len(selected), "totals": totals, + "elapsed_s": round(time.monotonic() - started, 3), + "log": str(log.relative_to(ROOT))} + print("[L119PassageCounters] " + json.dumps(row, sort_keys=True), flush=True) + return row + + +def main() -> int: + if not DATA.is_file() or not BINARY.is_file(): + raise SystemExit("missing L119 passage-counter input") + result = [run(strate, replicate) for strate in range(4) for replicate in (1, 2)] + summary = [] + for strate in range(4): + group = [item for item in result if item["strate"] == strate] + summary.append({"strate": strate, "workers": 8, "replicates": len(group), + "totals_mean": { + name: sum(row["totals"][name] for row in group) / len(group) + for name in group[0]["totals"]}}) + (OUT / "summary.json").write_text( + json.dumps({"runs": result, "summary": summary}, indent=2) + "\n", + encoding="utf-8") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/RunL119TagProbe.py b/Standalone/Research/WorldAssemblerM3/Linux119/RunL119TagProbe.py new file mode 100644 index 0000000..b3cd73a --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux119/RunL119TagProbe.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +"""Collect W1 per-tile swept-tube preparation timings for each owner stratum.""" +from __future__ import annotations + +import json +import re +import subprocess +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / "Saved/Linux/l119/tag-probe" +DATA = ROOT / "Standalone/data/owner_world.json" +BINARY = ROOT / "Saved/Linux/l119/bin/VoxelForgeCoreHeadless-l119-clang" +CAMERAS = { + 0: (8.0, 16.0, -372.2626953125), + 1: (25.8369140625, 3.19921875, -737.0), + 2: (19.166015625, -14.2001953125, -753.3740234375), + 3: (-20.0625, -5.068359375, -900.353515625), +} +PASSAGE = re.compile(r"^\[PassageComposerTile\] (.*)$", re.M) +FIELDS = re.compile(r"([a-zA-Z0-9_]+)=([^ ]+)") + + +def run(strate: int) -> dict: + OUT.mkdir(parents=True, exist_ok=True) + label = f"s{strate}-w1-tags" + log = OUT / f"{label}.log" + camera = ",".join(f"{value:.12f}" for value in CAMERAS[strate]) + ",0,0" + command = [ + "taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + "timeout", "1740s", str(BINARY), str(DATA), + "--world-assembler-prototype", "--stream-benchmark", "--stream-pipeline", + "--workers=1", "--clip-radius=3", "--max-clip-level=8", "--max-level=8", + f"--camera={camera}", "--profile-lod-work", "--profile-passage-composer", + ] + started = time.monotonic() + with log.open("w", encoding="utf-8") as stream: + result = subprocess.run(command, cwd=ROOT, stdout=stream, + stderr=subprocess.STDOUT, check=False, timeout=1740) + content = log.read_text(encoding="utf-8", errors="replace") + passage = [dict(FIELDS.findall(match)) for match in PASSAGE.findall(content)] + if result.returncode or not passage: + raise SystemExit(f"prepare probe failed or emitted no passage counters: {log}; " + f"exit={result.returncode}") + near = [row for row in passage + if int(row["key"].rsplit("lod", 1)[1].rstrip(")")) <= 2 + and int(row["features"]) > 0] + totals = { + "passage_feature_tiles": len(near), + "sweep_prepare_ms": sum(float(row["sweep_prepare_ms"]) for row in near), + "sweep_pairs": sum(int(row["sweep_pairs"]) for row in near), + "shell_support_skips": sum( + int(row["sweep_shell_support_skips"]) for row in near), + } + row = {"strate": strate, "workers": 1, "elapsed_s": round(time.monotonic() - started, 3), + "near_lod02_feature_tiles": totals, + "log": str(log.relative_to(ROOT))} + print("[L119TagProbe] " + json.dumps(row, sort_keys=True), flush=True) + return row + + +def main() -> int: + if not DATA.is_file() or not BINARY.is_file(): + raise SystemExit("missing owner data or L119 Clang binary") + rows = [run(strate) for strate in range(4)] + (OUT / "summary.json").write_text(json.dumps(rows, indent=2) + "\n", + encoding="utf-8") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/RunL119Timing.py b/Standalone/Research/WorldAssemblerM3/Linux119/RunL119Timing.py new file mode 100644 index 0000000..0b54eac --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux119/RunL119Timing.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python3 +"""Five interleaved L80 readiness runs for L109, L115, and L119.""" +from __future__ import annotations + +import json +import os +import re +import statistics +import subprocess +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / "Saved/Linux/l119/timing" +DATA = ROOT / "Standalone/data/owner_world.json" +BINARIES = { + "L109": ROOT / "Saved/Linux/l109/bin-final/VoxelForgeCoreHeadless-l109-clang", + "L115": ROOT / "Saved/Linux/l115/bin/VoxelForgeCoreHeadless-l115-clang", + "L119": ROOT / "Saved/Linux/l119/bin/VoxelForgeCoreHeadless-l119-clang", +} +CAMERAS = { + 0: (8.0, 16.0, -372.2626953125), + 1: (25.8369140625, 3.19921875, -737.0), + 2: (19.166015625, -14.2001953125, -753.3740234375), + 3: (-20.0625, -5.068359375, -900.353515625), +} +PIPELINE = re.compile(r"^\[StreamPipeline\] (.*)$", re.M) +FIELDS = re.compile(r"([a-zA-Z0-9_]+)=([^ ]+)") +NEAR = re.compile( + r"^\[WorldAssemblerNearLODReady\] lods=0-2 tiles=(\d+)/(\d+) cold_ready_s=([0-9.]+)$", + re.M, +) + + +def run(strate: int, workers: int, version: str, phase: str, replicate: int) -> dict: + OUT.mkdir(parents=True, exist_ok=True) + label = f"s{strate}-w{workers}-{version}-{phase}{replicate}" + log = OUT / f"{label}.log" + camera = ",".join(f"{value:.12f}" for value in CAMERAS[strate]) + ",0,0" + command = [ + "taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + "timeout", "1740s", str(BINARIES[version]), str(DATA), + "--world-assembler-prototype", "--stream-benchmark", "--stream-pipeline", + f"--workers={workers}", "--clip-radius=3", "--max-clip-level=8", "--max-level=8", + f"--camera={camera}", "--profile-lod-work", "--stream-scheduler-policy=3", + ] + started = time.monotonic() + with log.open("w", encoding="utf-8") as output: + result = subprocess.run(command, cwd=ROOT, stdout=output, + stderr=subprocess.STDOUT, check=False, timeout=1740) + content = log.read_text(encoding="utf-8", errors="replace") + pipeline_match = PIPELINE.search(content) + near_match = NEAR.search(content) + if result.returncode or pipeline_match is None or near_match is None: + raise SystemExit(f"readiness run failed or trace missing: {log}; exit={result.returncode}") + pipeline = dict(FIELDS.findall(pipeline_match.group(1))) + row = {"strate": strate, "workers": workers, "version": version, + "phase": phase, "replicate": replicate, "exit_code": result.returncode, + "wall_s": round(time.monotonic() - started, 3), + "lod02_ready_s": float(near_match.group(3)), + "whole_view_ready_s": float(pipeline["whole_view_ready"].removesuffix("s")), + "whole_tiles": int(pipeline["whole_tiles"].split("/")[0]), + "log": str(log.relative_to(ROOT))} + print("[L119TimingRun] " + json.dumps(row, sort_keys=True), flush=True) + return row + + +def cpu_idle_percent(interval_s: float = 2.0) -> float: + def totals() -> tuple[int, int]: + fields = Path("/proc/stat").read_text(encoding="utf-8").splitlines()[0].split() + values = [int(value) for value in fields[1:]] + return sum(values), values[3] + (values[4] if len(values) > 4 else 0) + total_before, idle_before = totals() + time.sleep(interval_s) + total_after, idle_after = totals() + total_delta = max(1, total_after - total_before) + return 100.0 * (idle_after - idle_before) / total_delta + + +def main() -> int: + if not DATA.is_file() or any(not binary.is_file() for binary in BINARIES.values()): + raise SystemExit("missing L109/L115/L119 timing input") + OUT.mkdir(parents=True, exist_ok=True) + load_1m = os.getloadavg()[0] + idle_pct = cpu_idle_percent() + uptime = subprocess.run(["uptime"], cwd=ROOT, text=True, + capture_output=True, check=True).stdout.strip() + top = subprocess.run(["ps", "-eo", "pid,pcpu,comm", "--sort=-pcpu"], cwd=ROOT, + text=True, capture_output=True, check=True).stdout + (OUT / "machine-load-before.txt").write_text( + f"uptime: {uptime}\n1-minute load: {load_1m:.2f}\n" + f"2-second CPU idle: {idle_pct:.1f}%\ntop CPU users:\n{top}", + encoding="utf-8") + print(f"[L119TimingGate] load_1m={load_1m:.2f} cpu_idle_2s={idle_pct:.1f}% " + f"uptime={uptime}", flush=True) + if load_1m >= 0.9 or idle_pct < 97.0: + raise SystemExit("timing refused: machine is above the quiet-load gate") + rows = [] + versions = ("L109", "L115", "L119") + for strate in range(4): + for workers in (8, 12): + for version in versions: + run(strate, workers, version, "warmup", 0) + for replicate in range(1, 6): + offset = (replicate - 1) % len(versions) + order = versions[offset:] + versions[:offset] + for version in order: + rows.append(run(strate, workers, version, "measured", replicate)) + (OUT / "runs-partial.json").write_text( + json.dumps(rows, indent=2) + "\n", encoding="utf-8") + summary = [] + for strate in range(4): + for workers in (8, 12): + item = {"strate": strate, "workers": workers, "replicates": 5} + medians = {} + for version in versions: + group = [row for row in rows if row["strate"] == strate + and row["workers"] == workers and row["version"] == version] + medians[version] = {} + for key in ("lod02_ready_s", "whole_view_ready_s"): + values = [row[key] for row in group] + medians[version][key] = statistics.median(values) + item[f"{version}_{key}_values"] = values + item[f"{version}_{key}_median"] = medians[version][key] + for comparison in ("L109", "L115"): + for key in ("lod02_ready_s", "whole_view_ready_s"): + item[f"L119_vs_{comparison}_{key}_delta_pct"] = round( + 100.0 * (medians["L119"][key] / medians[comparison][key] - 1.0), 2) + summary.append(item) + (OUT / "summary.json").write_text( + json.dumps({"runs": rows, "summary": summary}, indent=2) + "\n", + encoding="utf-8") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/COMPARE.html b/Standalone/Research/WorldAssemblerM3/Linux119/captures/COMPARE.html new file mode 100644 index 0000000..a1ace2f --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux119/captures/COMPARE.html @@ -0,0 +1,30 @@ + + +L115 / L119 tunnel capture comparison + +

L115 and L119 tunnel captures

+

The same 23 view names and camera poses are paired side by side. Select an image to open it full size.

+

passage/0-1/0 · rock-floor/401.7m · rock-floor-close

Status: pass

L115
L119
+

passage/0-1/0 · rock-floor/792.8m · rock-floor-close

Status: pass

L115
L119
+

passage/0-1/0 · rock-floor/1634.5m · rock-floor-close

Status: pass

L115
L119
+

passage/1-2/0 · rock-floor/27.0m · rock-floor-close

Status: pass

L115
L119
+

passage/1-2/0 · rock-floor/52.9m · rock-floor-close

Status: pass

L115
L119
+

passage/1-2/0 · rock-floor/78.9m · rock-floor-close

Status: pass

L115
L119
+

passage/2-3/0 · rock-floor/323.4m · rock-floor-close

Status: low_contrast_geometry_visible

L115
L119
+

passage/2-3/0 · rock-floor/333.4m · rock-floor-close

Status: pass

L115
L119
+

passage/2-3/0 · rock-floor/343.4m · rock-floor-close

Status: pass

L115
L119
+

passage/0-1/0 · section-1/4m-outside · open-air-close

Status: pass

L115
L119
+

passage/0-1/0 · section-1/4m-interior-wall · open-air-close

Status: low_contrast_geometry_visible

L115
L119
+

passage/0-1/0 · section-2/4m-outside · open-air-close

Status: pass

L115
L119
+

passage/0-1/0 · section-2/4m-interior-wall · open-air-close

Status: pass

L115
L119
+

passage/0-1/0 · section-3/4m-outside · open-air-close

Status: pass

L115
L119
+

passage/0-1/0 · section-3/4m-interior-wall · open-air-close

Status: pass

L115
L119
+

passage/1-2/0 · section-1/4m-outside · open-air-close

Status: pass

L115
L119
+

passage/1-2/0 · section-1/4m-interior-wall · open-air-close

Status: pass

L115
L119
+

passage/1-2/0 · section-2/4m-outside · open-air-close

Status: pass

L115
L119
+

passage/1-2/0 · section-2/4m-interior-wall · open-air-close

Status: pass

L115
L119
+

passage/2-3/0 · section-1/4m-outside · open-air-close

Status: low_contrast_geometry_visible

L115
L119
+

passage/2-3/0 · section-1/4m-interior-wall · open-air-close

Status: low_contrast_geometry_visible

L115
L119
+

passage/2-3/0 · section-2/4m-outside · open-air-close

Status: pass

L115
L119
+

passage/2-3/0 · section-2/4m-interior-wall · open-air-close

Status: pass

L115
L119
+ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/INDEX.md b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/INDEX.md new file mode 100644 index 0000000..97bae2d --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/INDEX.md @@ -0,0 +1,27 @@ +# L119 captures (L115 view set) + +The 23 L115 camera poses were rendered with the L119 binary. Floor anchors require an upward normal alignment of at least 0.85, target-to-floor distance at most 0.25 m, and camera-to-floor distance between 2.0 and 3.2 m. Open-air sections have outside and interior wall close-ups at 4 m. + +- [passage/0-1/0 rock-floor/401.7m](L115/L115/passage-0-1-0-rock-floor-station-1.png) — rock-floor-close; 122294 triangles; pass +- [passage/0-1/0 rock-floor/792.8m](L115/L115/passage-0-1-0-rock-floor-station-2.png) — rock-floor-close; 586092 triangles; pass +- [passage/0-1/0 rock-floor/1634.5m](L115/L115/passage-0-1-0-rock-floor-station-3.png) — rock-floor-close; 137288 triangles; pass +- [passage/1-2/0 rock-floor/27.0m](L115/L115/passage-1-2-0-rock-floor-station-1.png) — rock-floor-close; 652056 triangles; pass +- [passage/1-2/0 rock-floor/52.9m](L115/L115/passage-1-2-0-rock-floor-station-2.png) — rock-floor-close; 636162 triangles; pass +- [passage/1-2/0 rock-floor/78.9m](L115/L115/passage-1-2-0-rock-floor-station-3.png) — rock-floor-close; 580472 triangles; pass +- [passage/2-3/0 rock-floor/323.4m](L115/L115/passage-2-3-0-rock-floor-station-1.png) — rock-floor-close; 474964 triangles; low_contrast_geometry_visible +- [passage/2-3/0 rock-floor/333.4m](L115/L115/passage-2-3-0-rock-floor-station-2.png) — rock-floor-close; 494504 triangles; pass +- [passage/2-3/0 rock-floor/343.4m](L115/L115/passage-2-3-0-rock-floor-station-3.png) — rock-floor-close; 485356 triangles; pass +- [passage/0-1/0 section-1/4m-outside](L115/L115/passage-0-1-0-openair-1-4m-outside.png) — open-air-close; 275333 triangles; pass +- [passage/0-1/0 section-1/4m-interior-wall](L115/L115/passage-0-1-0-openair-1-4m-interior-wall.png) — open-air-close; 308012 triangles; low_contrast_geometry_visible +- [passage/0-1/0 section-2/4m-outside](L115/L115/passage-0-1-0-openair-2-4m-outside.png) — open-air-close; 275333 triangles; pass +- [passage/0-1/0 section-2/4m-interior-wall](L115/L115/passage-0-1-0-openair-2-4m-interior-wall.png) — open-air-close; 345026 triangles; pass +- [passage/0-1/0 section-3/4m-outside](L115/L115/passage-0-1-0-openair-3-4m-outside.png) — open-air-close; 149234 triangles; pass +- [passage/0-1/0 section-3/4m-interior-wall](L115/L115/passage-0-1-0-openair-3-4m-interior-wall.png) — open-air-close; 148100 triangles; pass +- [passage/1-2/0 section-1/4m-outside](L115/L115/passage-1-2-0-openair-1-4m-outside.png) — open-air-close; 620814 triangles; pass +- [passage/1-2/0 section-1/4m-interior-wall](L115/L115/passage-1-2-0-openair-1-4m-interior-wall.png) — open-air-close; 609757 triangles; pass +- [passage/1-2/0 section-2/4m-outside](L115/L115/passage-1-2-0-openair-2-4m-outside.png) — open-air-close; 584542 triangles; pass +- [passage/1-2/0 section-2/4m-interior-wall](L115/L115/passage-1-2-0-openair-2-4m-interior-wall.png) — open-air-close; 572258 triangles; pass +- [passage/2-3/0 section-1/4m-outside](L115/L115/passage-2-3-0-openair-1-4m-outside.png) — open-air-close; 104612 triangles; low_contrast_geometry_visible +- [passage/2-3/0 section-1/4m-interior-wall](L115/L115/passage-2-3-0-openair-1-4m-interior-wall.png) — open-air-close; 94962 triangles; low_contrast_geometry_visible +- [passage/2-3/0 section-2/4m-outside](L115/L115/passage-2-3-0-openair-2-4m-outside.png) — open-air-close; 475860 triangles; pass +- [passage/2-3/0 section-2/4m-interior-wall](L115/L115/passage-2-3-0-openair-2-4m-interior-wall.png) — open-air-close; 486480 triangles; pass diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-1-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-1-4m-interior-wall.png new file mode 100644 index 0000000..1fd88a4 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-1-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-1-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-1-4m-outside.png new file mode 100644 index 0000000..87570be Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-1-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-2-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-2-4m-interior-wall.png new file mode 100644 index 0000000..f76e648 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-2-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-2-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-2-4m-outside.png new file mode 100644 index 0000000..c19fc5f Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-2-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-3-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-3-4m-interior-wall.png new file mode 100644 index 0000000..7dcd833 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-3-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-3-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-3-4m-outside.png new file mode 100644 index 0000000..816ba1d Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-openair-3-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-rock-floor-station-1.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-rock-floor-station-1.png new file mode 100644 index 0000000..e67e8c5 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-rock-floor-station-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-rock-floor-station-2.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-rock-floor-station-2.png new file mode 100644 index 0000000..2b35b85 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-rock-floor-station-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-rock-floor-station-3.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-rock-floor-station-3.png new file mode 100644 index 0000000..bed41ff Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-0-1-0-rock-floor-station-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-openair-1-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-openair-1-4m-interior-wall.png new file mode 100644 index 0000000..7569f8c Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-openair-1-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-openair-1-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-openair-1-4m-outside.png new file mode 100644 index 0000000..cd3c8b5 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-openair-1-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-openair-2-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-openair-2-4m-interior-wall.png new file mode 100644 index 0000000..a6be396 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-openair-2-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-openair-2-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-openair-2-4m-outside.png new file mode 100644 index 0000000..c00f532 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-openair-2-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-rock-floor-station-1.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-rock-floor-station-1.png new file mode 100644 index 0000000..3611714 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-rock-floor-station-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-rock-floor-station-2.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-rock-floor-station-2.png new file mode 100644 index 0000000..9ac3f59 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-rock-floor-station-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-rock-floor-station-3.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-rock-floor-station-3.png new file mode 100644 index 0000000..5b0e0d2 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-1-2-0-rock-floor-station-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-openair-1-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-openair-1-4m-interior-wall.png new file mode 100644 index 0000000..8a9efbd Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-openair-1-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-openair-1-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-openair-1-4m-outside.png new file mode 100644 index 0000000..6ce2868 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-openair-1-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-openair-2-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-openair-2-4m-interior-wall.png new file mode 100644 index 0000000..8532d70 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-openair-2-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-openair-2-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-openair-2-4m-outside.png new file mode 100644 index 0000000..e9fef5f Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-openair-2-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-rock-floor-station-1.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-rock-floor-station-1.png new file mode 100644 index 0000000..0413199 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-rock-floor-station-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-rock-floor-station-2.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-rock-floor-station-2.png new file mode 100644 index 0000000..f823d6e Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-rock-floor-station-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-rock-floor-station-3.png b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-rock-floor-station-3.png new file mode 100644 index 0000000..279866a Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/L115/L115/passage-2-3-0-rock-floor-station-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/capture-index.json b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/capture-index.json new file mode 100644 index 0000000..15f0f95 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux119/captures/L119/capture-index.json @@ -0,0 +1,1562 @@ +{ + "captures": [ + { + "name": "passage-0-1-0-rock-floor-station-1", + "passage": "passage/0-1/0", + "kind": "rock-floor-close", + "station": "rock-floor/401.7m", + "camera": [ + -9.24648786798055, + 19.798675033837775, + -443.9636296749357 + ], + "target": [ + -7.026884524505579, + 20.857335392121104, + -445.66373993191075 + ], + "yaw": 64.50075976736525, + "pitch": -34.65771934187305, + "focus": [ + -7.026884524505579, + 20.857335392121104, + -445.66373993191075 + ], + "center_z": -445.66373993191075, + "route_distance_m": 401.6612010038529, + "requested_route_distance_m": 401.6612010038529, + "route_length_m": 2026.6238040154117, + "planned_floor_m": -445.66373993191075, + "planned_grade_deg": 10.372328677972732, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-0-1-0-rock-floor-station-1.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-rock-floor-station-1.vfmesh", + "drawn_triangles": 122294, + "source_triangles": 146798, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 401.6612010038529, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": 3.220861372694969e-06, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -9.24648786798055, + 19.798675033837775, + -443.9636296749357 + ], + "target_actual_m": [ + -7.026884524505579, + 20.857335392121104, + -445.66373993191075 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-rock-floor-station-1-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-rock-floor-station-1-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-rock-floor-station-1-quality.log" + ], + "floor_anchor_position_m": [ + -7.026885053959959, + 20.857335155432953, + -445.66374310012867 + ], + "floor_anchor_normal": [ + 0.16438021494383692, + 0.07357583212203939, + 0.9836491965444629 + ], + "closeup_camera_to_floor_distance_m": 2.989612610955708, + "closeup_floor_normal_alignment": 0.9836491965444629, + "verified_upward_floor_normal": true + }, + { + "name": "passage-0-1-0-rock-floor-station-2", + "passage": "passage/0-1/0", + "kind": "rock-floor-close", + "station": "rock-floor/792.8m", + "camera": [ + -0.021280083711839648, + -26.43771312964049, + -514.3617561596035 + ], + "target": [ + -2.4714859241065525, + -26.227784739959716, + -516.0616688299093 + ], + "yaw": -85.10297944703369, + "pitch": -34.654210347383824, + "focus": [ + -2.4714859241065525, + -26.227784739959716, + -516.0616688299093 + ], + "center_z": -516.0616688299093, + "route_distance_m": 792.8284020077059, + "requested_route_distance_m": 792.8284020077059, + "route_length_m": 2026.6238040154117, + "planned_floor_m": -516.0616688299093, + "planned_grade_deg": 10.367725129664787, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-0-1-0-rock-floor-station-2.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-rock-floor-station-2.vfmesh", + "drawn_triangles": 586092, + "source_triangles": 626196, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 792.8284020077059, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": 5.0973121461263994e-05, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -0.021280083711839648, + -26.43771312964049, + -514.3617561596035 + ], + "target_actual_m": [ + -2.4714859241065525, + -26.227784739959716, + -516.0616688299093 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-rock-floor-station-2-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-rock-floor-station-2-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-rock-floor-station-2-quality.log" + ], + "floor_anchor_position_m": [ + -2.471476828908, + -26.227785976319144, + -516.0617189697925 + ], + "floor_anchor_normal": [ + -0.179115780575022, + 0.024140888419756926, + 0.9835317761289187 + ], + "closeup_camera_to_floor_distance_m": 2.9895496409822853, + "closeup_floor_normal_alignment": 0.9835317761289187, + "verified_upward_floor_normal": true + }, + { + "name": "passage-0-1-0-rock-floor-station-3", + "passage": "passage/0-1/0", + "kind": "rock-floor-close", + "station": "rock-floor/1634.5m", + "camera": [ + 15.717287112180728, + 19.71739973195528, + -665.8352816543407 + ], + "target": [ + 17.336220092016376, + 17.86620742417785, + -667.5348848643227 + ], + "yaw": 138.82915885966676, + "pitch": -34.64871452830556, + "focus": [ + 17.336220092016376, + 17.86620742417785, + -667.5348848643227 + ], + "center_z": -667.5348848643227, + "route_distance_m": 1634.4566030115589, + "requested_route_distance_m": 1634.4566030115589, + "route_length_m": 2026.6238040154117, + "planned_floor_m": -667.5348848643227, + "planned_grade_deg": 10.360515186362372, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-0-1-0-rock-floor-station-3.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-rock-floor-station-3.vfmesh", + "drawn_triangles": 137288, + "source_triangles": 166736, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1634.4566030115589, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": 1.5155223007846759e-05, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 15.717287112180728, + 19.71739973195528, + -665.8352816543407 + ], + "target_actual_m": [ + 17.336220092016376, + 17.86620742417785, + -667.5348848643227 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-rock-floor-station-3-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-rock-floor-station-3-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-rock-floor-station-3-quality.log" + ], + "floor_anchor_position_m": [ + 17.33622182815858, + 17.866205324064538, + -667.534869956066 + ], + "floor_anchor_normal": [ + 0.11463807621472542, + -0.13864390562764303, + 0.9836848981834071 + ], + "closeup_camera_to_floor_distance_m": 2.9893930396931125, + "closeup_floor_normal_alignment": 0.9836848981834071, + "verified_upward_floor_normal": true + }, + { + "name": "passage-1-2-0-rock-floor-station-1", + "passage": "passage/1-2/0", + "kind": "rock-floor-close", + "station": "rock-floor/27.0m", + "camera": [ + 15.990262769683945, + 2.495369317804175, + -736.4846720823747 + ], + "target": [ + 15.354493464592624, + 4.868558240151556, + -738.1970266319915 + ], + "yaw": -14.99718988160138, + "pitch": -34.875140724394136, + "focus": [ + 15.354493464592624, + 4.868558240151556, + -738.1970266319915 + ], + "center_z": -738.1970266319915, + "route_distance_m": 26.963657939523273, + "requested_route_distance_m": 26.963657939523273, + "route_length_m": 114.99063175809309, + "planned_floor_m": -738.1970266319915, + "planned_grade_deg": 10.657740387934142, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-1-2-0-rock-floor-station-1.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-rock-floor-station-1.vfmesh", + "drawn_triangles": 652056, + "source_triangles": 719660, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 26.963657939523273, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": 0.0075711794948277, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 15.990262769683945, + 2.495369317804175, + -736.4846720823747 + ], + "target_actual_m": [ + 15.354493464592624, + 4.868558240151556, + -738.1970266319915 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-rock-floor-station-1-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-rock-floor-station-1-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-rock-floor-station-1-quality.log" + ], + "floor_anchor_position_m": [ + 15.354124807038394, + 4.869920275450426, + -738.1895881032126 + ], + "floor_anchor_normal": [ + -0.047307387705878, + 0.17883124580074233, + 0.9827417751341397 + ], + "closeup_camera_to_floor_distance_m": 2.9916387475909154, + "closeup_floor_normal_alignment": 0.9827417751341397, + "verified_upward_floor_normal": true + }, + { + "name": "passage-1-2-0-rock-floor-station-2", + "passage": "passage/1-2/0", + "kind": "rock-floor-close", + "station": "rock-floor/52.9m", + "camera": [ + -2.48434493546405, + 15.983647301702653, + -741.2835409028854 + ], + "target": [ + -4.76517685476837, + 15.070128626649932, + -742.995373541633 + ], + "yaw": -111.82708648318167, + "pitch": -34.86587426337977, + "focus": [ + -4.76517685476837, + 15.070128626649932, + -742.995373541633 + ], + "center_z": -742.995373541633, + "route_distance_m": 52.927315879046546, + "requested_route_distance_m": 52.927315879046546, + "route_length_m": 114.99063175809309, + "planned_floor_m": -742.995373541633, + "planned_grade_deg": 10.645569354114926, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-1-2-0-rock-floor-station-2.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-rock-floor-station-2.vfmesh", + "drawn_triangles": 636162, + "source_triangles": 700558, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 52.927315879046546, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": 0.007268380723528676, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -2.48434493546405, + 15.983647301702653, + -741.2835409028854 + ], + "target_actual_m": [ + -4.76517685476837, + 15.070128626649932, + -742.995373541633 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-rock-floor-station-2-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-rock-floor-station-2-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-rock-floor-station-2-quality.log" + ], + "floor_anchor_position_m": [ + -4.766428465537912, + 15.069671584786441, + -742.988228337538 + ], + "floor_anchor_normal": [ + -0.1744301807701029, + -0.061608715063684795, + 0.9827402903436447 + ], + "closeup_camera_to_floor_distance_m": 2.9915240428933867, + "closeup_floor_normal_alignment": 0.9827402903436447, + "verified_upward_floor_normal": true + }, + { + "name": "passage-1-2-0-rock-floor-station-3", + "passage": "passage/1-2/0", + "kind": "rock-floor-close", + "station": "rock-floor/78.9m", + "camera": [ + -13.44544511010513, + -3.995230772069307, + -746.0839041050349 + ], + "target": [ + -12.287009401722694, + -6.161841337747165, + -747.7963166548619 + ], + "yaw": 151.8676321960706, + "pitch": -34.87617050502889, + "focus": [ + -12.287009401722694, + -6.161841337747165, + -747.7963166548619 + ], + "center_z": -747.7963166548619, + "route_distance_m": 78.89097381856982, + "requested_route_distance_m": 78.89097381856982, + "route_length_m": 114.99063175809309, + "planned_floor_m": -747.7963166548619, + "planned_grade_deg": 10.659092990906162, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-1-2-0-rock-floor-station-3.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-rock-floor-station-3.vfmesh", + "drawn_triangles": 580472, + "source_triangles": 639376, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 78.89097381856982, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": 0.2416584161119622, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -13.44544511010513, + -3.995230772069307, + -746.0839041050349 + ], + "target_actual_m": [ + -12.287009401722694, + -6.161841337747165, + -747.7963166548619 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-rock-floor-station-3-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-rock-floor-station-3-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-rock-floor-station-3-quality.log" + ], + "floor_anchor_position_m": [ + -12.283352972838873, + -6.167679829029396, + -747.554756449892 + ], + "floor_anchor_normal": [ + 0.09692807602747124, + -0.15782686841357624, + 0.9826981366036961 + ], + "closeup_camera_to_floor_distance_m": 2.8693901200350096, + "closeup_floor_normal_alignment": 0.9826981366036961, + "verified_upward_floor_normal": true + }, + { + "name": "passage-2-3-0-rock-floor-station-1", + "passage": "passage/2-3/0", + "kind": "rock-floor-close", + "station": "rock-floor/323.4m", + "camera": [ + 6.997568341188331, + -14.934306981606339, + -869.3796844648476 + ], + "target": [ + 9.102823911740126, + -13.661883549736208, + -871.0755965556104 + ], + "yaw": 58.85109570948622, + "pitch": -34.583159686285406, + "focus": [ + 9.102823911740126, + -13.661883549736208, + -871.0755965556104 + ], + "center_z": -871.0755965556104, + "route_distance_m": 323.4481319239866, + "requested_route_distance_m": 323.4481319239866, + "route_length_m": 494.0722798830563, + "planned_floor_m": -871.0755965556104, + "planned_grade_deg": 10.274530613220444, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-2-3-0-rock-floor-station-1.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-rock-floor-station-1.vfmesh", + "drawn_triangles": 474964, + "source_triangles": 502362, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 323.4481319239866, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": 0.007052221396490902, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 6.997568341188331, + -14.934306981606339, + -869.3796844648476 + ], + "target_actual_m": [ + 9.102823911740126, + -13.661883549736208, + -871.0755965556104 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-rock-floor-station-1-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-rock-floor-station-1-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-rock-floor-station-1-quality.log" + ], + "floor_anchor_position_m": [ + 9.103799793973732, + -13.661094033901383, + -871.068656948616 + ], + "floor_anchor_normal": [ + 0.14021616794161246, + 0.11018123609139711, + 0.9839713011369495 + ], + "closeup_camera_to_floor_distance_m": 2.9849472681829123, + "closeup_floor_normal_alignment": 0.9839713011369495, + "verified_upward_floor_normal": true + }, + { + "name": "passage-2-3-0-rock-floor-station-2", + "passage": "passage/2-3/0", + "kind": "rock-floor-close", + "station": "rock-floor/333.4m", + "camera": [ + 14.426607883839745, + -8.501776133009574, + -871.1605818845352 + ], + "target": [ + 15.203729308783775, + -6.16777561793481, + -872.8561420785873 + ], + "yaw": 18.41553205389999, + "pitch": -34.576909662847896, + "focus": [ + 15.203729308783775, + -6.16777561793481, + -872.8561420785873 + ], + "center_z": -872.8561420785873, + "route_distance_m": 333.4481319239866, + "requested_route_distance_m": 333.4481319239866, + "route_length_m": 494.0722798830563, + "planned_floor_m": -872.8561420785873, + "planned_grade_deg": 10.266334408339132, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-2-3-0-rock-floor-station-2.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-rock-floor-station-2.vfmesh", + "drawn_triangles": 494504, + "source_triangles": 524342, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 333.4481319239866, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": 0.007773394757486271, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 14.426607883839745, + -8.501776133009574, + -871.1605818845352 + ], + "target_actual_m": [ + 15.203729308783775, + -6.16777561793481, + -872.8561420785873 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-rock-floor-station-2-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-rock-floor-station-2-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-rock-floor-station-2-quality.log" + ], + "floor_anchor_position_m": [ + 15.204108325185125, + -6.1664350574610705, + -872.848494535829 + ], + "floor_anchor_normal": [ + 0.0468360027958031, + 0.17218671405633393, + 0.9839502651783747 + ], + "closeup_camera_to_floor_distance_m": 2.9845224063213145, + "closeup_floor_normal_alignment": 0.9839502651783747, + "verified_upward_floor_normal": true + }, + { + "name": "passage-2-3-0-rock-floor-station-3", + "passage": "passage/2-3/0", + "kind": "rock-floor-close", + "station": "rock-floor/343.4m", + "camera": [ + 16.176045301879554, + 1.1336183974400118, + -872.9426489764151 + ], + "target": [ + 15.465325445603714, + 3.4887437417106955, + -874.6379150751349 + ], + "yaw": -16.792543840841383, + "pitch": -34.57168620892087, + "focus": [ + 15.465325445603714, + 3.4887437417106955, + -874.6379150751349 + ], + "center_z": -874.6379150751349, + "route_distance_m": 343.4481319239866, + "requested_route_distance_m": 343.4481319239866, + "route_length_m": 494.0722798830563, + "planned_floor_m": -874.6379150751349, + "planned_grade_deg": 10.259484647608062, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-2-3-0-rock-floor-station-3.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-rock-floor-station-3.vfmesh", + "drawn_triangles": 485356, + "source_triangles": 512664, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 343.4481319239866, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": 0.1099406801293395, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 16.176045301879554, + 1.1336183974400118, + -872.9426489764151 + ], + "target_actual_m": [ + 15.465325445603714, + 3.4887437417106955, + -874.6379150751349 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-rock-floor-station-3-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-rock-floor-station-3-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-rock-floor-station-3-quality.log" + ], + "floor_anchor_position_m": [ + 15.464091528009144, + 3.4924186701988678, + -874.5280427606272 + ], + "floor_anchor_normal": [ + -0.061689200676463656, + 0.16755705537563617, + 0.9839304221913991 + ], + "closeup_camera_to_floor_distance_m": 2.9298959629846824, + "closeup_floor_normal_alignment": 0.9839304221913991, + "verified_upward_floor_normal": true + }, + { + "name": "passage-0-1-0-openair-1-4m-outside", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-1/4m-outside", + "camera": [ + 13.176702021211483, + 7.149068417345486, + -374.402 + ], + "target": [ + 9.197121888971225, + 7.5527291301707695, + -374.402 + ], + "yaw": -84.20812706837869, + "pitch": 0.0, + "focus": [ + 7.272, + 7.748, + -373.197 + ], + "center_z": -373.197, + "open_air_section": 1, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.9948950330600643, + -0.1009151782063209, + 0.0 + ], + "camera_target_distance_m": 4.000000000000001, + "route_distance_m": 8.3545, + "requested_route_distance_m": 8.3545, + "route_length_m": 2026.6238040154117, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-0-1-0-openair-1-4m-outside.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-1-4m-outside.vfmesh", + "drawn_triangles": 275333, + "source_triangles": 327745, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 8.3545, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.999999999999992, + "closeup_target_surface_distance_m": 0.794053842406799, + "closeup_predicted_target_offset_m": 0.794053842406799, + "closeup_wall_normal_alignment": 0.9449803535183738, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 12.920589450293994, + 7.974422667153486, + -375.0086678277374 + ], + "target_actual_m": [ + 9.12386703491211, + 8.0, + -373.75 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-1-4m-outside-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-1-4m-outside-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-1-4m-outside-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-1-4m-interior-wall", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-1/4m-interior-wall", + "camera": [ + 7.395778712540976, + 3.8749008126934172, + -374.89997477205173 + ], + "target": [ + 8.778272394312646, + 7.595214286886338, + -374.402 + ], + "yaw": 20.38540702862518, + "pitch": 7.1515181408188955, + "focus": [ + 7.272, + 7.748, + -373.197 + ], + "center_z": -373.197, + "open_air_section": 1, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.9948950330600643, + 0.1009151782063209, + -0.0 + ], + "camera_target_distance_m": 3.9999999999999973, + "route_distance_m": 8.3545, + "requested_route_distance_m": 8.3545, + "route_length_m": 2026.6238040154117, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-0-1-0-openair-1-4m-interior-wall.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-1-4m-interior-wall.vfmesh", + "drawn_triangles": 308012, + "source_triangles": 368124, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 8.3545, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.999999999999992, + "closeup_target_surface_distance_m": 0.8416597466625043, + "closeup_predicted_target_offset_m": 0.8416597466625043, + "closeup_wall_normal_alignment": 0.9449803535183738, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 5.327144619530225, + 8.025577332846515, + -372.4913321722626 + ], + "target_actual_m": [ + 9.12386703491211, + 8.0, + -373.75 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-1-4m-interior-wall-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-1-4m-interior-wall-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-1-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-2-4m-outside", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-2/4m-outside", + "camera": [ + 12.814097656232029, + 0.949800892309409, + -375.51163279923776 + ], + "target": [ + 8.842807594702599, + 1.4281890685821654, + -375.51163279923776 + ], + "yaw": -83.1311525734364, + "pitch": 0.0, + "focus": [ + 6.603, + 1.698, + -374.149 + ], + "center_z": -374.149, + "open_air_section": 2, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.9928225153823576, + -0.1195970440681891, + 0.0 + ], + "camera_target_distance_m": 4.0, + "route_distance_m": 14.4925, + "requested_route_distance_m": 14.4925, + "route_length_m": 2026.6238040154117, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-0-1-0-openair-2-4m-outside.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-2-4m-outside.vfmesh", + "drawn_triangles": 275333, + "source_triangles": 327745, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 14.4925, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.999999999999995, + "closeup_target_surface_distance_m": 1.0963161771133416, + "closeup_predicted_target_offset_m": 1.0963161771133416, + "closeup_wall_normal_alignment": 0.39413995490510356, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 9.613469253122387, + 1.5471847686714795, + -379.60073544787906 + ], + "target_actual_m": [ + 7.959597110748291, + 1.0, + -376.0 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-2-4m-outside-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-2-4m-outside-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-2-4m-outside-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-2-4m-interior-wall", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-2/4m-interior-wall", + "camera": [ + 6.939570778854576, + -2.1803140897652855, + -376.2060303004211 + ], + "target": [ + 8.388084903173432, + 1.4829657169105679, + -375.51163279923776 + ], + "yaw": 21.574563086437188, + "pitch": 9.997160707081923, + "focus": [ + 6.603, + 1.698, + -374.149 + ], + "center_z": -374.149, + "open_air_section": 2, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.9928225153823576, + 0.1195970440681891, + -0.0 + ], + "camera_target_distance_m": 3.999999999999997, + "route_distance_m": 14.4925, + "requested_route_distance_m": 14.4925, + "route_length_m": 2026.6238040154117, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-0-1-0-openair-2-4m-interior-wall.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-2-4m-interior-wall.vfmesh", + "drawn_triangles": 345026, + "source_triangles": 414658, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 14.4925, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000001, + "closeup_target_surface_distance_m": 0.7732263275133904, + "closeup_predicted_target_offset_m": 0.7732263275133904, + "closeup_wall_normal_alignment": 0.286757829360229, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 6.619154002331269, + 0.5694445029418322, + -372.249825471136 + ], + "target_actual_m": [ + 7.85216206252137, + 1.2143337388310353, + -376.0 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-2-4m-interior-wall-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-2-4m-interior-wall-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-2-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-3-4m-outside", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-3/4m-outside", + "camera": [ + -28.32291429976088, + -16.444327461849063, + -600.6066327992378 + ], + "target": [ + -25.004026673221745, + -14.211619482196229, + -600.6066327992378 + ], + "yaw": 56.07018168236039, + "pitch": 0.0, + "focus": [ + -22.1, + -12.258, + -599.244 + ], + "center_z": -599.244, + "open_air_section": 3, + "closeup_side": "outside", + "closeup_preferred_normal": [ + -0.8297219066347834, + -0.5581769949132084, + 0.0 + ], + "camera_target_distance_m": 4.000000000000001, + "route_distance_m": 1265.3425000000002, + "requested_route_distance_m": 1265.3425000000002, + "route_length_m": 2026.6238040154117, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-0-1-0-openair-3-4m-outside.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-3-4m-outside.vfmesh", + "drawn_triangles": 149234, + "source_triangles": 181128, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1265.3425000000002, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.9999999999999907, + "closeup_target_surface_distance_m": 0.06836631107301705, + "closeup_predicted_target_offset_m": 0.06836631107301705, + "closeup_wall_normal_alignment": 0.9604329420550252, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -28.63982379180018, + -15.582695163623317, + -601.2438490311043 + ], + "target_actual_m": [ + -24.955621627611308, + -14.176566764792845, + -600.5734332352072 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-3-4m-outside-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-3-4m-outside-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-3-4m-outside-quality.log" + ] + }, + { + "name": "passage-0-1-0-openair-3-4m-interior-wall", + "passage": "passage/0-1/0", + "kind": "open-air-close", + "station": "section-3/4m-interior-wall", + "camera": [ + -26.071689640946218, + -10.338278587083852, + -601.3036807194 + ], + "target": [ + -24.774901932566983, + -14.057480898923608, + -600.6066327992378 + ], + "yaw": 160.77768453528284, + "pitch": 10.035712777782798, + "focus": [ + -22.1, + -12.258, + -599.244 + ], + "center_z": -599.244, + "open_air_section": 3, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + 0.8297219066347834, + 0.5581769949132084, + -0.0 + ], + "camera_target_distance_m": 4.000000000000005, + "route_distance_m": 1265.3425000000002, + "requested_route_distance_m": 1265.3425000000002, + "route_length_m": 2026.6238040154117, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-0-1-0-openair-3-4m-interior-wall.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-3-4m-interior-wall.vfmesh", + "drawn_triangles": 148100, + "source_triangles": 180244, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 1265.3425000000002, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000004, + "closeup_target_surface_distance_m": 0.15667051955483755, + "closeup_predicted_target_offset_m": 0.15667051955483755, + "closeup_wall_normal_alignment": 0.936006465878356, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -21.875641690065105, + -11.887416826703374, + -599.3020917133557 + ], + "target_actual_m": [ + -24.866552934428398, + -14.149067333208382, + -600.6947104389109 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-3-4m-interior-wall-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-3-4m-interior-wall-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-0-1-0-openair-3-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-1-4m-outside", + "passage": "passage/1-2/0", + "kind": "open-air-close", + "station": "section-1/4m-outside", + "camera": [ + -4.699079444431819, + -4.6537955842685985, + -748.15 + ], + "target": [ + -7.452748333327923, + -7.555055250400828, + -748.15 + ], + "yaw": -136.49505148095557, + "pitch": 0.0, + "focus": [ + -9.518, + -9.731, + -745.88 + ], + "center_z": -745.88, + "open_air_section": 1, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.688417222224026, + 0.7253149165330574, + 0.0 + ], + "camera_target_distance_m": 4.000000000000001, + "route_distance_m": 83.504, + "requested_route_distance_m": 83.504, + "route_length_m": 114.99063175809309, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-1-2-0-openair-1-4m-outside.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-1-4m-outside.vfmesh", + "drawn_triangles": 620814, + "source_triangles": 684776, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 83.504, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.9999999999999654, + "closeup_target_surface_distance_m": 0.9023580264896125, + "closeup_predicted_target_offset_m": 0.9023580264896125, + "closeup_wall_normal_alignment": 0.5604211333378514, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -8.046760432303138, + -4.114982136123087, + -749.9844534333902 + ], + "target_actual_m": [ + -8.0, + -7.25, + -747.5006103515625 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-1-4m-outside-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-1-4m-outside-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-1-4m-outside-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-1-4m-interior-wall", + "passage": "passage/1-2/0", + "kind": "open-air-close", + "station": "section-1/4m-interior-wall", + "camera": [ + -6.0956279351195075, + -11.653774892861163, + -748.8673569837389 + ], + "target": [ + -8.16773669839842, + -8.308365466344922, + -748.15 + ], + "yaw": -31.773605793127505, + "pitch": 10.331275124559749, + "focus": [ + -9.518, + -9.731, + -745.88 + ], + "center_z": -745.88, + "open_air_section": 1, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.688417222224026, + -0.7253149165330574, + -0.0 + ], + "camera_target_distance_m": 3.999999999999997, + "route_distance_m": 83.504, + "requested_route_distance_m": 83.504, + "route_length_m": 114.99063175809309, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-1-2-0-openair-1-4m-interior-wall.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-1-4m-interior-wall.vfmesh", + "drawn_triangles": 609757, + "source_triangles": 668131, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 83.504, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 3.999999999999999, + "closeup_target_surface_distance_m": 0.6509430039577998, + "closeup_predicted_target_offset_m": 0.6509430039577998, + "closeup_wall_normal_alignment": 0.7808473937095911, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -8.525095579521167, + -12.94135557024142, + -748.3220319510015 + ], + "target_actual_m": [ + -8.18421537084871, + -8.958641713644115, + -748.1744141343152 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-1-4m-interior-wall-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-1-4m-interior-wall-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-1-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-2-4m-outside", + "passage": "passage/1-2/0", + "kind": "open-air-close", + "station": "section-2/4m-outside", + "camera": [ + 6.53817273275958, + -4.657210376135293, + -752.013 + ], + "target": [ + 8.159152142647708, + -8.31404312493838, + -752.013 + ], + "yaw": 156.09352823535562, + "pitch": 0.0, + "focus": [ + 9.43, + -11.181, + -749.743 + ], + "center_z": -749.743, + "open_air_section": 2, + "closeup_side": "outside", + "closeup_preferred_normal": [ + -0.40524485247203174, + 0.9142081872007717, + 0.0 + ], + "camera_target_distance_m": 4.0, + "route_distance_m": 104.362, + "requested_route_distance_m": 104.362, + "route_length_m": 114.99063175809309, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-1-2-0-openair-2-4m-outside.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-2-4m-outside.vfmesh", + "drawn_triangles": 584542, + "source_triangles": 637002, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 104.362, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.0, + "closeup_target_surface_distance_m": 0.5901774459243846, + "closeup_predicted_target_offset_m": 0.5901774459243846, + "closeup_wall_normal_alignment": 0.9891249705782158, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 6.359624549359488, + -5.416552010781576, + -752.0616659309658 + ], + "target_actual_m": [ + 8.5, + -8.79556763526633, + -752.0293187551489 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-2-4m-outside-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-2-4m-outside-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-2-4m-outside-quality.log" + ] + }, + { + "name": "passage-1-2-0-openair-2-4m-interior-wall", + "passage": "passage/1-2/0", + "kind": "open-air-close", + "station": "section-2/4m-interior-wall", + "camera": [ + 12.438590152225206, + -8.574465388721983, + -752.7261335058829 + ], + "target": [ + 8.55317187096847, + -9.20292810238377, + -752.013 + ], + "yaw": -99.18796190221158, + "pitch": 10.269787281460902, + "focus": [ + 9.43, + -11.181, + -749.743 + ], + "center_z": -749.743, + "open_air_section": 2, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + 0.40524485247203174, + -0.9142081872007717, + -0.0 + ], + "camera_target_distance_m": 3.9999999999999973, + "route_distance_m": 104.362, + "requested_route_distance_m": 104.362, + "route_length_m": 114.99063175809309, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-1-2-0-openair-2-4m-interior-wall.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-2-4m-interior-wall.vfmesh", + "drawn_triangles": 572258, + "source_triangles": 618646, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 104.362, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.000000000000001, + "closeup_target_surface_distance_m": 0.353159827911248, + "closeup_predicted_target_offset_m": 0.353159827911248, + "closeup_wall_normal_alignment": 0.9983988827266467, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 9.748104215680776, + -12.666965794821667, + -752.0265932958123 + ], + "target_actual_m": [ + 8.335827076712103, + -8.924626207433736, + -752.0074179101423 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-2-4m-interior-wall-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-2-4m-interior-wall-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-1-2-0-openair-2-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-1-4m-outside", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-1/4m-outside", + "camera": [ + -3.5840423774965293, + -5.521048309862215, + -815.8969999999999 + ], + "target": [ + -5.637732447498513, + -8.953592132798093, + -815.8969999999999 + ], + "yaw": -149.10792796365394, + "pitch": 0.0, + "focus": [ + -7.178, + -11.528, + -813.627 + ], + "center_z": -813.627, + "open_air_section": 1, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.5134225175004958, + 0.8581359557339694, + 0.0 + ], + "camera_target_distance_m": 4.0, + "route_distance_m": 16.616500000000002, + "requested_route_distance_m": 16.616500000000002, + "route_length_m": 494.0722798830563, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-2-3-0-openair-1-4m-outside.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-1-4m-outside.vfmesh", + "drawn_triangles": 104612, + "source_triangles": 129326, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 16.616500000000002, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.0000000000000036, + "closeup_target_surface_distance_m": 0.29188924025474844, + "closeup_predicted_target_offset_m": 0.29188924025474844, + "closeup_wall_normal_alignment": 0.6703275045296155, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -3.7918253987505834, + -7.16028175130118, + -813.227396563761 + ], + "target_actual_m": [ + -5.7833741859987065, + -9.093313475424294, + -816.1078690565205 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-1-4m-outside-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-1-4m-outside-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-1-4m-outside-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-1-4m-interior-wall", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-1/4m-interior-wall", + "camera": [ + -3.4141605326349946, + -12.659565888737353, + -816.5879167710818 + ], + "target": [ + -6.170971760123668, + -9.844849940114793, + -815.8969999999999 + ], + "yaw": -44.40454805561343, + "pitch": 9.946538162082001, + "focus": [ + -7.178, + -11.528, + -813.627 + ], + "center_z": -813.627, + "open_air_section": 1, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.5134225175004958, + -0.8581359557339694, + -0.0 + ], + "camera_target_distance_m": 4.000000000000005, + "route_distance_m": 16.616500000000002, + "requested_route_distance_m": 16.616500000000002, + "route_length_m": 494.0722798830563, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-2-3-0-openair-1-4m-interior-wall.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-1-4m-interior-wall.vfmesh", + "drawn_triangles": 94962, + "source_triangles": 118028, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": 16.616500000000002, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.0, + "closeup_target_surface_distance_m": 0.41920390486225767, + "closeup_predicted_target_offset_m": 0.41920390486225767, + "closeup_wall_normal_alignment": 0.740744136337711, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -7.998432705401559, + -11.833936581758076, + -818.2481168532394 + ], + "target_actual_m": [ + -5.94757062165508, + -9.608161331921629, + -815.6327986602337 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-1-4m-interior-wall-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-1-4m-interior-wall-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-1-4m-interior-wall-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-2-4m-outside", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-2/4m-outside", + "camera": [ + -4.5562890668466025, + 4.648574813628143, + -879.7479999999999 + ], + "target": [ + -7.40869531436283, + 7.452817777269203, + -879.7479999999999 + ], + "yaw": -45.487830534998494, + "pitch": 0.0, + "focus": [ + -9.548, + 9.556, + -877.478 + ], + "center_z": -877.478, + "open_air_section": 2, + "closeup_side": "outside", + "closeup_preferred_normal": [ + 0.7131015618790567, + -0.7010607409102652, + 0.0 + ], + "camera_target_distance_m": 4.000000000000001, + "route_distance_m": 374.929, + "requested_route_distance_m": 374.929, + "route_length_m": 494.0722798830563, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-2-3-0-openair-2-4m-outside.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-2-4m-outside.vfmesh", + "drawn_triangles": 475860, + "source_triangles": 504244, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 374.929, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.0, + "closeup_target_surface_distance_m": 1.7280841589725482, + "closeup_predicted_target_offset_m": 1.7280841589725482, + "closeup_wall_normal_alignment": 0.6707889779439669, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -7.47193274788199, + 5.182168353356822, + -879.6783722112204 + ], + "target_actual_m": [ + -7.306445568768645, + 9.17777802625833, + -879.7662205769708 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-2-4m-outside-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-2-4m-outside-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-2-4m-outside-quality.log" + ] + }, + { + "name": "passage-2-3-0-openair-2-4m-interior-wall", + "passage": "passage/2-3/0", + "kind": "open-air-close", + "station": "section-2/4m-interior-wall", + "camera": [ + -11.533986119377625, + 6.164550123765492, + -880.4395357921604 + ], + "target": [ + -8.149320771422074, + 8.180937668487475, + -879.7479999999999 + ], + "yaw": 59.215963829172296, + "pitch": 9.955540417812847, + "focus": [ + -9.548, + 9.556, + -877.478 + ], + "center_z": -877.478, + "open_air_section": 2, + "closeup_side": "interior-wall", + "closeup_preferred_normal": [ + -0.7131015618790567, + 0.7010607409102652, + -0.0 + ], + "camera_target_distance_m": 4.000000000000007, + "route_distance_m": 374.929, + "requested_route_distance_m": 374.929, + "route_length_m": 494.0722798830563, + "variant": "L119", + "capture": "captures/L119/L115/L115/passage-2-3-0-openair-2-4m-interior-wall.png", + "scene": "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-2-4m-interior-wall.vfmesh", + "drawn_triangles": 486480, + "source_triangles": 513552, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": 374.929, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": 4.0, + "closeup_target_surface_distance_m": 1.0286227628002445, + "closeup_predicted_target_offset_m": 1.0286227628002445, + "closeup_wall_normal_alignment": 0.720019406420326, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -8.257109087497915, + 13.208090205453457, + -879.7612149430302 + ], + "target_actual_m": [ + -8.149320771422074, + 9.209558486938477, + -879.75 + ], + "logs": [ + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-2-4m-interior-wall-mesh.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-2-4m-interior-wall-render.log", + "Saved/Linux/l119/captures/L115/L115/passage-2-3-0-openair-2-4m-interior-wall-quality.log" + ] + } + ] +} diff --git a/Standalone/Source/StreamBenchmarkPipeline.h b/Standalone/Source/StreamBenchmarkPipeline.h index 033b169..bf33342 100644 --- a/Standalone/Source/StreamBenchmarkPipeline.h +++ b/Standalone/Source/StreamBenchmarkPipeline.h @@ -3035,7 +3035,7 @@ namespace StandaloneStreamBenchmark const auto controls=passageSplineControls(passage); const auto floorProfile=passageSplineFloorProfile(passage); const auto segments=VoxelForgeCore::PassageSpline::BuildSegments( - controls,routeEnd,8.0,1.0,floorProfile,0.025); + controls,routeEnd,8.0,1.0,floorProfile,0.100); const auto consider=[&](double distance,double radius) { minimumRadius=std::min(minimumRadius,radius); @@ -3070,7 +3070,7 @@ namespace StandaloneStreamBenchmark const auto controls=passageSplineControls(passage); const auto floorProfile=passageSplineFloorProfile(passage); const auto segments=VoxelForgeCore::PassageSpline::BuildSegments( - controls,routeEnd,8.0,1.0,floorProfile,0.025); + controls,routeEnd,8.0,1.0,floorProfile,0.100); const auto effectiveCenterZ=[&](const auto& point,double plannedFloor) { return plannedFloor+passageTubeDepthAt(point[3],bodyDepth); @@ -3125,7 +3125,7 @@ namespace StandaloneStreamBenchmark const std::size_t routeEnd=std::clamp( passage.lowerMouthControlIndex,1,passage.controlPoints.size()-1); const auto segments=VoxelForgeCore::PassageSpline::BuildSegments( - controls,routeEnd,8.0,1.0,floorProfile,0.025); + controls,routeEnd,8.0,1.0,floorProfile,0.100); if(!segments.empty()) { blend.mouthX=segments.front().a[0]; @@ -3605,7 +3605,45 @@ namespace StandaloneStreamBenchmark } else ++audit.missingFloorSamples; } - if(i%4!=0)continue; + } + } + // Keep wall probe density tied to route distance, not to the number + // of adaptive spline segments. A coarser chord tolerance may leave + // long segments around a mouth; fixed stations still exercise the + // same wall geometry without weakening the coverage requirement. + for(std::size_t endpoint=0;endpoint<2;++endpoint) + { + for(double localDistance=0.0; + localDistance<=PassageMouthProfileReachMetres+1.0e-9; + localDistance+=1.0) + { + const double routeDistance=endpoint==0?localDistance + :lowerMouthDistance-localDistance; + if(routeDistance<0.0||routeDistance>lowerMouthDistance)continue; + const auto upper=std::lower_bound(path.begin(),path.end(),routeDistance, + [](const FProfilePose& pose,double value) + {return pose.distancedistance-a->distance; + const double t=span>1.0e-12 + ?std::clamp((routeDistance-a->distance)/span,0.0,1.0):0.0; + const double dx=b->x-a->x,dy=b->y-a->y; + const double tangentLength=std::hypot(dx,dy); + if(tangentLength<=1.0e-6) + { + audit.missingWallSamples+=2; + continue; + } + const double nx=-dy/tangentLength,ny=dx/tangentLength; + FProfilePose pose; + pose.distance=routeDistance; + pose.x=std::lerp(a->x,b->x,t); + pose.y=std::lerp(a->y,b->y,t); + pose.z=std::lerp(a->z,b->z,t); + pose.floorZ=std::lerp(a->floorZ,b->floorZ,t); + pose.radius=std::lerp(a->radius,b->radius,t); + pose.segmentIndex=t<0.5?a->segmentIndex:b->segmentIndex; for(std::size_t side=0;side<2;++side) { const double sign=side==0?-1.0:1.0; @@ -3613,10 +3651,12 @@ namespace StandaloneStreamBenchmark // above its floor. Probe at mid-wall height so this check // measures those walls instead of the absent roof-height // shell at the centreline. - const double radius=findWallRadius(pose,sign*nx,sign*ny,0.50); + const double radius=findWallRadius( + pose,sign*nx,sign*ny,0.50); if(std::isfinite(radius)) { - wallProfiles[endpoint][side].push_back({localDistance,radius}); + wallProfiles[endpoint][side].push_back( + {localDistance,radius}); ++audit.wallSamples; } else ++audit.missingWallSamples; diff --git a/Standalone/Source/StreamingWorld.h b/Standalone/Source/StreamingWorld.h index 2964e86..b4b8e02 100644 --- a/Standalone/Source/StreamingWorld.h +++ b/Standalone/Source/StreamingWorld.h @@ -1580,7 +1580,7 @@ private: static_cast(D.islandSharedCacheConflictReplacements), static_cast(D.islandSharedCacheLockWaitNanoseconds)/1000.0); if(D.passageComposerProfiled) - std::printf("[PassageComposerTile] key=(%d,%d,%d,lod%d) worker_ms=%.3f samples=%llu native_field_calls=%llu features=%llu route_candidates=%llu boundary_band_queries=%llu queries=%llu passage_iterations=%llu carve_segment_visits=%llu relief_field_calls=%llu sweep_segments=%llu sweep_pairs=%llu sweep_outside_pairs=%llu sweep_min_updates=%llu sweep_base_samples=%llu sweep_detail_samples=%llu sweep_grid_samples=%llu sweep_no_influence_samples=%llu sweep_lookups=%llu sweep_cache_hits=%llu sweep_base_hits=%llu sweep_outside_hits=%llu sweep_missing=%llu\n", + std::printf("[PassageComposerTile] key=(%d,%d,%d,lod%d) worker_ms=%.3f samples=%llu native_field_calls=%llu features=%llu route_candidates=%llu boundary_band_queries=%llu queries=%llu passage_iterations=%llu carve_segment_visits=%llu relief_field_calls=%llu sweep_segments=%llu sweep_pairs=%llu sweep_prepare_ms=%.3f sweep_outside_pairs=%llu sweep_shell_support_skips=%llu sweep_min_updates=%llu sweep_base_samples=%llu sweep_detail_samples=%llu sweep_grid_samples=%llu sweep_no_influence_samples=%llu sweep_lookups=%llu sweep_cache_hits=%llu sweep_base_hits=%llu sweep_outside_hits=%llu sweep_missing=%llu\n", Event.Key.Coord.X,Event.Key.Coord.Y,Event.Key.Coord.Z,Event.Key.Level, Event.WorkerMilliseconds,static_cast(Event.DensitySamples), static_cast(D.fieldCalls), @@ -1593,7 +1593,9 @@ private: static_cast(D.passageReliefFieldCalls), static_cast(D.passageSweepRouteSegmentCandidates), static_cast(D.passageSweepSegmentSamplePairs), + static_cast(D.passageSweepPrepareNanoseconds)/1.0e6, static_cast(D.passageSweepOutsideInfluencePairs), + static_cast(D.passageSweepShellSupportSkips), static_cast(D.passageSweepMinimumUpdates), static_cast(D.passageSweepBaseInfluenceSamples), static_cast(D.passageSweepDetailShellSamples), diff --git a/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v224.baseline b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v224.baseline new file mode 100644 index 0000000..0f40fff --- /dev/null +++ b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v224.baseline @@ -0,0 +1,12 @@ +[PipelineFullDetailHash] tiles=960 density=0x91931a57a067fd92 mesh=0xa818654be89790ac payload=0x370ff80451105a39 topology=0x06e507557aa70173 +[PipelineWholeViewHash] tiles=2370 density=0xa35a371ce6acca32 mesh=0x4543248df5bcd68e payload=0xc09831a7789624f4 topology=0x8a90dd2c5eb27f3e +[PipelineLODHash] lod=0 tiles=512 density=0x2fd4c78685a43cfe mesh=0x50478cff1c1f8ca0 payload=0x54e48e57e0af26de topology=0x860c011cfdb9833a +[PipelineLODHash] lod=1 tiles=448 density=0x4b8d9a6dcd2942ad mesh=0x17e89b7087bfe711 payload=0x2389c109eb780db6 topology=0x7eccd4cf560d0630 +[PipelineLODHash] lod=2 tiles=320 density=0x44883ae9ac5b1293 mesh=0x6060e05ca9ef6ee5 payload=0x8a24b5284ddf8940 topology=0xabd668b48ff3d62a +[PipelineLODHash] lod=3 tiles=208 density=0xc779dd70120f47e4 mesh=0x2bbe518f85284a47 payload=0x1ab3ba13eb39c252 topology=0x7004b6f87b54afe6 +[PipelineLODHash] lod=4 tiles=240 density=0xfb11591772a3d18e mesh=0xebf2baee8764591b payload=0xe491d7ac9c0061ad topology=0xd618ac33b95ce494 +[PipelineLODHash] lod=5 tiles=144 density=0x2f8b7b7fb1e67258 mesh=0x4cd508cbe97344fd payload=0x2b6e96a6050458c9 topology=0x4ff6d0eda8988573 +[PipelineLODHash] lod=6 tiles=96 density=0x0114a34c8b8d6113 mesh=0xb1fec4d01ae1fa44 payload=0x3e50cfd429b8e950 topology=0x08090c96d15c1618 +[PipelineLODHash] lod=7 tiles=96 density=0x3836ed8cfce73418 mesh=0x40bc6589c5fc1aac payload=0x677349bcae16790f topology=0x36e3aa53192e6a6b +[PipelineLODHash] lod=8 tiles=306 density=0x144f3c1fd722708b mesh=0xef77b28bf7fd9453 payload=0xe3f47b37fcd61489 topology=0x5a3c73e295494e04 +[PipelineExactQueryHash] probes=9 density=0x7b7c50ac24ccadcc unclamped=0x7b7c50ac24ccadcc detail=0xefcba20c0c70c415 collision=0xe604823a249029bf path=direct-Core-queries diff --git a/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v224.baseline b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v224.baseline new file mode 100644 index 0000000..93c412d --- /dev/null +++ b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v224.baseline @@ -0,0 +1,12 @@ +[PipelineFullDetailHash] tiles=960 density=0xace56c8f205238ad mesh=0xa9c603a1248de6b8 payload=0xea55f1f4fcc6a894 topology=0x5ea7bc78a1b678ae +[PipelineWholeViewHash] tiles=2370 density=0x836f4c7ea35fc78c mesh=0xbe6b16363b1d1886 payload=0x24746690daed16a8 topology=0xc52f31c52006cec9 +[PipelineLODHash] lod=0 tiles=512 density=0xcd6ab28cfa504aca mesh=0xf03dc80a669fca31 payload=0x397aded1c3d2d297 topology=0xb4a1dc84fabc1fe3 +[PipelineLODHash] lod=1 tiles=448 density=0xce6e713828b2a20a mesh=0x1cf408c25d67d18c payload=0x8a2b5d20571c997e topology=0x51cd985fe8e7d100 +[PipelineLODHash] lod=2 tiles=320 density=0xf80a6131d2a43307 mesh=0xecb91b4a6429d557 payload=0x9dcb563bac3f2a0a topology=0xac65521b9bea7f7c +[PipelineLODHash] lod=3 tiles=208 density=0x651a069b131bcff3 mesh=0x85886d10f751fe19 payload=0x818c568d0aaae4e3 topology=0x572fe40864ac6710 +[PipelineLODHash] lod=4 tiles=240 density=0x0be8798407724eaf mesh=0x131c303cbbe51434 payload=0x2a90ecf0a2411ca0 topology=0xe3e054a371152e08 +[PipelineLODHash] lod=5 tiles=144 density=0xf20897ad272103a9 mesh=0x13d00b6253ae1f72 payload=0x0db3880693a962fa topology=0x462bd87a80f15e89 +[PipelineLODHash] lod=6 tiles=96 density=0xc040fcac457d6313 mesh=0x1ed132eeb718fb62 payload=0xcd0214e35577c6e3 topology=0x2c56c69e6fdcfd64 +[PipelineLODHash] lod=7 tiles=96 density=0xc2d419446355fdb8 mesh=0x4ea44452574fc84b payload=0xfd9779bedfc9ae0f topology=0x8948546e770c9b72 +[PipelineLODHash] lod=8 tiles=306 density=0x62db31696f2da831 mesh=0xd373f9e9481532fe payload=0x540a60526e0e3e46 topology=0xc725cb901e6dc335 +[PipelineExactQueryHash] probes=9 density=0xc949c4df2ce6f9d9 unclamped=0xc949c4df2ce6f9d9 detail=0x114c501e2d830d94 collision=0xe6011d3a248d4849 path=direct-Core-queries diff --git a/Standalone/Tools/verify/verify.py b/Standalone/Tools/verify/verify.py index 7721d26..c752dbf 100644 --- a/Standalone/Tools/verify/verify.py +++ b/Standalone/Tools/verify/verify.py @@ -122,11 +122,11 @@ RECIPE_RE = re.compile( def owner_hash_baseline(recipe: str, style: int) -> tuple[Path, str]: if recipe == "surface-world" and style == 1: - return (BASELINES / "owner-hash/canonical/owner-hash-surface-world-style1-v223.baseline", - "L115-v223-continuous-arc-length-floor-profile") + return (BASELINES / "owner-hash/canonical/owner-hash-surface-world-style1-v224.baseline", + "L119-v224-adaptive-half-pipe") if recipe == "floating-islands" and style == 2: - return (BASELINES / "owner-hash/canonical/owner-hash-floating-islands-style2-v223.baseline", - "L115-v223-continuous-arc-length-floor-profile") + return (BASELINES / "owner-hash/canonical/owner-hash-floating-islands-style2-v224.baseline", + "L119-v224-adaptive-half-pipe") raise VerificationFailure(f"no pinned owner hash baseline for {recipe} style {style}")