Fix eye zoom lerp (#19377)
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user