research(step2f): coherent caves pass every gate, worst 572 ms idle -- look still to be judged in game
Editor-only, default off (voxel.ResearchParameterizedCave 1; the live skip proofs now decline automatically). Jittered elliptical chambers of varied size and height with rock between them, narrow tunnels, capped shafts, occasional pillars/ledges/stalactites/stalagmites/hanging masses; detail bands at 48/24/12 samples (shortest 3 m), bound 3.822. Gates, step 2e -> step 2f R29 (worst of 8 profiles), each rejecting 2e: crumbs < 1 m^3 2,290 -> 0; dihedral >45 deg 40.7% -> 2.2%; lattice detail energy 0.83 -> 0.007 (RMS floor kept: 0.484 >= 0.40); LOD1 distance p95 0.709 -> 0.377 samples; grid autocorrelation 0.667 -> 0.348; solid share 2.7% -> 79-82%; roof/floor openings 26,657 -> 0. Speed, 259^3 ring, six workers, idle machine (20 GB free): 527-572 ms, worst TerracedBasin 572.3 ms (R27 591 ms, R28 603 ms: run-to-run spread is ~5%). Proof audit 0 violations, undersized control caught; seams pass; 1 vs 6 worker hash 876069a813c83cee; TraversalSeeds pass. Captures are UNLIT (lit runs showed only sky; three D3D12 device-removed crashes): they show the material's tiling, not the cave forms, so the look is not yet judged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
1 parent
d6555df5fa
commit
ca78352e43
16 files changed
+8070
-80
No files matched your search
@@ -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 {
|
||||
|
||||
Reference in new issue
Block a user