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:
parent
ec1bb19609
commit
6b0472ee32
14 changed files with 1083 additions and 34 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue