fix(rendering): port retail shared alpha list

Queue translucent world GfxObj batches and scene particles in one stable far-to-near stream using transformed DAT sort centers, then drain it at retail's landscape and final-world boundaries. Preserve authored blend, cull, lighting, opacity, and adjacent-only batching so particles behind lifestones are composited through the crystal instead of overpainting it.

Release build succeeds and all 5,914 tests pass with five intentional skips.

Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-18 08:14:05 +02:00
parent ec1bb19609
commit 6b0472ee32
14 changed files with 1083 additions and 34 deletions

View file

@ -44,6 +44,45 @@ Copy this block when adding a new issue:
---
## #225 — Scene particles overpaint translucent world objects
**Status:** IN-PROGRESS — implementation complete; connected visual gate pending
**Severity:** MEDIUM
**Filed:** 2026-07-18
**Component:** rendering / world translucency / particles
**Description:** Smoke, candle flames, and other scene particles behind a
translucent lifestone crystal remained fully bright and visible through it.
The crystal itself had the correct DAT translucency, but particles composited
as though no transparent object were in front of them.
**Root cause / status:** `WbDrawDispatcher` finished its transparent object
pass before `ParticleRenderer` began its independent scene-particle pass.
Both paths depth-tested but disabled depth writes, so a later particle behind
the crystal still passed the opaque depth buffer and overpainted the crystal.
Retail makes each emitted particle a `CPhysicsPart`, orders it with ordinary
parts by the transformed GfxObj `sort_center`, and appends delayed surfaces to
one alpha list. acdream now has one frame-scoped `RetailAlphaQueue` shared by
world Wb entities and scene particles, with retail's landscape and final-world
flush boundaries. It preserves DAT blend/cull/lighting state and batches only
adjacent compatible submissions so renderer grouping cannot change the
compositing order.
**Files:** `src/AcDream.App/Rendering/RetailAlphaQueue.cs`;
`src/AcDream.App/Rendering/Wb/WbDrawDispatcher.cs`;
`src/AcDream.App/Rendering/ParticleRenderer.cs`;
`src/AcDream.App/Rendering/RetailPViewRenderer.cs`.
**Research:**
`docs/research/2026-07-18-retail-shared-alpha-list-pseudocode.md`.
**Acceptance:** At a translucent lifestone, smoke or flame behind the crystal
is attenuated by it while an effect in front remains bright. The lifestone's
own transparency, nearby candle/portal particles, indoor/outdoor PView
transitions, paperdoll rendering, and portal-space rendering do not regress.
---
## #224 — Gameplay indicator bar only implemented effect icons
**Status:** IN-PROGRESS