wip(assembler): M3 round 3 -- separated islands + Unreal island route (owner build 18:46)
Islands read as separate (91.89% open sky at mid-height), underside cavity closed, rim teeth were capture shading. Island manifest import + BuildHost proof passed on the pre-cache tree; M1 SurfaceWorld and M2 V1/V2 gates passed. Known open: final XY-column cache compiled in the owner build but is unverified; island LOD0 p95 ~155 ms misses the 133 ms sprint deadline (legacy ~43 ms); the island manifest only fits the BuildHost fixture layout (owner's world: Core init fails, empty world) -> round 4 builds plans inside Unreal. 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
4afea7c802
commit
48fa028086
37 files changed
+3788
-107
No files matched your search
@@ -5,7 +5,8 @@ param(
|
||||
[ValidateSet('MarchingCubesV1', 'WorldAssemblerHybridV1', 'WorldAssemblerHybridV2')][string]$CoreMesherRecipe = 'MarchingCubesV1',
|
||||
[switch]$EnableHybridFixturePlacement,
|
||||
[switch]$HybridCliffOnly,
|
||||
[switch]$HybridFixturesOnly
|
||||
[switch]$HybridFixturesOnly,
|
||||
[switch]$FloatingIslandsOnly
|
||||
)
|
||||
|
||||
# Exercise AVoxelWorld Core streaming, collision, anchor movement, and carving in BuildHost only.
|
||||
@@ -41,7 +42,11 @@ function Assert-UnderPath([string]$Candidate, [string]$Root) {
|
||||
Assert-UnderPath $HostRoot (Join-Path $PluginRoot 'Saved\BuildHost')
|
||||
Assert-UnderPath $OutputRoot (Join-Path $StagePlugin 'Saved')
|
||||
if ([string]::IsNullOrWhiteSpace($WorldAssemblyManifestPath)) {
|
||||
$WorldAssemblyManifestPath = Join-Path $PluginRoot 'Standalone\Research\WorldAssemblerM1\round4\world_assembly.json'
|
||||
$WorldAssemblyManifestPath = if ($FloatingIslandsOnly) {
|
||||
Join-Path $PluginRoot 'Standalone\Research\WorldAssemblerM3\Round3\results\world_assembly_floating_islands.json'
|
||||
} else {
|
||||
Join-Path $PluginRoot 'Standalone\Research\WorldAssemblerM1\round4\world_assembly.json'
|
||||
}
|
||||
}
|
||||
$WorldAssemblyManifestPath = [IO.Path]::GetFullPath($WorldAssemblyManifestPath)
|
||||
Assert-UnderPath $WorldAssemblyManifestPath $PluginRoot
|
||||
@@ -84,7 +89,13 @@ foreach ($directory in @($OutputDirectory, $InputDirectory, $LogDirectory, $Loca
|
||||
}
|
||||
Copy-Item -LiteralPath $WorldAssemblyManifestPath -Destination $StagedWorldAssembly -Force
|
||||
$ManifestData = Get-Content -LiteralPath $StagedWorldAssembly -Raw | ConvertFrom-Json
|
||||
if ($ManifestData.content_hash -ne '8933693d9560ba9f') {
|
||||
if ($FloatingIslandsOnly) {
|
||||
if ($ManifestData.content_hash -ne '94b563f1ce622def' -or
|
||||
@($ManifestData.floating_islands).Count -ne 1 -or
|
||||
@($ManifestData.plan.strates).Count -ne 0) {
|
||||
throw "BuildHost world assembly input is not the reviewed round-3 island manifest: $($ManifestData.content_hash)"
|
||||
}
|
||||
} elseif ($ManifestData.content_hash -ne '8933693d9560ba9f') {
|
||||
throw "BuildHost world assembly input is not the reviewed round-4 manifest: $($ManifestData.content_hash)"
|
||||
}
|
||||
if ($EnableHybridFixturePlacement -and $CoreMesherRecipe -eq 'MarchingCubesV1') {
|
||||
@@ -102,6 +113,10 @@ if ($HybridFixturesOnly -and $CoreMesherRecipe -eq 'MarchingCubesV1') {
|
||||
if ($HybridFixturesOnly -and ($HybridCliffOnly -or $EnableHybridFixturePlacement)) {
|
||||
throw '-HybridFixturesOnly cannot be combined with the other focused hybrid modes.'
|
||||
}
|
||||
if ($FloatingIslandsOnly -and ($CoreMesherRecipe -ne 'MarchingCubesV1' -or
|
||||
$EnableHybridFixturePlacement -or $HybridCliffOnly -or $HybridFixturesOnly)) {
|
||||
throw '-FloatingIslandsOnly uses the reviewed MC island manifest and cannot be combined with hybrid modes.'
|
||||
}
|
||||
|
||||
$CrashBefore = @{}
|
||||
foreach ($CrashRoot in $CrashRoots) {
|
||||
@@ -134,6 +149,7 @@ $HybridMesherFlag = switch ($CoreMesherRecipe) {
|
||||
$HybridFixturePlacementFlag = if ($EnableHybridFixturePlacement) { 1 } else { 0 }
|
||||
$HybridCliffOnlyFlag = if ($HybridCliffOnly) { 1 } else { 0 }
|
||||
$HybridFixturesOnlyFlag = if ($HybridFixturesOnly) { 1 } else { 0 }
|
||||
$FloatingIslandsOnlyFlag = if ($FloatingIslandsOnly) { 1 } else { 0 }
|
||||
$BaseArguments = @(
|
||||
('-project="{0}"' -f $HostProject),
|
||||
'-nullrhi', '-unattended', '-nop4', '-nosplash', '-NoSound',
|
||||
@@ -144,6 +160,7 @@ $BaseArguments = @(
|
||||
('-LocalDataCachePath="{0}"' -f $DerivedDataCache),
|
||||
'-run=VoxelForgeExplore', '-seed=0', '-archetype=TunnelNetwork', '-slot=0',
|
||||
'-modes=export', '-gameconfig=1', '-coreworldtest=1',
|
||||
("-coreislandtest=$FloatingIslandsOnlyFlag"),
|
||||
'-settingsref=/Game/VoxelForge/DA_Settings.DA_Settings',
|
||||
('-coreworldassembly="{0}"' -f $StagedWorldAssembly),
|
||||
("-corehybridmesher=$HybridMesherFlag"),
|
||||
@@ -152,6 +169,11 @@ $BaseArguments = @(
|
||||
("-corehybridfixturesonly=$HybridFixturesOnlyFlag"),
|
||||
('-out="{0}"' -f $OutputDirectory)
|
||||
)
|
||||
if ($FloatingIslandsOnly) {
|
||||
# Keep this stationary route fixture out of the movement gate; island/span cooked contacts are probed directly.
|
||||
# Garder ce fixture immobile hors du gate de mouvement ; les contacts cuisines ile/pont sont verifies directement.
|
||||
$BaseArguments += '-voxel.CollisionGate=0'
|
||||
}
|
||||
|
||||
$OldLocalAppData = $env:LOCALAPPDATA
|
||||
$env:LOCALAPPDATA = $LocalAppData
|
||||
@@ -171,11 +193,11 @@ try {
|
||||
$StdoutPath = Join-Path $LogDirectory $StdoutFileName
|
||||
$StderrPath = Join-Path $LogDirectory $StderrFileName
|
||||
$Arguments = @($BaseArguments) + ('-abslog="{0}"' -f $LogPath)
|
||||
Write-Host "BuildHost Core actor commandlet attempt $Attempt of 2; normal priority."
|
||||
Write-Host "BuildHost Core actor commandlet attempt $Attempt of 2; BelowNormal priority."
|
||||
$Process = Start-Process -FilePath $EditorCmd -ArgumentList $Arguments -WorkingDirectory $HostRoot `
|
||||
-RedirectStandardOutput $StdoutPath -RedirectStandardError $StderrPath `
|
||||
-WindowStyle Hidden -PassThru
|
||||
$Process.PriorityClass = [Diagnostics.ProcessPriorityClass]::Normal
|
||||
$Process.PriorityClass = [Diagnostics.ProcessPriorityClass]::BelowNormal
|
||||
$StartedUtc = [datetime]::UtcNow
|
||||
$PeakPrivateBytes = [int64]0
|
||||
while (-not $Process.HasExited) {
|
||||
@@ -198,7 +220,8 @@ try {
|
||||
$ExitCode = $Process.ExitCode
|
||||
if ([string]::IsNullOrEmpty([string]$ExitCode) -and (Test-Path -LiteralPath $LogPath -PathType Leaf)) {
|
||||
$CompletedLog = Get-Content -LiteralPath $LogPath -Raw
|
||||
if ($CompletedLog -match '\[VoxelForgeCoreWorldTest\] pass complete=1' -and
|
||||
if (($CompletedLog -match '\[VoxelForgeCoreWorldTest\] pass complete=1' -or
|
||||
$CompletedLog -match '\[VoxelForgeCoreIslandTest\] pass complete=1') -and
|
||||
$CompletedLog -match 'Commandlet VoxelForgeExploreCommandlet_\d+ finished execution \(result 0\)') {
|
||||
$ExitCode = 0
|
||||
} elseif ($CompletedLog -match 'Commandlet VoxelForgeExploreCommandlet_\d+ finished execution \(result (-?\d+)\)') {
|
||||
@@ -230,6 +253,44 @@ if (-not (Test-Path -LiteralPath $FinalLog -PathType Leaf)) {
|
||||
$FinalLog = Join-Path $LogDirectory 'CoreWorldValidation.retry.log'
|
||||
}
|
||||
$Text = Get-Content -LiteralPath $FinalLog -Raw
|
||||
if ($FloatingIslandsOnly) {
|
||||
foreach ($Marker in @(
|
||||
'[VoxelForgeCoreIslandTest] manifest_import=PASS',
|
||||
'[VoxelForgeCoreIslandTest] standalone_reference=PASS',
|
||||
'[VoxelForgeCoreIslandTest] worker_hash_matrix=1/8/16 stable=1',
|
||||
'[VoxelForgeCoreIslandTest] pass phase=initial',
|
||||
'[VoxelForgeCoreIslandTest] height_anchor_agreement=PASS',
|
||||
'[VoxelForgeCoreIslandTest] content_anchor=PASS',
|
||||
'[VoxelForgeCoreIslandTest] blueprint_edit=PASS',
|
||||
'[VoxelForgeCoreIslandTest] switch_off_legacy=PASS',
|
||||
'[VoxelForgeCoreIslandTest] pass complete=1',
|
||||
'[VoxelForgePawnSpeedFixture] source=staged_blueprints walk_cm_s=600.000 sprint_cm_s=6000.000'
|
||||
)) {
|
||||
if ($Text.IndexOf($Marker, [StringComparison]::Ordinal) -lt 0) {
|
||||
throw "BuildHost floating-island log is missing '$Marker'. See $FinalLog."
|
||||
}
|
||||
}
|
||||
foreach ($Surface in @('island_top', 'span')) {
|
||||
if ($Text -notmatch ('\[VoxelForgeCoreIslandTest\] capsule_contact=PASS surface=' +
|
||||
[regex]::Escape($Surface) + ' .*collision_ready=1')) {
|
||||
throw "BuildHost island log is missing cooked capsule contact for '$Surface'. See $FinalLog."
|
||||
}
|
||||
}
|
||||
foreach ($Lod in @(0, 1)) {
|
||||
if ($Text -notmatch ('\[VoxelForgeIslandStreaming\] timing lod=' + $Lod + ' kind=.*air .*core_p95_ms=') -or
|
||||
$Text -notmatch ('\[VoxelForgeIslandStreaming\] timing lod=' + $Lod + ' kind=.*(island|mixed|span) .*legacy_p95_ms=')) {
|
||||
throw "BuildHost island log is missing matched air and surface timing at LOD$Lod. See $FinalLog."
|
||||
}
|
||||
}
|
||||
$NewCrashes = @(Get-NewCrashFolders)
|
||||
if ($NewCrashes.Count -gt 0) {
|
||||
throw "New UECC crash folders appeared during the island actor test: $($NewCrashes -join '; ')"
|
||||
}
|
||||
Write-Host "VOXELFORGE_CORE_FLOATING_ISLANDS_PASS manifest=$($ManifestData.content_hash) hashes=standalone water_fixed=1 lod=0,1 workers=1,8,16"
|
||||
Write-Host "Core actor log: $FinalLog"
|
||||
Write-Host "Peak commandlet private bytes sampled: $PeakPrivateBytes"
|
||||
return
|
||||
}
|
||||
if ($HybridFixturesOnly) {
|
||||
foreach ($Fixture in @('corner90', 'doorway', 'riser1m', 'cliff_ledge', 'organic_cave_chamber')) {
|
||||
$FixtureMarker = '\[WorldAssemblerHybridPluginFixture\] name=' +
|
||||
|
||||
Reference in new issue
Block a user