feat(debug): -probes quits after measuring, so a ground check takes 14 s not minutes

The ground measurement was the slowest part of every iteration: the game ran until the shell's
timeout because nothing told it to stop. -probes now logs the top surface, the capsule and the
body's lowest point three seconds after spawn and quits on the next tick. A run went from minutes
to 13.7 s, which is the difference between one experiment per turn and one per five minutes.

Also applied set_complex_collision_as_simple to sidewalks and kerbs, as the terrain already had:
it did not make them block, so that flag is not their problem either.

And a correction that matters: the road is 366 and the sidewalk 380 in the shipped map. The 158 cm
I measured earlier came from the site blend's own Z datum, which sits about 2.2 m below the map's
because the terrain was added after that blend was written. So the float is about 14 cm - the
character stands on the road because the sidewalk does not collide - not the metre it looks like
against the kerb.
This commit is contained in:
zwitschi committed 2026-11-09 18:15:17 +01:00
1 parent 1916321761
commit e50f620aa3
84 files changed
+171 -142

No files matched your search

@@ -344,6 +344,10 @@ void AGigLineCharacter::BeginPlay()
// Visibility trace reports ground at 366, so at least one channel is seeing a different
// surface than the one under foot. This names the actor and the Z for each channel.
// Foot-contact probe runs from Tick three seconds after spawn — see LogFootProbes().
// `-probes` runs the ground probes and then quits: the measurements fire three seconds
// after spawn, so a run needs seconds, not minutes. Without the switch the game keeps
// running for the capture pipeline.
bProbeAndQuit = FParse::Param(FCommandLine::Get(), TEXT("probes"));
FootProbeDelay = 3.0f;
bWalkForever = FParse::Param(FCommandLine::Get(), TEXT("walk"));
@@ -1041,6 +1045,17 @@ void AGigLineCharacter::Tick(float DeltaSeconds)
if (FootProbeDelay <= 0.f)
{
LogFootProbes();
if (bProbeAndQuit && GetWorld())
{
// One frame later, so the log lines are flushed before the process exits.
GetWorld()->GetTimerManager().SetTimerForNextTick([this]()
{
if (APlayerController* PC = Cast<APlayerController>(GetController()))
{
PC->ConsoleCommand(TEXT("quit"));
}
});
}
}
}
@@ -210,6 +210,9 @@ protected:
UPROPERTY()
TObjectPtr<class AStaticMeshActor> CameraTestWall;
/** `-probes`: log the ground measurements, then quit. */
bool bProbeAndQuit = false;
/** Seconds until the foot-contact probe runs; 0 disables it. */
float FootProbeDelay = 0.f;
void LogFootProbes();