using System.Collections.Generic;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
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];
}
}
}