fix(classifier): exact lattice check before a uniform verdict; ceiling cause is NOT false certificates
ParameterRoll's 5 false box verdicts are fixed: fine room-graph intervals are now checked against exact lattice samples before a uniform verdict is accepted, while the SDF bound keeps its conservative lower bound. Lattice sweep 600 tiles / 0 violations; ParameterRoll passes with 9,577 exact lattice leaves and 774 interval disagreements caught. The owner's ceiling holes are NOT explained by this: in his recorded session outer_classifier_mode=0, solid-proof skips were 0, and air-proof skips were outside the strate. The trace points at the far-field sheet system instead: sheet tile L5 (0,1,0) is deliberately empty inside the sheet hole while its bridge tile L4 (0,1,-1) meshed 662 ceiling triangles. Continuous ceiling is NOT verified: every render launch failed (D3D12 driver error, stalls before map load, the 6 GB cap), so the round produced no matched after-render. Cost note: this round used 3.46M tokens on Luna 6 at max, most of it burned on failed render launches. Verification by render is unreliable in this harness; verify ceiling continuity from tile/geometry data instead. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
1 parent
30253f0e89
commit
ea3f0d9a52
7 files changed
+410
-18
No files matched your search
@@ -39,6 +39,8 @@
|
||||
#include "Materials/MaterialParameterCollection.h"
|
||||
#include "Kismet/KismetMaterialLibrary.h"
|
||||
#include "Engine/VolumeTexture.h"
|
||||
#include "Engine/Engine.h"
|
||||
#include "Camera/CameraActor.h"
|
||||
#include "VoxelAtmosphereManager.h"
|
||||
#include "DrawDebugHelpers.h"
|
||||
#include "IImageWrapper.h"
|
||||
@@ -1533,6 +1535,55 @@ void AVoxelWorld::BeginPlay()
|
||||
return;
|
||||
}
|
||||
|
||||
int32 TestRenderDistanceChunks = 0;
|
||||
if (FParse::Value(FCommandLine::Get(), TEXT("voxel.TestRenderDistanceChunks="),
|
||||
TestRenderDistanceChunks)
|
||||
&& TestRenderDistanceChunks > 0)
|
||||
{
|
||||
if (UVoxelSettings* TestSettings = DuplicateObject<UVoxelSettings>(Settings, this))
|
||||
{
|
||||
const int32 AuthoredRenderDistance = Settings->RenderDistanceChunks;
|
||||
TestSettings->RenderDistanceChunks = TestRenderDistanceChunks;
|
||||
Settings = TestSettings;
|
||||
UE_LOG(LogTemp, Display,
|
||||
TEXT("[VoxelForgeTestCeiling] transient_render_distance_chunks=%d authored=%d"),
|
||||
TestRenderDistanceChunks, AuthoredRenderDistance);
|
||||
}
|
||||
}
|
||||
|
||||
int32 TestCeilingView = 0;
|
||||
FParse::Value(FCommandLine::Get(), TEXT("voxel.TestCeilingView="), TestCeilingView);
|
||||
bTestCeilingViewEnabled = TestCeilingView != 0;
|
||||
if (bTestCeilingViewEnabled)
|
||||
{
|
||||
TestCeilingCameraWorldPosition = FVector(10583.003176, 20477.525456, -38442.958976);
|
||||
TestCeilingCameraRotation = FRotator(78.399901, 255.200004, 0.0);
|
||||
FParse::Value(FCommandLine::Get(), TEXT("voxel.TestCeilingCameraX="),
|
||||
TestCeilingCameraWorldPosition.X);
|
||||
FParse::Value(FCommandLine::Get(), TEXT("voxel.TestCeilingCameraY="),
|
||||
TestCeilingCameraWorldPosition.Y);
|
||||
FParse::Value(FCommandLine::Get(), TEXT("voxel.TestCeilingCameraZ="),
|
||||
TestCeilingCameraWorldPosition.Z);
|
||||
FParse::Value(FCommandLine::Get(), TEXT("voxel.TestCeilingCameraPitch="),
|
||||
TestCeilingCameraRotation.Pitch);
|
||||
FParse::Value(FCommandLine::Get(), TEXT("voxel.TestCeilingCameraYaw="),
|
||||
TestCeilingCameraRotation.Yaw);
|
||||
FParse::Value(FCommandLine::Get(), TEXT("voxel.TestCeilingCaptureDelaySeconds="),
|
||||
TestCeilingCaptureDelaySeconds);
|
||||
TestCeilingCaptureDelaySeconds = FMath::Max(TestCeilingCaptureDelaySeconds, 1.0f);
|
||||
TestCeilingViewBeginSeconds = FPlatformTime::Seconds();
|
||||
bHeadlessStreamingTestCenterOverride = true;
|
||||
HeadlessStreamingTestCenterVoxel = WorldToLocalVoxel(TestCeilingCameraWorldPosition);
|
||||
UE_LOG(LogTemp, Display,
|
||||
TEXT("[VoxelForgeTestCeiling] camera_world_cm=(%.3f,%.3f,%.3f) "
|
||||
"camera_rotation=(%.3f,%.3f,%.3f) center_vox=(%.3f,%.3f,%.3f) capture_delay_s=%.1f"),
|
||||
TestCeilingCameraWorldPosition.X, TestCeilingCameraWorldPosition.Y,
|
||||
TestCeilingCameraWorldPosition.Z, TestCeilingCameraRotation.Pitch,
|
||||
TestCeilingCameraRotation.Yaw, TestCeilingCameraRotation.Roll,
|
||||
HeadlessStreamingTestCenterVoxel.X, HeadlessStreamingTestCenterVoxel.Y,
|
||||
HeadlessStreamingTestCenterVoxel.Z, TestCeilingCaptureDelaySeconds);
|
||||
}
|
||||
|
||||
// The owner's current DA_Settings is intentionally a one-strate surface layout, so it cannot
|
||||
// exercise the separate inter-strate traversal regression. The explicit headless crossing
|
||||
// switch uses a transient copy of the authored four-definition corpus; no package is modified
|
||||
@@ -3667,6 +3718,45 @@ void AVoxelWorld::Tick(float DeltaTime)
|
||||
ProcessUnloadQueue();
|
||||
MaybeFinishHeadlessStreamingTest();
|
||||
|
||||
if (bTestCeilingViewEnabled)
|
||||
{
|
||||
UWorld* World = GetWorld();
|
||||
APlayerController* PC = World ? World->GetFirstPlayerController() : nullptr;
|
||||
if (PC && !TestCeilingCamera.IsValid())
|
||||
{
|
||||
FActorSpawnParameters SpawnParams;
|
||||
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
|
||||
ACameraActor* Camera = World->SpawnActor<ACameraActor>(
|
||||
ACameraActor::StaticClass(), TestCeilingCameraWorldPosition,
|
||||
TestCeilingCameraRotation, SpawnParams);
|
||||
if (IsValid(Camera))
|
||||
{
|
||||
TestCeilingCamera = Camera;
|
||||
PC->SetViewTarget(Camera);
|
||||
UE_LOG(LogTemp, Display,
|
||||
TEXT("[VoxelForgeTestCeiling] camera_installed=1 applied_visible_tiles=%llu"),
|
||||
static_cast<unsigned long long>(AppliedVisibleTileCount));
|
||||
}
|
||||
}
|
||||
|
||||
if (TestCeilingCamera.IsValid() && !bTestCeilingCaptureRequested
|
||||
&& AppliedVisibleTileCount >= 16
|
||||
&& FPlatformTime::Seconds() - TestCeilingViewBeginSeconds
|
||||
>= static_cast<double>(TestCeilingCaptureDelaySeconds))
|
||||
{
|
||||
bTestCeilingCaptureRequested = true;
|
||||
const bool bExecSucceeded = GEngine
|
||||
&& GEngine->Exec(World, TEXT("HighResShot 1"));
|
||||
UE_LOG(LogTemp, Display,
|
||||
TEXT("[VoxelForgeTestCeiling] capture_requested=%d elapsed_s=%.3f "
|
||||
"visible_tiles=%llu triangles=%llu"),
|
||||
bExecSucceeded ? 1 : 0,
|
||||
FPlatformTime::Seconds() - TestCeilingViewBeginSeconds,
|
||||
static_cast<unsigned long long>(AppliedVisibleTileCount),
|
||||
static_cast<unsigned long long>(AppliedTriangleCount));
|
||||
}
|
||||
}
|
||||
|
||||
#if ENABLE_DRAW_DEBUG
|
||||
// Density-volume overlay (step 1a): cyan boxes for solid level-0 cells near the player.
|
||||
if (DensityVolume) { DensityVolume->DebugDraw(); }
|
||||
@@ -6068,7 +6158,7 @@ void AVoxelWorld::GenerateTileResult(const FVoxelTileKey& Tile, const FIntVector
|
||||
/ static_cast<double>(WormEligibleSamples)
|
||||
: 0.0;
|
||||
UE_LOG(LogTemp, Display,
|
||||
TEXT("[VoxelForgeTileProfile] tile=(%d,%d,%d) level=%d step=%d cells=%d sheet=%d aborted=%d empty=%d triangles=%d "
|
||||
TEXT("[VoxelForgeTileProfile] tile=(%d,%d,%d) level=%d step=%d cells=%d sheet=%d aborted=%d empty=%d triangles=%d ceiling_triangles=%d "
|
||||
"band=(%d,%d) "
|
||||
"verdict=%d proof=%d air_proof=%d classify=%.6f mesh=%.6f streams=%.6f seconds=%.6f "
|
||||
"cache_build=%.6f evaluation=%.6f "
|
||||
@@ -6089,7 +6179,8 @@ void AVoxelWorld::GenerateTileResult(const FVoxelTileKey& Tile, const FIntVector
|
||||
"worm_skip_rate=%.6f"),
|
||||
Tile.Coord.X, Tile.Coord.Y, Tile.Coord.Z, Tile.Level, Step, Cells,
|
||||
bSheetTile ? 1 : 0, Result.bAborted ? 1 : 0,
|
||||
Result.bEmpty ? 1 : 0, Result.NumTriangles, BandChunkLo, BandChunkHi,
|
||||
Result.bEmpty ? 1 : 0, Result.NumTriangles, Result.NumCeilingTriangles,
|
||||
BandChunkLo, BandChunkHi,
|
||||
ClassifyVerdict, Result.bSealedSolidProof ? 1 : 0,
|
||||
Result.bOutOfLayoutAirProof ? 1 : 0,
|
||||
ClassifySeconds, MeshSeconds, StreamSeconds,
|
||||
@@ -6428,6 +6519,7 @@ void AVoxelWorld::GenerateTileResult(const FVoxelTileKey& Tile, const FIntVector
|
||||
// AND cap in one tile — entirely with the winner's material.)
|
||||
const int32 NumTris = MeshData.Triangles.Num() / 3;
|
||||
Result.NumTriangles = NumTris;
|
||||
Result.NumCeilingTriangles = MeshData.NumCeilingTriangles;
|
||||
Result.bHasCeilingTris = MeshData.NumCeilingTriangles > 0;
|
||||
Result.bHasGroundTris = NumTris > MeshData.NumCeilingTriangles;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user