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

@ -145,4 +145,62 @@ public class HandleAllCollisionsTests
// dot = -5 < 0 → k = -(-5*1.05) = 5.25 → v.z = -5 + 5.25 = 0.25 (tiny bounce)
Assert.Equal(0.25f, b.Velocity.Z, precision: 3);
}
[Fact]
public void SetPositionTransition_HiddenLandingCallbackRunsBeforeCollisionResponse()
{
var body = Airborne(Vector3.Zero);
int hitGroundCalls = 0;
PhysicsObjUpdate.CommitSetPositionTransition(
body,
inContact: true,
onWalkable: true,
collisionNormalValid: true,
collisionNormal: Vector3.UnitZ,
previousContact: false,
previousOnWalkable: false,
hitGround: () =>
{
hitGroundCalls++;
body.Velocity = new Vector3(0f, 0f, -4f);
});
Assert.Equal(1, hitGroundCalls);
Assert.True(body.InContact);
Assert.True(body.OnWalkable);
// Callback -4 then retail elasticity 0.05 reflection => +0.2.
// Running the callback after collision response would leave -4.
Assert.Equal(0.2f, body.Velocity.Z, precision: 3);
}
[Fact]
public void SetPositionTransition_HiddenWalkOffCallbackRunsBeforeCollisionResponse()
{
var body = Airborne(Vector3.Zero);
body.TransientState = TransientStateFlags.Contact
| TransientStateFlags.OnWalkable;
int leaveGroundCalls = 0;
PhysicsObjUpdate.CommitSetPositionTransition(
body,
inContact: false,
onWalkable: false,
collisionNormalValid: true,
collisionNormal: -Vector3.UnitX,
previousContact: true,
previousOnWalkable: true,
leaveGround: () =>
{
leaveGroundCalls++;
body.Velocity = new Vector3(3f, 0f, 0f);
});
Assert.Equal(1, leaveGroundCalls);
Assert.False(body.InContact);
Assert.False(body.OnWalkable);
// Callback +3 into a -X normal then reflection => -0.15.
// Running the callback after response would leave +3.
Assert.Equal(-0.15f, body.Velocity.X, precision: 3);
}
}