diff --git a/Robust.Shared/Physics/Events/StartCollideEvent.cs b/Robust.Shared/Physics/Events/StartCollideEvent.cs index 8f551ddca..0a47f3630 100644 --- a/Robust.Shared/Physics/Events/StartCollideEvent.cs +++ b/Robust.Shared/Physics/Events/StartCollideEvent.cs @@ -1,8 +1,8 @@ using System.Numerics; using Robust.Shared.GameObjects; -using Robust.Shared.Maths; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Dynamics; +using Robust.Shared.Utility; namespace Robust.Shared.Physics.Events; @@ -20,9 +20,13 @@ public readonly struct StartCollideEvent public readonly Fixture OurFixture; public readonly Fixture OtherFixture; - public readonly Vector2 WorldPoint; - public StartCollideEvent( + internal readonly FixedArray2 _worldPoints; + + public readonly int PointCount; + public Vector2[] WorldPoints => _worldPoints.AsSpan[..PointCount].ToArray(); + + internal StartCollideEvent( EntityUid ourEntity, EntityUid otherEntity, string ourFixtureId, @@ -31,7 +35,8 @@ public readonly struct StartCollideEvent Fixture otherFixture, PhysicsComponent ourBody, PhysicsComponent otherBody, - Vector2 worldPoint) + FixedArray2 worldPoints, + int pointCount) { OurEntity = ourEntity; OtherEntity = otherEntity; @@ -39,8 +44,9 @@ public readonly struct StartCollideEvent OtherFixtureId = otherFixtureId; OurFixture = ourFixture; OtherFixture = otherFixture; - WorldPoint = worldPoint; OtherBody = otherBody; OurBody = ourBody; + _worldPoints = worldPoints; + PointCount = pointCount; } } diff --git a/Robust.Shared/Physics/Systems/SharedPhysicsSystem.Contacts.cs b/Robust.Shared/Physics/Systems/SharedPhysicsSystem.Contacts.cs index 528192a58..62734e404 100644 --- a/Robust.Shared/Physics/Systems/SharedPhysicsSystem.Contacts.cs +++ b/Robust.Shared/Physics/Systems/SharedPhysicsSystem.Contacts.cs @@ -551,7 +551,7 @@ public abstract partial class SharedPhysicsSystem } var status = ArrayPool.Shared.Rent(index); - var worldPoints = ArrayPool.Shared.Rent(index); + var worldPoints = ArrayPool>.Shared.Rent(index); // Update contacts all at once. BuildManifolds(contacts, index, status, worldPoints); @@ -587,8 +587,8 @@ public abstract partial class SharedPhysicsSystem var uidB = contact.EntityB; var worldPoint = worldPoints[i]; - var ev1 = new StartCollideEvent(uidA, uidB, contact.FixtureAId, contact.FixtureBId, fixtureA, fixtureB, bodyA, bodyB, worldPoint); - var ev2 = new StartCollideEvent(uidB, uidA, contact.FixtureBId, contact.FixtureAId, fixtureB, fixtureA, bodyB, bodyA, worldPoint); + var ev1 = new StartCollideEvent(uidA, uidB, contact.FixtureAId, contact.FixtureBId, fixtureA, fixtureB, bodyA, bodyB, worldPoint, contact.Manifold.PointCount); + var ev2 = new StartCollideEvent(uidB, uidA, contact.FixtureBId, contact.FixtureAId, fixtureB, fixtureA, bodyB, bodyA, worldPoint, contact.Manifold.PointCount); RaiseLocalEvent(uidA, ref ev1, true); RaiseLocalEvent(uidB, ref ev2, true); @@ -626,10 +626,10 @@ public abstract partial class SharedPhysicsSystem ArrayPool.Shared.Return(contacts); ArrayPool.Shared.Return(status); - ArrayPool.Shared.Return(worldPoints); + ArrayPool>.Shared.Return(worldPoints); } - private void BuildManifolds(Contact[] contacts, int count, ContactStatus[] status, Vector2[] worldPoints) + private void BuildManifolds(Contact[] contacts, int count, ContactStatus[] status, FixedArray2[] worldPoints) { if (count == 0) return; @@ -672,7 +672,7 @@ public abstract partial class SharedPhysicsSystem public Contact[] Contacts; public ContactStatus[] Status; - public Vector2[] WorldPoints; + public FixedArray2[] WorldPoints; public bool[] Wake; public void Execute(int index) @@ -681,7 +681,7 @@ public abstract partial class SharedPhysicsSystem } } - private void UpdateContact(Contact[] contacts, int index, ContactStatus[] status, bool[] wake, Vector2[] worldPoints) + private void UpdateContact(Contact[] contacts, int index, ContactStatus[] status, bool[] wake, FixedArray2[] worldPoints) { var contact = contacts[index]; @@ -706,7 +706,9 @@ public abstract partial class SharedPhysicsSystem if (contactStatus == ContactStatus.StartTouching) { - worldPoints[index] = Physics.Transform.Mul(bodyATransform, contacts[index].Manifold.LocalPoint); + var points = new FixedArray2(); + contact.GetWorldManifold(bodyATransform, bodyBTransform, out _, points.AsSpan); + worldPoints[index] = points; } }