checkpoint: preserve user-gated FW closeout fixes

This commit is contained in:
Erik 2026-08-31 08:27:37 +02:00
parent a2f2eb7d78
commit b8befded8b
22 changed files with 1005 additions and 198 deletions

View file

@ -193,6 +193,20 @@ public sealed partial class WbDrawDispatcher
ArgumentNullException.ThrowIfNull(batches);
ArgumentNullException.ThrowIfNull(selectionParts);
// Retail CPhysicsObj::set_nodraw -> CPartArray::SetNoDrawInternal
// removes the PartArray from drawing immediately; logical object,
// cell, script, particle, and eventual DeleteObject lifetimes remain
// independent. The retained render scene expresses that exact edge
// by clearing RenderProjectionFlags.Draw. The pre-FW dispatcher read
// WorldEntity.IsDrawVisible before classifying, but the production
// frame-walk consumes immutable RenderProjectionRecords and therefore
// must honor the equivalent record flag here. Without this gate an
// impacted spell projectile remained visible until ACE's delayed
// DeleteObject five seconds later even though its SetState had already
// set NoDraw.
if ((projection.Flags & RenderProjectionFlags.Draw) == 0)
return;
RenderInstanceCandidate entity =
RenderInstanceCandidate.FromProjection(
in projection,