From ec5f07b3725ded4adabe4fc9878bc49d892444e3 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 4 Jan 2023 19:18:53 +1100 Subject: [PATCH] Purge IPhysicsManager (#3652) --- RELEASE-NOTES.md | 2 +- Robust.Client/ClientIoC.cs | 2 +- Robust.Client/Debugging/DebugPhysicsSystem.cs | 11 ++- Robust.Server/ServerIoC.cs | 1 - .../Physics/Dynamics/Contacts/Contact.cs | 26 ++---- Robust.Shared/Physics/PhysicsManager.cs | 88 ------------------- .../Systems/SharedPhysicsSystem.Contacts.cs | 45 +++++----- .../Physics/Systems/SharedPhysicsSystem.cs | 2 - .../Server/RobustServerSimulation.cs | 1 - 9 files changed, 42 insertions(+), 136 deletions(-) delete mode 100644 Robust.Shared/Physics/PhysicsManager.cs diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index ef143e57a..80e4de663 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -51,7 +51,7 @@ END TEMPLATE--> ### Internal -*None yet* +* IPhysManager has been removed for a slight physics contacts optimisation. ## 0.78.0.0 diff --git a/Robust.Client/ClientIoC.cs b/Robust.Client/ClientIoC.cs index 721474915..a0bc93c46 100644 --- a/Robust.Client/ClientIoC.cs +++ b/Robust.Client/ClientIoC.cs @@ -89,7 +89,7 @@ namespace Robust.Client deps.Register(); deps.Register(); deps.Register(); - deps.Register(); + switch (mode) { case GameController.DisplayMode.Headless: diff --git a/Robust.Client/Debugging/DebugPhysicsSystem.cs b/Robust.Client/Debugging/DebugPhysicsSystem.cs index 8d1ef2798..1c221b664 100644 --- a/Robust.Client/Debugging/DebugPhysicsSystem.cs +++ b/Robust.Client/Debugging/DebugPhysicsSystem.cs @@ -74,11 +74,11 @@ namespace Robust.Client.Debugging * Used for debugging shapes, controllers, joints, contacts */ - [Dependency] private readonly IPhysicsManager _physicsManager = default!; - private const int MaxContactPoints = 2048; internal int PointCount; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + internal ContactPoint[] Points = new ContactPoint[MaxContactPoints]; public PhysicsDebugFlags Flags @@ -119,7 +119,8 @@ namespace Robust.Client.Debugging if (manifold.PointCount == 0) return; - Fixture fixtureA = contact.FixtureA!; + var fixtureA = contact.FixtureA!; + var fixtureB = contact.FixtureB!; var state1 = new PointState[2]; var state2 = new PointState[2]; @@ -127,7 +128,9 @@ namespace Robust.Client.Debugging CollisionManager.GetPointStates(ref state1, ref state2, oldManifold, manifold); Span points = stackalloc Vector2[2]; - contact.GetWorldManifold(_physicsManager, out var normal, points); + var transformA = _physics.GetPhysicsTransform(fixtureA.Body.Owner); + var transformB = _physics.GetPhysicsTransform(fixtureB.Body.Owner); + contact.GetWorldManifold(transformA, transformB, out var normal, points); ContactPoint cp = Points[PointCount]; for (var i = 0; i < manifold.PointCount && PointCount < MaxContactPoints; ++i) diff --git a/Robust.Server/ServerIoC.cs b/Robust.Server/ServerIoC.cs index 45d0cf9df..98f16a221 100644 --- a/Robust.Server/ServerIoC.cs +++ b/Robust.Server/ServerIoC.cs @@ -79,7 +79,6 @@ namespace Robust.Server deps.Register(); deps.Register(); deps.Register(); - deps.Register(); deps.Register(); deps.Register(); deps.Register(); diff --git a/Robust.Shared/Physics/Dynamics/Contacts/Contact.cs b/Robust.Shared/Physics/Dynamics/Contacts/Contact.cs index 8b93cff79..46ff8693c 100644 --- a/Robust.Shared/Physics/Dynamics/Contacts/Contact.cs +++ b/Robust.Shared/Physics/Dynamics/Contacts/Contact.cs @@ -131,16 +131,12 @@ namespace Robust.Shared.Physics.Dynamics.Contacts /// /// Gets the world manifold. /// - public void GetWorldManifold(IPhysicsManager physicsManager, out Vector2 normal, Span points) + public void GetWorldManifold(Transform transformA, Transform transformB, out Vector2 normal, Span points) { - PhysicsComponent bodyA = FixtureA?.Body!; - PhysicsComponent bodyB = FixtureB?.Body!; - IPhysShape shapeA = FixtureA?.Shape!; - IPhysShape shapeB = FixtureB?.Shape!; - var bodyATransform = physicsManager.EnsureTransform(bodyA); - var bodyBTransform = physicsManager.EnsureTransform(bodyB); + var shapeA = FixtureA?.Shape!; + var shapeB = FixtureB?.Shape!; - SharedPhysicsSystem.InitializeManifold(ref Manifold, bodyATransform, bodyBTransform, shapeA.Radius, shapeB.Radius, out normal, points); + SharedPhysicsSystem.InitializeManifold(ref Manifold, transformA, transformB, shapeA.Radius, shapeB.Radius, out normal, points); } /// @@ -149,11 +145,8 @@ namespace Robust.Shared.Physics.Dynamics.Contacts /// /// Whether we should wake the bodies due to touching changing. /// What current status of the contact is (e.g. start touching, end touching, etc.) - internal ContactStatus Update(IPhysicsManager physicsManager, out bool wake) + internal ContactStatus Update(Transform bodyATransform, Transform bodyBTransform, out bool wake) { - PhysicsComponent bodyA = FixtureA!.Body; - PhysicsComponent bodyB = FixtureB!.Body; - var oldManifold = Manifold; // Re-enable this contact. @@ -163,16 +156,13 @@ namespace Robust.Shared.Physics.Dynamics.Contacts var wasTouching = IsTouching; wake = false; - var sensor = !(FixtureA.Hard && FixtureB.Hard); - - var bodyATransform = physicsManager.GetTransform(bodyA); - var bodyBTransform = physicsManager.GetTransform(bodyB); + var sensor = !(FixtureA!.Hard && FixtureB!.Hard); // Is this contact a sensor? if (sensor) { - var shapeA = FixtureA.Shape; - var shapeB = FixtureB.Shape; + var shapeA = FixtureA!.Shape; + var shapeB = FixtureB!.Shape; touching = _manifoldManager.TestOverlap(shapeA, ChildIndexA, shapeB, ChildIndexB, bodyATransform, bodyBTransform); // Sensors don't generate manifolds. diff --git a/Robust.Shared/Physics/PhysicsManager.cs b/Robust.Shared/Physics/PhysicsManager.cs deleted file mode 100644 index 9c2cbfa56..000000000 --- a/Robust.Shared/Physics/PhysicsManager.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System.Collections.Generic; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Physics.Components; - -namespace Robust.Shared.Physics -{ - public interface IPhysicsManager - { - /// - /// Clear all of the cached transforms. - /// - void ClearTransforms(); - - public Transform EnsureTransform(PhysicsComponent body); - - public Transform EnsureTransform(EntityUid uid); - - public void SetTransform(EntityUid uid, Transform transform); - - public Transform UpdateTransform(EntityUid uid); - - /// - /// Get a cached transform for physics use. - /// - public Transform GetTransform(PhysicsComponent body); - } - - public sealed class PhysicsManager : IPhysicsManager - { - [Dependency] private readonly IEntityManager _entManager = default!; - - private Dictionary _transforms = new(64); - - private Transform GetPhysicsTransform(EntityUid uid) - { - var xformComp = _entManager.GetComponent(uid); - var (worldPos, worldRot) = xformComp.GetWorldPositionRotation(); - - return new(worldPos, (float) worldRot.Theta); - } - - /// - public void ClearTransforms() - { - _transforms.Clear(); - } - - public Transform EnsureTransform(PhysicsComponent body) - { - return EnsureTransform((body).Owner); - } - - public Transform EnsureTransform(EntityUid uid) - { - if (!_transforms.TryGetValue(uid, out var transform)) - { - transform = GetPhysicsTransform(uid); - _transforms[uid] = transform; - } - - return transform; - } - - public void SetTransform(EntityUid uid, Transform transform) - { - _transforms[uid] = transform; - } - - public Transform UpdateTransform(EntityUid uid) - { - var xform = GetPhysicsTransform(uid); - _transforms[uid] = xform; - return xform; - } - - /// - public Transform GetTransform(PhysicsComponent body) - { - return _transforms[body.Owner]; - } - - public Transform GetTransform(EntityUid uid) - { - return _transforms[uid]; - } - } -} diff --git a/Robust.Shared/Physics/Systems/SharedPhysicsSystem.Contacts.cs b/Robust.Shared/Physics/Systems/SharedPhysicsSystem.Contacts.cs index da242fbae..06f01ac4c 100644 --- a/Robust.Shared/Physics/Systems/SharedPhysicsSystem.Contacts.cs +++ b/Robust.Shared/Physics/Systems/SharedPhysicsSystem.Contacts.cs @@ -30,9 +30,11 @@ using System; using System.Buffers; using System.Collections.Generic; +using System.Runtime.InteropServices.JavaScript; using System.Threading.Tasks; using Microsoft.Extensions.ObjectPool; using Robust.Shared.GameObjects; +using Robust.Shared.Maths; using Robust.Shared.Physics.Collision; using Robust.Shared.Physics.Collision.Shapes; using Robust.Shared.Physics.Components; @@ -420,22 +422,10 @@ public abstract partial class SharedPhysicsSystem } var status = ArrayPool.Shared.Rent(index); - - // To avoid race conditions with the dictionary we'll cache all of the transforms up front. - // Caching should provide better perf than multi-threading the GetTransform() as we can also re-use - // these in PhysicsIsland as well. - for (var i = 0; i < index; i++) - { - var contact = contacts[i]; - var bodyA = contact.FixtureA!.Body; - var bodyB = contact.FixtureB!.Body; - - _physicsManager.EnsureTransform(bodyA.Owner); - _physicsManager.EnsureTransform(bodyB.Owner); - } + var worldPoints = ArrayPool.Shared.Rent(index); // Update contacts all at once. - BuildManifolds(contacts, index, status); + BuildManifolds(contacts, index, status, worldPoints); // Single-threaded so content doesn't need to worry about race conditions. for (var i = 0; i < index; i++) @@ -452,7 +442,7 @@ public abstract partial class SharedPhysicsSystem var fixtureB = contact.FixtureB!; var bodyA = fixtureA.Body; var bodyB = fixtureB.Body; - var worldPoint = Physics.Transform.Mul(_physicsManager.EnsureTransform(bodyA), contact.Manifold.LocalPoint); + var worldPoint = worldPoints[i]; var ev1 = new StartCollideEvent(fixtureA, fixtureB, worldPoint); var ev2 = new StartCollideEvent(fixtureB, fixtureA, worldPoint); @@ -491,9 +481,10 @@ public abstract partial class SharedPhysicsSystem ArrayPool.Shared.Return(contacts); ArrayPool.Shared.Return(status); + ArrayPool.Shared.Return(worldPoints); } - private void BuildManifolds(Contact[] contacts, int count, ContactStatus[] status) + private void BuildManifolds(Contact[] contacts, int count, ContactStatus[] status, Vector2[] worldPoints) { var wake = ArrayPool.Shared.Rent(count); @@ -505,13 +496,13 @@ public abstract partial class SharedPhysicsSystem { var start = i * ContactsPerThread; var end = Math.Min(start + ContactsPerThread, count); - UpdateContacts(contacts, start, end, status, wake); + UpdateContacts(contacts, start, end, status, wake, worldPoints); }); } else { - UpdateContacts(contacts, 0, count, status, wake); + UpdateContacts(contacts, 0, count, status, wake, worldPoints); } // Can't do this during UpdateContacts due to IoC threading issues. @@ -531,11 +522,25 @@ public abstract partial class SharedPhysicsSystem ArrayPool.Shared.Return(wake); } - private void UpdateContacts(Contact[] contacts, int start, int end, ContactStatus[] status, bool[] wake) + private void UpdateContacts(Contact[] contacts, int start, int end, ContactStatus[] status, bool[] wake, Vector2[] worldPoints) { + var xformQuery = GetEntityQuery(); + for (var i = start; i < end; i++) { - status[i] = contacts[i].Update(_physicsManager, out wake[i]); + var contact = contacts[i]; + var uidA = contact.FixtureA!.Body.Owner; + var uidB = contact.FixtureB!.Body.Owner; + var bodyATransform = GetPhysicsTransform(uidA, xformQuery.GetComponent(uidA), xformQuery); + var bodyBTransform = GetPhysicsTransform(uidB, xformQuery.GetComponent(uidB), xformQuery); + + var contactStatus = contact.Update(bodyATransform, bodyBTransform, out wake[i]); + status[i] = contactStatus; + + if (contactStatus == ContactStatus.StartTouching) + { + worldPoints[i] = Physics.Transform.Mul(bodyATransform, contacts[i].Manifold.LocalPoint); + } } } diff --git a/Robust.Shared/Physics/Systems/SharedPhysicsSystem.cs b/Robust.Shared/Physics/Systems/SharedPhysicsSystem.cs index 4128ef089..19c68d66e 100644 --- a/Robust.Shared/Physics/Systems/SharedPhysicsSystem.cs +++ b/Robust.Shared/Physics/Systems/SharedPhysicsSystem.cs @@ -47,7 +47,6 @@ namespace Robust.Shared.Physics.Systems [Dependency] private readonly IManifoldManager _manifoldManager = default!; [Dependency] protected readonly IMapManager MapManager = default!; [Dependency] private readonly IParallelManager _parallel = default!; - [Dependency] private readonly IPhysicsManager _physicsManager = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly IDependencyCollection _deps = default!; [Dependency] private readonly SharedBroadphaseSystem _broadphase = default!; @@ -328,7 +327,6 @@ namespace Robust.Shared.Physics.Systems } _traversal.ProcessMovement(); - _physicsManager.ClearTransforms(); } } diff --git a/Robust.UnitTesting/Server/RobustServerSimulation.cs b/Robust.UnitTesting/Server/RobustServerSimulation.cs index 4ef791d7d..96f29c485 100644 --- a/Robust.UnitTesting/Server/RobustServerSimulation.cs +++ b/Robust.UnitTesting/Server/RobustServerSimulation.cs @@ -225,7 +225,6 @@ namespace Robust.UnitTesting.Server container.Register(); container.Register(); container.Register(); - container.Register(); container.Register(); container.Register(); container.Register();