Fix eye zoom lerp (#19377)

This commit is contained in:
metalgearsloth
2023-08-25 14:41:04 +10:00
committed by GitHub
parent a8bac1f91f
commit 1ba517ec84
5 changed files with 57 additions and 61 deletions

View File

@@ -1,11 +1,10 @@
using Content.Shared.Follower.Components; using System.Numerics;
using Content.Shared.Movement.Components; using Content.Shared.Movement.Components;
using Content.Shared.Movement.Systems; using Content.Shared.Movement.Systems;
using JetBrains.Annotations;
using Robust.Client.GameObjects; using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.Physics; using Robust.Client.Physics;
using Robust.Client.Player; using Robust.Client.Player;
using Robust.Shared.Collections;
using Robust.Shared.Timing; using Robust.Shared.Timing;
namespace Content.Client.Eye; namespace Content.Client.Eye;
@@ -15,9 +14,10 @@ public sealed class EyeLerpingSystem : EntitySystem
[Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly SharedMoverController _mover = default!; [Dependency] private readonly SharedMoverController _mover = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
// Convenience variable for for VV. // Convenience variable for for VV.
[ViewVariables] [ViewVariables, UsedImplicitly]
private IEnumerable<LerpingEyeComponent> ActiveEyes => EntityQuery<LerpingEyeComponent>(); private IEnumerable<LerpingEyeComponent> ActiveEyes => EntityQuery<LerpingEyeComponent>();
public override void Initialize() public override void Initialize()
@@ -59,8 +59,14 @@ public sealed class EyeLerpingSystem : EntitySystem
lerpInfo.LastRotation = lerpInfo.TargetRotation; lerpInfo.LastRotation = lerpInfo.TargetRotation;
lerpInfo.ManuallyAdded |= !automatic; lerpInfo.ManuallyAdded |= !automatic;
lerpInfo.TargetZoom = component.Zoom;
lerpInfo.LastZoom = lerpInfo.TargetZoom;
if (component.Eye != null) if (component.Eye != null)
{
component.Eye.Rotation = lerpInfo.TargetRotation; component.Eye.Rotation = lerpInfo.TargetRotation;
component.Eye.Zoom = lerpInfo.TargetZoom;
}
} }
public void RemoveEye(EntityUid uid) public void RemoveEye(EntityUid uid)
@@ -107,9 +113,29 @@ public sealed class EyeLerpingSystem : EntitySystem
{ {
lerpInfo.LastRotation = lerpInfo.TargetRotation; lerpInfo.LastRotation = lerpInfo.TargetRotation;
lerpInfo.TargetRotation = GetRotation(uid, xform); lerpInfo.TargetRotation = GetRotation(uid, xform);
lerpInfo.LastZoom = lerpInfo.TargetZoom;
lerpInfo.TargetZoom = UpdateZoom(uid, frameTime);
} }
} }
private Vector2 UpdateZoom(EntityUid uid, float frameTime, EyeComponent? eye = null, ContentEyeComponent? content = null)
{
if (!Resolve(uid, ref content, ref eye, false))
return Vector2.One;
var diff = content.TargetZoom - eye.Zoom;
if (diff.LengthSquared() < 0.00001f)
{
return content.TargetZoom;
}
var change = diff * 8f * frameTime;
return eye.Zoom + change;
}
/// <summary> /// <summary>
/// Does the eye need to lerp or is its rotation matched. /// Does the eye need to lerp or is its rotation matched.
/// </summary> /// </summary>
@@ -138,7 +164,7 @@ public sealed class EyeLerpingSystem : EntitySystem
// if not tied to a mover then lock it to map / grid // if not tied to a mover then lock it to map / grid
var relative = xform.GridUid ?? xform.MapUid; var relative = xform.GridUid ?? xform.MapUid;
if (relative != null) if (relative != null)
return -Transform(relative.Value).WorldRotation; return -_transform.GetWorldRotation(relative.Value);
return Angle.Zero; return Angle.Zero;
} }
@@ -151,6 +177,19 @@ public sealed class EyeLerpingSystem : EntitySystem
while (query.MoveNext(out var entity, out var lerpInfo, out var eye, out var xform)) while (query.MoveNext(out var entity, out var lerpInfo, out var eye, out var xform))
{ {
// Handle zoom
var zoomDiff = Vector2.Lerp(lerpInfo.LastZoom, lerpInfo.TargetZoom, tickFraction);
if ((zoomDiff - lerpInfo.TargetZoom).Length() < lerpMinimum)
{
eye.Zoom = lerpInfo.TargetZoom;
}
else
{
eye.Zoom = zoomDiff;
}
// Handle Rotation
TryComp<InputMoverComponent>(entity, out var mover); TryComp<InputMoverComponent>(entity, out var mover);
// This needs to be recomputed every frame, as if this is simply the grid rotation, then we need to account for grid angle lerping. // This needs to be recomputed every frame, as if this is simply the grid rotation, then we need to account for grid angle lerping.

View File

@@ -1,3 +1,5 @@
using System.Numerics;
namespace Content.Client.Eye; namespace Content.Client.Eye;
/// <summary> /// <summary>
@@ -16,4 +18,10 @@ public sealed partial class LerpingEyeComponent : Component
[ViewVariables] [ViewVariables]
public Angle TargetRotation; public Angle TargetRotation;
[ViewVariables]
public Vector2 LastZoom;
[ViewVariables]
public Vector2 TargetZoom;
} }

View File

@@ -41,19 +41,4 @@ public sealed class ContentEyeSystem : SharedContentEyeSystem
Fov = value, Fov = value,
}); });
} }
public override void Update(float frameTime)
{
base.Update(frameTime);
var localPlayer = _player.LocalPlayer?.ControlledEntity;
if (!TryComp<ContentEyeComponent>(localPlayer, out var content) ||
!TryComp<EyeComponent>(localPlayer, out var eye))
{
return;
}
UpdateEye(localPlayer.Value, content, eye, frameTime);
}
} }

View File

@@ -1,22 +1,5 @@
using Content.Shared.Movement.Components;
using Content.Shared.Movement.Systems; using Content.Shared.Movement.Systems;
namespace Content.Server.Movement.Systems; namespace Content.Server.Movement.Systems;
public sealed class ContentEyeSystem : SharedContentEyeSystem public sealed class ContentEyeSystem : SharedContentEyeSystem {}
{
public override void Update(float frameTime)
{
base.Update(frameTime);
var query = AllEntityQuery<ContentEyeComponent, SharedEyeComponent>();
while (query.MoveNext(out var uid, out var comp, out var eyeComp))
{
if (eyeComp.Zoom.Equals(comp.TargetZoom))
continue;
UpdateEye(uid, comp, eyeComp, frameTime);
}
}
}

View File

@@ -4,11 +4,9 @@ using Content.Shared.Administration.Managers;
using Content.Shared.Ghost; using Content.Shared.Ghost;
using Content.Shared.Input; using Content.Shared.Input;
using Content.Shared.Movement.Components; using Content.Shared.Movement.Components;
using Robust.Shared.Input;
using Robust.Shared.Input.Binding; using Robust.Shared.Input.Binding;
using Robust.Shared.Players; using Robust.Shared.Players;
using Robust.Shared.Serialization; using Robust.Shared.Serialization;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Generic;
namespace Content.Shared.Movement.Systems; namespace Content.Shared.Movement.Systems;
@@ -78,7 +76,7 @@ public abstract class SharedContentEyeSystem : EntitySystem
return; return;
eye.TargetZoom = ignoreLimits ? zoom : Clamp(zoom, eye); eye.TargetZoom = ignoreLimits ? zoom : Clamp(zoom, eye);
Dirty(eye); Dirty(uid, eye);
} }
private void OnContentZoomRequest(RequestTargetZoomEvent msg, EntitySessionEventArgs args) private void OnContentZoomRequest(RequestTargetZoomEvent msg, EntitySessionEventArgs args)
@@ -100,7 +98,7 @@ public abstract class SharedContentEyeSystem : EntitySystem
if (TryComp<SharedEyeComponent>(player, out var eyeComp)) if (TryComp<SharedEyeComponent>(player, out var eyeComp))
{ {
eyeComp.DrawFov = msg.Fov; eyeComp.DrawFov = msg.Fov;
Dirty(eyeComp); Dirty(player, eyeComp);
} }
} }
@@ -110,24 +108,7 @@ public abstract class SharedContentEyeSystem : EntitySystem
return; return;
component.TargetZoom = eyeComp.Zoom; component.TargetZoom = eyeComp.Zoom;
Dirty(component); Dirty(uid, component);
}
protected void UpdateEye(EntityUid uid, ContentEyeComponent content, SharedEyeComponent eye, float frameTime)
{
var diff = content.TargetZoom - eye.Zoom;
if (diff.LengthSquared() < 0.00001f)
{
eye.Zoom = content.TargetZoom;
Dirty(eye);
return;
}
var change = diff * 8f * frameTime;
eye.Zoom += change;
Dirty(eye);
} }
public void ResetZoom(EntityUid uid, ContentEyeComponent? component = null) public void ResetZoom(EntityUid uid, ContentEyeComponent? component = null)
@@ -142,7 +123,7 @@ public abstract class SharedContentEyeSystem : EntitySystem
component.MaxZoom = value; component.MaxZoom = value;
component.TargetZoom = Clamp(component.TargetZoom, component); component.TargetZoom = Clamp(component.TargetZoom, component);
Dirty(component); Dirty(uid, component);
} }
/// <summary> /// <summary>