fix(rendering): restore equipped scene projections on pose
Treat the equipped-child controller's composed-pose callback as the authoritative attached projection presence edge. Portal transit can withdraw presentation while retaining the accepted parent relation, so the first destination pose must register the child again. Release gate: 3,734 App tests / 3 skips; 8,218 complete-solution tests / 5 skips. Co-Authored-By: OpenAI Codex <codex@openai.com>
This commit is contained in:
parent
9fab1feb46
commit
bb1f4a64bf
3 changed files with 48 additions and 1 deletions
|
|
@ -286,6 +286,32 @@ public sealed class LiveRenderProjectionJournalTests
|
|||
Assert.Equal(0, harness.Projections.ProjectionCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ProjectionPoseReady_RecoversCurrentAttachmentAfterPresentationRemoval()
|
||||
{
|
||||
Harness harness = CreateHarness(loadLandblock: true);
|
||||
LiveEntityRecord record = Materialize(
|
||||
harness,
|
||||
Guid,
|
||||
instance: 10,
|
||||
projectionKind: LiveEntityProjectionKind.Attached);
|
||||
Assert.True(harness.Projections.OnEntityReady(
|
||||
LiveEntityReadyCandidate.Capture(record)));
|
||||
harness.Journal.DrainTo(harness.Scene);
|
||||
harness.Projections.OnProjectionRemoved(record.WorldEntity!.Id);
|
||||
harness.Journal.DrainTo(harness.Scene);
|
||||
|
||||
harness.Projections.OnProjectionPoseReady(record.ServerGuid);
|
||||
|
||||
RenderProjectionDelta recovered =
|
||||
Assert.Single(harness.Journal.Pending.ToArray());
|
||||
Assert.Equal(RenderProjectionDeltaKind.Register, recovered.Kind);
|
||||
Assert.Equal(
|
||||
RenderProjectionClass.EquippedChild,
|
||||
recovered.Record.ProjectionClass);
|
||||
Assert.Equal(record.LocalEntityId, recovered.Record.Source.LocalEntityId);
|
||||
}
|
||||
|
||||
private static Harness CreateHarness(bool loadLandblock)
|
||||
{
|
||||
var state = new GpuWorldState();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue