mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-09-16 15:22:27 +02:00
* Fix warnings in SharedJointSystem * Fix reference to EC TransformComponent method Replaces call to TransformComponent.GetMapUid with SharedTransformSystem.GetMap * Fix obsolete calls in SharedPhysicsSystem.Contacts.cs Fixes a couple calls to obsolete varients of SetAwake and an obsolete call to RegenerateContacts by converting them to their Entity<T> varients * Fix obsolete call in SharedPhysicsSystem.Components.cs Adds one set of parenthesis to convert a 'uid, comp, comp, comp' call to an 'Entity<T, T, T> call. * Removes unused local var Removes an unused list of broadphases that was being allocated in TryCollideRect * One-line fixes in SharedPhysicsSystem.Islands.cs Fixes all of the easy warnings regarding physics island processing, the rest require more complicated changes than a simple argument rearrangement * Fix obsolete method call in SharedMapSystem * Fix a few obsolete ToMap calls in EntityLookup.Queries * Fix calls to obsolete EntityCoordinate methods in SharedMapSystem.Grids * Fix calls to obsolete EntityCoordinate methods in SharedLookupSystem.ComponentQueries * Fix a few obsolete method calls in entity spawning * Fix obsolete method calls in MapLoaderSystem * Fix obsolete method call in GridFixtureSystem * Fix obsolete IsMapInitialized call in SaveMap command * Fix obsolete MapPosition reference in Client.EyeSystem * Fix obsolete EntitySystem.Get<TSystem> references in DebugLightTreeSystem * Fix obsolete EntitySystem.Get<TSystem> reference in DebugEntityLookup command * Fix obsolete method calls in SpriteBoundsOverlay Slightly more complicated than the rest, but it's really just changing an unused dependency over to use SharedTransformSystem * Remove unused IClyde references from controls LineEdit and TextEdit never use their IClyde dependencies and it generates a warning so yeet * Remove use of EntitySystem.Get from lightbb command * Fix DebugDrawingSystem Removes a bunch of unused private IEntityManager vars Also removes an obsolete use of TransformComponent.GetWorldPositionRotation * Removes duplicate position set when splitting grids There's nothing saying why this is this way and the blame looks like it was an oversight when replacing a bit where they set position and then rotation Please, oh Chesterton's Fence, spare me your wrath * Fix obsolete method use in PlacementMode * Fix obsolete method use in Placement Modes * Removes unused local var in gamestate management * Fix unreachable code warnings in gamestate management Use #else sections to make sure they don't complain about being on the wrong side of a throw * Fix obsolete ToMap use in EyeManager * Make InputManager use a sawmill to log * Fix obsolete ContainerManagerComponent method calls in ContainerSystem * Make ClientPrototypeManager use a sawmill for logging * poke tests * Use LocalizedEntityCommands for SpriteBoundsOverlay toggle * Use LocalizedEntityCommands for system toggles --------- Co-authored-by: ElectroJr <leonsfriedrich@gmail.com>
184 lines
5.7 KiB
C#
184 lines
5.7 KiB
C#
using System.Numerics;
|
|
using Robust.Client.UserInterface;
|
|
using Robust.Client.UserInterface.CustomControls;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.Graphics;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Log;
|
|
using Robust.Shared.Map;
|
|
using Robust.Shared.Maths;
|
|
|
|
#nullable enable
|
|
|
|
namespace Robust.Client.Graphics
|
|
{
|
|
/// <inheritdoc />
|
|
public sealed class EyeManager : IEyeManager
|
|
{
|
|
// If you modify this make sure to edit the value in the Robust.Shared.Audio.AudioParams struct default too!
|
|
// No I can't be bothered to make this a shared constant.
|
|
/// <summary>
|
|
/// Default scaling for the projection matrix.
|
|
/// </summary>
|
|
public const int PixelsPerMeter = 32;
|
|
|
|
[Dependency] private readonly IClyde _displayManager = default!;
|
|
[Dependency] private readonly IEntityManager _entityManager = default!;
|
|
[Dependency] private readonly IUserInterfaceManager _uiManager = default!;
|
|
private ISawmill _logMill = default!;
|
|
|
|
// We default to this when we get set to a null eye.
|
|
private readonly FixedEye _defaultEye = new();
|
|
|
|
private IEye? _currentEye;
|
|
|
|
/// <inheritdoc />
|
|
public IEye CurrentEye
|
|
{
|
|
get => _currentEye ?? _defaultEye;
|
|
set
|
|
{
|
|
var old = _currentEye;
|
|
_currentEye = value;
|
|
|
|
_entityManager.EventBus.RaiseEvent(EventSource.Local, new CurrentEyeChangedEvent(old, _currentEye));
|
|
}
|
|
}
|
|
|
|
public IViewportControl MainViewport { get; set; } = default!;
|
|
|
|
public void ClearCurrentEye()
|
|
{
|
|
CurrentEye = _defaultEye;
|
|
}
|
|
|
|
void IEyeManager.Initialize()
|
|
{
|
|
MainViewport = _uiManager.MainViewport;
|
|
_logMill = IoCManager.Resolve<ILogManager>().RootSawmill;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public MapId CurrentMap => CurrentEye.Position.MapId;
|
|
|
|
/// <inheritdoc />
|
|
public Box2 GetWorldViewport()
|
|
{
|
|
return GetWorldViewbounds().CalcBoundingBox();
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public Box2Rotated GetWorldViewbounds()
|
|
{
|
|
// This is an inefficient and roundabout way of geting the viewport.
|
|
// But its a method that shouldn't get used much.
|
|
|
|
var vp = MainViewport as Control;
|
|
var vpSize = vp?.PixelSize ?? _displayManager.ScreenSize;
|
|
|
|
var topRight = ScreenToMap(new Vector2(vpSize.X, 0)).Position;
|
|
var bottomLeft = ScreenToMap(new Vector2(0, vpSize.Y)).Position;
|
|
|
|
// This assumes the main viewports eye and the main eye are the same.
|
|
var rotation = new Angle(CurrentEye.Rotation);
|
|
var center = (bottomLeft + topRight) / 2;
|
|
|
|
var localTopRight = topRight - center;
|
|
var localBotLeft = bottomLeft - center;
|
|
|
|
localTopRight = rotation.RotateVec(localTopRight);
|
|
localBotLeft = rotation.RotateVec(localBotLeft);
|
|
|
|
var bounds = new Box2(localBotLeft, localTopRight).Translated(center);
|
|
|
|
return new Box2Rotated(bounds, -CurrentEye.Rotation, bounds.Center);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public Vector2 WorldToScreen(Vector2 point)
|
|
{
|
|
return MainViewport.WorldToScreen(point);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public void GetScreenProjectionMatrix(out Matrix3x2 projMatrix)
|
|
{
|
|
Matrix3x2 result = default;
|
|
|
|
result.M11 = PixelsPerMeter;
|
|
result.M22 = -PixelsPerMeter;
|
|
|
|
var screenSize = _displayManager.ScreenSize;
|
|
result.M31 = screenSize.X / 2f;
|
|
result.M32 = screenSize.Y / 2f;
|
|
|
|
/* column major
|
|
Sx 0 Tx
|
|
0 Sy Ty
|
|
0 0 1
|
|
*/
|
|
projMatrix = result;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public ScreenCoordinates CoordinatesToScreen(EntityCoordinates point)
|
|
{
|
|
var transformSystem = _entityManager.System<SharedTransformSystem>();
|
|
return MapToScreen(transformSystem.ToMapCoordinates(point));
|
|
}
|
|
|
|
public ScreenCoordinates MapToScreen(MapCoordinates point)
|
|
{
|
|
if (CurrentEye.Position.MapId != point.MapId)
|
|
{
|
|
_logMill.Error($"Attempted to convert map coordinates ({point}) to screen coordinates with an eye on another map ({CurrentEye.Position.MapId})");
|
|
return new(default, WindowId.Invalid);
|
|
}
|
|
|
|
return new(WorldToScreen(point.Position), MainViewport.Window?.Id ?? default);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public MapCoordinates ScreenToMap(ScreenCoordinates point)
|
|
{
|
|
if (_uiManager.MouseGetControl(point) is not IViewportControl viewport)
|
|
return default;
|
|
|
|
return viewport.ScreenToMap(point.Position);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public MapCoordinates ScreenToMap(Vector2 point)
|
|
{
|
|
return MainViewport.ScreenToMap(point);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public MapCoordinates PixelToMap(ScreenCoordinates point)
|
|
{
|
|
if (_uiManager.MouseGetControl(point) is not IViewportControl viewport)
|
|
return default;
|
|
|
|
return viewport.PixelToMap(point.Position);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public MapCoordinates PixelToMap(Vector2 point)
|
|
{
|
|
return MainViewport.PixelToMap(point);
|
|
}
|
|
}
|
|
|
|
public sealed class CurrentEyeChangedEvent : EntityEventArgs
|
|
{
|
|
public IEye? Old { get; }
|
|
public IEye New { get; }
|
|
|
|
public CurrentEyeChangedEvent(IEye? oldEye, IEye newEye)
|
|
{
|
|
Old = oldEye;
|
|
New = newEye;
|
|
}
|
|
}
|
|
}
|