feat(#188): fading-wall + sliding-door translucency; hold open past animation settle

Lands the fading-secret-door feature and fixes the door "flip-back" that
surfaced while testing it.

#188 — fading-wall doors (e.g. "Pedestal Weak Spot") fade their wall part
out via TransparentPartHook instead of swinging:
  - TranslucencyHookSink consumes TransparentPartHook -> TranslucencyFadeManager
    (per-(entity,part) linear translucency ramp; holds at End frame).
  - WbDrawDispatcher: new per-instance alpha SSBO (binding 7); ClassifyBatches
    takes opacityMultiplier (1 - translucency, per CMaterial::SetTranslucencySimple
    0x005396f0) forcing AlphaBlend; fully-invisible parts skipped.
  - mesh_modern.vert/.frag: binding-7 InstanceAlphaBuf -> vOpacityMultiplier ->
    FragColor.a *= vOpacityMultiplier.
  - Register AP-89: the fade multiplies sampled texture alpha, not a separate
    D3D9 material alpha channel (observably identical for texture-alpha==1 surfaces).

Door flip-back fix (affected BOTH #188 fading walls AND #187 sliding doors): a
door/wall that finished opening holds a single unchanging frame, so the
uncommitted IsEntityCurrentlyMoving cache-bypass narrowing dropped it onto the
Tier-1 static cache -- which only remembers the REST pose + opacity 1.0 --
snapping it visually shut/opaque while physics stayed open. Reverted that
narrowing: every Sequencer entity stays on the per-frame path (live pose + live
fade opacity), the known-good pre-optimization behavior. The per-frame CPU cost
that narrowing chased was a Debug-build artifact -- Release is GPU-bound
(~200 fps in Sawato, measured), so the unconditional add is free where it
matters. Left a code comment barring re-introduction.

Tests: full Core suite green (2649 passed, 2 skipped). Live visual gate PASSED --
both fading-wall and sliding doors hold open.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-07-09 09:17:50 +02:00
parent e2e285b855
commit 3284dd0aed
12 changed files with 625 additions and 14 deletions

View file

@ -34,8 +34,14 @@ namespace AcDream.Core.Physics;
/// (animation-hook frame = damage frame for melee / thrown).
/// </description></item>
/// <item><description>
/// <see cref="TransparentPartHook"/> → #188
/// <c>AcDream.Core.Rendering.TranslucencyHookSink</c> (per-Setup-part
/// translucency ramp; see <c>TranslucencyFadeManager</c>).
/// </description></item>
/// <item><description>
/// <see cref="ReplaceObjectHook"/>,
/// <see cref="TransparentHook"/>,
/// <see cref="TransparentHook"/> (whole-object variant — NOT yet
/// ported, #188 scope was the per-part case only),
/// <see cref="LuminousHook"/>,
/// <see cref="DiffuseHook"/>,
/// <see cref="ScaleHook"/>,
@ -43,7 +49,9 @@ namespace AcDream.Core.Physics;
/// <see cref="SetOmegaHook"/>,
/// <see cref="TextureVelocityHook"/>,
/// <see cref="SetLightHook"/> →
/// GfxObjMesh / renderer state mutations on the target entity.
/// GfxObjMesh / renderer state mutations on the target entity
/// (<see cref="SetLightHook"/> is the one exception already wired,
/// via <c>AcDream.Core.Lighting.LightingHookSink</c>).
/// </description></item>
/// <item><description>
/// <see cref="AnimationDoneHook"/> → UI / controller notifications