feat(vfx): port retail hidden and teleport presentation

Preserve canonical live-object ownership across Hidden transitions and remote teleport placement so effects, collision, streaming, and targeting remain synchronized.
This commit is contained in:
Erik 2026-07-14 14:59:48 +02:00
parent a51ebc66e9
commit 1e98d81448
46 changed files with 4883 additions and 127 deletions

View file

@ -102,6 +102,46 @@ public sealed class WbDrawDispatcherBucketingTests
Assert.Empty(result.ToDraw);
}
[Fact]
public void WalkEntities_NoDrawHiddenOrSuppressedAncestor_SkipsMeshWithoutRemovingEntity()
{
WorldEntity suppressed = MakeEntityWithMesh(7u, Vector3.Zero);
suppressed.IsDrawVisible = false;
var entities = new[] { suppressed };
var entries = new[]
{
new WbDrawDispatcher.LandblockEntry(
0xAAAA_FFFFu,
new Vector3(-10f),
new Vector3(10f),
entities,
BuildById(entities)),
};
var result = WbDrawDispatcher.WalkEntities(
entries,
frustum: null,
neverCullLandblockId: null,
visibleCellIds: null,
animatedEntityIds: new HashSet<uint> { suppressed.Id });
Assert.Equal(0, result.EntitiesWalked);
Assert.Empty(result.ToDraw);
Assert.Same(suppressed, Assert.Single(entries[0].Entities));
suppressed.IsDrawVisible = true;
suppressed.IsAncestorDrawVisible = false;
result = WbDrawDispatcher.WalkEntities(
entries,
frustum: null,
neverCullLandblockId: null,
visibleCellIds: null,
animatedEntityIds: new HashSet<uint> { suppressed.Id });
Assert.Equal(0, result.EntitiesWalked);
Assert.Empty(result.ToDraw);
}
[Fact]
public void WalkEntities_InvisibleLb_AnimatedSet_WalksOnlyAnimatedEntities()
{