feat(physics): port retail complete object frame pipeline

Restore the named-retail object update order across local, remote, static, projectile, animation, shadow, teleport, and effect lifetimes. Separate authoritative root commits from spatial rebucketing, preserve per-owner hook/FIFO ordering, and remove update-path allocations with exact lifecycle and residency gates.

Add deterministic conformance, adversarial lifetime, GUID-reuse, pending-cell, quaternion, timestamp, and allocation coverage. Release build is warning-free and all 6,446 tests pass with five intentional skips; retail, architecture, and adversarial reviews are clean.

Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-20 09:10:31 +02:00
parent 31a0889f08
commit f961d70023
77 changed files with 12513 additions and 1871 deletions

View file

@ -104,6 +104,40 @@ public sealed class ProjectilePhysicsStepperTests
Assert.Equal(50f, body.CachedVelocity.Y, 3);
}
[Fact]
public void SplitQuantum_HoldsBeginFrameAcrossHookSlotThenCommitsCandidate()
{
var (engine, _) = BuildEmptyEngine();
var body = MakeBody(
new Vector3(12f, 10f, 2f),
new Vector3(10f, 0f, 0f));
var stepper = new ProjectilePhysicsStepper(engine);
Vector3 begin = body.Position;
ProjectileQuantumPreparation preparation = stepper.BeginQuantum(
body,
0.1f,
Cell,
ArrowSphere);
Assert.True(preparation.Simulated);
Assert.True(preparation.RequiresTransition);
Assert.Equal(begin, body.Position);
Assert.Equal(begin + Vector3.UnitX, preparation.CandidatePosition);
ProjectileAdvanceResult result = stepper.CompleteQuantum(
body,
preparation,
ArrowSphere,
ProjectileId);
Assert.True(result.Simulated);
Assert.InRange(
Vector3.Distance(begin + Vector3.UnitX, body.Position),
0f,
0.00001f);
}
[Fact]
public void Advance_GravityUsesFinalPhysicsState_NotParsedAcceleration()
{