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

@ -88,6 +88,38 @@ public sealed class AttachmentUpdateOrderTests
Assert.Equal(new Vector3(100f, 2f, 0f), renderedOrigin, new Vector3ToleranceComparer());
}
[Fact]
public void NestedDrawable_InheritsAncestorSuppressionWithoutMutatingOwnState()
{
var root = Entity(1u);
var child = Entity(2u);
var grandchild = Entity(3u);
root.IsDrawVisible = false;
EquippedChildRenderController.ApplyParentDrawVisibility(child, root);
EquippedChildRenderController.ApplyParentDrawVisibility(grandchild, child);
Assert.True(child.IsDrawVisible);
Assert.False(child.IsAncestorDrawVisible);
Assert.True(grandchild.IsDrawVisible);
Assert.False(grandchild.IsAncestorDrawVisible);
root.IsDrawVisible = true;
EquippedChildRenderController.ApplyParentDrawVisibility(child, root);
EquippedChildRenderController.ApplyParentDrawVisibility(grandchild, child);
Assert.True(child.IsAncestorDrawVisible);
Assert.True(grandchild.IsAncestorDrawVisible);
}
private static AcDream.Core.World.WorldEntity Entity(uint id) => new()
{
Id = id,
SourceGfxObjOrSetupId = 0x02000001u,
Position = Vector3.Zero,
Rotation = Quaternion.Identity,
MeshRefs = Array.Empty<AcDream.Core.World.MeshRef>(),
};
[Fact]
public void AncestorTeardownCollectsEntireAttachmentSubtreePostOrder()
{