fix(portal): commit destination projection before reveal

Retail installs the destination CObjCell before hidden world simulation resumes. Rebucket the retained local-player projection inside the Place transaction so Hidden/UnHide scripts and particles settle behind the portal viewport instead of firing after reveal. Preserve the existing unloaded-cell scheduler gate and pin the ordering with a cross-landblock placement test.

Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-25 10:32:21 +02:00
parent 1a14812c44
commit 7aa9618136
4 changed files with 173 additions and 1 deletions

View file

@ -1211,7 +1211,7 @@ Passed 2026-07-17: “Yes works.”
## #218 — Portal silhouette pose, destination reveal, and indoor observer snap
**Status:** DONE — 2026-07-21, final two-client observer gate user-confirmed
**Status:** REGRESSION FIX IMPLEMENTED 2026-07-25 — visual re-gate pending
**Severity:** HIGH
**Filed:** 2026-07-16
**Component:** portal VFX / streaming / physics / outbound movement
@ -1263,10 +1263,23 @@ SmartBox projection, matching `SmartBox::RenderNormalMode`/`GameSky::Draw`;
the old fixed 60-degree sky camera exposed the clear/fog background during the
nearly 180-degree exit warp.
A later retained-runtime regression left one half of destination placement
uncommitted: the controller, mesh transform, and authoritative `FullCellId`
advanced, but the local player's live projection remained in its old/pending
GPU bucket. Since retail `CPhysicsObj::update_object @ 0x00515D10` advances
scripts only with a non-null cell, acdream correctly paused the queued Hidden
PES—but for the wrong reason and until after viewport reveal. Connected traces
showed `0x33000331` firing only after the normal world became visible, directly
causing the opaque pop and late purple/action tail. `LocalPlayerTeleportPlacement`
now rebuckets the same retained entity to the resolved destination cell before
spatial reconciliation and before destination simulation resumes. Legitimate
unloaded-cell script pausing remains unchanged.
**Files:** `src/AcDream.Core/Physics/AnimationSequencer.cs`;
`src/AcDream.App/Rendering/GameWindow.cs`;
`src/AcDream.App/Streaming/StreamingController.cs`;
`src/AcDream.App/Streaming/GpuWorldState.cs`;
`src/AcDream.App/Streaming/LocalPlayerTeleportController.cs`;
`src/AcDream.App/Rendering/Wb/LandblockSpawnAdapter.cs`;
`src/AcDream.App/Rendering/Wb/ObjectMeshManager.cs`;
`src/AcDream.App/Rendering/Sky/SkyProjection.cs`;