diff --git a/CODEMAP.md b/CODEMAP.md index 0573da5..64694db 100644 --- a/CODEMAP.md +++ b/CODEMAP.md @@ -117,11 +117,11 @@ remains `0`, and lateral regions remain gated off. |------|------| | `../../VoxelForge.uplugin` | Plugin manifest. Runtime module `VoxelForge` plus the Editor-only `VoxelForgeEditor` commandlet module. Beta. | | `VoxelForge.Build.cs` | Deps: Core, CoreUObject, Engine, **GameplayTags**, **RealtimeMeshComponent**. | -| `Tools/VoxelForgeTest.ps1` | The single guarded test entry point. `-Scenario canonical|owner|probe|perf|tests|surface-fall|crossing|gate-stress|visual-edit|visual-lod|visual-gap-walk|visual-gap-inject|dig-motion|parity|horizon|horizon-render|determinism|region-eval|step2d|step2e|step2f|step2f-capture`, optional `-Build`, `-Assets owner|default`, `-Cvars`, absolute `-Out`, `-Label`, `-HorizonLevel`, `-HorizonRenderDistanceChunks`, `-Step2fProfile=0..7`, `-Step2fCaptureView=inside|wall-closeup`, `-ParityExportSize=32|64|128`, `-ParityExportTile=x,y,z`, `-SharedDDC`, `-SampleDensityStacks`, `-StackSampleIntervalUs`, and `-RegionHashProbe -RegionWorkers N -RegionReferenceHash HASH`; stages the host/assets, isolates user/DDC/config state, serializes one Unreal launch at a time, enforces the 8 GiB/30-minute guards, waits for 6 GiB free RAM before launches, and emits compact `result.json`/`summary.txt` plus full logs. Parity can render its game leg with `-EnableRender` and compares the selected export region against the exact streamed tile hashes. `visual-gap-walk` records camera-frustum surface-point coverage at 6000 cm/s; `visual-gap-inject` proves an early component hide is detected; `dig-motion` logs per-frame vertical velocity, gate, support readiness, and movement mode. `-Cvars @{ 'voxel.TestGapAuditLegacyHandoff'=1 }` replays the old visibility handoff for A/B audit baselines. Horizon traces report desired/loaded tiles, resident stream geometry, worker seconds, steady wall time, and peak private memory; `horizon-render` captures the owner view; `step2f-capture` selects one of eight parameter sets, captures an in-game owner view, and saves it under `Saved/Research/step2f/captures` (pass the persistent render DDC with `-SharedDDC`); `determinism` compares per-tile hashes across the default CRT path and `-voxel.CrtFma3=0`; `region-eval` compares the live path with the default-off editor chunk program on the 259³ lattice and five-seed probe set; `step2d` retains the earlier independent field; `step2e` retains its earlier benchmark; `step2f` compares frozen step 2e and the coherent field for all eight profiles on the same 259³ ring, applies geometry gates, and checks sound bounds, seams, and 1-vs-6-worker hashes. `-RegionHashProbe -RegionWorkers N -RegionReferenceHash HASH` checks a full-ring hash at another partition count. `-SampleDensityStacks` captures profiles, and `-StackSampleIntervalUs` sets the sampling interval. +| `Tools/VoxelForgeTest.ps1` | The single guarded test entry point. `-Scenario canonical|owner|probe|perf|tests|surface-fall|crossing|gate-stress|visual-edit|visual-lod|visual-gap-walk|visual-gap-inject|dig-motion|parity|horizon|horizon-render|determinism|region-eval|step2d|step2e|step2f|step2f-capture`, optional `-Build`, `-Assets owner|default`, `-Cvars`, absolute `-Out`, `-Label`, `-HorizonLevel`, `-HorizonRenderDistanceChunks`, `-Step2fProfile=0..7`, `-Step2fCaptureView=inside|wall-closeup`, `-ParityExportSize=32|64|128`, `-ParityExportTile=x,y,z`, `-SharedDDC`, `-SampleDensityStacks`, `-StackSampleIntervalUs`, and `-RegionHashProbe -RegionWorkers N -RegionReferenceHash HASH`; stages the host/assets, isolates user/DDC/config state, serializes one Unreal launch at a time, enforces the 8 GiB/30-minute guards, waits for 6 GiB free RAM before launches, and emits compact `result.json`/`summary.txt` plus full logs. Parity can render its game leg with `-EnableRender` and compares the selected export region against the exact streamed tile hashes. `visual-gap-walk` records camera-frustum surface-point coverage at 6000 cm/s; `visual-gap-inject` proves an early component hide is detected; `dig-motion` logs per-frame vertical velocity, gate, support readiness, and movement mode. `-Cvars @{ 'voxel.TestGapAuditLegacyHandoff'=1 }` replays the old visibility handoff for A/B audit baselines. Horizon traces report desired/loaded tiles, resident stream geometry, worker seconds, steady wall time, and peak private memory; `horizon-render` captures the owner view; `step2f-capture` selects one of eight parameter sets, finds a positive-density camera point and aims at a sampled rock wall for an inside or wall-closeup view, then saves it under `Saved/Research/step2f/captures` (pass the persistent render DDC with `-SharedDDC`); `determinism` compares per-tile hashes across the default CRT path and `-voxel.CrtFma3=0`; `region-eval` compares the live path with the default-off editor chunk program on the 259³ lattice and five-seed probe set; `step2d` retains the earlier independent field; `step2e` retains its earlier benchmark; `step2f` compares frozen step 2e and the coherent field for all eight profiles on the same 259³ ring, applies geometry gates, and checks sound bounds, seams, and 1-vs-6-worker hashes. `-RegionHashProbe -RegionWorkers N -RegionReferenceHash HASH` checks a full-ring hash at another partition count. `-SampleDensityStacks` captures profiles, and `-StackSampleIntervalUs` sets the sampling interval. | `Public/VoxelForgeModule.h` / `Private/VoxelForgeModule.cpp` | `FVoxelForgeModule` boilerplate (Startup/Shutdown just log). | -| `Source/VoxelForgeEditor/VoxelForgeEditor.Build.cs` / `Private/VoxelForgeExploreCommandlet.*` | Editor/commandlet-only `-run=VoxelForgeExplore`; owns bounded render/`VF_` walk/OBJ export orchestration and is not linked by Game/Shipping. Optional `-exporttilex/y/z` sets an exact L0 tile origin for controlled export/game parity; omitting all three preserves the existing center-derived origin. `-regioneval=1` retains the exact-field step-2c research harness. `-step2d` and `-step2e` retain their earlier benchmarks. `-step2f` compares frozen step 2e and the coherent field for all eight profiles on the same 259³ ring, counts sub-1 m³ connected components, measures mesh dihedrals, detail spectrum, LOD surface distance, chamber-pitch autocorrelation, roof/floor coverage, and six-worker timing. It also runs the sound/undersized-bound audit, seam injection, and 1-vs-6-worker hash checks and writes profile slices and JSON under `Saved/Research/step2f`. | +| `Source/VoxelForgeEditor/VoxelForgeEditor.Build.cs` / `Private/VoxelForgeExploreCommandlet.*` | Editor/commandlet-only `-run=VoxelForgeExplore`; owns bounded render/`VF_` walk/OBJ export orchestration and is not linked by Game/Shipping. Optional `-exporttilex/y/z` sets an exact L0 tile origin for controlled export/game parity; omitting all three preserves the existing center-derived origin. `-regioneval=1` retains the exact-field step-2c research harness. `-step2d` and `-step2e` retain their earlier benchmarks. `-step2f` compares frozen step 2e and the coherent field for all eight profiles on the same 259³ ring, counts sub-1 m³ connected components, measures mesh dihedrals, detail spectrum, LOD surface distance (p95 threshold 0.5 lattice samples), chamber-pitch autocorrelation, roof/floor coverage, and six-worker timing. It also runs the sound/undersized-bound audit, seam injection, and 1-vs-6-worker hash checks and writes profile slices and JSON under `Saved/Research/step2f`. | | `Source/VoxelForgeEditor/Private/VoxelForgeRegionEvalExperiment.*` | Six-worker lattice drivers for step 2c through step 2f. The original path still compares live `GetDensityAt` with the editor chunk program. Research modes assign contiguous batches dynamically so surface-heavy work balances across workers; steps 2e and 2f use 4³ proof bricks and stage each evaluated brick before copying contiguous X rows, while step 2d retains 8³. Each skip requires a macro Lipschitz bound plus the complete final-detail supremum; uncertain bricks retain all 25 cm detail samples. Timings split classification, point evaluation, and uniform fill; step 2f compares all profiles and hashes workers 1 and 6. | -| `Public/VoxelRedefinedDensityField.h` / `Private/VoxelRedefinedDensityField.cpp` | Two default-off `WITH_EDITOR` research fields, selected by `voxel.ResearchRedefinedDensityField` (step 2d) and `voxel.ResearchParameterizedCave` (steps 2e/2f). Step 2f retains frozen 2e parameters for its rejection audit, while the new profiles use strongly jittered, individually rotated elliptical rooms capped against nearest neighbors, leaving a solid web joined by narrow tree/loop tunnels and capped shafts. Room heights and feature rolls vary by cell; ledges, occasional pillars, stalactites/stalagmites, basin floors, and bounded hanging masses remain features. Point and brick detail sampling use the same 32/16/8-sample bands and smooth ridge response; the eight-sample shortest wavelength and 4.2-unit final-field supremum are preserved. The thread-local cell cache and per-column distance reuse remain. In an editor game with this field enabled, sealed-solid, out-of-layout, and outer-classifier verdicts are declined without changing their console switches. No reflected class layout or serialized assets change. | +| `Public/VoxelRedefinedDensityField.h` / `Private/VoxelRedefinedDensityField.cpp` | Two default-off `WITH_EDITOR` research fields, selected by `voxel.ResearchRedefinedDensityField` (step 2d) and `voxel.ResearchParameterizedCave` (steps 2e/2f). Step 2f retains frozen 2e parameters for its rejection audit, while the new profiles use strongly jittered, individually rotated elliptical rooms capped against nearest neighbors, leaving a solid web joined by narrow tree/loop tunnels and capped shafts. Room heights and feature rolls vary by cell; ledges, occasional pillars, stalactites/stalagmites, basin floors, and bounded hanging masses remain features. Point and brick detail sampling use the same independently rotated 48/24/12-sample bands and smooth ridge response; the twelve-sample shortest wavelength and 3.822-unit final-field detail bound are preserved. The thread-local cell cache and per-column distance reuse remain. In an editor game with this field enabled, sealed-solid, out-of-layout, and outer-classifier verdicts are declined without changing their console switches. No reflected class layout or serialized assets change. | | `Private/Tests/VoxelForgeParameterizedGenerationTest.cpp` | Separate three-seed functional sweep for the step 2f parameterized field; passage landing air/floor brackets and arrival-to-exit walking routes are checked without changing the live-world tests. | | `Private/Tests/VoxelForgeRedefinedDensityFieldTest.cpp` | Three-seed functional sweep for the research field: authored passage endpoints must bracket open air and solid floor, and each tested strate must have a walkable arrival-to-exit route. | | `Public/VoxelGeometryHash.h` | Header-only geometry digest shared by commandlet export and runtime tile-hash dump; hashes mesh counts and the vertex/normal/UV/color/triangle arrays with the historical CRC order. | diff --git a/Saved/Research/step2f/20261001_032947/step2f_report.json b/Saved/Research/step2f/20261001_032947/step2f_report.json new file mode 100644 index 0000000..05fa6b1 --- /dev/null +++ b/Saved/Research/step2f/20261001_032947/step2f_report.json @@ -0,0 +1,7202 @@ +{ + "status": "pass", + "pass": true, + "geometry_gates_reject_step2e": true, + "geometry_gates_pass_step2f": true, + "worst_profile_meets_600ms": true, + "step2e_worst_six_worker_ring_ms": 601.26699879765511, + "step2f_worst_six_worker_ring_ms": 572.33539968729019, + "step2f_solid_fraction_min": 0.79336978593101781, + "step2f_solid_fraction_max": 0.82423795953707557, + "seed": 0, + "ring_dimension": 259, + "ring_origin_voxels": [ + -129, + -129, + -481 + ], + "ring_samples": 17373979, + "workers_requested": 6, + "world_prepare_ms_excluded": 144.65340226888657, + "field_definition": "Rooms use strongly jittered cells with per-room radii, axis ratios and heights. A conservative nearest-neighbor cap leaves a solid web between chambers; a rooted tree of narrow tunnels and capped shafts joins them. Sparse ledges, pillars, stalactites and large hanging masses remain per-cell rolls. The point and brick detail samplers share independently rotated 48/24/12-sample bands with a twelve-sample shortest period and a smooth ridge response; their final-field detail supremum is 3.822 units.", + "component_method": "26-neighbor connected components are counted on the exact 25 cm sign lattice. Raw components below 64 samples (< 1 m3) are reported, then a 64-sample pad is evaluated around each 259-cube and only components intersecting the original cube are counted again; this prevents a clipped large component at the ring edge from being called a crumb. The one-meter downsampled air component count is also reported.", + "mesh_method": "Eight level-0 tiles and one level-1 tile cover the same 64-sample cube selected for maximum coarse-sampled surface crossings. The share of manifold triangle edges whose geometric dihedral exceeds 45 degrees and its p95 are measured. Each level-1 vertex is compared with nearby level-0 triangles using exact point-to-triangle distance; the p95 is reported in lattice samples.", + "gates": + { + "crumbs": + { + "threshold": "zero 25 cm-grid components smaller than 64 voxels, measured in a 64-sample-padded volume and restricted to components intersecting the 259-cube", + "step2e_rejected": true, + "step2f_passed": true, + "step2e_worst_profile_numbers": + { + "crumbs_below_1m3_max": 2290 + }, + "step2f_worst_profile_numbers": + { + "crumbs_below_1m3_max": 0 + } + }, + "flakes": + { + "threshold": "L0 mesh dihedral share over 45 degrees <= 0.25; p95 <= 70 degrees", + "step2e_rejected": true, + "step2f_passed": true, + "step2e_worst_profile_numbers": + { + "max_dihedral_share_over_45deg": 0.40731075609433676, + "max_dihedral_p95_deg": 84.229789733886719 + }, + "step2f_worst_profile_numbers": + { + "max_dihedral_share_over_45deg": 0.022304057809894386, + "max_dihedral_p95_deg": 34.817558288574219 + } + }, + "band_limited_detail": + { + "threshold": "detail RMS >= 0.40 and normalized lag-1 difference energy <= 0.20", + "step2e_rejected": true, + "step2f_passed": true, + "step2e_worst_profile_numbers": + { + "max_lattice_scale_energy_ratio": 0.8316718995555632, + "min_detail_rms": 1.5958015018814415 + }, + "step2f_worst_profile_numbers": + { + "max_lattice_scale_energy_ratio": 0.0069790296090780834, + "min_detail_rms": 0.48440035599680098 + } + }, + "lod_stability": + { + "threshold": "L1 mesh p95 estimated distance from the L0 isosurface <= 0.5 lattice samples", + "step2e_rejected": true, + "step2f_passed": true, + "step2e_worst_profile_numbers": + { + "max_l1_p95_surface_distance_voxels": 0.70853859186172485 + }, + "step2f_worst_profile_numbers": + { + "max_l1_p95_surface_distance_voxels": 0.3770425021648407 + } + }, + "grid_signature": + { + "threshold": "pitch autocorrelation <= 0.40 and pitch excess over nearby lags <= 0.08", + "step2e_rejected": true, + "step2f_passed": true, + "step2e_worst_profile_numbers": + { + "max_pitch_autocorrelation": 0.66690690463053837, + "max_pitch_peak_excess": 0.081845060194226604 + }, + "step2f_worst_profile_numbers": + { + "max_pitch_autocorrelation": 0.34780364324022089, + "max_pitch_peak_excess": 0.018686561826879777 + } + }, + "roof_floor_and_solid_share": + { + "threshold": "solid fraction 0.25..0.88; zero air samples in 1 m roof/floor shells", + "step2e_rejected": true, + "step2f_passed": true, + "step2e_worst_profile_numbers": + { + "minimum_solid_fraction": 0.026546077901901444, + "max_roof_openings": 26657, + "max_floor_openings": 26130 + }, + "step2f_worst_profile_numbers": + { + "minimum_solid_fraction": 0.79336978593101781, + "max_roof_openings": 0, + "max_floor_openings": 0 + } + } + }, + "profiles": [ + { + "profile_index": 0, + "name": "OpenVaults", + "step2e": + { + "six_worker_ring_median_ms": 412.87869960069656, + "solid_fraction": 0.026546077901901444, + "air_fraction": 0.97345392209809856, + "air_components_25cm_grid": 194, + "solid_components_25cm_grid": 860, + "air_crumbs_below_1m3": 193, + "solid_crumbs_below_1m3": 846, + "air_crumbs_below_1m3_after_boundary_padding": 117, + "solid_crumbs_below_1m3_after_boundary_padding": 809, + "air_crumb_voxel_samples": 289, + "solid_crumb_voxel_samples": 1808, + "crumb_components_first_32": [ + { + "sign": "air", + "samples": 16, + "density_at_min": 0.17696738243103027, + "root_ring_voxel": [ + 15, + 0, + 0 + ], + "density_at_root": 1.5752029418945312, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 14, + 0, + 0 + ], + "max_ring_voxel": [ + 18, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.10162866115570068, + "root_ring_voxel": [ + 25, + 0, + 0 + ], + "density_at_root": 0.10162866115570068, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 25, + 0, + 0 + ], + "max_ring_voxel": [ + 25, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.30957508087158203, + "root_ring_voxel": [ + 28, + 0, + 0 + ], + "density_at_root": 0.30957508087158203, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 28, + 0, + 0 + ], + "max_ring_voxel": [ + 28, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -0.71394884586334229, + "root_ring_voxel": [ + 1, + 1, + 0 + ], + "density_at_root": 0.005947113037109375, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 1, + 0, + 0 + ], + "max_ring_voxel": [ + 2, + 1, + 0 + ] + }, + { + "sign": "air", + "samples": 4, + "density_at_min": 0.34131002426147461, + "root_ring_voxel": [ + 21, + 1, + 0 + ], + "density_at_root": 0.79689145088195801, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 20, + 0, + 0 + ], + "max_ring_voxel": [ + 22, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.1676793098449707, + "root_ring_voxel": [ + 27, + 2, + 0 + ], + "density_at_root": 0.1676793098449707, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 27, + 2, + 0 + ], + "max_ring_voxel": [ + 27, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.18723142147064209, + "root_ring_voxel": [ + 25, + 3, + 0 + ], + "density_at_root": 0.18723142147064209, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 25, + 3, + 0 + ], + "max_ring_voxel": [ + 25, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.1443848609924316, + "root_ring_voxel": [ + 19, + 6, + 0 + ], + "density_at_root": 1.1443848609924316, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 19, + 6, + 0 + ], + "max_ring_voxel": [ + 19, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 5, + "density_at_min": -0.036162257194519043, + "root_ring_voxel": [ + 27, + 6, + 0 + ], + "density_at_root": 0.467193603515625, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 26, + 5, + 0 + ], + "max_ring_voxel": [ + 28, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.08475184440612793, + "root_ring_voxel": [ + 23, + 7, + 0 + ], + "density_at_root": 0.08475184440612793, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 23, + 7, + 0 + ], + "max_ring_voxel": [ + 23, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": -0.17324519157409668, + "root_ring_voxel": [ + 7, + 8, + 0 + ], + "density_at_root": 0.76242923736572266, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 6, + 7, + 0 + ], + "max_ring_voxel": [ + 8, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": -0.44098281860351562, + "root_ring_voxel": [ + 11, + 9, + 0 + ], + "density_at_root": 1.0408329963684082, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 10, + 8, + 0 + ], + "max_ring_voxel": [ + 12, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 1.0758864879608154, + "root_ring_voxel": [ + 24, + 9, + 0 + ], + "density_at_root": 0.07833564281463623, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 23, + 9, + 0 + ], + "max_ring_voxel": [ + 24, + 9, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.84470129013061523, + "root_ring_voxel": [ + 15, + 10, + 0 + ], + "density_at_root": 0.84470129013061523, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 15, + 10, + 0 + ], + "max_ring_voxel": [ + 15, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.0382390022277832, + "root_ring_voxel": [ + 26, + 10, + 0 + ], + "density_at_root": 1.0382390022277832, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 26, + 10, + 0 + ], + "max_ring_voxel": [ + 26, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.31349396705627441, + "root_ring_voxel": [ + 30, + 10, + 0 + ], + "density_at_root": 0.62383031845092773, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 30, + 9, + 0 + ], + "max_ring_voxel": [ + 30, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.19092130661010742, + "root_ring_voxel": [ + 35, + 10, + 0 + ], + "density_at_root": 0.19092130661010742, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 35, + 10, + 0 + ], + "max_ring_voxel": [ + 35, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.3232263326644897, + "root_ring_voxel": [ + 37, + 10, + 0 + ], + "density_at_root": 1.3232263326644897, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 37, + 10, + 0 + ], + "max_ring_voxel": [ + 37, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -2.1299822330474854, + "root_ring_voxel": [ + 2, + 11, + 0 + ], + "density_at_root": 0.23612046241760254, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 2, + 10, + 0 + ], + "max_ring_voxel": [ + 3, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.15467917919158936, + "root_ring_voxel": [ + 22, + 11, + 0 + ], + "density_at_root": 0.15467917919158936, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 22, + 11, + 0 + ], + "max_ring_voxel": [ + 22, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.0382823944091797, + "root_ring_voxel": [ + 45, + 11, + 0 + ], + "density_at_root": 1.0382823944091797, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 45, + 11, + 0 + ], + "max_ring_voxel": [ + 45, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -2.9719550609588623, + "root_ring_voxel": [ + 5, + 12, + 0 + ], + "density_at_root": 0.38606119155883789, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 5, + 11, + 0 + ], + "max_ring_voxel": [ + 6, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.74597406387329102, + "root_ring_voxel": [ + 18, + 12, + 0 + ], + "density_at_root": 0.74597406387329102, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 18, + 12, + 0 + ], + "max_ring_voxel": [ + 18, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.23204994201660156, + "root_ring_voxel": [ + 29, + 12, + 0 + ], + "density_at_root": 0.23204994201660156, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 29, + 12, + 0 + ], + "max_ring_voxel": [ + 29, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.419272780418396, + "root_ring_voxel": [ + 42, + 12, + 0 + ], + "density_at_root": 0.419272780418396, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 42, + 12, + 0 + ], + "max_ring_voxel": [ + 42, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.24747937917709351, + "root_ring_voxel": [ + 47, + 12, + 0 + ], + "density_at_root": 0.24747937917709351, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 47, + 12, + 0 + ], + "max_ring_voxel": [ + 47, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.0034433603286743164, + "root_ring_voxel": [ + 1, + 13, + 0 + ], + "density_at_root": 0.0034433603286743164, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 1, + 13, + 0 + ], + "max_ring_voxel": [ + 1, + 13, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.031580448150634766, + "root_ring_voxel": [ + 25, + 13, + 0 + ], + "density_at_root": 0.34658956527709961, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 24, + 12, + 0 + ], + "max_ring_voxel": [ + 25, + 13, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.038060665130615234, + "root_ring_voxel": [ + 11, + 14, + 0 + ], + "density_at_root": 0.038060665130615234, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 11, + 14, + 0 + ], + "max_ring_voxel": [ + 11, + 14, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.23696637153625488, + "root_ring_voxel": [ + 15, + 14, + 0 + ], + "density_at_root": 0.23696637153625488, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 15, + 14, + 0 + ], + "max_ring_voxel": [ + 15, + 14, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.12113451957702637, + "root_ring_voxel": [ + 18, + 14, + 0 + ], + "density_at_root": 0.12113451957702637, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 18, + 14, + 0 + ], + "max_ring_voxel": [ + 18, + 14, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.74406862258911133, + "root_ring_voxel": [ + 31, + 15, + 0 + ], + "density_at_root": 0.74406862258911133, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 31, + 15, + 0 + ], + "max_ring_voxel": [ + 31, + 15, + 0 + ] + } + ], + "largest_air_component_voxels": 16912479, + "largest_solid_component_voxels": 224364, + "one_meter_downsampled_air_components": 21, + "pitch_autocorrelation_peak": 0.25037508465099034, + "nearby_autocorrelation_peak": 0.29197175837095762, + "pitch_autocorrelation_excess": -0.041596673719967281, + "detail_rms": 1.5958015018814415, + "detail_lattice_scale_energy_ratio": 0.8316718995555632, + "mesh_triangles_l0": 54358, + "mesh_manifold_edges_l0": 79346, + "mesh_dihedral_share_over_45deg": 0.35732109999243816, + "mesh_dihedral_p95_deg": 83.613906860351562, + "mesh_vertices_l1": 4420, + "lod1_p95_surface_distance_voxels": 0.70853859186172485, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 26657, + "floor_samples": 38025, + "floor_openings": 26130, + "estimated_surface_area_m2": 33116.375, + "open_air_fraction": 0.97345392209809856 + }, + "step2f": + { + "six_worker_ring_median_ms": 526.90659835934639, + "solid_fraction": 0.80298525743584703, + "air_fraction": 0.19701474256415297, + "air_components_25cm_grid": 2, + "solid_components_25cm_grid": 1, + "air_crumbs_below_1m3": 0, + "solid_crumbs_below_1m3": 0, + "air_crumbs_below_1m3_after_boundary_padding": 0, + "solid_crumbs_below_1m3_after_boundary_padding": 0, + "air_crumb_voxel_samples": 0, + "solid_crumb_voxel_samples": 0, + "crumb_components_first_32": [], + "largest_air_component_voxels": 3360054, + "largest_solid_component_voxels": 13951049, + "one_meter_downsampled_air_components": 2, + "pitch_autocorrelation_peak": 0.27805169599194057, + "nearby_autocorrelation_peak": 0.2593651341650608, + "pitch_autocorrelation_excess": 0.018686561826879777, + "detail_rms": 0.48440035599680098, + "detail_lattice_scale_energy_ratio": 0.0069790296090780834, + "mesh_triangles_l0": 27613, + "mesh_manifold_edges_l0": 40473, + "mesh_dihedral_share_over_45deg": 0.00133422281521014, + "mesh_dihedral_p95_deg": 6.1350727081298828, + "mesh_vertices_l1": 3660, + "lod1_p95_surface_distance_voxels": 0.096179410815238953, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 0, + "floor_samples": 38025, + "floor_openings": 0, + "estimated_surface_area_m2": 17910.25, + "open_air_fraction": 0.19701474256415297 + }, + "step2f_padded_crumb_diagnostics": [], + "step2e_parameters": + { + "room_pitch_voxels": 176, + "room_radius_fraction_min": 0.62000000476837158, + "room_radius_fraction_max": 0.75999999046325684, + "room_height_voxels": 340, + "floor_relief_voxels": 12, + "tunnel_radius_voxels": 40, + "tunnel_half_height_voxels": 36, + "loop_probability": 0.34999999403953552, + "vertical_shaft_probability": 0.14000000059604645, + "shaft_radius_voxels": 22, + "pillar_probability": 0.039999999105930328, + "ledge_probability": 0.11999999731779099, + "floating_mass_probability": 0.079999998211860657, + "stalactite_stalagmite_probability": 0.15000000596046448, + "basin_probability": 0, + "basin_depth_voxels": 0, + "water_level_fraction": 0.5 + }, + "step2f_parameters": + { + "room_pitch_voxels": 176, + "room_radius_fraction_min": 0.31000000238418579, + "room_radius_fraction_max": 0.40000000596046448, + "room_height_voxels": 132, + "floor_relief_voxels": 8, + "tunnel_radius_voxels": 22, + "tunnel_half_height_voxels": 18, + "loop_probability": 0.11999999731779099, + "vertical_shaft_probability": 0.079999998211860657, + "shaft_radius_voxels": 16, + "pillar_probability": 0.019999999552965164, + "ledge_probability": 0.059999998658895493, + "floating_mass_probability": 0.039999999105930328, + "stalactite_stalagmite_probability": 0.2199999988079071, + "basin_probability": 0, + "basin_depth_voxels": 0, + "water_level_fraction": 0.5 + }, + "step2e_six_worker_ring_trials_ms": [ + 393.01929995417595, + 412.87869960069656, + 417.63230040669441 + ], + "step2f_six_worker_ring_trials_ms": [ + 511.88769936561584, + 526.90659835934639, + 535.89649870991707 + ], + "step2f_last_trial_timing_breakdown": + { + "last_trial_wall_ms": 535.89649870991707, + "last_trial_worker_cpu_seconds": 2.890625, + "sum_worker_brick_classification_seconds": 0.49164775013923645, + "sum_worker_density_evaluation_seconds": 2.6321274898946285, + "sum_worker_uniform_fill_seconds": 0.041131444275379181, + "longest_worker_wall_seconds": 0.53187669813632965, + "evaluated_samples": 6295311, + "skipped_samples": 11078668, + "macro_centre_evaluations": 251683 + }, + "slice_directory": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_00_openvaults" + }, + { + "profile_index": 1, + "name": "TightNetwork", + "step2e": + { + "six_worker_ring_median_ms": 552.30499804019928, + "solid_fraction": 0.10399281592316878, + "air_fraction": 0.89600718407683122, + "air_components_25cm_grid": 979, + "solid_components_25cm_grid": 1934, + "air_crumbs_below_1m3": 977, + "solid_crumbs_below_1m3": 1927, + "air_crumbs_below_1m3_after_boundary_padding": 468, + "solid_crumbs_below_1m3_after_boundary_padding": 1822, + "air_crumb_voxel_samples": 1732, + "solid_crumb_voxel_samples": 3631, + "crumb_components_first_32": [ + { + "sign": "air", + "samples": 1, + "density_at_min": 0.23104763031005859, + "root_ring_voxel": [ + 35, + 0, + 0 + ], + "density_at_root": 0.23104763031005859, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 35, + 0, + 0 + ], + "max_ring_voxel": [ + 35, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.38784265518188477, + "root_ring_voxel": [ + 45, + 0, + 0 + ], + "density_at_root": 0.38784265518188477, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 45, + 0, + 0 + ], + "max_ring_voxel": [ + 45, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 0.095799684524536133, + "root_ring_voxel": [ + 48, + 0, + 0 + ], + "density_at_root": 0.12037849426269531, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 47, + 0, + 0 + ], + "max_ring_voxel": [ + 48, + 1, + 0 + ] + }, + { + "sign": "air", + "samples": 21, + "density_at_min": 0.90368843078613281, + "root_ring_voxel": [ + 79, + 0, + 0 + ], + "density_at_root": 1.6950017213821411, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 78, + 0, + 0 + ], + "max_ring_voxel": [ + 83, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 1.3977843523025513, + "root_ring_voxel": [ + 172, + 0, + 0 + ], + "density_at_root": 1.0311414003372192, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 171, + 0, + 0 + ], + "max_ring_voxel": [ + 172, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.72098326683044434, + "root_ring_voxel": [ + 189, + 0, + 0 + ], + "density_at_root": 0.72098326683044434, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 189, + 0, + 0 + ], + "max_ring_voxel": [ + 189, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.47658467292785645, + "root_ring_voxel": [ + 193, + 0, + 0 + ], + "density_at_root": 0.47658467292785645, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 193, + 0, + 0 + ], + "max_ring_voxel": [ + 193, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.63884258270263672, + "root_ring_voxel": [ + 195, + 0, + 0 + ], + "density_at_root": 0.63884258270263672, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 195, + 0, + 0 + ], + "max_ring_voxel": [ + 195, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.0041589736938476562, + "root_ring_voxel": [ + 210, + 0, + 0 + ], + "density_at_root": 0.0041589736938476562, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 210, + 0, + 0 + ], + "max_ring_voxel": [ + 210, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.41646552085876465, + "root_ring_voxel": [ + 232, + 0, + 0 + ], + "density_at_root": 0.41646552085876465, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 232, + 0, + 0 + ], + "max_ring_voxel": [ + 232, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.26613759994506836, + "root_ring_voxel": [ + 241, + 0, + 0 + ], + "density_at_root": 0.26613759994506836, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 241, + 0, + 0 + ], + "max_ring_voxel": [ + 241, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.67247796058654785, + "root_ring_voxel": [ + 246, + 0, + 0 + ], + "density_at_root": 0.67247796058654785, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 246, + 0, + 0 + ], + "max_ring_voxel": [ + 246, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 5, + "density_at_min": -3.4583697319030762, + "root_ring_voxel": [ + 197, + 1, + 0 + ], + "density_at_root": 0.045075416564941406, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 196, + 0, + 0 + ], + "max_ring_voxel": [ + 197, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.12125527858734131, + "root_ring_voxel": [ + 235, + 1, + 0 + ], + "density_at_root": 1.1740641593933105, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 235, + 0, + 0 + ], + "max_ring_voxel": [ + 235, + 1, + 0 + ] + }, + { + "sign": "air", + "samples": 4, + "density_at_min": -0.64351511001586914, + "root_ring_voxel": [ + 31, + 2, + 0 + ], + "density_at_root": 0.42566347122192383, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 31, + 1, + 0 + ], + "max_ring_voxel": [ + 33, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 5, + "density_at_min": -2.2626461982727051, + "root_ring_voxel": [ + 73, + 2, + 0 + ], + "density_at_root": 0.68173080682754517, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 72, + 1, + 0 + ], + "max_ring_voxel": [ + 74, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 4, + "density_at_min": -1.5118758678436279, + "root_ring_voxel": [ + 173, + 2, + 0 + ], + "density_at_root": 1.1043660640716553, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 172, + 1, + 0 + ], + "max_ring_voxel": [ + 174, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -1.0700066089630127, + "root_ring_voxel": [ + 205, + 2, + 0 + ], + "density_at_root": 0.058321833610534668, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 205, + 1, + 0 + ], + "max_ring_voxel": [ + 206, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.28161883354187012, + "root_ring_voxel": [ + 210, + 2, + 0 + ], + "density_at_root": 0.28161883354187012, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 210, + 2, + 0 + ], + "max_ring_voxel": [ + 210, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.58025002479553223, + "root_ring_voxel": [ + 225, + 2, + 0 + ], + "density_at_root": 0.58025002479553223, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 225, + 2, + 0 + ], + "max_ring_voxel": [ + 225, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.9935905933380127, + "root_ring_voxel": [ + 233, + 2, + 0 + ], + "density_at_root": 0.9935905933380127, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 233, + 2, + 0 + ], + "max_ring_voxel": [ + 233, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.12963616847991943, + "root_ring_voxel": [ + 247, + 2, + 0 + ], + "density_at_root": 0.12963616847991943, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 247, + 2, + 0 + ], + "max_ring_voxel": [ + 247, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.60586977005004883, + "root_ring_voxel": [ + 47, + 3, + 0 + ], + "density_at_root": 0.60586977005004883, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 47, + 3, + 0 + ], + "max_ring_voxel": [ + 47, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.084885835647583008, + "root_ring_voxel": [ + 187, + 3, + 0 + ], + "density_at_root": 0.084885835647583008, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 187, + 3, + 0 + ], + "max_ring_voxel": [ + 187, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": -1.3527886867523193, + "root_ring_voxel": [ + 191, + 3, + 0 + ], + "density_at_root": 0.31699705123901367, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 189, + 3, + 0 + ], + "max_ring_voxel": [ + 191, + 4, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.23421764373779297, + "root_ring_voxel": [ + 245, + 3, + 0 + ], + "density_at_root": 0.23421764373779297, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 245, + 3, + 0 + ], + "max_ring_voxel": [ + 245, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.25889337062835693, + "root_ring_voxel": [ + 250, + 3, + 0 + ], + "density_at_root": 0.25889337062835693, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 250, + 3, + 0 + ], + "max_ring_voxel": [ + 250, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.10036993026733398, + "root_ring_voxel": [ + 36, + 4, + 0 + ], + "density_at_root": 0.30195903778076172, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 35, + 3, + 0 + ], + "max_ring_voxel": [ + 36, + 4, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.0015786290168762207, + "root_ring_voxel": [ + 173, + 4, + 0 + ], + "density_at_root": 0.0015786290168762207, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 173, + 4, + 0 + ], + "max_ring_voxel": [ + 173, + 4, + 0 + ] + }, + { + "sign": "air", + "samples": 6, + "density_at_min": 0.31699705123901367, + "root_ring_voxel": [ + 193, + 4, + 0 + ], + "density_at_root": 0.90080714225769043, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 191, + 3, + 0 + ], + "max_ring_voxel": [ + 193, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 0.68049144744873047, + "root_ring_voxel": [ + 38, + 5, + 0 + ], + "density_at_root": 0.8379061222076416, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 38, + 4, + 0 + ], + "max_ring_voxel": [ + 39, + 5, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.58932864665985107, + "root_ring_voxel": [ + 152, + 5, + 0 + ], + "density_at_root": 0.58932864665985107, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 152, + 5, + 0 + ], + "max_ring_voxel": [ + 152, + 5, + 0 + ] + } + ], + "largest_air_component_voxels": 15565403, + "largest_solid_component_voxels": 1797379, + "one_meter_downsampled_air_components": 109, + "pitch_autocorrelation_peak": 0.38761352295021073, + "nearby_autocorrelation_peak": 0.30576846275598413, + "pitch_autocorrelation_excess": 0.081845060194226604, + "detail_rms": 1.5958015018814415, + "detail_lattice_scale_energy_ratio": 0.8316718995555632, + "mesh_triangles_l0": 119038, + "mesh_manifold_edges_l0": 174324, + "mesh_dihedral_share_over_45deg": 0.40027764392739956, + "mesh_dihedral_p95_deg": 84.207557678222656, + "mesh_vertices_l1": 8950, + "lod1_p95_surface_distance_voxels": 0.648529052734375, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 23243, + "floor_samples": 38025, + "floor_openings": 24438, + "estimated_surface_area_m2": 92098, + "open_air_fraction": 0.89600718407683122 + }, + "step2f": + { + "six_worker_ring_median_ms": 540.53559899330139, + "solid_fraction": 0.82383488549168848, + "air_fraction": 0.17616511450831154, + "air_components_25cm_grid": 1, + "solid_components_25cm_grid": 2, + "air_crumbs_below_1m3": 0, + "solid_crumbs_below_1m3": 0, + "air_crumbs_below_1m3_after_boundary_padding": 0, + "solid_crumbs_below_1m3_after_boundary_padding": 0, + "air_crumb_voxel_samples": 0, + "solid_crumb_voxel_samples": 0, + "crumb_components_first_32": [], + "largest_air_component_voxels": 3060689, + "largest_solid_component_voxels": 14312334, + "one_meter_downsampled_air_components": 1, + "pitch_autocorrelation_peak": 0.34724383363707162, + "nearby_autocorrelation_peak": 0.39258934586738148, + "pitch_autocorrelation_excess": -0.045345512230309859, + "detail_rms": 0.48440035599680098, + "detail_lattice_scale_energy_ratio": 0.0069790296090780834, + "mesh_triangles_l0": 31621, + "mesh_manifold_edges_l0": 46598, + "mesh_dihedral_share_over_45deg": 0.0090776428172882964, + "mesh_dihedral_p95_deg": 13.624937057495117, + "mesh_vertices_l1": 4122, + "lod1_p95_surface_distance_voxels": 0.2710062563419342, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 0, + "floor_samples": 38025, + "floor_openings": 0, + "estimated_surface_area_m2": 20940.4375, + "open_air_fraction": 0.17616511450831154 + }, + "step2f_padded_crumb_diagnostics": [], + "step2e_parameters": + { + "room_pitch_voxels": 104, + "room_radius_fraction_min": 0.51999998092651367, + "room_radius_fraction_max": 0.63999998569488525, + "room_height_voxels": 256, + "floor_relief_voxels": 8, + "tunnel_radius_voxels": 20, + "tunnel_half_height_voxels": 22, + "loop_probability": 0.11999999731779099, + "vertical_shaft_probability": 0.029999999329447746, + "shaft_radius_voxels": 14, + "pillar_probability": 0.059999998658895493, + "ledge_probability": 0.079999998211860657, + "floating_mass_probability": 0.019999999552965164, + "stalactite_stalagmite_probability": 0.11999999731779099, + "basin_probability": 0, + "basin_depth_voxels": 0, + "water_level_fraction": 0.5 + }, + "step2f_parameters": + { + "room_pitch_voxels": 104, + "room_radius_fraction_min": 0.27000001072883606, + "room_radius_fraction_max": 0.34999999403953552, + "room_height_voxels": 104, + "floor_relief_voxels": 5, + "tunnel_radius_voxels": 18, + "tunnel_half_height_voxels": 14, + "loop_probability": 0.2800000011920929, + "vertical_shaft_probability": 0.11999999731779099, + "shaft_radius_voxels": 15, + "pillar_probability": 0.019999999552965164, + "ledge_probability": 0.059999998658895493, + "floating_mass_probability": 0.019999999552965164, + "stalactite_stalagmite_probability": 0.14000000059604645, + "basin_probability": 0, + "basin_depth_voxels": 0, + "water_level_fraction": 0.5 + }, + "step2e_six_worker_ring_trials_ms": [ + 537.3184010386467, + 552.30499804019928, + 556.77250027656555 + ], + "step2f_six_worker_ring_trials_ms": [ + 537.80220076441765, + 540.53559899330139, + 598.66809844970703 + ], + "step2f_last_trial_timing_breakdown": + { + "last_trial_wall_ms": 537.80220076441765, + "last_trial_worker_cpu_seconds": 3, + "sum_worker_brick_classification_seconds": 0.50840968638658524, + "sum_worker_density_evaluation_seconds": 2.6277070380747318, + "sum_worker_uniform_fill_seconds": 0.040018279105424881, + "longest_worker_wall_seconds": 0.53376700356602669, + "evaluated_samples": 6692331, + "skipped_samples": 10681648, + "macro_centre_evaluations": 251683 + }, + "slice_directory": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_01_tightnetwork" + }, + { + "profile_index": 2, + "name": "ChamberHalls", + "step2e": + { + "six_worker_ring_median_ms": 490.61529710888863, + "solid_fraction": 0.070546246199560847, + "air_fraction": 0.92945375380043915, + "air_components_25cm_grid": 517, + "solid_components_25cm_grid": 1123, + "air_crumbs_below_1m3": 514, + "solid_crumbs_below_1m3": 1111, + "air_crumbs_below_1m3_after_boundary_padding": 325, + "solid_crumbs_below_1m3_after_boundary_padding": 1083, + "air_crumb_voxel_samples": 991, + "solid_crumb_voxel_samples": 2671, + "crumb_components_first_32": [ + { + "sign": "air", + "samples": 1, + "density_at_min": 0.21697854995727539, + "root_ring_voxel": [ + 5, + 0, + 0 + ], + "density_at_root": 0.21697854995727539, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 5, + 0, + 0 + ], + "max_ring_voxel": [ + 5, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 27, + "density_at_min": -0.52938520908355713, + "root_ring_voxel": [ + 15, + 0, + 0 + ], + "density_at_root": 2.2221755981445312, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 10, + 0, + 0 + ], + "max_ring_voxel": [ + 19, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.66586196422576904, + "root_ring_voxel": [ + 25, + 0, + 0 + ], + "density_at_root": 0.66586196422576904, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 25, + 0, + 0 + ], + "max_ring_voxel": [ + 25, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.49279284477233887, + "root_ring_voxel": [ + 28, + 0, + 0 + ], + "density_at_root": 0.49279284477233887, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 28, + 0, + 0 + ], + "max_ring_voxel": [ + 28, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -0.066976189613342285, + "root_ring_voxel": [ + 1, + 1, + 0 + ], + "density_at_root": 0.65291976928710938, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 1, + 0, + 0 + ], + "max_ring_voxel": [ + 2, + 1, + 0 + ] + }, + { + "sign": "air", + "samples": 4, + "density_at_min": 0.98828268051147461, + "root_ring_voxel": [ + 21, + 1, + 0 + ], + "density_at_root": 1.443864107131958, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 20, + 0, + 0 + ], + "max_ring_voxel": [ + 22, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 21, + "density_at_min": -3.2997505664825439, + "root_ring_voxel": [ + 31, + 1, + 0 + ], + "density_at_root": 0.43479299545288086, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 31, + 0, + 0 + ], + "max_ring_voxel": [ + 38, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.74329376220703125, + "root_ring_voxel": [ + 28, + 2, + 0 + ], + "density_at_root": 0.11539053916931152, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 27, + 2, + 0 + ], + "max_ring_voxel": [ + 28, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 13, + "density_at_min": -3.8751635551452637, + "root_ring_voxel": [ + 24, + 4, + 0 + ], + "density_at_root": 0.27275764942169189, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 24, + 3, + 0 + ], + "max_ring_voxel": [ + 29, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.35076093673706055, + "root_ring_voxel": [ + 22, + 5, + 0 + ], + "density_at_root": 0.35076093673706055, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 22, + 5, + 0 + ], + "max_ring_voxel": [ + 22, + 5, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 1.7662979364395142, + "root_ring_voxel": [ + 38, + 5, + 0 + ], + "density_at_root": 1.9162142276763916, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 38, + 4, + 0 + ], + "max_ring_voxel": [ + 39, + 5, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.7913575172424316, + "root_ring_voxel": [ + 19, + 6, + 0 + ], + "density_at_root": 1.7913575172424316, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 19, + 6, + 0 + ], + "max_ring_voxel": [ + 19, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.18510735034942627, + "root_ring_voxel": [ + 1, + 7, + 0 + ], + "density_at_root": 0.18510735034942627, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 1, + 7, + 0 + ], + "max_ring_voxel": [ + 1, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 10, + "density_at_min": -0.48074734210968018, + "root_ring_voxel": [ + 7, + 7, + 0 + ], + "density_at_root": 0.20892190933227539, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 5, + 7, + 0 + ], + "max_ring_voxel": [ + 8, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.73172450065612793, + "root_ring_voxel": [ + 23, + 7, + 0 + ], + "density_at_root": 0.73172450065612793, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 23, + 7, + 0 + ], + "max_ring_voxel": [ + 23, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 12, + "density_at_min": 0.4503633975982666, + "root_ring_voxel": [ + 39, + 7, + 0 + ], + "density_at_root": 2.0388236045837402, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 38, + 7, + 0 + ], + "max_ring_voxel": [ + 42, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.34167182445526123, + "root_ring_voxel": [ + 21, + 8, + 0 + ], + "density_at_root": 0.34167182445526123, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 21, + 8, + 0 + ], + "max_ring_voxel": [ + 21, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.30008411407470703, + "root_ring_voxel": [ + 36, + 8, + 0 + ], + "density_at_root": 0.30008411407470703, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 36, + 8, + 0 + ], + "max_ring_voxel": [ + 36, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 1.7228591442108154, + "root_ring_voxel": [ + 24, + 9, + 0 + ], + "density_at_root": 0.72530829906463623, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 23, + 9, + 0 + ], + "max_ring_voxel": [ + 24, + 9, + 0 + ] + }, + { + "sign": "air", + "samples": 5, + "density_at_min": -0.068696141242980957, + "root_ring_voxel": [ + 3, + 10, + 0 + ], + "density_at_root": 0.73763680458068848, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 1, + 9, + 0 + ], + "max_ring_voxel": [ + 4, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.4916739463806152, + "root_ring_voxel": [ + 15, + 10, + 0 + ], + "density_at_root": 1.4916739463806152, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 15, + 10, + 0 + ], + "max_ring_voxel": [ + 15, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 1.6852116584777832, + "root_ring_voxel": [ + 27, + 10, + 0 + ], + "density_at_root": 0.49176025390625, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 26, + 10, + 0 + ], + "max_ring_voxel": [ + 27, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 5, + "density_at_min": -1.9441111087799072, + "root_ring_voxel": [ + 30, + 10, + 0 + ], + "density_at_root": 1.2708029747009277, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 29, + 9, + 0 + ], + "max_ring_voxel": [ + 31, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 0.83564102649688721, + "root_ring_voxel": [ + 36, + 10, + 0 + ], + "density_at_root": 0.18626558780670166, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 35, + 10, + 0 + ], + "max_ring_voxel": [ + 37, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.8809819221496582, + "root_ring_voxel": [ + 45, + 11, + 0 + ], + "density_at_root": 0.8809819221496582, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 45, + 11, + 0 + ], + "max_ring_voxel": [ + 45, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.80165183544158936, + "root_ring_voxel": [ + 22, + 12, + 0 + ], + "density_at_root": 0.29265272617340088, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 22, + 11, + 0 + ], + "max_ring_voxel": [ + 22, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.78758776187896729, + "root_ring_voxel": [ + 42, + 12, + 0 + ], + "density_at_root": 0.78758776187896729, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 42, + 12, + 0 + ], + "max_ring_voxel": [ + 42, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.16667056083679199, + "root_ring_voxel": [ + 47, + 12, + 0 + ], + "density_at_root": 0.16667056083679199, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 47, + 12, + 0 + ], + "max_ring_voxel": [ + 47, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 0.51173853874206543, + "root_ring_voxel": [ + 11, + 13, + 0 + ], + "density_at_root": 0.18102622032165527, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 10, + 13, + 0 + ], + "max_ring_voxel": [ + 11, + 14, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 1.392946720123291, + "root_ring_voxel": [ + 18, + 13, + 0 + ], + "density_at_root": 0.39146971702575684, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 18, + 12, + 0 + ], + "max_ring_voxel": [ + 18, + 14, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.22311770915985107, + "root_ring_voxel": [ + 20, + 13, + 0 + ], + "density_at_root": 0.22311770915985107, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 20, + 13, + 0 + ], + "max_ring_voxel": [ + 20, + 13, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 0.67855310440063477, + "root_ring_voxel": [ + 25, + 13, + 0 + ], + "density_at_root": 0.99356222152709961, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 24, + 12, + 0 + ], + "max_ring_voxel": [ + 26, + 13, + 0 + ] + } + ], + "largest_air_component_voxels": 16147153, + "largest_solid_component_voxels": 1208334, + "one_meter_downsampled_air_components": 50, + "pitch_autocorrelation_peak": 0.18759559802708917, + "nearby_autocorrelation_peak": 0.30398491816662204, + "pitch_autocorrelation_excess": -0.11638932013953288, + "detail_rms": 1.5958015018814415, + "detail_lattice_scale_energy_ratio": 0.8316718995555632, + "mesh_triangles_l0": 95592, + "mesh_manifold_edges_l0": 140793, + "mesh_dihedral_share_over_45deg": 0.38046635841270515, + "mesh_dihedral_p95_deg": 83.940223693847656, + "mesh_vertices_l1": 7318, + "lod1_p95_surface_distance_voxels": 0.66107475757598877, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 22259, + "floor_samples": 38025, + "floor_openings": 24346, + "estimated_surface_area_m2": 57573.8125, + "open_air_fraction": 0.92945375380043915 + }, + "step2f": + { + "six_worker_ring_median_ms": 560.11110171675682, + "solid_fraction": 0.80312149565738511, + "air_fraction": 0.19687850434261489, + "air_components_25cm_grid": 3, + "solid_components_25cm_grid": 1, + "air_crumbs_below_1m3": 0, + "solid_crumbs_below_1m3": 0, + "air_crumbs_below_1m3_after_boundary_padding": 0, + "solid_crumbs_below_1m3_after_boundary_padding": 0, + "air_crumb_voxel_samples": 0, + "solid_crumb_voxel_samples": 0, + "crumb_components_first_32": [], + "largest_air_component_voxels": 3236457, + "largest_solid_component_voxels": 13953416, + "one_meter_downsampled_air_components": 4, + "pitch_autocorrelation_peak": 0.28513042735065297, + "nearby_autocorrelation_peak": 0.29316184949800006, + "pitch_autocorrelation_excess": -0.0080314221473470893, + "detail_rms": 0.48440035599680098, + "detail_lattice_scale_energy_ratio": 0.0069790296090780834, + "mesh_triangles_l0": 29062, + "mesh_manifold_edges_l0": 42802, + "mesh_dihedral_share_over_45deg": 0.002476519788794916, + "mesh_dihedral_p95_deg": 7.5172638893127441, + "mesh_vertices_l1": 3772, + "lod1_p95_surface_distance_voxels": 0.04007604718208313, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 0, + "floor_samples": 38025, + "floor_openings": 0, + "estimated_surface_area_m2": 20756.6875, + "open_air_fraction": 0.19687850434261489 + }, + "step2f_padded_crumb_diagnostics": [], + "step2e_parameters": + { + "room_pitch_voxels": 144, + "room_radius_fraction_min": 0.55000001192092896, + "room_radius_fraction_max": 0.72000002861022949, + "room_height_voxels": 320, + "floor_relief_voxels": 18, + "tunnel_radius_voxels": 34, + "tunnel_half_height_voxels": 32, + "loop_probability": 0.2800000011920929, + "vertical_shaft_probability": 0.18000000715255737, + "shaft_radius_voxels": 22, + "pillar_probability": 0.079999998211860657, + "ledge_probability": 0.2199999988079071, + "floating_mass_probability": 0.10000000149011612, + "stalactite_stalagmite_probability": 0.2199999988079071, + "basin_probability": 0.05000000074505806, + "basin_depth_voxels": 20, + "water_level_fraction": 0.40000000596046448 + }, + "step2f_parameters": + { + "room_pitch_voxels": 144, + "room_radius_fraction_min": 0.31999999284744263, + "room_radius_fraction_max": 0.40999999642372131, + "room_height_voxels": 136, + "floor_relief_voxels": 10, + "tunnel_radius_voxels": 21, + "tunnel_half_height_voxels": 17, + "loop_probability": 0.18000000715255737, + "vertical_shaft_probability": 0.10000000149011612, + "shaft_radius_voxels": 16, + "pillar_probability": 0.029999999329447746, + "ledge_probability": 0.059999998658895493, + "floating_mass_probability": 0.059999998658895493, + "stalactite_stalagmite_probability": 0.20000000298023224, + "basin_probability": 0.05000000074505806, + "basin_depth_voxels": 16, + "water_level_fraction": 0.40000000596046448 + }, + "step2e_six_worker_ring_trials_ms": [ + 468.2605005800724, + 490.61529710888863, + 493.28700080513954 + ], + "step2f_six_worker_ring_trials_ms": [ + 525.95889940857887, + 560.11110171675682, + 600.11389851570129 + ], + "step2f_last_trial_timing_breakdown": + { + "last_trial_wall_ms": 525.95889940857887, + "last_trial_worker_cpu_seconds": 2.640625, + "sum_worker_brick_classification_seconds": 0.47893880680203438, + "sum_worker_density_evaluation_seconds": 2.5872731693089008, + "sum_worker_uniform_fill_seconds": 0.039006315171718597, + "longest_worker_wall_seconds": 0.52188849821686745, + "evaluated_samples": 6812915, + "skipped_samples": 10561064, + "macro_centre_evaluations": 251683 + }, + "slice_directory": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_02_chamberhalls" + }, + { + "profile_index": 3, + "name": "ShaftForest", + "step2e": + { + "six_worker_ring_median_ms": 558.89790132641792, + "solid_fraction": 0.14047507482310184, + "air_fraction": 0.85952492517689816, + "air_components_25cm_grid": 821, + "solid_components_25cm_grid": 1125, + "air_crumbs_below_1m3": 820, + "solid_crumbs_below_1m3": 1120, + "air_crumbs_below_1m3_after_boundary_padding": 514, + "solid_crumbs_below_1m3_after_boundary_padding": 1082, + "air_crumb_voxel_samples": 1323, + "solid_crumb_voxel_samples": 1713, + "crumb_components_first_32": [ + { + "sign": "air", + "samples": 16, + "density_at_min": 0.17696738243103027, + "root_ring_voxel": [ + 15, + 0, + 0 + ], + "density_at_root": 1.5752029418945312, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 14, + 0, + 0 + ], + "max_ring_voxel": [ + 18, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.018889307975769043, + "root_ring_voxel": [ + 25, + 0, + 0 + ], + "density_at_root": 0.018889307975769043, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 25, + 0, + 0 + ], + "max_ring_voxel": [ + 25, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.8325653076171875, + "root_ring_voxel": [ + 45, + 0, + 0 + ], + "density_at_root": 0.8325653076171875, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 45, + 0, + 0 + ], + "max_ring_voxel": [ + 45, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 1.1588717699050903, + "root_ring_voxel": [ + 172, + 0, + 0 + ], + "density_at_root": 0.51944816112518311, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 171, + 0, + 0 + ], + "max_ring_voxel": [ + 172, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -0.71394884586334229, + "root_ring_voxel": [ + 1, + 1, + 0 + ], + "density_at_root": 0.005947113037109375, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 1, + 0, + 0 + ], + "max_ring_voxel": [ + 2, + 1, + 0 + ] + }, + { + "sign": "air", + "samples": 4, + "density_at_min": 0.34131002426147461, + "root_ring_voxel": [ + 21, + 1, + 0 + ], + "density_at_root": 0.79689145088195801, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 20, + 0, + 0 + ], + "max_ring_voxel": [ + 22, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 6, + "density_at_min": -0.14569008350372314, + "root_ring_voxel": [ + 35, + 1, + 0 + ], + "density_at_root": 0.3092353343963623, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 34, + 0, + 0 + ], + "max_ring_voxel": [ + 36, + 4, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.09632110595703125, + "root_ring_voxel": [ + 27, + 2, + 0 + ], + "density_at_root": 0.09632110595703125, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 27, + 2, + 0 + ], + "max_ring_voxel": [ + 27, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 5, + "density_at_min": -0.21217966079711914, + "root_ring_voxel": [ + 31, + 2, + 0 + ], + "density_at_root": 0.85699892044067383, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 31, + 1, + 0 + ], + "max_ring_voxel": [ + 33, + 4, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.14202880859375, + "root_ring_voxel": [ + 172, + 2, + 0 + ], + "density_at_root": 0.14202880859375, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 172, + 2, + 0 + ], + "max_ring_voxel": [ + 172, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.18723142147064209, + "root_ring_voxel": [ + 25, + 3, + 0 + ], + "density_at_root": 0.18723142147064209, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 25, + 3, + 0 + ], + "max_ring_voxel": [ + 25, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 0.27120804786682129, + "root_ring_voxel": [ + 41, + 4, + 0 + ], + "density_at_root": 0.12659704685211182, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 40, + 3, + 0 + ], + "max_ring_voxel": [ + 42, + 4, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 1.1006064414978027, + "root_ring_voxel": [ + 48, + 4, + 0 + ], + "density_at_root": 0.44352281093597412, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 47, + 3, + 0 + ], + "max_ring_voxel": [ + 48, + 4, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 1.1118268966674805, + "root_ring_voxel": [ + 38, + 5, + 0 + ], + "density_at_root": 1.2692415714263916, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 38, + 4, + 0 + ], + "max_ring_voxel": [ + 39, + 5, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.1443848609924316, + "root_ring_voxel": [ + 19, + 6, + 0 + ], + "density_at_root": 1.1443848609924316, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 19, + 6, + 0 + ], + "max_ring_voxel": [ + 19, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 5, + "density_at_min": -0.036162257194519043, + "root_ring_voxel": [ + 27, + 6, + 0 + ], + "density_at_root": 0.467193603515625, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 26, + 5, + 0 + ], + "max_ring_voxel": [ + 28, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.73471522331237793, + "root_ring_voxel": [ + 33, + 6, + 0 + ], + "density_at_root": 0.73471522331237793, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 33, + 6, + 0 + ], + "max_ring_voxel": [ + 33, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.11787033081054688, + "root_ring_voxel": [ + 44, + 6, + 0 + ], + "density_at_root": 0.11787033081054688, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 44, + 6, + 0 + ], + "max_ring_voxel": [ + 44, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.08475184440612793, + "root_ring_voxel": [ + 23, + 7, + 0 + ], + "density_at_root": 0.08475184440612793, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 23, + 7, + 0 + ], + "max_ring_voxel": [ + 23, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.35483384132385254, + "root_ring_voxel": [ + 46, + 7, + 0 + ], + "density_at_root": 0.35483384132385254, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 46, + 7, + 0 + ], + "max_ring_voxel": [ + 46, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": -0.17324519157409668, + "root_ring_voxel": [ + 7, + 8, + 0 + ], + "density_at_root": 0.76242923736572266, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 6, + 7, + 0 + ], + "max_ring_voxel": [ + 8, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 8, + "density_at_min": -0.1966092586517334, + "root_ring_voxel": [ + 38, + 8, + 0 + ], + "density_at_root": 1.1097135543823242, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 38, + 7, + 0 + ], + "max_ring_voxel": [ + 42, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": -0.44098281860351562, + "root_ring_voxel": [ + 11, + 9, + 0 + ], + "density_at_root": 1.0408329963684082, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 10, + 8, + 0 + ], + "max_ring_voxel": [ + 12, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 1.0758864879608154, + "root_ring_voxel": [ + 24, + 9, + 0 + ], + "density_at_root": 0.07833564281463623, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 23, + 9, + 0 + ], + "max_ring_voxel": [ + 24, + 9, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.84470129013061523, + "root_ring_voxel": [ + 15, + 10, + 0 + ], + "density_at_root": 0.84470129013061523, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 15, + 10, + 0 + ], + "max_ring_voxel": [ + 15, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.0382390022277832, + "root_ring_voxel": [ + 26, + 10, + 0 + ], + "density_at_root": 1.0382390022277832, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 26, + 10, + 0 + ], + "max_ring_voxel": [ + 26, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.31349396705627441, + "root_ring_voxel": [ + 30, + 10, + 0 + ], + "density_at_root": 0.62383031845092773, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 30, + 9, + 0 + ], + "max_ring_voxel": [ + 30, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.18866837024688721, + "root_ring_voxel": [ + 35, + 10, + 0 + ], + "density_at_root": 0.18866837024688721, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 35, + 10, + 0 + ], + "max_ring_voxel": [ + 35, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.2391810417175293, + "root_ring_voxel": [ + 37, + 10, + 0 + ], + "density_at_root": 1.2391810417175293, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 37, + 10, + 0 + ], + "max_ring_voxel": [ + 37, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -2.1299822330474854, + "root_ring_voxel": [ + 2, + 11, + 0 + ], + "density_at_root": 0.23612046241760254, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 2, + 10, + 0 + ], + "max_ring_voxel": [ + 3, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.15467917919158936, + "root_ring_voxel": [ + 22, + 11, + 0 + ], + "density_at_root": 0.15467917919158936, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 22, + 11, + 0 + ], + "max_ring_voxel": [ + 22, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.12231671810150146, + "root_ring_voxel": [ + 45, + 11, + 0 + ], + "density_at_root": 0.12231671810150146, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 45, + 11, + 0 + ], + "max_ring_voxel": [ + 45, + 11, + 0 + ] + } + ], + "largest_air_component_voxels": 14932045, + "largest_solid_component_voxels": 2434077, + "one_meter_downsampled_air_components": 99, + "pitch_autocorrelation_peak": 0.46405430374128698, + "nearby_autocorrelation_peak": 0.42042245972716408, + "pitch_autocorrelation_excess": 0.0436318440141229, + "detail_rms": 1.5958015018814415, + "detail_lattice_scale_energy_ratio": 0.8316718995555632, + "mesh_triangles_l0": 140630, + "mesh_manifold_edges_l0": 206569, + "mesh_dihedral_share_over_45deg": 0.39794451248735291, + "mesh_dihedral_p95_deg": 84.171104431152344, + "mesh_vertices_l1": 10239, + "lod1_p95_surface_distance_voxels": 0.66926312446594238, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 21168, + "floor_samples": 38025, + "floor_openings": 22185, + "estimated_surface_area_m2": 93552.9375, + "open_air_fraction": 0.85952492517689816 + }, + "step2f": + { + "six_worker_ring_median_ms": 565.4590018093586, + "solid_fraction": 0.8136665757452568, + "air_fraction": 0.18633342425474325, + "air_components_25cm_grid": 2, + "solid_components_25cm_grid": 1, + "air_crumbs_below_1m3": 0, + "solid_crumbs_below_1m3": 0, + "air_crumbs_below_1m3_after_boundary_padding": 0, + "solid_crumbs_below_1m3_after_boundary_padding": 0, + "air_crumb_voxel_samples": 0, + "solid_crumb_voxel_samples": 0, + "crumb_components_first_32": [], + "largest_air_component_voxels": 2960136, + "largest_solid_component_voxels": 14136626, + "one_meter_downsampled_air_components": 2, + "pitch_autocorrelation_peak": 0.31924593607424739, + "nearby_autocorrelation_peak": 0.41031228244386259, + "pitch_autocorrelation_excess": -0.091066346369615192, + "detail_rms": 0.48440035599680098, + "detail_lattice_scale_energy_ratio": 0.0069790296090780834, + "mesh_triangles_l0": 29346, + "mesh_manifold_edges_l0": 43176, + "mesh_dihedral_share_over_45deg": 0.022304057809894386, + "mesh_dihedral_p95_deg": 34.817558288574219, + "mesh_vertices_l1": 3918, + "lod1_p95_surface_distance_voxels": 0.3770425021648407, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 0, + "floor_samples": 38025, + "floor_openings": 0, + "estimated_surface_area_m2": 20963.6875, + "open_air_fraction": 0.18633342425474325 + }, + "step2f_padded_crumb_diagnostics": [], + "step2e_parameters": + { + "room_pitch_voxels": 128, + "room_radius_fraction_min": 0.5, + "room_radius_fraction_max": 0.62000000476837158, + "room_height_voxels": 272, + "floor_relief_voxels": 12, + "tunnel_radius_voxels": 26, + "tunnel_half_height_voxels": 28, + "loop_probability": 0.11999999731779099, + "vertical_shaft_probability": 0.92000001668930054, + "shaft_radius_voxels": 28, + "pillar_probability": 0.05000000074505806, + "ledge_probability": 0.18000000715255737, + "floating_mass_probability": 0.039999999105930328, + "stalactite_stalagmite_probability": 0.20000000298023224, + "basin_probability": 0, + "basin_depth_voxels": 0, + "water_level_fraction": 0.5 + }, + "step2f_parameters": + { + "room_pitch_voxels": 128, + "room_radius_fraction_min": 0.2800000011920929, + "room_radius_fraction_max": 0.36000001430511475, + "room_height_voxels": 120, + "floor_relief_voxels": 7, + "tunnel_radius_voxels": 19, + "tunnel_half_height_voxels": 15, + "loop_probability": 0.15999999642372131, + "vertical_shaft_probability": 0.41999998688697815, + "shaft_radius_voxels": 20, + "pillar_probability": 0.029999999329447746, + "ledge_probability": 0.059999998658895493, + "floating_mass_probability": 0.029999999329447746, + "stalactite_stalagmite_probability": 0.2199999988079071, + "basin_probability": 0, + "basin_depth_voxels": 0, + "water_level_fraction": 0.5 + }, + "step2e_six_worker_ring_trials_ms": [ + 549.18910190463066, + 558.89790132641792, + 589.6092988550663 + ], + "step2f_six_worker_ring_trials_ms": [ + 552.49860137701035, + 565.4590018093586, + 600.21809861063957 + ], + "step2f_last_trial_timing_breakdown": + { + "last_trial_wall_ms": 565.4590018093586, + "last_trial_worker_cpu_seconds": 2.859375, + "sum_worker_brick_classification_seconds": 0.50610031187534332, + "sum_worker_density_evaluation_seconds": 2.7967488914728165, + "sum_worker_uniform_fill_seconds": 0.039079301059246063, + "longest_worker_wall_seconds": 0.56141889840364456, + "evaluated_samples": 6838147, + "skipped_samples": 10535832, + "macro_centre_evaluations": 251683 + }, + "slice_directory": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_03_shaftforest" + }, + { + "profile_index": 4, + "name": "FloatingArchipelago", + "step2e": + { + "six_worker_ring_median_ms": 568.55560094118118, + "solid_fraction": 0.18552134775804663, + "air_fraction": 0.81447865224195337, + "air_components_25cm_grid": 565, + "solid_components_25cm_grid": 887, + "air_crumbs_below_1m3": 564, + "solid_crumbs_below_1m3": 871, + "air_crumbs_below_1m3_after_boundary_padding": 510, + "solid_crumbs_below_1m3_after_boundary_padding": 810, + "air_crumb_voxel_samples": 705, + "solid_crumb_voxel_samples": 1356, + "crumb_components_first_32": [ + { + "sign": "air", + "samples": 1, + "density_at_min": 0.13335895538330078, + "root_ring_voxel": [ + 249, + 50, + 8 + ], + "density_at_root": 0.13335895538330078, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 249, + 50, + 8 + ], + "max_ring_voxel": [ + 249, + 50, + 8 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.10713529586791992, + "root_ring_voxel": [ + 258, + 51, + 8 + ], + "density_at_root": 0.14924025535583496, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 257, + 51, + 8 + ], + "max_ring_voxel": [ + 258, + 51, + 8 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.099694967269897461, + "root_ring_voxel": [ + 256, + 37, + 9 + ], + "density_at_root": 0.099694967269897461, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 256, + 37, + 9 + ], + "max_ring_voxel": [ + 256, + 37, + 9 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.050089597702026367, + "root_ring_voxel": [ + 244, + 65, + 9 + ], + "density_at_root": 0.012422561645507812, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 244, + 64, + 9 + ], + "max_ring_voxel": [ + 244, + 65, + 9 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.15222859382629395, + "root_ring_voxel": [ + 58, + 243, + 9 + ], + "density_at_root": 0.33477544784545898, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 58, + 242, + 9 + ], + "max_ring_voxel": [ + 58, + 243, + 9 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.012430667877197266, + "root_ring_voxel": [ + 10, + 254, + 9 + ], + "density_at_root": 0.012430667877197266, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 10, + 254, + 9 + ], + "max_ring_voxel": [ + 10, + 254, + 9 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.22642207145690918, + "root_ring_voxel": [ + 241, + 0, + 10 + ], + "density_at_root": 0.22642207145690918, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 241, + 0, + 10 + ], + "max_ring_voxel": [ + 241, + 0, + 10 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.092091798782348633, + "root_ring_voxel": [ + 212, + 43, + 10 + ], + "density_at_root": 0.092091798782348633, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 212, + 43, + 10 + ], + "max_ring_voxel": [ + 212, + 43, + 10 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.41880154609680176, + "root_ring_voxel": [ + 183, + 49, + 10 + ], + "density_at_root": 0.07294011116027832, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 182, + 49, + 10 + ], + "max_ring_voxel": [ + 183, + 49, + 10 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.035080671310424805, + "root_ring_voxel": [ + 233, + 53, + 10 + ], + "density_at_root": 0.035080671310424805, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 233, + 53, + 10 + ], + "max_ring_voxel": [ + 233, + 53, + 10 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": -3.2353029251098633, + "root_ring_voxel": [ + 213, + 86, + 10 + ], + "density_at_root": 0.25333404541015625, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 213, + 85, + 10 + ], + "max_ring_voxel": [ + 214, + 86, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.40523910522460938, + "root_ring_voxel": [ + 207, + 110, + 10 + ], + "density_at_root": 0.40523910522460938, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 207, + 110, + 10 + ], + "max_ring_voxel": [ + 207, + 110, + 10 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.016051530838012695, + "root_ring_voxel": [ + 247, + 122, + 10 + ], + "density_at_root": 0.016051530838012695, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 247, + 122, + 10 + ], + "max_ring_voxel": [ + 247, + 122, + 10 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.34347081184387207, + "root_ring_voxel": [ + 89, + 197, + 10 + ], + "density_at_root": 0.34347081184387207, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 89, + 197, + 10 + ], + "max_ring_voxel": [ + 89, + 197, + 10 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.30382013320922852, + "root_ring_voxel": [ + 121, + 223, + 10 + ], + "density_at_root": 0.30382013320922852, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 121, + 223, + 10 + ], + "max_ring_voxel": [ + 121, + 223, + 10 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.2570044994354248, + "root_ring_voxel": [ + 58, + 248, + 10 + ], + "density_at_root": 0.2570044994354248, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 58, + 248, + 10 + ], + "max_ring_voxel": [ + 58, + 248, + 10 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.20053839683532715, + "root_ring_voxel": [ + 124, + 250, + 10 + ], + "density_at_root": 0.11351156234741211, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 124, + 249, + 10 + ], + "max_ring_voxel": [ + 124, + 250, + 10 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.0038559436798095703, + "root_ring_voxel": [ + 256, + 19, + 11 + ], + "density_at_root": 0.0038559436798095703, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 256, + 19, + 11 + ], + "max_ring_voxel": [ + 256, + 19, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.69099080562591553, + "root_ring_voxel": [ + 258, + 24, + 11 + ], + "density_at_root": 0.69099080562591553, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 258, + 24, + 11 + ], + "max_ring_voxel": [ + 258, + 24, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.34371423721313477, + "root_ring_voxel": [ + 209, + 26, + 11 + ], + "density_at_root": 0.34371423721313477, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 209, + 26, + 11 + ], + "max_ring_voxel": [ + 209, + 26, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.077884912490844727, + "root_ring_voxel": [ + 183, + 32, + 11 + ], + "density_at_root": 0.077884912490844727, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 183, + 32, + 11 + ], + "max_ring_voxel": [ + 183, + 32, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.37576651573181152, + "root_ring_voxel": [ + 221, + 51, + 11 + ], + "density_at_root": 0.37576651573181152, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 221, + 51, + 11 + ], + "max_ring_voxel": [ + 221, + 51, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.45432078838348389, + "root_ring_voxel": [ + 258, + 82, + 11 + ], + "density_at_root": 0.45432078838348389, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 258, + 82, + 11 + ], + "max_ring_voxel": [ + 258, + 82, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.42264270782470703, + "root_ring_voxel": [ + 246, + 84, + 11 + ], + "density_at_root": 0.42264270782470703, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 246, + 84, + 11 + ], + "max_ring_voxel": [ + 246, + 84, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.22647571563720703, + "root_ring_voxel": [ + 241, + 85, + 11 + ], + "density_at_root": 0.22647571563720703, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 241, + 85, + 11 + ], + "max_ring_voxel": [ + 241, + 85, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.30376839637756348, + "root_ring_voxel": [ + 229, + 86, + 11 + ], + "density_at_root": 0.30376839637756348, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 229, + 86, + 11 + ], + "max_ring_voxel": [ + 229, + 86, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.28076887130737305, + "root_ring_voxel": [ + 220, + 93, + 11 + ], + "density_at_root": 0.28076887130737305, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 220, + 93, + 11 + ], + "max_ring_voxel": [ + 220, + 93, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.085534334182739258, + "root_ring_voxel": [ + 227, + 115, + 11 + ], + "density_at_root": 0.085534334182739258, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 227, + 115, + 11 + ], + "max_ring_voxel": [ + 227, + 115, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.39571952819824219, + "root_ring_voxel": [ + 75, + 193, + 11 + ], + "density_at_root": 0.39571952819824219, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 75, + 193, + 11 + ], + "max_ring_voxel": [ + 75, + 193, + 11 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 0.18447613716125488, + "root_ring_voxel": [ + 87, + 193, + 11 + ], + "density_at_root": 0.47467470169067383, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 86, + 193, + 11 + ], + "max_ring_voxel": [ + 88, + 193, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.012057304382324219, + "root_ring_voxel": [ + 124, + 207, + 11 + ], + "density_at_root": 0.012057304382324219, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 124, + 207, + 11 + ], + "max_ring_voxel": [ + 124, + 207, + 11 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.15960311889648438, + "root_ring_voxel": [ + 48, + 256, + 11 + ], + "density_at_root": 0.15960311889648438, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 48, + 256, + 11 + ], + "max_ring_voxel": [ + 48, + 256, + 11 + ] + } + ], + "largest_air_component_voxels": 14150030, + "largest_solid_component_voxels": 3192060, + "one_meter_downsampled_air_components": 65, + "pitch_autocorrelation_peak": 0.66690690463053837, + "nearby_autocorrelation_peak": 0.6195022951603647, + "pitch_autocorrelation_excess": 0.047404609470173664, + "detail_rms": 1.5958015018814415, + "detail_lattice_scale_energy_ratio": 0.8316718995555632, + "mesh_triangles_l0": 77122, + "mesh_manifold_edges_l0": 113537, + "mesh_dihedral_share_over_45deg": 0.35186767309335282, + "mesh_dihedral_p95_deg": 83.437408447265625, + "mesh_vertices_l1": 6275, + "lod1_p95_surface_distance_voxels": 0.62742352485656738, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 5616, + "floor_samples": 38025, + "floor_openings": 547, + "estimated_surface_area_m2": 77084.1875, + "open_air_fraction": 0.81447865224195337 + }, + "step2f": + { + "six_worker_ring_median_ms": 558.5268996655941, + "solid_fraction": 0.82423795953707557, + "air_fraction": 0.17576204046292446, + "air_components_25cm_grid": 4, + "solid_components_25cm_grid": 1, + "air_crumbs_below_1m3": 2, + "solid_crumbs_below_1m3": 0, + "air_crumbs_below_1m3_after_boundary_padding": 0, + "solid_crumbs_below_1m3_after_boundary_padding": 0, + "air_crumb_voxel_samples": 48, + "solid_crumb_voxel_samples": 0, + "crumb_components_first_32": [ + { + "sign": "air", + "samples": 21, + "density_at_min": -0.086187839508056641, + "root_ring_voxel": [ + 201, + 0, + 127 + ], + "density_at_root": 0.16247320175170898, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 199, + 0, + 127 + ], + "max_ring_voxel": [ + 203, + 0, + 131 + ] + }, + { + "sign": "air", + "samples": 27, + "density_at_min": -0.085275888442993164, + "root_ring_voxel": [ + 202, + 0, + 158 + ], + "density_at_root": 0.057527303695678711, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 200, + 0, + 158 + ], + "max_ring_voxel": [ + 204, + 0, + 163 + ] + } + ], + "largest_air_component_voxels": 2896547, + "largest_solid_component_voxels": 14320293, + "one_meter_downsampled_air_components": 4, + "pitch_autocorrelation_peak": 0.30402707042048605, + "nearby_autocorrelation_peak": 0.33176661651464967, + "pitch_autocorrelation_excess": -0.027739546094163625, + "detail_rms": 0.48440035599680098, + "detail_lattice_scale_energy_ratio": 0.0069790296090780834, + "mesh_triangles_l0": 28741, + "mesh_manifold_edges_l0": 42181, + "mesh_dihedral_share_over_45deg": 0.016239539128991728, + "mesh_dihedral_p95_deg": 12.978972434997559, + "mesh_vertices_l1": 3776, + "lod1_p95_surface_distance_voxels": 0.28498286008834839, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 0, + "floor_samples": 38025, + "floor_openings": 0, + "estimated_surface_area_m2": 19743.1875, + "open_air_fraction": 0.17576204046292446 + }, + "step2f_padded_crumb_diagnostics": [], + "step2e_parameters": + { + "room_pitch_voxels": 136, + "room_radius_fraction_min": 0.55000001192092896, + "room_radius_fraction_max": 0.68000000715255737, + "room_height_voxels": 216, + "floor_relief_voxels": 10, + "tunnel_radius_voxels": 28, + "tunnel_half_height_voxels": 28, + "loop_probability": 0.15000000596046448, + "vertical_shaft_probability": 0.10000000149011612, + "shaft_radius_voxels": 16, + "pillar_probability": 0.05000000074505806, + "ledge_probability": 0.10000000149011612, + "floating_mass_probability": 0.72000002861022949, + "stalactite_stalagmite_probability": 0.2800000011920929, + "basin_probability": 0, + "basin_depth_voxels": 0, + "water_level_fraction": 0.5 + }, + "step2f_parameters": + { + "room_pitch_voxels": 136, + "room_radius_fraction_min": 0.28999999165534973, + "room_radius_fraction_max": 0.37000000476837158, + "room_height_voxels": 116, + "floor_relief_voxels": 6, + "tunnel_radius_voxels": 19, + "tunnel_half_height_voxels": 15, + "loop_probability": 0.11999999731779099, + "vertical_shaft_probability": 0.079999998211860657, + "shaft_radius_voxels": 15, + "pillar_probability": 0.019999999552965164, + "ledge_probability": 0.059999998658895493, + "floating_mass_probability": 0.079999998211860657, + "stalactite_stalagmite_probability": 0.20000000298023224, + "basin_probability": 0, + "basin_depth_voxels": 0, + "water_level_fraction": 0.5 + }, + "step2e_six_worker_ring_trials_ms": [ + 549.03959855437279, + 568.55560094118118, + 573.35579767823219 + ], + "step2f_six_worker_ring_trials_ms": [ + 536.93469986319542, + 558.5268996655941, + 567.11379811167717 + ], + "step2f_last_trial_timing_breakdown": + { + "last_trial_wall_ms": 536.93469986319542, + "last_trial_worker_cpu_seconds": 2.8125, + "sum_worker_brick_classification_seconds": 0.49646424129605293, + "sum_worker_density_evaluation_seconds": 2.6345808543264866, + "sum_worker_uniform_fill_seconds": 0.040149234235286713, + "longest_worker_wall_seconds": 0.53290769830346107, + "evaluated_samples": 6520471, + "skipped_samples": 10853508, + "macro_centre_evaluations": 251683 + }, + "slice_directory": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_04_floatingarchipelago" + }, + { + "profile_index": 5, + "name": "PillaredCathedral", + "step2e": + { + "six_worker_ring_median_ms": 510.4282982647419, + "solid_fraction": 0.074797834163377264, + "air_fraction": 0.92520216583662274, + "air_components_25cm_grid": 501, + "solid_components_25cm_grid": 1047, + "air_crumbs_below_1m3": 500, + "solid_crumbs_below_1m3": 1040, + "air_crumbs_below_1m3_after_boundary_padding": 345, + "solid_crumbs_below_1m3_after_boundary_padding": 998, + "air_crumb_voxel_samples": 785, + "solid_crumb_voxel_samples": 1941, + "crumb_components_first_32": [ + { + "sign": "air", + "samples": 16, + "density_at_min": 0.17696738243103027, + "root_ring_voxel": [ + 15, + 0, + 0 + ], + "density_at_root": 1.5752029418945312, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 14, + 0, + 0 + ], + "max_ring_voxel": [ + 18, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.018889307975769043, + "root_ring_voxel": [ + 25, + 0, + 0 + ], + "density_at_root": 0.018889307975769043, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 25, + 0, + 0 + ], + "max_ring_voxel": [ + 25, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -0.71394884586334229, + "root_ring_voxel": [ + 1, + 1, + 0 + ], + "density_at_root": 0.005947113037109375, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 1, + 0, + 0 + ], + "max_ring_voxel": [ + 2, + 1, + 0 + ] + }, + { + "sign": "air", + "samples": 4, + "density_at_min": 0.34131002426147461, + "root_ring_voxel": [ + 21, + 1, + 0 + ], + "density_at_root": 0.79689145088195801, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 20, + 0, + 0 + ], + "max_ring_voxel": [ + 22, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 6, + "density_at_min": -0.14569008350372314, + "root_ring_voxel": [ + 35, + 1, + 0 + ], + "density_at_root": 0.3092353343963623, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 34, + 0, + 0 + ], + "max_ring_voxel": [ + 36, + 4, + 0 + ] + }, + { + "sign": "air", + "samples": 11, + "density_at_min": -3.6729412078857422, + "root_ring_voxel": [ + 44, + 1, + 0 + ], + "density_at_root": 0.32578146457672119, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 40, + 0, + 0 + ], + "max_ring_voxel": [ + 45, + 4, + 0 + ] + }, + { + "sign": "solid", + "samples": 2, + "density_at_min": -1.2580690383911133, + "root_ring_voxel": [ + 209, + 1, + 0 + ], + "density_at_root": -0.43116855621337891, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 208, + 1, + 0 + ], + "max_ring_voxel": [ + 209, + 1, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.09632110595703125, + "root_ring_voxel": [ + 27, + 2, + 0 + ], + "density_at_root": 0.09632110595703125, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 27, + 2, + 0 + ], + "max_ring_voxel": [ + 27, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 5, + "density_at_min": -0.21217966079711914, + "root_ring_voxel": [ + 31, + 2, + 0 + ], + "density_at_root": 0.85699892044067383, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 31, + 1, + 0 + ], + "max_ring_voxel": [ + 33, + 4, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.18723142147064209, + "root_ring_voxel": [ + 25, + 3, + 0 + ], + "density_at_root": 0.18723142147064209, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 25, + 3, + 0 + ], + "max_ring_voxel": [ + 25, + 3, + 0 + ] + }, + { + "sign": "solid", + "samples": 1, + "density_at_min": -0.0059812068939208984, + "root_ring_voxel": [ + 209, + 3, + 0 + ], + "density_at_root": -0.0059812068939208984, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 209, + 3, + 0 + ], + "max_ring_voxel": [ + 209, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 1.1118268966674805, + "root_ring_voxel": [ + 38, + 5, + 0 + ], + "density_at_root": 1.2692415714263916, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 38, + 4, + 0 + ], + "max_ring_voxel": [ + 39, + 5, + 0 + ] + }, + { + "sign": "solid", + "samples": 1, + "density_at_min": -0.54986906051635742, + "root_ring_voxel": [ + 210, + 5, + 0 + ], + "density_at_root": -0.54986906051635742, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 210, + 5, + 0 + ], + "max_ring_voxel": [ + 210, + 5, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.1443848609924316, + "root_ring_voxel": [ + 19, + 6, + 0 + ], + "density_at_root": 1.1443848609924316, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 19, + 6, + 0 + ], + "max_ring_voxel": [ + 19, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 5, + "density_at_min": -0.036162257194519043, + "root_ring_voxel": [ + 27, + 6, + 0 + ], + "density_at_root": 0.467193603515625, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 26, + 5, + 0 + ], + "max_ring_voxel": [ + 28, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.73471522331237793, + "root_ring_voxel": [ + 33, + 6, + 0 + ], + "density_at_root": 0.73471522331237793, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 33, + 6, + 0 + ], + "max_ring_voxel": [ + 33, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.26901662349700928, + "root_ring_voxel": [ + 44, + 6, + 0 + ], + "density_at_root": 0.26901662349700928, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 44, + 6, + 0 + ], + "max_ring_voxel": [ + 44, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.08475184440612793, + "root_ring_voxel": [ + 23, + 7, + 0 + ], + "density_at_root": 0.08475184440612793, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 23, + 7, + 0 + ], + "max_ring_voxel": [ + 23, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -1.341823935508728, + "root_ring_voxel": [ + 46, + 7, + 0 + ], + "density_at_root": 0.60409784317016602, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 46, + 6, + 0 + ], + "max_ring_voxel": [ + 47, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": -0.17324519157409668, + "root_ring_voxel": [ + 7, + 8, + 0 + ], + "density_at_root": 0.76242923736572266, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 6, + 7, + 0 + ], + "max_ring_voxel": [ + 8, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 8, + "density_at_min": -0.1966092586517334, + "root_ring_voxel": [ + 38, + 8, + 0 + ], + "density_at_root": 1.1097135543823242, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 38, + 7, + 0 + ], + "max_ring_voxel": [ + 42, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.026835441589355469, + "root_ring_voxel": [ + 49, + 8, + 0 + ], + "density_at_root": 0.40595698356628418, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 49, + 7, + 0 + ], + "max_ring_voxel": [ + 49, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": -0.44098281860351562, + "root_ring_voxel": [ + 11, + 9, + 0 + ], + "density_at_root": 1.0408329963684082, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 10, + 8, + 0 + ], + "max_ring_voxel": [ + 12, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 1.0758864879608154, + "root_ring_voxel": [ + 24, + 9, + 0 + ], + "density_at_root": 0.07833564281463623, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 23, + 9, + 0 + ], + "max_ring_voxel": [ + 24, + 9, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.84470129013061523, + "root_ring_voxel": [ + 15, + 10, + 0 + ], + "density_at_root": 0.84470129013061523, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 15, + 10, + 0 + ], + "max_ring_voxel": [ + 15, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.0382390022277832, + "root_ring_voxel": [ + 26, + 10, + 0 + ], + "density_at_root": 1.0382390022277832, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 26, + 10, + 0 + ], + "max_ring_voxel": [ + 26, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.31349396705627441, + "root_ring_voxel": [ + 30, + 10, + 0 + ], + "density_at_root": 0.62383031845092773, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 30, + 9, + 0 + ], + "max_ring_voxel": [ + 30, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.18866837024688721, + "root_ring_voxel": [ + 35, + 10, + 0 + ], + "density_at_root": 0.18866837024688721, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 35, + 10, + 0 + ], + "max_ring_voxel": [ + 35, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.2391810417175293, + "root_ring_voxel": [ + 37, + 10, + 0 + ], + "density_at_root": 1.2391810417175293, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 37, + 10, + 0 + ], + "max_ring_voxel": [ + 37, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -2.1299822330474854, + "root_ring_voxel": [ + 2, + 11, + 0 + ], + "density_at_root": 0.23612046241760254, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 2, + 10, + 0 + ], + "max_ring_voxel": [ + 3, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.15467917919158936, + "root_ring_voxel": [ + 22, + 11, + 0 + ], + "density_at_root": 0.15467917919158936, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 22, + 11, + 0 + ], + "max_ring_voxel": [ + 22, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.12231671810150146, + "root_ring_voxel": [ + 45, + 11, + 0 + ], + "density_at_root": 0.12231671810150146, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 45, + 11, + 0 + ], + "max_ring_voxel": [ + 45, + 11, + 0 + ] + } + ], + "largest_air_component_voxels": 16073658, + "largest_solid_component_voxels": 1216397, + "one_meter_downsampled_air_components": 50, + "pitch_autocorrelation_peak": 0.19700063753741573, + "nearby_autocorrelation_peak": 0.304614467897728, + "pitch_autocorrelation_excess": -0.10761383036031227, + "detail_rms": 1.5958015018814415, + "detail_lattice_scale_energy_ratio": 0.8316718995555632, + "mesh_triangles_l0": 100090, + "mesh_manifold_edges_l0": 146930, + "mesh_dihedral_share_over_45deg": 0.38609541958755872, + "mesh_dihedral_p95_deg": 84.013160705566406, + "mesh_vertices_l1": 7738, + "lod1_p95_surface_distance_voxels": 0.68626326322555542, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 23857, + "floor_samples": 38025, + "floor_openings": 24147, + "estimated_surface_area_m2": 67408.875, + "open_air_fraction": 0.92520216583662274 + }, + "step2f": + { + "six_worker_ring_median_ms": 547.46629670262337, + "solid_fraction": 0.79336978593101781, + "air_fraction": 0.20663021406898213, + "air_components_25cm_grid": 1, + "solid_components_25cm_grid": 2, + "air_crumbs_below_1m3": 0, + "solid_crumbs_below_1m3": 0, + "air_crumbs_below_1m3_after_boundary_padding": 0, + "solid_crumbs_below_1m3_after_boundary_padding": 0, + "air_crumb_voxel_samples": 0, + "solid_crumb_voxel_samples": 0, + "crumb_components_first_32": [], + "largest_air_component_voxels": 3589989, + "largest_solid_component_voxels": 13783427, + "one_meter_downsampled_air_components": 1, + "pitch_autocorrelation_peak": 0.28556463073448007, + "nearby_autocorrelation_peak": 0.28450107141314174, + "pitch_autocorrelation_excess": 0.0010635593213383365, + "detail_rms": 0.48440035599680098, + "detail_lattice_scale_energy_ratio": 0.0069790296090780834, + "mesh_triangles_l0": 27927, + "mesh_manifold_edges_l0": 40941, + "mesh_dihedral_share_over_45deg": 0.0010502918834420264, + "mesh_dihedral_p95_deg": 5.9324040412902832, + "mesh_vertices_l1": 3690, + "lod1_p95_surface_distance_voxels": 0.098884470760822296, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 0, + "floor_samples": 38025, + "floor_openings": 0, + "estimated_surface_area_m2": 19765.8125, + "open_air_fraction": 0.20663021406898213 + }, + "step2f_padded_crumb_diagnostics": [], + "step2e_parameters": + { + "room_pitch_voxels": 160, + "room_radius_fraction_min": 0.55000001192092896, + "room_radius_fraction_max": 0.72000002861022949, + "room_height_voxels": 248, + "floor_relief_voxels": 12, + "tunnel_radius_voxels": 32, + "tunnel_half_height_voxels": 34, + "loop_probability": 0.25, + "vertical_shaft_probability": 0.079999998211860657, + "shaft_radius_voxels": 18, + "pillar_probability": 0.72000002861022949, + "ledge_probability": 0.30000001192092896, + "floating_mass_probability": 0.079999998211860657, + "stalactite_stalagmite_probability": 0.44999998807907104, + "basin_probability": 0, + "basin_depth_voxels": 0, + "water_level_fraction": 0.5 + }, + "step2f_parameters": + { + "room_pitch_voxels": 160, + "room_radius_fraction_min": 0.31000000238418579, + "room_radius_fraction_max": 0.40000000596046448, + "room_height_voxels": 132, + "floor_relief_voxels": 8, + "tunnel_radius_voxels": 22, + "tunnel_half_height_voxels": 17, + "loop_probability": 0.20000000298023224, + "vertical_shaft_probability": 0.079999998211860657, + "shaft_radius_voxels": 16, + "pillar_probability": 0.15999999642372131, + "ledge_probability": 0.059999998658895493, + "floating_mass_probability": 0.039999999105930328, + "stalactite_stalagmite_probability": 0.2199999988079071, + "basin_probability": 0, + "basin_depth_voxels": 0, + "water_level_fraction": 0.5 + }, + "step2e_six_worker_ring_trials_ms": [ + 500.85759907960892, + 510.4282982647419, + 524.45530146360397 + ], + "step2f_six_worker_ring_trials_ms": [ + 523.00779893994331, + 547.46629670262337, + 566.8334998190403 + ], + "step2f_last_trial_timing_breakdown": + { + "last_trial_wall_ms": 566.8334998190403, + "last_trial_worker_cpu_seconds": 3, + "sum_worker_brick_classification_seconds": 0.50676550716161728, + "sum_worker_density_evaluation_seconds": 2.804897878319025, + "sum_worker_uniform_fill_seconds": 0.039295442402362823, + "longest_worker_wall_seconds": 0.56278759986162186, + "evaluated_samples": 6793639, + "skipped_samples": 10580340, + "macro_centre_evaluations": 251683 + }, + "slice_directory": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_05_pillaredcathedral" + }, + { + "profile_index": 6, + "name": "TerracedBasin", + "step2e": + { + "six_worker_ring_median_ms": 601.26699879765511, + "solid_fraction": 0.16118714083860697, + "air_fraction": 0.83881285916139303, + "air_components_25cm_grid": 798, + "solid_components_25cm_grid": 1298, + "air_crumbs_below_1m3": 797, + "solid_crumbs_below_1m3": 1292, + "air_crumbs_below_1m3_after_boundary_padding": 505, + "solid_crumbs_below_1m3_after_boundary_padding": 1225, + "air_crumb_voxel_samples": 1319, + "solid_crumb_voxel_samples": 2234, + "crumb_components_first_32": [ + { + "sign": "air", + "samples": 17, + "density_at_min": 0.39260458946228027, + "root_ring_voxel": [ + 15, + 0, + 0 + ], + "density_at_root": 1.7908401489257812, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 14, + 0, + 0 + ], + "max_ring_voxel": [ + 19, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.23452651500701904, + "root_ring_voxel": [ + 25, + 0, + 0 + ], + "density_at_root": 0.23452651500701904, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 25, + 0, + 0 + ], + "max_ring_voxel": [ + 25, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.061457395553588867, + "root_ring_voxel": [ + 28, + 0, + 0 + ], + "density_at_root": 0.061457395553588867, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 28, + 0, + 0 + ], + "max_ring_voxel": [ + 28, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 11, + "density_at_min": -1.2630258798599243, + "root_ring_voxel": [ + 35, + 0, + 0 + ], + "density_at_root": 0.87802028656005859, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 33, + 0, + 0 + ], + "max_ring_voxel": [ + 38, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.6822307109832764, + "root_ring_voxel": [ + 45, + 0, + 0 + ], + "density_at_root": 1.6822307109832764, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 45, + 0, + 0 + ], + "max_ring_voxel": [ + 45, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -0.49831163883209229, + "root_ring_voxel": [ + 1, + 1, + 0 + ], + "density_at_root": 0.22158432006835938, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 1, + 0, + 0 + ], + "max_ring_voxel": [ + 2, + 1, + 0 + ] + }, + { + "sign": "air", + "samples": 4, + "density_at_min": 0.55694723129272461, + "root_ring_voxel": [ + 21, + 1, + 0 + ], + "density_at_root": 1.012528657913208, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 20, + 0, + 0 + ], + "max_ring_voxel": [ + 22, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 8, + "density_at_min": -3.7310860157012939, + "root_ring_voxel": [ + 31, + 1, + 0 + ], + "density_at_root": 0.0034575462341308594, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 31, + 0, + 0 + ], + "max_ring_voxel": [ + 33, + 4, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.21082186698913574, + "root_ring_voxel": [ + 41, + 1, + 0 + ], + "density_at_root": 0.10667955875396729, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 41, + 0, + 0 + ], + "max_ring_voxel": [ + 41, + 1, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.31195831298828125, + "root_ring_voxel": [ + 27, + 2, + 0 + ], + "density_at_root": 0.31195831298828125, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 27, + 2, + 0 + ], + "max_ring_voxel": [ + 27, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.40286862850189209, + "root_ring_voxel": [ + 25, + 3, + 0 + ], + "density_at_root": 0.40286862850189209, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 25, + 3, + 0 + ], + "max_ring_voxel": [ + 25, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 6, + "density_at_min": 0.48684525489807129, + "root_ring_voxel": [ + 41, + 4, + 0 + ], + "density_at_root": 0.34223425388336182, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 40, + 3, + 0 + ], + "max_ring_voxel": [ + 43, + 5, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 1.3274641036987305, + "root_ring_voxel": [ + 38, + 5, + 0 + ], + "density_at_root": 1.4848787784576416, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 38, + 4, + 0 + ], + "max_ring_voxel": [ + 39, + 5, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.3600220680236816, + "root_ring_voxel": [ + 19, + 6, + 0 + ], + "density_at_root": 1.3600220680236816, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 19, + 6, + 0 + ], + "max_ring_voxel": [ + 19, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 7, + "density_at_min": -2.1944961547851562, + "root_ring_voxel": [ + 26, + 6, + 0 + ], + "density_at_root": 0.73929476737976074, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 26, + 4, + 0 + ], + "max_ring_voxel": [ + 29, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.33458077907562256, + "root_ring_voxel": [ + 44, + 6, + 0 + ], + "density_at_root": 0.33458077907562256, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 44, + 6, + 0 + ], + "max_ring_voxel": [ + 44, + 6, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.30038905143737793, + "root_ring_voxel": [ + 23, + 7, + 0 + ], + "density_at_root": 0.30038905143737793, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 23, + 7, + 0 + ], + "max_ring_voxel": [ + 23, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 11, + "density_at_min": 0.019027948379516602, + "root_ring_voxel": [ + 39, + 7, + 0 + ], + "density_at_root": 1.6074881553649902, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 38, + 7, + 0 + ], + "max_ring_voxel": [ + 42, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -1.3944536447525024, + "root_ring_voxel": [ + 46, + 7, + 0 + ], + "density_at_root": 0.64046633243560791, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 46, + 6, + 0 + ], + "max_ring_voxel": [ + 47, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 4, + "density_at_min": 0.04239201545715332, + "root_ring_voxel": [ + 6, + 8, + 0 + ], + "density_at_root": 0.5613560676574707, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 6, + 7, + 0 + ], + "max_ring_voxel": [ + 8, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.092614293098449707, + "root_ring_voxel": [ + 14, + 8, + 0 + ], + "density_at_root": 0.092614293098449707, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 14, + 8, + 0 + ], + "max_ring_voxel": [ + 14, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": -0.22534561157226562, + "root_ring_voxel": [ + 11, + 9, + 0 + ], + "density_at_root": 1.2564702033996582, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 10, + 8, + 0 + ], + "max_ring_voxel": [ + 12, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 1.2915236949920654, + "root_ring_voxel": [ + 24, + 9, + 0 + ], + "density_at_root": 0.29397284984588623, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 23, + 9, + 0 + ], + "max_ring_voxel": [ + 24, + 9, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.0603384971618652, + "root_ring_voxel": [ + 15, + 10, + 0 + ], + "density_at_root": 1.0603384971618652, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 15, + 10, + 0 + ], + "max_ring_voxel": [ + 15, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 1.2538762092590332, + "root_ring_voxel": [ + 27, + 10, + 0 + ], + "density_at_root": 0.0604248046875, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 26, + 10, + 0 + ], + "max_ring_voxel": [ + 27, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.52913117408752441, + "root_ring_voxel": [ + 30, + 10, + 0 + ], + "density_at_root": 0.83946752548217773, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 30, + 9, + 0 + ], + "max_ring_voxel": [ + 30, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.40430557727813721, + "root_ring_voxel": [ + 35, + 10, + 0 + ], + "density_at_root": 0.40430557727813721, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 35, + 10, + 0 + ], + "max_ring_voxel": [ + 35, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 1.4548182487487793, + "root_ring_voxel": [ + 37, + 10, + 0 + ], + "density_at_root": 1.4548182487487793, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 37, + 10, + 0 + ], + "max_ring_voxel": [ + 37, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.16277003288269043, + "root_ring_voxel": [ + 48, + 10, + 0 + ], + "density_at_root": 0.16277003288269043, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 48, + 10, + 0 + ], + "max_ring_voxel": [ + 48, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": -1.9143450260162354, + "root_ring_voxel": [ + 2, + 11, + 0 + ], + "density_at_root": 0.45175766944885254, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 2, + 10, + 0 + ], + "max_ring_voxel": [ + 3, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.37031638622283936, + "root_ring_voxel": [ + 22, + 11, + 0 + ], + "density_at_root": 0.37031638622283936, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 22, + 11, + 0 + ], + "max_ring_voxel": [ + 22, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.33795392513275146, + "root_ring_voxel": [ + 45, + 11, + 0 + ], + "density_at_root": 0.33795392513275146, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 45, + 11, + 0 + ], + "max_ring_voxel": [ + 45, + 11, + 0 + ] + } + ], + "largest_air_component_voxels": 14572198, + "largest_solid_component_voxels": 2782410, + "one_meter_downsampled_air_components": 87, + "pitch_autocorrelation_peak": 0.44924946327840543, + "nearby_autocorrelation_peak": 0.4170350290342249, + "pitch_autocorrelation_excess": 0.032214434244180523, + "detail_rms": 1.5958015018814415, + "detail_lattice_scale_energy_ratio": 0.8316718995555632, + "mesh_triangles_l0": 138706, + "mesh_manifold_edges_l0": 204247, + "mesh_dihedral_share_over_45deg": 0.40731075609433676, + "mesh_dihedral_p95_deg": 84.229789733886719, + "mesh_vertices_l1": 10062, + "lod1_p95_surface_distance_voxels": 0.62111902236938477, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 21249, + "floor_samples": 38025, + "floor_openings": 13193, + "estimated_surface_area_m2": 94174.1875, + "open_air_fraction": 0.83881285916139303 + }, + "step2f": + { + "six_worker_ring_median_ms": 572.33539968729019, + "solid_fraction": 0.81781956798727573, + "air_fraction": 0.18218043201272432, + "air_components_25cm_grid": 4, + "solid_components_25cm_grid": 1, + "air_crumbs_below_1m3": 2, + "solid_crumbs_below_1m3": 0, + "air_crumbs_below_1m3_after_boundary_padding": 0, + "solid_crumbs_below_1m3_after_boundary_padding": 0, + "air_crumb_voxel_samples": 48, + "solid_crumb_voxel_samples": 0, + "crumb_components_first_32": [ + { + "sign": "air", + "samples": 21, + "density_at_min": -0.086187839508056641, + "root_ring_voxel": [ + 201, + 0, + 127 + ], + "density_at_root": 0.16247320175170898, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 199, + 0, + 127 + ], + "max_ring_voxel": [ + 203, + 0, + 131 + ] + }, + { + "sign": "air", + "samples": 27, + "density_at_min": -0.085275888442993164, + "root_ring_voxel": [ + 202, + 0, + 158 + ], + "density_at_root": 0.057527303695678711, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 200, + 0, + 158 + ], + "max_ring_voxel": [ + 204, + 0, + 163 + ] + } + ], + "largest_air_component_voxels": 2990020, + "largest_solid_component_voxels": 14208780, + "one_meter_downsampled_air_components": 4, + "pitch_autocorrelation_peak": 0.30804755589144306, + "nearby_autocorrelation_peak": 0.33412504342919802, + "pitch_autocorrelation_excess": -0.026077487537754962, + "detail_rms": 0.48440035599680098, + "detail_lattice_scale_energy_ratio": 0.0069790296090780834, + "mesh_triangles_l0": 29739, + "mesh_manifold_edges_l0": 43661, + "mesh_dihedral_share_over_45deg": 0.015528732736309291, + "mesh_dihedral_p95_deg": 12.510456085205078, + "mesh_vertices_l1": 3905, + "lod1_p95_surface_distance_voxels": 0.28333058953285217, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 0, + "floor_samples": 38025, + "floor_openings": 0, + "estimated_surface_area_m2": 20278.6875, + "open_air_fraction": 0.18218043201272432 + }, + "step2f_padded_crumb_diagnostics": [], + "step2e_parameters": + { + "room_pitch_voxels": 136, + "room_radius_fraction_min": 0.51999998092651367, + "room_radius_fraction_max": 0.64999997615814209, + "room_height_voxels": 264, + "floor_relief_voxels": 14, + "tunnel_radius_voxels": 28, + "tunnel_half_height_voxels": 30, + "loop_probability": 0.20000000298023224, + "vertical_shaft_probability": 0.10000000149011612, + "shaft_radius_voxels": 18, + "pillar_probability": 0.10000000149011612, + "ledge_probability": 0.8399999737739563, + "floating_mass_probability": 0.05000000074505806, + "stalactite_stalagmite_probability": 0.25, + "basin_probability": 0.85000002384185791, + "basin_depth_voxels": 48, + "water_level_fraction": 0.30000001192092896 + }, + "step2f_parameters": + { + "room_pitch_voxels": 136, + "room_radius_fraction_min": 0.30000001192092896, + "room_radius_fraction_max": 0.37999999523162842, + "room_height_voxels": 124, + "floor_relief_voxels": 8, + "tunnel_radius_voxels": 20, + "tunnel_half_height_voxels": 16, + "loop_probability": 0.14000000059604645, + "vertical_shaft_probability": 0.10000000149011612, + "shaft_radius_voxels": 16, + "pillar_probability": 0.039999999105930328, + "ledge_probability": 0.059999998658895493, + "floating_mass_probability": 0.039999999105930328, + "stalactite_stalagmite_probability": 0.18000000715255737, + "basin_probability": 0.46000000834465027, + "basin_depth_voxels": 24, + "water_level_fraction": 0.30000001192092896 + }, + "step2e_six_worker_ring_trials_ms": [ + 565.90640172362328, + 601.26699879765511, + 619.56879869103432 + ], + "step2f_six_worker_ring_trials_ms": [ + 529.61090207099915, + 572.33539968729019, + 610.23340001702309 + ], + "step2f_last_trial_timing_breakdown": + { + "last_trial_wall_ms": 529.61090207099915, + "last_trial_worker_cpu_seconds": 2.671875, + "sum_worker_brick_classification_seconds": 0.48097513988614082, + "sum_worker_density_evaluation_seconds": 2.6076666973531246, + "sum_worker_uniform_fill_seconds": 0.039607353508472443, + "longest_worker_wall_seconds": 0.52555500343441963, + "evaluated_samples": 6644907, + "skipped_samples": 10729072, + "macro_centre_evaluations": 251683 + }, + "slice_directory": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_06_terracedbasin" + }, + { + "profile_index": 7, + "name": "HyperComplex", + "step2e": + { + "six_worker_ring_median_ms": 566.65709987282753, + "solid_fraction": 0.052655007813696586, + "air_fraction": 0.94734499218630341, + "air_components_25cm_grid": 466, + "solid_components_25cm_grid": 1470, + "air_crumbs_below_1m3": 462, + "solid_crumbs_below_1m3": 1444, + "air_crumbs_below_1m3_after_boundary_padding": 244, + "solid_crumbs_below_1m3_after_boundary_padding": 1291, + "air_crumb_voxel_samples": 1003, + "solid_crumb_voxel_samples": 2857, + "crumb_components_first_32": [ + { + "sign": "air", + "samples": 2, + "density_at_min": 0.70843005180358887, + "root_ring_voxel": [ + 29, + 0, + 0 + ], + "density_at_root": 0.050972700119018555, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 28, + 0, + 0 + ], + "max_ring_voxel": [ + 29, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 2.5803709030151367, + "root_ring_voxel": [ + 195, + 0, + 0 + ], + "density_at_root": 2.5803709030151367, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 195, + 0, + 0 + ], + "max_ring_voxel": [ + 195, + 0, + 0 + ] + }, + { + "sign": "air", + "samples": 13, + "density_at_min": -3.2712972164154053, + "root_ring_voxel": [ + 44, + 1, + 0 + ], + "density_at_root": 0.12704968452453613, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 40, + 0, + 0 + ], + "max_ring_voxel": [ + 45, + 5, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.11153709888458252, + "root_ring_voxel": [ + 187, + 1, + 0 + ], + "density_at_root": 1.2689177989959717, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 187, + 0, + 0 + ], + "max_ring_voxel": [ + 187, + 1, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.95893096923828125, + "root_ring_voxel": [ + 28, + 2, + 0 + ], + "density_at_root": 0.33102774620056152, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 27, + 2, + 0 + ], + "max_ring_voxel": [ + 28, + 2, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.43400204181671143, + "root_ring_voxel": [ + 121, + 3, + 0 + ], + "density_at_root": 0.43400204181671143, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 121, + 3, + 0 + ], + "max_ring_voxel": [ + 121, + 3, + 0 + ] + }, + { + "sign": "air", + "samples": 4, + "density_at_min": 2.2004218101501465, + "root_ring_voxel": [ + 251, + 3, + 0 + ], + "density_at_root": 0.81409704685211182, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 250, + 3, + 0 + ], + "max_ring_voxel": [ + 252, + 4, + 0 + ] + }, + { + "sign": "air", + "samples": 5, + "density_at_min": 0.98048019409179688, + "root_ring_voxel": [ + 44, + 7, + 0 + ], + "density_at_root": 0.62716376781463623, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 44, + 6, + 0 + ], + "max_ring_voxel": [ + 47, + 7, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.073856234550476074, + "root_ring_voxel": [ + 34, + 8, + 0 + ], + "density_at_root": 0.073856234550476074, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 34, + 8, + 0 + ], + "max_ring_voxel": [ + 34, + 8, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.51572132110595703, + "root_ring_voxel": [ + 36, + 8, + 0 + ], + "density_at_root": 0.51572132110595703, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 36, + 8, + 0 + ], + "max_ring_voxel": [ + 36, + 8, + 0 + ] + }, + { + "sign": "solid", + "samples": 16, + "density_at_min": -0.16419625282287598, + "root_ring_voxel": [ + 211, + 9, + 0 + ], + "density_at_root": -2.7084481716156006, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 211, + 8, + 0 + ], + "max_ring_voxel": [ + 215, + 14, + 0 + ] + }, + { + "sign": "air", + "samples": 5, + "density_at_min": -1.7284739017486572, + "root_ring_voxel": [ + 30, + 10, + 0 + ], + "density_at_root": 1.4864401817321777, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 29, + 9, + 0 + ], + "max_ring_voxel": [ + 31, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.19098556041717529, + "root_ring_voxel": [ + 48, + 10, + 0 + ], + "density_at_root": 0.7479095458984375, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 47, + 9, + 0 + ], + "max_ring_voxel": [ + 48, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.2850724458694458, + "root_ring_voxel": [ + 107, + 10, + 0 + ], + "density_at_root": 0.2850724458694458, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 107, + 10, + 0 + ], + "max_ring_voxel": [ + 107, + 10, + 0 + ] + }, + { + "sign": "solid", + "samples": 2, + "density_at_min": -0.95573782920837402, + "root_ring_voxel": [ + 228, + 10, + 0 + ], + "density_at_root": -0.72830021381378174, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 227, + 10, + 0 + ], + "max_ring_voxel": [ + 228, + 10, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.98492658138275146, + "root_ring_voxel": [ + 45, + 11, + 0 + ], + "density_at_root": 0.98492658138275146, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 45, + 11, + 0 + ], + "max_ring_voxel": [ + 45, + 11, + 0 + ] + }, + { + "sign": "solid", + "samples": 1, + "density_at_min": -0.52810335159301758, + "root_ring_voxel": [ + 225, + 11, + 0 + ], + "density_at_root": -0.52810335159301758, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 225, + 11, + 0 + ], + "max_ring_voxel": [ + 225, + 11, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.14319312572479248, + "root_ring_voxel": [ + 42, + 12, + 0 + ], + "density_at_root": 1.0032249689102173, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 41, + 12, + 0 + ], + "max_ring_voxel": [ + 42, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.13040345907211304, + "root_ring_voxel": [ + 47, + 12, + 0 + ], + "density_at_root": 0.13040345907211304, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 47, + 12, + 0 + ], + "max_ring_voxel": [ + 47, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.089013338088989258, + "root_ring_voxel": [ + 127, + 12, + 0 + ], + "density_at_root": 0.089013338088989258, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 127, + 12, + 0 + ], + "max_ring_voxel": [ + 127, + 12, + 0 + ] + }, + { + "sign": "air", + "samples": 3, + "density_at_min": 0.89419031143188477, + "root_ring_voxel": [ + 25, + 13, + 0 + ], + "density_at_root": 1.2091994285583496, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 24, + 12, + 0 + ], + "max_ring_voxel": [ + 26, + 13, + 0 + ] + }, + { + "sign": "air", + "samples": 5, + "density_at_min": -1.523091197013855, + "root_ring_voxel": [ + 31, + 13, + 0 + ], + "density_at_root": 0.78226792812347412, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 30, + 12, + 0 + ], + "max_ring_voxel": [ + 33, + 15, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.97030675411224365, + "root_ring_voxel": [ + 49, + 13, + 0 + ], + "density_at_root": 0.97030675411224365, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 49, + 13, + 0 + ], + "max_ring_voxel": [ + 49, + 13, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.44894754886627197, + "root_ring_voxel": [ + 52, + 13, + 0 + ], + "density_at_root": 0.44894754886627197, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 52, + 13, + 0 + ], + "max_ring_voxel": [ + 52, + 13, + 0 + ] + }, + { + "sign": "solid", + "samples": 2, + "density_at_min": -0.20183223485946655, + "root_ring_voxel": [ + 227, + 13, + 0 + ], + "density_at_root": -0.24417573213577271, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 227, + 12, + 0 + ], + "max_ring_voxel": [ + 227, + 13, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.56355166435241699, + "root_ring_voxel": [ + 13, + 14, + 0 + ], + "density_at_root": 0.56355166435241699, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 13, + 14, + 0 + ], + "max_ring_voxel": [ + 13, + 14, + 0 + ] + }, + { + "sign": "air", + "samples": 2, + "density_at_min": 0.24409174919128418, + "root_ring_voxel": [ + 35, + 15, + 0 + ], + "density_at_root": 0.10767674446105957, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 34, + 15, + 0 + ], + "max_ring_voxel": [ + 35, + 15, + 0 + ] + }, + { + "sign": "air", + "samples": 4, + "density_at_min": 0.34159064292907715, + "root_ring_voxel": [ + 45, + 15, + 0 + ], + "density_at_root": 0.86937212944030762, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 44, + 15, + 0 + ], + "max_ring_voxel": [ + 47, + 15, + 0 + ] + }, + { + "sign": "solid", + "samples": 1, + "density_at_min": -0.22466778755187988, + "root_ring_voxel": [ + 241, + 15, + 0 + ], + "density_at_root": -0.22466778755187988, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 241, + 15, + 0 + ], + "max_ring_voxel": [ + 241, + 15, + 0 + ] + }, + { + "sign": "air", + "samples": 1, + "density_at_min": 0.30128931999206543, + "root_ring_voxel": [ + 39, + 16, + 0 + ], + "density_at_root": 0.30128931999206543, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 39, + 16, + 0 + ], + "max_ring_voxel": [ + 39, + 16, + 0 + ] + }, + { + "sign": "air", + "samples": 4, + "density_at_min": 0.17972922325134277, + "root_ring_voxel": [ + 49, + 16, + 0 + ], + "density_at_root": 0.4773331880569458, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 49, + 15, + 0 + ], + "max_ring_voxel": [ + 49, + 18, + 0 + ] + }, + { + "sign": "solid", + "samples": 1, + "density_at_min": -0.7895505428314209, + "root_ring_voxel": [ + 215, + 16, + 0 + ], + "density_at_root": -0.7895505428314209, + "sign_mismatch_samples": 0, + "min_ring_voxel": [ + 215, + 16, + 0 + ], + "max_ring_voxel": [ + 215, + 16, + 0 + ] + } + ], + "largest_air_component_voxels": 16457830, + "largest_solid_component_voxels": 879837, + "one_meter_downsampled_air_components": 65, + "pitch_autocorrelation_peak": 0.25053152011242347, + "nearby_autocorrelation_peak": 0.30169339404296186, + "pitch_autocorrelation_excess": -0.051161873930538393, + "detail_rms": 1.5958015018814415, + "detail_lattice_scale_energy_ratio": 0.8316718995555632, + "mesh_triangles_l0": 81925, + "mesh_manifold_edges_l0": 120741, + "mesh_dihedral_share_over_45deg": 0.3473053892215569, + "mesh_dihedral_p95_deg": 83.17071533203125, + "mesh_vertices_l1": 6581, + "lod1_p95_surface_distance_voxels": 0.65138024091720581, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 24272, + "floor_samples": 38025, + "floor_openings": 23418, + "estimated_surface_area_m2": 60508.875, + "open_air_fraction": 0.94734499218630341 + }, + "step2f": + { + "six_worker_ring_median_ms": 564.27929922938347, + "solid_fraction": 0.80964671362846707, + "air_fraction": 0.19035328637153298, + "air_components_25cm_grid": 2, + "solid_components_25cm_grid": 2, + "air_crumbs_below_1m3": 0, + "solid_crumbs_below_1m3": 0, + "air_crumbs_below_1m3_after_boundary_padding": 0, + "solid_crumbs_below_1m3_after_boundary_padding": 0, + "air_crumb_voxel_samples": 0, + "solid_crumb_voxel_samples": 0, + "crumb_components_first_32": [], + "largest_air_component_voxels": 3305578, + "largest_solid_component_voxels": 14066531, + "one_meter_downsampled_air_components": 2, + "pitch_autocorrelation_peak": 0.34780364324022089, + "nearby_autocorrelation_peak": 0.3987330245498355, + "pitch_autocorrelation_excess": -0.050929381309614608, + "detail_rms": 0.48440035599680098, + "detail_lattice_scale_energy_ratio": 0.0069790296090780834, + "mesh_triangles_l0": 33287, + "mesh_manifold_edges_l0": 49031, + "mesh_dihedral_share_over_45deg": 0.0094837959658175437, + "mesh_dihedral_p95_deg": 13.016324996948242, + "mesh_vertices_l1": 4390, + "lod1_p95_surface_distance_voxels": 0.28255358338356018, + "strates_checked": 3, + "roof_samples": 38025, + "roof_openings": 0, + "floor_samples": 38025, + "floor_openings": 0, + "estimated_surface_area_m2": 22502.5625, + "open_air_fraction": 0.19035328637153298 + }, + "step2f_padded_crumb_diagnostics": [], + "step2e_parameters": + { + "room_pitch_voxels": 96, + "room_radius_fraction_min": 0.60000002384185791, + "room_radius_fraction_max": 0.74000000953674316, + "room_height_voxels": 280, + "floor_relief_voxels": 20, + "tunnel_radius_voxels": 30, + "tunnel_half_height_voxels": 28, + "loop_probability": 0.40000000596046448, + "vertical_shaft_probability": 0.55000001192092896, + "shaft_radius_voxels": 20, + "pillar_probability": 0.44999998807907104, + "ledge_probability": 0.68000000715255737, + "floating_mass_probability": 0.5, + "stalactite_stalagmite_probability": 0.75, + "basin_probability": 0.41999998688697815, + "basin_depth_voxels": 28, + "water_level_fraction": 0.40000000596046448 + }, + "step2f_parameters": + { + "room_pitch_voxels": 96, + "room_radius_fraction_min": 0.2800000011920929, + "room_radius_fraction_max": 0.37000000476837158, + "room_height_voxels": 104, + "floor_relief_voxels": 9, + "tunnel_radius_voxels": 18, + "tunnel_half_height_voxels": 14, + "loop_probability": 0.25999999046325684, + "vertical_shaft_probability": 0.31999999284744263, + "shaft_radius_voxels": 17, + "pillar_probability": 0.079999998211860657, + "ledge_probability": 0.059999998658895493, + "floating_mass_probability": 0.05000000074505806, + "stalactite_stalagmite_probability": 0.18000000715255737, + "basin_probability": 0.11999999731779099, + "basin_depth_voxels": 12, + "water_level_fraction": 0.40000000596046448 + }, + "step2e_six_worker_ring_trials_ms": [ + 536.7577001452446, + 566.65709987282753, + 568.37259978055954 + ], + "step2f_six_worker_ring_trials_ms": [ + 556.34430050849915, + 564.27929922938347, + 622.40010127425194 + ], + "step2f_last_trial_timing_breakdown": + { + "last_trial_wall_ms": 556.34430050849915, + "last_trial_worker_cpu_seconds": 2.9375, + "sum_worker_brick_classification_seconds": 0.49139387160539627, + "sum_worker_density_evaluation_seconds": 2.7583525441586971, + "sum_worker_uniform_fill_seconds": 0.037853013724088669, + "longest_worker_wall_seconds": 0.55229770019650459, + "evaluated_samples": 7115571, + "skipped_samples": 10258408, + "macro_centre_evaluations": 251683 + }, + "slice_directory": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_07_hypercomplex" + } + ], + "slices": [ + { + "profile": "OpenVaults", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_00_openvaults/slice_xy_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "OpenVaults", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_00_openvaults/slice_xz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "OpenVaults", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_00_openvaults/slice_yz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "OpenVaults", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_00_openvaults/slice_xz_passage_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "TightNetwork", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_01_tightnetwork/slice_xy_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "TightNetwork", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_01_tightnetwork/slice_xz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "TightNetwork", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_01_tightnetwork/slice_yz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "TightNetwork", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_01_tightnetwork/slice_xz_passage_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "ChamberHalls", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_02_chamberhalls/slice_xy_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "ChamberHalls", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_02_chamberhalls/slice_xz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "ChamberHalls", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_02_chamberhalls/slice_yz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "ChamberHalls", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_02_chamberhalls/slice_xz_passage_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "ShaftForest", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_03_shaftforest/slice_xy_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "ShaftForest", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_03_shaftforest/slice_xz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "ShaftForest", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_03_shaftforest/slice_yz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "ShaftForest", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_03_shaftforest/slice_xz_passage_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "FloatingArchipelago", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_04_floatingarchipelago/slice_xy_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "FloatingArchipelago", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_04_floatingarchipelago/slice_xz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "FloatingArchipelago", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_04_floatingarchipelago/slice_yz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "FloatingArchipelago", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_04_floatingarchipelago/slice_xz_passage_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "PillaredCathedral", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_05_pillaredcathedral/slice_xy_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "PillaredCathedral", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_05_pillaredcathedral/slice_xz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "PillaredCathedral", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_05_pillaredcathedral/slice_yz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "PillaredCathedral", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_05_pillaredcathedral/slice_xz_passage_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "TerracedBasin", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_06_terracedbasin/slice_xy_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "TerracedBasin", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_06_terracedbasin/slice_xz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "TerracedBasin", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_06_terracedbasin/slice_yz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "TerracedBasin", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_06_terracedbasin/slice_xz_passage_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "HyperComplex", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_07_hypercomplex/slice_xy_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "HyperComplex", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_07_hypercomplex/slice_xz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "HyperComplex", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_07_hypercomplex/slice_yz_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + }, + { + "profile": "HyperComplex", + "file": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947/set_07_hypercomplex/slice_xz_passage_2e_vs_2f.png", + "layout": "step 2e density on left; step 2f density on right; light=air, dark=solid, cyan=near zero" + } + ], + "slice_directory": "E:/Projet Unreal/VoxelM/Plugins/VoxelForge/Saved/Research/step2f/20261001_032947", + "existing_checks": + { + "sound_brick_proofs": true, + "correctly_skipped_bricks_audited": 136, + "final_field_samples_checked": 121390, + "correct_proof_sign_violations": 0, + "first_proof_violation": + { + "present": false, + "brick_origin_voxels": [ + 0, + 0, + 0 + ], + "brick_size": [ + 0, + 0, + 0 + ], + "sample_voxels": [ + 0, + 0, + 0 + ], + "inside_brick": false, + "claimed_air": false, + "final_density": 0, + "center_macro": 0, + "sample_macro": 0, + "center_room_macro": 0, + "sample_room_macro": 0, + "sample_detail": 0, + "center_to_sample_macro_delta_per_voxel": 0, + "path_max_macro_gradient": 0, + "path_max_from_voxels": [ + 0, + 0, + 0 + ], + "path_max_to_voxels": [ + 0, + 0, + 0 + ], + "path_max_from_macro": 0, + "path_max_to_macro": 0, + "path_max_from_room_macro": 0, + "path_max_to_room_macro": 0, + "path_max_from_room_diagnostic": "", + "path_max_to_room_diagnostic": "", + "tiny_step_max_macro_gradient": 0 + }, + "undersized_bound_claims_checked": 19665, + "wrong_sign_samples_caught_by_undersized_bound": 150, + "deliberate_undersized_bound_failure_caught": true, + "seam_gradient_gate": true, + "deliberate_seam_failure_caught": true, + "seam_failure_samples_mutated": 751576, + "brick_boundary_gradient_jump_rms": 0.51671282377039351, + "brick_interior_gradient_jump_rms": 0.60450817038075522, + "one_and_six_worker_determinism": true, + "six_worker_hash": "876069a813c83cee", + "repeat_six_worker_hash": "876069a813c83cee", + "one_worker_hash": "876069a813c83cee", + "functional_test_filter": "VoxelForge.ParameterizedGeneration.TraversalSeeds" + } +} \ No newline at end of file diff --git a/Saved/Research/step2f/captures/ChamberHalls_inside.png b/Saved/Research/step2f/captures/ChamberHalls_inside.png new file mode 100644 index 0000000..9728d38 Binary files /dev/null and b/Saved/Research/step2f/captures/ChamberHalls_inside.png differ diff --git a/Saved/Research/step2f/captures/FloatingArchipelago_inside.png b/Saved/Research/step2f/captures/FloatingArchipelago_inside.png new file mode 100644 index 0000000..c957486 Binary files /dev/null and b/Saved/Research/step2f/captures/FloatingArchipelago_inside.png differ diff --git a/Saved/Research/step2f/captures/HyperComplex_inside.png b/Saved/Research/step2f/captures/HyperComplex_inside.png new file mode 100644 index 0000000..1193518 Binary files /dev/null and b/Saved/Research/step2f/captures/HyperComplex_inside.png differ diff --git a/Saved/Research/step2f/captures/OpenVaults_inside.png b/Saved/Research/step2f/captures/OpenVaults_inside.png new file mode 100644 index 0000000..7a91648 Binary files /dev/null and b/Saved/Research/step2f/captures/OpenVaults_inside.png differ diff --git a/Saved/Research/step2f/captures/OpenVaults_wall-closeup.png b/Saved/Research/step2f/captures/OpenVaults_wall-closeup.png new file mode 100644 index 0000000..d4e0dd4 Binary files /dev/null and b/Saved/Research/step2f/captures/OpenVaults_wall-closeup.png differ diff --git a/Saved/Research/step2f/captures/PillaredCathedral_inside.png b/Saved/Research/step2f/captures/PillaredCathedral_inside.png new file mode 100644 index 0000000..e444165 Binary files /dev/null and b/Saved/Research/step2f/captures/PillaredCathedral_inside.png differ diff --git a/Saved/Research/step2f/captures/ShaftForest_inside.png b/Saved/Research/step2f/captures/ShaftForest_inside.png new file mode 100644 index 0000000..b8f5a3e Binary files /dev/null and b/Saved/Research/step2f/captures/ShaftForest_inside.png differ diff --git a/Saved/Research/step2f/captures/TerracedBasin_inside.png b/Saved/Research/step2f/captures/TerracedBasin_inside.png new file mode 100644 index 0000000..be124ce Binary files /dev/null and b/Saved/Research/step2f/captures/TerracedBasin_inside.png differ diff --git a/Saved/Research/step2f/captures/TightNetwork_inside.png b/Saved/Research/step2f/captures/TightNetwork_inside.png new file mode 100644 index 0000000..e4a6ccd Binary files /dev/null and b/Saved/Research/step2f/captures/TightNetwork_inside.png differ diff --git a/Source/VoxelForge/Private/VoxelRedefinedDensityField.cpp b/Source/VoxelForge/Private/VoxelRedefinedDensityField.cpp index 13fcb4a..59849ff 100644 --- a/Source/VoxelForge/Private/VoxelRedefinedDensityField.cpp +++ b/Source/VoxelForge/Private/VoxelRedefinedDensityField.cpp @@ -19,7 +19,8 @@ namespace VoxelForgeRedefinedDensityField namespace { constexpr float LegacyDetailAmplitude = 1.4f + 0.9f + 0.45f + 2.5f; - constexpr float CoherentDetailAmplitude = 2.0f + 1.2f + 0.6f + 0.4f; + constexpr float CoherentDetailAmplitude = 1.82f + 1.092f + 0.546f + 0.364f; + constexpr float CoherentRockDensityBias = 0.10f; constexpr float DetailBoundNumericalMargin = 1.0e-3f; constexpr float BaseFieldLipschitzBound = 1.25f; constexpr float ParameterizedFieldLipschitzBound = 1.60f; @@ -271,14 +272,25 @@ namespace return Broad * 1.4f + Medium * 0.9f + Fine * 0.45f + Micro * 2.5f; } - // The shortest wavelength is eight lattice samples (two meters). Three - // interpolated scales and the smooth ridge response keep broad folds + // The shortest wavelength is twelve lattice samples (three meters). Three + // independently rotated, interpolated scales and the smooth ridge response keep broad folds // while excluding the lattice-scale noise used by the frozen 2e field. - const float Broad = Noise3D(X, Y, Z, 32.0f, Seed ^ 0x68BC21EBu); - const float Medium = Noise3D(X, Y, Z, 16.0f, Seed ^ 0x02E5BE93u); - const float Fine = Noise3D(X, Y, Z, 8.0f, Seed ^ 0x967A889Bu); + // Independent orthonormal frames keep the value-noise bands smooth and bounded without + // exposing their axis-aligned interpolation cells as repeated square relief on the rock. + const float BroadX = 0.838671f * X - 0.493587f * Y + 0.230129f * Z; + const float BroadY = 0.544639f * X + 0.760095f * Y - 0.354003f * Z; + const float BroadZ = 0.422618f * Y + 0.906308f * Z; + const float MediumX = 0.956305f * X + 0.220661f * Y + 0.191825f * Z; + const float MediumY = -0.292372f * X + 0.721484f * Y + 0.627548f * Z; + const float MediumZ = 0.656059f * Y + 0.754710f * Z; + const float FineX = 0.325568f * X - 0.834725f * Y - 0.443914f * Z; + const float FineY = 0.945519f * X + 0.287381f * Y + 0.152824f * Z; + const float FineZ = -0.469472f * Y + 0.882948f * Z; + const float Broad = Noise3D(BroadX, BroadY, BroadZ, 48.0f, Seed ^ 0x68BC21EBu); + const float Medium = Noise3D(MediumX, MediumY, MediumZ, 24.0f, Seed ^ 0x02E5BE93u); + const float Fine = Noise3D(FineX, FineY, FineZ, 12.0f, Seed ^ 0x967A889Bu); const float SmoothRidge = FMath::Sqrt(Fine * Fine + 0.0625f) - 0.25f; - return Broad * 2.0f + Medium * 1.2f + Fine * 0.6f + SmoothRidge * 0.4f; + return Broad * 1.82f + Medium * 1.092f + Fine * 0.546f + SmoothRidge * 0.364f; } FORCEINLINE float DistanceToPeriodicLine(float Position, float Spacing, float Offset) @@ -869,6 +881,10 @@ namespace { FGeneratedCaveCell GeneratedCells[9]; const FGeneratedCaveCell* Cells[9] = {}; + const FGeneratedCaveCell* TunnelCells[25] = {}; + uint8 TunnelEdgeCellA[24] = {}; + uint8 TunnelEdgeCellB[24] = {}; + int32 TunnelEdgeCount = 0; float RoomDistanceSquared[9] = {}; float RoomRadii[9] = {}; float RoomHorizontals[9] = {}; @@ -879,8 +895,8 @@ namespace float SpireTipZ[9] = {}; float SpireBaseTopZ[9] = {}; float SpireTipBottomZ[9] = {}; - float TunnelT[4] = {}; - float TunnelHorizontal[4] = {}; + float TunnelT[24] = {}; + float TunnelHorizontal[24] = {}; float LandingDistanceSquared[8] = {}; float LandingDistance[8] = {}; float LandingBridgeT[8] = {}; @@ -1401,42 +1417,133 @@ namespace } if ((Cell.FeatureFlags & HasSpireFlag) != 0) { - OutColumn.SpireBaseZ[Index] = Cell.FloorZ + 2.0f; + OutColumn.SpireBaseZ[Index] = Cell.FloorZ - 2.0f; OutColumn.SpireTipZ[Index] = FMath::Min( Cell.CeilingZ - 2.0f, OutColumn.SpireBaseZ[Index] + Cell.SpireLength); - OutColumn.SpireBaseTopZ[Index] = Cell.CeilingZ - 2.0f; + OutColumn.SpireBaseTopZ[Index] = Cell.CeilingZ + 2.0f; OutColumn.SpireTipBottomZ[Index] = FMath::Max( - Cell.FloorZ + 2.0f, + Cell.FloorZ - 2.0f, OutColumn.SpireBaseTopZ[Index] - Cell.SpireLength); } } - const FGeneratedCaveCell& Centre = *OutColumn.Cells[4]; - const int32 EdgeIndices[] = {1, 7, 3, 5}; - const uint8 EdgeFlags[] = { - TunnelToNegativeY, TunnelToPositiveY, - TunnelToNegativeX, TunnelToPositiveX}; - for (int32 EdgeIndex = 0; EdgeIndex < UE_ARRAY_COUNT(EdgeIndices); ++EdgeIndex) + for (int32 CellY = -1; CellY <= 1; ++CellY) + for (int32 CellX = -1; CellX <= 1; ++CellX) { - OutColumn.TunnelHorizontal[EdgeIndex] = -FLT_MAX; - if ((Centre.OpenTunnelEdges & EdgeFlags[EdgeIndex]) == 0) + const int32 TunnelIndex = (CellY + 2) * 5 + CellX + 2; + const int32 RoomIndex = (CellY + 1) * 3 + CellX + 1; + OutColumn.TunnelCells[TunnelIndex] = OutColumn.Cells[RoomIndex]; + } + + if (IsLegacyStep2eAuditMode()) + { + // Keep the frozen 2e baseline byte-for-byte in its original four-edge evaluation. + const FGeneratedCaveCell& Centre = *OutColumn.Cells[4]; + const int32 EdgeIndices[] = {1, 7, 3, 5}; + const int32 TunnelCellIndices[] = {7, 17, 11, 13}; + const uint8 EdgeFlags[] = { + TunnelToNegativeY, TunnelToPositiveY, + TunnelToNegativeX, TunnelToPositiveX}; + for (int32 EdgeIndex = 0; EdgeIndex < UE_ARRAY_COUNT(EdgeIndices); ++EdgeIndex) { - continue; + if ((Centre.OpenTunnelEdges & EdgeFlags[EdgeIndex]) == 0) + { + continue; + } + const FGeneratedCaveCell& Next = *OutColumn.Cells[EdgeIndices[EdgeIndex]]; + const float ABX = Next.CenterX - Centre.CenterX; + const float ABY = Next.CenterY - Centre.CenterY; + const float LengthSquared = ABX * ABX + ABY * ABY; + const float T = LengthSquared > 1.0e-8f + ? FMath::Clamp(((X - Centre.CenterX) * ABX + + (Y - Centre.CenterY) * ABY) / LengthSquared, 0.0f, 1.0f) + : 0.0f; + const float DX = X - (Centre.CenterX + T * ABX); + const float DY = Y - (Centre.CenterY + T * ABY); + OutColumn.TunnelEdgeCellA[OutColumn.TunnelEdgeCount] = 12; + OutColumn.TunnelEdgeCellB[OutColumn.TunnelEdgeCount] = + static_cast(TunnelCellIndices[EdgeIndex]); + OutColumn.TunnelT[OutColumn.TunnelEdgeCount] = T; + OutColumn.TunnelHorizontal[OutColumn.TunnelEdgeCount] = + Plan.Generation.TunnelRadiusVoxels - FMath::Sqrt(DX * DX + DY * DY); + ++OutColumn.TunnelEdgeCount; + } + } + else + { + const auto CacheTunnelEdge = [&](int32 AX, int32 AY, int32 BX, int32 BY) + { + const uint8 CellAIndex = static_cast((AY + 2) * 5 + AX + 2); + const uint8 CellBIndex = static_cast((BY + 2) * 5 + BX + 2); + const FGeneratedCaveCell& A = *OutColumn.TunnelCells[CellAIndex]; + const FGeneratedCaveCell& B = *OutColumn.TunnelCells[CellBIndex]; + const uint8 OpenEdgeFlag = AX != BX + ? TunnelToPositiveX : TunnelToPositiveY; + if ((A.OpenTunnelEdges & OpenEdgeFlag) == 0) + { + return; + } + // Beyond this horizontal reach, even the largest supported detail and tunnel + // smooth-union rise cannot turn rock into air. Reject before calculating the + // point-to-segment distance. + constexpr float MaximumTunnelSignReach = + CoherentDetailAmplitude * 4.0f + 1.25f + 2.0f; + const float Reach = Plan.Generation.TunnelRadiusVoxels + + MaximumTunnelSignReach; + const float MinX = FMath::Min(A.CenterX, B.CenterX); + const float MaxX = FMath::Max(A.CenterX, B.CenterX); + const float MinY = FMath::Min(A.CenterY, B.CenterY); + const float MaxY = FMath::Max(A.CenterY, B.CenterY); + const float GapX = X < MinX ? MinX - X : (X > MaxX ? X - MaxX : 0.0f); + const float GapY = Y < MinY ? MinY - Y : (Y > MaxY ? Y - MaxY : 0.0f); + if (GapX * GapX + GapY * GapY >= Reach * Reach) + { + return; + } + check(OutColumn.TunnelEdgeCount < UE_ARRAY_COUNT(OutColumn.TunnelT)); + const float ABX = B.CenterX - A.CenterX; + const float ABY = B.CenterY - A.CenterY; + const float LengthSquared = ABX * ABX + ABY * ABY; + const float T = LengthSquared > 1.0e-8f + ? FMath::Clamp(((X - A.CenterX) * ABX + + (Y - A.CenterY) * ABY) / LengthSquared, 0.0f, 1.0f) + : 0.0f; + const float DX = X - (A.CenterX + T * ABX); + const float DY = Y - (A.CenterY + T * ABY); + const float Horizontal = Plan.Generation.TunnelRadiusVoxels + - FMath::Sqrt(DX * DX + DY * DY); + int32 InsertAt = OutColumn.TunnelEdgeCount; + while (InsertAt > 0 + && OutColumn.TunnelHorizontal[InsertAt - 1] < Horizontal) + { + OutColumn.TunnelEdgeCellA[InsertAt] = + OutColumn.TunnelEdgeCellA[InsertAt - 1]; + OutColumn.TunnelEdgeCellB[InsertAt] = + OutColumn.TunnelEdgeCellB[InsertAt - 1]; + OutColumn.TunnelT[InsertAt] = OutColumn.TunnelT[InsertAt - 1]; + OutColumn.TunnelHorizontal[InsertAt] = + OutColumn.TunnelHorizontal[InsertAt - 1]; + --InsertAt; + } + OutColumn.TunnelEdgeCellA[InsertAt] = CellAIndex; + OutColumn.TunnelEdgeCellB[InsertAt] = CellBIndex; + OutColumn.TunnelT[InsertAt] = T; + OutColumn.TunnelHorizontal[InsertAt] = Horizontal; + ++OutColumn.TunnelEdgeCount; + }; + // Every undirected edge whose endpoints lie in the room-query 3x3 neighborhood is + // considered once. This retains the old base cell's edges when the query base shifts. + for (int32 CellY = -1; CellY <= 1; ++CellY) + for (int32 CellX = -1; CellX < 1; ++CellX) + { + CacheTunnelEdge(CellX, CellY, CellX + 1, CellY); + } + for (int32 CellX = -1; CellX <= 1; ++CellX) + for (int32 CellY = -1; CellY < 1; ++CellY) + { + CacheTunnelEdge(CellX, CellY, CellX, CellY + 1); } - const FGeneratedCaveCell& Next = *OutColumn.Cells[EdgeIndices[EdgeIndex]]; - const float ABX = Next.CenterX - Centre.CenterX; - const float ABY = Next.CenterY - Centre.CenterY; - const float LengthSquared = ABX * ABX + ABY * ABY; - const float T = LengthSquared > 1.0e-8f - ? FMath::Clamp(((X - Centre.CenterX) * ABX - + (Y - Centre.CenterY) * ABY) / LengthSquared, 0.0f, 1.0f) - : 0.0f; - const float DX = X - (Centre.CenterX + T * ABX); - const float DY = Y - (Centre.CenterY + T * ABY); - OutColumn.TunnelT[EdgeIndex] = T; - OutColumn.TunnelHorizontal[EdgeIndex] = Plan.Generation.TunnelRadiusVoxels - - FMath::Sqrt(DX * DX + DY * DY); } OutColumn.bHasLandingXYCache = Plan.Landings.Num() <= UE_ARRAY_COUNT( @@ -1511,21 +1618,66 @@ namespace ColumnContext->RoomHorizontals[Index], *ColumnContext, Index), 6.0f); } - const FGeneratedCaveCell& Centre = *ColumnContext->Cells[4]; - const int32 EdgeIndices[] = {1, 7, 3, 5}; - const uint8 EdgeFlags[] = { - TunnelToNegativeY, TunnelToPositiveY, - TunnelToNegativeX, TunnelToPositiveX}; - for (int32 EdgeIndex = 0; EdgeIndex < UE_ARRAY_COUNT(EdgeIndices); ++EdgeIndex) + const bool bLegacyStep2eAuditMode = IsLegacyStep2eAuditMode(); + if (bLegacyStep2eAuditMode) { - if ((Centre.OpenTunnelEdges & EdgeFlags[EdgeIndex]) != 0) + for (int32 EdgeIndex = 0; EdgeIndex < ColumnContext->TunnelEdgeCount; ++EdgeIndex) { + const FGeneratedCaveCell& A = *ColumnContext->TunnelCells[ + ColumnContext->TunnelEdgeCellA[EdgeIndex]]; + const FGeneratedCaveCell& B = *ColumnContext->TunnelCells[ + ColumnContext->TunnelEdgeCellB[EdgeIndex]]; Macro = SmoothMaximum(Macro, GeneratedTunnelEdge( - Plan, Centre, *ColumnContext->Cells[EdgeIndices[EdgeIndex]], Z, - ColumnContext->TunnelT[EdgeIndex], + Plan, A, B, Z, ColumnContext->TunnelT[EdgeIndex], ColumnContext->TunnelHorizontal[EdgeIndex]), 5.0f); } } + else + { + // Far inside solid rock, density magnitude is only a proof margin. Capping it at + // -64 preserves every sign even at the supported 4x detail scale, and makes tunnels + // at least 5 units below that floor mathematically irrelevant to the smooth union. + Macro = FMath::Max(Macro, -64.0f); + const float MinimumTunnelFloor = + Plan.GenerationFloorZ - Plan.Generation.FloorReliefVoxels; + const float MaximumTunnelFloor = + Plan.GenerationFloorZ + Plan.Generation.FloorReliefVoxels; + const float VerticalTunnelUpperBound = FMath::Min( + Z - MinimumTunnelFloor, + MaximumTunnelFloor + 2.0f * Plan.Generation.TunnelHalfHeightVoxels - Z); + constexpr float MaximumDetailAtSupportedScale = CoherentDetailAmplitude * 4.0f; + constexpr float MaximumSmoothUnionRise = 1.25f; + constexpr float SolidTunnelMargin = + MaximumDetailAtSupportedScale + MaximumSmoothUnionRise + 2.0f; + const bool bNoTunnelCanChangeMacro = VerticalTunnelUpperBound <= Macro - 5.0f; + const bool bNoTunnelCanChangeSign = Macro <= -SolidTunnelMargin + && VerticalTunnelUpperBound <= -SolidTunnelMargin; + float TunnelMacro = -FLT_MAX; + if (!bNoTunnelCanChangeMacro && !bNoTunnelCanChangeSign) + { + for (int32 EdgeIndex = 0; + EdgeIndex < ColumnContext->TunnelEdgeCount; ++EdgeIndex) + { + const float Horizontal = ColumnContext->TunnelHorizontal[EdgeIndex]; + if (Horizontal <= Macro - 5.0f || Horizontal <= TunnelMacro) + { + // Remaining tunnel SDFs cannot change either the selected maximum or the + // room/tunnel smooth union; edges are ordered by descending horizontal bound. + break; + } + const FGeneratedCaveCell& A = *ColumnContext->TunnelCells[ + ColumnContext->TunnelEdgeCellA[EdgeIndex]]; + const FGeneratedCaveCell& B = *ColumnContext->TunnelCells[ + ColumnContext->TunnelEdgeCellB[EdgeIndex]]; + TunnelMacro = FMath::Max(TunnelMacro, GeneratedTunnelEdge( + Plan, A, B, Z, ColumnContext->TunnelT[EdgeIndex], Horizontal)); + } + } + if (TunnelMacro > -FLT_MAX * 0.5f) + { + Macro = SmoothMaximum(Macro, TunnelMacro, 5.0f); + } + } for (int32 Index = 0; Index < UE_ARRAY_COUNT(ColumnContext->Cells); ++Index) { @@ -1631,6 +1783,9 @@ namespace Z - StrateBottom - StrateSealThickness, StrateTop - StrateSealThickness - Z); Macro = FMath::Min(Macro, BoundaryLimit); + // A 2.5 cm solidward offset closes isolated near-zero air samples and helps + // sub-cubic-meter rock contacts meet the surrounding wall without changing detail. + Macro -= CoherentRockDensityBias; } if (OutDetailScale != nullptr) @@ -2117,6 +2272,60 @@ float EvaluateParameterized(const UVoxelGenerator& Generator, OutPreEditDensity, DetailScale, nullptr, true, nullptr); } +float EvaluateParameterizedMacroOnly( + const UVoxelGenerator& Generator, float WorldX, float WorldY, float WorldZ) +{ + EnsurePlan(Generator); + const FIntVector Chunk( + FMath::FloorToInt(WorldX / CHUNK_SIZE), + FMath::FloorToInt(WorldY / CHUNK_SIZE), + FMath::FloorToInt(WorldZ / CHUNK_SIZE)); + const FStratePlan* Plan = FindStrate(Chunk); + return Plan != nullptr + ? EvaluateParameterizedMacro(*Plan, WorldX, WorldY, WorldZ, nullptr) + : 0.0f; +} + +FString DescribeParameterizedMacroAt( + const UVoxelGenerator& Generator, float WorldX, float WorldY, float WorldZ) +{ + EnsurePlan(Generator); + const FIntVector Chunk( + FMath::FloorToInt(WorldX / CHUNK_SIZE), + FMath::FloorToInt(WorldY / CHUNK_SIZE), + FMath::FloorToInt(WorldZ / CHUNK_SIZE)); + const FStratePlan* Plan = FindStrate(Chunk); + if (Plan == nullptr) + { + return TEXT("no-plan"); + } + + FParameterizedColumnContext Column; + BuildParameterizedColumnContext(*Plan, WorldX, WorldY, nullptr, Column); + const FIntPoint BaseCell = GenerationCellAt(*Plan, WorldX, WorldY); + FString Description = FString::Printf( + TEXT("base=(%d,%d); cells="), BaseCell.X, BaseCell.Y); + for (int32 Index = 0; Index < UE_ARRAY_COUNT(Column.Cells); ++Index) + { + const FGeneratedCaveCell& Cell = *Column.Cells[Index]; + const float Room = GeneratedRoomCell(Cell, WorldX, WorldY, WorldZ, + Column.RoomRadii[Index], Column.RoomHorizontals[Index], Column, Index); + Description += FString::Printf( + TEXT("(%d,%d,r=%.2f,h=%.2f,v=%.2f,room=%.2f,flags=%u,edges=%u)"), + Cell.CellX, Cell.CellY, Cell.RadiusX, Column.RoomHorizontals[Index], + FMath::Min(WorldZ - Column.RoomFloors[Index], Cell.CeilingZ - WorldZ), + Room, static_cast(Cell.FeatureFlags), + static_cast(Cell.OpenTunnelEdges)); + if (Index + 1 < UE_ARRAY_COUNT(Column.Cells)) + { + Description += TEXT(","); + } + } + Description += FString::Printf(TEXT(";macro=%.3f"), + EvaluateParameterizedMacro(*Plan, WorldX, WorldY, WorldZ, nullptr)); + return Description; +} + float EvaluateParameterizedDetail( const UVoxelGenerator& Generator, float WorldX, float WorldY, float WorldZ) { diff --git a/Source/VoxelForge/Private/VoxelWorld.cpp b/Source/VoxelForge/Private/VoxelWorld.cpp index 4b66f65..b8c8055 100644 --- a/Source/VoxelForge/Private/VoxelWorld.cpp +++ b/Source/VoxelForge/Private/VoxelWorld.cpp @@ -51,6 +51,7 @@ #include "Engine/GameViewportClient.h" #include "Slate/SceneViewport.h" #include "Camera/CameraActor.h" +#include "Components/PointLightComponent.h" #include "VoxelAtmosphereManager.h" #include "DrawDebugHelpers.h" #include "IImageWrapper.h" @@ -1760,6 +1761,21 @@ void AVoxelWorld::EndPlay(const EEndPlayReason::Type EndPlayReason) void AVoxelWorld::BeginPlay() { +#if WITH_EDITOR + int32 ResearchParameterizedCave = 0; + if (FParse::Value(FCommandLine::Get(), TEXT("voxel.ResearchParameterizedCave="), + ResearchParameterizedCave)) + { + VoxelForgeRedefinedDensityField::SetParameterizedEnabled( + ResearchParameterizedCave != 0); + } + int32 ResearchParameterizedCaveSet = -1; + if (FParse::Value(FCommandLine::Get(), TEXT("voxel.ResearchParameterizedCaveSet="), + ResearchParameterizedCaveSet)) + { + VoxelForgeRedefinedDensityField::SetParameterSet(ResearchParameterizedCaveSet); + } +#endif VoxelForgeStartupTrace::BeginFromCommandLine(); VoxelForgeStartupTrace::FStageScope StartupTraceStage(TEXT("BeginPlay")); Super::BeginPlay(); @@ -2059,6 +2075,7 @@ void AVoxelWorld::BeginPlay() } int32 TestCeilingView = 0; + int32 TestCeilingWallCloseup = 0; FParse::Value(FCommandLine::Get(), TEXT("voxel.TestCeilingView="), TestCeilingView); bTestCeilingViewEnabled = TestCeilingView != 0; if (bTestCeilingViewEnabled) @@ -2078,6 +2095,8 @@ void AVoxelWorld::BeginPlay() FParse::Value(FCommandLine::Get(), TEXT("voxel.TestCeilingCaptureDelaySeconds="), TestCeilingCaptureDelaySeconds); TestCeilingCaptureDelaySeconds = FMath::Max(TestCeilingCaptureDelaySeconds, 1.0f); + FParse::Value(FCommandLine::Get(), TEXT("voxel.TestCeilingWallCloseup="), + TestCeilingWallCloseup); TestCeilingViewBeginSeconds = FPlatformTime::Seconds(); bHeadlessStreamingTestCenterOverride = true; HeadlessStreamingTestCenterVoxel = WorldToLocalVoxel(TestCeilingCameraWorldPosition); @@ -2255,6 +2274,138 @@ void AVoxelWorld::BeginPlay() DiffLayer->SetBudget(Settings->MaxModifications, Settings->MaxBrushRadius, Settings->MaxTotalVolume); Generator->SetDiffLayer(DiffLayer); + if (bTestCeilingViewEnabled && IsParameterizedResearchFieldActive()) + { + const FVector RequestedCenter = HeadlessStreamingTestCenterVoxel; + FVector BestAirPoint = RequestedCenter; + float BestAirDensity = Generator->GetDensityAt( + RequestedCenter.X, RequestedCenter.Y, RequestedCenter.Z); + TArray SearchZValues; + constexpr int32 SearchZMargin = 8; + constexpr int32 SearchZStep = 16; + if (StrateManager != nullptr) + { + for (const FStrateSlot& Slot : StrateManager->GetLayout()) + { + const int32 MinChunkZ = FMath::Min(Slot.TopChunkZ, Slot.BottomChunkZ); + const int32 MaxChunkZ = FMath::Max(Slot.TopChunkZ, Slot.BottomChunkZ); + const int32 MinZ = MinChunkZ * CHUNK_SIZE + SearchZMargin; + const int32 MaxZ = (MaxChunkZ + 1) * CHUNK_SIZE - SearchZMargin; + for (int32 Z = MinZ; Z <= MaxZ; Z += SearchZStep) + { + SearchZValues.Add(Z); + } + } + } + if (SearchZValues.IsEmpty()) + { + constexpr int32 SearchRadiusZ = 256; + for (int32 Z = FMath::FloorToInt(RequestedCenter.Z) - SearchRadiusZ; + Z <= FMath::FloorToInt(RequestedCenter.Z) + SearchRadiusZ; + Z += SearchZStep) + { + SearchZValues.Add(Z); + } + } + constexpr int32 SearchRadiusXY = 256; + constexpr int32 SearchStepXY = 16; + for (const int32 Z : SearchZValues) + for (int32 DY = -SearchRadiusXY; DY <= SearchRadiusXY; DY += SearchStepXY) + for (int32 DX = -SearchRadiusXY; DX <= SearchRadiusXY; DX += SearchStepXY) + { + const FVector Candidate(RequestedCenter.X + DX, + RequestedCenter.Y + DY, static_cast(Z)); + const float Density = Generator->GetDensityAt( + Candidate.X, Candidate.Y, Candidate.Z); + if (Density > BestAirDensity) + { + BestAirDensity = Density; + BestAirPoint = Candidate; + } + } + + if (BestAirDensity > 0.0f) + { + // Frame the capture from a plausible player-height point in the same chamber, rather + // than directly at its maximum-clearance center. This brings the floor into view while + // retaining a generous air margin and does not affect normal gameplay or generation. + constexpr float CaptureEyeDropVoxels = 32.0f; + const FVector LowerCapturePoint = BestAirPoint + + FVector(0.0f, 0.0f, -CaptureEyeDropVoxels); + const float LowerCaptureDensity = Generator->GetDensityAt( + LowerCapturePoint.X, LowerCapturePoint.Y, LowerCapturePoint.Z); + if (LowerCaptureDensity > 12.0f) + { + BestAirPoint = LowerCapturePoint; + BestAirDensity = LowerCaptureDensity; + } + + FVector BestViewDirection = FVector(1.0f, 0.0f, 0.0f); + float BestViewWallDistance = 0.0f; + float BestViewScore = -FLT_MAX; + for (int32 DZ = -1; DZ <= 1; ++DZ) + for (int32 DY = -1; DY <= 1; ++DY) + for (int32 DX = -1; DX <= 1; ++DX) + { + if (TestCeilingWallCloseup == 0 && DZ != 0) + { + continue; + } + const FVector Direction(static_cast(DX), + static_cast(DY), static_cast(DZ)); + if (Direction.IsNearlyZero()) + { + continue; + } + const FVector NormalizedDirection = Direction.GetSafeNormal(); + for (float Distance = 4.0f; Distance <= 256.0f; Distance += 4.0f) + { + const FVector Probe = BestAirPoint + NormalizedDirection * Distance; + if (Generator->GetDensityAt(Probe.X, Probe.Y, Probe.Z) <= 0.0f) + { + const float TargetDistance = TestCeilingWallCloseup != 0 + ? 24.0f : 64.0f; + const float Score = -FMath::Abs(Distance - TargetDistance); + if (Score > BestViewScore) + { + BestViewScore = Score; + BestViewDirection = NormalizedDirection; + BestViewWallDistance = Distance; + } + break; + } + } + } + + if (BestViewWallDistance > 0.0f) + { + TestCeilingCameraRotation = BestViewDirection.Rotation(); + if (TestCeilingWallCloseup != 0) + { + constexpr float WallInset = 8.0f; + BestAirPoint += BestViewDirection * FMath::Max( + 0.0f, BestViewWallDistance - WallInset); + } + } + TestCeilingCameraWorldPosition = LocalVoxelToWorld(BestAirPoint); + HeadlessStreamingTestCenterVoxel = BestAirPoint; + const FVector WallProbe = BestAirPoint + BestViewDirection + * (TestCeilingWallCloseup != 0 ? 8.0f : BestViewWallDistance); + UE_LOG(LogTemp, Display, + TEXT("[VoxelForgeTestCeiling] view_ray=(%.3f,%.3f,%.3f) wall_distance_vox=%.1f " + "wall_probe_density=%.3f"), + BestViewDirection.X, BestViewDirection.Y, BestViewDirection.Z, + BestViewWallDistance, + Generator->GetDensityAt(WallProbe.X, WallProbe.Y, WallProbe.Z)); + } + UE_LOG(LogTemp, Display, + TEXT("[VoxelForgeTestCeiling] research_air_search=1 requested_local=(%.1f,%.1f,%.1f) " + "selected_local=(%.1f,%.1f,%.1f) selected_density=%.3f wall_closeup=%d"), + RequestedCenter.X, RequestedCenter.Y, RequestedCenter.Z, + BestAirPoint.X, BestAirPoint.Y, BestAirPoint.Z, BestAirDensity, + TestCeilingWallCloseup != 0 ? 1 : 0); + } + // Content manager — distance-based decoration grid (no LOD pop) + level-0 water planes. ContentManager = NewObject(this); ContentManager->Initialize( @@ -2266,6 +2417,11 @@ void AVoxelWorld::BeginPlay() AtmosphereManager = NewObject(this); AtmosphereManager->Initialize(this, StrateManager, Generator); } + else if (bTestCeilingViewEnabled) + { + UE_LOG(LogTemp, Display, + TEXT("[VoxelForgeTestCeiling] atmosphere=disabled_by_world_setting")); + } // Density volume — player-centred clipmap streamed to the GPU for mini-sun raymarched shadows. if (Settings->bEnableDensityVolume) @@ -6547,6 +6703,23 @@ void AVoxelWorld::Tick(float DeltaTime) { TestCeilingCamera = Camera; PC->SetViewTarget(Camera); + UPointLightComponent* CaptureHeadlamp = NewObject(Camera); + if (IsValid(CaptureHeadlamp)) + { + Camera->AddInstanceComponent(CaptureHeadlamp); + CaptureHeadlamp->SetupAttachment(Camera->GetRootComponent()); + CaptureHeadlamp->SetMobility(EComponentMobility::Movable); + CaptureHeadlamp->SetIntensity(80000.0f); + CaptureHeadlamp->SetAttenuationRadius(10000.0f); + CaptureHeadlamp->SetUseInverseSquaredFalloff(false); + CaptureHeadlamp->SetLightFalloffExponent(0.0f); + CaptureHeadlamp->SetLightColor(FLinearColor(1.0f, 0.88f, 0.72f)); + CaptureHeadlamp->SetCastShadows(false); + CaptureHeadlamp->RegisterComponent(); + UE_LOG(LogTemp, Display, + TEXT("[VoxelForgeTestCeiling] camera_headlamp=1 intensity=80000 radius_cm=10000 " + "inverse_square=0 falloff_exponent=0")); + } UE_LOG(LogTemp, Display, TEXT("[VoxelForgeTestCeiling] camera_installed=1 applied_visible_tiles=%llu"), static_cast(AppliedVisibleTileCount)); @@ -6559,6 +6732,27 @@ void AVoxelWorld::Tick(float DeltaTime) >= static_cast(TestCeilingCaptureDelaySeconds)) { bTestCeilingCaptureRequested = true; + FVector ActiveViewWorldPosition = FVector::ZeroVector; + FRotator ActiveViewRotation = FRotator::ZeroRotator; + PC->GetPlayerViewPoint(ActiveViewWorldPosition, ActiveViewRotation); + const FVector ActiveViewVoxel = WorldToLocalVoxel(ActiveViewWorldPosition); + const float ActiveViewDensity = Generator != nullptr + ? Generator->GetDensityAt(ActiveViewVoxel.X, ActiveViewVoxel.Y, ActiveViewVoxel.Z) + : 0.0f; + int32 ActiveResearchEnabled = 0; + int32 ActiveResearchProfile = -1; +#if WITH_EDITOR + ActiveResearchEnabled = VoxelForgeRedefinedDensityField::IsParameterizedEnabled() ? 1 : 0; + ActiveResearchProfile = VoxelForgeRedefinedDensityField::GetParameterSet(); +#endif + UE_LOG(LogTemp, Display, + TEXT("[VoxelForgeTestCeiling] active_view_target=%s active_view_world_cm=(%.3f,%.3f,%.3f) " + "rotation=(%.3f,%.3f,%.3f) local_vox=(%.3f,%.3f,%.3f) density=%.3f research=%d profile=%d"), + *GetNameSafe(PC->GetViewTarget()), + ActiveViewWorldPosition.X, ActiveViewWorldPosition.Y, ActiveViewWorldPosition.Z, + ActiveViewRotation.Pitch, ActiveViewRotation.Yaw, ActiveViewRotation.Roll, + ActiveViewVoxel.X, ActiveViewVoxel.Y, ActiveViewVoxel.Z, ActiveViewDensity, + ActiveResearchEnabled, ActiveResearchProfile); // UEngine::Exec is not routed through the game viewport in the command-line game // target, so HighResShot returns false there even with a live render viewport. Call // the viewport API directly; it schedules the same one-frame high-res capture. diff --git a/Source/VoxelForge/Public/VoxelRedefinedDensityField.h b/Source/VoxelForge/Public/VoxelRedefinedDensityField.h index f855be7..1282215 100644 --- a/Source/VoxelForge/Public/VoxelRedefinedDensityField.h +++ b/Source/VoxelForge/Public/VoxelRedefinedDensityField.h @@ -117,6 +117,14 @@ namespace VoxelForgeRedefinedDensityField const UVoxelGenerator& Generator, float WorldX, float WorldY, float WorldZ, float* OutPreEditDensity = nullptr, float DetailScale = 1.0f); + /** Evaluate only the parameterized room/tunnel macro, before passage overlays and seals. */ + VOXELFORGE_API float EvaluateParameterizedMacroOnly( + const UVoxelGenerator& Generator, float WorldX, float WorldY, float WorldZ); + + /** Describe the candidate room SDF values at a point for step 2f proof diagnosis. */ + VOXELFORGE_API FString DescribeParameterizedMacroAt( + const UVoxelGenerator& Generator, float WorldX, float WorldY, float WorldZ); + /** Return the active parameterized detail signal for the band-limit research gate. */ VOXELFORGE_API float EvaluateParameterizedDetail( const UVoxelGenerator& Generator, float WorldX, float WorldY, float WorldZ); diff --git a/Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp b/Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp index 4102898..624282a 100644 --- a/Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp +++ b/Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp @@ -2551,10 +2551,20 @@ struct FStep2dBrickProofAudit float FirstViolationDensity = 0.0f; float FirstViolationCenterMacro = 0.0f; float FirstViolationSampleMacro = 0.0f; + float FirstViolationCenterRoomMacro = 0.0f; + float FirstViolationSampleRoomMacro = 0.0f; float FirstViolationSampleDetail = 0.0f; float FirstViolationMacroDeltaPerVoxel = 0.0f; float FirstViolationPathMaxGradient = 0.0f; float FirstViolationTinyStepMaxGradient = 0.0f; + FVector FirstViolationPathMaxFrom = FVector::ZeroVector; + FVector FirstViolationPathMaxTo = FVector::ZeroVector; + float FirstViolationPathMaxFromMacro = 0.0f; + float FirstViolationPathMaxToMacro = 0.0f; + float FirstViolationPathMaxFromRoomMacro = 0.0f; + float FirstViolationPathMaxToRoomMacro = 0.0f; + FString FirstViolationPathMaxFromRoomDiagnostic; + FString FirstViolationPathMaxToRoomDiagnostic; bool bFirstViolationWasInsideBrick = false; bool bFirstViolationClaimedAir = false; uint64 DeliberatelyUndersizedBoundClaimsChecked = 0; @@ -2653,6 +2663,15 @@ FStep2dBrickProofAudit AuditStep2dBrickProofs( : VoxelForgeRedefinedDensityField::Evaluate( Generator, SamplePoint.X, SamplePoint.Y, SamplePoint.Z, nullptr, 0.0f); + if (bParameterized) + { + Result.FirstViolationCenterRoomMacro = + VoxelForgeRedefinedDensityField::EvaluateParameterizedMacroOnly( + Generator, ProofCentre.X, ProofCentre.Y, ProofCentre.Z); + Result.FirstViolationSampleRoomMacro = + VoxelForgeRedefinedDensityField::EvaluateParameterizedMacroOnly( + Generator, SamplePoint.X, SamplePoint.Y, SamplePoint.Z); + } Result.FirstViolationSampleDetail = Density - Result.FirstViolationSampleMacro; const float CentreDistance = (SamplePoint - ProofCentre).Size(); @@ -2664,6 +2683,7 @@ FStep2dBrickProofAudit AuditStep2dBrickProofs( { constexpr int32 PathSteps = 32; float PreviousMacro = Result.FirstViolationSampleMacro; + FVector PreviousPoint = SamplePoint; for (int32 PathStep = 1; PathStep <= PathSteps; ++PathStep) { const float Alpha = static_cast(PathStep) / PathSteps; @@ -2674,11 +2694,35 @@ FStep2dBrickProofAudit AuditStep2dBrickProofs( Generator, Point.X, Point.Y, Point.Z, nullptr, 0.0f) : VoxelForgeRedefinedDensityField::Evaluate( Generator, Point.X, Point.Y, Point.Z, nullptr, 0.0f); - Result.FirstViolationPathMaxGradient = FMath::Max( - Result.FirstViolationPathMaxGradient, - FMath::Abs(PathMacro - PreviousMacro) - * PathSteps / CentreDistance); + const float PathGradient = FMath::Abs( + PathMacro - PreviousMacro) * PathSteps / CentreDistance; + if (PathGradient > Result.FirstViolationPathMaxGradient) + { + Result.FirstViolationPathMaxGradient = PathGradient; + Result.FirstViolationPathMaxFrom = PreviousPoint; + Result.FirstViolationPathMaxTo = Point; + Result.FirstViolationPathMaxFromMacro = PreviousMacro; + Result.FirstViolationPathMaxToMacro = PathMacro; + if (bParameterized) + { + Result.FirstViolationPathMaxFromRoomMacro = + VoxelForgeRedefinedDensityField::EvaluateParameterizedMacroOnly( + Generator, PreviousPoint.X, PreviousPoint.Y, + PreviousPoint.Z); + Result.FirstViolationPathMaxToRoomMacro = + VoxelForgeRedefinedDensityField::EvaluateParameterizedMacroOnly( + Generator, Point.X, Point.Y, Point.Z); + Result.FirstViolationPathMaxFromRoomDiagnostic = + VoxelForgeRedefinedDensityField::DescribeParameterizedMacroAt( + Generator, PreviousPoint.X, PreviousPoint.Y, + PreviousPoint.Z); + Result.FirstViolationPathMaxToRoomDiagnostic = + VoxelForgeRedefinedDensityField::DescribeParameterizedMacroAt( + Generator, Point.X, Point.Y, Point.Z); + } + } PreviousMacro = PathMacro; + PreviousPoint = Point; } } constexpr float TinyStep = 0.01f; @@ -3173,12 +3217,27 @@ struct FStep2fFragmentMetrics int64 SolidCrumbsBelowOneCubicMeter = 0; int64 AirCrumbVoxelSamples = 0; int64 SolidCrumbVoxelSamples = 0; + int64 AirCrumbsAfterBoundaryPadding = -1; + int64 SolidCrumbsAfterBoundaryPadding = -1; int32 LargestAirComponentVoxels = 0; int32 LargestSolidComponentVoxels = 0; + struct FCrumbComponent + { + bool bAir = false; + int32 Samples = 0; + FIntVector Min = FIntVector::ZeroValue; + FIntVector Max = FIntVector::ZeroValue; + FIntVector Root = FIntVector::ZeroValue; + int32 SignMismatchSamples = 0; + float DensityAtRoot = 0.0f; + float DensityAtMin = 0.0f; + }; + TArray CrumbComponents; }; FStep2fFragmentMetrics ComputeStep2fFragmentMetrics( - const TArray& Density, int32 Dimension) + const TArray& Density, int32 Dimension, + int32 CoreInset = 0, int32 CoreDimension = 0) { FStep2fFragmentMetrics Result; const int32 Count = Density.Num(); @@ -3252,7 +3311,20 @@ FStep2fFragmentMetrics ComputeStep2fFragmentMetrics( } } } + TSet ComponentsIntersectingCore; + if (CoreDimension > 0 && CoreInset >= 0 + && CoreInset + CoreDimension <= Dimension) + { + for (int32 Z = CoreInset; Z < CoreInset + CoreDimension; ++Z) + for (int32 Y = CoreInset; Y < CoreInset + CoreDimension; ++Y) + for (int32 X = CoreInset; X < CoreInset + CoreDimension; ++X) + { + const int32 Index = (Z * Dimension + Y) * Dimension + X; + ComponentsIntersectingCore.Add(FindRoot(Index)); + } + } constexpr int32 VoxelsPerCubicMeter = 4 * 4 * 4; + TMap CrumbByRoot; for (int32 Index = 0; Index < Count; ++Index) { if (Parent[Index] >= 0) @@ -3261,15 +3333,29 @@ FStep2fFragmentMetrics ComputeStep2fFragmentMetrics( } const int32 ComponentVoxels = -Parent[Index]; const bool bAir = Density[Index] > 0.0f; + const bool bIntersectsCore = ComponentsIntersectingCore.IsEmpty() + || ComponentsIntersectingCore.Contains(Index); if (bAir) { ++Result.AirComponents; Result.LargestAirComponentVoxels = FMath::Max( Result.LargestAirComponentVoxels, ComponentVoxels); - if (ComponentVoxels < VoxelsPerCubicMeter) + if (ComponentVoxels < VoxelsPerCubicMeter && bIntersectsCore) { ++Result.AirCrumbsBelowOneCubicMeter; Result.AirCrumbVoxelSamples += ComponentVoxels; + if (Result.CrumbComponents.Num() + CrumbByRoot.Num() < 32) + { + FStep2fFragmentMetrics::FCrumbComponent& Crumb = + CrumbByRoot.Add(Index); + Crumb.bAir = true; + Crumb.Samples = ComponentVoxels; + Crumb.Min = FIntVector(Dimension, Dimension, Dimension); + Crumb.Max = FIntVector::ZeroValue; + Crumb.Root = FIntVector(Index % Dimension, + (Index / Dimension) % Dimension, Index / (Dimension * Dimension)); + Crumb.DensityAtRoot = Density[Index]; + } } } else @@ -3277,13 +3363,59 @@ FStep2fFragmentMetrics ComputeStep2fFragmentMetrics( ++Result.SolidComponents; Result.LargestSolidComponentVoxels = FMath::Max( Result.LargestSolidComponentVoxels, ComponentVoxels); - if (ComponentVoxels < VoxelsPerCubicMeter) + if (ComponentVoxels < VoxelsPerCubicMeter && bIntersectsCore) { ++Result.SolidCrumbsBelowOneCubicMeter; Result.SolidCrumbVoxelSamples += ComponentVoxels; + if (Result.CrumbComponents.Num() + CrumbByRoot.Num() < 32) + { + FStep2fFragmentMetrics::FCrumbComponent& Crumb = + CrumbByRoot.Add(Index); + Crumb.bAir = false; + Crumb.Samples = ComponentVoxels; + Crumb.Min = FIntVector(Dimension, Dimension, Dimension); + Crumb.Max = FIntVector::ZeroValue; + Crumb.Root = FIntVector(Index % Dimension, + (Index / Dimension) % Dimension, Index / (Dimension * Dimension)); + Crumb.DensityAtRoot = Density[Index]; + } } } } + if (!CrumbByRoot.IsEmpty()) + { + for (int32 Index = 0; Index < Count; ++Index) + { + const int32 Root = FindRoot(Index); + FStep2fFragmentMetrics::FCrumbComponent* Crumb = CrumbByRoot.Find(Root); + if (Crumb == nullptr) + { + continue; + } + const int32 X = Index % Dimension; + const int32 Y = (Index / Dimension) % Dimension; + const int32 Z = Index / (Dimension * Dimension); + Crumb->SignMismatchSamples += + (Density[Index] > 0.0f) != Crumb->bAir ? 1 : 0; + Crumb->Min.X = FMath::Min(Crumb->Min.X, X); + Crumb->Min.Y = FMath::Min(Crumb->Min.Y, Y); + Crumb->Min.Z = FMath::Min(Crumb->Min.Z, Z); + Crumb->Max.X = FMath::Max(Crumb->Max.X, X); + Crumb->Max.Y = FMath::Max(Crumb->Max.Y, Y); + Crumb->Max.Z = FMath::Max(Crumb->Max.Z, Z); + } + TArray Roots; + CrumbByRoot.GetKeys(Roots); + Roots.Sort(); + for (const int32 Root : Roots) + { + FStep2fFragmentMetrics::FCrumbComponent& Crumb = CrumbByRoot[Root]; + const int32 MinIndex = (Crumb.Min.Z * Dimension + Crumb.Min.Y) + * Dimension + Crumb.Min.X; + Crumb.DensityAtMin = Density[MinIndex]; + Result.CrumbComponents.Add(Crumb); + } + } return Result; } @@ -5006,10 +5138,44 @@ int32 RunStep2f(const FString& Params) static_cast(Shape.Fragments.AirCrumbsBelowOneCubicMeter)); Json->SetNumberField(TEXT("solid_crumbs_below_1m3"), static_cast(Shape.Fragments.SolidCrumbsBelowOneCubicMeter)); + Json->SetNumberField(TEXT("air_crumbs_below_1m3_after_boundary_padding"), + static_cast(Shape.Fragments.AirCrumbsAfterBoundaryPadding >= 0 + ? Shape.Fragments.AirCrumbsAfterBoundaryPadding + : Shape.Fragments.AirCrumbsBelowOneCubicMeter)); + Json->SetNumberField(TEXT("solid_crumbs_below_1m3_after_boundary_padding"), + static_cast(Shape.Fragments.SolidCrumbsAfterBoundaryPadding >= 0 + ? Shape.Fragments.SolidCrumbsAfterBoundaryPadding + : Shape.Fragments.SolidCrumbsBelowOneCubicMeter)); Json->SetNumberField(TEXT("air_crumb_voxel_samples"), static_cast(Shape.Fragments.AirCrumbVoxelSamples)); Json->SetNumberField(TEXT("solid_crumb_voxel_samples"), static_cast(Shape.Fragments.SolidCrumbVoxelSamples)); + TArray> CrumbComponents; + for (const FStep2fFragmentMetrics::FCrumbComponent& Crumb + : Shape.Fragments.CrumbComponents) + { + TSharedRef CrumbJson = MakeShared(); + CrumbJson->SetStringField(TEXT("sign"), Crumb.bAir ? TEXT("air") : TEXT("solid")); + CrumbJson->SetNumberField(TEXT("samples"), Crumb.Samples); + CrumbJson->SetNumberField(TEXT("density_at_min"), Crumb.DensityAtMin); + CrumbJson->SetArrayField(TEXT("root_ring_voxel"), { + MakeShared(Crumb.Root.X), + MakeShared(Crumb.Root.Y), + MakeShared(Crumb.Root.Z)}); + CrumbJson->SetNumberField(TEXT("density_at_root"), Crumb.DensityAtRoot); + CrumbJson->SetNumberField(TEXT("sign_mismatch_samples"), + Crumb.SignMismatchSamples); + CrumbJson->SetArrayField(TEXT("min_ring_voxel"), { + MakeShared(Crumb.Min.X), + MakeShared(Crumb.Min.Y), + MakeShared(Crumb.Min.Z)}); + CrumbJson->SetArrayField(TEXT("max_ring_voxel"), { + MakeShared(Crumb.Max.X), + MakeShared(Crumb.Max.Y), + MakeShared(Crumb.Max.Z)}); + CrumbComponents.Add(MakeShared(CrumbJson)); + } + Json->SetArrayField(TEXT("crumb_components_first_32"), CrumbComponents); Json->SetNumberField(TEXT("largest_air_component_voxels"), Shape.Fragments.LargestAirComponentVoxels); Json->SetNumberField(TEXT("largest_solid_component_voxels"), @@ -5041,6 +5207,35 @@ int32 RunStep2f(const FString& Params) return Json; }; + constexpr int32 CrumbBoundaryPadding = 64; + const int32 PaddedCrumbDimension = Dimension + 2 * CrumbBoundaryPadding; + const FIntVector PaddedCrumbOrigin = Origin + - FIntVector(CrumbBoundaryPadding, CrumbBoundaryPadding, CrumbBoundaryPadding); + const auto CountBoundaryPaddedCrumbs = [&](bool bLegacyField, + int64& OutAirCrumbs, int64& OutSolidCrumbs, + TArray* OutCrumbComponents = nullptr) + { + VoxelForgeRedefinedDensityField::SetLegacyStep2eAuditMode(bLegacyField); + TArray PaddedDensity; + VoxelForgeRegionEval::FTiming PaddedTiming; + if (!VoxelForgeRegionEval::EvaluateRedefined( + *World.Generator, PaddedCrumbOrigin, PaddedCrumbDimension, + Workers, 1.0f, PaddedDensity, PaddedTiming, false, true)) + { + return false; + } + const FStep2fFragmentMetrics PaddedFragments = ComputeStep2fFragmentMetrics( + PaddedDensity, PaddedCrumbDimension, + CrumbBoundaryPadding, Dimension); + OutAirCrumbs = PaddedFragments.AirCrumbsBelowOneCubicMeter; + OutSolidCrumbs = PaddedFragments.SolidCrumbsBelowOneCubicMeter; + if (OutCrumbComponents != nullptr) + { + *OutCrumbComponents = PaddedFragments.CrumbComponents; + } + return true; + }; + for (int32 Profile = 0; Profile < VoxelForgeRedefinedDensityField::GetParameterSetCount(); ++Profile) { @@ -5072,12 +5267,20 @@ int32 RunStep2f(const FString& Params) } LegacyTimes.Sort(); const double LegacyMedianMs = LegacyTimes[LegacyTimes.Num() / 2]; - const FStep2fShapeSnapshot LegacyShape = MeasureShape( + FStep2fShapeSnapshot LegacyShape = MeasureShape( LegacyDensity, LegacyParameters); const FStep2eVarietyMetrics LegacyVariety = LegacyShape.Variety; + if (!CountBoundaryPaddedCrumbs(true, + LegacyShape.Fragments.AirCrumbsAfterBoundaryPadding, + LegacyShape.Fragments.SolidCrumbsAfterBoundaryPadding)) + { + UE_LOG(LogTemp, Error, + TEXT("[VoxelForgeStep2f] profile %d padded step 2e crumb pass failed."), Profile); + return 2; + } WorstStep2eMs = FMath::Max(WorstStep2eMs, LegacyMedianMs); - const int64 LegacyCrumbs = LegacyShape.Fragments.AirCrumbsBelowOneCubicMeter - + LegacyShape.Fragments.SolidCrumbsBelowOneCubicMeter; + const int64 LegacyCrumbs = LegacyShape.Fragments.AirCrumbsAfterBoundaryPadding + + LegacyShape.Fragments.SolidCrumbsAfterBoundaryPadding; WorstStep2eCrumbs = FMath::Max(WorstStep2eCrumbs, LegacyCrumbs); bStep2eCrumbsRejected &= LegacyCrumbs > 0; WorstStep2eDihedralShare = FMath::Max( @@ -5092,7 +5295,7 @@ int32 RunStep2f(const FString& Params) bStep2eBandLimitRejected &= LegacyShape.Detail.LatticeScaleEnergyRatio > 0.20; WorstStep2eLodDistance = FMath::Max( WorstStep2eLodDistance, LegacyShape.Lod1P95SurfaceErrorVoxels); - bStep2eLodRejected |= LegacyShape.Lod1P95SurfaceErrorVoxels > 3.5; + bStep2eLodRejected |= LegacyShape.Lod1P95SurfaceErrorVoxels > 0.5; WorstStep2ePitchCorrelation = FMath::Max( WorstStep2ePitchCorrelation, LegacyShape.Grid.PitchCorrelationPeak); WorstStep2ePitchExcess = FMath::Max( @@ -5136,12 +5339,22 @@ int32 RunStep2f(const FString& Params) } NewTimes.Sort(); const double NewMedianMs = NewTimes[NewTimes.Num() / 2]; - const FStep2fShapeSnapshot NewShape = MeasureShape(NewDensity, NewParameters); + FStep2fShapeSnapshot NewShape = MeasureShape(NewDensity, NewParameters); const FStep2eVarietyMetrics NewVariety = NewShape.Variety; + TArray NewPaddedCrumbComponents; + if (!CountBoundaryPaddedCrumbs(false, + NewShape.Fragments.AirCrumbsAfterBoundaryPadding, + NewShape.Fragments.SolidCrumbsAfterBoundaryPadding, + &NewPaddedCrumbComponents)) + { + UE_LOG(LogTemp, Error, + TEXT("[VoxelForgeStep2f] profile %d padded step 2f crumb pass failed."), Profile); + return 2; + } WorstStep2fMs = FMath::Max(WorstStep2fMs, NewMedianMs); const double NewSolidFraction = 1.0 - NewVariety.OpenFraction; - const int64 NewCrumbs = NewShape.Fragments.AirCrumbsBelowOneCubicMeter - + NewShape.Fragments.SolidCrumbsBelowOneCubicMeter; + const int64 NewCrumbs = NewShape.Fragments.AirCrumbsAfterBoundaryPadding + + NewShape.Fragments.SolidCrumbsAfterBoundaryPadding; WorstStep2fCrumbs = FMath::Max(WorstStep2fCrumbs, NewCrumbs); WorstStep2fDihedralShare = FMath::Max( WorstStep2fDihedralShare, NewShape.Mesh.ShareDihedralsOver45Degrees); @@ -5163,8 +5376,8 @@ int32 RunStep2f(const FString& Params) WorstStep2fFloorOpenings, NewShape.Structure.FloorOpenings); WorstStep2fSolidFraction = FMath::Max(WorstStep2fSolidFraction, NewSolidFraction); BestStep2fSolidFraction = FMath::Min(BestStep2fSolidFraction, NewSolidFraction); - bStep2fCrumbGatePassed &= NewShape.Fragments.AirCrumbsBelowOneCubicMeter == 0 - && NewShape.Fragments.SolidCrumbsBelowOneCubicMeter == 0; + bStep2fCrumbGatePassed &= NewShape.Fragments.AirCrumbsAfterBoundaryPadding == 0 + && NewShape.Fragments.SolidCrumbsAfterBoundaryPadding == 0; bStep2fFlakeGatePassed &= NewShape.Mesh.TriangleCount > 0 && NewShape.Mesh.ManifoldEdgeCount > 0 && NewShape.Mesh.ShareDihedralsOver45Degrees <= 0.25 @@ -5172,7 +5385,7 @@ int32 RunStep2f(const FString& Params) bStep2fBandLimitPassed &= NewShape.Detail.LatticeScaleEnergyRatio <= 0.20 && NewShape.Detail.Rms >= 0.40; bStep2fLodPassed &= NewShape.Lod1VertexCount > 0 - && NewShape.Lod1P95SurfaceErrorVoxels <= 3.5; + && NewShape.Lod1P95SurfaceErrorVoxels <= 0.5; bStep2fGridPassed &= NewShape.Grid.PitchCorrelationPeak <= 0.40 && NewShape.Grid.PitchPeakExcess <= 0.08; bStep2fStructurePassed &= NewSolidFraction >= 0.25 && NewSolidFraction <= 0.88 @@ -5189,6 +5402,51 @@ int32 RunStep2f(const FString& Params) LegacyShape, LegacyMedianMs, LegacyVariety)); Row->SetObjectField(TEXT("step2f"), ShapeJson( NewShape, NewMedianMs, NewVariety)); + TArray> PaddedCrumbDiagnostics; + for (const FStep2fFragmentMetrics::FCrumbComponent& Crumb + : NewPaddedCrumbComponents) + { + // Root is an actual sample in the connected component. The min/max coordinates are + // an axis-aligned bound and their corner may not belong to the component. + const FIntVector SampleVoxel = PaddedCrumbOrigin + Crumb.Root; + const float SampleX = static_cast(SampleVoxel.X); + const float SampleY = static_cast(SampleVoxel.Y); + const float SampleZ = static_cast(SampleVoxel.Z); + TSharedRef CrumbJson = MakeShared(); + CrumbJson->SetStringField(TEXT("sign"), Crumb.bAir ? TEXT("air") : TEXT("solid")); + CrumbJson->SetNumberField(TEXT("samples"), Crumb.Samples); + CrumbJson->SetNumberField(TEXT("density_from_padded_array_at_min"), + Crumb.DensityAtMin); + CrumbJson->SetNumberField(TEXT("density_at_root"), Crumb.DensityAtRoot); + CrumbJson->SetNumberField(TEXT("sign_mismatch_samples"), + Crumb.SignMismatchSamples); + CrumbJson->SetArrayField(TEXT("root_world_voxel"), { + MakeShared(PaddedCrumbOrigin.X + Crumb.Root.X), + MakeShared(PaddedCrumbOrigin.Y + Crumb.Root.Y), + MakeShared(PaddedCrumbOrigin.Z + Crumb.Root.Z)}); + CrumbJson->SetArrayField(TEXT("min_world_voxel"), { + MakeShared(SampleVoxel.X), + MakeShared(SampleVoxel.Y), + MakeShared(SampleVoxel.Z)}); + CrumbJson->SetArrayField(TEXT("max_world_voxel"), { + MakeShared(PaddedCrumbOrigin.X + Crumb.Max.X), + MakeShared(PaddedCrumbOrigin.Y + Crumb.Max.Y), + MakeShared(PaddedCrumbOrigin.Z + Crumb.Max.Z)}); + CrumbJson->SetNumberField(TEXT("final_density_at_min"), + VoxelForgeRedefinedDensityField::EvaluateParameterized( + *World.Generator, SampleX, SampleY, SampleZ)); + CrumbJson->SetNumberField(TEXT("macro_at_min"), + VoxelForgeRedefinedDensityField::EvaluateParameterizedMacroOnly( + *World.Generator, SampleX, SampleY, SampleZ)); + CrumbJson->SetNumberField(TEXT("detail_at_min"), + VoxelForgeRedefinedDensityField::EvaluateParameterizedDetail( + *World.Generator, SampleX, SampleY, SampleZ)); + CrumbJson->SetStringField(TEXT("macro_description_at_min"), + VoxelForgeRedefinedDensityField::DescribeParameterizedMacroAt( + *World.Generator, SampleX, SampleY, SampleZ)); + PaddedCrumbDiagnostics.Add(MakeShared(CrumbJson)); + } + Row->SetArrayField(TEXT("step2f_padded_crumb_diagnostics"), PaddedCrumbDiagnostics); Row->SetObjectField(TEXT("step2e_parameters"), Step2eParametersJson(LegacyParameters)); Row->SetObjectField(TEXT("step2f_parameters"), Step2eParametersJson(NewParameters)); TArray> LegacyTrialValues; @@ -5269,8 +5527,8 @@ int32 RunStep2f(const FString& Params) "solid=%.3f crumbs=%lld/%lld flakes=%.3f/%.3f grid=%.3f/%.3f " "detail=%.3f lod95=%.2f roof=%lld floor=%lld"), Profile, ProfileName, LegacyMedianMs, NewMedianMs, NewSolidFraction, - static_cast(NewShape.Fragments.AirCrumbsBelowOneCubicMeter), - static_cast(NewShape.Fragments.SolidCrumbsBelowOneCubicMeter), + static_cast(NewShape.Fragments.AirCrumbsAfterBoundaryPadding), + static_cast(NewShape.Fragments.SolidCrumbsAfterBoundaryPadding), NewShape.Mesh.ShareDihedralsOver45Degrees, NewShape.Detail.LatticeScaleEnergyRatio, NewShape.Grid.PitchCorrelationPeak, NewShape.Grid.PitchPeakExcess, NewShape.Detail.Rms, NewShape.Lod1P95SurfaceErrorVoxels, @@ -5363,7 +5621,7 @@ int32 RunStep2f(const FString& Params) Step2eCrumbNumbers->SetNumberField(TEXT("crumbs_below_1m3_max"), WorstStep2eCrumbs); TSharedRef Step2fCrumbNumbers = MakeShared(); Step2fCrumbNumbers->SetNumberField(TEXT("crumbs_below_1m3_max"), WorstStep2fCrumbs); - AddGate(TEXT("crumbs"), TEXT("zero 25 cm-grid connected components smaller than 64 voxels (about 1 m3)"), + AddGate(TEXT("crumbs"), TEXT("zero 25 cm-grid components smaller than 64 voxels, measured in a 64-sample-padded volume and restricted to components intersecting the 259-cube"), bStep2eCrumbsRejected, bStep2fCrumbGatePassed, Step2eCrumbNumbers, Step2fCrumbNumbers); TSharedRef Step2eFlakeNumbers = MakeShared(); Step2eFlakeNumbers->SetNumberField(TEXT("max_dihedral_share_over_45deg"), WorstStep2eDihedralShare); @@ -5385,7 +5643,7 @@ int32 RunStep2f(const FString& Params) Step2eLodNumbers->SetNumberField(TEXT("max_l1_p95_surface_distance_voxels"), WorstStep2eLodDistance); TSharedRef Step2fLodNumbers = MakeShared(); Step2fLodNumbers->SetNumberField(TEXT("max_l1_p95_surface_distance_voxels"), WorstStep2fLodDistance); - AddGate(TEXT("lod_stability"), TEXT("L1 mesh p95 estimated distance from the L0 isosurface <= 3.5 lattice samples"), + AddGate(TEXT("lod_stability"), TEXT("L1 mesh p95 estimated distance from the L0 isosurface <= 0.5 lattice samples"), bStep2eLodRejected, bStep2fLodPassed, Step2eLodNumbers, Step2fLodNumbers); TSharedRef Step2eGridNumbers = MakeShared(); Step2eGridNumbers->SetNumberField(TEXT("max_pitch_autocorrelation"), WorstStep2ePitchCorrelation); @@ -5419,6 +5677,10 @@ int32 RunStep2f(const FString& Params) Report->SetNumberField(TEXT("step2f_solid_fraction_max"), WorstStep2fSolidFraction); Report->SetNumberField(TEXT("seed"), Seed); Report->SetNumberField(TEXT("ring_dimension"), Dimension); + Report->SetArrayField(TEXT("ring_origin_voxels"), { + MakeShared(Origin.X), + MakeShared(Origin.Y), + MakeShared(Origin.Z)}); Report->SetNumberField(TEXT("ring_samples"), static_cast(TotalSamples)); Report->SetNumberField(TEXT("workers_requested"), Workers); Report->SetNumberField(TEXT("world_prepare_ms_excluded"), WorldPrepareSeconds * 1000.0); @@ -5427,12 +5689,15 @@ int32 RunStep2f(const FString& Params) "A conservative nearest-neighbor cap leaves a solid web between chambers; a rooted " "tree of narrow tunnels and capped shafts joins them. Sparse ledges, pillars, " "stalactites and large hanging masses remain per-cell rolls. The point and " - "brick detail samplers share three 32/16/8-sample bands with an eight-sample " - "shortest period and a smooth ridge response.")); + "brick detail samplers share independently rotated 48/24/12-sample bands with a " + "twelve-sample shortest period and a smooth ridge response; their final-field " + "detail supremum is 3.822 units.")); Report->SetStringField(TEXT("component_method"), - TEXT("26-neighbor connected components are counted on the exact 25 cm sign lattice; " - "components smaller than 64 samples (< 1 m3) are reported separately for air and solid. " - "The existing one-meter downsampled air component count is also reported.")); + TEXT("26-neighbor connected components are counted on the exact 25 cm sign lattice. " + "Raw components below 64 samples (< 1 m3) are reported, then a 64-sample pad is " + "evaluated around each 259-cube and only components intersecting the original cube " + "are counted again; this prevents a clipped large component at the ring edge from " + "being called a crumb. The one-meter downsampled air component count is also reported.")); Report->SetStringField(TEXT("mesh_method"), TEXT("Eight level-0 tiles and one level-1 tile cover the same 64-sample cube selected " "for maximum coarse-sampled surface crossings. " @@ -5452,6 +5717,63 @@ int32 RunStep2f(const FString& Params) static_cast(ProofAudit.CorrectProofSamplesChecked)); Existing->SetNumberField(TEXT("correct_proof_sign_violations"), static_cast(ProofAudit.CorrectProofViolations)); + TSharedRef FirstProofViolation = MakeShared(); + FirstProofViolation->SetBoolField(TEXT("present"), ProofAudit.CorrectProofViolations > 0); + FirstProofViolation->SetArrayField(TEXT("brick_origin_voxels"), { + MakeShared(ProofAudit.FirstViolationBrickOrigin.X), + MakeShared(ProofAudit.FirstViolationBrickOrigin.Y), + MakeShared(ProofAudit.FirstViolationBrickOrigin.Z)}); + FirstProofViolation->SetArrayField(TEXT("brick_size"), { + MakeShared(ProofAudit.FirstViolationBrickSize.X), + MakeShared(ProofAudit.FirstViolationBrickSize.Y), + MakeShared(ProofAudit.FirstViolationBrickSize.Z)}); + FirstProofViolation->SetArrayField(TEXT("sample_voxels"), { + MakeShared(ProofAudit.FirstViolationSample.X), + MakeShared(ProofAudit.FirstViolationSample.Y), + MakeShared(ProofAudit.FirstViolationSample.Z)}); + FirstProofViolation->SetBoolField(TEXT("inside_brick"), + ProofAudit.bFirstViolationWasInsideBrick); + FirstProofViolation->SetBoolField(TEXT("claimed_air"), + ProofAudit.bFirstViolationClaimedAir); + FirstProofViolation->SetNumberField(TEXT("final_density"), + ProofAudit.FirstViolationDensity); + FirstProofViolation->SetNumberField(TEXT("center_macro"), + ProofAudit.FirstViolationCenterMacro); + FirstProofViolation->SetNumberField(TEXT("sample_macro"), + ProofAudit.FirstViolationSampleMacro); + FirstProofViolation->SetNumberField(TEXT("center_room_macro"), + ProofAudit.FirstViolationCenterRoomMacro); + FirstProofViolation->SetNumberField(TEXT("sample_room_macro"), + ProofAudit.FirstViolationSampleRoomMacro); + FirstProofViolation->SetNumberField(TEXT("sample_detail"), + ProofAudit.FirstViolationSampleDetail); + FirstProofViolation->SetNumberField(TEXT("center_to_sample_macro_delta_per_voxel"), + ProofAudit.FirstViolationMacroDeltaPerVoxel); + FirstProofViolation->SetNumberField(TEXT("path_max_macro_gradient"), + ProofAudit.FirstViolationPathMaxGradient); + FirstProofViolation->SetArrayField(TEXT("path_max_from_voxels"), { + MakeShared(ProofAudit.FirstViolationPathMaxFrom.X), + MakeShared(ProofAudit.FirstViolationPathMaxFrom.Y), + MakeShared(ProofAudit.FirstViolationPathMaxFrom.Z)}); + FirstProofViolation->SetArrayField(TEXT("path_max_to_voxels"), { + MakeShared(ProofAudit.FirstViolationPathMaxTo.X), + MakeShared(ProofAudit.FirstViolationPathMaxTo.Y), + MakeShared(ProofAudit.FirstViolationPathMaxTo.Z)}); + FirstProofViolation->SetNumberField(TEXT("path_max_from_macro"), + ProofAudit.FirstViolationPathMaxFromMacro); + FirstProofViolation->SetNumberField(TEXT("path_max_to_macro"), + ProofAudit.FirstViolationPathMaxToMacro); + FirstProofViolation->SetNumberField(TEXT("path_max_from_room_macro"), + ProofAudit.FirstViolationPathMaxFromRoomMacro); + FirstProofViolation->SetNumberField(TEXT("path_max_to_room_macro"), + ProofAudit.FirstViolationPathMaxToRoomMacro); + FirstProofViolation->SetStringField(TEXT("path_max_from_room_diagnostic"), + ProofAudit.FirstViolationPathMaxFromRoomDiagnostic); + FirstProofViolation->SetStringField(TEXT("path_max_to_room_diagnostic"), + ProofAudit.FirstViolationPathMaxToRoomDiagnostic); + FirstProofViolation->SetNumberField(TEXT("tiny_step_max_macro_gradient"), + ProofAudit.FirstViolationTinyStepMaxGradient); + Existing->SetObjectField(TEXT("first_proof_violation"), FirstProofViolation); Existing->SetNumberField(TEXT("undersized_bound_claims_checked"), static_cast(ProofAudit.DeliberatelyUndersizedBoundClaimsChecked)); Existing->SetNumberField(TEXT("wrong_sign_samples_caught_by_undersized_bound"), diff --git a/Tools/VoxelForgeTest.ps1 b/Tools/VoxelForgeTest.ps1 index dcc292d..fe6ffda 100644 --- a/Tools/VoxelForgeTest.ps1 +++ b/Tools/VoxelForgeTest.ps1 @@ -589,6 +589,53 @@ function Sync-OwnerAssets { return @($rows) } +function Sync-Step2fCaptureMaterialDependencies { + # The authored terrain materials depend on packages outside the plugin. Copy their exact + # source packages into the isolated host so the in-game capture uses the owner's material + # graph instead of Unreal's fallback material. Source assets remain untouched. + $rows = [System.Collections.Generic.List[object]]::new() + $relativePackages = @( + 'Magic_Forest\Landscape_Material\Rock_Cliffs\T_Rock_C', + 'Magic_Forest\Mesh\Rock\Textures\T_Rocks_N', + 'VoxelForge\MF_LayerWeight', + 'VoxelForge\MF_Triplanar', + 'VoxelForge\MF_VoxelOrbLighting', + 'LUSH_StylizedEnvironmentSet\Foliage\Grass\LG_Grass', + 'LUSH_StylizedEnvironmentSet\Landscape\Textures\T_BeachSand_N', + 'UltraDynamicSky\Textures\3D_Clouds\3DCells_128' + ) + foreach ($relativePackage in $relativePackages) { + $sourceBase = Join-Path (Join-Path $ProjectRoot 'Content') $relativePackage + $targetBase = Join-Path (Join-Path $HostRoot 'Content') $relativePackage + $sourceAsset = "$sourceBase.uasset" + if (-not (Test-Path -LiteralPath $sourceAsset -PathType Leaf)) { + throw "Step2f capture material dependency is missing: $sourceAsset" + } + Ensure-Directory (Split-Path -Parent $targetBase) + $copied = [System.Collections.Generic.List[string]]::new() + foreach ($extension in @('.uasset', '.uexp', '.ubulk', '.uptnl')) { + $source = "$sourceBase$extension" + if (Test-Path -LiteralPath $source -PathType Leaf) { + $target = "$targetBase$extension" + $null = Copy-Item -LiteralPath $source -Destination $target -Force -PassThru + [void]$copied.Add($target) + } + } + foreach ($target in $copied) { + $relativeTarget = $target.Substring((Join-Path $HostRoot 'Content').Length).TrimStart('\') + [void]$rows.Add([ordered]@{ + name = "Step2fCapture/$relativeTarget" + used_by_scenario = $true + source_path = (Join-Path (Join-Path $ProjectRoot 'Content') $relativeTarget) + source_sha256 = Get-Sha256 (Join-Path (Join-Path $ProjectRoot 'Content') $relativeTarget) + staged_path = $target + staged_sha256 = Get-Sha256 $target + }) + } + } + return @($rows) +} + function Sync-TestCharacterFixture { $rows = [System.Collections.Generic.List[object]]::new() @@ -652,7 +699,8 @@ function Merge-Cvars([System.Collections.IDictionary]$Base) { return $merged } -function New-CommonArguments([string]$Kind, [string]$LogPath, $CvarMap, [bool]$EnableRender = $false) { +function New-CommonArguments([string]$Kind, [string]$LogPath, $CvarMap, + [bool]$EnableRender = $false) { $safeLabel = ($Label -replace '[^A-Za-z0-9_.-]', '_') $args = [System.Collections.Generic.List[string]]::new() # Quoting the whole -project= token is intentional: this is the failure mode that used to @@ -676,6 +724,10 @@ function New-CommonArguments([string]$Kind, [string]$LogPath, $CvarMap, [bool]$E [void]$args.Add('-NoZenAutoLaunch') [void]$args.Add('-notraceserver') [void]$args.Add('-nocrashreports') + # The editor's default usage-data setting creates a process summary under the + # machine-wide Epic analytics directory, outside this run's isolated output. + # Keep harness launches self-contained and let the external-state guard verify it. + [void]$args.Add('-ini:EditorSettings:/Script/UnrealEd.AnalyticsPrivacySettings:bSendUsageData=false') [void]$args.Add('-WindowsPlatformCrashContext.ForceCrashReportDialogOff=1') [void]$args.Add("-enginesaveddirsuffix=VoxelForgeTest_$safeLabel") [void]$args.Add(('-userdir="{0}"' -f (Join-Path $RunRoot 'User'))) @@ -1388,6 +1440,9 @@ try { } else { $AssetEvidence = @(Get-AssetEvidence) } + if ($Scenario -in @('step2f-capture', 'horizon-render')) { + $AssetEvidence += @(Sync-Step2fCaptureMaterialDependencies) + } if ($Scenario -eq 'tests') { $AssetEvidence += @(Sync-TestCharacterFixture) } @@ -1623,11 +1678,14 @@ try { } } 'step2f-capture' { - $tracePath = Join-Path $RunRoot 'step2f_capture_trace.jsonl' $baseCvars['voxel.TestRenderDistanceChunks'] = $HorizonRenderDistanceChunks $baseCvars['voxel.TestMaxClipLevel'] = $HorizonLevel - $baseCvars['voxel.StartupTraceFile'] = $tracePath - $baseCvars['voxel.StartupTraceMaxTiles'] = 16384 + $baseCvars['voxel.TestCeilingCameraX'] = 0 + $baseCvars['voxel.TestCeilingCameraY'] = 0 + $baseCvars['voxel.TestCeilingCameraZ'] = -8800 + $baseCvars['voxel.TestCeilingCameraPitch'] = 0 + $baseCvars['voxel.TestCeilingCameraYaw'] = 0 + $baseCvars['voxel.TestCeilingWallCloseup'] = if ($Step2fCaptureView -eq 'wall-closeup') { 1 } else { 0 } $baseCvars['voxel.TestCeilingView'] = 1 $baseCvars['voxel.TestCeilingCaptureDelaySeconds'] = 60 $baseCvars['voxel.TestExitSeconds'] = 120 @@ -1640,11 +1698,8 @@ try { $renderLog (Join-Path $RunRoot 'Logs\step2f-capture.stdout.log') ` (Join-Path $RunRoot 'Logs\step2f-capture.stderr.log') $GameMetrics = Get-StreamingMetrics $renderLog - $HorizonMetrics = Get-HorizonMetrics $tracePath $gameLedger $GameMetrics + $HorizonMetrics = [ordered]@{ requested = $false; status = 'not_requested_for_capture' } $HorizonRenderMetrics = Get-HorizonRenderMetrics $gameLedger $renderLog - if ($HorizonMetrics.status -ne 'ok') { - Add-Failure "step2f capture render trace did not settle: $($HorizonMetrics.status)" - } if ($HorizonRenderMetrics.status -ne 'passed') { Add-Failure "step2f profile $Step2fProfile in-game capture failed: $($HorizonRenderMetrics.status)" } else {