acdream/tests/AcDream.Core.Tests/Rendering/Wb
Erik a2ad5c1ac4 fix(render): Phase A8 — animated entities exempt from stencil-gated outdoor pass
Visual verification of A8 (commit 41c2e67) surfaced a showstopper:
player + NPCs disappeared when the camera entered a building. Root
cause: live server-spawned entities (animated player/NPCs/monsters)
have ParentCellId == null. The EntitySet partition classified them
as "outdoor" and stencil-gated them in the OutdoorOnly pass — so
they only rendered where stencil bit 1 was set (portal silhouettes),
producing partial-body and head-backwards artifacts at doorway
transits and full invisibility everywhere else inside.

Fix: animatedEntityIds overrides the ParentCellId-based partition.
Animated entities always belong in the IndoorOnly pass (stencil OFF),
never in OutdoorOnly. Three changes:
- WalkEntitiesInto full-walk path: compute isAnimated up front, use
  it in both partition checks
- WalkEntitiesInto animated-only path: skip the entire path on
  OutdoorOnly (every iterated entity is animated by definition)
- WalkEntitiesForTest: add optional animatedEntityIds parameter,
  mirror the new partition logic

Two new tests cover:
- EntitySet_IndoorOnly_IncludesAnimatedEntitiesEvenWithNullParentCellId
- EntitySet_OutdoorOnly_ExcludesAnimatedEntities

Known remaining limitation: dropped items / static-but-live objects
have ParentCellId == null AND are NOT in animatedEntityIds, so they
still classify as outdoor scenery and stencil-gate. Addressing this
requires a "live entity" flag on WorldEntity — deferred.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 08:55:45 +02:00
..
AcSurfaceMetadataTableTests.cs phase(N.4): AcSurfaceMetadata side-table for WB-pristine surface props 2026-05-08 13:08:56 +02:00
AnimatedEntityStateTests.cs phase(N.4) Tasks 16+18+19: AnimatedEntityState + AnimPartChange + HiddenParts 2026-05-08 14:37:09 +02:00
AnimPartChangeTests.cs phase(N.4) Tasks 16+18+19: AnimatedEntityState + AnimPartChange + HiddenParts 2026-05-08 14:37:09 +02:00
EntityClassificationCacheTests.cs fix(render #53): key cache by (entityId, landblockHint) to defeat ID collision 2026-05-10 23:02:14 +02:00
EntitySpawnAdapterTests.cs phase(N.4) Task 17: EntitySpawnAdapter for server-spawned per-instance content 2026-05-08 14:46:34 +02:00
HiddenPartsTests.cs phase(N.4) Tasks 16+18+19: AnimatedEntityState + AnimPartChange + HiddenParts 2026-05-08 14:37:09 +02:00
LandblockSpawnAdapterTests.cs phase(N.4) Task 11: LandblockSpawnAdapter (atlas-tier ref-count bridge) 2026-05-08 13:53:38 +02:00
MatrixCompositionTests.cs phase(N.4) Tasks 22+23: WbDrawDispatcher + surface metadata side-table 2026-05-08 15:30:33 +02:00
MeshExtractionConformanceTests.cs test(N.4): conformance tests for mesh extraction + setup flatten 2026-05-08 13:14:36 +02:00
PendingSpawnIntegrationTests.cs phase(N.5): retirement amendment — InstancedMeshRenderer + StaticMeshRenderer + WbFoundationFlag deleted 2026-05-08 22:01:36 +02:00
SetupFlattenConformanceTests.cs test(N.4): conformance tests for mesh extraction + setup flatten 2026-05-08 13:14:36 +02:00
WbDispatcherDepthMaskTests.cs test(A.5 T21): lock in depth-write attribution per translucency kind 2026-05-10 08:27:03 +02:00
WbDrawDispatcherBucketingTests.cs fix(render #53): skip cache populate when classification is incomplete 2026-05-10 23:42:46 +02:00
WbDrawDispatcherEntitySetTests.cs fix(render): Phase A8 — animated entities exempt from stencil-gated outdoor pass 2026-05-26 08:55:45 +02:00
WbDrawDispatcherIndirectBuilderTests.cs phase(N.5) Task 9 fixup: layout assertion + DrawCommandStride const 2026-05-08 20:42:49 +02:00
WbDrawDispatcherTranslucencyTests.cs phase(N.5) Task 11: translucency partition contract test 2026-05-08 20:53:36 +02:00
WbMeshAdapterTests.cs chore(O-T7): code-review housekeeping after WB extraction 2026-05-21 17:29:06 +02:00