From c091e4434f27fa6e17c6f3049da6bcf6d0f22978 Mon Sep 17 00:00:00 2001 From: Fr0zka Date: Sat, 24 Oct 2026 12:54:39 +0200 Subject: [PATCH] fix(core): smooth tunnel entrance floor; verifier keeps baselines out of /tmp (L47); research R14 The demo tunnel's hard floor cap used a vertical Z - floorZ on a sloped Bezier floor, which is not a signed distance, so marching cubes produced a staircase through the first 7 m (40-51 mm ripple, 82 mm steps). The cap now uses the grade-normalised signed distance with a floor-adjacent bore re-application fading over the entrance; mesh tile Z bounds include cavern bounds. New three-rail entrance audit: L46 fails, L47 passes. verify: the cost baseline exports only build inputs into Saved/Linux//baseline- and removes it; /tmp unchanged after a full tier. Demo off: owner hashes identical to L46. fast/medium/full PASS. Known: sawtooth at the tunnel wall foot (next round). Research R14: Windows/MSVC readiness review. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1 --- Standalone/Core/src/ShapeWorldInternal.h | 56 ++- Standalone/Core/src/VoxelForgeCore.cpp | 24 ++ .../Linux47/CaptureLandmarkL47.py | 401 ++++++++++++++++++ .../Linux47/MeasureEntranceL47.py | 208 +++++++++ .../WorldAssemblerM3/Linux47/REPORT.md | 38 ++ .../Linux47/captures/entrance-floor-low.jpg | Bin 0 -> 36420 bytes .../Linux47/captures/entrance-looking-in.jpg | Bin 0 -> 40146 bytes .../Linux47/captures/ground-entrance.jpg | Bin 0 -> 40959 bytes .../Linux47/captures/inside-to-dais.jpg | Bin 0 -> 34020 bytes .../overview-entrance-and-chamber.jpg | Bin 0 -> 59046 bytes .../WorldAssemblerM3/Research14/REPORT.md | 31 ++ Standalone/Source/StreamBenchmarkPipeline.h | 70 ++- Standalone/Tools/verify/verify.py | 38 +- 13 files changed, 839 insertions(+), 27 deletions(-) create mode 100644 Standalone/Research/WorldAssemblerM3/Linux47/CaptureLandmarkL47.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux47/MeasureEntranceL47.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux47/REPORT.md create mode 100644 Standalone/Research/WorldAssemblerM3/Linux47/captures/entrance-floor-low.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux47/captures/entrance-looking-in.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux47/captures/ground-entrance.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux47/captures/inside-to-dais.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux47/captures/overview-entrance-and-chamber.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Research14/REPORT.md diff --git a/Standalone/Core/src/ShapeWorldInternal.h b/Standalone/Core/src/ShapeWorldInternal.h index 60a4ba3..a2b706d 100644 --- a/Standalone/Core/src/ShapeWorldInternal.h +++ b/Standalone/Core/src/ShapeWorldInternal.h @@ -5973,6 +5973,10 @@ private: } const float centerX=bezier(t,0),centerY=bezier(t,1); const float floorZ=bezier(t,2); + const float floorHorizontalSpeed=std::hypot(derivative(t,0),derivative(t,1)); + const float floorGrade=floorHorizontalSpeed>1.0e-5f + ?derivative(t,2)/floorHorizontalSpeed:0.0f; + const float floorDistanceScale=1.0f/std::sqrt(1.0f+floorGrade*floorGrade); const float radial=std::hypot(X-centerX,Y-centerY); const float radius=feature.boreRadiusVoxels; const float vertical=(Z-floorZ)/feature.boreHeightVoxels; @@ -6000,11 +6004,12 @@ private: return; } composed=SmoothMaxDistance(composed,-distance,feature.smoothWidthVoxels); - // The hard profile cap is deliberately applied after the smooth union and - // relief. Below it, native rock remains untouched; the narrow support above - // fills only baseline air. + // Apply a signed distance to the sloped floor plane. The old vertical + // height field made Marching Cubes quantize the shallow ramp into terraces. + // Below it, native rock remains untouched; the narrow support above fills + // only baseline air. if(radial<=radius) - composed=std::min(composed,Z-floorZ); + composed=std::min(composed,(Z-floorZ)*floorDistanceScale); }; if(scoped) for(const auto index:tileQueries->cavernFeatureCandidates())apply(index); @@ -6097,12 +6102,17 @@ private: t=std::clamp(t-(dx*vx+dy*vy)/denominator,0.0f,1.0f); } const float floorZ=bezier(t,2); + const float floorHorizontalSpeed=std::hypot(derivative(t,0),derivative(t,1)); + const float floorGrade=floorHorizontalSpeed>1.0e-5f + ?derivative(t,2)/floorHorizontalSpeed:0.0f; + const float floorDistanceScale=1.0f/std::sqrt(1.0f+floorGrade*floorGrade); const float radial=std::hypot(X-bezier(t,0),Y-bezier(t,1)); - if(Z0.0f&&feature.floorSupportDepthVoxels>0.0f &&Z>=floorZ-feature.floorSupportDepthVoxels &&radial0.0f) + { + const float fade=SmoothUnit((Z-floorZ)/0.8f); + tunnelDistance+=StampValueNoise( + X-feature.controlPointsVoxels[0][0], + Y-feature.controlPointsVoxels[0][1],Z-floorZ, + feature.irregularityWavelengthVoxels,feature.irregularitySeed) + *feature.irregularityAmplitudeVoxels*fade; + } + // Reapply the tunnel SDF in the floor-adjacent strip. Keep a narrow + // correction along the ramp, with a wider fade only at the stamped mouth. + const float heightAboveFloor=Z-floorZ; + const float mouthFade=1.0f-SmoothUnit(t/0.10f); + const float recarveWeight=heightAboveFloor<=0.25f?1.0f:mouthFade; + if(recarveWeight>0.0f) + { + const float recarved=SmoothMaxDistance(capped,-tunnelDistance, + feature.smoothWidthVoxels); + capped=std::lerp(capped,recarved,recarveWeight); + } + } if(radial<=feature.boreRadiusVoxels) - capped=std::min(capped,Z-floorZ); + capped=std::min(capped,floorDistance); }; if(scoped) for(const auto index:tileQueries->cavernFeatureCandidates())apply(index); diff --git a/Standalone/Core/src/VoxelForgeCore.cpp b/Standalone/Core/src/VoxelForgeCore.cpp index 43a6af5..a01386e 100644 --- a/Standalone/Core/src/VoxelForgeCore.cpp +++ b/Standalone/Core/src/VoxelForgeCore.cpp @@ -2294,6 +2294,30 @@ namespace VoxelForgeCore RelevantMinimum=std::min(RelevantMinimum,MinimumZ); RelevantMaximum=std::max(RelevantMaximum,MaximumZ); } + const auto includeCavernBounds=[&](const auto& Feature) + { + const double MinimumX=Feature.boundsMinimumMicrometres[0] + *MicronsToVoxels; + const double MaximumX=Feature.boundsMaximumMicrometres[0] + *MicronsToVoxels; + const double MinimumY=Feature.boundsMinimumMicrometres[1] + *MicronsToVoxels; + const double MaximumY=Feature.boundsMaximumMicrometres[1] + *MicronsToVoxels; + if(MaximumXTileMaximumX + ||MaximumYTileMaximumY)return; + const double MinimumZ=Feature.boundsMinimumMicrometres[2] + *MicronsToVoxels; + const double MaximumZ=Feature.boundsMaximumMicrometres[2] + *MicronsToVoxels; + if(MaximumZTileMaximumZ)return; + RelevantMinimum=std::min(RelevantMinimum,MinimumZ); + RelevantMaximum=std::max(RelevantMaximum,MaximumZ); + }; + for(const auto& Room:impl_->resolvedLayout->cavernRooms) + includeCavernBounds(Room); + for(const auto& Edge:impl_->resolvedLayout->cavernEdges) + includeCavernBounds(Edge); } if(std::isfinite(RelevantMinimum)&&std::isfinite(RelevantMaximum)) { diff --git a/Standalone/Research/WorldAssemblerM3/Linux47/CaptureLandmarkL47.py b/Standalone/Research/WorldAssemblerM3/Linux47/CaptureLandmarkL47.py new file mode 100644 index 0000000..524e6d8 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux47/CaptureLandmarkL47.py @@ -0,0 +1,401 @@ +#!/usr/bin/env python3 +"""Capture L47 cavern entrance views and audit the exported floor profile.""" +from __future__ import annotations + +import argparse +import importlib.util +import json +import math +import os +from pathlib import Path +import subprocess +import sys +import time + + +ROOT = Path(__file__).resolve().parents[4] +VERIFY = ROOT / "Standalone/Tools/verify" +LINUX37 = ROOT / "Standalone/Research/WorldAssemblerM3/Linux37" +sys.path.insert(0, str(VERIFY)) +from runner import bounded_run, current_stamp, first_stamp + + +def load_module(name: str, path: Path): + spec = importlib.util.spec_from_file_location(name, path) + if spec is None or spec.loader is None: + raise RuntimeError(f"cannot import {path}") + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +PROFILE = load_module("l45_ring_profile", ROOT / + "Standalone/Research/WorldAssemblerM3/Linux32/AuditRingTerraceL32.py") +SHAPE = load_module("l45_shape_audit", LINUX37 / "AuditMouthShapeL37.py") + +PARSER = argparse.ArgumentParser(description=__doc__) +PARSER.add_argument("--layout", type=Path, required=True) +PARSER.add_argument("--artifact-dir", type=Path, required=True) +PARSER.add_argument("--capture-dir", type=Path, required=True) +PARSER.add_argument("--data", type=Path, default=ROOT / "Standalone/data/owner_world.json") +OPTIONS = PARSER.parse_args() + +ARTIFACT_DIR = OPTIONS.artifact_dir.resolve() +CAPTURE_DIR = OPTIONS.capture_dir.resolve() +LAYOUT_PATH = OPTIONS.layout.resolve() +ARTIFACT_DIR.mkdir(parents=True, exist_ok=True) +CAPTURE_DIR.mkdir(parents=True, exist_ok=True) +PNG_DIR = ARTIFACT_DIR / "capture-png" +PNG_DIR.mkdir(parents=True, exist_ok=True) +HEADLESS = Path(os.environ["VOXELFORGE_L37_HEADLESS"]) +RENDERER = Path(os.environ["VOXELFORGE_L37_RENDERER"]) +EXPECTED_STAMP = current_stamp() + + +def run_logged(name: str, command: list[str], *, capture: bool = False) -> str: + log = ARTIFACT_DIR / f"{name}.log" + started = time.monotonic() + with log.open("w", encoding="utf-8") as stream: + result = bounded_run(command, timeout=1800, stdout=stream) + elapsed = time.monotonic() - started + output = log.read_text(encoding="utf-8", errors="replace") + if result is None: + raise RuntimeError(f"{name} timed out; see {log}") + print(f"[L47CaptureRun] step={name} elapsed={elapsed:.1f}s " + f"exit={result.returncode} log={log}", flush=True) + if result.returncode != 0: + raise RuntimeError(f"{name} failed; see {log}") + if capture and (first_stamp(output) != EXPECTED_STAMP + or first_stamp(bounded_run( + [str(command[0]), "--print-source-stamp"], timeout=15).stdout or "") + != EXPECTED_STAMP): + raise RuntimeError(f"{name} executable source stamp mismatch") + return output + + +def stamp_by_id(layout: dict, stable_id: str) -> dict: + for stamp in layout.get("stamps", []): + if stamp.get("stable_id") == stable_id: + return stamp + raise RuntimeError(f"missing stamp {stable_id}") + + +def metres(stamp: dict, key: str = "position_um") -> tuple[float, float, float]: + return tuple(value / 1_000_000.0 for value in stamp[key]) + + +def camera_angles(camera, target): + dx, dy, dz = (target[index] - camera[index] for index in range(3)) + return (math.degrees(math.atan2(dx, dy)), + math.degrees(math.atan2(dz, math.hypot(dx, dy)))) + + +def fmt(values) -> str: + return ",".join(f"{value:.6f}" for value in values) + + +def camera_spec(camera, target): + yaw, pitch = camera_angles(camera, target) + return (*camera, yaw, pitch) + + +def edge_point(edge: dict, t: float) -> tuple[float, float, float]: + points = edge["control_points_um"] + one = 1.0 - t + weights = (one ** 3, 3 * one ** 2 * t, 3 * one * t ** 2, t ** 3) + return tuple(sum(weights[index] * points[index][axis] + for index in range(4)) / 1_000_000.0 + for axis in range(3)) + + +def cavern_features(layout: dict): + if (layout.get("cavern_graph_vocabulary_version") != 1 + or len(layout.get("cavern_rooms", [])) != 1 + or len(layout.get("cavern_edges", [])) != 1): + raise RuntimeError("L47 capture needs one resolved cavern room and edge") + room = layout["cavern_rooms"][0] + edge = layout["cavern_edges"][0] + return room, edge + + +layout = json.loads(LAYOUT_PATH.read_text(encoding="utf-8")) +room, edge = cavern_features(layout) +portal_stamp = stamp_by_id(layout, "landmark/sw-arrival-chamber-mouth-approach-v1") +floor_stamp = stamp_by_id(layout, "landmark/sw-arrival-chamber-v1-floor") +dais_stamp = stamp_by_id(layout, "landmark/sw-arrival-chamber-v1-dais") +entrance = edge_point(edge, 0.0) +next_ramp = edge_point(edge, 0.08) +portal = metres(portal_stamp) +chamber = metres(room, "center_um") +floor = metres(floor_stamp) +floor_top = floor[2] + floor_stamp["half_extents_um"][2] / 1_000_000.0 +dais = metres(dais_stamp) +dais_top = dais[2] + dais_stamp["half_extents_um"][2] / 1_000_000.0 +ground_z = entrance[2] +direction_length = math.hypot(next_ramp[0] - entrance[0], next_ramp[1] - entrance[1]) +direction = ((next_ramp[0] - entrance[0]) / direction_length, + (next_ramp[1] - entrance[1]) / direction_length) +outward_length = math.hypot(entrance[0] - chamber[0], entrance[1] - chamber[1]) +outward = ((entrance[0] - chamber[0]) / outward_length, + (entrance[1] - chamber[1]) / outward_length) +mouth_normal = (-direction[1], direction[0]) + +mesh = ARTIFACT_DIR / "landmark-l47.vfmesh" +export_anchor = edge_point(edge, 0.25) +export_camera = (export_anchor[0], export_anchor[1], export_anchor[2] + 1.4) +export_target_floor = edge_point(edge, 0.42) +export_target = (export_target_floor[0], export_target_floor[1], + export_target_floor[2] + 1.2) +run_logged("landmark-export", [str(HEADLESS), str(OPTIONS.data), "--workers=12", + "--world-assembler-prototype", "--stream-benchmark", "--stream-pipeline", + "--force-generate", "--clip-radius=4", "--max-clip-level=0", "--max-level=0", + "--render-distance-chunks=0", "--recipe=surface-world", "--landmark-chamber-demo", + f"--camera={fmt(camera_spec(export_camera, export_target))}", + f"--mesh-export={mesh}", f"--resolved-layout-output={LAYOUT_PATH}"], capture=True) +layout = json.loads(LAYOUT_PATH.read_text(encoding="utf-8")) +room, edge = cavern_features(layout) +portal_stamp = stamp_by_id(layout, "landmark/sw-arrival-chamber-mouth-approach-v1") +floor_stamp = stamp_by_id(layout, "landmark/sw-arrival-chamber-v1-floor") +dais_stamp = stamp_by_id(layout, "landmark/sw-arrival-chamber-v1-dais") +entrance = edge_point(edge, 0.0) +next_ramp = edge_point(edge, 0.08) +portal = metres(portal_stamp) +chamber = metres(room, "center_um") +floor = metres(floor_stamp) +floor_top = floor[2] + floor_stamp["half_extents_um"][2] / 1_000_000.0 +dais = metres(dais_stamp) +dais_top = dais[2] + dais_stamp["half_extents_um"][2] / 1_000_000.0 +ground_z = entrance[2] +direction_length = math.hypot(next_ramp[0] - entrance[0], next_ramp[1] - entrance[1]) +direction = ((next_ramp[0] - entrance[0]) / direction_length, + (next_ramp[1] - entrance[1]) / direction_length) +outward_length = math.hypot(entrance[0] - chamber[0], entrance[1] - chamber[1]) +outward = ((entrance[0] - chamber[0]) / outward_length, + (entrance[1] - chamber[1]) / outward_length) +if not mesh.is_file() or mesh.stat().st_size == 0: + raise RuntimeError(f"missing mesh export {mesh}") + +entrance_audit = ROOT / "Standalone/Research/WorldAssemblerM3/Linux47/MeasureEntranceL47.py" +run_logged("entrance-floor-control-l46", [sys.executable, str(entrance_audit), + "--mesh", str(ROOT / "Saved/Linux/l46/landmark-l46.vfmesh"), + "--layout", str(ROOT / "Saved/Linux/l46/layouts/landmark-reachability-clang.json"), + "--out", str(ARTIFACT_DIR / "entrance-profile-control-l46.json"), "--expect=fail"]) +run_logged("entrance-floor-audit", [sys.executable, str(entrance_audit), + "--mesh", str(mesh), "--layout", str(LAYOUT_PATH), + "--out", str(ARTIFACT_DIR / "entrance-profile-l47.json"), "--expect=pass"]) + +voxel_um, triangles, tile_count = PROFILE.read_scene(str(mesh), 0, + floor_top - 8.0, entrance[2] + 9.0, + (min(entrance[0], chamber[0]) - 20.0, max(entrance[0], chamber[0]) + 20.0, + min(entrance[1], chamber[1]) - 20.0, max(entrance[1], chamber[1]) + 20.0)) +bounds = (min(entrance[0], chamber[0]) - 20.0, max(entrance[0], chamber[0]) + 20.0, + min(entrance[1], chamber[1]) - 20.0, max(entrance[1], chamber[1]) + 20.0) +buckets = PROFILE.build_buckets(triangles, True, bounds, cell_size=1.0) +ground_candidates = [] +for ix in range(-20, 21): + for iy in range(-20, 21): + x, y = portal[0] + ix * 0.5, portal[1] + iy * 0.5 + dx, dy = x - portal[0], y - portal[1] + distance = math.hypot(dx, dy) + if not 6.0 <= distance <= 10.0: + continue + hit = PROFILE.sample_surface(buckets, x, y, True, 1.0, + preferred_height=ground_z) + if hit is None or abs(hit[0] - ground_z) > 3.0 or hit[1][2] < 0.85: + continue + alignment = max(-1.0, min(1.0, + (dx * mouth_normal[0] + dy * mouth_normal[1]) / distance)) + angle = math.acos(alignment) + score = abs(distance - 7.0) + angle * 4.0 + ground_candidates.append((score, x, y, hit[0])) +if not ground_candidates: + raise RuntimeError("no walkable mesh ground lies 6 to 10 m from the cave mouth") +_, ground_x, ground_y, outside_ground = min(ground_candidates) +inside_floor = PROFILE.sample_surface(buckets, chamber[0], chamber[1], True, 1.0, + preferred_height=floor_top) +if inside_floor is None or abs(inside_floor[0] - floor_top) > 1.5: + raise RuntimeError(f"chamber floor mesh hit {inside_floor} does not match designed floor {floor_top:.3f} m") +floor_top = inside_floor[0] + +ground_camera = (ground_x, ground_y, outside_ground + 1.6) +entry_ground = PROFILE.sample_surface(buckets, entrance[0], entrance[1], True, 1.0, + preferred_height=ground_z) +if entry_ground is None: + raise RuntimeError("cave mouth has no walkable ground surface in the exported mesh") +entry_camera = (entrance[0] + mouth_normal[0] * 3.8, + entrance[1] + mouth_normal[1] * 3.8, ground_z + 1.6) +entry_target_floor = edge_point(edge, 0.30) +entry_target = (entry_target_floor[0], entry_target_floor[1], entry_target_floor[2] + 1.4) +low_camera = (entrance[0] + outward[0] * 1.0, + entrance[1] + outward[1] * 1.0, ground_z + 0.65) +low_target_floor = edge_point(edge, 0.24) +low_target = (low_target_floor[0], low_target_floor[1], low_target_floor[2] + 0.15) +to_dais = (dais[0] - chamber[0], dais[1] - chamber[1]) +to_dais_length = math.hypot(*to_dais) +opposite_dais = (-to_dais[0] / to_dais_length, -to_dais[1] / to_dais_length) +inside_x = chamber[0] +inside_y = chamber[1] +inside_floor = PROFILE.sample_surface(buckets, inside_x, inside_y, True, 1.0, + preferred_height=floor_top) +inside_eye_z = inside_floor[0] + 1.6 +chamber_camera = (chamber[0] + opposite_dais[0] * 5.5, + chamber[1] + opposite_dais[1] * 5.5, inside_eye_z) +chamber_target = (dais[0], dais[1], dais_top - 0.25) +overview_camera = (entrance[0] + outward[0] * 18.0, + entrance[1] + outward[1] * 18.0, outside_ground + 15.0) +overview_target = ((entrance[0] + chamber[0]) * 0.5, + (entrance[1] + chamber[1]) * 0.5, + (ground_z + floor_top) * 0.5) +inward = (-outward[0], -outward[1]) +clip_point = (entrance[0] + outward[0] * 0.5, + entrance[1] + outward[1] * 0.5) +overview_clip = (inward[0], inward[1], 0.0, + -(inward[0] * clip_point[0] + inward[1] * clip_point[1])) + +views = ( + ("ground-entrance", ground_camera, (portal[0], portal[1], portal[2]), + (portal[0], portal[1], ground_z, 20.0), -509.0), + ("entrance-looking-in", entry_camera, entry_target, (entrance[0], entrance[1], entrance[2], 16.0), -507.0), + ("entrance-floor-low", low_camera, low_target, + (entrance[0], entrance[1], entrance[2], 12.0), ground_z), + ("inside-to-dais", chamber_camera, chamber_target, + (chamber[0], chamber[1], chamber[2], 15.0), chamber[2]), + ("overview-entrance-and-chamber", overview_camera, overview_target, + ((entrance[0] + chamber[0]) * 0.5, + (entrance[1] + chamber[1]) * 0.5, + (ground_z + floor_top) * 0.5, 34.0), -509.0), +) + +for name, camera, target, focus, height_center in views: + png = PNG_DIR / f"{name}.png" + jpg = CAPTURE_DIR / f"{name}.jpg" + yaw, pitch = camera_angles(camera, target) + fov = (80.0 if name == "overview-entrance-and-chamber" else + 70.0 if name in ("inside-to-dais", "entrance-looking-in") else + 58.0 if name == "entrance-floor-low" else 65.0 + if name == "ground-entrance" else 60.0) + if name == "ground-entrance": + fov = 55.0 + print(f"[L47CaptureCamera] view={name} camera_m=({fmt(camera)}) " + f"target_m=({fmt(target)}) yaw_deg={yaw:.3f} pitch_deg={pitch:.3f} " + f"fov_deg={fov:.1f} entrance_distance_m={math.dist(camera, portal):.3f}", flush=True) + render = [str(RENDERER), str(mesh), str(png), "--size=1600x900", f"--fov-deg={fov:.1f}", + f"--camera-m={fmt(camera)}", f"--yaw-deg={yaw:.6f}", f"--pitch-deg={pitch:.6f}", + "--shade=readable", "--headlamp=on", "--height-tint=on", + "--light-direction=0.3,-0.4,0.85", + f"--height-center-m={(floor_top if name == 'inside-to-dais' else height_center):.6f}", + f"--height-range-m={4 if name == 'inside-to-dais' else 6 if name == 'entrance-floor-low' else 16}", + "--tile-skirts=off", "--tile-edges=off", + f"--focus-region={fmt(focus)}"] + if name == "overview-entrance-and-chamber": + render.append(f"--clip-plane={fmt(overview_clip)}") + run_logged(f"{name}-render", render, capture=True) + for quality in (4, 6, 8): + run_logged(f"{name}-jpeg-q{quality}", ["ffmpeg", "-nostdin", "-hide_banner", + "-loglevel", "error", "-y", "-i", str(png), "-frames:v", "1", + "-q:v", str(quality), str(jpg)]) + if jpg.is_file() and 0 < jpg.stat().st_size <= 300_000: + break + if not jpg.is_file() or not 0 < jpg.stat().st_size <= 300_000: + raise RuntimeError(f"{jpg.name} exceeds the 300 KB capture limit") + quality_log = run_logged(f"{name}-quality", [sys.executable, + str(VERIFY / "capture_quality.py"), str(jpg)]) + print(f"[L47CaptureJPEG] file={jpg} bytes={jpg.stat().st_size} " + f"quality_log={quality_log.strip().replace(chr(10), ' ')} status=PASS", flush=True) + + +def region_triangles(center, radius_xy, z_min, z_max): + selected = [] + for triangle in triangles: + points = tuple(vertex[0] for vertex in triangle[2]) + centroid = tuple(sum(point[axis] for point in points) / 3.0 for axis in range(3)) + if (math.hypot(centroid[0] - center[0], centroid[1] - center[1]) <= radius_xy + and z_min <= centroid[2] <= z_max): + selected.append(triangle) + return selected + + +def tunnel_wall_triangles(edge, t, height_above_floor): + center = edge_point(edge, t) + before = edge_point(edge, max(0.0, t - 0.01)) + after = edge_point(edge, min(1.0, t + 0.01)) + tx, ty = after[0] - before[0], after[1] - before[1] + tangent_length = math.hypot(tx, ty) + tx, ty = tx / tangent_length, ty / tangent_length + expected_radius = edge["bore_radius_um"] / 1_000_000.0 * math.sqrt( + 1.0 - (height_above_floor / (edge["bore_height_um"] / 1_000_000.0)) ** 2) + selected = [] + for triangle in triangles: + points = tuple(vertex[0] for vertex in triangle[2]) + centroid = tuple(sum(point[axis] for point in points) / 3.0 for axis in range(3)) + dx, dy = centroid[0] - center[0], centroid[1] - center[1] + longitudinal = dx * tx + dy * ty + lateral = abs(-dy * tx + dx * ty) + vertical = centroid[2] - center[2] + if (abs(longitudinal) <= 1.5 + and abs(lateral - expected_radius) <= 0.7 + and abs(vertical - height_above_floor) <= 0.75): + selected.append(triangle) + print(f"[L47TunnelWallWindow] t={t:.3f} center_m=({center[0]:.3f}," + f"{center[1]:.3f},{center[2]:.3f}) expected_radius_m={expected_radius:.3f} " + f"longitudinal_half_width_m=1.500 vertical_half_width_m=0.750 " + f"triangles={len(selected)}", flush=True) + return selected + + +def audit_shape(name, region, center): + metrics = SHAPE.analyze_triangles(region, center[:2], center[2], + crop_to_center=False, include_sides=True) + passed = (metrics["triangles"] > 0 + and metrics["planar_area"] < SHAPE.PLANE_LIMIT_M2 + and metrics["straight"] <= SHAPE.STRAIGHT_LIMIT_M + and metrics["corners"] == 0) + print(f"[LandmarkBuiltShape] region={name} triangles={metrics['triangles']} " + f"planar_patch_m2={metrics['planar_area']:.4f} " + f"straight_run_m={metrics['straight']:.4f} sharp_corners={metrics['corners']} " + f"corner_turn_max_deg={metrics['corner_turn_max']:.2f} " + f"thresholds=({SHAPE.PLANE_LIMIT_M2:.2f}m2,{SHAPE.STRAIGHT_LIMIT_M:.2f}m," + f"{SHAPE.CORNER_TURN_LIMIT_DEG:.0f}deg) status={'PASS' if passed else 'FAIL'}", + flush=True) + if not passed: + raise RuntimeError(f"L37 built-shape thresholds failed in {name}") + return metrics + + +entrance_metrics = audit_shape("cave-mouth", region_triangles( + portal, 5.0, ground_z + 0.8, ground_z + 4.5), + (portal[0], portal[1], ground_z)) +tunnel_mid = edge_point(edge, 0.64) +tunnel_metrics = audit_shape("tunnel-wall-edge", tunnel_wall_triangles( + edge, 0.64, 1.2), + (tunnel_mid[0], tunnel_mid[1], tunnel_mid[2] + 1.2)) +dais_surface = PROFILE.sample_surface(buckets, dais[0], dais[1], True, 1.0, + preferred_height=dais_top - 0.4) +if dais_surface is None: + raise RuntimeError("dais stamp has no upward-facing surface in the exported mesh") +dais_rise = dais_surface[0] - floor_top +print(f"[LandmarkDaisSurface] center_m=({dais[0]:.3f},{dais[1]:.3f}) " + f"floor_z_m={floor_top:.3f} top_z_m={dais_surface[0]:.3f} " + f"rise_m={dais_rise:.3f} minimum_m=1.000 " + f"status={'PASS' if dais_rise >= 1.0 else 'FAIL'}", flush=True) +if dais_rise < 1.0: + raise RuntimeError(f"dais rises only {dais_rise:.3f} m above the chamber floor") +dais_metrics = audit_shape("dais-platform", region_triangles( + dais, 1.7, floor_top + 0.6, dais_top + 0.4), + (dais[0], dais[1], dais_surface[0])) +metrics_path = ARTIFACT_DIR / "landmark-shape-metrics.json" +metrics_path.write_text(json.dumps({ + "graph_vocabulary_version": layout["cavern_graph_vocabulary_version"], + "entry_m": entrance, "portal_m": portal, "entry_ground_m": ground_z, + "chamber_center_m": chamber, "chamber_floor_m": floor_top, + "tunnel_midpoint_m": tunnel_mid, + "dais_center_m": dais, "dais_top_m": dais_top, + "dais_surface_m": dais_surface[0], "dais_rise_m": dais_rise, + "l37_thresholds": {"planar_patch_m2_lt": SHAPE.PLANE_LIMIT_M2, + "straight_run_m_lte": SHAPE.STRAIGHT_LIMIT_M, + "corner_turn_deg_lt": SHAPE.CORNER_TURN_LIMIT_DEG}, + "entrance_arch": entrance_metrics, "tunnel_wall": tunnel_metrics, + "dais_platform": dais_metrics, + "mesh_tiles": tile_count, "mesh_voxel_um": voxel_um, +}, indent=2) + "\n", encoding="utf-8") +print(f"[L47CaptureShapeMetrics] file={metrics_path} status=PASS", flush=True) diff --git a/Standalone/Research/WorldAssemblerM3/Linux47/MeasureEntranceL47.py b/Standalone/Research/WorldAssemblerM3/Linux47/MeasureEntranceL47.py new file mode 100644 index 0000000..3620116 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux47/MeasureEntranceL47.py @@ -0,0 +1,208 @@ +#!/usr/bin/env python3 +"""Measure the L46 entrance floor from open terrain through its first ten metres.""" +from __future__ import annotations + +import importlib.util +import argparse +import json +import math +from pathlib import Path +import sys + + +ROOT = Path(__file__).resolve().parents[4] +PROFILE_PATH = ROOT / "Standalone/Research/WorldAssemblerM3/Linux32/AuditRingTerraceL32.py" +spec = importlib.util.spec_from_file_location("ring_profile", PROFILE_PATH) +if spec is None or spec.loader is None: + raise RuntimeError(f"cannot load {PROFILE_PATH}") +PROFILE = importlib.util.module_from_spec(spec) +spec.loader.exec_module(PROFILE) + +ARTIFACTS = ROOT / "Saved/Linux/l47" +PARSER = argparse.ArgumentParser(description=__doc__) +PARSER.add_argument("--layout", type=Path, + default=ROOT / "Saved/Linux/l46/layouts/landmark-reachability-clang.json") +PARSER.add_argument("--mesh", type=Path, + default=ROOT / "Saved/Linux/l46/landmark-l46.vfmesh") +PARSER.add_argument("--out", type=Path, default=ARTIFACTS / "entrance-profile-before.json") +PARSER.add_argument("--expect", choices=("pass", "fail", "measure"), default="measure") +PARSER.add_argument("--lod", default="0", help="LOD level, or 'all' to include every exported level") +OPTIONS = PARSER.parse_args() +LAYOUT = OPTIONS.layout.resolve() +MESH = OPTIONS.mesh.resolve() +OUT = OPTIONS.out.resolve() + +layout = json.loads(LAYOUT.read_text(encoding="utf-8")) +edge = layout["cavern_edges"][0] +controls = [[value / 1_000_000.0 for value in point] + for point in edge["control_points_um"]] + + +def bezier(t: float) -> tuple[float, float, float]: + u = 1.0 - t + weights = (u ** 3, 3.0 * u * u * t, 3.0 * u * t * t, t ** 3) + return tuple(sum(weights[i] * controls[i][axis] for i in range(4)) + for axis in range(3)) + + +route = [bezier(i / 4096.0) for i in range(4097)] +arc = [0.0] +for a, b in zip(route, route[1:]): + arc.append(arc[-1] + math.hypot(b[0] - a[0], b[1] - a[1])) + + +def route_at(distance: float) -> tuple[float, float, float]: + if distance < 0.0: + start = route[0] + dx = route[1][0] - start[0] + dy = route[1][1] - start[1] + dz = route[1][2] - start[2] + horizontal = math.hypot(dx, dy) + scale = distance / (arc[1] - arc[0]) + return start[0] + dx * scale, start[1] + dy * scale, start[2] + dz * scale + index = min(len(arc) - 2, max(0, next( + (i for i, value in enumerate(arc) if value >= distance), len(arc) - 1) - 1)) + span = arc[index + 1] - arc[index] + t = 0.0 if span <= 0.0 else (distance - arc[index]) / span + return tuple(route[index][axis] + (route[index + 1][axis] - route[index][axis]) * t + for axis in range(3)) + + +entry = route[0] +tangent = route[1] +tx, ty = tangent[0] - entry[0], tangent[1] - entry[1] +length = math.hypot(tx, ty) +tx, ty = tx / length, ty / length +nx, ny = -ty, tx +requested_lod = None if OPTIONS.lod == "all" else int(OPTIONS.lod) +voxel_um, triangles, tile_count = PROFILE.read_scene( + str(MESH), requested_lod, entry[2] - 7.0, entry[2] + 5.0, + (entry[0] - 14.0, entry[0] + 14.0, entry[1] - 14.0, entry[1] + 14.0)) +buckets = PROFILE.build_buckets( + triangles, True, + (entry[0] - 14.0, entry[0] + 14.0, entry[1] - 14.0, entry[1] + 14.0), + cell_size=1.0) +down_buckets = PROFILE.build_buckets( + triangles, False, + (entry[0] - 14.0, entry[0] + 14.0, entry[1] - 14.0, entry[1] + 14.0), + cell_size=1.0) +mesh_points = [vertex[0] for triangle in triangles for vertex in triangle[2]] +print(f"[EntranceProfileGeometry] entry_m=({entry[0]:.3f},{entry[1]:.3f},{entry[2]:.3f}) " + f"point10_m=({route_at(10.0)[0]:.3f},{route_at(10.0)[1]:.3f}," + f"{route_at(10.0)[2]:.3f}) mesh_xy=({min(p[0] for p in mesh_points):.3f}," + f"{max(p[0] for p in mesh_points):.3f},{min(p[1] for p in mesh_points):.3f}," + f"{max(p[1] for p in mesh_points):.3f}) mesh_z=({min(p[2] for p in mesh_points):.3f}," + f"{max(p[2] for p in mesh_points):.3f})") +for sample_distance in range(11): + sx, sy, expected = route_at(float(sample_distance)) + bucket = buckets.get((math.floor(sx), math.floor(sy)), ()) + hit = PROFILE.sample_surface(buckets, sx, sy, True, 1.0, + preferred_height=expected) + down_hit = PROFILE.sample_surface(down_buckets, sx, sy, False, 1.0, + preferred_height=expected) + print(f"[EntranceProfileBucket] distance_m={sample_distance:.1f} " + f"xy_m=({sx:.3f},{sy:.3f}) triangles={len(bucket)} " + f"hit_z_m={None if hit is None else round(hit[0], 4)} " + f"down_hit_z_m={None if down_hit is None else round(down_hit[0], 4)} " + f"expected_z_m={expected:.4f}") + +rows = [] +for rail, lateral in (("left", -1.5), ("center", 0.0), ("right", 1.5)): + distance = -5.0 + while distance <= 10.000001: + x, y, expected = route_at(distance) + x += nx * lateral + y += ny * lateral + hit = PROFILE.sample_surface(buckets, x, y, True, 1.0, + preferred_height=expected) + rows.append({ + "rail": rail, + "distance_m": round(distance, 3), + "x_m": x, + "y_m": y, + "expected_floor_m": expected, + "surface_z_m": None if hit is None else hit[0], + "normal_z": None if hit is None else hit[1][2], + "residual_m": None if hit is None else hit[0] - expected, + }) + distance += 0.125 + +results = {} +for rail in ("left", "center", "right"): + profile = [row for row in rows if row["rail"] == rail and row["surface_z_m"] is not None + and 0.0 <= row["distance_m"] <= 10.0] + jumps = [] + for previous, current in zip(profile, profile[1:]): + expected_delta = current["expected_floor_m"] - previous["expected_floor_m"] + residual_delta = current["residual_m"] - previous["residual_m"] + if abs(residual_delta) >= 0.025: + jumps.append({"from_m": previous["distance_m"], "to_m": current["distance_m"], + "delta_m": current["surface_z_m"] - previous["surface_z_m"], + "residual_delta_m": residual_delta, + "expected_delta_m": expected_delta}) + residuals = [row["residual_m"] for row in profile] + ripple_residuals = [] + for row in profile: + nearby = [other["residual_m"] for other in profile + if abs(other["distance_m"] - row["distance_m"]) <= 1.0] + ripple_residuals.append((row["distance_m"], row["residual_m"] + - sum(nearby) / max(1, len(nearby)))) + amplitude, period = 0.0, 0.0 + for candidate in (0.375 + index * 0.125 for index in range(30)): + cosine = sum(value * math.cos(2.0 * math.pi * distance / candidate) + for distance, value in ripple_residuals) + sine = sum(value * math.sin(2.0 * math.pi * distance / candidate) + for distance, value in ripple_residuals) + current_amplitude = 2.0 * math.hypot(cosine, sine) / max(1, len(ripple_residuals)) + if current_amplitude > amplitude: + amplitude, period = current_amplitude, candidate + step_error = max((abs(item["residual_delta_m"]) for item in jumps), default=0.0) + coverage = len(profile) / 81.0 + rail_passed = (coverage >= 0.85 and amplitude <= 0.015 and step_error <= 0.05) + results[rail] = { + "coverage": coverage, + "max_adjacent_step_m": max((abs(item["delta_m"]) for item in jumps), default=0.0), + "max_step_residual_m": step_error, + "ripple_amplitude_m": amplitude, + "ripple_period_m": period, + "passed": rail_passed, + "jumps_over_0_04m": jumps, + "residual_peak_to_peak_m": max(residuals) - min(residuals) if residuals else None, + } + +payload = { + "layout": str(LAYOUT.relative_to(ROOT)), + "mesh": str(MESH.relative_to(ROOT)), + "voxel_um": voxel_um, + "selected_tiles": tile_count, + "sample_spacing_m": 0.125, + "distance_range_m": [-5.0, 10.0], + "lateral_offsets_m": {"left": -1.5, "center": 0.0, "right": 1.5}, + "rails": results, + "samples": rows, +} +all_passed = all(result["passed"] for result in results.values()) +expected_ok = (OPTIONS.expect == "measure" + or (OPTIONS.expect == "pass" and all_passed) + or (OPTIONS.expect == "fail" and not all_passed)) +OUT.write_text(json.dumps(payload, indent=2) + "\n", encoding="utf-8") +print(f"[EntranceProfileBefore] voxel_um={voxel_um} tiles={tile_count} " + f"lod={OPTIONS.lod} spacing_m=0.125 distance_m=-5.000..10.000 status=MEASURED") +for rail, summary in results.items(): + print(f"[EntranceFloorRailAudit] rail={rail} coverage={summary['coverage']:.3f} " + f"ripple_amplitude_m={summary['ripple_amplitude_m']:.4f} " + f"ripple_period_m={summary['ripple_period_m']:.3f} " + f"max_step_residual_m={summary['max_step_residual_m']:.4f} " + f"status={'PASS' if summary['passed'] else 'FAIL'}") + for jump in summary["jumps_over_0_04m"]: + print(f"[EntranceProfileJump] rail={rail} from_m={jump['from_m']:.3f} " + f"to_m={jump['to_m']:.3f} delta_m={jump['delta_m']:+.4f} " + f"expected_delta_m={jump['expected_delta_m']:+.4f} " + f"residual_delta_m={jump['residual_delta_m']:+.4f}") +failed_rails = sum(not result["passed"] for result in results.values()) +print(f"[EntranceFloorMeshAudit] samples_per_rail=81 distance_m=0.000..10.000 " + f"rails=3 failed_rails={failed_rails} observed={'PASS' if all_passed else 'FAIL'} " + f"expected={OPTIONS.expect.upper()} status={'PASS' if expected_ok else 'FAIL'}") +print(f"[EntranceProfileJSON] file={OUT} status={'PASS' if expected_ok else 'FAIL'}") +if not expected_ok: + raise SystemExit(1) diff --git a/Standalone/Research/WorldAssemblerM3/Linux47/REPORT.md b/Standalone/Research/WorldAssemblerM3/Linux47/REPORT.md new file mode 100644 index 0000000..22905ae --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux47/REPORT.md @@ -0,0 +1,38 @@ +# Linux47 report + +## Entrance floor + +The L46 mesh has a repeating staircase through the first 7 m: 39.9–51.4 mm ripple and 81.8–82.9 mm largest residual step. The cause was the final hard floor cap, applied after the mouth and terrain stamps, using vertical `Z-floorZ` on a sloped Bezier floor. That field is not a signed distance to the ramp, so Marching Cubes interpolated a distorted gradient; stamp fill beside the cap made the ridges visible. Voxel height quantisation was not the main cause. + +The cap now uses the grade-normalised signed distance. The tunnel SDF is reapplied in a floor-adjacent band, with the wider correction fading over the first 10% of the entrance; the narrow floor correction continues along the ramp. This removes the ridges without changing the tunnel wall profile. Mesh tile Z bounds now include resolved cavern bounds too; without that, the exported ramp lost triangles past about 6.6 m. + +The mesh audit samples 0–10 m at 0.125 m on three rails (−1.5, 0, +1.5 m), requiring ≥85% coverage, ≤15 mm ripple and ≤50 mm adjacent residual step. L46 fails all rails: coverage 0.63–0.68, ripple 39.9–51.4 mm, step 81.8–82.9 mm. L47 passes all rails: 100% coverage, ripple 0.4–1.2 mm, no measured residual step. The Core audit also passes 243 samples with 0.3 mm maximum step and 0.0 mm reported ripple. Buried L43 and segmented-ramp L45 controls still fail as expected. + +## Verifier, hashes and cost + +The cost baseline now exports only Core, Source, Compat, and the build/helper scripts to `Saved/Linux/l47/baseline-e016f6a20fcfac785c9870b3d1133fd5df47a6d4`; an exit handler removes the export. It does not copy the repository to `/tmp`. `/tmp` was **28K before** and **28K after** the full tier; the saved top-level-entry comparison is identical and the baseline export was removed. + +Source stamp / source manifest: `68328b0c2a154e261eba94a067eb7d879f37ef987a54758275b4d14e3e9746d3`. Demo-off owner hashes match L46 exactly for both recipes, with W1=W12. Whole-view hashes (density/mesh/payload/topology): floating-islands `598e9daaa1744ccb / 3114e0f4f6dbf734 / c49c4e48bff74089 / cadd4edd10d4d8ef`; surface-world `7dc75e2c09302258 / 0cb34c40ceec4ce3 / 9d23e8c46b515cf1 / 2962c9464991eedd`. Demo-on determinism passed 30/30 cells. + +Five-pair median cost: floating-islands 16.390→16.435 s (+0.27%); surface-world 1.722→1.717 s (−0.29%). The baseline build took 40.2 s. + +## Tiers, captures and failed runs + +Fast **PASS** (195.9 s), medium **PASS** (567.8 s), full **PASS** (1606.5 s); zero failed checks. All used source stamp above. Final captures: [ground entrance](captures/ground-entrance.jpg), [looking in](captures/entrance-looking-in.jpg), [overview](captures/overview-entrance-and-chamber.jpg), [inside to dais](captures/inside-to-dais.jpg), and [low entrance floor](captures/entrance-floor-low.jpg). + +Exploration failures: the first entrance gate caught a 171 mm step; stamp-only re-carving restored about 40 mm ripple and a 100 mm step; full-width re-carving failed the wall-shape check at t=0.58. The final mouth-local fade passed the wall check at t=0.64. The first fast invocation also stopped because the executable had not yet been built; the rebuilt fast tier passed. L46/L43/L45 negative controls are intentional failures and passed their expected-fail checks. Work stayed within the 15-trial budget. + +## Orchestrator review (Claude) + +Accepted, with one new defect logged. The stamp matches the final Clang and GCC builds (`68328b0c…`); demo-off hashes +are identical to L46; `/tmp` is unchanged after the full tier (1.8 MB used). The entrance floor is smooth now, and +the cause, a vertical cap distance on a sloped floor, was measured before the fix. + +**New defect:** a row of **jagged sawtooth teeth along the wall foot,** where the floor-adjacent band correction meets +the bore wall. It shows in `entrance-looking-in.jpg` and along the edge in the overview. The three floor rails (−1.5, +0, +1.5 m) don't reach the 2.6 m wall foot. **This is the third time** a fix has moved an artifact to where the +audit isn't looking (L46 inside-only, L47 rails only). L48 adds a whole-surface artifact audit. + +R14: no likely MSVC or UHT blocker. The Unreal adapter does not resolve stamps or cavern graphs, so the L43–L47 demos +are standalone-only until the adapter supplies those records. The legacy chunk callers agree with the micrometre +layout only at the default 8 m width. diff --git a/Standalone/Research/WorldAssemblerM3/Linux47/captures/entrance-floor-low.jpg b/Standalone/Research/WorldAssemblerM3/Linux47/captures/entrance-floor-low.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b0467bba4e1b2b1d8698b7484b036d87a7b8e028 GIT binary patch literal 36420 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

