wip(assembler): M2 round 2 -- same-LOD borders watertight for MC/hybrid/DC; LOD0/1 transitions still open

Shared halo + deterministic border-quad ownership + T-junction conformance: 625/625 same-LOD for all three.
LOD 2:1 prototype (collar zipper) fails MC 5 / hybrid 38 / DC 40 cases (corners, overhangs).
Hybrid is bit-identical to MC on a sampled native SurfaceWorld cliff; DC rougher. Standalone only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-10 03:56:28 +02:00
1 parent 6953254349
commit a3b7d2015e
34 files changed
+5028 -2048

No files matched your search

@@ -31,14 +31,17 @@ foreach ($Line in $EnvironmentLines) {
$Compiler = Join-Path $env:VCToolsInstallDir 'bin\Hostx64\x64\cl.exe'
if (-not (Test-Path -LiteralPath $Compiler -PathType Leaf)) { throw "MSVC compiler missing: $Compiler" }
$Source = Join-Path $WorkDir 'SharpMesherSpike.cpp'
$CoreInclude = Join-Path $Standalone 'Core\include'
$CoreLibrary = Join-Path $Standalone 'Build\VoxelForgeCore\VoxelForgeCore.lib'
if (-not (Test-Path -LiteralPath $CoreLibrary -PathType Leaf)) { throw "Core library missing: $CoreLibrary" }
$Exe = Join-Path $OutDir 'SharpMesherSpike.exe'
$Obj = Join-Path $BuildDir 'SharpMesherSpike.obj'
$Stdout = Join-Path $WorkDir 'build.stdout.log'
$Stderr = Join-Path $WorkDir 'build.stderr.log'
$CompilerArguments = '/nologo /std:c++20 /O2 /fp:precise /EHsc /MP8 /D_CRT_SECURE_NO_WARNINGS ' +
('/I"{0}" /I"{1}" /Fo"{2}" "{3}" /Fe:"{4}"' -f `
('/I"{0}" /I"{1}" /I"{2}" /Fo"{3}" "{4}" /Fe:"{5}" /link "{6}"' -f `
(Join-Path $Standalone 'Compat'), `
(Join-Path $Standalone 'Source\VoxelForge\Public'), $Obj, $Source, $Exe)
(Join-Path $Standalone 'Source\VoxelForge\Public'), $CoreInclude, $Obj, $Source, $Exe, $CoreLibrary)
$Attempt = 0
do {
+79 -78
View File
@@ -1,125 +1,126 @@
# World assembler M2 round 1: sharp-mesher decision spike
# World assembler M2 round 2 — standalone border closure
Date: 2026-10-10
Status: **Gate failed; no production mesher selected.** Hybrid is the leading candidate for an in-game follow-up, but it does not pass independent tile seams. Every candidate fails the tested LOD0/LOD1 seam.
Status: **same-LOD gate passed; full LOD0/LOD1 gate failed; no production mesher selected.**
## Decision
At 25 cm, feature-aware DC substantially reduces sharp-feature field residual and preserves hard normal splits. The hybrid also leaves the smooth cave-chamber wall on the MC path, where its measured residual matches MC. Its 8-worker mesh cost is about 4.4% above MC.
The hybrid now closes the same-LOD tile-border suite: 625/625 cases, with zero unmatched contour probes, open edges, or nonmanifold edges. MC retains its 625/625 pass, and DC also passes as a reference after the same assembly repair.
Those gains are not enough to choose it: hybrid fails all 500 tagged-shape independent tile-border cases, and DC everywhere fails all 625. MC passes all 625 same-LOD tile-border cases but retains large sharp-feature bevel residual and also fails every LOD transition case. No candidate passes both border gates. Hold architectural recipes until a real border/transition implementation passes.
The 2:1 LOD transition is still not ready. The sharp cliff crossing fixture passes for MC, hybrid, and DC, but the complete 625-case suite has failures on corners, overhangs, a doorway, and two DC cave cases. The contact sheet makes the sharp-feature improvement visible, but the failed full transition gate blocks a production choice and an Unreal implementation this round.
Round 2 should take MC and hybrid into Unreal as opt-in, versioned recipe candidates. Hybrid is the primary quality candidate; MC is the baseline and organic fallback. Bring neighbor halo/ownership rules, a 2:1 transition template or equivalent, and actual collision cooking. Compare the five fixtures in-game with matched cameras, including same-LOD and LOD0/LOD1 borders. Keep DC-everywhere as a reference unless its organic quality and border results improve.
Keep MC as the baseline and hybrid as the sharp-feature candidate. Keep DC-everywhere as a reference; it remains rougher on the sampled native patch. Continue standalone work on a topology-aware 2:1 transition before taking a candidate into Unreal.
## Test setup
## Harness and gates
The standalone C++20 harness uses the plugin’s canonical marching-cubes lookup table and 25 cm cells. It builds a 32³-cell, 8 m tile for each fixture. The lattice phase sweep translates each analytic field by 0, 5, 10, 15, and 20 cm on each axis: 125 phases per fixture and method, 1,875 phase meshes total.
The standalone C++20 spike uses 25 cm cells and five fixtures: a 90-degree corner, doorway, one-metre riser, cliff ledge/overhang, and analytic cave chamber. Each fixture is translated through 125 lattice phases (0, 5, 10, 15, and 20 cm per axis). The retained outputs are [phase_sweep.csv](results/phase_sweep.csv), [cost.csv](results/cost.csv), [determinism.csv](results/determinism.csv), and [seams.csv](results/seams.csv).
The fixtures are a union-of-boxes 90° corner, a box doorway with an analytic void, a one-metre riser, a cliff ledge/overhang, and a smooth spherical cave-chamber cavity. The chamber has negative density in solid rock and positive density in its air cavity, following the plugin sign convention. It is an analytic curved proxy, not a sampled native cave or SurfaceWorld patch.
Same-LOD neighbors are sampled independently with a shared field halo and deterministic ownership of border quads. The assembled pair is checked after open-edge T-junction subdivision; the subdivision preserves the source triangle footprint. Hybrid/DC independent contours are also compared from temporary witness meshes. No shared surface mesh is clipped and reused for the neighbor comparison.
The candidates are:
LOD0/LOD1 uses independent 25 cm and 50 cm half-grids at a 2:1 ratio. The spike clips their surfaces at the border and tries a collar/chain zipper; a residual closed seam loop is capped only when its own sampled field residual is within budget. This is a tested transition prototype, not a complete Transvoxel table.
- **MC:** table-driven marching cubes with linear edge roots and interpolated central-difference field normals. This preserves MC geometry while giving it a fair smooth-normal path.
- **Hybrid:** untagged connected surface components use MC. Components connected to analytic sharp-plane feature tags use dual contouring.
- **DC:** dual contouring on every surface component, including the cave-chamber wall.
The physical error budget is **0.50 m**, one LOD1 sample interval. This is a conservative, camera-independent limit that is easy to audit in the field. It does not establish a screen-space guarantee; round 3 must also check projected error at the target cameras.
DC uses Hermite roots, a fixed-order 3×3 QEF solve, a small center penalty for rank-deficient constraints, cell-bound clamping, deterministic feature selection, and position quantization at 1/65,536 voxel. All candidates share a 0.01 mm positive bias for exact-zero lattice samples. No LOD transition template is implemented in this spike; independent fine/coarse half meshes are compared directly to expose that gate.
## Same-LOD border results
Phase and same-resolution seam sweeps use the five phase offsets above. Same-LOD borders compare independently generated 8 m tiles on either side of x=0. LOD borders compare an independently generated 25 cm half tile against an independently generated 50 cm half tile. Border contours are compared in both directions at five points per segment. A missing contour is recorded as unmatched; the topological audit counts geometric boundary and nonmanifold edges after merging the independent meshes.
Each method has 625 independently generated neighbor cases. “Bad” includes unmatched probes, boundary edges, and nonmanifold edges after assembly.
## Surface residual and crease normals
| Method | Bad cases | Unmatched probes | Open edges | Nonmanifold edges | Maximum contour mismatch |
|---|---:|---:|---:|---:|---:|
| MC | 0 / 625 | 0 | 0 | 0 | 0 m |
| Hybrid | 0 / 625 | 0 | 0 | 0 | 0 m |
| DC | 0 / 625 | 0 | 0 | 0 | 0 m |
The residual is the absolute analytic field value, in metres, sampled at each triangle’s three vertices, three edge midpoints, and centroid. The table shows the equal-weight mean of the 125 phase means and the maximum sample over all phases. Repeated vertex samples count repeatedly. This is a useful analytic-field residual, not a symmetric Hausdorff distance.
The merge-time T-junction conformance added 52 triangles across Hybrid’s suite and 40 across DC’s; MC needed none. Its measured added-triangle field residual is 0 m at the CSV precision. The full per-case data is in [seams.csv](results/seams.csv).
| Fixture | MC mean / max (cm) | Hybrid mean / max (cm) | DC mean / max (cm) |
|---|---:|---:|---:|
| 90° corner | 0.51 / 16.67 | 0.17 / 6.25 | 0.17 / 6.25 |
| Doorway | 0.99 / 16.67 | 0.41 / 12.50 | 0.41 / 12.50 |
| One-metre riser | 0.46 / 16.67 | 0.15 / 6.25 | 0.15 / 6.25 |
| Cliff ledge / overhang | 0.49 / 16.67 | 0.16 / 6.25 | 0.16 / 6.25 |
| Cave-chamber wall | 0.39 / 1.17 | 0.39 / 1.17 | 0.50 / 4.75 |
## 2:1 LOD transition results
MC’s worst sharp residual is 16.67 cm at this phase sample, close to the expected 17.68 cm half-diagonal bevel bound. Hybrid/DC reduce the sharp residual while DC-everywhere is rougher on the smooth chamber than either MC path.
The full gate still fails. Raw fine/coarse contour comparisons stay below the 0.50 m budget, but the transition surface/topology does not close all cases.
Crease split rate counts adjacent triangles with distinct analytic feature labels and face-normal angle above 30°. A split is counted when their average interpolated/vertex normals also differ by more than 30°.
| Method | Bad cases | Seam-band open edges | Seam-band nonmanifold edges | Worst raw contour mismatch | Worst transition field residual |
|---|---:|---:|---:|---:|---:|
| MC | 5 / 625 | 15 | 5 | 0.318199 m | 0.250008 m |
| Hybrid | 38 / 625 | 4,213 | 47 | 0.158352 m | 1.24975 m |
| DC | 40 / 625 | 4,465 | 49 | 0.158352 m | 1.96263 m |
| Fixture | MC split rate | Hybrid split rate | DC split rate |
|---|---:|---:|---:|
| 90° corner | 11.83% | 99.93% | 99.93% |
| Doorway | 24.31% | 100.00% | 100.00% |
| One-metre riser | 12.98% | 99.99% | 99.99% |
| Cliff ledge / overhang | 15.18% | 99.89% | 99.89% |
| Cave-chamber wall | no tagged crease | no tagged crease | no tagged crease |
Failures by fixture: MC has five doorway cases; Hybrid has 25 corner and 13 overhang cases; DC has those same 38 plus two organic-cave cases. Hybrid/DC transition residuals exceed the 0.50 m budget on the corner cases. Some remaining rows have open or nonmanifold seam edges even when the raw contour mismatch is small. The full CSV keeps pre-transition and internal topology counts separate. The unrestricted-cap diagnostic is preserved in [seams_cap_unbounded_diagnostic.csv](results/seams_cap_unbounded_diagnostic.csv).
## Topology and independent borders
The dedicated sharp cliff crossing case passes all three methods: zero unmatched probes, open edges, and nonmanifold edges. Its maximum raw contour mismatch is 0.249977 m for MC and 0.419411 m for Hybrid/DC; the transition field residual maxima are 0.233333 m and 0.238888 m respectively. See [lod_cliff_crossing.csv](results/lod_cliff_crossing.csv).
The phase meshes themselves have no nonmanifold edges. MC has 0 open-edge meshes in 625 fixture/phase cases. Hybrid and DC each have 36 open-edge meshes in 625, summing to 116 open edges across those cases.
The remaining Unreal-only checks are actual `UBodySetup` collision cooking/contact, projected pixel error at the game cameras, and runtime task scheduling/upload against the plugin mesher. None of those can repair the standalone topology failures; the topology gate is still the reason to defer Unreal integration.
Independent-border results aggregate 625 fixture/phase cases per method. “Bad” means unmatched seam probes, boundary edges, or nonmanifold edges. No nonmanifold edges were found.
### Production skirt baseline
| Method | Same-LOD bad cases / 625 | Same-LOD open edges | Same-LOD unmatched probes | LOD0/LOD1 bad cases / 625 | LOD0/LOD1 open edges | LOD0/LOD1 unmatched probes |
The current plugin skirt depth is `max(1, SkirtCells) × Step × GeometryVoxelSize`; skirts are normal-extruded, double-sided visual strips. With Core’s 25 cm geometry voxel size and the default `SkirtCells = 4`, nominal depth is 1 m at LOD0 and 2 m at LOD1. Project settings can override these defaults. Skirts hide many visual gaps but do not make the neighboring surface topologically watertight. The new transition has not yet replaced that production behavior.
## Surface residual and crease splits
Residual is the absolute field value sampled at triangle vertices, edge midpoints, and centroids; it is not a symmetric Hausdorff distance. Values below average the 625 phase rows per method; maxima are the worst sampled value.
| Method | Mean residual | Worst residual | Tagged crease pairs | Normal split pairs | Split rate on tagged creases | Mean triangles / vertices |
|---|---:|---:|---:|---:|---:|---:|
| MC | 0 | 0 | 0 | 625 | 75,494 | 0 |
| Hybrid | 500 | 85,632 | 3,484 | 625 | 75,794 | 5,819 |
| DC | 625 | 101,440 | 3,609 | 625 | 75,790 | 6,128 |
| MC | 0.5664 cm | 16.6670 cm | 10,926 | 1,847 | 16.90% | 3,363.1 / 1,728.8 |
| Hybrid | 0.2552 cm | 12.5027 cm | 140,876 | 140,806 | 99.95% | 3,365.3 / 3,469.2 |
| DC | 0.2786 cm | 12.5027 cm | 140,876 | 140,806 | 99.95% | 3,365.8 / 1,985.6 |
MC’s same-LOD contour match is exact in all cases: zero measured contour distance and zero merged open edges. Hybrid passes only the 125 smooth chamber cases; its 500 tagged-shape cases have open edges. DC also fails the chamber border.
The hybrid keeps untagged/organic components on MC and uses DC for tagged sharp features. It preserves the sharp corner/riser/ledge better than MC in the analytic fixtures, while its feature splits roughly double the vertex count.
Every LOD0/LOD1 case has open boundary edges. For MC, the per-case maximum sampled contour distance has an 18.57 cm median, 26.41 cm 95th percentile, and 31.82 cm worst case; 39 of 625 cases exceed 25 cm. Hybrid has complete contour comparisons in only 130 cases; five of those exceed 25 cm, with a 560.47 cm worst finite comparison. DC has complete contour comparisons in only five cases, with a 560.47 cm worst finite comparison. The large finite outliers and unmatched probes are direct failures, not a pass hidden by averages. The spike has no transition templates, so these results are a transition gate, not a claim that any candidate’s final transition design has been tuned.
## Sampled native SurfaceWorld cliff
## Cost, determinism, and collision proxy
The native comparison samples the 8 m patch at 25 cm from the M1 SurfaceWorld manifest (feature type 4, feature `0x9812c26310b90c9`, manifest hash `0x8933693d9560ba9f`). MC and Hybrid emit bit-identical vertex and triangle arrays, with identical mesh hash `0x9d58e0603f1bf9c7`: 2,345 vertices and 4,496 triangles each. This confirms that the hybrid leaves this untagged native patch unchanged.
Each timing uses an already sampled 32³-cell field grid, three mesh builds, and the median build time. Field sampling, Unreal scheduling, upload, collision cooking, and rendering are excluded. All values below average the five fixtures.
The sampled scalar-field residual is 0.212167 m mean and 16.0068 m max for both MC and Hybrid. This patch is cropped at the 8 m volume boundary and has 192 boundary edges; these values are not a seam result, and the scalar field is not a signed-distance guarantee. DC-everywhere differs (2,247 vertices, 3,961 triangles, 4.57272 m mean / 16.5898 m max, 504 boundary edges and 74 nonmanifold edges). The native CSV is [native_surface.csv](results/native_surface.csv).
| Worker count | MC mean ms/tile | Hybrid mean ms/tile | DC mean ms/tile |
## Cost and determinism
The timer starts after the 32³ field grid is sampled, measures meshing only, and excludes Unreal scheduling, upload, collision cooking, and rendering. Values below are the median of five fixture medians; W1/W8 use three builds, while W16 uses one timed build because repeated W16 thread creation had caused a host access violation. Hash determinism is still checked at all three worker counts.
| Workers | MC ms/tile | Hybrid ms/tile | DC ms/tile |
|---:|---:|---:|---:|
| 1 | 16.308 | 17.375 | 16.269 |
| 8 | 14.275 | 14.907 | 13.996 |
| 16 | 14.555 | 15.291 | 14.129 |
| 1 | 16.316 | 17.534 | 16.417 |
| 8 | 53.914 | 54.840 | 52.606 |
| 16 | 86.961 | 90.490 | 89.476 |
At W8, hybrid is 4.4% slower and DC is 2.0% faster than MC. Mean triangle counts are 3,454.4 / 3,456.8 / 3,457.6 for MC / Hybrid / DC. Mean vertex counts are 1,728.8 / 3,469.2 / 1,985.6. Hybrid’s feature-split path therefore roughly doubles output vertices for negligible triangle change.
All 45 W1/W8/W16 rows match the W1 hash for that method and fixture. The standalone collision proxy copies the render mesh: all hashes match and measured geometry delta is 0 m. This does not test Unreal collision cooking.
All 45 determinism rows (five fixtures × three methods × three worker counts) match the W1 reference for that fixture and method: zero cross-worker hash mismatches. W16 is a 16-worker software pool running with process affinity limited to eight logical CPUs.
These timings are **not comparable to the optimized production MC mesher**. The harness is a separate STL/map-based implementation with its own worker dispatch and already-sampled grid; the strong slowdown at W8/W16 is further evidence not to use these numbers as a production estimate. They are useful only for comparisons within this harness.
The standalone collision proxy is the same emitted vertex/triangle mesh. All 45 proxy hashes match the visual mesh hash and report 0 m geometry delta. This verifies the candidate mesh handoff only; there is no independent collision simplification, Unreal physics cook, or contact test in round 1.
## Contact sheet
## Captures
The [updated offline contact sheet](results/captures/contact_sheet.jpg) is 864 × 1,968 pixels. It contains the five analytic fixtures, the sampled SurfaceWorld cliff, and both LOD seam views, with MC/Hybrid/DC columns. The 24 individual JPEGs are 288 × 246 pixels; all 25 files including the sheet are below 300 KB. No viewer or GPU path was used.
The [contact sheet](results/captures/contact_sheet.jpg) is an offline orthographic rasterization of matched MC, Hybrid, and DC meshes for all five fixtures, plus one LOD seam view per method. It is 864 × 1,476 pixels. The 18 individual captures are 288 × 246 pixels. There are 19 JPEGs including the sheet; all are under 300 KB, and the largest is the 128,260-byte contact sheet. No viewer was launched.
## Recommendation and round-3 Unreal plan
Capture files:
Do not select or enable the hybrid in the owner project yet. The same-LOD gate is closed, but the full LOD gate is not. The current Core world hash/default path is untouched.
- [90° corner — MC](results/captures/corner90_MC.jpg), [Hybrid](results/captures/corner90_Hybrid.jpg), [DC](results/captures/corner90_DC.jpg)
- [Doorway — MC](results/captures/doorway_MC.jpg), [Hybrid](results/captures/doorway_Hybrid.jpg), [DC](results/captures/doorway_DC.jpg)
- [One-metre riser — MC](results/captures/riser1m_MC.jpg), [Hybrid](results/captures/riser1m_Hybrid.jpg), [DC](results/captures/riser1m_DC.jpg)
- [Cliff ledge — MC](results/captures/cliff_overhang_MC.jpg), [Hybrid](results/captures/cliff_overhang_Hybrid.jpg), [DC](results/captures/cliff_overhang_DC.jpg)
- [Cave chamber — MC](results/captures/organic_cave_chamber_MC.jpg), [Hybrid](results/captures/organic_cave_chamber_Hybrid.jpg), [DC](results/captures/organic_cave_chamber_DC.jpg)
- [LOD seam — MC](results/captures/lodseam_MC.jpg), [Hybrid](results/captures/lodseam_Hybrid.jpg), [DC](results/captures/lodseam_DC.jpg)
When the standalone LOD gate passes, round 3 should:
## Run ledger and constraints
1. Add an **opt-in, versioned** recipe such as `WorldAssemblerHybridV1`, default off, with its mesher, feature ownership, transition, and collision settings recorded as part of the version. Keep the existing Core recipe and default hashes unchanged.
2. Add an Unreal test map with the five analytic fixtures, the sampled SurfaceWorld cliff, and a native Core cave tile. Include independent same-LOD neighbors and a sharp cliff crossing from LOD0 to LOD1. Compare skirts on/off and use matched cameras plus wireframe views.
3. Cook collision through the real Unreal path. Wait for cooking completion, then run capsule sweeps/walk tests over the doorway, riser, cliff underside, cave wall, and both borders. Check collision/render agreement and recooking after a local edit.
4. Record mesh and collision cook latency, CPU/memory, triangle/vertex counts, LOD error in pixels at the fixture cameras, and player contact results. Keep MC as the direct baseline and preserve a one-switch rollback to the existing recipe.
## Run ledger and scope
| Run/check | Result |
|---|---|
| Final MSVC C++20 build | Passed in 4.42 s, BelowNormal, affinity 0xFF00. |
| Final phase/cost/determinism/seam run | Passed in 114.208 s; 1,875 phase meshes and 1,875 independent seam cases, BelowNormal, affinity 0xFF00. |
| Final capture renderer | Passed in 2.61 s, BelowNormal, affinity 0xFF00; 19 files under the 300 KB cap. |
| Earlier phase run 1 | Exited normally in 31.14 s; exact-zero lattice degeneracies exposed topology defects. |
| Earlier phase run 2 | Exited normally in 31.11 s after adding the deterministic exact-zero bias; DC still had boundary defects. |
| Earlier phase run 3 | Exited normally in 35.07 s after splitting disconnected cell patches; remaining boundary defects kept it from acceptance. |
| Earlier phase run 4 | Exited normally in 36.55 s after making MC endpoint-gradient interpolation explicit; used for normal-split comparison. |
| Earlier seam run | Exited normally in 74.21 s, but clipped a shared mesh and did not test independently generated borders. It was superseded by the final independent-neighbor seam run. |
| Tool validation | One early PowerShell parser check used an invalid reference argument. Two later analysis-only PowerShell aggregation commands had syntax errors. All were corrected; none launched a mesher process. One early MSVC environment setup printed a nonfatal vswhere helper warning; compilation succeeded, and the final build emitted no warning. |
| Final MSVC C++20 build | Passed in 5.44 s, BelowNormal, affinity `0xFF00`. |
| Full seam run with unrestricted residual-loop caps | Completed in 602.78 s; 83 LOD cases failed. Preserved as `results/seams_cap_unbounded_diagnostic.csv`. |
| Final full seam run with 0.50 m cap-residual guard | Completed in 601.31 s; same-LOD passed 625/625 for all methods, LOD failures were MC 5, Hybrid 38, DC 40. No crash or guard trip. |
| Cost/phase/native analysis | Completed in 120.95 s; 1,875 phase rows, 45 determinism rows, native patch comparison. |
| Final offline renderer | Passed in 3.14 s; 25 JPEGs under the 300 KB cap. |
| Earlier full seam variants | Completed in 559.32 s and 566.44 s. Both failed earlier same-LOD Hybrid/DC cases (36/625 each); superseded by the final T-junction conformance pass. |
| Focused transition prototypes | Completed within seconds. Earlier MC doorway variants left 64, then 3–4 open edges; whole-mesh endpoint snapping introduced nonmanifold edges. Those variants were rejected. The bounded residual-loop cap closes this focused doorway case, but the full LOD matrix still fails. |
| Earlier native halo diagnostic | An initial process exited `0xC0000005`; an AddressSanitizer launch first failed `0xC0000135` because its runtime DLL was unavailable. After using the Visual Studio runtime path, ASan found the halo index overflow; the indexing was fixed, and subsequent harness runs completed. |
| W16 timing diagnostic | Repeated creation/timing of 16 OS workers caused a host access violation. W16 now uses one timed build; hash determinism remains checked. |
| Aggregation tools | Two PowerShell summary attempts had query errors, including a missing `vertices` field in `phase_sweep.csv`; corrected queries ran without launching a mesher. No `0xC0000142` retry was needed. |
Every final build/test/render process used BelowNormal priority and affinity 0xFF00, limiting it to eight of the 16 logical processors. The build/test/render scripts enforce an 8 GB private-memory guard and 15-minute timeout. No process hit either limit, crashed, or needed a 0xC0000142 retry. The earlier phase runs above exited normally; their topology/seam measurements failed or were superseded as noted. No viewer or owner editor was opened. No owner project was built and no .uasset was touched.
Every final build, mesher, analysis, and renderer process ran BelowNormal with affinity `0xFF00`; the scripts enforce an 8 GB private-memory limit and 15-minute timeout. Peak observed mesher private memory was under 0.2 GB. No final process crashed, exceeded a limit, or needed a retry.
## Files added for the spike
All edits and outputs are under `Plugins/VoxelForge/Standalone/Research/WorldAssemblerM2`, plus this dialogue log. No `Source/` file, Core source, owner project file, `.uasset`, or editor was touched. No commit, push, or stash was made.
New implementation and launch files:
## Files changed and new source files
- [SharpMesherSpike.cpp](SharpMesherSpike.cpp)
- [BuildSharpMesherSpike.ps1](BuildSharpMesherSpike.ps1)
- [RunSharpMesherSpike.ps1](RunSharpMesherSpike.ps1)
- [RenderSharpMesherCaptures.ps1](RenderSharpMesherCaptures.ps1)
- [RenderSharpMesherCaptures.py](RenderSharpMesherCaptures.py)
Updated existing standalone files: [SharpMesherSpike.cpp](SharpMesherSpike.cpp), [BuildSharpMesherSpike.ps1](BuildSharpMesherSpike.ps1), [RunSharpMesherSpike.ps1](RunSharpMesherSpike.ps1), and [RenderSharpMesherCaptures.py](RenderSharpMesherCaptures.py). Updated this report and appended the M2 round-2 dialogue entry.
The report, CSV measurements, exported OBJ meshes, offline captures, executable/object build outputs, and run logs are also in this WorldAssemblerM2 directory. No files under Source were changed.
**New source files this round: none.** CSVs, OBJ meshes, JPEG captures, logs, and local build outputs are generated research artifacts; none were committed.
@@ -19,6 +19,7 @@ PIECES = (
("riser1m", "one metre riser"),
("cliff_overhang", "cliff ledge / overhang"),
("organic_cave_chamber", "organic cave chamber wall"),
("native_surface_cliff", "sampled SurfaceWorld cliff"),
)
WIDTH, HEIGHT = 288, 216
BG = (239, 242, 244)
@@ -56,14 +57,26 @@ def read_obj(path: Path):
return vertices, normals, faces
def project_mesh(vertices, faces, seam=False):
def project_mesh(vertices, faces, seam=False, target=None):
# One view is reused for every candidate in a row: azimuth 38°, elevation 27°.
target = (0.0, 0.0, 0.0)
if target is None:
if vertices:
bounds_min = tuple(min(v[i] for v in vertices) for i in range(3))
bounds_max = tuple(max(v[i] for v in vertices) for i in range(3))
target = tuple((bounds_min[i] + bounds_max[i]) * 0.5 for i in range(3))
else:
target = (0.0, 0.0, 0.0)
view_dir = normalize((8.0, -10.0, 7.0))
forward = tuple(-c for c in view_dir)
right = normalize(cross(forward, (0.0, 0.0, 1.0)))
up = normalize(cross(right, forward))
scale = 20.2
projected_bounds = []
for point in vertices:
rel = tuple(point[i] - target[i] for i in range(3))
projected_bounds.append((dot(rel, right), dot(rel, up)))
span_x = max((point[0] for point in projected_bounds), default=0.0) - min((point[0] for point in projected_bounds), default=0.0)
span_y = max((point[1] for point in projected_bounds), default=0.0) - min((point[1] for point in projected_bounds), default=0.0)
scale = min(20.2, 0.84 * min((WIDTH - 24) / max(span_x, 1.0e-6), (HEIGHT - 24) / max(span_y, 1.0e-6)))
projected = []
for p in vertices:
rel = tuple(p[i] - target[i] for i in range(3))
@@ -102,7 +115,10 @@ def raster(path: Path, color_by_x=False):
for i in range(1, len(clipped) - 1):
clipped_faces.append(((first, first), (first + i, first + i), (first + i + 1, first + i + 1)))
vertices, normals, faces = clipped_vertices, clipped_normals, clipped_faces
projected = project_mesh(vertices, faces, color_by_x)
bounds_min = tuple(min(v[i] for v in vertices) for i in range(3))
bounds_max = tuple(max(v[i] for v in vertices) for i in range(3))
target = tuple((bounds_min[i] + bounds_max[i]) * 0.5 for i in range(3))
projected = project_mesh(vertices, faces, color_by_x, target)
pixels = Image.new("RGB", (WIDTH, HEIGHT), BG)
zbuf = [float("inf")] * (WIDTH * HEIGHT)
px = pixels.load()
@@ -146,7 +162,7 @@ def raster(path: Path, color_by_x=False):
draw = ImageDraw.Draw(pixels)
# Project a visible segment on the LOD boundary plane, x=0.
seam_world = [(-0.0, y, z) for y, z in ((-4, -4), (4, -4), (4, 4), (-4, 4), (-4, -4))]
seam_points = project_mesh(seam_world, [], True)
seam_points = project_mesh(seam_world, [], True, target)
draw.line([(p[0], p[1]) for p in seam_points], fill=(181, 55, 49), width=2)
return pixels
@@ -174,14 +190,14 @@ def main():
captures.append(row)
seam_row = []
for method in METHODS:
obj = RESULTS / "meshes" / f"lodseam_cliff_overhang_{method}.obj"
image = capture_title(raster(obj, color_by_x=True), "LOD0 to LOD1 cliff seam", f"{method} | fine left, coarse right, x=0 seam")
path = CAPTURES / f"lodseam_{method}.jpg"
obj = RESULTS / "meshes" / f"lodseam_cliff_crossing_{method}.obj"
image = capture_title(raster(obj, color_by_x=True), "Sharp cliff across LOD border", f"{method} | LOD0 left, LOD1 right, x=0")
path = CAPTURES / f"lodseam_cliff_crossing_{method}.jpg"
image.save(path, quality=86, optimize=True)
seam_row.append(image)
captures.append(seam_row)
sheet = Image.new("RGB", (WIDTH * 3, (HEIGHT + 30) * 6), (221, 227, 230))
sheet = Image.new("RGB", (WIDTH * 3, (HEIGHT + 30) * len(captures)), (221, 227, 230))
draw = ImageDraw.Draw(sheet)
for row_index, row in enumerate(captures):
for col_index, image in enumerate(row):
@@ -1,6 +1,8 @@
[CmdletBinding()]
param(
[ValidateRange(2,5)][int]$PhaseCount = 5
[ValidateRange(2,5)][int]$PhaseCount = 5,
[ValidateSet('all','seams','native','analysis')][string]$Mode = 'all',
[ValidateRange(0,1875)][int]$SeamRowLimit = 0
)
$ErrorActionPreference = 'Stop'
@@ -23,7 +25,9 @@ do {
Remove-Item -LiteralPath $Stdout, $Stderr -Force -ErrorAction SilentlyContinue
$Info = [Diagnostics.ProcessStartInfo]::new()
$Info.FileName = $Exe
$Info.Arguments = ('--out="{0}" --phase-count={1}' -f $OutDir, $PhaseCount)
$ModeArgument = if ($Mode -eq 'seams') { ' --seams-only' } elseif ($Mode -eq 'native') { ' --native-only' } elseif ($Mode -eq 'analysis') { ' --analysis-only' } else { '' }
$RowLimitArgument = if ($SeamRowLimit -gt 0) { ' --seam-row-limit={0}' -f $SeamRowLimit } else { '' }
$Info.Arguments = ('--out="{0}" --phase-count={1}{2}{3}' -f $OutDir, $PhaseCount, $ModeArgument, $RowLimitArgument)
$Info.WorkingDirectory = [IO.Path]::GetFullPath((Join-Path $WorkDir '..\..'))
$Info.UseShellExecute = $false
$Info.CreateNoWindow = $true
File diff suppressed because it is too large. Load diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

@@ -1,46 +1,46 @@
piece,method,workers,cell_count,triangles,vertices,mesh_ms_median_3,mesh_hash,collision_proxy_hash,collision_geometry_delta_m
corner90,MC,1,32768,3192,1598,16.5302,0x3e35202e741326da,0x3e35202e741326da,0
corner90,MC,8,32768,3192,1598,14.1565,0x3e35202e741326da,0x3e35202e741326da,0
corner90,MC,16,32768,3192,1598,14.5744,0x3e35202e741326da,0x3e35202e741326da,0
corner90,Hybrid,1,32768,3196,3473,17.3756,0x1c68ed55a97a2b70,0x1c68ed55a97a2b70,0
corner90,Hybrid,8,32768,3196,3473,14.7298,0x1c68ed55a97a2b70,0x1c68ed55a97a2b70,0
corner90,Hybrid,16,32768,3196,3473,15.1832,0x1c68ed55a97a2b70,0x1c68ed55a97a2b70,0
corner90,DC,1,32768,3196,1875,16.346,0x27eb83e4bcb5d532,0x27eb83e4bcb5d532,0
corner90,DC,8,32768,3196,1875,13.5541,0x27eb83e4bcb5d532,0x27eb83e4bcb5d532,0
corner90,DC,16,32768,3196,1875,13.9794,0x27eb83e4bcb5d532,0x27eb83e4bcb5d532,0
doorway,MC,1,32768,2172,1086,15.0354,0x5091c48df9516232,0x5091c48df9516232,0
doorway,MC,8,32768,2172,1086,13.7949,0x5091c48df9516232,0x5091c48df9516232,0
doorway,MC,16,32768,2172,1086,13.9519,0x5091c48df9516232,0x5091c48df9516232,0
doorway,Hybrid,1,32768,2172,2462,15.8758,0xc70ca49841d4ad46,0xc70ca49841d4ad46,0
doorway,Hybrid,8,32768,2172,2462,14.137,0xc70ca49841d4ad46,0xc70ca49841d4ad46,0
doorway,Hybrid,16,32768,2172,2462,14.5053,0xc70ca49841d4ad46,0xc70ca49841d4ad46,0
doorway,DC,1,32768,2172,1376,15.0068,0x7ec18c54d9af2487,0x7ec18c54d9af2487,0
doorway,DC,8,32768,2172,1376,13.2934,0x7ec18c54d9af2487,0x7ec18c54d9af2487,0
doorway,DC,16,32768,2172,1376,13.2488,0x7ec18c54d9af2487,0x7ec18c54d9af2487,0
riser1m,MC,1,32768,4428,2216,17.6744,0x930603791a29a779,0x930603791a29a779,0
riser1m,MC,8,32768,4428,2216,15.0862,0x930603791a29a779,0x930603791a29a779,0
riser1m,MC,16,32768,4428,2216,15.501,0x930603791a29a779,0x930603791a29a779,0
riser1m,Hybrid,1,32768,4432,4775,19.222,0x7a80c8099ed5e2df,0x7a80c8099ed5e2df,0
riser1m,Hybrid,8,32768,4432,4775,15.9639,0x7a80c8099ed5e2df,0x7a80c8099ed5e2df,0
riser1m,Hybrid,16,32768,4432,4775,16.2443,0x7a80c8099ed5e2df,0x7a80c8099ed5e2df,0
riser1m,DC,1,32768,4432,2559,17.6231,0x7a58ef3dd552662f,0x7a58ef3dd552662f,0
riser1m,DC,8,32768,4432,2559,15.5117,0x7a58ef3dd552662f,0x7a58ef3dd552662f,0
riser1m,DC,16,32768,4432,2559,15.5445,0x7a58ef3dd552662f,0x7a58ef3dd552662f,0
cliff_overhang,MC,1,32768,5036,2520,18.5265,0x1881bd75ddc7e7de,0x1881bd75ddc7e7de,0
cliff_overhang,MC,8,32768,5036,2520,15.2582,0x1881bd75ddc7e7de,0x1881bd75ddc7e7de,0
cliff_overhang,MC,16,32768,5036,2520,15.3717,0x1881bd75ddc7e7de,0x1881bd75ddc7e7de,0
cliff_overhang,Hybrid,1,32768,5040,5412,19.8127,0x985b8497adfe9dec,0x985b8497adfe9dec,0
cliff_overhang,Hybrid,8,32768,5040,5412,15.9717,0x985b8497adfe9dec,0x985b8497adfe9dec,0
cliff_overhang,Hybrid,16,32768,5040,5412,16.4467,0x985b8497adfe9dec,0x985b8497adfe9dec,0
cliff_overhang,DC,1,32768,5040,2892,18.232,0x4723adced541eab2,0x4723adced541eab2,0
cliff_overhang,DC,8,32768,5040,2892,14.6485,0x4723adced541eab2,0x4723adced541eab2,0
cliff_overhang,DC,16,32768,5040,2892,14.7275,0x4723adced541eab2,0x4723adced541eab2,0
organic_cave_chamber,MC,1,32768,2444,1224,13.7729,0x50031a0a691ec6f4,0x50031a0a691ec6f4,0
organic_cave_chamber,MC,8,32768,2444,1224,13.0782,0x50031a0a691ec6f4,0x50031a0a691ec6f4,0
organic_cave_chamber,MC,16,32768,2444,1224,13.3739,0x50031a0a691ec6f4,0x50031a0a691ec6f4,0
organic_cave_chamber,Hybrid,1,32768,2444,1224,14.5881,0x50031a0a691ec6f4,0x50031a0a691ec6f4,0
organic_cave_chamber,Hybrid,8,32768,2444,1224,13.732,0x50031a0a691ec6f4,0x50031a0a691ec6f4,0
organic_cave_chamber,Hybrid,16,32768,2444,1224,14.0734,0x50031a0a691ec6f4,0x50031a0a691ec6f4,0
organic_cave_chamber,DC,1,32768,2448,1226,14.1388,0x317a60749cc26f6a,0x317a60749cc26f6a,0
organic_cave_chamber,DC,8,32768,2448,1226,12.971,0x317a60749cc26f6a,0x317a60749cc26f6a,0
organic_cave_chamber,DC,16,32768,2448,1226,13.1444,0x317a60749cc26f6a,0x317a60749cc26f6a,0
corner90,MC,1,32768,3192,1598,16.3157,0x3e35202e741326da,0x3e35202e741326da,0
corner90,MC,8,32768,3192,1598,53.6312,0x3e35202e741326da,0x3e35202e741326da,0
corner90,MC,16,32768,3192,1598,86.3833,0x3e35202e741326da,0x3e35202e741326da,0
corner90,Hybrid,1,32768,3196,3473,17.5341,0x1c68ed55a97a2b70,0x1c68ed55a97a2b70,0
corner90,Hybrid,8,32768,3196,3473,54.4508,0x1c68ed55a97a2b70,0x1c68ed55a97a2b70,0
corner90,Hybrid,16,32768,3196,3473,88.7485,0x1c68ed55a97a2b70,0x1c68ed55a97a2b70,0
corner90,DC,1,32768,3196,1875,16.4166,0x27eb83e4bcb5d532,0x27eb83e4bcb5d532,0
corner90,DC,8,32768,3196,1875,50.7349,0x27eb83e4bcb5d532,0x27eb83e4bcb5d532,0
corner90,DC,16,32768,3196,1875,89.7405,0x27eb83e4bcb5d532,0x27eb83e4bcb5d532,0
doorway,MC,1,32768,2172,1086,15.0271,0x5091c48df9516232,0x5091c48df9516232,0
doorway,MC,8,32768,2172,1086,53.9143,0x5091c48df9516232,0x5091c48df9516232,0
doorway,MC,16,32768,2172,1086,86.9611,0x5091c48df9516232,0x5091c48df9516232,0
doorway,Hybrid,1,32768,2172,2462,16.808,0xc70ca49841d4ad46,0xc70ca49841d4ad46,0
doorway,Hybrid,8,32768,2172,2462,51.3028,0xc70ca49841d4ad46,0xc70ca49841d4ad46,0
doorway,Hybrid,16,32768,2172,2462,90.4899,0xc70ca49841d4ad46,0xc70ca49841d4ad46,0
doorway,DC,1,32768,2172,1376,14.9295,0x7ec18c54d9af2487,0x7ec18c54d9af2487,0
doorway,DC,8,32768,2172,1376,50.7911,0x7ec18c54d9af2487,0x7ec18c54d9af2487,0
doorway,DC,16,32768,2172,1376,89.4764,0x7ec18c54d9af2487,0x7ec18c54d9af2487,0
riser1m,MC,1,32768,4428,2216,17.0044,0x930603791a29a779,0x930603791a29a779,0
riser1m,MC,8,32768,4428,2216,55.4369,0x930603791a29a779,0x930603791a29a779,0
riser1m,MC,16,32768,4428,2216,88.7519,0x930603791a29a779,0x930603791a29a779,0
riser1m,Hybrid,1,32768,4432,4775,18.335,0x7a80c8099ed5e2df,0x7a80c8099ed5e2df,0
riser1m,Hybrid,8,32768,4432,4775,54.8397,0x7a80c8099ed5e2df,0x7a80c8099ed5e2df,0
riser1m,Hybrid,16,32768,4432,4775,89.4327,0x7a80c8099ed5e2df,0x7a80c8099ed5e2df,0
riser1m,DC,1,32768,4432,2559,17.3764,0x7a58ef3dd552662f,0x7a58ef3dd552662f,0
riser1m,DC,8,32768,4432,2559,53.7095,0x7a58ef3dd552662f,0x7a58ef3dd552662f,0
riser1m,DC,16,32768,4432,2559,89.3463,0x7a58ef3dd552662f,0x7a58ef3dd552662f,0
cliff_overhang,MC,1,32768,5036,2520,17.7295,0x1881bd75ddc7e7de,0x1881bd75ddc7e7de,0
cliff_overhang,MC,8,32768,5036,2520,54.7049,0x1881bd75ddc7e7de,0x1881bd75ddc7e7de,0
cliff_overhang,MC,16,32768,5036,2520,88.8038,0x1881bd75ddc7e7de,0x1881bd75ddc7e7de,0
cliff_overhang,Hybrid,1,32768,5040,5412,20.57,0x985b8497adfe9dec,0x985b8497adfe9dec,0
cliff_overhang,Hybrid,8,32768,5040,5412,55.3158,0x985b8497adfe9dec,0x985b8497adfe9dec,0
cliff_overhang,Hybrid,16,32768,5040,5412,92.9896,0x985b8497adfe9dec,0x985b8497adfe9dec,0
cliff_overhang,DC,1,32768,5040,2892,17.9445,0x4723adced541eab2,0x4723adced541eab2,0
cliff_overhang,DC,8,32768,5040,2892,53.6535,0x4723adced541eab2,0x4723adced541eab2,0
cliff_overhang,DC,16,32768,5040,2892,91.0395,0x4723adced541eab2,0x4723adced541eab2,0
organic_cave_chamber,MC,1,32768,2444,1224,13.1379,0x50031a0a691ec6f4,0x50031a0a691ec6f4,0
organic_cave_chamber,MC,8,32768,2444,1224,53.0874,0x50031a0a691ec6f4,0x50031a0a691ec6f4,0
organic_cave_chamber,MC,16,32768,2444,1224,86.6699,0x50031a0a691ec6f4,0x50031a0a691ec6f4,0
organic_cave_chamber,Hybrid,1,32768,2444,1224,14.9431,0x50031a0a691ec6f4,0x50031a0a691ec6f4,0
organic_cave_chamber,Hybrid,8,32768,2444,1224,55.2694,0x50031a0a691ec6f4,0x50031a0a691ec6f4,0
organic_cave_chamber,Hybrid,16,32768,2444,1224,95.9217,0x50031a0a691ec6f4,0x50031a0a691ec6f4,0
organic_cave_chamber,DC,1,32768,2448,1226,13.2164,0x317a60749cc26f6a,0x317a60749cc26f6a,0
organic_cave_chamber,DC,8,32768,2448,1226,52.6061,0x317a60749cc26f6a,0x317a60749cc26f6a,0
organic_cave_chamber,DC,16,32768,2448,1226,86.348,0x317a60749cc26f6a,0x317a60749cc26f6a,0
1 piece method workers cell_count triangles vertices mesh_ms_median_3 mesh_hash collision_proxy_hash collision_geometry_delta_m
2 corner90 MC 1 32768 3192 1598 16.5302 16.3157 0x3e35202e741326da 0x3e35202e741326da 0
3 corner90 MC 8 32768 3192 1598 14.1565 53.6312 0x3e35202e741326da 0x3e35202e741326da 0
4 corner90 MC 16 32768 3192 1598 14.5744 86.3833 0x3e35202e741326da 0x3e35202e741326da 0
5 corner90 Hybrid 1 32768 3196 3473 17.3756 17.5341 0x1c68ed55a97a2b70 0x1c68ed55a97a2b70 0
6 corner90 Hybrid 8 32768 3196 3473 14.7298 54.4508 0x1c68ed55a97a2b70 0x1c68ed55a97a2b70 0
7 corner90 Hybrid 16 32768 3196 3473 15.1832 88.7485 0x1c68ed55a97a2b70 0x1c68ed55a97a2b70 0
8 corner90 DC 1 32768 3196 1875 16.346 16.4166 0x27eb83e4bcb5d532 0x27eb83e4bcb5d532 0
9 corner90 DC 8 32768 3196 1875 13.5541 50.7349 0x27eb83e4bcb5d532 0x27eb83e4bcb5d532 0
10 corner90 DC 16 32768 3196 1875 13.9794 89.7405 0x27eb83e4bcb5d532 0x27eb83e4bcb5d532 0
11 doorway MC 1 32768 2172 1086 15.0354 15.0271 0x5091c48df9516232 0x5091c48df9516232 0
12 doorway MC 8 32768 2172 1086 13.7949 53.9143 0x5091c48df9516232 0x5091c48df9516232 0
13 doorway MC 16 32768 2172 1086 13.9519 86.9611 0x5091c48df9516232 0x5091c48df9516232 0
14 doorway Hybrid 1 32768 2172 2462 15.8758 16.808 0xc70ca49841d4ad46 0xc70ca49841d4ad46 0
15 doorway Hybrid 8 32768 2172 2462 14.137 51.3028 0xc70ca49841d4ad46 0xc70ca49841d4ad46 0
16 doorway Hybrid 16 32768 2172 2462 14.5053 90.4899 0xc70ca49841d4ad46 0xc70ca49841d4ad46 0
17 doorway DC 1 32768 2172 1376 15.0068 14.9295 0x7ec18c54d9af2487 0x7ec18c54d9af2487 0
18 doorway DC 8 32768 2172 1376 13.2934 50.7911 0x7ec18c54d9af2487 0x7ec18c54d9af2487 0
19 doorway DC 16 32768 2172 1376 13.2488 89.4764 0x7ec18c54d9af2487 0x7ec18c54d9af2487 0
20 riser1m MC 1 32768 4428 2216 17.6744 17.0044 0x930603791a29a779 0x930603791a29a779 0
21 riser1m MC 8 32768 4428 2216 15.0862 55.4369 0x930603791a29a779 0x930603791a29a779 0
22 riser1m MC 16 32768 4428 2216 15.501 88.7519 0x930603791a29a779 0x930603791a29a779 0
23 riser1m Hybrid 1 32768 4432 4775 19.222 18.335 0x7a80c8099ed5e2df 0x7a80c8099ed5e2df 0
24 riser1m Hybrid 8 32768 4432 4775 15.9639 54.8397 0x7a80c8099ed5e2df 0x7a80c8099ed5e2df 0
25 riser1m Hybrid 16 32768 4432 4775 16.2443 89.4327 0x7a80c8099ed5e2df 0x7a80c8099ed5e2df 0
26 riser1m DC 1 32768 4432 2559 17.6231 17.3764 0x7a58ef3dd552662f 0x7a58ef3dd552662f 0
27 riser1m DC 8 32768 4432 2559 15.5117 53.7095 0x7a58ef3dd552662f 0x7a58ef3dd552662f 0
28 riser1m DC 16 32768 4432 2559 15.5445 89.3463 0x7a58ef3dd552662f 0x7a58ef3dd552662f 0
29 cliff_overhang MC 1 32768 5036 2520 18.5265 17.7295 0x1881bd75ddc7e7de 0x1881bd75ddc7e7de 0
30 cliff_overhang MC 8 32768 5036 2520 15.2582 54.7049 0x1881bd75ddc7e7de 0x1881bd75ddc7e7de 0
31 cliff_overhang MC 16 32768 5036 2520 15.3717 88.8038 0x1881bd75ddc7e7de 0x1881bd75ddc7e7de 0
32 cliff_overhang Hybrid 1 32768 5040 5412 19.8127 20.57 0x985b8497adfe9dec 0x985b8497adfe9dec 0
33 cliff_overhang Hybrid 8 32768 5040 5412 15.9717 55.3158 0x985b8497adfe9dec 0x985b8497adfe9dec 0
34 cliff_overhang Hybrid 16 32768 5040 5412 16.4467 92.9896 0x985b8497adfe9dec 0x985b8497adfe9dec 0
35 cliff_overhang DC 1 32768 5040 2892 18.232 17.9445 0x4723adced541eab2 0x4723adced541eab2 0
36 cliff_overhang DC 8 32768 5040 2892 14.6485 53.6535 0x4723adced541eab2 0x4723adced541eab2 0
37 cliff_overhang DC 16 32768 5040 2892 14.7275 91.0395 0x4723adced541eab2 0x4723adced541eab2 0
38 organic_cave_chamber MC 1 32768 2444 1224 13.7729 13.1379 0x50031a0a691ec6f4 0x50031a0a691ec6f4 0
39 organic_cave_chamber MC 8 32768 2444 1224 13.0782 53.0874 0x50031a0a691ec6f4 0x50031a0a691ec6f4 0
40 organic_cave_chamber MC 16 32768 2444 1224 13.3739 86.6699 0x50031a0a691ec6f4 0x50031a0a691ec6f4 0
41 organic_cave_chamber Hybrid 1 32768 2444 1224 14.5881 14.9431 0x50031a0a691ec6f4 0x50031a0a691ec6f4 0
42 organic_cave_chamber Hybrid 8 32768 2444 1224 13.732 55.2694 0x50031a0a691ec6f4 0x50031a0a691ec6f4 0
43 organic_cave_chamber Hybrid 16 32768 2444 1224 14.0734 95.9217 0x50031a0a691ec6f4 0x50031a0a691ec6f4 0
44 organic_cave_chamber DC 1 32768 2448 1226 14.1388 13.2164 0x317a60749cc26f6a 0x317a60749cc26f6a 0
45 organic_cave_chamber DC 8 32768 2448 1226 12.971 52.6061 0x317a60749cc26f6a 0x317a60749cc26f6a 0
46 organic_cave_chamber DC 16 32768 2448 1226 13.1444 86.348 0x317a60749cc26f6a 0x317a60749cc26f6a 0
@@ -0,0 +1,4 @@
method,phase_x_m,phase_y_m,phase_z_m,contour_expected,unmatched_probes,contour_mean_m,contour_max_m,boundary_edges,nonmanifold_edges,edges_before,nonmanifold_before,transition_triangles,paired_loops,capped_loops,unmatched_loops,transition_surface_max_m,fine_segments,coarse_segments
MC,0.25,0.1,0.1,true,0,0.11871,0.249977,0,0,78,0,234,1,0,0,0.233333,52,26
Hybrid,0.25,0.1,0.1,true,0,0.0929318,0.419411,0,0,82,0,246,1,0,0,0.238888,56,26
DC,0.25,0.1,0.1,true,0,0.0929318,0.419411,0,0,82,0,246,1,0,0,0.238888,56,26
1 method phase_x_m phase_y_m phase_z_m contour_expected unmatched_probes contour_mean_m contour_max_m boundary_edges nonmanifold_edges edges_before nonmanifold_before transition_triangles paired_loops capped_loops unmatched_loops transition_surface_max_m fine_segments coarse_segments
2 MC 0.25 0.1 0.1 true 0 0.11871 0.249977 0 0 78 0 234 1 0 0 0.233333 52 26
3 Hybrid 0.25 0.1 0.1 true 0 0.0929318 0.419411 0 0 82 0 246 1 0 0 0.238888 56 26
4 DC 0.25 0.1 0.1 true 0 0.0929318 0.419411 0 0 82 0 246 1 0 0 0.238888 56 26
@@ -0,0 +1,4 @@
method,phase_x_m,phase_y_m,phase_z_m,contour_expected,unmatched_probes,contour_mean_m,contour_max_m,boundary_edges,nonmanifold_edges,edges_before,nonmanifold_before,transition_triangles,paired_loops,capped_loops,unmatched_loops,transition_surface_max_m,fine_segments,coarse_segments
MC,0.25,0.1,0.1,true,0,0.11871,0.249977,0,0,78,0,234,1,0,0,0.233333,52,26
Hybrid,0.25,0.1,0.1,true,0,0.0929318,0.419411,0,0,82,0,246,1,0,0,0.238888,56,26
DC,0.25,0.1,0.1,true,0,0.0929318,0.419411,0,0,82,0,246,1,0,0,0.238888,56,26
1 method phase_x_m phase_y_m phase_z_m contour_expected unmatched_probes contour_mean_m contour_max_m boundary_edges nonmanifold_edges edges_before nonmanifold_before transition_triangles paired_loops capped_loops unmatched_loops transition_surface_max_m fine_segments coarse_segments
2 MC 0.25 0.1 0.1 true 0 0.11871 0.249977 0 0 78 0 234 1 0 0 0.233333 52 26
3 Hybrid 0.25 0.1 0.1 true 0 0.0929318 0.419411 0 0 82 0 246 1 0 0 0.238888 56 26
4 DC 0.25 0.1 0.1 true 0 0.0929318 0.419411 0 0 82 0 246 1 0 0 0.238888 56 26
@@ -0,0 +1,4 @@
method,manifest_hash,feature_id,feature_type,grid_cells,cell_size_m,origin_x_m,origin_y_m,origin_z_m,iso_probe_z_m,exactly_same_as_mc,mean_abs_field_residual_m,max_abs_field_residual_m,triangles,vertices,boundary_edges,nonmanifold_edges,hash
MC,0x8933693d9560ba9f,0x9812c26310b90c9,4,32768,0.25,-172,101,-449.239,-445.239,true,0.212167,16.0068,4496,2345,192,0,0x9d58e0603f1bf9c7
Hybrid,0x8933693d9560ba9f,0x9812c26310b90c9,4,32768,0.25,-172,101,-449.239,-445.239,true,0.212167,16.0068,4496,2345,192,0,0x9d58e0603f1bf9c7
DC,0x8933693d9560ba9f,0x9812c26310b90c9,4,32768,0.25,-172,101,-449.239,-445.239,false,4.57272,16.5898,3961,2247,504,74,0xd9a992278ffa1a64
1 method manifest_hash feature_id feature_type grid_cells cell_size_m origin_x_m origin_y_m origin_z_m iso_probe_z_m exactly_same_as_mc mean_abs_field_residual_m max_abs_field_residual_m triangles vertices boundary_edges nonmanifold_edges hash
2 MC 0x8933693d9560ba9f 0x9812c26310b90c9 4 32768 0.25 -172 101 -449.239 -445.239 true 0.212167 16.0068 4496 2345 192 0 0x9d58e0603f1bf9c7
3 Hybrid 0x8933693d9560ba9f 0x9812c26310b90c9 4 32768 0.25 -172 101 -449.239 -445.239 true 0.212167 16.0068 4496 2345 192 0 0x9d58e0603f1bf9c7
4 DC 0x8933693d9560ba9f 0x9812c26310b90c9 4 32768 0.25 -172 101 -449.239 -445.239 false 4.57272 16.5898 3961 2247 504 74 0xd9a992278ffa1a64
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff