fix(streaming): preserve portal destination ownership

Detach old-world spatial ownership atomically, prioritize destination retirement dependencies, and reveal the viewport at the retail transition edge. Give private paperdoll views independent mesh ownership and retain dormant ACE entities so portal revisits preserve server objects without extending active GPU lifetimes.
This commit is contained in:
Erik 2026-07-25 08:35:12 +02:00
parent 2c848d4167
commit 823936ec31
57 changed files with 2551 additions and 324 deletions

View file

@ -452,6 +452,13 @@ script creation. Its canonical materialized view remains stable across pending
landblocks, while a separate visible-only view feeds radar, picking, status, and
targeting. Raw server PhysicsState and the final state produced by retail's
ordered Lighting/NoDraw/Hidden side effects are stored separately.
When retail's 25-second leave-visibility deadline expires, active ownership
still ends completely. The ACE adapter retains only the accepted
`EntitySpawn` in `DormantLiveEntityStore`, because ACE can keep that GUID in
`KnownObjects` and omit a later CreateObject on revisit. A matching landblock
load re-enters the ordinary timestamp- and generation-gated hydration path;
F747, a newer incarnation, or session reset removes the cold snapshot. Dormant
records own no frame-time, physics, render, effect, audio, or GPU resource.
`LiveEntityPresentationController` drains those accepted transitions only after
the renderer/effect owner is ready: Hidden suppresses the retained root's mesh,
collision, interaction, radar, and target eligibility while preserving the
@ -735,9 +742,14 @@ liveness, and spatial reconciliation stop; world-space audio is silenced; UI,
network/event/command delivery, portal presentation, destination streaming, and
readiness continue. Canonical live records remain retained until physical
teardown converges, so quiescence neither reconstructs server identity nor
invents Hidden/UnHide transitions. Full-window and shared-origin retirement
advance only from `StreamingController.Tick` through stable resident and
per-owner entity/stage cursors on the frame's one meter.
invents Hidden/UnHide transitions. A shared-origin recenter atomically removes
the complete old spatial generation and captures one exact receipt per
landblock before the origin changes. Expensive script, physics, render, and GL
release then advances only from `StreamingController.Tick` through stable
per-owner entity/stage cursors on the frame's one meter. Publication remains
fenced only by an older receipt for the same canonical landblock; the active
destination's exact receipt may advance ahead of unrelated cleanup without
reordering the remaining FIFO.
Accepted publication is likewise retained at its exact priority-queue head.
`LandblockPresentationPipeline` meters render, physics, static, building, and
@ -767,9 +779,14 @@ The Slice E connected closeout is recorded in
`WorldRevealCoordinator` is the single App-layer owner of each login or portal
reveal lifetime. It composes the canonical `WorldRevealReadinessBarrier` with
generation-scoped lifecycle observation and the streaming destination
reservation, so begin, preparation, readiness, materialization, world
visibility, completion, cancellation, and reserved capacity cannot be wired
independently. The barrier joins `StreamingController`/`GpuWorldState`
reservation plus a generation-scoped render-resource profile, so begin,
preparation, readiness, materialization, viewport release, protocol completion,
cancellation, and reserved capacity cannot be wired independently. While the
normal world viewport is withheld, mesh and composite upload owners may admit
more small destination items per frame, but retain the ordinary 8 MiB byte,
array, buffer, and mipmap ceilings. The exact profile ends at the retail
portal-to-world viewport swap; it does not reduce the readiness radius or
reveal incomplete content. The barrier joins `StreamingController`/`GpuWorldState`
static-mesh publication, `WbDrawDispatcher` composite-texture warmup, and
`PhysicsEngine` destination residency. Login's sky-only gate and portal-space
transit consume the same predicate; they differ only in presentation. There is
@ -822,6 +839,12 @@ and before retained UI. The shared dispatcher is reset to no world-cell clips
and no world point lights for this pass. Chat, gameplay windows, toolbar,
cursor, and input continue normally above it. The synthetic object never
enters `LiveEntityRuntime`, collision, picking, radar, or server GUID state.
Portal, paperdoll, and creature-appraisal viewports share
`SyntheticEntityMeshReferenceOwner` but own independent leases. World
landblock retirement therefore cannot evict a mesh still used by retained UI.
The paperdoll keeps its last successful private object while the SmartBox
player is temporarily unavailable and clears it only at the character-session
boundary, matching `gmPaperDollUI::RedressCreature`.
`TeleportViewPlaneController` is the App-layer projection adapter for retail
`SmartBox::SetOverrideFovDistance` / `Render::set_vdst`. It captures the active