fix(ui): gate — no void frames around the login wormhole; vitals icons centered
The login tunnel now covers from the first world-facing frame (the sky-void backdrop can never present pre-tunnel) and holds through an atomic tunnel-to-world swap at reveal completion — the void is structurally unreachable on both edges, pinned by frame-sequence tests across WorldSceneRenderer/WorldRevealCoordinator/LocalPlayerTeleport- Controller/RuntimeWorldTransitState. Vitals detail icons draw at their authored centered offsets in both stacked and side-by-side layouts. Implemented and live-probed by the fix agent; finalized by the lead after the agent parked post-verification (gates re-run green: App 5512/3, Runtime 1747/0). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
2f8c046aba
commit
fdc4fd496d
17 changed files with 649 additions and 66 deletions
|
|
@ -192,6 +192,69 @@ public sealed class RuntimeWorldTransitStateTests
|
|||
Assert.Equal(0, state.Snapshot.InvariantFailureCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LoginMaterialization_ReleasesSimulationBeforeViewportAndCompletion()
|
||||
{
|
||||
// The login mirror of the portal materialization edge: retail's
|
||||
// SmartBox::UseTime @ 0x00455410 blocking_for_cells branch resumes
|
||||
// CObjectMaint/CPhysics when destination cells stop blocking — while
|
||||
// the tunnel is still in front — identically for the initial login.
|
||||
// Without this edge the login world stayed unavailable until
|
||||
// Complete, so the WorldFadeIn second presented an empty world frame
|
||||
// (the 2026-08-17 gate's exit-edge void).
|
||||
var state = new RuntimeWorldTransitState();
|
||||
long generation = state.BeginLoginReveal(OutdoorCell);
|
||||
Assert.True(state.AcknowledgeDestinationReadiness(
|
||||
Ready(generation, OutdoorCell)));
|
||||
|
||||
Assert.True(state.AcknowledgeLoginMaterialized(generation));
|
||||
|
||||
Assert.True(state.IsWorldSimulationAvailable);
|
||||
Assert.True(state.Snapshot.Materialized);
|
||||
Assert.False(state.Snapshot.WorldViewportObserved);
|
||||
Assert.False(state.Snapshot.Completed);
|
||||
// The portal materialization counter counts Kind == Portal only.
|
||||
Assert.Equal(0, state.Snapshot.PortalMaterializationCount);
|
||||
Assert.False(state.AcknowledgeLoginMaterialized(generation));
|
||||
|
||||
Assert.True(state.AcknowledgeWorldViewportVisible(generation));
|
||||
Assert.True(state.Complete(generation));
|
||||
Assert.True(state.Snapshot.Completed);
|
||||
Assert.Equal(0, state.Snapshot.InvariantFailureCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LoginMaterializationBeforeReadiness_IsRejectedWithoutOpeningWorld()
|
||||
{
|
||||
var state = new RuntimeWorldTransitState();
|
||||
long generation = state.BeginLoginReveal(OutdoorCell);
|
||||
|
||||
Assert.False(state.AcknowledgeLoginMaterialized(generation));
|
||||
|
||||
Assert.False(state.IsWorldSimulationAvailable);
|
||||
Assert.False(state.Snapshot.Materialized);
|
||||
Assert.Equal(1, state.Snapshot.InvariantFailureCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LoginMaterialization_RejectsPortalRevealsAndStaleGenerations()
|
||||
{
|
||||
var state = new RuntimeWorldTransitState();
|
||||
long generation = BeginPortal(state, OutdoorCell);
|
||||
Assert.True(state.AcknowledgeDestinationReadiness(
|
||||
Ready(generation, OutdoorCell)));
|
||||
|
||||
// Wrong kind: a portal reveal must ride the sequence-correlated
|
||||
// portal acknowledgement, never the login edge.
|
||||
Assert.False(state.AcknowledgeLoginMaterialized(generation));
|
||||
Assert.False(state.IsWorldSimulationAvailable);
|
||||
|
||||
// Stale/zero generations are rejected without invariant failures.
|
||||
Assert.False(state.AcknowledgeLoginMaterialized(0));
|
||||
Assert.False(state.AcknowledgeLoginMaterialized(generation + 1));
|
||||
Assert.Equal(0, state.Snapshot.InvariantFailureCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void EarlyViewport_IsRejectedWithoutFabricatingVisibility()
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue