fish-station/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoCaptureOverlay.cs

82 lines
3.5 KiB
C#

using System.Numerics;
using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Client.State;
using Robust.Shared.Enums;
using Content.Client.Viewport;
using Robust.Client.UserInterface;
namespace Content.Client._Sunrise.CartridgeLoader.Cartridges;
public sealed class PhotoCaptureOverlay : Overlay
{
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IStateManager _stateManager = default!;
[Dependency] private readonly IEyeManager _eyeManager = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
private readonly SharedTransformSystem _transformSystem;
public override OverlaySpace Space => OverlaySpace.ScreenSpace;
public PhotoCaptureOverlay()
{
IoCManager.InjectDependencies(this);
_transformSystem = _entityManager.System<SharedTransformSystem>();
}
protected override void Draw(in OverlayDrawArgs args)
{
if (_stateManager.CurrentState is not IMainViewportState viewportState)
return;
if (args.Viewport.Eye != _eyeManager.CurrentEye)
return;
var screenHandle = args.ScreenHandle;
var viewportControl = (Control)viewportState.Viewport;
var overlaySystem = _entityManager.System<PhotoOverlaySystem>();
var photoSystem = _entityManager.System<PhotoCartridgeClientSystem>();
var source = overlaySystem.ActiveCameraEntity;
if (source == null || !_entityManager.EntityExists(source.Value))
{
if (_playerManager.LocalSession?.AttachedEntity is not { } player)
return;
source = player;
}
var sourcePos = _transformSystem.GetWorldPosition(source.Value);
var targetPos = photoSystem.GetClampedCapturePosition(source.Value, photoSystem.CaptureDistance);
var targetScreen = _eyeManager.WorldToScreen(targetPos);
var playerScreen = _eyeManager.WorldToScreen(sourcePos);
var offsetScreen = _eyeManager.WorldToScreen(sourcePos + new Vector2(1, 0));
var pixelsPerMeter = (offsetScreen - playerScreen).Length();
if (pixelsPerMeter < 1) return;
var vpRect = viewportControl.GlobalPixelRect;
var size = 3.0f * pixelsPerMeter;
size = Math.Min(size, Math.Min(vpRect.Width, vpRect.Height));
var halfSize = size / 2.0f;
var rect = UIBox2.FromDimensions(targetScreen.X - halfSize, targetScreen.Y - halfSize, size, size);
var color = Color.Black.WithAlpha(0.5f);
screenHandle.DrawRect(new UIBox2(vpRect.Left, vpRect.Top, vpRect.Right, rect.Top), color);
screenHandle.DrawRect(new UIBox2(vpRect.Left, rect.Bottom, vpRect.Right, vpRect.Bottom), color);
screenHandle.DrawRect(new UIBox2(vpRect.Left, rect.Top, rect.Left, rect.Bottom), color);
screenHandle.DrawRect(new UIBox2(rect.Right, rect.Top, vpRect.Right, rect.Bottom), color);
screenHandle.DrawRect(rect, Color.Red.WithAlpha(0.3f), false);
var borderThickness = 2f;
screenHandle.DrawRect(new UIBox2(rect.Left, rect.Top, rect.Right, rect.Top + borderThickness), Color.Red);
screenHandle.DrawRect(new UIBox2(rect.Left, rect.Bottom - borderThickness, rect.Right, rect.Bottom), Color.Red);
screenHandle.DrawRect(new UIBox2(rect.Left, rect.Top, rect.Left + borderThickness, rect.Bottom), Color.Red);
screenHandle.DrawRect(new UIBox2(rect.Right - borderThickness, rect.Top, rect.Right, rect.Bottom), Color.Red);
}
}