diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/CountReachCandidates.cpp b/Standalone/Research/WorldAssemblerM3/Linux129/CountReachCandidates.cpp new file mode 100644 index 0000000..70d1b9b --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/CountReachCandidates.cpp @@ -0,0 +1,294 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct FSegment +{ + int passage=0,index=0; + std::array a{},b{}; + double radiusA=0.0,radiusB=0.0; +}; +struct FTile +{ + int strate=0,x=0,y=0,z=0,lod=0; + std::uint64_t baselineFeatures=0,baselineCandidates=0,baselinePairs=0; +}; +struct FTotals +{ + std::uint64_t tiles=0,featureTiles=0,proofTiles=0,groups=0,segments=0; + std::uint64_t pairs=0,contributingPairs=0,touched=0,support=0; + std::uint64_t overlapPairs=0,crossPassageOverlap=0; + std::uint64_t baselineFeatureTiles=0,baselineFeatures=0,baselineCandidates=0; + std::uint64_t baselinePairs=0; +}; + +static bool Intersects(const std::array& amin, + const std::array& amax,const std::array& bmin, + const std::array& bmax) +{ + for(int axis=0;axis<3;++axis) + if(amax[axis]bmax[axis])return false; + return true; +} + +static int GridFirst(double bound,const double gridMin[3],double spacing,int axis) +{ + const auto boundSub=static_cast(std::floor(bound*1024.0)); + const auto gridMinSub=static_cast(std::llround(gridMin[axis]*1024.0)); + const auto stepSub=static_cast(std::llround(spacing*1024.0)); + const auto numerator=boundSub-gridMinSub; + auto quotient=numerator/stepSub; + if(numerator%stepSub>0)++quotient; + return static_cast(quotient); +} + +static int GridLast(double bound,const double gridMin[3],double spacing,int axis) +{ + const auto boundSub=static_cast(std::ceil(bound*1024.0)); + const auto gridMinSub=static_cast(std::llround(gridMin[axis]*1024.0)); + const auto stepSub=static_cast(std::llround(spacing*1024.0)); + const auto numerator=boundSub-gridMinSub; + auto quotient=numerator/stepSub; + if(numerator%stepSub<0)--quotient; + return static_cast(quotient); +} + +int main(int argc,char** argv) +{ + if(argc!=3) + { + std::cerr<<"usage: CountReachCandidates \n"; + return 2; + } + std::ifstream input(argv[1]); + if(!input){std::cerr<<"cannot open input\n";return 2;} + std::vector> passages(3); + std::vector tiles; + std::string line; + while(std::getline(input,line)) + { + std::istringstream row(line); + char kind=0;row>>kind; + if(kind=='S') + { + FSegment s;row>>s.passage>>s.index + >>s.a[0]>>s.a[1]>>s.a[2]>>s.b[0]>>s.b[1]>>s.b[2] + >>s.radiusA>>s.radiusB; + if(!row||s.passage<0||s.passage>=static_cast(passages.size())) + {std::cerr<<"bad segment row\n";return 2;} + passages[static_cast(s.passage)].push_back(s); + } + else if(kind=='T') + { + FTile t;row>>t.strate>>t.x>>t.y>>t.z>>t.lod + >>t.baselineFeatures>>t.baselineCandidates>>t.baselinePairs; + if(!row){std::cerr<<"bad tile row\n";return 2;} + tiles.push_back(t); + } + else if(kind!='#'&&kind!='\0') + {std::cerr<<"unknown row\n";return 2;} + } + for(auto& p:passages) + std::sort(p.begin(),p.end(),[](const auto& a,const auto& b) + {return a.index reaches={4.0,3.0,2.0,1.5}; + const std::array,2> boundsModes={{{"v225_core_voxel_units",0.25}, + {"physical_metres",1.0}}}; + constexpr double coreVoxelMetres=0.25; + constexpr double marginMetres=0.01; + for(const auto& [boundsMode,boundsScale]:boundsModes) + for(const double reach:reaches) + { + const double requiredReach=std::max(reach+0.21+0.125,0.75+0.21); + std::map,FTotals> totals; + for(const auto& tile:tiles) + { + const int stepVoxels=1< queryMin={gridMin[0],gridMin[1],gridMin[2]}; + const std::array queryMax={gridMax[0],gridMax[1],gridMax[2]}; + const std::array proofMin={tileOrigin[0],tileOrigin[1],tileOrigin[2]}; + const std::array proofMax={tileOrigin[0]+32.0*spacing, + tileOrigin[1]+32.0*spacing,tileOrigin[2]+32.0*spacing}; + + const std::size_t sampleCount=static_cast(dim)*dim*dim; + std::vector> touchedMasks(passages.size(), + std::vector(sampleCount,0)); + std::vector> supportMasks(passages.size(), + std::vector(sampleCount,0)); + std::vector unionMask(sampleCount,0); + FTotals local; + bool anyFeature=false,anyProof=false; + + for(std::size_t p=0;p routeMin={ + std::numeric_limits::infinity(), + std::numeric_limits::infinity(), + std::numeric_limits::infinity()}; + std::array routeMax={ + -std::numeric_limits::infinity(), + -std::numeric_limits::infinity(), + -std::numeric_limits::infinity()}; + double maxRadius=0.0; + for(std::size_t i=begin;i low{},high{}; + int first[3]{},last[3]{}; + bool valid=true; + for(int axis=0;axis<3;++axis) + { + low[axis]=std::min(s.a[axis],s.b[axis])-extent; + high[axis]=std::max(s.a[axis],s.b[axis])+extent; + first[axis]=std::max(0,GridFirst(low[axis],gridMin,spacing,axis)); + last[axis]=std::min(dim-1,GridLast(high[axis],gridMin,spacing,axis)); + valid=valid&&first[axis]<=last[axis]; + } + // Proof bounds are per segment and include the same conservative + // reach; they test the full tile box without the sample halo. + if(Intersects(low,high,proofMin,proofMax))anyProof=true; + if(!valid)continue; + ++local.segments; + for(int axis=0;axis<3;++axis) + { + const auto subLo=static_cast(std::floor(low[axis]*1024.0)); + const auto subHi=static_cast(std::ceil(high[axis]*1024.0)); + const auto gridLo=static_cast(std::llround(gridMin[axis]*1024.0)); + const auto subStep=static_cast(std::llround(spacing*1024.0)); + const auto expectedFirst=std::max(0, + (subLo-gridLo+subStep-1)/subStep); + const auto expectedLast=std::min(dim-1, + (subHi-gridLo)/subStep); + first[axis]=static_cast(expectedFirst); + last[axis]=static_cast(expectedLast); + } + if(first[0]>last[0]||first[1]>last[1]||first[2]>last[2])continue; + const std::uint64_t nx=static_cast(last[0]-first[0]+1); + const std::uint64_t ny=static_cast(last[1]-first[1]+1); + const std::uint64_t nz=static_cast(last[2]-first[2]+1); + local.pairs+=nx*ny*nz; + + for(int gz=first[2];gz<=last[2];++gz) + for(int gy=first[1];gy<=last[1];++gy) + for(int gx=first[0];gx<=last[0];++gx) + { + const double q[3]={gridMin[0]+gx*spacing, + gridMin[1]+gy*spacing,gridMin[2]+gz*spacing}; + const double dx=s.b[0]-s.a[0],dy=s.b[1]-s.a[1],dz=s.b[2]-s.a[2]; + const double lengthSq=dx*dx+dy*dy+dz*dz; + if(!(lengthSq>0.0))continue; + const double projection=(q[0]-s.a[0])*dx+(q[1]-s.a[1])*dy + +(q[2]-s.a[2])*dz; + const double t=std::clamp(projection/lengthSq,0.0,1.0); + const double ex=q[0]-(s.a[0]+t*dx); + const double ey=q[1]-(s.a[1]+t*dy); + const double ez=q[2]-(s.a[2]+t*dz); + const double radius=s.radiusA+t*(s.radiusB-s.radiusA); + const double distance=std::sqrt(ex*ex+ey*ey+ez*ez)-radius; + const double oneSubvoxel=1.0/1024.0; + if(distance(gz)*dim+gy)*dim+gx; + touchedMasks[p][index]=1; + unionMask[index]=1; + if(distance<=reach)supportMasks[p][index]=1; + } + } + } + } + } + local.tiles=1; + local.featureTiles=anyFeature?1:0; + local.proofTiles=anyProof?1:0; + local.baselineFeatureTiles=tile.baselineFeatures?1:0; + local.baselineFeatures=tile.baselineFeatures; + local.baselineCandidates=tile.baselineCandidates; + local.baselinePairs=tile.baselinePairs; + for(const auto& mask:touchedMasks) + local.touched+=static_cast( + std::count(mask.begin(),mask.end(),static_cast(1))); + for(std::size_t p=0;p( + std::count(mask.begin(),mask.end(),static_cast(1))); + } + const std::uint64_t unique=static_cast( + std::count(unionMask.begin(),unionMask.end(),static_cast(1))); + local.crossPassageOverlap=local.touched-unique; + local.overlapPairs=local.contributingPairs-local.touched; + auto& total=totals[{tile.strate,tile.lod}]; + total.tiles+=local.tiles;total.featureTiles+=local.featureTiles; + total.proofTiles+=local.proofTiles;total.groups+=local.groups; + total.segments+=local.segments;total.pairs+=local.pairs; + total.contributingPairs+=local.contributingPairs;total.touched+=local.touched; + total.support+=local.support;total.overlapPairs+=local.overlapPairs; + total.crossPassageOverlap+=local.crossPassageOverlap; + total.baselineFeatureTiles+=local.baselineFeatureTiles; + total.baselineFeatures+=local.baselineFeatures; + total.baselineCandidates+=local.baselineCandidates; + total.baselinePairs+=local.baselinePairs; + } + for(const auto& [key,t]:totals) + output< float: + dx, dy = (b[0] - a[0]) / units_per_metre, (b[1] - a[1]) / units_per_metre + return max(1.0e-6, math.sqrt(math.sqrt(dx * dx + dy * dy))) + + +def evaluate_raw(controls: list[list[float]], span: int, t: float, + units_per_metre: float) -> list[float]: + p1, p2 = controls[span], controls[span + 1] + p0, p3 = controls[max(0, span - 1)], controls[min(span + 2, len(controls) - 1)] + dt0, dt1, dt2 = (knot_span(p0, p1, units_per_metre), + knot_span(p1, p2, units_per_metre), + knot_span(p2, p3, units_per_metre)) + t2, t3 = t * t, t * t * t + result = [0.0, 0.0, 0.0, 0.0] + for axis in (0, 1, 3): + m1 = dt1 * ((p1[axis] - p0[axis]) / dt0 + - (p2[axis] - p0[axis]) / (dt0 + dt1) + + (p2[axis] - p1[axis]) / dt1) + m2 = dt1 * ((p2[axis] - p1[axis]) / dt1 + - (p3[axis] - p1[axis]) / (dt1 + dt2) + + (p3[axis] - p2[axis]) / dt2) + result[axis] = ((2.0 * t3 - 3.0 * t2 + 1.0) * p1[axis] + + (-2.0 * t3 + 3.0 * t2) * p2[axis] + + (t3 - 2.0 * t2 + t) * m1 + + (t3 - t2) * m2) + result[2] = p1[2] + (p2[2] - p1[2]) * t + result[3] = min(max(result[3], min(p1[3], p2[3])), max(p1[3], p2[3])) + return result + + +def build_raw_segments(controls: list[list[float]], units_per_metre: float, + spacing_metres: float = 8.0, + chord_error_metres: float = 0.1) -> list[dict]: + result: list[dict] = [] + along_metres = 0.0 + for span in range(len(controls) - 1): + horizontal_arc = [0.0] * 33 + previous = evaluate_raw(controls, span, 0.0, units_per_metre) + for step in range(1, 33): + current = evaluate_raw(controls, span, step / 32.0, units_per_metre) + dx = (current[0] - previous[0]) / units_per_metre + dy = (current[1] - previous[1]) / units_per_metre + horizontal_arc[step] = horizontal_arc[step - 1] + math.hypot(dx, dy) + previous = current + span_length = horizontal_arc[-1] + base_count = max(1, math.ceil(span_length / spacing_metres)) + + def parameter_at_arc(target: float) -> float: + upper = 1 + while upper < len(horizontal_arc) and horizontal_arc[upper] < target: + upper += 1 + upper = min(upper, 32) + lower = upper - 1 + arc_span = horizontal_arc[upper] - horizontal_arc[lower] + arc_t = ((target - horizontal_arc[lower]) / arc_span + if arc_span > 1.0e-12 else 0.0) + return (lower + min(max(arc_t, 0.0), 1.0)) / 32.0 + + parameters = [0.0] + + def append_adaptive(t_a: float, t_b: float, a: list[float], b: list[float], + depth: int) -> None: + fractions = (0.25, 0.5, 0.75) + maximum_error, polyline_length = 0.0, 0.0 + previous_point = a + for fraction in fractions: + current = evaluate_raw(controls, span, t_a + (t_b - t_a) * fraction, + units_per_metre) + dx = (current[0] - (a[0] + (b[0] - a[0]) * fraction)) / units_per_metre + dy = (current[1] - (a[1] + (b[1] - a[1]) * fraction)) / units_per_metre + dr = (current[3] - (a[3] + (b[3] - a[3]) * fraction)) / units_per_metre + maximum_error = max(maximum_error, math.sqrt(dx * dx + dy * dy + dr * dr)) + sx = (current[0] - previous_point[0]) / units_per_metre + sy = (current[1] - previous_point[1]) / units_per_metre + polyline_length += math.hypot(sx, sy) + previous_point = current + sx = (b[0] - previous_point[0]) / units_per_metre + sy = (b[1] - previous_point[1]) / units_per_metre + polyline_length += math.hypot(sx, sy) + split = ((polyline_length > spacing_metres * (1.0 + 1.0e-9) + or maximum_error > chord_error_metres) and depth < 12) + if split: + t_mid = (t_a + t_b) * 0.5 + middle = evaluate_raw(controls, span, t_mid, units_per_metre) + append_adaptive(t_a, t_mid, a, middle, depth + 1) + append_adaptive(t_mid, t_b, middle, b, depth + 1) + else: + parameters.append(t_b) + + for segment in range(1, base_count + 1): + target_a = span_length * (segment - 1) / base_count + target_b = span_length * segment / base_count + t_a, t_b = parameter_at_arc(target_a), parameter_at_arc(target_b) + append_adaptive(t_a, t_b, + evaluate_raw(controls, span, t_a, units_per_metre), + evaluate_raw(controls, span, t_b, units_per_metre), 0) + + points = [evaluate_raw(controls, span, t, units_per_metre) for t in parameters] + sampled_arc = [0.0] * len(points) + for index in range(1, len(points)): + dx = (points[index][0] - points[index - 1][0]) / units_per_metre + dy = (points[index][1] - points[index - 1][1]) / units_per_metre + sampled_arc[index] = sampled_arc[index - 1] + math.hypot(dx, dy) + sampled_span_length = sampled_arc[-1] + for index, point in enumerate(points): + progress = (sampled_arc[index] / sampled_span_length + if sampled_span_length > 1.0e-12 else parameters[index]) + point[2] = controls[span][2] + (controls[span + 1][2] - controls[span][2]) * progress + + for index in range(1, len(points)): + dx = (points[index][0] - points[index - 1][0]) / units_per_metre + dy = (points[index][1] - points[index - 1][1]) / units_per_metre + dz = (points[index][2] - points[index - 1][2]) / units_per_metre + length = math.sqrt(dx * dx + dy * dy + dz * dz) + progress_a = (sampled_arc[index - 1] / sampled_span_length + if sampled_span_length > 1.0e-12 else parameters[index - 1]) + progress_b = (sampled_arc[index] / sampled_span_length + if sampled_span_length > 1.0e-12 else parameters[index]) + floor_a = controls[span][2] - controls[span][3] + floor_b = controls[span + 1][2] - controls[span + 1][3] + result.append({"a": points[index - 1], "b": points[index], + "along": along_metres, "length": length, "span": span, + "floor_a": floor_a + (floor_b - floor_a) * progress_a, + "floor_b": floor_a + (floor_b - floor_a) * progress_b}) + along_metres += length + return result + + +def closest_route_height(route: list[list[float]], x: float, y: float) -> tuple[float, float]: + best_height, best_distance_sq = 0.0, float("inf") + for a, b in zip(route, route[1:]): + dx, dy = b[0] - a[0], b[1] - a[1] + length_sq = dx * dx + dy * dy + t = min(max(((x - a[0]) * dx + (y - a[1]) * dy) / length_sq, 0.0), 1.0) \ + if length_sq > 1.0e-12 else 0.0 + px, py = a[0] + t * dx, a[1] + t * dy + distance_sq = (x - px) ** 2 + (y - py) ** 2 + if distance_sq < best_distance_sq: + best_distance_sq = distance_sq + best_height = a[2] + (b[2] - a[2]) * t + return best_height, best_distance_sq + + +def prepared_segments(layout: dict) -> list[list[dict]]: + qpm = SUBVOXELS_PER_METRE + strata = {item["strate_index"]: item for item in layout["strates"]} + all_passages: list[list[dict]] = [] + for passage in layout["passages"]: + controls_q = [[float(value) for value in point["position_q"]] + + [float(point["radius_q"])] for point in passage["control_points"]] + controls = [point.copy() for point in controls_q] + upper_mouth = [value / qpm for value in passage["upper_mouth_q"]] + upper_depth = max(0.0, (controls[0][2] / qpm) - upper_mouth[2] + 1.13) + upper_stratum = strata.get(passage["upper_strate_index"], {}) + if upper_stratum.get("generator_kind") == "FloatingIslands": + route = [] + for anchor in upper_stratum.get("anchors", []): + if anchor.get("kind") == "route_point" and len(anchor.get("values", [])) >= 3: + route.append([value / qpm for value in anchor["values"][:3]]) + if route: + route_height, distance_sq = closest_route_height( + route, controls[0][0] / qpm, controls[0][1] / qpm) + if distance_sq <= (controls[0][3] / qpm + 2.0) ** 2: + upper_depth = max(upper_depth, + controls[0][2] / qpm - route_height + 1.13) + controls[0][3] = max(controls[0][3], upper_depth * qpm) + + lower_mouth = [value for value in passage["lower_mouth_q"]] + player_center_q = round(1.13 * qpm) + route_end = len(controls) - 1 + for index in range(1, len(controls_q)): + p = controls_q[index] + if (int(p[0]) == lower_mouth[0] and int(p[1]) == lower_mouth[1] + and int(p[2] - p[3] + player_center_q) == lower_mouth[2]): + route_end = index + + raw = build_raw_segments(controls, qpm) + total_path = 0.0 + for segment in raw: + if segment["span"] + 1 == route_end: + total_path = segment["along"] + segment["length"] + radii = [(0.0, controls[0][3] / qpm)] + for segment in raw: + if segment["span"] < route_end: + radii.append((segment["along"] + segment["length"], + segment["b"][3] / qpm)) + body_radii = [radius for along, radius in radii + if along >= 10.0 and total_path - along >= 10.0] + minimum_body = min(body_radii) if body_radii else min(radius for _, radius in radii) + floor_depth = max(0.5, minimum_body - 0.23) + + prepared = [] + for segment in raw: + route_segment = segment["span"] < route_end + along_b = segment["along"] + segment["length"] + + def effective_z(raw_z: float, radius: float, planned_floor: float, + along: float) -> float: + raw_z /= qpm + radius /= qpm + planned_floor /= qpm + local_depth = min(floor_depth, max(0.0, radius - 0.23)) + if route_segment or abs(along - total_path) <= 1.0e-9: + return planned_floor + local_depth + route_depth = max(0.0, radius - 0.23) + return raw_z - route_depth + local_depth + + a = [segment["a"][0] / qpm, segment["a"][1] / qpm, + effective_z(segment["a"][2], segment["a"][3], + segment["floor_a"], segment["along"])] + b = [segment["b"][0] / qpm, segment["b"][1] / qpm, + effective_z(segment["b"][2], segment["b"][3], + segment["floor_b"], along_b)] + prepared.append({"a": a, "b": b, "radius_a": segment["a"][3] / qpm, + "radius_b": segment["b"][3] / qpm}) + all_passages.append(prepared) + return all_passages + + +def profile_tiles() -> list[tuple[int, int, int, int, int, int, int, int]]: + result = [] + for strate, path in enumerate(BASELINE_LOGS): + if not path.is_file(): + raise SystemExit(f"missing baseline profile: {path}") + seen = set() + for line in path.read_text(encoding="utf-8", errors="replace").splitlines(): + if not line.startswith("[PassageComposerTile] "): + continue + row = dict(PROFILE.findall(line)) + match = TILE_KEY.search(row.get("key", "")) + if not match: + continue + x, y, z, lod = map(int, match.groups()) + if lod > 2: + continue + key = (x, y, z, lod) + if key in seen: + continue + seen.add(key) + result.append((strate, x, y, z, lod, int(row.get("features", 0)), + int(row.get("route_candidates", 0)), + int(row.get("sweep_pairs", 0)))) + return result + + +def main() -> int: + if not LAYOUT.is_file(): + raise SystemExit(f"missing resolved layout: {LAYOUT}") + OUT.mkdir(parents=True, exist_ok=True) + layout = json.loads(LAYOUT.read_text(encoding="utf-8")) + passages = prepared_segments(layout) + tiles = profile_tiles() + input_path = OUT / "reach-input.tsv" + with input_path.open("w", encoding="utf-8") as output: + for passage_index, segments in enumerate(passages): + for segment_index, segment in enumerate(segments): + values = [*segment["a"], *segment["b"], + segment["radius_a"], segment["radius_b"]] + output.write("S {} {} {}\n".format(passage_index, segment_index, + " ".join(f"{value:.15g}" for value in values))) + for tile in tiles: + output.write("T {}\n".format(" ".join(str(value) for value in tile))) + + binary = OUT / "CountReachCandidates" + compile_log = OUT / "compile.log" + with compile_log.open("w", encoding="utf-8") as log: + built = subprocess.run(["g++", "-std=c++20", "-O3", "-DNDEBUG", + str(HERE / "CountReachCandidates.cpp"), "-o", str(binary)], + cwd=ROOT, stdout=log, stderr=subprocess.STDOUT, + check=False) + if built.returncode: + raise SystemExit(f"counter compile failed: {compile_log}") + result_path = OUT / "results.csv" + run_log = OUT / "counter.log" + command = ["taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + str(binary), str(input_path), str(result_path)] + with run_log.open("w", encoding="utf-8") as log: + result = subprocess.run(command, cwd=ROOT, stdout=log, stderr=subprocess.STDOUT, + check=False, timeout=1740) + if result.returncode: + raise SystemExit(f"counter failed: {run_log}; exit={result.returncode}") + print(f"[L129Precount] segments={[len(x) for x in passages]} " + f"profile_tiles={len(tiles)} input={input_path.relative_to(ROOT)} " + f"results={result_path.relative_to(ROOT)}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/REPORT.md b/Standalone/Research/WorldAssemblerM3/Linux129/REPORT.md new file mode 100644 index 0000000..9bd3fb0 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/REPORT.md @@ -0,0 +1,54 @@ +# L129 — tunnel reach + +**Decision: no-go for performance.** The 2 m candidate passed the geometry checks, but it was slower than both timing references and failed every UE movement comparison. The count pass also found a units mismatch in v225's reach bounds, so the requested physical reach cannot be cut cheaply against the source as it stands. + +## What the reach includes + +The 4.0 m term is the signed-distance influence cutoff outside the bore. The bound adds 0.21 m for wall relief and reserves 0.125 m for the 0.50 m smooth corner (`width/6` is about 0.083 m). The plain shell is 0.75 m thick, so its minimum reach with relief is 0.96 m. The larger term wins: `r + max(R + 0.21 + 0.125, 0.75 + 0.21) + 0.05 m`. At `R=4 m` and the maximum `r=3.5 m`, that is 7.885 m. + +The mouth blend is 5 m **along the route**, not an added radial reach. The open-air half-pipe's side wall is 1 m high; its rounded crest uses the same reach. L129 leaves the 0.75 m shell rule, smooth floor `h(s)`, rounded crest, and grade limit unchanged. The highest audited grade was 10.695°. + +## Counts before the build + +Counts cover the four owner strata at LOD0–2, with 993 route segments. “Pairs” are route-segment/sample checks; “support” is unique per-passage samples inside the distance cutoff. The v225 model's 29.87M pairs is close to the measured source profile's 29.41M. + +| Reach and bounds | Pairs (M) | Support samples (M) | Overlap pairs (M) | Feature / proof-active tiles | +|---|---:|---:|---:|---:| +| v225 as coded, nominal 4 m | 29.87 | 8.57 | 20.90 | 721 / 677 | +| 4 m, physical bounds | 124.97 | 11.72 | 46.64 | 826 / 791 | +| 3 m, physical bounds | 87.06 | 8.84 | 30.42 | 787 / 764 | +| 2 m, physical bounds | 56.86 | 6.32 | 18.48 | 755 / 729 | +| 1.5 m, physical bounds | 44.74 | 5.21 | 13.93 | 743 / 718 | + +Against a correctly bounded 4 m model, 2 m removes 54.5% of pairs and 60.4% of overlap pairs; 71 feature tiles and 62 proof-active tiles become free. Against the v225-as-coded count model, however, physical 2 m adds 90.3% of raw pairs and leaves 34 more feature tiles and 52 more proof-active tiles. Physical 1.5 m still adds 49.8% of pairs and leaves 22 more feature tiles and 41 more proof-active tiles. So the smaller reach does **not** unlock proofs or tile skips versus the shipped source. + +The cause is in `BuildPassageSpatialIndices`: positions are converted to core voxels before the reach is added, but v225 adds the metre value directly. At 0.25 m per core voxel, the nominal 4.335 m bound is only 1.084 m per axis; the sweep cutoff itself remains 4 m. L129 converts the smaller physical bounds to core voxels. That makes its broadphase boxes larger than v225's, even though its actual influence cutoff is smaller. The extra segment/sample checks erase the predicted saving. The 2 m setting was selected from the pre-build counts and is the only reach fully timed. + +## Timing and quality + +Five interleaved L80 runs per W8/W12 cell were completed on a quiet machine (load 0.71, CPU idle 97.3%). L125 is the `b96dd73` source. Every near-ready cell and every whole-view cell was slower than L109 and b96dd73: + +| Stratum / workers | Near vs L109 / base | Whole view vs L109 / base | +|---|---:|---:| +| S0 W8 | +11.1% / +9.3% | +7.5% / +7.2% | +| S0 W12 | +11.2% / +6.6% | +5.5% / +3.3% | +| S1 W8 | +16.7% / +7.8% | +8.7% / +5.3% | +| S1 W12 | +17.9% / +9.9% | +9.5% / +5.6% | +| S2 W8 | +12.8% / +8.4% | +5.3% / +5.2% | +| S2 W12 | +17.1% / +9.1% | +10.3% / +5.7% | +| S3 W8 | +13.4% / +4.9% | +6.3% / +2.8% | +| S3 W12 | +18.2% / +6.9% | +8.9% / +4.2% | + +Five UE runs at 30 m/s also missed the b96dd73 gate: near coverage 38.05% vs 40.22% (−2.17 points), far holes 4.03% vs 3.46% (+0.58 points), tick p99 11.54 vs 10.80 ms (+0.74 ms), and worst tick 14.12 vs 13.27 ms (+0.85 ms). The Linux UE host build passed after timing with `-NoUBA -MaxParallelActions=4`; Unreal was not run under `prlimit`. + +Fast verification passed (259 checks; 5 historical diagnostics), walkability passed at 21,425/21,425, all three passage grades stayed below 15°, and the seam audit passed 4 joins / 4,900 samples with no mismatches. Clang and GCC hashes matched for W1/W8/W12 across all three tested owner layouts (18 cases). Evaluator version 226 and three canonical owner hash baselines were added. + +The 23 L125 pose captures and six paired mouth close-ups are verified. All before/after PNGs are pixel-identical; these views show no visible change. The floor probe peaked at 7.9 mm, above a strict “few millimetres” reading. + +## Captures and records + +- [L125 poses: before / L129 comparison](captures/COMPARE.html) +- [Mouth close-ups: before / L129 comparison](captures/L129-mouth/COMPARE.html) +- [L80 timing results](../../../../Saved/Linux/l129/timing/summary.json) +- [UE movement results](../../../../Saved/Linux/l129/movement/summary.json) +- [Pre-build count results](../../../../Saved/Linux/l129/precount/results.csv) diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/RunL129Captures.py b/Standalone/Research/WorldAssemblerM3/Linux129/RunL129Captures.py new file mode 100644 index 0000000..9a55007 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/RunL129Captures.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +"""Render the 23 L125 camera poses with the L129 candidate.""" +from __future__ import annotations + +import importlib.util +import json +import math +import os +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +RESEARCH = Path(__file__).resolve().parent +CAPTURES = RESEARCH / "captures" +SAVED = ROOT / "Saved/Linux/l129/captures" +BASELINE_INDEX = (ROOT / "Standalone/Research/WorldAssemblerM3/Linux125" + / "captures/L125/capture-index.json") +LAYOUT = ROOT / "Saved/Linux/l129/hashes/owner4-surface-world-w12-clang.layout.json" +CLANG = ROOT / os.environ.get("L129_CAPTURE_CLANG", + "Saved/Linux/l129/bin/VoxelForgeCoreHeadless-l129-clang") +RENDERER = ROOT / os.environ.get("L129_CAPTURE_RENDERER", + "Saved/Linux/l129/bin/VoxelForgeOffscreenCapture-l129-clang") +HELPER_PATH = ROOT / "Standalone/Research/WorldAssemblerM3/Linux113/RunL113Captures.py" + +SPEC = importlib.util.spec_from_file_location("l113_capture_helpers", HELPER_PATH) +if SPEC is None or SPEC.loader is None: + raise SystemExit("cannot load the verified L113 capture helpers") +HELPERS = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(HELPERS) +HELPERS.RESEARCH = RESEARCH +HELPERS.CAPTURES = CAPTURES +HELPERS.SAVED = SAVED +HELPERS.BINARIES = {"L129": CLANG} +HELPERS.RENDERERS = {"L129": RENDERER} + + +def main() -> int: + if any(not path.is_file() for path in (BASELINE_INDEX, LAYOUT, CLANG, RENDERER)): + raise SystemExit("missing L125 camera set, L129 layout, or capture binary") + baseline = json.loads(BASELINE_INDEX.read_text(encoding="utf-8")) + layout = json.loads(LAYOUT.read_text(encoding="utf-8")) + rows = [] + CAPTURES.mkdir(parents=True, exist_ok=True) + SAVED.mkdir(parents=True, exist_ok=True) + for view in baseline["captures"]: + row = HELPERS.capture("L129", view, layout) + row["variant"] = "L129-v226" + if view["kind"] == "rock-floor-close": + scene = ROOT / row["scene"] + anchor = HELPERS.nearest_surface_anchor(scene, view["target"], margin_m=5.0, + preferred_normal=(0.0, 0.0, 1.0), minimum_alignment=0.85) + alignment = HELPERS.dot(anchor["normal"], (0.0, 0.0, 1.0)) + camera_distance = math.dist(row["camera_actual_m"], anchor["position_m"]) + row.update({"floor_anchor_position_m": anchor["position_m"], + "floor_anchor_normal": anchor["normal"], + "closeup_camera_to_floor_distance_m": camera_distance, + "closeup_floor_normal_alignment": alignment, + "verified_upward_floor_normal": alignment >= 0.85}) + if (not row["verified"] or not 2.0 <= camera_distance <= 3.2 + or anchor["distance_m"] > 0.25 or alignment < 0.85 + or row["drawn_triangles"] <= 0 + or row["pixel_quality_status"] not in + ("pass", "low_contrast_geometry_visible")): + raise RuntimeError(f"L129 floor close-up failed at {view['name']}") + rows.append(row) + if len(rows) != len(baseline["captures"]) or len(rows) != 23: + raise RuntimeError(f"expected all 23 L125 views, captured {len(rows)}") + index = CAPTURES / "L129" / "capture-index.json" + index.parent.mkdir(parents=True, exist_ok=True) + index.write_text(json.dumps({"captures": rows}, indent=2) + "\n", + encoding="utf-8") + + html = ["", + "L125 / L129 tunnel capture comparison", + "", "

L125 / L129 v226: identical views

"] + old_by_name = {Path(row["capture"]).name: row for row in baseline["captures"]} + for row in rows: + name = Path(row["capture"]).name + old = old_by_name[name] + old_path = os.path.relpath(ROOT / "Standalone/Research/WorldAssemblerM3/Linux125" + / old["capture"], CAPTURES) + new_path = os.path.relpath(RESEARCH / row["capture"], CAPTURES) + html.extend(["
", f"

{row['passage']} — {row['station']}

", + f"

{row['kind']} · L125 {old['pixel_quality_status']} · " + f"L129 {row['pixel_quality_status']}

", "
", + f"
L125
", + f"
L129 v226
", + "
", "
"]) + (CAPTURES / "COMPARE.html").write_text("\n".join(html) + "\n", encoding="utf-8") + print(f"[L129Captures] rendered={len(rows)} views index={index.relative_to(ROOT)}", + flush=True) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/RunL129DensityProbe.py b/Standalone/Research/WorldAssemblerM3/Linux129/RunL129DensityProbe.py new file mode 100644 index 0000000..b860eae --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/RunL129DensityProbe.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +"""Probe reconstructed tunnel floor roots at the nine L119 stations.""" +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 / os.environ.get("L129_PROBE_DIR", "Saved/Linux/l129/density-probe") +BINARY = ROOT / os.environ.get("L129_PROBE_BINARY", + "Saved/Linux/l129/bin/VoxelForgeCoreHeadless-l129-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, layout = OUT / "owner4-clang.log", 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"density probe failed: {log}; exit={result.returncode}") + 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("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"[L129DensityProbe] 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/Linux129/RunL129HashMatrix.py b/Standalone/Research/WorldAssemblerM3/Linux129/RunL129HashMatrix.py new file mode 100644 index 0000000..80ecbc8 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/RunL129HashMatrix.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +"""Check Clang/GCC W1/W8/W12 hashes and compare the candidate with L119.""" +from __future__ import annotations + +import json +import os +import re +import subprocess +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / os.environ.get("L129_HASH_DIR", "Saved/Linux/l129/hashes") +DATASETS = { + "owner4": ROOT / "Standalone/data/owner_world.json", + "owner2": ROOT / "Standalone/data/regression/owner_world_2strate_l61.json", +} +BINARIES = { + "clang": ROOT / os.environ.get("L129_HASH_CLANG", + "Saved/Linux/l129/bin/VoxelForgeCoreHeadless-l129-clang"), + "gcc": ROOT / os.environ.get("L129_HASH_GCC", + "Saved/Linux/l129/bin/VoxelForgeCoreHeadless-l129-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("[L129HashRun] " + 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 L129 hash input") + previous_path = ROOT / "Saved/Linux/l119/hashes/summary.json" + previous_doc = json.loads(previous_path.read_text(encoding="utf-8")) + previous = {(row["dataset"], row["recipe"], row["workers"], row["compiler"]): row + for row in previous_doc["runs"]} + 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"] + stable = all(row["hashes"] == reference for row in group) + old = previous[(dataset, recipe, 12, "clang")]["hashes"] + groups[key] = { + "all_worker_compiler_hashes_match": stable, + "matches_l119_v224": next(row for row in group + if row["workers"] == 12 and row["compiler"] == "clang")["hashes"] == old, + "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 stable: + raise SystemExit(f"determinism mismatch: {key}") + summary = {"runs": rows, "groups": groups} + (OUT / "summary.json").write_text(json.dumps(summary, indent=2) + "\n", + encoding="utf-8") + baseline_dir = ROOT / "Standalone/Tools/verify/baselines/owner-hash/canonical" + for dataset, recipe, style, baseline_name in ( + ("owner4", "surface-world", 1, + "owner-hash-owner4-surface-world-style1-v226.baseline"), + ("owner2", "surface-world", 1, + "owner-hash-surface-world-style1-v226.baseline"), + ("owner2", "floating-islands", 2, + "owner-hash-floating-islands-style2-v226.baseline"), + ): + canonical = next(row for row in rows if row["dataset"] == dataset + and row["recipe"] == recipe and row["workers"] == 12 + and row["compiler"] == "clang") + baseline = baseline_dir / baseline_name + baseline.write_text("\n".join(canonical["hashes"]) + "\n", + encoding="utf-8") + print("[L129HashSummary] " + json.dumps(groups, sort_keys=True), flush=True) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/RunL129MouthCaptures.py b/Standalone/Research/WorldAssemblerM3/Linux129/RunL129MouthCaptures.py new file mode 100644 index 0000000..7c471a8 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/RunL129MouthCaptures.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +"""Render matching baseline and L129 close views of each tunnel mouth.""" +from __future__ import annotations + +import hashlib +import importlib.util +import json +import os +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +RESEARCH = Path(__file__).resolve().parent +CAPTURES = RESEARCH / "captures/L129-mouth" +SAVED = ROOT / "Saved/Linux/l129/captures/mouth-closeups" +BASE_LAYOUT = ROOT / "Saved/Linux/l125/hashes/owner4-surface-world-w12-clang.layout.json" +AFTER_LAYOUT = ROOT / "Saved/Linux/l129/hashes/owner4-surface-world-w12-clang.layout.json" +HELPER_PATH = ROOT / "Standalone/Research/WorldAssemblerM3/Linux113/RunL113Captures.py" + +SPEC = importlib.util.spec_from_file_location("l113_capture_helpers", HELPER_PATH) +if SPEC is None or SPEC.loader is None: + raise SystemExit("cannot load verified capture helpers") +HELPERS = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(HELPERS) + +HELPERS.RESEARCH = RESEARCH +HELPERS.CAPTURES = CAPTURES +HELPERS.SAVED = SAVED +HELPERS.BINARIES = { + "before": ROOT / "Saved/Linux/l125/bin/VoxelForgeCoreHeadless-l125-clang", + "after": ROOT / "Saved/Linux/l129/bin/VoxelForgeCoreHeadless-l129-clang", +} +HELPERS.RENDERERS = { + "before": ROOT / "Saved/Linux/l125/bin/VoxelForgeOffscreenCapture-l125-clang", + "after": ROOT / "Saved/Linux/l129/bin/VoxelForgeOffscreenCapture-l129-clang", +} + + +def main() -> int: + required = [BASE_LAYOUT, AFTER_LAYOUT, *HELPERS.BINARIES.values(), + *HELPERS.RENDERERS.values()] + if any(not path.is_file() for path in required): + raise SystemExit("missing baseline/candidate layout or capture binary") + before_layout = json.loads(BASE_LAYOUT.read_text(encoding="utf-8")) + after_layout = json.loads(AFTER_LAYOUT.read_text(encoding="utf-8")) + if before_layout["passages"] != after_layout["passages"]: + raise RuntimeError("baseline and candidate passage routes differ") + + views = [view for view in HELPERS.make_views(before_layout, [], + use_derived_shape=True, use_spline=True, include_open_air=False) + if view["kind"] == "mouth"] + if len(views) != 2 * len(before_layout["passages"]): + raise RuntimeError("unexpected mouth camera count") + + rows = [] + CAPTURES.mkdir(parents=True, exist_ok=True) + SAVED.mkdir(parents=True, exist_ok=True) + for view in views: + for variant, layout in (("before", before_layout), ("after", after_layout)): + row = HELPERS.capture(variant, view, layout) + row["variant"] = "L125-v225" if variant == "before" else "L129-v226" + row["view"] = view["name"] + image = ROOT / "Standalone/Research/WorldAssemblerM3/Linux129" / row["capture"] + row["image_sha256"] = hashlib.sha256(image.read_bytes()).hexdigest() + rows.append(row) + + index = CAPTURES / "capture-index.json" + index.write_text(json.dumps({"captures": rows}, indent=2) + "\n", encoding="utf-8") + old_rows = {row["view"]: row for row in rows if row["variant"] == "L125-v225"} + new_rows = {row["view"]: row for row in rows if row["variant"] == "L129-v226"} + html = ["", + "L125 / L129 mouth close-ups", + "", + "

L125 v225 / L129 v226 tunnel mouths

"] + for name in old_rows: + old, new = old_rows[name], new_rows[name] + old_path = os.path.relpath(RESEARCH / old["capture"], CAPTURES) + new_path = os.path.relpath(RESEARCH / new["capture"], CAPTURES) + equality = "pixel-identical" if old["image_sha256"] == new["image_sha256"] else "pixels differ" + html.extend(["
", f"

{old['passage']} — {old['station']}

", + f"

{equality}; {old['pixel_quality_status']} / {new['pixel_quality_status']}

", + "
", f"
L125 v225
", + f"
L129 v226
", + "
", "
"]) + (CAPTURES / "COMPARE.html").write_text("\n".join(html) + "\n", encoding="utf-8") + print(f"[L129MouthCaptures] views={len(views)} paired={len(rows)//2} " + f"index={index.relative_to(ROOT)}", flush=True) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/RunL129Timing.py b/Standalone/Research/WorldAssemblerM3/Linux129/RunL129Timing.py new file mode 100644 index 0000000..ccfb208 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/RunL129Timing.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +"""Five interleaved L80 readiness runs for L109, L125 and L129.""" +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 / os.environ.get("L129_TIMING_DIR", "Saved/Linux/l129/timing") +DATA = ROOT / "Standalone/data/owner_world.json" +BINARIES = { + "L109": ROOT / "Saved/Linux/l109/bin-final/VoxelForgeCoreHeadless-l109-clang", + "L125": ROOT / "Saved/Linux/l125/bin/VoxelForgeCoreHeadless-l125-clang", + "L129": ROOT / os.environ.get("L129_CANDIDATE_BINARY", + "Saved/Linux/l129/bin/VoxelForgeCoreHeadless-l129-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, near_match = PIPELINE.search(content), NEAR.search(content) + if result.returncode or pipeline_match is None or near_match is None: + raise SystemExit(f"readiness run failed or incomplete: {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("[L129TimingRun] " + 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) + before_total, before_idle = totals() + time.sleep(interval_s) + after_total, after_idle = totals() + return 100.0 * (after_idle-before_idle) / max(1, after_total-before_total) + + +def main() -> int: + if not DATA.is_file() or any(not binary.is_file() for binary in BINARIES.values()): + raise SystemExit("missing L109/L125/L129 timing input") + OUT.mkdir(parents=True, exist_ok=True) + load_1m, idle_pct = os.getloadavg()[0], 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"[L129TimingGate] load_1m={load_1m:.2f} cpu_idle_2s={idle_pct:.1f}%", + 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", "L125", "L129") + 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", "L125"): + for key in ("lod02_ready_s", "whole_view_ready_s"): + item[f"L129_vs_{comparison}_{key}_delta_pct"] = round( + 100.0 * (medians["L129"][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/Linux129/RunL129UEMovement.py b/Standalone/Research/WorldAssemblerM3/Linux129/RunL129UEMovement.py new file mode 100644 index 0000000..891f74b --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/RunL129UEMovement.py @@ -0,0 +1,257 @@ +#!/usr/bin/env python3 +"""Five 30 m/s UE runs for the L129 tunnel reach candidate.""" +from __future__ import annotations + +import argparse +import json +import math +import statistics +import subprocess +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[4] +HOST = Path("/home/jahni/VFHost") +EDITOR = Path("/home/jahni/UnrealEngine/Engine/Binaries/Linux/UnrealEditor-Cmd") +SPAWN_TN_M = (19.166015625, -14.2001953125, -753.3740234375) +SPAWN_FI_M = (25.8369140625, 3.19921875, -737.0) + + +def percentile(values: list[float], fraction: float) -> float | None: + if not values: + return None + ordered = sorted(values) + return ordered[max(0, min(len(ordered) - 1, math.ceil(len(ordered) * fraction) - 1))] + + +def read_events(path: Path) -> list[dict]: + rows = [] + if path.is_file(): + for line in path.read_text(encoding="utf-8", errors="replace").splitlines(): + if not line.startswith("{"): + continue + try: + rows.append(json.loads(line)) + except json.JSONDecodeError: + pass + return rows + + +def run(scenario: str, condition: str, repetition: int, turn: bool = False) -> dict: + lookahead = int(condition in ("lookahead", "turn_lookahead")) + if scenario == "movement": + speed, start, duration, exit_s, slot, spawn = ( + 3000.0, 6.0, 12.0, 23.0, 0, SPAWN_TN_M) + else: + speed, start, duration, exit_s, slot, spawn = ( + 140.0, 20.0, 12.0, 37.0, 1, SPAWN_FI_M) + + label = f"{scenario}-{condition}-r{repetition}" + output_group = "turn" if turn else scenario + out = ROOT / "Saved/Linux/l129" / output_group / condition / "unreal" + host_out = HOST / "Plugins/VoxelForge/Saved/Linux/l129" / output_group / condition + host_saved = HOST / "Saved/Linux/l129" + trace = out / f"{label}.trace.jsonl" + abslog = out / f"{label}.log" + stdout = out / f"{label}.stdout.log" + export = host_out / "output" / label + userdir = host_saved / "user" / label + zendata = host_saved / "zen" / label + ddc = host_saved / "DDC" + for path in (out, export, userdir, zendata, ddc): + path.mkdir(parents=True, exist_ok=True) + trace.unlink(missing_ok=True) + spawn_cm = ",".join(f"{value * 100.0:.3f}" for value in spawn) + command = [ + str(EDITOR), str(HOST / "VFHost.uproject"), "-nullrhi", "-unattended", + "-nop4", "-nosplash", "-NoSound", "-corelimit=12", "-NoZenAutoLaunch", + "-notraceserver", "-nocrashreports", "-DisablePlugins=AndroidFileServer", + "-ddc=NoZenLocalFallback", f"-userdir={userdir}", f"-ZenDataPath={zendata}", + f"-LocalDataCachePath={ddc}", "-run=VoxelForgeExplore", "-seed=0", + "-archetype=TunnelNetwork", f"-slot={slot}", "-modes=export", "-gameconfig=1", + "-coreworldtest=1", "-ownerfourstrateplan=1", "-corevoxelsizecm=25", + "-coreislandtest=0", "-corefallbacktest=0", "-coreofftest=0", "-coreplantest=0", + "-settingsref=/Game/VoxelForge/DA_Settings.DA_Settings", "-corehybridmesher=0", + f"-out={export}", "-voxel.StreamingCoarseFirst=1", + "-voxel.StreamingDynamicNearReserve=1", "-voxel.StreamingLegacyPendingResultCap=0", + "-voxel.CoreRegionConcurrentAdmission=1", "-voxel.StreamingResultBacklogCap=256", + "-voxel.StreamingReadyQueueDepth=8", "-voxel.StreamingBackgroundWorkerCap=1", + "-voxel.CoreColumnCacheDirectMapped=0", "-voxel.StreamingFarApplySupplement=1", + "-voxel.CoreMCGradientMemoization=1", "-voxel.StreamingCollisionLookahead=1", + f"-voxel.CoreRegionLookahead={lookahead}", "-voxel.TestMove=1", + f"-voxel.TestMoveSpeedCmPerSecond={speed:.1f}", + f"-voxel.TestMoveStartSeconds={start:.1f}", + f"-voxel.TestMoveDurationSeconds={duration:.1f}", + f"-voxel.TestExitSeconds={exit_s:.1f}", "-voxel.TestMoveDirection=1,0,0", + "-voxel.StreamingSchedulerPolicy=3", "-voxel.TestExitOnSteady=0", + "-coreworldstreamtrace=1", f"-voxel.StartupTraceSpawnCm={spawn_cm}", + "-voxel.StartupTraceUntilEndPlay=1", "-voxel.StartupTraceThroughCrossing=1", + "-voxel.StartupTraceMaxTiles=16384", f"-voxel.StartupTraceFile={trace}", + f"-abslog={abslog}", + ] + if turn: + command.extend(["-voxel.TestMoveTurnAfterSeconds=6.0", + "-voxel.TestMoveTurnDirection=0,1,0"]) + started = time.monotonic() + wrapped = ["taskset", "-c", "0-11", "timeout", "1740s", *command] + with stdout.open("w", encoding="utf-8") as stream: + process = subprocess.run(wrapped, cwd=ROOT, stdout=stream, + stderr=subprocess.STDOUT, check=False, timeout=1740) + events = read_events(trace) + samples = [event for event in events if event.get("type") == "streaming_sample"] + moving = [event for event in samples if float(event.get("speed_cm_s", 0.0)) >= 50.0] + stop_event = next((event for event in events + if event.get("type") == "streaming_test_move_stopped"), {}) + stop_s = float(stop_event.get("t_s", 0.0)) + move_start = min((float(event.get("t_s", 0.0)) for event in moving), default=float("inf")) + dwell = [event for event in samples if float(event.get("t_s", 0.0)) >= stop_s + and float(event.get("speed_cm_s", 0.0)) < 50.0] + backend = next((event for event in events if event.get("type") == "worker_backend_config"), {}) + cap = next((event for event in events if event.get("type") == "streaming_worker_cap_readback"), {}) + if process.returncode or len(moving) < 40 or len(dwell) < 16: + raise RuntimeError(f"incomplete UE run {label}: exit={process.returncode}, " + f"move={len(moving)}, dwell={len(dwell)}, trace={trace}") + if (int(backend.get("streaming_far_apply_supplement", -1)) != 1 + or int(cap.get("streaming_background_worker_cap", -1)) != 1 + or int(backend.get("effective_tile_slots", -1)) != 8): + raise RuntimeError(f"configuration readback mismatch: {backend}; {cap}") + + moving_rows = [] + for event in moving: + desired = event.get("desired_by_lod", [0] * 9) + resident = event.get("resident_by_lod", [0] * 9) + covered = event.get("covered_by_lod", resident) + moving_rows.append({ + "near_ready_pct": 100.0 * sum(resident[:3]) / max(1, sum(desired[:3])), + "lod0_ready_pct": 100.0 * resident[0] / max(1, desired[0]), + "lod1_ready_pct": 100.0 * resident[1] / max(1, desired[1]), + "lod2_ready_pct": 100.0 * resident[2] / max(1, desired[2]), + "far_hole_pct": 100.0 * (sum(desired[3:]) - sum(covered[3:])) + / max(1, sum(desired[3:])), + }) + work = [event for event in events if event.get("type") == "game_thread_work_frame" + and move_start <= float(event.get("t_s", 0.0)) < stop_s] + ticks = [float(event.get("tick_ms", 0.0)) for event in work] + updates = [float(event.get("update_chunks_ms", 0.0)) for event in work] + arrival = [event for event in samples if float(event.get("t_s", 0.0)) < start + and float(event.get("speed_cm_s", 0.0)) < 50.0] + + def settled(event: dict, end: int) -> bool: + desired = event.get("desired_by_lod", [0] * 9) + actual = event.get("settled_by_lod", [0] * 9) + return sum(desired[:end]) > 0 and sum(actual[:end]) >= sum(desired[:end]) + + def far_holes(event: dict) -> float | None: + desired = event.get("desired_by_lod", [0] * 9)[3:] + covered = event.get("covered_by_lod", [0] * 9)[3:] + return 100.0 * (sum(desired) - sum(covered)) / sum(desired) if sum(desired) else None + + near_settled = next((event for event in arrival if settled(event, 3)), None) + whole_settled = next((event for event in arrival if settled(event, 9)), None) + far_clear = next((event for event in arrival if far_holes(event) == 0.0), None) + compile_done = [event for event in events if event.get("type") == "core_region_compile_complete" + and move_start <= float(event.get("t_s", 0.0)) < stop_s] + compile_requests = [event for event in events + if event.get("type") == "core_region_compile_request" + and move_start <= float(event.get("t_s", 0.0)) < stop_s] + lookahead_turns = [event for event in events + if event.get("type") == "core_region_lookahead_turn"] + row = { + "scenario": scenario, "condition": condition, "repetition": repetition, + "speed_mps": speed / 100.0, "core_region_lookahead": lookahead, + "exit_code": process.returncode, "wall_s": round(time.monotonic() - started, 3), + "moving_samples": len(moving), "dwell_samples": len(dwell), + "near_ready_moving_mean_pct": statistics.mean(r["near_ready_pct"] for r in moving_rows), + "lod0_ready_moving_mean_pct": statistics.mean(r["lod0_ready_pct"] for r in moving_rows), + "lod1_ready_moving_mean_pct": statistics.mean(r["lod1_ready_pct"] for r in moving_rows), + "lod2_ready_moving_mean_pct": statistics.mean(r["lod2_ready_pct"] for r in moving_rows), + "far_holes_moving_mean_pct": statistics.mean(r["far_hole_pct"] for r in moving_rows), + "game_thread_tick_p99_ms": percentile(ticks, 0.99), + "game_thread_tick_max_ms": max(ticks, default=None), + "stream_update_p99_ms": percentile(updates, 0.99), + "stream_update_max_ms": max(updates, default=None), + "lod02_settled_t_s": float(near_settled["t_s"]) if near_settled else None, + "whole_view_settled_t_s": float(whole_settled["t_s"]) if whole_settled else None, + "far_clear_t_s": float(far_clear["t_s"]) if far_clear else None, + "far_holes_at_pre_move_pct": far_holes(arrival[-1]) if arrival else None, + "pending_gate_p50_ms": percentile( + [float(e.get("pending_gate_elapsed_ms", 0.0)) for e in compile_done], 0.50), + "compile_queue_p95_ms": percentile( + [float(e.get("compile_queue_ms", 0.0)) for e in compile_done], 0.95), + "compile_task_p95_ms": percentile( + [float(e.get("compile_task_ms", 0.0)) for e in compile_done], 0.95), + "compiled_tiles_total": sum(int(e.get("compiled_tiles", 0)) for e in compile_done), + "lookahead_tiles_peak": max((int(e.get("lookahead_region_tiles", 0)) + for e in compile_requests), default=0), + "wasted_prefetch_tiles": sum(int(e.get("wasted_prefetch_tiles", 0)) + for e in compile_done), + "lookahead_turn_events": lookahead_turns, + "compile_completion_count": len(compile_done), + "trace": str(trace.relative_to(ROOT)), "log": str(abslog.relative_to(ROOT)), + } + with (ROOT / "Saved/Linux/l129" / "runs.jsonl").open("a", encoding="utf-8") as stream: + stream.write(json.dumps(row, sort_keys=True) + "\n") + print("[L129Pair] " + json.dumps(row, sort_keys=True), flush=True) + return row + + +def pairs_for(runs: list[dict], scenario: str) -> list[dict]: + pairs = [] + for repetition in range(1, 6): + baseline = next(row for row in runs if row["scenario"] == scenario + and row["condition"] == "baseline" and row["repetition"] == repetition) + candidate = next(row for row in runs if row["scenario"] == scenario + and row["condition"] == "lookahead" and row["repetition"] == repetition) + pairs.append({"repetition": repetition, + "near_ready_delta_pct": candidate["near_ready_moving_mean_pct"] + - baseline["near_ready_moving_mean_pct"], + "far_holes_delta_pct": candidate["far_holes_moving_mean_pct"] + - baseline["far_holes_moving_mean_pct"], + "tick_p99_delta_ms": candidate["game_thread_tick_p99_ms"] + - baseline["game_thread_tick_p99_ms"], + "tick_max_delta_ms": candidate["game_thread_tick_max_ms"] + - baseline["game_thread_tick_max_ms"]}) + return pairs + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--scenario", choices=("movement",), default="movement") + args = parser.parse_args() + if not EDITOR.is_file(): + raise SystemExit(f"missing Unreal editor: {EDITOR}") + root_out = ROOT / "Saved/Linux/l129" / args.scenario + root_out.mkdir(parents=True, exist_ok=True) + (ROOT / "Saved/Linux/l129").mkdir(parents=True, exist_ok=True) + runs = [] + for repetition in range(1, 6): + runs.append(run(args.scenario, "candidate", repetition)) + (root_out / "runs-partial.json").write_text( + json.dumps(runs, indent=2) + "\n", encoding="utf-8") + baseline_path = ROOT / "Saved/Linux/l127/ue/movement-pairs-summary.json" + baseline = json.loads(baseline_path.read_text(encoding="utf-8"))["summary"]["merge"]["metrics"] + metric_names = ("near_ready_moving_mean_pct", "far_holes_moving_mean_pct", + "game_thread_tick_p99_ms", "game_thread_tick_max_ms") + candidate = {name: statistics.median(row[name] for row in runs) for name in metric_names} + reference = {name: baseline[name]["median"] for name in metric_names} + deltas = {name: candidate[name] - reference[name] for name in metric_names} + bar_pass = (candidate["near_ready_moving_mean_pct"] > reference["near_ready_moving_mean_pct"] + and candidate["far_holes_moving_mean_pct"] <= reference["far_holes_moving_mean_pct"] + and candidate["game_thread_tick_p99_ms"] <= reference["game_thread_tick_p99_ms"] + and candidate["game_thread_tick_max_ms"] <= reference["game_thread_tick_max_ms"]) + summary = { + "design": "L129 R=2.0 m passage influence; five runs at 30 m/s.", + "scenario": args.scenario, "runs": runs, + "baseline": {"commit": "b96dd73", "source_summary": str(baseline_path), + "metrics": reference}, + "candidate_medians": candidate, "deltas": deltas, + "bar_pass": bar_pass, + } + (root_out / "summary.json").write_text(json.dumps(summary, indent=2) + "\n", + encoding="utf-8") + print("[L129MovementSummary] " + json.dumps(summary, sort_keys=True), flush=True) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/COMPARE.html b/Standalone/Research/WorldAssemblerM3/Linux129/captures/COMPARE.html new file mode 100644 index 0000000..2783cf2 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/captures/COMPARE.html @@ -0,0 +1,188 @@ + +L125 / L129 tunnel capture comparison + +

L125 / L129 v226: identical views

+
+

passage/0-1/0 — rock-floor/401.7m

+

rock-floor-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/0-1/0 — rock-floor/792.8m

+

rock-floor-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/0-1/0 — rock-floor/1634.5m

+

rock-floor-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/1-2/0 — rock-floor/27.0m

+

rock-floor-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/1-2/0 — rock-floor/52.9m

+

rock-floor-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/1-2/0 — rock-floor/78.9m

+

rock-floor-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/2-3/0 — rock-floor/323.4m

+

rock-floor-close · L125 low_contrast_geometry_visible · L129 low_contrast_geometry_visible

+
+
L125
+
L129 v226
+
+
+
+

passage/2-3/0 — rock-floor/333.4m

+

rock-floor-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/2-3/0 — rock-floor/343.4m

+

rock-floor-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/0-1/0 — section-1/4m-outside

+

open-air-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/0-1/0 — section-1/4m-interior-wall

+

open-air-close · L125 low_contrast_geometry_visible · L129 low_contrast_geometry_visible

+
+
L125
+
L129 v226
+
+
+
+

passage/0-1/0 — section-2/4m-outside

+

open-air-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/0-1/0 — section-2/4m-interior-wall

+

open-air-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/0-1/0 — section-3/4m-outside

+

open-air-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/0-1/0 — section-3/4m-interior-wall

+

open-air-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/1-2/0 — section-1/4m-outside

+

open-air-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/1-2/0 — section-1/4m-interior-wall

+

open-air-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/1-2/0 — section-2/4m-outside

+

open-air-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/1-2/0 — section-2/4m-interior-wall

+

open-air-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/2-3/0 — section-1/4m-outside

+

open-air-close · L125 low_contrast_geometry_visible · L129 low_contrast_geometry_visible

+
+
L125
+
L129 v226
+
+
+
+

passage/2-3/0 — section-1/4m-interior-wall

+

open-air-close · L125 low_contrast_geometry_visible · L129 low_contrast_geometry_visible

+
+
L125
+
L129 v226
+
+
+
+

passage/2-3/0 — section-2/4m-outside

+

open-air-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
+
+

passage/2-3/0 — section-2/4m-interior-wall

+

open-air-close · L125 pass · L129 pass

+
+
L125
+
L129 v226
+
+
diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/COMPARE.html b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/COMPARE.html new file mode 100644 index 0000000..726ad27 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/COMPARE.html @@ -0,0 +1,52 @@ + +L125 / L129 mouth close-ups + +

L125 v225 / L129 v226 tunnel mouths

+
+

passage/0-1/0 — upper-mouth

+

pixel-identical; pass / pass

+
+
L125 v225
+
L129 v226
+
+
+
+

passage/0-1/0 — lower-mouth

+

pixel-identical; pass / pass

+
+
L125 v225
+
L129 v226
+
+
+
+

passage/1-2/0 — upper-mouth

+

pixel-identical; pass / pass

+
+
L125 v225
+
L129 v226
+
+
+
+

passage/1-2/0 — lower-mouth

+

pixel-identical; pass / pass

+
+
L125 v225
+
L129 v226
+
+
+
+

passage/2-3/0 — upper-mouth

+

pixel-identical; pass / pass

+
+
L125 v225
+
L129 v226
+
+
+
+

passage/2-3/0 — lower-mouth

+

pixel-identical; low_contrast_geometry_visible / low_contrast_geometry_visible

+
+
L125 v225
+
L129 v226
+
+
diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-0-1-0-lower-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-0-1-0-lower-mouth.png new file mode 100644 index 0000000..6062a8d Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-0-1-0-lower-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-0-1-0-upper-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-0-1-0-upper-mouth.png new file mode 100644 index 0000000..814d4a9 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-0-1-0-upper-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-1-2-0-lower-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-1-2-0-lower-mouth.png new file mode 100644 index 0000000..91554f5 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-1-2-0-lower-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-1-2-0-upper-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-1-2-0-upper-mouth.png new file mode 100644 index 0000000..720af2d Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-1-2-0-upper-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-2-3-0-lower-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-2-3-0-lower-mouth.png new file mode 100644 index 0000000..85f9c8d Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-2-3-0-lower-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-2-3-0-upper-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-2-3-0-upper-mouth.png new file mode 100644 index 0000000..21b3001 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/after/passage-2-3-0-upper-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-0-1-0-lower-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-0-1-0-lower-mouth.png new file mode 100644 index 0000000..6062a8d Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-0-1-0-lower-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-0-1-0-upper-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-0-1-0-upper-mouth.png new file mode 100644 index 0000000..814d4a9 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-0-1-0-upper-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-1-2-0-lower-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-1-2-0-lower-mouth.png new file mode 100644 index 0000000..91554f5 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-1-2-0-lower-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-1-2-0-upper-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-1-2-0-upper-mouth.png new file mode 100644 index 0000000..720af2d Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-1-2-0-upper-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-2-3-0-lower-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-2-3-0-lower-mouth.png new file mode 100644 index 0000000..85f9c8d Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-2-3-0-lower-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-2-3-0-upper-mouth.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-2-3-0-upper-mouth.png new file mode 100644 index 0000000..21b3001 Binary files /dev/null and b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/before/passage-2-3-0-upper-mouth.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/capture-index.json b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/capture-index.json new file mode 100644 index 0000000..73c39a4 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129-mouth/capture-index.json @@ -0,0 +1,676 @@ +{ + "captures": [ + { + "name": "passage-0-1-0-upper-mouth", + "passage": "passage/0-1/0", + "kind": "mouth", + "station": "upper-mouth", + "camera": [ + 8.324777182667596, + 20.450707805615995, + -371.842578125 + ], + "target": [ + 7.855654585481068, + 14.021907641948447, + -371.942578125 + ], + "yaw": -175.82640818958697, + "pitch": -0.8888012261216656, + "focus": [ + 8.0, + 16.0, + -372.1224609375 + ], + "center_z": -372.1224609375, + "variant": "L125-v225", + "capture": "captures/L129-mouth/before/passage-0-1-0-upper-mouth.png", + "scene": "Saved/Linux/l129/captures/mouth-closeups/before/passage-0-1-0-upper-mouth.vfmesh", + "drawn_triangles": 243380, + "source_triangles": 287904, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 8.324777182667596, + 20.450707805615995, + -371.842578125 + ], + "target_actual_m": [ + 7.855654585481068, + 14.021907641948447, + -371.942578125 + ], + "logs": [ + "Saved/Linux/l129/captures/mouth-closeups/before/passage-0-1-0-upper-mouth-mesh.log", + "Saved/Linux/l129/captures/mouth-closeups/before/passage-0-1-0-upper-mouth-render.log", + "Saved/Linux/l129/captures/mouth-closeups/before/passage-0-1-0-upper-mouth-quality.log" + ], + "view": "passage-0-1-0-upper-mouth", + "image_sha256": "20a56bb0419cc9c0ccb6a3c3f6a79e7f1614d095a8b233ecc65dc836fee9eb3b" + }, + { + "name": "passage-0-1-0-upper-mouth", + "passage": "passage/0-1/0", + "kind": "mouth", + "station": "upper-mouth", + "camera": [ + 8.324777182667596, + 20.450707805615995, + -371.842578125 + ], + "target": [ + 7.855654585481068, + 14.021907641948447, + -371.942578125 + ], + "yaw": -175.82640818958697, + "pitch": -0.8888012261216656, + "focus": [ + 8.0, + 16.0, + -372.1224609375 + ], + "center_z": -372.1224609375, + "variant": "L129-v226", + "capture": "captures/L129-mouth/after/passage-0-1-0-upper-mouth.png", + "scene": "Saved/Linux/l129/captures/mouth-closeups/after/passage-0-1-0-upper-mouth.vfmesh", + "drawn_triangles": 243380, + "source_triangles": 287904, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 8.324777182667596, + 20.450707805615995, + -371.842578125 + ], + "target_actual_m": [ + 7.855654585481068, + 14.021907641948447, + -371.942578125 + ], + "logs": [ + "Saved/Linux/l129/captures/mouth-closeups/after/passage-0-1-0-upper-mouth-mesh.log", + "Saved/Linux/l129/captures/mouth-closeups/after/passage-0-1-0-upper-mouth-render.log", + "Saved/Linux/l129/captures/mouth-closeups/after/passage-0-1-0-upper-mouth-quality.log" + ], + "view": "passage-0-1-0-upper-mouth", + "image_sha256": "20a56bb0419cc9c0ccb6a3c3f6a79e7f1614d095a8b233ecc65dc836fee9eb3b" + }, + { + "name": "passage-0-1-0-lower-mouth", + "passage": "passage/0-1/0", + "kind": "mouth", + "station": "lower-mouth", + "camera": [ + 32.68834531966199, + 9.553722879000034, + -735.4805084803569 + ], + "target": [ + 24.394507482044844, + 1.8614284070526241, + -736.6798828125 + ], + "yaw": -132.84502956130385, + "pitch": -6.05232406255234, + "focus": [ + 25.8369140625, + 3.19921875, + -736.2672500132622 + ], + "center_z": -736.2672500132622, + "variant": "L125-v225", + "capture": "captures/L129-mouth/before/passage-0-1-0-lower-mouth.png", + "scene": "Saved/Linux/l129/captures/mouth-closeups/before/passage-0-1-0-lower-mouth.vfmesh", + "drawn_triangles": 549170, + "source_triangles": 582732, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 32.68834531966199, + 9.553722879000034, + -735.4805084803569 + ], + "target_actual_m": [ + 24.394507482044844, + 1.8614284070526241, + -736.6798828125 + ], + "logs": [ + "Saved/Linux/l129/captures/mouth-closeups/before/passage-0-1-0-lower-mouth-mesh.log", + "Saved/Linux/l129/captures/mouth-closeups/before/passage-0-1-0-lower-mouth-render.log", + "Saved/Linux/l129/captures/mouth-closeups/before/passage-0-1-0-lower-mouth-quality.log" + ], + "view": "passage-0-1-0-lower-mouth", + "image_sha256": "01e5f52b7c9080cb34ed9fb92b60360426ef21bc8934309542cd8736a116fc29" + }, + { + "name": "passage-0-1-0-lower-mouth", + "passage": "passage/0-1/0", + "kind": "mouth", + "station": "lower-mouth", + "camera": [ + 32.68834531966199, + 9.553722879000034, + -735.4805084803569 + ], + "target": [ + 24.394507482044844, + 1.8614284070526241, + -736.6798828125 + ], + "yaw": -132.84502956130385, + "pitch": -6.05232406255234, + "focus": [ + 25.8369140625, + 3.19921875, + -736.2672500132622 + ], + "center_z": -736.2672500132622, + "variant": "L129-v226", + "capture": "captures/L129-mouth/after/passage-0-1-0-lower-mouth.png", + "scene": "Saved/Linux/l129/captures/mouth-closeups/after/passage-0-1-0-lower-mouth.vfmesh", + "drawn_triangles": 549170, + "source_triangles": 582732, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 32.68834531966199, + 9.553722879000034, + -735.4805084803569 + ], + "target_actual_m": [ + 24.394507482044844, + 1.8614284070526241, + -736.6798828125 + ], + "logs": [ + "Saved/Linux/l129/captures/mouth-closeups/after/passage-0-1-0-lower-mouth-mesh.log", + "Saved/Linux/l129/captures/mouth-closeups/after/passage-0-1-0-lower-mouth-render.log", + "Saved/Linux/l129/captures/mouth-closeups/after/passage-0-1-0-lower-mouth-quality.log" + ], + "view": "passage-0-1-0-lower-mouth", + "image_sha256": "01e5f52b7c9080cb34ed9fb92b60360426ef21bc8934309542cd8736a116fc29" + }, + { + "name": "passage-1-2-0-upper-mouth", + "passage": "passage/1-2/0", + "kind": "mouth", + "station": "upper-mouth", + "camera": [ + 23.39180762797774, + -15.509524798921928, + -731.7810546875 + ], + "target": [ + 17.28788584589878, + -13.618271096312476, + -731.8810546875 + ], + "yaw": -72.7848029211395, + "pitch": -0.8965458221544697, + "focus": [ + 19.166015625, + -14.2001953125, + -730.5610546875 + ], + "center_z": -730.5610546875, + "variant": "L125-v225", + "capture": "captures/L129-mouth/before/passage-1-2-0-upper-mouth.png", + "scene": "Saved/Linux/l129/captures/mouth-closeups/before/passage-1-2-0-upper-mouth.vfmesh", + "drawn_triangles": 593026, + "source_triangles": 638590, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 23.39180762797774, + -15.509524798921928, + -731.7810546875 + ], + "target_actual_m": [ + 17.28788584589878, + -13.618271096312476, + -731.8810546875 + ], + "logs": [ + "Saved/Linux/l129/captures/mouth-closeups/before/passage-1-2-0-upper-mouth-mesh.log", + "Saved/Linux/l129/captures/mouth-closeups/before/passage-1-2-0-upper-mouth-render.log", + "Saved/Linux/l129/captures/mouth-closeups/before/passage-1-2-0-upper-mouth-quality.log" + ], + "view": "passage-1-2-0-upper-mouth", + "image_sha256": "8314a919e0c4b16390622371be96c89459ddef922c20711db281c55227e29de2" + }, + { + "name": "passage-1-2-0-upper-mouth", + "passage": "passage/1-2/0", + "kind": "mouth", + "station": "upper-mouth", + "camera": [ + 23.39180762797774, + -15.509524798921928, + -731.7810546875 + ], + "target": [ + 17.28788584589878, + -13.618271096312476, + -731.8810546875 + ], + "yaw": -72.7848029211395, + "pitch": -0.8965458221544697, + "focus": [ + 19.166015625, + -14.2001953125, + -730.5610546875 + ], + "center_z": -730.5610546875, + "variant": "L129-v226", + "capture": "captures/L129-mouth/after/passage-1-2-0-upper-mouth.png", + "scene": "Saved/Linux/l129/captures/mouth-closeups/after/passage-1-2-0-upper-mouth.vfmesh", + "drawn_triangles": 593026, + "source_triangles": 638590, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 23.39180762797774, + -15.509524798921928, + -731.7810546875 + ], + "target_actual_m": [ + 17.28788584589878, + -13.618271096312476, + -731.8810546875 + ], + "logs": [ + "Saved/Linux/l129/captures/mouth-closeups/after/passage-1-2-0-upper-mouth-mesh.log", + "Saved/Linux/l129/captures/mouth-closeups/after/passage-1-2-0-upper-mouth-render.log", + "Saved/Linux/l129/captures/mouth-closeups/after/passage-1-2-0-upper-mouth-quality.log" + ], + "view": "passage-1-2-0-upper-mouth", + "image_sha256": "8314a919e0c4b16390622371be96c89459ddef922c20711db281c55227e29de2" + }, + { + "name": "passage-1-2-0-lower-mouth", + "passage": "passage/1-2/0", + "kind": "mouth", + "station": "lower-mouth", + "camera": [ + 27.129937681588373, + -19.073450175278364, + -751.8771866414096 + ], + "target": [ + 17.48940045519192, + -13.174246920336135, + -753.05390625 + ], + "yaw": -58.53685078395012, + "pitch": -5.943870452561027, + "focus": [ + 19.166015625, + -14.2001953125, + -751.73390625 + ], + "center_z": -751.73390625, + "variant": "L125-v225", + "capture": "captures/L129-mouth/before/passage-1-2-0-lower-mouth.png", + "scene": "Saved/Linux/l129/captures/mouth-closeups/before/passage-1-2-0-lower-mouth.vfmesh", + "drawn_triangles": 544808, + "source_triangles": 576830, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 27.129937681588373, + -19.073450175278364, + -751.8771866414096 + ], + "target_actual_m": [ + 17.48940045519192, + -13.174246920336135, + -753.05390625 + ], + "logs": [ + "Saved/Linux/l129/captures/mouth-closeups/before/passage-1-2-0-lower-mouth-mesh.log", + "Saved/Linux/l129/captures/mouth-closeups/before/passage-1-2-0-lower-mouth-render.log", + "Saved/Linux/l129/captures/mouth-closeups/before/passage-1-2-0-lower-mouth-quality.log" + ], + "view": "passage-1-2-0-lower-mouth", + "image_sha256": "dc1e5b79bb9afa6e1aa66edac7e0d84e1161ece0147b1ea58e4e60b93dca399b" + }, + { + "name": "passage-1-2-0-lower-mouth", + "passage": "passage/1-2/0", + "kind": "mouth", + "station": "lower-mouth", + "camera": [ + 27.129937681588373, + -19.073450175278364, + -751.8771866414096 + ], + "target": [ + 17.48940045519192, + -13.174246920336135, + -753.05390625 + ], + "yaw": -58.53685078395012, + "pitch": -5.943870452561027, + "focus": [ + 19.166015625, + -14.2001953125, + -751.73390625 + ], + "center_z": -751.73390625, + "variant": "L129-v226", + "capture": "captures/L129-mouth/after/passage-1-2-0-lower-mouth.png", + "scene": "Saved/Linux/l129/captures/mouth-closeups/after/passage-1-2-0-lower-mouth.vfmesh", + "drawn_triangles": 544808, + "source_triangles": 576830, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + 27.129937681588373, + -19.073450175278364, + -751.8771866414096 + ], + "target_actual_m": [ + 17.48940045519192, + -13.174246920336135, + -753.05390625 + ], + "logs": [ + "Saved/Linux/l129/captures/mouth-closeups/after/passage-1-2-0-lower-mouth-mesh.log", + "Saved/Linux/l129/captures/mouth-closeups/after/passage-1-2-0-lower-mouth-render.log", + "Saved/Linux/l129/captures/mouth-closeups/after/passage-1-2-0-lower-mouth-quality.log" + ], + "view": "passage-1-2-0-lower-mouth", + "image_sha256": "dc1e5b79bb9afa6e1aa66edac7e0d84e1161ece0147b1ea58e4e60b93dca399b" + }, + { + "name": "passage-2-3-0-upper-mouth", + "passage": "passage/2-3/0", + "kind": "mouth", + "station": "upper-mouth", + "camera": [ + -24.455025526892644, + -5.631774473341657, + -811.975390625 + ], + "target": [ + -18.110266432492157, + -4.81795266462593, + -812.075390625 + ], + "yaw": 82.6907653180847, + "pitch": -0.8956299428824654, + "focus": [ + -20.0625, + -5.068359375, + -810.755390625 + ], + "center_z": -810.755390625, + "variant": "L125-v225", + "capture": "captures/L129-mouth/before/passage-2-3-0-upper-mouth.png", + "scene": "Saved/Linux/l129/captures/mouth-closeups/before/passage-2-3-0-upper-mouth.vfmesh", + "drawn_triangles": 59554, + "source_triangles": 71494, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -24.455025526892644, + -5.631774473341657, + -811.975390625 + ], + "target_actual_m": [ + -18.110266432492157, + -4.81795266462593, + -812.075390625 + ], + "logs": [ + "Saved/Linux/l129/captures/mouth-closeups/before/passage-2-3-0-upper-mouth-mesh.log", + "Saved/Linux/l129/captures/mouth-closeups/before/passage-2-3-0-upper-mouth-render.log", + "Saved/Linux/l129/captures/mouth-closeups/before/passage-2-3-0-upper-mouth-quality.log" + ], + "view": "passage-2-3-0-upper-mouth", + "image_sha256": "954c7be05d77c4ccf5d3a7a486cc7cd1e32f108120e02daac2bb2cf18ed2a325" + }, + { + "name": "passage-2-3-0-upper-mouth", + "passage": "passage/2-3/0", + "kind": "mouth", + "station": "upper-mouth", + "camera": [ + -24.455025526892644, + -5.631774473341657, + -811.975390625 + ], + "target": [ + -18.110266432492157, + -4.81795266462593, + -812.075390625 + ], + "yaw": 82.6907653180847, + "pitch": -0.8956299428824654, + "focus": [ + -20.0625, + -5.068359375, + -810.755390625 + ], + "center_z": -810.755390625, + "variant": "L129-v226", + "capture": "captures/L129-mouth/after/passage-2-3-0-upper-mouth.png", + "scene": "Saved/Linux/l129/captures/mouth-closeups/after/passage-2-3-0-upper-mouth.vfmesh", + "drawn_triangles": 59554, + "source_triangles": 71494, + "verified": true, + "pixel_quality_status": "pass", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -24.455025526892644, + -5.631774473341657, + -811.975390625 + ], + "target_actual_m": [ + -18.110266432492157, + -4.81795266462593, + -812.075390625 + ], + "logs": [ + "Saved/Linux/l129/captures/mouth-closeups/after/passage-2-3-0-upper-mouth-mesh.log", + "Saved/Linux/l129/captures/mouth-closeups/after/passage-2-3-0-upper-mouth-render.log", + "Saved/Linux/l129/captures/mouth-closeups/after/passage-2-3-0-upper-mouth-quality.log" + ], + "view": "passage-2-3-0-upper-mouth", + "image_sha256": "954c7be05d77c4ccf5d3a7a486cc7cd1e32f108120e02daac2bb2cf18ed2a325" + }, + { + "name": "passage-2-3-0-lower-mouth", + "passage": "passage/2-3/0", + "kind": "mouth", + "station": "lower-mouth", + "camera": [ + -28.589162628136368, + -1.22631300593053, + -898.8116843726575 + ], + "target": [ + -18.26741313091866, + -5.87721124217252, + -900.0333984375 + ], + "yaw": 114.25594846721253, + "pitch": -6.159177031829821, + "focus": [ + -20.0625, + -5.068359375, + -898.7133984375 + ], + "center_z": -898.7133984375, + "variant": "L125-v225", + "capture": "captures/L129-mouth/before/passage-2-3-0-lower-mouth.png", + "scene": "Saved/Linux/l129/captures/mouth-closeups/before/passage-2-3-0-lower-mouth.vfmesh", + "drawn_triangles": 293832, + "source_triangles": 314658, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -28.589162628136368, + -1.22631300593053, + -898.8116843726575 + ], + "target_actual_m": [ + -18.26741313091866, + -5.87721124217252, + -900.0333984375 + ], + "logs": [ + "Saved/Linux/l129/captures/mouth-closeups/before/passage-2-3-0-lower-mouth-mesh.log", + "Saved/Linux/l129/captures/mouth-closeups/before/passage-2-3-0-lower-mouth-render.log", + "Saved/Linux/l129/captures/mouth-closeups/before/passage-2-3-0-lower-mouth-quality.log" + ], + "view": "passage-2-3-0-lower-mouth", + "image_sha256": "295bc7662d9b699212110c61e60c7bd19e99d13ebe94d41201fa93e109bf707e" + }, + { + "name": "passage-2-3-0-lower-mouth", + "passage": "passage/2-3/0", + "kind": "mouth", + "station": "lower-mouth", + "camera": [ + -28.589162628136368, + -1.22631300593053, + -898.8116843726575 + ], + "target": [ + -18.26741313091866, + -5.87721124217252, + -900.0333984375 + ], + "yaw": 114.25594846721253, + "pitch": -6.159177031829821, + "focus": [ + -20.0625, + -5.068359375, + -898.7133984375 + ], + "center_z": -898.7133984375, + "variant": "L129-v226", + "capture": "captures/L129-mouth/after/passage-2-3-0-lower-mouth.png", + "scene": "Saved/Linux/l129/captures/mouth-closeups/after/passage-2-3-0-lower-mouth.vfmesh", + "drawn_triangles": 293832, + "source_triangles": 314658, + "verified": true, + "pixel_quality_status": "low_contrast_geometry_visible", + "route_distance_actual_m": null, + "route_station_adjustment_m": 0.0, + "closeup_camera_target_distance_m": null, + "closeup_target_surface_distance_m": null, + "closeup_predicted_target_offset_m": null, + "closeup_wall_normal_alignment": null, + "fallback_kind": null, + "fallback_surface_distance_m": null, + "camera_actual_m": [ + -28.589162628136368, + -1.22631300593053, + -898.8116843726575 + ], + "target_actual_m": [ + -18.26741313091866, + -5.87721124217252, + -900.0333984375 + ], + "logs": [ + "Saved/Linux/l129/captures/mouth-closeups/after/passage-2-3-0-lower-mouth-mesh.log", + "Saved/Linux/l129/captures/mouth-closeups/after/passage-2-3-0-lower-mouth-render.log", + "Saved/Linux/l129/captures/mouth-closeups/after/passage-2-3-0-lower-mouth-quality.log" + ], + "view": "passage-2-3-0-lower-mouth", + "image_sha256": "295bc7662d9b699212110c61e60c7bd19e99d13ebe94d41201fa93e109bf707e" + } + ] +} diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/capture-index.json b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/capture-index.json new file mode 100644 index 0000000..5508bac --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-0-1-0-rock-floor-station-1.png", + "scene": "Saved/Linux/l129/captures/L129/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": null, + "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/l129/captures/L129/passage-0-1-0-rock-floor-station-1-mesh.log", + "Saved/Linux/l129/captures/L129/passage-0-1-0-rock-floor-station-1-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-0-1-0-rock-floor-station-2.png", + "scene": "Saved/Linux/l129/captures/L129/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": null, + "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/l129/captures/L129/passage-0-1-0-rock-floor-station-2-mesh.log", + "Saved/Linux/l129/captures/L129/passage-0-1-0-rock-floor-station-2-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-0-1-0-rock-floor-station-3.png", + "scene": "Saved/Linux/l129/captures/L129/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": null, + "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/l129/captures/L129/passage-0-1-0-rock-floor-station-3-mesh.log", + "Saved/Linux/l129/captures/L129/passage-0-1-0-rock-floor-station-3-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-1-2-0-rock-floor-station-1.png", + "scene": "Saved/Linux/l129/captures/L129/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": null, + "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/l129/captures/L129/passage-1-2-0-rock-floor-station-1-mesh.log", + "Saved/Linux/l129/captures/L129/passage-1-2-0-rock-floor-station-1-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-1-2-0-rock-floor-station-2.png", + "scene": "Saved/Linux/l129/captures/L129/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": null, + "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/l129/captures/L129/passage-1-2-0-rock-floor-station-2-mesh.log", + "Saved/Linux/l129/captures/L129/passage-1-2-0-rock-floor-station-2-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-1-2-0-rock-floor-station-3.png", + "scene": "Saved/Linux/l129/captures/L129/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": null, + "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/l129/captures/L129/passage-1-2-0-rock-floor-station-3-mesh.log", + "Saved/Linux/l129/captures/L129/passage-1-2-0-rock-floor-station-3-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-2-3-0-rock-floor-station-1.png", + "scene": "Saved/Linux/l129/captures/L129/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": null, + "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/l129/captures/L129/passage-2-3-0-rock-floor-station-1-mesh.log", + "Saved/Linux/l129/captures/L129/passage-2-3-0-rock-floor-station-1-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-2-3-0-rock-floor-station-2.png", + "scene": "Saved/Linux/l129/captures/L129/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": null, + "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/l129/captures/L129/passage-2-3-0-rock-floor-station-2-mesh.log", + "Saved/Linux/l129/captures/L129/passage-2-3-0-rock-floor-station-2-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-2-3-0-rock-floor-station-3.png", + "scene": "Saved/Linux/l129/captures/L129/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": null, + "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/l129/captures/L129/passage-2-3-0-rock-floor-station-3-mesh.log", + "Saved/Linux/l129/captures/L129/passage-2-3-0-rock-floor-station-3-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-0-1-0-openair-1-4m-outside.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-0-1-0-openair-1-4m-outside-mesh.log", + "Saved/Linux/l129/captures/L129/passage-0-1-0-openair-1-4m-outside-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-0-1-0-openair-1-4m-interior-wall.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-0-1-0-openair-1-4m-interior-wall-mesh.log", + "Saved/Linux/l129/captures/L129/passage-0-1-0-openair-1-4m-interior-wall-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-0-1-0-openair-2-4m-outside.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-0-1-0-openair-2-4m-outside-mesh.log", + "Saved/Linux/l129/captures/L129/passage-0-1-0-openair-2-4m-outside-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-0-1-0-openair-2-4m-interior-wall.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-0-1-0-openair-2-4m-interior-wall-mesh.log", + "Saved/Linux/l129/captures/L129/passage-0-1-0-openair-2-4m-interior-wall-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-0-1-0-openair-3-4m-outside.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-0-1-0-openair-3-4m-outside-mesh.log", + "Saved/Linux/l129/captures/L129/passage-0-1-0-openair-3-4m-outside-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-0-1-0-openair-3-4m-interior-wall.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-0-1-0-openair-3-4m-interior-wall-mesh.log", + "Saved/Linux/l129/captures/L129/passage-0-1-0-openair-3-4m-interior-wall-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-1-2-0-openair-1-4m-outside.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-1-2-0-openair-1-4m-outside-mesh.log", + "Saved/Linux/l129/captures/L129/passage-1-2-0-openair-1-4m-outside-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-1-2-0-openair-1-4m-interior-wall.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-1-2-0-openair-1-4m-interior-wall-mesh.log", + "Saved/Linux/l129/captures/L129/passage-1-2-0-openair-1-4m-interior-wall-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-1-2-0-openair-2-4m-outside.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-1-2-0-openair-2-4m-outside-mesh.log", + "Saved/Linux/l129/captures/L129/passage-1-2-0-openair-2-4m-outside-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-1-2-0-openair-2-4m-interior-wall.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-1-2-0-openair-2-4m-interior-wall-mesh.log", + "Saved/Linux/l129/captures/L129/passage-1-2-0-openair-2-4m-interior-wall-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-2-3-0-openair-1-4m-outside.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-2-3-0-openair-1-4m-outside-mesh.log", + "Saved/Linux/l129/captures/L129/passage-2-3-0-openair-1-4m-outside-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-2-3-0-openair-1-4m-interior-wall.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-2-3-0-openair-1-4m-interior-wall-mesh.log", + "Saved/Linux/l129/captures/L129/passage-2-3-0-openair-1-4m-interior-wall-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-2-3-0-openair-2-4m-outside.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-2-3-0-openair-2-4m-outside-mesh.log", + "Saved/Linux/l129/captures/L129/passage-2-3-0-openair-2-4m-outside-render.log", + "Saved/Linux/l129/captures/L129/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": "L129-v226", + "capture": "captures/L129/passage-2-3-0-openair-2-4m-interior-wall.png", + "scene": "Saved/Linux/l129/captures/L129/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/l129/captures/L129/passage-2-3-0-openair-2-4m-interior-wall-mesh.log", + "Saved/Linux/l129/captures/L129/passage-2-3-0-openair-2-4m-interior-wall-render.log", + "Saved/Linux/l129/captures/L129/passage-2-3-0-openair-2-4m-interior-wall-quality.log" + ] + } + ] +} diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-0-1-0-openair-1-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-0-1-0-openair-1-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-0-1-0-openair-1-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-0-1-0-openair-1-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-0-1-0-openair-2-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-0-1-0-openair-2-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-0-1-0-openair-2-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-0-1-0-openair-2-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-0-1-0-openair-3-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-0-1-0-openair-3-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-0-1-0-openair-3-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-0-1-0-openair-3-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-0-1-0-rock-floor-station-1.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-0-1-0-rock-floor-station-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-0-1-0-rock-floor-station-2.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-0-1-0-rock-floor-station-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-0-1-0-rock-floor-station-3.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-0-1-0-rock-floor-station-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-1-2-0-openair-1-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-1-2-0-openair-1-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-1-2-0-openair-1-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-1-2-0-openair-1-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-1-2-0-openair-2-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-1-2-0-openair-2-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-1-2-0-openair-2-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-1-2-0-openair-2-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-1-2-0-rock-floor-station-1.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-1-2-0-rock-floor-station-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-1-2-0-rock-floor-station-2.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-1-2-0-rock-floor-station-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-1-2-0-rock-floor-station-3.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-1-2-0-rock-floor-station-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-2-3-0-openair-1-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-2-3-0-openair-1-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-2-3-0-openair-1-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-2-3-0-openair-1-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-2-3-0-openair-2-4m-interior-wall.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-2-3-0-openair-2-4m-interior-wall.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-2-3-0-openair-2-4m-outside.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-2-3-0-openair-2-4m-outside.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-2-3-0-rock-floor-station-1.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-2-3-0-rock-floor-station-1.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-2-3-0-rock-floor-station-2.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-2-3-0-rock-floor-station-2.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/passage-2-3-0-rock-floor-station-3.png b/Standalone/Research/WorldAssemblerM3/Linux129/captures/L129/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/Linux129/captures/L129/passage-2-3-0-rock-floor-station-3.png differ diff --git a/Standalone/Research/WorldAssemblerM3/Linux129/l129-reach-2m.patch b/Standalone/Research/WorldAssemblerM3/Linux129/l129-reach-2m.patch new file mode 100644 index 0000000..df7d9e6 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux129/l129-reach-2m.patch @@ -0,0 +1,174 @@ +diff --git a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h +index dc4ca32..aac34ff 100644 +--- a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h ++++ b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h +@@ -494,7 +494,8 @@ namespace VoxelForgeCore + // Version 223 projects the floor onto one continuous arc-length profile and groups + // 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 = 225; ++ // Version 226 bounds smooth-passage influence in physical metres and narrows its reach. ++ inline constexpr std::uint32_t WorldAssemblyEvaluatorVersion = 226; + + enum class FieldChannel : std::uint32_t + { +diff --git a/Standalone/Core/src/ShapeWorldInternal.h b/Standalone/Core/src/ShapeWorldInternal.h +index 517f375..dc258a1 100644 +--- a/Standalone/Core/src/ShapeWorldInternal.h ++++ b/Standalone/Core/src/ShapeWorldInternal.h +@@ -72,11 +72,11 @@ static bool VF_IsL98PassagePrepareTraceEnabled() + return bEnabled; + } + +-static double VF_L93PassageCarveReachMetres() ++static double VF_L129PassageCarveReachMetres() + { +- // The generated world uses a fixed bounded tube influence. An explicit diagnostic +- // option can still select the legacy point-evaluation path for comparisons. +- return 4.0; ++ // Keep the sweep cutoff and its spatial bounds on one physical reach. Diagnostic ++ // comparisons can still select another bounded reach or the point-evaluation path. ++ return 2.0; + } + + enum class EPassageDensityQueryCaller : std::size_t +@@ -306,7 +306,7 @@ public: + profileStats_(profileStats),profileLod_(profileLod), + passageCarveReachMetres_(std::isfinite(passageCarveReachMetres) + &&passageCarveReachMetres>=0.0?passageCarveReachMetres +- :VF_L93PassageCarveReachMetres()) ++ :VF_L129PassageCarveReachMetres()) + { + mayContainResolvedBoundaryBand_=shape.ResolvedBoundaryBandsIntersectSubvoxelRange( + minimumSubvoxels_[2],maximumSubvoxels_[2]); +@@ -4813,11 +4813,14 @@ private: + constexpr double Q=static_cast(VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel); + constexpr double PassageShellMetres=0.75; + constexpr double ReliefMetres=0.21; +- constexpr double SweepReachMetres=4.0; ++ const double SweepReachMetres=VF_L129PassageCarveReachMetres(); + constexpr double CornerBlendMetres=0.50; + constexpr std::size_t CandidateFineSamplesPerSpan=5; ++ const double qPerMetre=Q*1000000.0/ ++ std::max(1,ResolvedLayout->coreVoxelSizeMicrometres); + const double requiredReach=std::max(SweepReachMetres+ReliefMetres + +CornerBlendMetres*0.25,PassageShellMetres+ReliefMetres); ++ const double requiredReachCoreVoxels=requiredReach*qPerMetre/Q; + for(std::size_t passageIndex=0;passageIndexpassages.size(); + ++passageIndex) + { +@@ -4854,7 +4857,7 @@ private: + routeMinimum[axis]=std::min(routeMinimum[axis],localMinimum[axis]); + routeMaximum[axis]=std::max(routeMaximum[axis],localMaximum[axis]); + } +- const double localExtent=requiredReach ++ const double localExtent=requiredReachCoreVoxels + +std::max(prepared.radiusA,prepared.radiusB)/Q+0.01; + FPassageProofBound proof; + for(std::size_t axis=0;axis<3;++axis) +@@ -4872,7 +4875,8 @@ private: + std::ceil((localMaximum[axis]+localExtent)*Q)); + } + } +- const double routeExtent=maximumRadiusSubvoxels/Q+requiredReach+0.01; ++ const double routeExtent=maximumRadiusSubvoxels/Q ++ +requiredReachCoreVoxels+0.01; + const double tileExtent=routeExtent; + std::array featureMinimum{},featureMaximum{}; + for(std::size_t axis=0;axis<3;++axis) +@@ -11442,7 +11446,7 @@ inline void FStandaloneShapeWorld::FScopedPassageTileQueries::prepareSweptTubeBa + const FIntVector& origin,std::int32_t step,std::int32_t cells,std::uint32_t seed) + { + constexpr std::int64_t Q=VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel; +- constexpr double InfluenceMetres=4.0; ++ const double InfluenceMetres=VF_L129PassageCarveReachMetres(); + constexpr double OpenAirSideWallHeightMetres=1.0; + if(!shape_||step<=0||cells<=0||!std::isfinite(passageCarveReachMetres_) + ||std::abs(passageCarveReachMetres_-InfluenceMetres)>1.0e-9)return; +diff --git a/Standalone/Tools/verify/baselines/README.md b/Standalone/Tools/verify/baselines/README.md +index 45fbb9f..fc7a59a 100644 +--- a/Standalone/Tools/verify/baselines/README.md ++++ b/Standalone/Tools/verify/baselines/README.md +@@ -4,7 +4,7 @@ These inputs are byte-for-byte copies of the historical files consumed by the + verification gates. The gates now read this tracked directory instead of + `Saved/Linux`, which is generated and is not present in a fresh checkout. + +-- `owner-hash/`: L46, L52 and L53 diagnostics plus the pinned v212/v214 owner hash baselines. ++- `owner-hash/`: L46, L52 and L53 diagnostics plus the pinned v212/v214 and L129 v226 owner hash baselines. + - `historical-controls/`: L35, L36 and L38 regression-control logs. + - `fixtures/`: Linux25 owner JSON inputs and L33 style-override fixtures. + - `landmarks/`: L45–L48 landmark mesh and layout controls. +diff --git a/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v226.baseline b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v226.baseline +new file mode 100644 +index 0000000..9d3b87b +--- /dev/null ++++ b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v226.baseline +@@ -0,0 +1,12 @@ ++[PipelineFullDetailHash] tiles=960 density=0x91931a57a067fd92 mesh=0xa818654be89790ac payload=0x370ff80451105a39 topology=0x06e507557aa70173 ++[PipelineWholeViewHash] tiles=2370 density=0x1573b570e1cbbf7e mesh=0xd88bf8bcf69ce1ce payload=0x347541780c9d8d71 topology=0x6b8ff8640be6e9d4 ++[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=0x600ce5633a8f9e83 mesh=0xcd40f163b4cf3e0e payload=0xbe81dc276737a33a topology=0x942806963fedb92d ++[PipelineLODHash] lod=3 tiles=208 density=0xf778be0581c49ed8 mesh=0x9aacf9e2a23034f8 payload=0xc1d4a985f2db3df5 topology=0xcdfdb412d3784023 ++[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-owner4-surface-world-style1-v226.baseline b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-owner4-surface-world-style1-v226.baseline +new file mode 100644 +index 0000000..128c807 +--- /dev/null ++++ b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-owner4-surface-world-style1-v226.baseline +@@ -0,0 +1,12 @@ ++[PipelineFullDetailHash] tiles=960 density=0xe1aa01ac806a84fb mesh=0x453624e695910639 payload=0x2f5793602ea13144 topology=0x31a43376cb129e55 ++[PipelineWholeViewHash] tiles=2578 density=0xb82dc1dcdadda8ff mesh=0xe74e85bf3cb0909b payload=0x40bc3871dd9dccbe topology=0x855e712b549606c3 ++[PipelineLODHash] lod=0 tiles=512 density=0x8119a4f12c4661f4 mesh=0xc074e3705293bef2 payload=0x36c965f6b43875ea topology=0x38bed0df168486d0 ++[PipelineLODHash] lod=1 tiles=448 density=0x6270dd0856c53432 mesh=0xa803bb427deeba9a payload=0xf4718f1ce85d4f4f topology=0x7b770585aafd8174 ++[PipelineLODHash] lod=2 tiles=320 density=0xf774df80811a61c1 mesh=0xb223f0f68d0310f8 payload=0x6c3fd8c4aa100ee9 topology=0x923485084c866600 ++[PipelineLODHash] lod=3 tiles=272 density=0x62088ea9f38d2ed0 mesh=0x19bb327ba4ba3287 payload=0xd04c1223d50da0ea topology=0xf3817d1351cc89c5 ++[PipelineLODHash] lod=4 tiles=272 density=0xb743eb64967bddcd mesh=0xf6b5bd36b0ebfead payload=0xd1284c1540f50636 topology=0x4a6e197e2a1a9500 ++[PipelineLODHash] lod=5 tiles=208 density=0x38706b628a74dd17 mesh=0x445b1c7b51489cbb payload=0x713efc66290768f7 topology=0x56486b919146bb1e ++[PipelineLODHash] lod=6 tiles=144 density=0xd53849b2002a1faa mesh=0xaa210abc8498c415 payload=0xd109aef8639706d1 topology=0x61a4d75fbbc35268 ++[PipelineLODHash] lod=7 tiles=96 density=0xb0ea9a140275c9cc mesh=0x3ffd8365c8b0ec29 payload=0x3577afb0a2e4a420 topology=0x97530aafde15b7e0 ++[PipelineLODHash] lod=8 tiles=306 density=0x8b3d1816799d67a0 mesh=0x80bf554f17700e1e payload=0xccbe22c3333a9c34 topology=0xcb11b28f6b6bcc50 ++[PipelineExactQueryHash] probes=9 density=0xf2df67b38b7802df unclamped=0x48b347986345b557 detail=0xefcba20c0c70c415 collision=0x137e8f6c0b03a624 path=direct-Core-queries +diff --git a/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v226.baseline b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v226.baseline +new file mode 100644 +index 0000000..49f85bb +--- /dev/null ++++ b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v226.baseline +@@ -0,0 +1,12 @@ ++[PipelineFullDetailHash] tiles=960 density=0xace56c8f205238ad mesh=0xa9c603a1248de6b8 payload=0xea55f1f4fcc6a894 topology=0x5ea7bc78a1b678ae ++[PipelineWholeViewHash] tiles=2370 density=0x637fdf29ccba949b mesh=0xb02cf034b0c9e375 payload=0x74240706eac0c770 topology=0xe607e19fd4684210 ++[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=0x353ee7ab408a9da1 mesh=0x8d355a8d598d56d5 payload=0x458f26e32d815635 topology=0x2e89b3cba09efcfe ++[PipelineLODHash] lod=3 tiles=208 density=0xfe4f53b3ec010392 mesh=0xbd04d2da98d5b2e0 payload=0x10627f36d82200e8 topology=0xd625f3434ac0a893 ++[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 5fc1584..70f6a69 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-v225.baseline", +- "L125-v225-stamped-passage-sweep") ++ return (BASELINES / "owner-hash/canonical/owner-hash-surface-world-style1-v226.baseline", ++ "L129-v226-physical-passage-reach") + if recipe == "floating-islands" and style == 2: +- return (BASELINES / "owner-hash/canonical/owner-hash-floating-islands-style2-v225.baseline", +- "L125-v225-stamped-passage-sweep") ++ return (BASELINES / "owner-hash/canonical/owner-hash-floating-islands-style2-v226.baseline", ++ "L129-v226-physical-passage-reach") + raise VerificationFailure(f"no pinned owner hash baseline for {recipe} style {style}") + +