Fix / remove startcollidevent worldpoint (#5936)

Now it's worldpoints because it may not necessarily be 1 pointr and internally we fix the actual points themselves.
This commit is contained in:
metalgearsloth
2025-05-18 03:03:12 +10:00
committed by GitHub
parent bb0e77e937
commit 44180b3ee0
2 changed files with 21 additions and 13 deletions

View File

@@ -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<Vector2> _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<Vector2> 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;
}
}

View File

@@ -551,7 +551,7 @@ public abstract partial class SharedPhysicsSystem
}
var status = ArrayPool<ContactStatus>.Shared.Rent(index);
var worldPoints = ArrayPool<Vector2>.Shared.Rent(index);
var worldPoints = ArrayPool<FixedArray2<Vector2>>.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<Contact>.Shared.Return(contacts);
ArrayPool<ContactStatus>.Shared.Return(status);
ArrayPool<Vector2>.Shared.Return(worldPoints);
ArrayPool<FixedArray2<Vector2>>.Shared.Return(worldPoints);
}
private void BuildManifolds(Contact[] contacts, int count, ContactStatus[] status, Vector2[] worldPoints)
private void BuildManifolds(Contact[] contacts, int count, ContactStatus[] status, FixedArray2<Vector2>[] 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<Vector2>[] 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<Vector2>[] 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<Vector2>();
contact.GetWorldManifold(bodyATransform, bodyBTransform, out _, points.AsSpan);
worldPoints[index] = points;
}
}