4JGD^hsfg7O-^9*hptPM#PlVO2XZie1Ate0EA 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 literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux47/captures/entrance-looking-in.jpg b/Standalone/Research/WorldAssemblerM3/Linux47/captures/entrance-looking-in.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25b81834158f19037c56b28cd31fc8c416d4589e GIT binary patch literal 40146 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
W{uhi@cCbj_5C~ben>{3)L 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 GxBU-%^UdP` literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux47/captures/ground-entrance.jpg b/Standalone/Research/WorldAssemblerM3/Linux47/captures/ground-entrance.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98be83bee6046c5e0d73b4e7303974396d15ff5c GIT binary patch literal 40959 zcmd3O2S8KF_V)#G#R>sYq$;c;ARr(h9hIW=UV^{^0)~$C&RXbYRiqaMA+&&$(2Gk| zs&q&w0#ZVi-r<`B-M6o<@B6=f&qOCPXU>#6_jk`ZbLL$3`}X%Ba(P21V}5Qt6F0uW%7l&4Rhrlvl7 zmX3~|iHUW;7Ak^>AmT$rL`2YUAL2uYNr-+pLJEk4&u4CZ`@2?{_lh3FzcjSHU41cb%Xms|- z!>&)y9=*;_GO4~bHY&*nBXmc6^9vh+xDNhc0m6__yns zel;3N`uwcJcyW|>|1AU~J@ohoi9xseH8w0%;F!7 z;q#A(|B&__sdt;?-FtiTJ69dNvl8DY`qHfnI>yG84)SlV(t2z~bH8=^hZpeQAd-LU zAU}|}HAH_wLjxtNQuN$d&E)PpfG4Jv>zo62va6L+=N6|(&4)jA z4*#liCZF^Fs`__z-;emrms<_r$=KnXs%=GaZ>fk2oNfx=k~P_AOB!nx)nc%14!gSY zyNUm|vw@J$Hx2py7)|^_HoaP7d$aLhl)QG^;&btO-I}FGWR2$xC+XjQ)Ajs0OeEjb z?RTV%ayz|Bs~Fes;i~iu!nX73y@R9oc!n6mslAk&$gaY4=4if)PUw;DcH>mjUM!D;x z(4twX+eX7;SyzU$a~eL&nlyTzYg>HL5XZ?F&I6RupRhpxUYFxRn1!^&idQyTPa6ZLDlVxTMF2=S?D}D!5SC zvH!;M{Hrnk{vhKYaepTZc%?mfT5TzLM7KlQ(YW-Ix7nN-SG^~t{o-BMhD>cQ`LzFm zpA(#?ef|EUmHTJ3??kHu3%)9_bDVl}AL`3b3i}nY9Ou!#Jy2x!_|n34-~i#UT8fzZ z^rt8xaAfhf-+#7P{|5a#K`Ku?ojk(RDLSlF+{ja4+5))d-R=sAbG~j{iu9}m!jp@d z_Fr8U38emSeg9Qo|FOF7WRqlCP^G2xKIg5Uf?zu^>YJJ(1y>{TcT%Q8Ri>i84;4@0 zPjuH`mz;^MB=k7nb(#8fA~vZ%*g1VCi+gWNyt{2&>DOahtXtk^=WGWiyLuLG6#`q- zX-jv^fBHWLrhmVqQy+gkGWEYVgE|ASt? z6T|<9wmX*QW389OZD!SwR*|UU&r!2W;DpKCXw`ktz-u76LW1p^iA;p(Ix$7 z>H)4BY@tzYNa_ldhWr_(QthHHb?f-mv_Ri8Bg*8}&7`Cwrc{S-9XGyM}rFw_n55{3a2~V7neWV4}>y=m^GZUv35xn8Hr*r9Kc`C5krg&Imw$M(m=NA0XAY( z=32%vr1@@!Kgttinb2!Fn6yU*=DR4KlO9}{&dV8B%PejOB9A*|Fs19FRj5>3GW;`o ztkk766S`r_O81#wCVY^(A^I}#q5BOglC_6yN9Rb?DKVsJECmPE`S-u@=bI<7p<^{* z8YoO!V7hg;oRoSIAf=Q6(uj4pq=q)Wf6X&<>QWj{@I=Gk5l8Sf|8Amx#!#6G0DuT& zRH(itzmY)3nu-W?t4w7GGQa1>^Fa9OU$mY?sULRHeIkL+kX+3_=92^P#YU|I&~r5( z0zmr-zzzTn-^Gb5Z}GqaK=jukCr&0WJP#mtrk3r{)8m;chozZeFW~EY)MqXnHD9HP zwy@Ai^L=$O+9L4$9|8^fPK;g%`f@_WHfkIFAn}eysNHn%=Owb+_$xT>@X9*)$Jbfp z`N!9i*wQgo;O^q_#VqTTgUQP4#G{ItgAb3eCIvj&cmU=KGnmpaRTlC|c;t0n#-p&n z|1ze`{N-gr2O)s(5NHWd#}66?CjU_uX+D?XgHQZ3z_4k7zm*BZ-zAym1pM2k9VnL6n z5eTON5dwMW*3pl@qkjPvsi6oPF#y(=8ZZpCjt_tw1km;~Oc{*Jl>8(LlD=?H;vvA+ z1!WjO8HC5%Vd)DF>Hun)W~YPS9m`Z5C|z%oF;L@Wr-S=To2r}Zl;+Lw3QnpIH6ugc^ z0{`8myOTZo{^JafAB0IgJa)8$_x#Ctw!&)}&9BkNPgbzybY@aKd-Eotdr{?uhOREH z226d<0O&Qvp8D>4nw35EJ<&H%=v?$`DGMt+JqPX8EvZ@Ay$v_P=X;{1EC7G14gz0z z8WE0XdVwc>Vb!430t!+E?F1C2uolq6D)!J$Hh-&0jjdW{0cMJ`tmOdEo|`$WOf=uN~~xm&RK??={73HMP?ve*io6H#elV zxL;tX?%dJVwn1okz0eMic%=(>)I(~TTr||I)2dTBtU+afR@QLWveH!1AmB{8ds_nr z-^PQ705BDN9&tdqfd`?)Z+HY41o-NCO7%BwQ~&{s$Fm*)qjYzl`VD+?SXj$YLJe&V zogQ(bB2pv(>mUO_e_*l!g}>7v!2^wm3P9^Tu(1f>(Wm^X zUV$P#FvXOP`2aBnl&*^k)d?0KDWFOLHbsbmTm#nFR{=+WtTKQRs0U^v(8EBC0TdIo zXeM5j{!Sq39P|Qq4+P|q*a9Jl7l1(A9Sc1piHBTY8c?~FY-yyLnUg@r#??vNA?fE% zT3NFPMXL#Jieh&$9wHxM>Oc|^l5-l@bwTZ45+H}b zKH#h10i^>F;4?rJ0lVFl2tW&<3IOFmA5x9*9SA2DpTjOn&@mvoK$(CSbtxdCfc}#M zIH7oZ{tJo-h8iA0m+@3QEJ)J~uMpt$5I_oa@YP}iqKqKy0B{M??f1eC*ku5S2ORl8 z{+U7mZbU$ay(MT)f($$6d!|kj?|;!yh6QE^`m=FsbOuV_lT-&*Ta%2g7F(A@bE6QZ z|GxQMe`|mwjcGlU`;}XFE@!W4AgD+h@QweV1+A0utpbiHv0GWXY+#N(0DDq`ir2BMxv z+CA%gdnfO^Bxrru)~np9$nD#hnf3m> z-XV^hsp`1z-9N0dw72eDMs{x>dcQn;YtD9|2}>UqDwg8CX?Le0H6hu&ledtgQwl}Z zMv6|>e~R#*i$d9tlcjC8k0Fs{^Lt?lYrDwh?W)Z2oMcDwrOC|f;gda6=4j&d@`^Vzu8r-MKuW!tHYw|KYr|er4wIAV`YGmp4vzX+vLCqh@!XYrLMR!o#!3f;+ z5SL}^b;az6`0GxsR&>mMXG=bX(V}^`k|(+QdAXQ7#m+upUTHJ1yj3eIv&=ih*jxq9 zEt^Db#0M>R^=Hc%%xsDVw>%dyOS8zngq*$XnW`3a)teQ;%`$I&#yR?Ij!pMOY5n&` z{X?;XVY<^rmQ#E)Mdv1J?>kLSEl(;ro6(mv6rtN2xM1iok+ICM>ORMi_~t74)z2H9 zBvcILr>JGtE)j+f z(brz}T6ipyots}GpxtIb76h$rRgSLiiuo31XBWOGadSemcB&bqb$54-6e-<9bQp1n z7VYS|n{r1xxiZ%qhSy3eof{LBH-^#gjK9Yvo(z|4ZhkOT5}h!wM7}b}Sjte;W0^?y zE@j*cL|v(_f<`sJbnyKOvM z0!sT3mr#(Zhm2kd((-c%2fKxqHFGd#tvxDk(zkzW$j^_9o}OBMtHr6f!fu2Gc{%KM zWkaih!an3Dz8kq0xwo_~<~{7)yF0v79%hE|7GK+kw3-tY|5Cq2mbgB=x(_*nk!btZ z65DpGx|h#(?n5KswH%XuC}kfiuY5GQyT0o^xDPeeuX!Su_aU2Ak6-5j&q5}6cjv=C z^tyK+%CCIXuwLfbzsbJf3bU(lmR^J-5RNeJ_$_!Bc&NQkEKf@J zuYJzGzE%;&DaK{$+B`Nxxx+ExoOrT?9wzo2tHiJ(DpQ(J*3rS`^+>aww`eOpwIV+t z;o67Fl%(sPtikTQbUb5!Ji)q?6xSMlqxvU&FYfRA}OVJ5HB90_+o9oW(RrWAp53s_&&a$k0b znFMR+7#rvi>JrdLm*U{oi7f8@fG zV(2FR)ZsC(++U_iX#p*GlP#|&L>#3SRUTJR$6S$|?(x1Q?eQ%wH4X*2ted}HN$)O$ zuQg}!kp?cX&9SAi6}&=F9oCGzC`tF%ckf@9{(pCpM~YXxACx9kA-lS#QC>kJ*AP}B z)21A>Iq68m>pHub9^Nz2@qMDZ@X7z)>L>K%qwNC z#G+E*jt(Kq@$AN`?E3Eu7TsO#%gy}6^oKC6@k^gK$C}pN zoSZ}+O^eNM$0l3HI990La$I$4O$f$nDQ@uvFIF~nE*fxeT;jd$-*zr4Om1>vBfVSK zzA5f=>`Jk%JAb)|#w6XQ3|W3oDh9BUB#W z{p{}%Ke$t5KFwabtxsncmzo@lvzi?%a`bSY$^AT^lRWK4uhTy5kdy4vHd1cPP03xF z-*4VrJK7zcHTJmbmZK+`LN87+Of5yhT+#dF*!AduknRKwhRN(qR$a2l#ns# zx$BLDP1ea|*PUOjSm}A{$8g14%8bQeBekRBW1O&O16z%SQHXeS^8}-X$YM1YYnn$$ z%g(wHGuy~u=W=9I!?{*-reT?rSxytCLY_lmzpOIMx(zGbMsIQG1jJW$EAY+5$uDMy zLiBTC-iz z*>?R|k$X#Rw3`iPdm>zyyw2icHkB-THqR!zCw5OeVm)P~x8O7mA#z4tQQgsn>?vnE z%fXGS9Im4Z8yTe7!s6yPvW&_4xp_r|Ts)=?m-XqZ$im0BN0SqC-p{+{OoYAMGux?B z+tb0(?@hW-uN(J$9Q$PDDYiN1WbDwszIAwuUU6GI#>{QNiBWg`O0QHAg6LSx%T5nHre|FPaQ;4-M8t*f*Aq^^4H; zHCfnjx-?XKwv;cVZliGevB~KvH2RnLY;>`8(g{U0Qc1i7g>G_uXE zqnN4vgKu?LP;a1S-HbWux%*X@i^oUSmZqXs_R8s_ILMrK*=3TEa$X7XQVuvzp=paw zMa-h^(0Wt|yrVFi!`&*zDrzqD%1pt+yrNpT$@M`6sb11-ttC7AkT_;~K5xOywNeo+ zt$D`R784F;1}X8+sR9k6k!7J==F@cxqPa2kDMm)uja(`+yTgJ9LmeZt)VGV>6SNY! zPCi~L_uPlhzIrkvIny@{+@wQ!ABv3*s-glwNDeXr-W59QjNU zjl=G^7IsR3uGZ9TsU*{BYjD$9XLw$B;vPx%Rl_l~?YcVizo|wtoNfQmv$N>$qB2eQLz|LbPej`d`SG~u z7DKyx*BoLo>NS*Cnv}cvuQ_1hw$HCL)+qOPB+XqnRr$$4`(xf4|BMN|L*}9nRWqYqKL~c5v(X>;4FBkt$u^#1rgmr z!xMyxucj2<(+ONrUpN22<#6Dh0^UzB4Bo{0JHmkz0|Lj?U%l+$oac*A{RD?U3Gi~( zNs=(p!c-35WSdBRt@W6d{P4o***W7?PCjxT{Y?va6L~Txrp3Kah01&|$HG*T=3=<1 za`b6fK{A5qG)5)jXL1LkxBuES`s-Rkgu%UCt`4DL?e2K7NF}Gi@+OQ?shb_5-UhKT zX=U%~AE#+6IBz|MJ{!K}{BDTaq=XN)OWp8cS9d@`F*0@10bVq1gOpvqW~Dux&KA77UV$W^TD01D*TmMyOgk<*RFNgBvtb@oZ&N8O%qYUpK7Is^tEgMmN2Yf4 z48KbDly9DzQB1Ls{fyAR4CD6c&U@%n&us8*)za;Q!>T^m?tc zUNlT*UL0jHBjs3t>*#!pRo#kli{piH!x8$+{I$)sikMbze!ukbrn)&v+vrC34CB#d zAV#d-Cy0nSGyXc3=+VBe_F<*efJ~Gj;kBZGxdCquBBb24o!iaK+O*UjZkJdS5ShL> zS!>;@m0>*IK07|=I;_a=G|H}IgZ?ZqfUbDIa#BxNwL)~o)GkCp)JmtqPH=>#s0+#P zzQyeE=h1Dl=L}qKEOAPWM&eK8Cd7g_JkvupmP_`yd@HL^`w-_YKgKD9Av3eHYorhp zhl0y62&Oo!q`H_gFV?e!+0TgGa~W6&z25AREgoEHKP-0kR6x_9cs1jBPoaHiX=qVS zK~%c1lEqRtHKxZZ6lNh^F_FuQ<<>QBG*I{$MnCMg?k)54?6%V6y0=!dfh5j*d{|Ft z%ZnuqmzkV6!y=7|=*EuUt_-n=o^5U$nX4TmbFYgGsYWUa8c21!r;NGfel9UM7l_NO zdNgU%P9rwI#ifL#0Xw#5MkQd!rlz@LhTpNRCk&k{7`-lY1ii@O?qs?;-pw~3O2$52 z-!mXH7M8ci)w=M3UZ%A2Nw+?im!E7t4D1stpV&nw@O`L^H+9)%4PO83SybOpYh&Cb zIFr7C9T$t6oomB|W-}g{TpzTV*Ln$$$Z{xr-7GIPlao`L&%KiQn~_^v+4M;!aA+$h zLzt0!1z9ua>^_P9jO@ejdtZAi^?JW<$M1T}COqdSofzKF{buNHjLqpW7FRy+aHPZ9 zyT#OMnMRcNSey+qwXxPioDB%cJzZe6rCVgmy)w+sb+#meuZA(s*>TXVoa|MYZ_T+% z-lfR*=~H{@nX*IiM|9kVn7Yw!o)((jQO)rD18167h$rhHHk2|!e2&a_(bbh;(q-&a z?}}_M_-rh^0XeQNhYA6$+enq)3x3VbieAC$ zPQ%D+GZ-(`AYv9}WXfwHugP0)@XAx5!;S1t3a))hOPcQzhnGMFikmtZtJ+h@+<$kJ z_j)MLwxC%k%vD}ejMF`OUNgOP9};5Zr88qq3-Xk|+CWy%x@fT-zwkpmhwGFTw|1=J zpx$vT?A#7tY8Iw*9A4YJCMmYDl{;E!wz`eXT}%{zHyGBr5Zc@6WmA>xmi>ameTCkN z^>!@02e+CD?_mZL>x9AROwDq)q}Gj{tzD#D_MrkX%1@iF4R~8PYo~ZudiT)sLhv?M zQ&{`3;TBkfmj`RGLgqIyzv~M4*D85uT;07D#ol?ybcpt^a=`;CL)cSNU{O82!wT%J zxa>i}K)8)yKx)n$R zb;tA;BU@|CL|gANSGtNNveW{H$?jK&N$^5P&udK<-VL*OA?iA8v5h&;v-P6F17T{t(+K^1rJDOPv_pK? za$NoQj!AKO*Vzb5_XW2xyx-Gcpq_&b(69 z7zY$9yaVlzvd{+qVgCO9BQRJs6NSFVtzTyRUp^C*B57}ga!>eh+&Z5YBY0S{y^$?R z(S%CImg#3d$LyegrRO0)LWP_d?(c)p`8 zrLOzL-M-&4DMQ#oQ+V&SlRQ%f%q4oZCRXDXE- z;X2PO~y)^odqp4|Jc(M zBr?~9E-g%o z8XQS*%H@ypAB$9JHrwS@y83?0S?OAqS<(9jL1V!pd3Zf-shh%mu~(@h>E{zZ{BkAZn1Hb09jRL3CD~M2`fR48X`a0!$qrkUauO(2esX z^d#ht$}mR>d=`+D$!`;p{7gcDucA;Vp-`bB`5F8>An2)+r~=#RnU608u!npuJbnXg zueTsTjEIWl4QW~m@JE4D8dAe6Y+xmh`Gisc*U&#Vla!7=`;il?GE}r`Zc3hTUncPtl=0J4LNdlx_f(rW~ z+rKuG{z=JmuD6+CL@^>XB6Lqb{@P|_Val2&d*#}eRv{BFVh!Wc*c}}`$;(%hSwg|Y z{LJT&%xr5={l>hMh+<3JkYIzUU3^*YhVz)$a7~=8jlhH%QmQquqtfw^%wI z1k!g_O{rnP%*n8g+bj^Ohw~H}|Y>eV<98IHlP8d;I)0C$I5iJf98qVXqW)j1M<`w6-$u zm(_fYfP1_`qccrd;RBhj4I3M=w3_X#@SWe~2Vz|thL`wl3j<_(KPkn5offn4@%!N! zf|Qet-tYRVF&EjQJ}iV)ebReUAgf^~C$p`I$_os|x_TVVATC#m96&2m%_XvKM%aPy zKR7-{tU2Qt2-V48%D@z{`DYYX&t{xQT5^6&V?+H?^f2jIp@z+239USE)OZ0T7-Es) zJIb)}YK!}%4?5M4)QQdpyG?>;`}sbUn~EILPpXhXITmHfOPWh3(wRAhup_PCCs3NV z3Ma~ZdD^p^HHX9^=SCOj_w2hrE4(kC-1*eKf-zII8m|^B9KNB4_TStq%uhJ+DJq*w zsZ+*CPvGA5dvXQj!%ysaPq5$a^F{I-Mx?7$QM6B99lX|(r*hx8q**|L*D_*?kjb?S z-MDWbhfVFXS@8Aa^Tnm=ZjZcbG08CRClDgiQ+3Nml3Pql&D+Z=Y3|n3rWESNjwCl5 zmLei1HW2pb%wtSSDrrRO5gF>%*1nP45jYi4#xt6flma?DHM($Oioj@!jeV8UY?6V9 z{lck=bq55)QuQw!FJi4tK~q8#LnNLvV(53j(qJ+kG;xIbPPM2e^-hjdBsaLcg6;{P zZZ>}SKo2}cy2c=;NjU2O-8FhJg?R zI6(R(D6|OgQ@2zHo3~0fCbr_tqOQO-Hf3Sn)A!BIPu8A5re{VxnSXk+ou{d&%N$e3 zmN$-i!T{)trjYck_Y{w$AL_ZSWIgS;kL{+t^5yp9l*Z?s8j<@+Vef+h~W zP5V#%=KUtARh&Z#FTgWFmp-o#o}T0vqD?*Rtm;e1k_X_Ssnl|-1C<`&ShQ?CtC2wQ z9^CFRv7&fkz+N@KJHrDSJw`aEfIhSY9T%K02FOlw3J(HS_PAm~apE2L@d2qEsGI0> zW+A7;GTgaG)ROyYUV@N)1H&5p7$jkD;_*yZLdL|S@^sG!@_qxZCwv8$wHkB0H#QaYK}S0_NljOe)A0K)y?SkoH&&3%_nqW>y-;bC7F^bDkJ;Q&~}yEIGD8< zgSZ@+p_b}Jwtx>y1xmd&<9c;q;yLe%;=T5vr_N_k5r`C#=w%=mbm}st5h-`m@p(lr zbb&1S_&Sg@@w$>J_BQUtFC^??6LA{K>MmCTCAYoCO{g@rmfSI>?TDO`-1lMp(FJe| z>xec^8q;=oVxVs91rXAel4pkH82qIZ$j1==`94Ir=4*|jLJ%a;7tsm=CM-sEX$^Hi zq*fm|{^6*F*meBL$(6{{NK<~5u;YYInG6vVMY^zo|IoSXP^#WX(o}f~qDWh4LhtRN z(2qo?fs!rrk+OYzo*J^h1f7UFP2UtHb>u{wVm`~5aI z{i<$+V?u7X1wwIJVMe>?XwU#ZpPMf_+d^=R+LI%_qTG|c|5yGbJFI`=(h%Kf zexgC(yuu{!@hx%Vcm|hC(sCrCEQ*s#vv$w)3@;QJ>Cl|k!Cro(-!VRMLF2G}`qi%P z?q3xondA#gnw11uOLdL<{db_0q{Ngw&i`^5S~@ zxLadWQL#45aFKe}QuF@8b?)S5quA7F>t!04G;0$*}PjCo8UAo#8!@Uqe# zPFIg8L`CdF++h>k3Z0rw-ccV8GVXt!L0cAWhMY3K*3D;GR1(5qd=2nAN3~DzfM0j; z%d4RFHS?9@_pJEdcoq08^XTxCLu8s%fytdqjlutdS%W$4fQmqCLMDtm(2BsZ45t5g zne+n+xYXY=_|~8ixaMCbt_cRKIdop}!!I9Lu6u$Z)MeK?<-zPPmz^vK*`4EZbc=hbFCw`-(hCBaBVK4e zm3+{V(Q#Q2p~d7M-1O|S|DE%s6fc>7^tk}clS_nyPnn~5Squ&!ZSk7`5S)GCk*ZUd zvIWNea+=Ry3&MX^I<&%1KS&lX=JV4abZVsKGZXp(8;$%r4XHf1Y`}_4Zb}E6o=FmAEpQiIvz;4n5e-SI%N$xHv0%oNYKCk<p?W;I)QSS@<}Wir4r#DRoP03y{sPKt;gS zEf*~2O;TuuG5sblt*kAqO*CkQW451a&0k1>{uT?MBO{va zb`4ruI7rXVsZ~&^ICTq;pFV4)QK_PFW=^Y8<%TKMLb$ThF*8lWGe0}gbmm+QQI6=Z zk=<2DI%ocZBYEMhMrOO4j20?I*yc2fX~4*$xx!(hJEmD4o@?1-Uv0arzr3p1wX*Bh zytcGAC)?z%U9THeyAOrW$1?uY1 zn0cPOnWJPsDOKg*#!9oa{vHzMP@hxr0FFQFKFE{vC#;XB2e({rj4slonS>v4|9Xk3tEr* z>XH4MID|(q{Ok>oor7(-88n3PD!ll5#=rd{*jcNTsYykj(+$Oe-1tC#+ zR5zrX<-#AIw$xx7t;h=Gdd(WI4p&F_b~PAFV*(UZ^AY-Uy4tBPo~^4OqM8uS=kN+K+KPQjz}njzq8&8 z)1W6;{;d^ZpE*_x*`6l3MKA61shs&N&KLPB^=)#xeGbIC3ytizqWsI>w)kNy8^EFN441A<5IFnJAx&h)VQ6j|P+>=C=u%Z65rqCA{Iw?P;FFdn5W#8*CS!1r-WV1dpg$cdX zwdhCRDm}>(6i{2d5_*WM(;zqHm4{$6A4m1A?)&E4TQu2}C!2+8xUcM(kDa(TU83fI zv(y#VbE4qe9!T$r=Lj<4ODYUKVdlSJ?~6+}#SBUb>veYpp-FDuu9v!A$V`s8nsR>} zef9L2codbdfR-Muzvd-P^BL~Kfb$OU@Uv|p$DW1V6JvTsr`d@$E)W;*vdA_7^c_3wfi7wAzeT2Sg4FRGjB(w!tri|N^&XH)I5;c zn8T%OUMfY-N-`s*$cZO|->7lquyn1?U8c0YfSczuq-$mQOyE+h57I7Irs$kD(6XSO zyCJpmgclWB3s*0k-^e^?WvZJRRk(|eD(Nx)GyHI%YxlC$D-QF3-kcb)ZCxu^rCOE-GMz(-QWFjq zt)N_<2Plfc`!1=vU{}2l{UBUN*wxcf4^s`*xWSG3uiQE}>fUD^3vwDki=wkaYL>d} z8`_DKLlZcKT+2%HnvH~Y0a>dcQvnU%MbUZdaO{~Do6O^*#w{%!pcQJ>uw34?q!cvc ztIXmG2ooSMm%K3a0OZaT{FSNBWqXIzzCxR5&9k))v9W(4KX3$O3r}qWN(O7i zg1_q<-^oGWm6rIRwMMZGPL7r7@s&7>4^#0(qoQ-Us^qrgZWjhk=0*hB_!opP4C z0?nC6Mw44wttf%g%DO?s5jLI zLve;WwJu+H5}E;e@03f9&vzg3!xsjxm2z9QP8k`ehY9fG3OOR1xy8VR4qhv)%Nw9h zq++nPjse>p>k|fnVf?fmSpG)CkVTb=8eng~8+kQa)^8qTip9dk*efCm3R;Ss3d*(I zIS{~&(t`vI;2r5!DAfIFcs9I;avM zRB71%zRG~_pj8*Xm4>|vLdCk~eX8Xi$1=g8{xNY2hYwnZKg+*aur9umw784d~qD4yk0T zvB%rSg~v=Ea2U}D%oqvt+B}++L#?#v$1WOQOH6jz;$2dT6L{TlJ-o{#aog$XHYw@ci$dkgRrIaaLu&6t=Mzg$?{VnLeOTIUcwaZQ zq%3`uC$$rEc5Zbod)7LO%WS0c^QA&LQeE<@b* zs_ZuQ7T#s!4q%wAD4V9X5?@pA*ge!{DzeRB zPDpUG*i*U2OW(7ZmwW9;9*#GAvgvG%4Xt}G>~bWp59EFvPss}wFqjo=g>d67P^I$K-q4_@6m zR1yi%4~khs7b{gDrRaN3ZQ&_w7?$Q22-(6Q!8{bJX1f_rW5)|C%GhQgZohsGG#xgS z!yIGL*QCHx`oW%^yW!#K4tT)Fxi?9tI+pJ=LMP%c6$RJs==W{)^+ktr|LThck>0nY zOV>h&#E-{1VENzm2II)-o~qw{EDPO+f?krohENwJ)hVihD-pcf1m3g*R#fvrh7eb)PdF99zc)n<{>sEj zD+KnWSJH0gaq!+7t)j`9dWo+q@rS=hhMj8;i(0x?8fQmVwDz~&yGq%!ju)GKh3>Ir zqM|nLKpa{RtcsEeF+6aaUuSdbz*)N`1jUo_i8{N72qPSdIF#0 zsf)0QrOw{<;?BxQ-3MK(3``k&zRgAIZEV!;z(CDEW)cV?V8Enpe=>T19?tX5@eTef*2UxXG zWd36N#G<}<#bn0{&Z%oGeRjv$y>0`y>{?JEq=&w4?#@L&wCE+|G2{s@&Qp;lp{>EW z+#oc8FoR(=Uu41J;KJE4B)$WLbJs}voCxT^rT<_CtDpk|#-T-he)l0yvV#sf8`jIU zLh{>QO?AwrH>hD<_SORy3td-4Y4q^yHh^7>zfCL>DOZU+sbn>_J;YLvt(XAwBXnQx z?OwZqbuP!~$8%!h97S`&7F=>@t=D63b*A9wgI?TSpd7OrTE6e*P-bq|wKgPPG3sGe zHe|)67-^*_l+cSGKe))fB?Sj2P(Os9j}j=irQj!YP&NqqGQaAfCQxk_REDozNdHm{ z1VtRuQ}N82!F}g)vjBW8(n^tkO&k<${<`SwUj{CfPzyj*{<|Wc`R|HVv0u3f)nW@` zeo67@>)5{CS3`>f+neQE41wT2*&rA|IpGojA)y-UnGBZg(gMFIQ52 zq+$W1w{V!iUqImBmaF(!ZZf1trU@W%X1xlrUVb*Xtm)Ns=c%m(cTZwbMUi3g#nRvU zTj46$281HlYoc!YAxdJ%4`Lk);4cz37*u@vu!?iz6WL0Xz;`O*xJ~FaS*A>~YZtK&^p^9P~QgCtl@rp36S6Z0?YvrMl z8m?>QG5P^@Q$@7yoZjwjI19LE4xg~RFgCv8h-knt=QW&SL=AhJQ4ugN1uS{W*SOqI z4+00L$C`lsX{=@wOPjGXH{RoUcTF4+oNAcc?pqthTKC@*Y@wf3v(n|*vzN0!jd!2M zbq3*mqeZTHT?ZM#yq+Ll*$$4v*J%YQ*V01fvn8Z7f97t8UbU)!vqZaaHrlkfT4`j8YHYx}yW=2&`lJnQ2Q98yF-CZ5GUt0^>< zi5?N!fpbsrlR?g#n>3n4`Q7#vmr0p-f8S^lrWK-Q45^1)E>rvWeenDAU3vIj%4{UMsVrFY4Udhh(c3 zWX#a3G^!V7utSxUZKI1Kn{&O?pH{_akvLE3g1wXMZFOA5bq?3cn9y5Ej7oQ9cWc0fPv8X=+gKsvc^%AOG~NH$cqKTC(8S}d#=;3GkDZMh__KlpMz%&;aAOt zv=Zy{jMN=WRO;C~7naG$jKfaWui1X?>=)K<8g0uk2cbd+Q`6I(6P{;%MHKZuEQ+e- z294V!4G-MjJC)%*o%7zW-VlicR(*u~-Q3#@kz~a+6CdY3jW4;fyy{vv?!LC|fD_jkTN@c{6nK*mc~*&? zCE=cgo>ue1Won!U7D0_3$X9VbF$14KF^0{%?Yy_+vH(Bdc6SI=lXzGJjH7p>vi5)1w~*Y9Bb zM_Hm-mdv8qqe87TdWfFBLL;{_*Ei3zCQ~|Mi-b)kLDlhA`;Hj}?3t!EEgOCs$GDYJ zHK)3~{BCTEZ@lTXQZ>zkf?vFjeFqNky~p#hc;u$EXBs|F$QZKJ#~I66VNZkw7RAy= z6S96F%NTL3usd&Pk$?F~Uxlw;(9JBgzWX2Ty#IAcl_v$}-0JQu_~4yxuoHVbs{ zwyAxNn3Xglr9e+;ZCN!u^M2g)kZ0P(%fgkNbGA_Py3Y~vgD@dNtk9pI=)$eZsrZwn zRO?c+Y1@;sFnqGt3MNdRe`wb+GP#iUB!)&lJM@`+E>G^sn{Gn#q47*_)bi5^THJbZv9#jz!k1y!WX1;PmV3E%>HR| zx{VP>b@;@1dj}TFq^+iJQbI3kT%nVTNXERI^IMdH?_4yZ!%nX6`-roO{m9-1|M} zd(QcOzMlidutASQ9)Kg11&;F2V<Zjgbb2Dt@y>_0PxNH+qki|K>AVUMsU9 zcSUO;ZukV%$&wVC8qTjT^&oI4F2o}~Acr3+bF=A>526}V6)jh2^v?SA!h}MJwZPTq zy1r-jf0iw*{F<6QL1NdhxHRI__%=j<+aN-dV}lL z)g!czk}VH9Uw-fi80D9fSdE%l7+dfqEUWmgr`(atcQn(H`jpEdOR$r|p9d(x#*bQi zfjgLThdjFBipV!e;WU=))}bPoXzqB;(-i&Ld=~nBXa(l}7=Hg5cY*bM4EX)a!x0SD8(>O20`oVqj<#&a6-Qh) z;lb-wT8wCvAk_>3+snVArTp`8fDlu;w&>A$)Qi7F{(n6|3`6oMuUN#maSeE;C^M(7 zGNL*TWh&}4LDuGKqJ(u_bI~B}Pc+T={WUd{3zcx*35^%XM*U)hHUSnO2U8R$*MyDH zSszmru-zHvS&T%T3Q2FvC+Za5YWeck`JSlh#A9OSv;ie~_srk(k-JMUOC$1g$)!^T z=I%Os_AkZIOS1CF&7K7A?LE2$es~SH31PW%{FB$~x z4c;64E3|VaYx`5$_JR;>*!BVt18viXet9dbc=SKNt&_Zv*~ub9o<-~gj*?&f=+`?o z9>YYlj84blTyBAj#^vPDK3bW*lKah1?=TOa*m>AiyNuu^h(6_7B{~Esp5?5!uyDc~pbax_z0Q$Gp9AR*GcZJ6(f-7c(!CZjHSVTL0=LZ}oAVIkb zX1f^3_FJ#Z zXl;&+w~*|)o2`a<*zY%)0X&4khg*;5d;C8fx8FJU4>A7_r-$IY9O1eTu7-RyOC&^S z?=Q78Wm5;1H6H=Tr-+7?`x-$P#o%=dmov(c6c>nuTi_@NAK9t3EWvL$Hw6GOL-DlHwc&EFC=a*vXH|W_d!}Q*i zfZEosPnW&R4+Fr8Ujlu0S(571SR&Co?g`953pIx?1_+>L1!4=Ysg>2;BO8~r8dLov zKA&7h503rOs$20?@m7>dqk~_s?~!=Q5I>P#!MTE}8714|Pf{vqbZYU_BD5hv3DWR> zq4DFMG7No;Gd9GQ!I2jbYxSwJfS1`>5a7iix|sJv04NQys6vP?h#8nC|I%y!QP@8X zu*aufdxH?nU+WrBxzUG^C&fR~&&VOtI_q11*A#u(D&l-;%zAgVE2|CUyBB|&zu0@A`>$Yb{>a(>?oLbo6S5v$ac~RwHag`A7B9?n$0X50H z(6XjL)Zh1{@p<5jKH zrd;;xx@G=&D?r|WeVw1?BCh5n&INRW(UGzki`pE80MUe|S3fGnKi)9_$o=#6bK-wh zEtJ?Fvm8!TRNzkFO8ioJ>f;mA%M48Y0wMmL9NMQ2Q}0Pgc*LUPMLL|xA1&T@j50iz zh>l0Amso|)b@XS_@4eGe;8gSEv{2cz_njrsl=Yvxy4^qTiEj$!mDa7Ij$*#f+LudoioaK=Y#3^wEtPkt zG*YFNcj@TSlC#J0%^qR?_AF6!<|?f{nT$?^i6UM#q4u{XF;p7X`S+aw1sN zH!u8m_nP(sA==0bi!s*^7OhTdp$NDJ^S|+|C-$s7r5jQK5}V-I99(YJtp&VJ3gX>5 zCZhXZQNr8vNdii!d%Zo~J@pnhwMqt-i#Q~r*!Q%lCAXK!kSrEu@-8W-T&pt-lbPhw zl@PLERi(OH3Tpd6ydt)m9ZVyoR1Y|P)id1B`>$-wc?}plr1gU6(#6c8abT5n||^2 z9=@wRtgpereotxZF&GQYCD#sKJ<-|P() zlo1S&FVdsxmK>qk&*%mCTx>J8I!wA*e46G$O`m>0aKSFIC*o2pG6kb#aAC%6wocmR zr7KlpF|CY9vo@`C3;E6WXjvB$jgj)VdEa{`<@Xk9@;ssZu@;3k#nSlG$rXw9v?))jM4=ep{p{NWx2Mbc zqu1ogG|W{@H4Bk=*n!ef(J@PwOh4>IU*h2jiV2;u$TZhGNns~itf-%J4h9{lBLG;! zK$ie@0+1x?kcaAbt`5ZiwkGfmW}vj-cRfQ%A-WK+!0RaD7&EMw_9N8qG9q3fgrNN% zoV;xRbgr5|tkG=}uHAu~6z{{My1^~8FClgz?3d( z>5={R7>t^7LkGgAsQivlkb31LF^RP_+o?_a2(W&Z3%X6ZKiJ76xZ>k+bmtl=#P&Lp z9q)I}+3@nCvf{fvPC6QLRn0Px(aG|iNBiQdPGVo!!1Zd9yqay6gautw+0S98(9eCGhg=vzF2m8>mHl84Nqp{LY zK}t6Ycdz(>@ln;PY4=c8cT(rRYnonRk&dmSy^@|Y4^5<`bae-l%r)|I!Y1-E9gm;m zQ242F`X_hnuStkM{;!RY+jW}WR9IV6X`z88x^rnm&a;iI`>0-$?*Oez&Wk{{uSf8cy?szdrc`zVpHu-dn*EuV~z%bzykv)|MihsygANqPUmDC{PKVN=_!-$tMrt z)q2urkB?$fWahGT016H;7{LelyqV#AT+9DY~n6*9fi! z{Y{K*sbjol{E$-BssSz0!ed~c=8RIbgoMYP41VG(C*%Gmxtz<6I@&H7+Mf?1)6}Ba z!T1T<_T-K5OfcM+|9JxdaT+8K&43HQwvDm>dAAoTc*e?j{~5~|gzXKM2ZOa=CTYP; zJ&P^~)v`imb=A^rH(boJ(PXQIX_9-{*sohNQ zTlOpDfD?4Q$_Z0FlYx4}BBOX@$7oV2_$dc(5dFc_kiSikjZ3}tR+iHmHtv5pN%iIN z{+^$_>am&SmRsN`TIT)an0`0>%i0Q)IyI}m3_JDWt>$RujY$Ze)kRP5EQ}ZFcHqgV z{M&Lu+8Dcm>JN3A`Co?VlqB2uBsGrqau}pjcig3pzXlaL2ylgUdbn7wp^KaZ(TtL7 zs%&wlu-jk14?@efUv>ZetB8IdCZ;FMye%98VYmr+(yRtxG)=Bl!_ePbG#u&O^@IAH z?i%b0_X4_1cO92)+LqLEFxG@;HO5_R+fG8W5z{s3+(pG?MJPg(mrJ3_@Gt91pb*tir+YgO;AukrUpfe73!kAlBxoO1I(-B!9 z)Hw}a3_Ouh%u z%ECr#Dr0fuIaVXid?zj@lEy6BHVju~DAYof-5H^Dk*V^7{x=UTVJovzGe}CW&-r_g z?-L76i1Yo89yCl46f%CeTJ2IbzbdbwIg|@VsDp|@v7u+PTg)AGr86ry3$L96&NpTP zMLQsc`|5~4fVwv^v(jK3bOq9bgU54%-~5xOcy!y7AE_C^;h=@ueE*325m1PSysf6y zp$H379}J$;b*sRxSP~otxJ%Xcq0>=u+D;KDA&aNA`UFA;-YM5Mw%nMlPPdIr&Go4} zhR%No=F~0sG*3@tcHk08W}U`653sdD`Rr8gae%$bg+H+e!F9tYHiRrlWj-I_+&(G+;xHXSpB z>zpvOUlYZ-Bi8Ha-nN_s&T}Y}rgZV)3{TPYkrvkEZ|-Z-dl!5V-i7x10@8G!kdodJv_yW3mRs<&jhCGXrXtrdeG z&({ae?tN}Fs;*eiA+DR>H?7oLAQlvRf6_9iA`Bgxap2|(vF^t#lW z&nX$Tt4hv{Zbia}piYCa05IAF?OKW>=mDtQ``$Z{0X=}E+EvA&SYSmyJ&b{S0B@DC zjKSz)%|X5fpTWHVH)xDm#L+(|gD*3GQkw44rs-kPPUO28 zHj612X*r%;q*rf&O(psx`E_QH9OdWM9tMdUm$wG?sc;xeNRcB018?nMqaQ*IQ}XTg zxx-cia(fcrcT=c&4UUHk{XfhOh2?eJG#GEhS$ZxOVU12bTJuuwlq)P)=3F&6=j&C0 zx12ic=UtF;da*Jo)j{dx9NX9`N7qB|kF%Z$J`47lj$c-)_AGy@Ng&MkWzYe;WKH+b zr^4)PH|iC)+{!qGm4=a$iTgPzBBR48iPMoAesj|cPv-;cl0Qq_H=trF$vldRN=21% zL<@9-2fm2A!I9r`#2`sZ!7Cxv<^*u%Vs8=P7pBmH)UG&mL}!&cyA7dD-$rxI;uqQV zYDTE?jYn!KtKTPo!1`&GEsn}JiqPW97V-Ohg3Qc(*6G*n4^29&&v(X&B@E1UDBV2s zsCpK^@$7x-`8ndFiAQ-GDxJ~Y9}{oUrrVDv^iayj<1>>-iyA|ba@2&eud~Xy)yzP3 zjQ#s>P+vl=Y{10GIG`+8Tw7h>2LuQGX#ZQ|Yrtirr$K9b;+l^W0dr z9vzQYtnVb*3F%YWC%BXSss*QRKWnW}-YD2>qp!R;@9j7JnMm&`)t&a14U1368;vI^ zN0)1p>OXr(p1HWBgs&MtLj!QmVXLa-Teqi-a}RzQS&D3b9t#LAg8pG(Lw!$M)haqquW(+u zPHXJZZk+WM%&VLlJiyyEdr-X|tQT@mI45HDTnupjNYgZT0?OBj5!MG`*V%Gc^^HJN z6tg@|YEzZ5G zyj?uh+O4^R(3RF&P8*uUeYKW2GEDDEEB*#$xF=e!VV-$;5jB+np(vcw96rs)*em#M z91f&3Pf*4HeD_etR=Eiv)h@|y&39v0Af*Kb62slX6D_LC;@98W;#%{`3Kb`38?3FY zMh^KnN_0q|A4*9|a?ORM7DkjrBxUSvU0C`CoqPVtcA#aVof02=~>_*Z%?upI_<$VV1!MTUnfqq=B8xZR)k7EPQli+wgq{lMs+=Ml_5l;4YUG3 zlsPCZ@)uj$TOysDNREV_2eS{}KZqO(9q8Fzkl=#EBQJjizm{U~H{UPjUud#&yJ;Y|@dK}tytOBtV-$9&}gI--!~|tV=O%Y zKZ;fs%WAvDid`%7;FoTz7F^9}YpkB~=#psL*T4RpKwKR9EIzqd%+~<=mZETmV|KcKrbZM>T&{S@DA4K;aO8c+P6berO%m5oO|M8nL#OcaH;E*T>dz|N-FNnMoHHe_0rtG$mVVMMaD+8 z`u98PxXM%nIj>M|op|{HmDpO4_1*)tEPks`;`1}O!cq&QK2$zaP^|hag^t!7Z7w|W zA$33@l04FCLRNGN<&G*pI|SS%OmqXK_>brE3=dKoW!)(*#wzzQTBIsK_Dd#ttBGCg z^|5o2kB?6k8AGxH+;K3J1-}$`%G0)EgXN(R`Nt-n*9Nm#b%|xF#tD|C2>o9Hy}gN> z=Yoq7bX|#P1Wymdc0yn^{|_^Tx1oAnJf_v%lEs|l3-G5;neE&m@3<9 z(x|KRYm-|9D#tDphw|Ht1(t)Cnn^;B7(VoB|8g zfIkSJ$lLPZ5Ap?AJPbN82e|eQxtq+)oX7K6Mt*F&?KQD>UssZTs8!-#(CsWOUS)-` zFP9eQv4Bh3y?bH3q6F1=@cJF`ebX+C2Zzg25i+msWHs#eF&pho40~- zKmPOGt>BguIAz+r5wm&}JSAxaeBHpjB=Bwn_Zgw8%4>K8qsnUn?mXOb!t;x8UtWE) z0R=Z3Zc+cThab-oZ$roswvvIT!i#{Ifz3=63;@``2LeSi8G;West>lOG1^*&wGHBJ z4bDn2(l9X)7RV8j;WU|3b(`Gpxs)#Z;Y*K?IWXg9%u2$(T;y|SH?$k zk1scz`P)~E?pi0O2PqMkP7|j$KHx1!A&Qyg=BA?iZ8POud@xB415Sjp62+TN$XI8_S~6he4#pZD zOr{*BV1*Z%%!9h30%en2ZD8sW%>E1Sbl}nz-S*&KG;sS91lE8s;dpZ(>FKuDYQsco zy}(jgfPT^RrU4XQ2u#Z`|1@Bv=45ud3j7U^FjNn$exS3Q@RIT@ye1|$jKH1xd1Kic z0a|IWs52copk<}O^tMSLgjSrF9@ZZr62Wi~vunzE6dx-IT*!;|XNres*!^l^&aByB zst(j>%Ylba()-`yZJAkrZ?#L`nIoNaWS6?B(RqE88-n-gyOt1+yUZqnR<**%0n_RZ z9mZM^FlY9bM_R!Zui|bRxELM_5 z4~xyFZL&)gEu|5BZv13 zlg&2%d5KLH75um=D?c!vFx1vBE zSm7feZy@Z3OoqIwK!9Nx2G0T>wL(U(K-Yl{h%^vpP^2m>#0W%}DiGqo7QrY7WZT+c zEEsg8E@vA#=MO}ov~_6Ifm~@+h9L$o-n4DDyGPEt>yLbtQ{E)QGU@!q#YcFvy9rzuvZ~|)2-(dvb z-Vm{1fnb4W(@(I9Sy^w=gTupFv$hF?8OgmnH+x*0OLB{D{aEh0RNQn$_VkGq$;)Gx zH=bKXJ*pgkbXH2=SQeX^Uxt(|opkU*x<+vl(z5OmLtY#=HsaNMa+imy;F0$D`{Vfe zhyX3;kN3abga&;GESd+R12(vTE@p%}+(?3x1Dm1%&Y0l#5f+O-MGS6EVXGxV6`lYA zQy>_iuMk>iS$LUM5vuHrsSywjQ;fl)1z*bv^RdBkundCZpF22qYlFM8VD)BBz)N;S z5yAoNt)eL^4DB)AQyiFpRm;FX9XUB9)ExiL7mlUwA_XQC?i;2}xytDZ4lFoS zDdoafBsn%Ge3*w-XsuhSpiABAkBd|H4Np&ii)F#Zfht}Zc;Ev0qYyMYrgm=gda~tK z;d}V>3oe0j81Y)sxv}3f>;VP+$l$9;woD?NtVF(R|KzKs1ROFs;@kzj>VRt^_&Ldy zeo{4jr@;(#KRRB*G~xX|peNv8aZs>r^?sxfY>cV6N|tpb19J$N7kRND-nqaF4Eeys zU!|Ndua-}S%_q#j4!>ZHglAmhPwWz373AGCt1yqDQYX|3h++WkxT{ubI15;5T#a4% z?>hPc%nQI0^vlzg651crv)jWlw&R3(2Ol+`$(OP(wRHG&3;HqTvLYl|#p?^#KJFRX zP1R$ik2lxA+Kcjtbpc&=yd!m-oC1ND zmLp9NR`u+TsI$XmWim51AFu0JpQ@W#F1q60!#Zr2r(4WZtsy-wb>c*Jq1%OaLVScz znDg*lb+(XU$Bz7iPlNFMZDFe5d)bq31!2;(RV6FNf&R)OV1Hc0Ju`)ENpsh?fxhK5-R*d7l6P&R|kmI zKj4-h?zS*PY@n(bva7POXn-pAz50NeM`noKnhnPD{HRk~6%DSKAP!VGgen9oCfvZo z!9S}UXy$<~*sPC?O8E~vIRB50(dL8fpk^}o@R*K3hTsE%CjoegK!s(I+#7t11nR0Q zAY1M~4|MP2ZHH}-GWpbM3#5?%TZwF~YKRgeLX~yyZZP}Mj%{I^N9Z`5?o+FJC&~5| zC?^C91;bwqdf<$0^SC`2j@cIcCRkqhPB8QaJ_9Z9o9!XNVbDYJQC15NZZBh6OPJ(f zMR}@owPyN(sK~yas!KO>r_Vh621U9U?b_Xp+-2cNGQu?&aVL0cFbSfXnGPw9x;vGw nw49ng89oWv+L}Pold8;S66qI2@3C$Ef`4cKzdua=Zv+1WP@iv+ literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux47/captures/inside-to-dais.jpg b/Standalone/Research/WorldAssemblerM3/Linux47/captures/inside-to-dais.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ea8eb387cb2b9edc741beebb6ced7f0a93bd564 GIT binary patch literal 34020 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 G_&)&eBm2$( literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Research14/REPORT.md b/Standalone/Research/WorldAssemblerM3/Research14/REPORT.md new file mode 100644 index 0000000..4b9f4a0 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Research14/REPORT.md @@ -0,0 +1,31 @@ +# VoxelForge R14 — Windows build review + +**Verdict:** I found no likely MSVC or UHT compile blocker in the requested diff. This is a source review, not a build result. Runtime behavior has one important condition: the legacy chunk callers align with the new physical layout only at the default 8 m width. + +## Compile and UHT review + +The diff adds no designated initializers, `__int128`, GNU builtins, `[[likely]]`, or `std::visit` use. The `std::variant` code has `` available; Core uses C++20, and the `std::llround` calls have `` available. The new `FStrateSlot` metadata is plain non-`UPROPERTY` data. + +| File:line | Issue | Surety | One-line fix | +|---|---|---|---| +| [CoreNamespacePreamble.h:60](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/CoreNamespacePreamble.h:60), [VoxelForgeCore.Build.cs:41](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForgeCore/VoxelForgeCore.Build.cs:41) | Toolchain check: the Core build uses C++20 and MSVC’s `fp_contract` pragma. Core pins C++20 and precise FP; confirm the owner’s UBT-selected MSVC version and flags. | check | Use the UE-supported VS2022 toolset and confirm `/std:c++20` and `/fp:precise` in the build log. | + +Epic documents C++20 as UE’s default and minimum, and UBT’s module settings come from `.Build.cs` files ([C++ standard](https://dev.epicgames.com/documentation/unreal-engine/epic-cplusplus-coding-standard-for-unreal-engine), [module properties](https://dev.epicgames.com/documentation/unreal-engine/module-properties-in-unreal-engine)). Microsoft documents that `/fp:precise` disables contraction by default starting with Visual Studio 2022; earlier versions could contract, while the Core preamble explicitly requests `fp_contract(off)` ([`/fp`](https://learn.microsoft.com/en-us/cpp/build/reference/fp-specify-floating-point-behavior?view=msvc-170), [`fp_contract`](https://learn.microsoft.com/en-us/cpp/preprocessor/fp-contract?view=msvc-160)). + +## Behaviour risks + +- **Chunk coordinates versus micrometre bounds:** [VoxelStrateManager.cpp:1201](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelStrateManager.cpp:1201) resolves physical layout width in micrometres, but [GetStrateForChunk/GetStrateChunkZBounds](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelStrateManager.cpp:6298) and [IsGapChunk](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelStrateManager.cpp:6398) still treat `ChunkCoord.Z` as a layout-chunk index. Normal world chunk coordinates use `CHUNK_SIZE` voxels ([VoxelTypes.h:285](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelTypes.h:285)). Those units match at the default 8 m width with 25 cm voxels; the setting also allows 0.25–64 m. At other widths, generator selection, gap detection, and transition distances can disagree with the physical slot bounds. Enforce the matching width or convert these chunk APIs using the actual streaming-chunk width. + +- **Stamp and cavern graph records:** The Unreal adapter builds strata and passages, then finalizes its layout JSON ([VoxelForgeCoreAdapter.cpp:1078](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:1078), [1260](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:1260)); it does not call either stamp or graph resolver. The Core world is active in Unreal, but the adapter currently supplies it with no L43–L46 stamp or graph records. The current headless demo calls those resolvers directly ([StreamBenchmarkHeadless.cpp:933](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/StreamBenchmarkHeadless.cpp:933)). To get that geometry in Unreal, the adapter needs to build and serialize those records. + +- **Bezier FP contraction:** The new Newton solve is in [ShapeWorldInternal.h:6090](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6090). Core’s compile preamble disables contraction for MSVC, and `World::compile` runs a contraction self-check before compiling the shape. The solve itself has no graph input from the current Unreal adapter, so it should not execute in the current plugin path. Confirm the owner’s MSVC toolset; Microsoft documents version-dependent `/fp:precise` defaults as above. + +## First-build checklist + +1. Confirm the UE minor version and UBT-selected VS2022/MSVC toolset. +2. Build the Win64 Development Editor target through UBT so it runs UHT and compiles both plugin modules; UBT takes module settings from `.Build.cs`. +3. Check the first UHT or MSVC diagnostic, then confirm the Core compile flags include C++20 and precise FP. +4. Launch the editor with the default 8 m layout and confirm Core world initialization succeeds, including its FP self-check. +5. If using a non-default layout width, resolve the chunk-coordinate mismatch before relying on streamed generator and gap behavior. Do not expect the stamp/graph demo geometry in Unreal until the adapter supplies those records. + +I left the tree untouched. `git status` showed `Standalone/Research/WorldAssemblerM3/Linux18/exports/` as pre-existing untracked content. \ No newline at end of file diff --git a/Standalone/Source/StreamBenchmarkPipeline.h b/Standalone/Source/StreamBenchmarkPipeline.h index 366eb9b..7e55c0c 100644 --- a/Standalone/Source/StreamBenchmarkPipeline.h +++ b/Standalone/Source/StreamBenchmarkPipeline.h @@ -504,8 +504,12 @@ namespace StandaloneStreamBenchmark struct FLandmarkTunnelRippleResult { - std::size_t floorSamples=0,wallSamples=0; + std::size_t floorSamples=0,entranceFloorSamples=0,wallSamples=0; double floorPeakPeriodMetres=0.0,floorPeakAmplitudeMetres=0.0; + double entranceFloorMaxStepMetres=0.0; + double entranceFloorWorstDistanceMetres=0.0; + double entranceFloorPriorResidualMetres=0.0,entranceFloorCurrentResidualMetres=0.0; + std::size_t entranceFloorWorstTrack=0; double wallPeakPeriodMetres=0.0,wallPeakAmplitudeMetres=0.0; bool valid=false,passed=false; }; @@ -601,7 +605,11 @@ namespace StandaloneStreamBenchmark return closest; }; std::vector> floorResiduals; - for(double distance=0.75;distance<=length-0.75;distance+=0.125) + std::array>,3> floorTrackResiduals; + std::array,3> previousFloorResiduals; + std::array previousFloorDistances{}; + constexpr std::array FloorTrackOffsets={-1.5,0.0,1.5}; + for(double distance=0.0;distance<=length-0.75;distance+=0.125) { const auto point=atDistance(distance); const auto prior=atDistance(std::max(0.0,distance-0.1)); @@ -611,16 +619,40 @@ namespace StandaloneStreamBenchmark if(tangentLength<1.0e-6)continue; const double normalX=-ty/tangentLength,normalY=tx/tangentLength; double offsetSum=0.0;std::size_t offsetCount=0; - for(const double lateral:{-0.35,0.0,0.35}) + for(std::size_t track=0;trackresult.entranceFloorMaxStepMetres) + { + result.entranceFloorMaxStepMetres=step; + result.entranceFloorWorstDistanceMetres=distance; + result.entranceFloorPriorResidualMetres=*previousFloorResiduals[track]; + result.entranceFloorCurrentResidualMetres=residual; + result.entranceFloorWorstTrack=track; + } + } + } + previousFloorResiduals[track]=residual; + previousFloorDistances[track]=distance; } if(offsetCount) {floorResiduals.push_back({distance,offsetSum/offsetCount});} } - result.floorSamples=floorResiduals.size(); + result.floorSamples=floorTrackResiduals[0].size() + +floorTrackResiduals[1].size()+floorTrackResiduals[2].size(); const auto peakPeriod=[&](const std::vector>& samples, double minimumPeriod,double maximumPeriod, double& outPeriod) @@ -642,6 +674,17 @@ namespace StandaloneStreamBenchmark }; result.floorPeakAmplitudeMetres=peakPeriod(floorResiduals,0.375, std::min(8.0,length/2.0),result.floorPeakPeriodMetres); + for(const auto& track:floorTrackResiduals) + { + double trackPeriod=0.0; + const double trackAmplitude=peakPeriod(track,0.375, + std::min(8.0,length/2.0),trackPeriod); + if(trackAmplitude>result.floorPeakAmplitudeMetres) + { + result.floorPeakAmplitudeMetres=trackAmplitude; + result.floorPeakPeriodMetres=trackPeriod; + } + } std::vector> wallResiduals; const double expectedWallRadius=edge!=layout.cavernEdges.end() @@ -702,8 +745,10 @@ namespace StandaloneStreamBenchmark } result.wallPeakAmplitudeMetres=peakPeriod(wallRippleResiduals,0.25, std::min(1.0,length/2.0),result.wallPeakPeriodMetres); - result.valid=result.floorSamples>=16&&result.wallSamples>=16; + result.valid=result.floorSamples>=16&&result.entranceFloorSamples>=150 + &&result.wallSamples>=16; result.passed=result.valid&&result.floorPeakAmplitudeMetres<=0.015 + &&result.entranceFloorMaxStepMetres<=0.05 &&result.wallPeakAmplitudeMetres<=0.035; return result; } @@ -1259,6 +1304,16 @@ namespace StandaloneStreamBenchmark {std::fprintf(stderr,"[LandmarkReachabilityAudit] missing cavern room node\n");return 2;} const auto ripples=AuditLandmarkTunnelRipples(Shape,*ResolvedLayout, World.CoreVoxelSizeMicrons); + const bool entranceFloorPassed=ripples.entranceFloorSamples>=150 + &&ripples.entranceFloorMaxStepMetres<=0.05 + &&ripples.floorPeakAmplitudeMetres<=0.015; + std::printf("[CavernEntranceFloorAudit] layout=L46 samples=%zu distance_m=0.000..10.000 rails=3 max_step_m=%.4f step_limit_m=0.050 ripple_peak_m=%.4f ripple_limit_m=0.015 status=%s\n", + ripples.entranceFloorSamples,ripples.entranceFloorMaxStepMetres, + ripples.floorPeakAmplitudeMetres,entranceFloorPassed?"PASS":"FAIL"); + std::printf("[CavernEntranceFloorStepDetail] rail=%zu distance_m=%.3f residual_m=%.4f->%.4f\n", + ripples.entranceFloorWorstTrack,ripples.entranceFloorWorstDistanceMetres, + ripples.entranceFloorPriorResidualMetres, + ripples.entranceFloorCurrentResidualMetres); std::printf("[CavernTunnelRipple] layout=L46 floor_samples=%zu floor_peak_period_m=%.3f floor_peak_amplitude_m=%.4f floor_limit_m=0.015 wall_samples=%zu wall_peak_period_m=%.3f wall_peak_amplitude_m=%.4f wall_period_band_m=0.250..1.000 wall_detrend_window_m=2.000 wall_limit_m=0.035 status=%s\n", ripples.floorSamples,ripples.floorPeakPeriodMetres, ripples.floorPeakAmplitudeMetres,ripples.wallSamples, @@ -1318,7 +1373,8 @@ namespace StandaloneStreamBenchmark static_cast(buried.unsupportedSamples), static_cast(buried.gradeFailures), buried.passed?"PASS":"FAIL",buried.passed?"FAIL":"PASS"); - const bool passed=ripples.passed&&candidate.passed&&!buried.passed; + const bool passed=ripples.passed&&entranceFloorPassed + &&candidate.passed&&!buried.passed; std::printf("[LandmarkReachabilityAudit] positive=PASS control=%s status=%s\n", buried.passed?"FAILED":"EXPECTED_FAIL",passed?"PASS":"FAIL"); return passed?0:13; diff --git a/Standalone/Tools/verify/verify.py b/Standalone/Tools/verify/verify.py index 2920cf0..8c6739e 100644 --- a/Standalone/Tools/verify/verify.py +++ b/Standalone/Tools/verify/verify.py @@ -3,6 +3,7 @@ from __future__ import annotations import argparse +import atexit import hashlib import json import math @@ -22,6 +23,7 @@ import zlib ROOT = Path(__file__).resolve().parents[3] VERIFY_DIR = ROOT / "Standalone/Tools/verify" LINUX37 = ROOT / "Standalone/Research/WorldAssemblerM3/Linux37" +LINUX47 = ROOT / "Standalone/Research/WorldAssemblerM3/Linux47" OWNER = ROOT / "Standalone/data/owner_world.json" OUT_DEFAULT = ROOT / "Saved/Linux/l42" @@ -221,6 +223,16 @@ def run_landmark_reachability(runner: VerificationRunner, runner.require(f"{name}:continuous-tunnel-ripple", all_match(output, r"^\[CavernTunnelRipple\] layout=L46 .*floor_limit_m=0\.015 .*wall_limit_m=0\.035 status=PASS$"), "floor and wall ripple remain below L36/L35 limits") + entrance_floor = re.search( + r"^\[CavernEntranceFloorAudit\] layout=L46 samples=(\d+) " + r"distance_m=0\.000\.\.10\.000 rails=3 max_step_m=([0-9.]+) " + r"step_limit_m=0\.050 ripple_peak_m=([0-9.]+) " + r"ripple_limit_m=0\.015 status=PASS$", output, re.M) + runner.require(f"{name}:entrance-floor-ripple-and-steps", + bool(entrance_floor and int(entrance_floor.group(1)) >= 150 + and float(entrance_floor.group(2)) <= 0.05 + and float(entrance_floor.group(3)) <= 0.015), + "three floor rails cover the first 10 m from the entrance; step<=0.05 m and ripple<=0.015 m") runner.require(f"{name}:buried-l43-control", all_match(output, r"^\[LandmarkReachabilityControl\] layout=L43-buried .*" r"result=FAIL expected=FAIL status=PASS$"), @@ -356,13 +368,13 @@ def run_hash_pairs(runner: VerificationRunner, runner.require(f"{name}:hash-count", len(values) == 12, f"hashes={len(values)}/12") same = hashes[1] == hashes[12] - baseline = ROOT / "Saved/Linux/l37" / f"determinism-l25-clang-{recipe}-w12.log" + baseline = ROOT / "Saved/Linux/l46" / f"owner-hash-{recipe}-style{style}-w12.log" old_hashes = tuple(HASH_RE.findall(baseline.read_text(encoding="utf-8", errors="replace"))) - same_l37 = hashes[12] == old_hashes and len(old_hashes) == 12 + same_l46 = hashes[12] == old_hashes and len(old_hashes) == 12 runner.require(f"owner-hash-{recipe}-w1-w12", same, "W1 and W12 each produced identical 12-hash signatures") - runner.require(f"owner-hash-{recipe}-matches-l37", same_l37, - f"current owner hashes match {baseline.name}; hashes={len(old_hashes)}") + runner.require(f"owner-hash-{recipe}-matches-l46", same_l46, + f"demo-off owner hashes match L46 {baseline.name}; hashes={len(old_hashes)}") class _SplitMix64: @@ -695,15 +707,16 @@ def run_captures_and_mesh_audits(runner: VerificationRunner) -> None: script_inputs=[overview_script, VERIFY_DIR / "capture_quality.py", OUT / "owner-fi-ground-mouth.vfmesh"]) - landmark_script = ROOT / "Standalone/Research/WorldAssemblerM3/Linux46/CaptureLandmarkL46.py" + landmark_script = LINUX47 / "CaptureLandmarkL47.py" landmark_layout = OUT / "layouts" / "landmark-reachability-clang.json" - runner.run_stage("capture-landmark-l46", landmark_script, + runner.run_stage("capture-landmark-l47", landmark_script, ["--layout", str(landmark_layout), "--artifact-dir", str(OUT), - "--capture-dir", str(ROOT / "Standalone/Research/WorldAssemblerM3/Linux46/captures"), + "--capture-dir", str(LINUX47 / "captures"), "--data", str(OWNER)], binary=CLANG, data=OWNER, recipe="surface-world", style=1, layout_path=landmark_layout, env=env_for(capture=True), - script_inputs=[landmark_script, VERIFY_DIR / "capture_quality.py", + script_inputs=[landmark_script, LINUX47 / "MeasureEntranceL47.py", + VERIFY_DIR / "capture_quality.py", LINUX37 / "AuditMouthShapeL37.py", ROOT / "Standalone/Research/WorldAssemblerM3/Linux32/AuditRingTerraceL32.py"]) @@ -777,16 +790,18 @@ def prepare_cost_baseline(runner: VerificationRunner) -> tuple[Path, str]: baseline_commit = resolved.stdout.strip() if not re.fullmatch(r"[0-9a-f]{40,64}", baseline_commit): raise VerificationFailure(f"git returned an invalid baseline commit: {baseline_commit!r}") - temp = Path(f"/tmp/voxelforge-cost-baseline-{baseline_commit[:12]}") + temp = OUT / f"baseline-{baseline_commit}" if temp.exists(): shutil.rmtree(temp) temp.mkdir(parents=True) + atexit.register(shutil.rmtree, temp, ignore_errors=True) tarball = temp / "baseline.tar" archive = bounded_run(["git", "archive", "-o", str(tarball), - baseline_commit, "Standalone"], timeout=120) + baseline_commit, "Standalone/Core", "Standalone/Source", + "Standalone/Compat"], timeout=120) if archive is None or archive.returncode != 0 or not tarball.is_file(): raise VerificationFailure( - f"could not export Standalone from cost baseline commit {baseline_commit}") + f"could not export build inputs from cost baseline commit {baseline_commit}") extract = bounded_run(["tar", "-xf", str(tarball), "-C", str(temp)], timeout=120) if extract is None or extract.returncode != 0: raise VerificationFailure("cost baseline source extraction failed") @@ -794,6 +809,7 @@ def prepare_cost_baseline(runner: VerificationRunner) -> tuple[Path, str]: base = temp / "Standalone" (base / "Tools/verify").mkdir(parents=True, exist_ok=True) + shutil.copy2(ROOT / "Standalone/Build.ps1", base / "Build.ps1") shutil.copy2(ROOT / "Standalone/BuildLinux.sh", base / "BuildLinux.sh") shutil.copy2(VERIFY_DIR / "source_stamp.py", base / "Tools/verify/source_stamp.py") shutil.copy2(ROOT / "Standalone/Source/SourceStamp.h", base / "Source/SourceStamp.h")