From 3b44a4493100038fb71c09a04c831e4ee0f8cb3b Mon Sep 17 00:00:00 2001
From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Date: Wed, 21 Sep 2022 10:12:44 +1000
Subject: [PATCH] Fix eye lerping stuttering (#11428)
---
Content.Client/Eye/EyeLerpingSystem.cs | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/Content.Client/Eye/EyeLerpingSystem.cs b/Content.Client/Eye/EyeLerpingSystem.cs
index 837f923ec8..d1af9a211b 100644
--- a/Content.Client/Eye/EyeLerpingSystem.cs
+++ b/Content.Client/Eye/EyeLerpingSystem.cs
@@ -87,7 +87,7 @@ public sealed class EyeLerpingSystem : EntitySystem
foundEyes.Add(entity);
moverQuery.TryGetComponent(entity, out var mover);
xformQuery.TryGetComponent(entity, out var xform);
- lerpInfo.LastRotation = eye.Rotation;
+ lerpInfo.LastRotation = lerpInfo.TargetRotation;
lerpInfo.TargetRotation = GetRotation(xformQuery, mover, xform);
if (xform != null)
@@ -109,6 +109,20 @@ public sealed class EyeLerpingSystem : EntitySystem
}
}
+ ///
+ /// Does the eye need to lerp or is its rotation matched.
+ ///
+ private bool NeedsLerp(EntityUid uid, InputMoverComponent? mover = null)
+ {
+ if (mover == null)
+ return true;
+
+ if (mover.RelativeRotation.Equals(mover.TargetRelativeRotation))
+ return false;
+
+ return true;
+ }
+
private Angle GetRotation(EntityQuery xformQuery, InputMoverComponent? mover = null, TransformComponent? xform = null)
{
// If we can move then tie our eye to our inputs (these also get lerped so it should be fine).
@@ -160,12 +174,19 @@ public sealed class EyeLerpingSystem : EntitySystem
{
var tickFraction = (float) _gameTiming.TickFraction / ushort.MaxValue;
const double lerpMinimum = 0.00001;
+ var xformQuery = GetEntityQuery();
foreach (var (eye, entity) in GetEyes())
{
if (!_activeEyes.TryGetValue(entity, out var lerpInfo))
continue;
+ if (TryComp(entity, out var mover) && !NeedsLerp(entity, mover))
+ {
+ eye.Rotation = GetRotation(xformQuery, mover);
+ continue;
+ }
+
var shortest = Angle.ShortestDistance(lerpInfo.LastRotation, lerpInfo.TargetRotation);
if (Math.Abs(shortest.Theta) < lerpMinimum)