Add chain support to TryGetNearest (#4567)

This commit is contained in:
metalgearsloth
2023-11-16 20:40:23 +11:00
committed by GitHub
parent 0b447d9d82
commit 4c85e205b9
2 changed files with 22 additions and 18 deletions

View File

@@ -617,7 +617,7 @@ public partial class SharedPhysicsSystem
if (!Resolve(uid, ref xform))
return new Transform();
xformQuery ??= GetEntityQuery<TransformComponent>();
xformQuery ??= _xformQuery;
var (worldPos, worldRot) = _transform.GetWorldPositionRotation(xform, xformQuery.Value);
return new Transform(worldPos, worldRot);

View File

@@ -7,6 +7,7 @@ using Robust.Shared.IoC;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using Robust.Shared.Physics.Collision;
using Robust.Shared.Physics.Collision.Shapes;
using Robust.Shared.Physics.Components;
using Robust.Shared.Physics.Dynamics;
using Robust.Shared.Utility;
@@ -488,24 +489,28 @@ namespace Robust.Shared.Physics.Systems
if (bodyA.Hard && !fixtureA.Hard)
continue;
DebugTools.Assert(fixtureA.ProxyCount <= 1);
foreach (var fixtureB in managerB.Fixtures.Values)
for (var i = 0; i < fixtureA.Shape.ChildCount; i++)
{
if (bodyB.Hard && !fixtureB.Hard)
continue;
input.ProxyA.Set(fixtureA.Shape, i);
DebugTools.Assert(fixtureB.ProxyCount <= 1);
input.ProxyA.Set(fixtureA.Shape, 0);
input.ProxyB.Set(fixtureB.Shape, 0);
DistanceManager.ComputeDistance(out var output, out _, input);
foreach (var fixtureB in managerB.Fixtures.Values)
{
if (bodyB.Hard && !fixtureB.Hard)
continue;
if (distance < output.Distance)
continue;
for (var j = 0; j < fixtureB.Shape.ChildCount; j++)
{
input.ProxyB.Set(fixtureB.Shape, j);
DistanceManager.ComputeDistance(out var output, out _, input);
pointA = output.PointA;
pointB = output.PointB;
distance = output.Distance;
if (distance < output.Distance)
continue;
pointA = output.PointA;
pointB = output.PointB;
distance = output.Distance;
}
}
}
}
@@ -533,9 +538,8 @@ namespace Robust.Shared.Physics.Systems
return false;
}
var xformQuery = GetEntityQuery<TransformComponent>();
var xfA = GetPhysicsTransform(uidA, xformA, xformQuery);
var xfB = GetPhysicsTransform(uidB, xformB, xformQuery);
var xfA = GetPhysicsTransform(uidA, xformA);
var xfB = GetPhysicsTransform(uidB, xformB);
return TryGetNearest(uidA, uidB, out pointA, out pointB, out distance, xfA, xfB, managerA, managerB, bodyA, bodyB);
}