Compare commits

...

22 Commits

Author SHA1 Message Date
ElectroJr
591c261ff5 Version: 134.0.0 2023-07-08 12:10:13 -04:00
TemporalOroboros
75f0cf9dd7 Ecs's UserInterfaceComponent. (#4079) 2023-07-09 02:02:28 +10:00
metalgearsloth
bde8c2c6e8 Version: 133.0.0 2023-07-08 14:12:59 +10:00
metalgearsloth
7d1ad527d9 Replace Robust Vector2 with System.Numerics (#4092) 2023-07-08 14:08:26 +10:00
Morb
6da708f285 Fix ContentGetDirectoryEntries (#4162) 2023-07-06 15:28:38 +10:00
Leon Friedrich
f6a5e0ed93 Fix doc comments & typos (#4170) 2023-07-06 15:28:09 +10:00
Leon Friedrich
21534e7568 Block some parent-child collisions (#4171) 2023-07-06 15:26:20 +10:00
Pieter-Jan Briers
e7aa2cbc7d AssetPassPipe can detect and block duplicates. 2023-07-05 23:56:15 +02:00
Pieter-Jan Briers
5ddba87487 ACZ fix edge case with Accept-Encoding header parsing
This could throw if the requester sent specific headers.
2023-07-05 23:55:43 +02:00
metalgearsloth
a69573178f Version: 132.2.0 2023-07-06 00:02:23 +10:00
metalgearsloth
1ac39cc65f Add recursive joint clearing (#4169) 2023-07-06 00:01:04 +10:00
Pieter-Jan Briers
70897b6ea9 Reduce default MTU even more.
Yeah I think this might still be causing issues.
2023-07-02 17:01:17 +02:00
metalgearsloth
e763d59617 Remove some unnecessary EntityQuery<T> and warns (#4167) 2023-07-02 01:12:45 +10:00
metalgearsloth
d4902a9714 Version: 132.1.0 2023-07-01 22:05:39 +10:00
metalgearsloth
23a40e58e4 Pause animations on ent pause (#4117) 2023-07-01 22:02:33 +10:00
Pieter-Jan Briers
e71f1cc8a5 Warning fixes (#4160)
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
2023-07-01 22:02:12 +10:00
metalgearsloth
b82d246988 Fix ComponentTreeSystem warnings (#4164) 2023-07-01 19:23:37 +10:00
metalgearsloth
d309872334 Version: 132.0.1 2023-06-27 20:13:29 +10:00
metalgearsloth
e33c37ed09 Return map first for grid queries (#4161) 2023-06-27 20:09:58 +10:00
ElectroJr
3ee95b1a71 Version: 132.0.0 2023-06-25 16:44:40 -04:00
metalgearsloth
9a4721a3ee Add prototype counts to IPrototypeManager (#4158) 2023-06-26 06:35:21 +10:00
Leon Friedrich
8fd1e9047f Rejig time offset serializer (#4154) 2023-06-26 06:29:45 +10:00
410 changed files with 2559 additions and 2108 deletions

View File

@@ -1,4 +1,4 @@
<Project>
<!-- This file automatically reset by Tools/version.py -->
<!-- This file automatically reset by Tools/version.py -->

View File

@@ -54,6 +54,89 @@ END TEMPLATE-->
*None yet*
## 134.0.0
### Breaking changes
* Several methods were moved out of the `UserInterface` components and into the UI system.
* The BUI constructor arguments have changed and now require an EntityUid to be given instead of a component.
## 133.0.0
### Breaking changes
* Replace Robust's Vector2 with System.Numerics.Vector2.
### New features
* `AssetPassPipe` has a new `CheckDuplicates` property that makes it explicitly check for and drop duplicate asset files passed through.
### Bugfixes
* Static entities that are parented to other entities will no longer collide with their parent.
* Fix some miscellaneous doc comments and typos (e.g. PvsSystem and EntityManager).
* Fix ContentGetDirectoryEntries.
## 132.2.0
### New features
* Add method to clear all joints + relayed joints on an entity.
### Other
* Lower default MTU to `1000`.
### Internal
* Resolved some warnings and unnecessary component resolves.
## 132.1.0
### New features
* `Robust.Shared.Physics.Events.CollisionChangeEvent` now has the `EntityUid` of the physics body.
### Other
* Paused entities now pause their animations. There's no guarantee they'll resume at the same point (use SyncSprite instead).
### Internal
* Fix ComponentTreeSystem warnings.
* Fix some miscellaneous other warnings.
## 132.0.1
### Bugfixes
* Return maps first from FindGridsIntersecting which fixes rendering order issues for grids.
## 132.0.0
### Breaking changes
* TimeOffsetSerializer now always reads & writes zeros unless it is reading/writing an initialized map. EntityPrototypes with TimeOffsetSerializer data-fields need to default to zero.\
* TimeOffsetSerializer now only applies a time offset when reading from yaml, not when copying.
### New features
* Added a function to count the number of prototypes of a given kind. See `IPrototypeManager.Count<T>()`.
### Bugfixes
* Fixed a bug in `IPrototypeManager.EnumerateParents()` that was causing it to not actually return the parent prototypes.
### Other
* Map serialisation will now log errors when saving an uninitialized map that contains initialized entities.
## 131.1.0
### New features

View File

@@ -905,7 +905,7 @@ public class ArchetypeComponentAccessBenchmark
var curLength = array.Length;
if (curLength <= idx.Value)
{
var newLength = MathHelper.NextPowerOfTwo(Math.Max(8, idx.Value));
var newLength = MathHelper.NextPowerOfTwo(System.Math.Max(8, idx.Value));
Array.Resize(ref array, newLength);
}

View File

@@ -1,33 +1,32 @@
using BenchmarkDotNet.Attributes;
using Robust.Shared.Analyzers;
namespace Robust.Benchmarks.NumericsHelpers
namespace Robust.Benchmarks.NumericsHelpers;
[Virtual]
public class AddBenchmark
{
[Virtual]
public class AddBenchmark
[Params(32, 128)]
public int N { get; set; }
[Params(1,2)]
public int T { get; set; }
private float[] _inputA = default!;
private float[] _inputB = default!;
private float[] _output = default!;
[GlobalSetup]
public void Setup()
{
[Params(32, 128)]
public int N { get; set; }
_inputA = new float[N];
_inputB = new float[N];
_output = new float[N];
}
[Params(1,2)]
public int T { get; set; }
private float[] _inputA = default!;
private float[] _inputB = default!;
private float[] _output = default!;
[GlobalSetup]
public void Setup()
{
_inputA = new float[N];
_inputB = new float[N];
_output = new float[N];
}
[Benchmark]
public void Bench()
{
Shared.Maths.NumericsHelpers.Add(_inputA, _inputB, _output);
}
[Benchmark]
public void Bench()
{
Shared.Maths.NumericsHelpers.Add(_inputA, _inputB, _output);
}
}

View File

@@ -25,7 +25,7 @@ namespace Robust.Build.Tasks
Single = ts.GetType("System.Single");
Int32 = ts.GetType("System.Int32");
(Vector2, Vector2ConstructorFull) = GetNumericTypeInfo("Robust.Shared.Maths.Vector2", Single, 2);
(Vector2, Vector2ConstructorFull) = GetNumericTypeInfo("System.Numerics.Vector2", Single, 2);
(Vector2i, Vector2iConstructorFull) = GetNumericTypeInfo("Robust.Shared.Maths.Vector2i", Int32, 2);
(Thickness, ThicknessConstructorFull) = GetNumericTypeInfo("Robust.Shared.Maths.Thickness", Single, 4);

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Client.Input;
using Robust.Client.UserInterface;

View File

@@ -1,7 +1,10 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using Robust.Shared.Animations;
using Robust.Shared.Maths;
using Vector3 = Robust.Shared.Maths.Vector3;
using Vector4 = Robust.Shared.Maths.Vector4;
namespace Robust.Client.Animations
{
@@ -117,7 +120,7 @@ namespace Robust.Client.Animations
switch (a)
{
case Vector2 vector2:
return Vector2.InterpolateCubic((Vector2) preA, vector2, (Vector2) b, (Vector2) postB, t);
return Vector2Helpers.InterpolateCubic((Vector2) preA, vector2, (Vector2) b, (Vector2) postB, t);
case Vector3 vector3:
return Vector3.InterpolateCubic((Vector3) preA, vector3, (Vector3) b, (Vector3) postB, t);
case Vector4 vector4:

View File

@@ -368,15 +368,15 @@ internal sealed partial class MidiManager : IMidiManager
var sourceRelative = pos.Position - _eyeManager.CurrentEye.Position.Position;
var occlusion = 0f;
if (sourceRelative.Length > 0)
if (sourceRelative.Length() > 0)
{
occlusion = _broadPhaseSystem.IntersectRayPenetration(
pos.MapId,
new CollisionRay(
_eyeManager.CurrentEye.Position.Position,
sourceRelative.Normalized,
sourceRelative.Normalized(),
OcclusionCollisionMask),
MathF.Min(sourceRelative.Length, _maxCastLength),
MathF.Min(sourceRelative.Length(), _maxCastLength),
renderer.TrackingEntity);
}

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Client.GameObjects;
using Robust.Shared.ComponentTrees;
using Robust.Shared.GameObjects;
@@ -18,8 +19,9 @@ public sealed class LightTreeSystem : ComponentTreeSystem<LightTreeComponent, Po
{
// Really we should be rotating the light offset by the relative rotation. But I assume the light offset will
// always be relatively small, so fuck it, this is probably faster than having to compute the angle every time.
var radius = entry.Component.Radius + entry.Component.Offset.Length;
return new Box2(pos - radius, pos + radius);
var radius = entry.Component.Radius + entry.Component.Offset.Length();
var radiusVec = new Vector2(radius, radius);
return new Box2(pos - radiusVec, pos + radiusVec);
}
protected override Box2 ExtractAabb(in ComponentTreeEntry<PointLightComponent> entry)

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Client.GameObjects;
using Robust.Shared.ComponentTrees;
using Robust.Shared.GameObjects;

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.UserInterface;
@@ -87,7 +88,7 @@ internal sealed partial class UITestControl
foreach (var e in AddEntries())
{
e.View.Scale = (1, 0.75f);
e.View.Scale = new(1, 0.75f);
e.View.EyeRotation = Angle.FromDegrees(45);
e.View.SpriteOffset = true;
e.View.WorldRotation = null;
@@ -102,9 +103,9 @@ internal sealed partial class UITestControl
foreach (var e in AddEntries())
{
e.View.SetSize = (64, 64);
e.View.SetSize = new(64, 64);
e.View.Stretch = SpriteView.StretchMode.None;
e.View.Scale = (1, 0.75f);
e.View.Scale = new(1, 0.75f);
e.View.EyeRotation = Angle.FromDegrees(45);
e.View.SpriteOffset = true;
e.View.WorldRotation = null;
@@ -119,9 +120,9 @@ internal sealed partial class UITestControl
foreach (var e in AddEntries())
{
e.View.SetSize = (64, 64);
e.View.SetSize = new(64, 64);
e.View.Stretch = SpriteView.StretchMode.Fit;
e.View.Scale = (1, 0.75f);
e.View.Scale = new(1, 0.75f);
e.View.EyeRotation = Angle.FromDegrees(45);
e.View.SpriteOffset = true;
e.View.WorldRotation = null;
@@ -136,9 +137,9 @@ internal sealed partial class UITestControl
foreach (var e in AddEntries())
{
e.View.SetSize = (300, 300);
e.View.SetSize = new(300, 300);
e.View.Stretch = SpriteView.StretchMode.Fill;
e.View.Scale = (1, 0.75f);
e.View.Scale = new(1, 0.75f);
e.View.EyeRotation = Angle.FromDegrees(45);
e.View.SpriteOffset = true;
e.View.WorldRotation = null;
@@ -153,9 +154,9 @@ internal sealed partial class UITestControl
foreach (var e in AddEntries())
{
e.View.SetSize = (300, 300);
e.View.SetSize = new(300, 300);
e.View.Stretch = SpriteView.StretchMode.Fill;
e.View.Scale = (1, 0.75f);
e.View.Scale = new(1, 0.75f);
e.View.EyeRotation = Angle.FromDegrees(45);
}
}
@@ -192,7 +193,7 @@ internal sealed partial class UITestControl
entry = AddEntry("Offset", (e, time) =>
{
e.Sprite.Offset = (MathF.Sin((float) Angle.FromDegrees(time * _degreesPerSecond)), 0);
e.Sprite.Offset = new Vector2(MathF.Sin((float) Angle.FromDegrees(time * _degreesPerSecond)), 0);
e.View.InvalidateMeasure();
});
added.Add(entry);
@@ -200,7 +201,7 @@ internal sealed partial class UITestControl
entry = AddEntry("Scaled", (e, time) =>
{
var theta = (float) Angle.FromDegrees(_degreesPerSecond * time).Theta;
e.Sprite.Scale = Vector2.One + (0.5f * MathF.Sin(theta), 0.5f * MathF.Cos(theta));
e.Sprite.Scale = Vector2.One + new Vector2(0.5f * MathF.Sin(theta), 0.5f * MathF.Cos(theta));
e.View.InvalidateMeasure();
});
added.Add(entry);
@@ -214,8 +215,8 @@ internal sealed partial class UITestControl
entry = AddEntry("Combination", (e, time) =>
{
var theta = (float) Angle.FromDegrees(_degreesPerSecond * time * 2).Theta;
e.Sprite.Scale = Vector2.One + (0.5f * MathF.Sin(theta), 0.5f * MathF.Cos(theta));
e.Sprite.Offset = (MathF.Sin((float) Angle.FromDegrees(time * _degreesPerSecond)), 0);
e.Sprite.Scale = Vector2.One + new Vector2(0.5f * MathF.Sin(theta), 0.5f * MathF.Cos(theta));
e.Sprite.Offset = new(MathF.Sin((float) Angle.FromDegrees(time * _degreesPerSecond)), 0);
e.Sprite.Rotation = Angle.FromDegrees(0.5 * time * _degreesPerSecond);
e.Transform.LocalRotation = Angle.FromDegrees(0.25 * time * _degreesPerSecond);
e.View.InvalidateMeasure();

View File

@@ -89,7 +89,7 @@ Suspendisse hendrerit blandit urna ut laoreet. Suspendisse ac elit at erat males
{
grid.AddChild(new Button
{
MinSize = (50, 50),
MinSize = new(50, 50),
Text = $"{x}, {y}"
});
}
@@ -235,7 +235,7 @@ internal sealed class UITestCommand : LocalizedCommands
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
var window = new DefaultWindow { MinSize = (800, 600) };
var window = new DefaultWindow { MinSize = new(800, 600) };
var control = new UITestControl();
window.OnClose += control.OnClosed;
window.Contents.AddChild(control);

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Immutable;
using System.Numerics;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Shared.Input;

View File

@@ -109,7 +109,7 @@ namespace Robust.Client.Console
public void ReceiveCompletionResponse(MsgScriptCompletionResponse response)
{
Suggestions.SetSuggestions(response);
Suggestions.OpenAt((Position.X + Size.X, Position.Y), (Size.X / 2, Size.Y));
Suggestions.OpenAt(new(Position.X + Size.X, Position.Y), new(Size.X / 2, Size.Y));
}
}
}

View File

@@ -37,7 +37,7 @@ namespace Robust.Client.Console
var mainVBox = new BoxContainer
{
Orientation = LayoutOrientation.Vertical,
MinSize = (500, 300),
MinSize = new(500, 300),
Children =
{
(_watchesVBox = new BoxContainer
@@ -69,7 +69,7 @@ namespace Robust.Client.Console
Contents.AddChild(mainVBox);
SetSize = (300, 300);
SetSize = new(300, 300);
}
private void AddWatch()

View File

@@ -1,4 +1,5 @@
#if DEBUG
using System.Numerics;
using System.Text;
using Robust.Client.Graphics;
using Robust.Client.Input;

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Shared.Enums;
using Robust.Shared.GameObjects;

View File

@@ -47,6 +47,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Client.Input;
using Robust.Client.Player;

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Shared.Enums;
using Robust.Shared.Debugging;

View File

@@ -200,7 +200,7 @@ namespace Robust.Client
// Setup main loop
if (_mainLoop == null)
{
_mainLoop = new GameLoop(_gameTiming, _runtimeLog, _prof)
_mainLoop = new GameLoop(_gameTiming, _runtimeLog, _prof, _logManager.GetSawmill("eng"))
{
SleepMode = displayMode == DisplayMode.Headless ? SleepMode.Delay : SleepMode.None
};

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;

View File

@@ -1,4 +1,5 @@
using Robust.Client.Graphics;
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Shared.Maths;
namespace Robust.Client.GameObjects

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Client.ComponentTrees;
using Robust.Client.Graphics;
using Robust.Shared.Console;

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Numerics;
using System.Text;
using Robust.Client.Graphics;
using Robust.Client.ResourceManagement;
@@ -312,7 +313,7 @@ namespace Robust.Client.GameObjects
public const string LogCategory = "go.comp.sprite";
[ViewVariables(VVAccess.ReadWrite)] public bool IsInert { get; private set; }
[ViewVariables(VVAccess.ReadWrite)] public bool IsInert { get; internal set; }
void ISerializationHooks.AfterDeserialization()
{
@@ -1397,33 +1398,6 @@ namespace Robust.Client.GameObjects
entities.EventBus.RaiseComponentEvent(this, ref ev);
}
internal void DoUpdateIsInert()
{
_inertUpdateQueued = false;
IsInert = true;
foreach (var layer in Layers)
{
// Since StateId is a struct, we can't null-check it directly.
if (!layer.State.IsValid || !layer.Visible || !layer.AutoAnimated || layer.Blank)
{
continue;
}
var rsi = layer.RSI ?? BaseRSI;
if (rsi == null || !rsi.TryGetState(layer.State, out var state))
{
state = GetFallbackState(resourceCache);
}
if (state.IsAnimated)
{
IsInert = false;
break;
}
}
}
[Obsolete("Use SpriteSystem instead.")]
internal static RSI.State GetFallbackState(IResourceCache cache)
{

View File

@@ -1,104 +1,19 @@
using System;
using System.Collections.Generic;
using Robust.Client.Player;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Reflection;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
namespace Robust.Client.GameObjects
{
[RegisterComponent, ComponentReference(typeof(SharedUserInterfaceComponent))]
public sealed class ClientUserInterfaceComponent : SharedUserInterfaceComponent, ISerializationHooks
public sealed class ClientUserInterfaceComponent : SharedUserInterfaceComponent
{
[Dependency] private readonly IReflectionManager _reflectionManager = default!;
[Dependency] private readonly IDynamicTypeFactory _dynamicTypeFactory = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IEntityNetworkManager _netMan = default!;
internal readonly Dictionary<Enum, BoundUserInterface> _openInterfaces =
new();
[ViewVariables]
internal readonly Dictionary<Enum, PrototypeData> _interfaces = new();
[ViewVariables]
public IEnumerable<BoundUserInterface> Interfaces => _openInterfaces.Values;
void ISerializationHooks.AfterDeserialization()
{
_interfaces.Clear();
foreach (var data in _interfaceData)
{
_interfaces[data.UiKey] = data;
}
}
internal void MessageReceived(BoundUIWrapMessage msg)
{
switch (msg.Message)
{
case OpenBoundInterfaceMessage _:
if (_openInterfaces.ContainsKey(msg.UiKey))
{
return;
}
OpenInterface(msg);
break;
case CloseBoundInterfaceMessage _:
Close(msg.UiKey, true);
break;
default:
if (_openInterfaces.TryGetValue(msg.UiKey, out var bi))
{
bi.InternalReceiveMessage(msg.Message);
}
break;
}
}
private void OpenInterface(BoundUIWrapMessage wrapped)
{
var data = _interfaces[wrapped.UiKey];
// TODO: This type should be cached, but I'm too lazy.
var type = _reflectionManager.LooseGetType(data.ClientType);
var boundInterface =
(BoundUserInterface) _dynamicTypeFactory.CreateInstance(type, new object[] {this, wrapped.UiKey});
boundInterface.Open();
_openInterfaces[wrapped.UiKey] = boundInterface;
var playerSession = _playerManager.LocalPlayer?.Session;
if(playerSession != null)
_entityManager.EventBus.RaiseLocalEvent(Owner, new BoundUIOpenedEvent(wrapped.UiKey, Owner, playerSession), true);
}
internal void Close(Enum uiKey, bool remoteCall)
{
if (!_openInterfaces.TryGetValue(uiKey, out var boundUserInterface))
{
return;
}
if (!remoteCall)
SendMessage(new CloseBoundInterfaceMessage(), uiKey);
_openInterfaces.Remove(uiKey);
boundUserInterface.Dispose();
var playerSession = _playerManager.LocalPlayer?.Session;
if(playerSession != null)
_entityManager.EventBus.RaiseLocalEvent(Owner, new BoundUIClosedEvent(uiKey, Owner, playerSession), true);
}
internal void SendMessage(BoundUserInterfaceMessage message, Enum uiKey)
{
_netMan.SendSystemNetworkMessage(new BoundUIWrapMessage(Owner, message, uiKey));
}
public readonly Dictionary<Enum, BoundUserInterface> OpenInterfaces = new();
}
/// <summary>
@@ -106,17 +21,22 @@ namespace Robust.Client.GameObjects
/// </summary>
public abstract class BoundUserInterface : IDisposable
{
protected ClientUserInterfaceComponent Owner { get; }
[Dependency] protected readonly IEntityManager EntMan = default!;
protected readonly UserInterfaceSystem UiSystem = default!;
public readonly Enum UiKey;
public EntityUid Owner { get; }
/// <summary>
/// The last received state object sent from the server.
/// </summary>
protected BoundUserInterfaceState? State { get; private set; }
protected BoundUserInterface(ClientUserInterfaceComponent owner, Enum uiKey)
protected BoundUserInterface(EntityUid owner, Enum uiKey)
{
IoCManager.InjectDependencies(this);
UiSystem = EntMan.System<UserInterfaceSystem>();
Owner = owner;
UiKey = uiKey;
}
@@ -148,7 +68,7 @@ namespace Robust.Client.GameObjects
/// </summary>
public void Close()
{
Owner.Close(UiKey, false);
UiSystem.TryCloseUi(Owner, UiKey);
}
/// <summary>
@@ -156,7 +76,7 @@ namespace Robust.Client.GameObjects
/// </summary>
public void SendMessage(BoundUserInterfaceMessage message)
{
Owner.SendMessage(message, UiKey);
UiSystem.SendUiMessage(this, message);
}
internal void InternalReceiveMessage(BoundUserInterfaceMessage message)

View File

@@ -4,6 +4,7 @@ using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Log;
using Robust.Shared.Utility;
using TerraFX.Interop.Windows;
namespace Robust.Client.GameObjects
{
@@ -11,18 +12,40 @@ namespace Robust.Client.GameObjects
{
private readonly List<AnimationPlayerComponent> _activeAnimations = new();
private EntityQuery<MetaDataComponent> _metaQuery;
[Dependency] private readonly IComponentFactory _compFact = default!;
[Dependency] private readonly ILogManager _logManager = default!;
private ISawmill _sawmill = default!;
public override void Initialize()
{
base.Initialize();
_metaQuery = GetEntityQuery<MetaDataComponent>();
}
public override void FrameUpdate(float frameTime)
{
for (var i = _activeAnimations.Count - 1; i >= 0; i--)
// TODO: Active or something idk.
for (var i = 0; i < _activeAnimations.Count; i++)
{
var anim = _activeAnimations[i];
if (!Update(anim, frameTime)) continue;
var uid = anim.Owner;
if (!_metaQuery.TryGetComponent(uid, out var metadata) ||
metadata.EntityPaused)
{
continue;
}
if (!Update(uid, anim, frameTime))
{
continue;
}
_activeAnimations.RemoveSwap(i);
i--;
anim.HasPlayingAnimation = false;
}
}
@@ -34,16 +57,18 @@ namespace Robust.Client.GameObjects
component.HasPlayingAnimation = true;
}
private bool Update(AnimationPlayerComponent component, float frameTime)
private bool Update(EntityUid uid, AnimationPlayerComponent component, float frameTime)
{
if (component.PlayingAnimationCount == 0 ||
component.Deleted)
{
return true;
}
var remie = new RemQueue<string>();
foreach (var (key, playback) in component.PlayingAnimations)
{
var keep = AnimationPlaybackShared.UpdatePlayback(component.Owner, playback, frameTime);
var keep = AnimationPlaybackShared.UpdatePlayback(uid, playback, frameTime);
if (!keep)
{
remie.Add(key);
@@ -53,7 +78,7 @@ namespace Robust.Client.GameObjects
foreach (var key in remie)
{
component.PlayingAnimations.Remove(key);
EntityManager.EventBus.RaiseLocalEvent(component.Owner, new AnimationCompletedEvent {Uid = component.Owner, Key = key}, true);
EntityManager.EventBus.RaiseLocalEvent(uid, new AnimationCompletedEvent {Uid = uid, Key = key}, true);
component.AnimationComplete(key);
}

View File

@@ -181,7 +181,7 @@ public sealed class AudioSystem : SharedAudioSystem
// Max distance check
var delta = mapPos.Value.Position - listener.Position;
var distance = delta.Length;
var distance = delta.Length();
if (distance > stream.MaxDistance)
{
stream.Source.SetVolumeDirect(0);

View File

@@ -66,11 +66,11 @@ namespace Robust.Client.GameObjects
var map = _eyeManager.CurrentMap;
if (map == MapId.Nullspace) return;
foreach (var treeComp in _trees.GetIntersectingTrees(map, args.WorldBounds))
foreach (var (_, treeComp) in _trees.GetIntersectingTrees(map, args.WorldBounds))
{
foreach (var (light, xform) in treeComp.Tree)
foreach (var entry in treeComp.Tree)
{
var aabb = _lookup.GetWorldAABB(light.Owner, xform);
var aabb = _lookup.GetWorldAABB(entry.Uid, entry.Transform);
if (!aabb.Intersects(args.WorldAABB)) continue;
args.WorldHandle.DrawRect(aabb, Color.Green.WithAlpha(0.1f));

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Shared.Enums;
using Robust.Shared.GameObjects;

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using Robust.Client.GameStates;
using Robust.Client.Input;
using Robust.Client.Player;

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Shared.GameObjects;
using Robust.Shared.Maths;

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using JetBrains.Annotations;
using Robust.Client.ComponentTrees;
using Robust.Client.Graphics;
@@ -91,21 +92,53 @@ namespace Robust.Client.GameObjects
_inertUpdateQueue.Enqueue(sprite);
}
private void DoUpdateIsInert(SpriteComponent component)
{
component._inertUpdateQueued = false;
component.IsInert = true;
foreach (var layer in component.Layers)
{
// Since StateId is a struct, we can't null-check it directly.
if (!layer.State.IsValid || !layer.Visible || !layer.AutoAnimated || layer.Blank)
{
continue;
}
var rsi = layer.RSI ?? component.BaseRSI;
if (rsi == null || !rsi.TryGetState(layer.State, out var state))
{
state = GetFallbackState();
}
if (state.IsAnimated)
{
component.IsInert = false;
break;
}
}
}
/// <inheritdoc />
public override void FrameUpdate(float frameTime)
{
while (_inertUpdateQueue.TryDequeue(out var sprite))
{
sprite.DoUpdateIsInert();
DoUpdateIsInert(sprite);
}
var realtime = _timing.RealTime.TotalSeconds;
var spriteQuery = GetEntityQuery<SpriteComponent>();
var syncQuery = GetEntityQuery<SyncSpriteComponent>();
var metaQuery = GetEntityQuery<MetaDataComponent>();
foreach (var uid in _queuedFrameUpdate)
{
if (!spriteQuery.TryGetComponent(uid, out var sprite))
if (!spriteQuery.TryGetComponent(uid, out var sprite) ||
metaQuery.GetComponent(uid).EntityPaused)
{
continue;
}
if (sprite.IsInert)
continue;

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Shared.GameObjects;
using Robust.Shared.Maths;

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using JetBrains.Annotations;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
@@ -85,7 +86,7 @@ namespace Robust.Client.GameObjects
{
var lerpDest = transform.NextPosition.Value;
var lerpSource = transform.PrevPosition;
var distance = (lerpDest - lerpSource).LengthSquared;
var distance = (lerpDest - lerpSource).LengthSquared();
if (distance is > MinInterpolationDistanceSquared and < MaxInterpolationDistanceSquared)
{

View File

@@ -2,25 +2,40 @@ using JetBrains.Annotations;
using Robust.Client.Player;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Reflection;
using System;
namespace Robust.Client.GameObjects
{
[UsedImplicitly]
public sealed class UserInterfaceSystem : SharedUserInterfaceSystem
{
[Dependency] private readonly IDynamicTypeFactory _dynamicTypeFactory = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IReflectionManager _reflectionManager = default!;
public override void Initialize()
{
base.Initialize();
SubscribeNetworkEvent<BoundUIWrapMessage>(MessageReceived);
SubscribeLocalEvent<ClientUserInterfaceComponent, ComponentInit>(OnUserInterfaceInit);
SubscribeLocalEvent<ClientUserInterfaceComponent, ComponentShutdown>(OnUserInterfaceShutdown);
}
private void OnUserInterfaceInit(EntityUid uid, ClientUserInterfaceComponent component, ComponentInit args)
{
component._interfaces.Clear();
foreach (var data in component._interfaceData)
{
component._interfaces[data.UiKey] = data;
}
}
private void OnUserInterfaceShutdown(EntityUid uid, ClientUserInterfaceComponent component, ComponentShutdown args)
{
foreach (var bui in component.Interfaces)
foreach (var bui in component.OpenInterfaces.Values)
{
bui.Dispose();
}
@@ -29,25 +44,88 @@ namespace Robust.Client.GameObjects
private void MessageReceived(BoundUIWrapMessage ev)
{
var uid = ev.Entity;
if (!EntityManager.TryGetComponent<ClientUserInterfaceComponent>(uid, out var cmp))
if (!TryComp<ClientUserInterfaceComponent>(uid, out var cmp))
return;
var uiKey = ev.UiKey;
var message = ev.Message;
// This should probably not happen at this point, but better make extra sure!
if(_playerManager.LocalPlayer != null)
message.Session = _playerManager.LocalPlayer.Session;
message.Entity = uid;
message.UiKey = ev.UiKey;
message.UiKey = uiKey;
// Raise as object so the correct type is used.
RaiseLocalEvent(uid, (object)message, true);
cmp.MessageReceived(ev);
switch (message)
{
case OpenBoundInterfaceMessage _:
TryOpenUi(uid, uiKey, cmp);
break;
case CloseBoundInterfaceMessage _:
TryCloseUi(uid, uiKey, remoteCall: true, uiComp: cmp);
break;
default:
if (cmp.OpenInterfaces.TryGetValue(uiKey, out var bui))
bui.InternalReceiveMessage(message);
break;
}
}
internal void Send(BoundUIWrapMessage msg)
private bool TryOpenUi(EntityUid uid, Enum uiKey, ClientUserInterfaceComponent? uiComp = null)
{
RaiseNetworkEvent(msg);
if (!Resolve(uid, ref uiComp))
return false;
if (uiComp.OpenInterfaces.ContainsKey(uiKey))
return false;
var data = uiComp._interfaces[uiKey];
// TODO: This type should be cached, but I'm too lazy.
var type = _reflectionManager.LooseGetType(data.ClientType);
var boundInterface =
(BoundUserInterface) _dynamicTypeFactory.CreateInstance(type, new object[] {uid, uiKey});
boundInterface.Open();
uiComp.OpenInterfaces[uiKey] = boundInterface;
var playerSession = _playerManager.LocalPlayer?.Session;
if(playerSession != null)
RaiseLocalEvent(uid, new BoundUIOpenedEvent(uiKey, uid, playerSession), true);
return true;
}
internal bool TryCloseUi(EntityUid uid, Enum uiKey, bool remoteCall = false, ClientUserInterfaceComponent? uiComp = null)
{
if (!Resolve(uid, ref uiComp))
return false;
if (!uiComp.OpenInterfaces.TryGetValue(uiKey, out var boundUserInterface))
return false;
if (!remoteCall)
SendUiMessage(boundUserInterface, new CloseBoundInterfaceMessage());
uiComp.OpenInterfaces.Remove(uiKey);
boundUserInterface.Dispose();
var playerSession = _playerManager.LocalPlayer?.Session;
if(playerSession != null)
RaiseLocalEvent(uid, new BoundUIClosedEvent(uiKey, uid, playerSession), true);
return true;
}
internal void SendUiMessage(BoundUserInterface bui, BoundUserInterfaceMessage msg)
{
RaiseNetworkEvent(new BoundUIWrapMessage(bui.Owner, msg, bui.UiKey));
}
}
}

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Client.UserInterface;

View File

@@ -783,7 +783,7 @@ namespace Robust.Client.GameStates
{
foreach (var (uid, xform) in queuedBroadphaseUpdates)
{
lookupSys.FindAndAddToEntityTree(uid, xform, xforms, metas, contQuery, physicsQuery, fixturesQuery, broadQuery);
lookupSys.FindAndAddToEntityTree(uid, true, xform);
}
}
catch (Exception e)
@@ -869,13 +869,13 @@ namespace Robust.Client.GameStates
// This entity is going to get deleted, but maybe some if its children won't be, so lets detach them to
// null. First we will detach the parent in order to reduce the number of broadphase/lookup updates.
xformSys.DetachParentToNull(ent, xform, xforms, metas);
xformSys.DetachParentToNull(ent, xform);
// Then detach all children.
var childEnumerator = xform.ChildEnumerator;
while (childEnumerator.MoveNext(out var child))
{
xformSys.DetachParentToNull(child.Value, xforms.GetComponent(child.Value), xforms, metas, xform);
xformSys.DetachParentToNull(child.Value, xforms.GetComponent(child.Value), xform);
if (deleteClientChildren
&& !deleteClientEntities // don't add duplicates
@@ -917,13 +917,13 @@ namespace Robust.Client.GameStates
continue; // Already deleted? or never sent to us?
// First, a single recursive map change
xformSys.DetachParentToNull(id, xform, xforms, metas);
xformSys.DetachParentToNull(id, xform);
// Then detach all children.
var childEnumerator = xform.ChildEnumerator;
while (childEnumerator.MoveNext(out var child))
{
xformSys.DetachParentToNull(child.Value, xforms.GetComponent(child.Value), xforms, metas, xform);
xformSys.DetachParentToNull(child.Value, xforms.GetComponent(child.Value), xform);
}
// Finally, delete the entity.
@@ -1002,7 +1002,7 @@ namespace Robust.Client.GameStates
var xform = xforms.GetComponent(ent);
if (xform.ParentUid.IsValid())
{
lookupSys.RemoveFromEntityTree(ent, xform, xforms);
lookupSys.RemoveFromEntityTree(ent, xform);
xform.Broadphase = BroadphaseData.Invalid;
// In some cursed scenarios an entity inside of a container can leave PVS without the container itself leaving PVS.
@@ -1017,7 +1017,7 @@ namespace Robust.Client.GameStates
}
meta._flags |= MetaDataFlags.Detached;
xformSys.DetachParentToNull(ent, xform, xforms, metas);
xformSys.DetachParentToNull(ent, xform);
DebugTools.Assert((meta.Flags & MetaDataFlags.InContainer) == 0);
if (container != null)

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Client.ResourceManagement;
using Robust.Client.Timing;

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using System.Text;
using Robust.Client.Graphics;
using Robust.Client.ResourceManagement;
@@ -227,7 +228,7 @@ namespace Robust.Client.GameStates
// average payload line
var avg = height - BytesToPixels(_totalHistoryPayload/HistorySize);
var avgEnd = new Vector2(LeftMargin + width, avg)+ (70,0);
var avgEnd = new Vector2(LeftMargin + width, avg) + new Vector2(70, 0);
handle.DrawLine(new Vector2(LeftMargin, avg), avgEnd, Color.DarkGray.WithAlpha(0.8f));
// top payload warning line
@@ -252,7 +253,8 @@ namespace Robust.Client.GameStates
handle.DrawString(_font, new Vector2(LeftMargin + width, minYoff), "8.19Kbit/s");
// avg text
handle.DrawString(_font, avgEnd - _font.GetLineHeight(1)/2f, "average");
var lineHeight = _font.GetLineHeight(1) / 2f;
handle.DrawString(_font, avgEnd - new Vector2(lineHeight, lineHeight), "average");
// lag text info
if(lastLagY != -1)

View File

@@ -14,7 +14,8 @@ using Robust.Shared.Configuration;
using Robust.Shared.IoC;
using Robust.Shared.Audio;
using Robust.Shared.Log;
using Vector2 = Robust.Shared.Maths.Vector2;
using Robust.Shared.Maths;
using Vector2 = System.Numerics.Vector2;
using Robust.Shared.Utility;
namespace Robust.Client.Graphics.Audio

View File

@@ -15,7 +15,7 @@ using Robust.Shared.IoC;
using Robust.Shared.Audio;
using Robust.Shared.Log;
using Robust.Shared.Timing;
using Vector2 = Robust.Shared.Maths.Vector2;
using Vector2 = System.Numerics.Vector2;
namespace Robust.Client.Graphics.Audio
{

View File

@@ -1,20 +1,14 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading;
using OpenTK.Audio.OpenAL;
using OpenTK.Audio.OpenAL.Extensions.Creative.EFX;
using OpenTK.Mathematics;
using Robust.Client.Audio;
using Robust.Shared;
using Robust.Shared.Configuration;
using Robust.Shared.IoC;
using Robust.Shared.Audio;
using Robust.Shared.Log;
using Vector2 = Robust.Shared.Maths.Vector2;
namespace Robust.Client.Graphics.Audio
{
@@ -183,15 +177,15 @@ namespace Robust.Client.Graphics.Audio
private void _updateAudio()
{
var eye = _eyeManager.CurrentEye;
var (x, y) = eye.Position.Position;
AL.Listener(ALListener3f.Position, x, y, -5);
var vec = eye.Position.Position;
AL.Listener(ALListener3f.Position, vec.X, vec.Y, -5);
var rot2d = eye.Rotation.ToVec();
AL.Listener(ALListenerfv.Orientation, new []{0, 0, -1, rot2d.X, rot2d.Y, 0});
// Default orientation: at: (0, 0, -1) up: (0, 1, 0)
var (rotX, rotY) = eye.Rotation.ToVec();
var rot = eye.Rotation.ToVec();
var at = new Vector3(0f, 0f, -1f);
var up = new Vector3(rotY, rotX, 0f);
var up = new Vector3(rot.Y, rot.X, 0f);
AL.Listener(ALListenerfv.Orientation, ref at, ref up);
_flushALDisposeQueues();

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Numerics;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Robust.Client.Audio;

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using Robust.Shared.ViewVariables;

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.CustomControls;
using Robust.Shared.GameObjects;

View File

@@ -1,4 +1,5 @@
using JetBrains.Annotations;
using System.Numerics;
using JetBrains.Annotations;
using Robust.Shared.Map;
using Robust.Shared.Maths;

View File

@@ -1,4 +1,5 @@
using Robust.Client.UserInterface.CustomControls;
using System.Numerics;
using Robust.Client.UserInterface.CustomControls;
using Robust.Shared.Map;
using Robust.Shared.Maths;

View File

@@ -1,6 +1,7 @@
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Numerics;
using System.Threading;
using OpenToolkit.Graphics.OpenGL4;
using Robust.Client.GameObjects;
@@ -528,7 +529,7 @@ namespace Robust.Client.Graphics.Clyde
// So there are distortions from incorrect projection.
_renderHandle.UseShader(_fovDebugShaderInstance);
_renderHandle.DrawingHandleScreen.SetTransform(Matrix3.Identity);
var pos = UIBox2.FromDimensions(viewport.Size / 2 - (200, 200), (400, 400));
var pos = UIBox2.FromDimensions(viewport.Size / 2 - new Vector2(200, 200), new Vector2(400, 400));
_renderHandle.DrawingHandleScreen.DrawTextureRect(FovTexture, pos);
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using OpenToolkit.Graphics.OpenGL4;

View File

@@ -1,8 +1,10 @@
using System.Numerics;
using OpenToolkit.Graphics.OpenGL4;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using JetBrains.Annotations;
using Robust.Shared.Maths;
using Vector3 = Robust.Shared.Maths.Vector3;
namespace Robust.Client.Graphics.Clyde
{

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Buffers;
using System.Numerics;
using OpenToolkit.Graphics.OpenGL4;
using Robust.Client.GameObjects;
using Robust.Client.ResourceManagement;
@@ -17,6 +18,7 @@ using Robust.Shared.Physics;
using Robust.Client.ComponentTrees;
using static Robust.Shared.GameObjects.OccluderComponent;
using Robust.Shared.Utility;
using Vector4 = Robust.Shared.Maths.Vector4;
namespace Robust.Client.Graphics.Clyde
{
@@ -558,7 +560,7 @@ namespace Robust.Client.Graphics.Clyde
if (light.CastShadows)
shadowCount++;
float distanceSquared = (state.worldAABB.Center - lightPos).LengthSquared;
var distanceSquared = (state.worldAABB.Center - lightPos).LengthSquared();
state.clyde._lightsToRenderList[count++] = (light, lightPos, distanceSquared, rot);
return true;
@@ -576,9 +578,9 @@ namespace Robust.Client.Graphics.Clyde
var xforms = _entityManager.GetEntityQuery<TransformComponent>();
var state = (this, count: 0, shadowCastingCount: 0, xformSystem, xforms, worldAABB);
foreach (var comp in lightTreeSys.GetIntersectingTrees(map, worldAABB))
foreach (var (uid, comp) in lightTreeSys.GetIntersectingTrees(map, worldAABB))
{
var bounds = xformSystem.GetInvWorldMatrix(comp.Owner, xforms).TransformBox(worldBounds);
var bounds = xformSystem.GetInvWorldMatrix(uid, xforms).TransformBox(worldBounds);
comp.Tree.QueryAabb(ref state, LightQuery, bounds);
}
@@ -926,12 +928,12 @@ namespace Robust.Client.Graphics.Clyde
try
{
foreach (var comp in occluderSystem.GetIntersectingTrees(map, expandedBounds))
foreach (var (uid, comp) in occluderSystem.GetIntersectingTrees(map, expandedBounds))
{
if (ami >= amiMax)
break;
var treeBounds = xforms.GetComponent(comp.Owner).InvWorldMatrix.TransformBox(expandedBounds);
var treeBounds = xforms.GetComponent(uid).InvWorldMatrix.TransformBox(expandedBounds);
comp.Tree.QueryAabb((in ComponentTreeEntry<OccluderComponent> entry) =>
{

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using System.Runtime.InteropServices;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
@@ -165,7 +166,7 @@ namespace Robust.Client.Graphics.Clyde
var oldModel = _clyde._currentMatrixModel;
var newModel = oldModel;
position += (oldModel.R0C2, oldModel.R1C2);
position += new Vector2(oldModel.R0C2, oldModel.R1C2);
newModel.R0C2 = 0;
newModel.R1C2 = 0;
SetModelTransform(newModel);

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using OpenToolkit.Graphics.OpenGL4;
@@ -9,6 +10,8 @@ using Robust.Client.Utility;
using Robust.Shared.Maths;
using Robust.Shared.Utility;
using TKStencilOp = OpenToolkit.Graphics.OpenGL4.StencilOp;
using Vector3 = Robust.Shared.Maths.Vector3;
using Vector4 = Robust.Shared.Maths.Vector4;
namespace Robust.Client.Graphics.Clyde
{

View File

@@ -2,12 +2,15 @@ using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Numerics;
using System.Text;
using OpenToolkit.Graphics.OpenGL4;
using Robust.Client.ResourceManagement;
using Robust.Shared.Maths;
using Robust.Shared.Utility;
using Robust.Shared.ViewVariables;
using Vector3 = Robust.Shared.Maths.Vector3;
using Vector4 = Robust.Shared.Maths.Vector4;
namespace Robust.Client.Graphics.Clyde
{

View File

@@ -9,6 +9,7 @@ using Robust.Shared.Utility;
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;
@@ -43,7 +44,7 @@ internal partial class Clyde
private void ProcessSpriteEntities(MapId map, Viewport view, IEye eye, Box2Rotated worldBounds, RefList<SpriteData> list)
{
var query = _entityManager.GetEntityQuery<TransformComponent>();
var viewScale = eye.Scale * view.RenderScale * (EyeManager.PixelsPerMeter, -EyeManager.PixelsPerMeter);
var viewScale = eye.Scale * view.RenderScale * new Vector2(EyeManager.PixelsPerMeter, -EyeManager.PixelsPerMeter);
var treeData = new BatchData()
{
Sys = _entityManager.EntitySysManager.GetEntitySystem<TransformSystem>(),
@@ -59,11 +60,12 @@ internal partial class Clyde
var index = 0;
var added = 0;
var opts = new ParallelOptions { MaxDegreeOfParallelism = _parMan.ParallelProcessCount };
foreach (var comp in _entitySystemManager.GetEntitySystem<SpriteTreeSystem>().GetIntersectingTrees(map, worldBounds))
var xformSystem = _entitySystemManager.GetEntitySystem<SharedTransformSystem>();
foreach (var (treeOwner, comp) in _entitySystemManager.GetEntitySystem<SpriteTreeSystem>().GetIntersectingTrees(map, worldBounds))
{
var treeOwner = comp.Owner;
var treeXform = query.GetComponent(comp.Owner);
var bounds = treeXform.InvWorldMatrix.TransformBox(worldBounds);
var treeXform = query.GetComponent(treeOwner);
var bounds = xformSystem.GetInvWorldMatrix(treeOwner).TransformBox(worldBounds);
DebugTools.Assert(treeXform.MapUid == treeXform.ParentUid || !treeXform.ParentUid.IsValid());
treeData = treeData with
@@ -88,7 +90,7 @@ internal partial class Clyde
// Get bounding boxes & world positions
added = list.Count - index;
var batches = added/_spriteProcessingBatchSize;
// TODO also do sorting here & use a merge sort later on for y-sorting?
if (batches > 1)
Parallel.For(0, batches, opts, (i) => ProcessSprites(list, index + i * _spriteProcessingBatchSize, _spriteProcessingBatchSize, treeData));
@@ -121,7 +123,7 @@ internal partial class Clyde
// To help explain the remainder of this function, it should be functionally equivalent to the following
// three lines of code, but has been expanded & simplified to speed up the calculation:
//
//
// (data.WorldPos, data.WorldRot) = batch.Sys.GetWorldPositionRotation(data.Xform, batch.Query);
// var spriteWorldBB = data.Sprite.CalculateRotatedBoundingBox(data.WorldPos, data.WorldRot, batch.ViewRotation);
// data.SpriteScreenBB = Viewport.GetWorldToLocalMatrix().TransformBox(spriteWorldBB);
@@ -160,7 +162,7 @@ internal partial class Clyde
/// <summary>
/// This is effectively a specialized combination of a <see cref="Matrix3.TransformBox(in Box2Rotated)"/> and <see cref="Box2Rotated.CalcBoundingBox()"/>.
/// </summary>
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static unsafe Box2 TransformCenteredBox(in Box2 box, float angle, in Vector2 offset, in Vector2 scale)
{

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using Robust.Client.UserInterface.CustomControls;
using Robust.Shared.Enums;
using Robust.Shared.Map;
@@ -162,7 +163,7 @@ namespace Robust.Client.Graphics.Clyde
if (Eye == null)
return Matrix3.Identity;
Eye.GetViewMatrix(out var viewMatrix, RenderScale * (EyeManager.PixelsPerMeter, -EyeManager.PixelsPerMeter));
Eye.GetViewMatrix(out var viewMatrix, RenderScale * new Vector2(EyeManager.PixelsPerMeter, -EyeManager.PixelsPerMeter));
viewMatrix.R0C2 += Size.X / 2f;
viewMatrix.R1C2 += Size.Y / 2f;
return viewMatrix;

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Numerics;
using System.Threading;
using System.Threading.Tasks;
using Robust.Client.Input;

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Numerics;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Robust.Client.Audio;
@@ -13,6 +14,8 @@ using Robust.Shared.Timing;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using Color = Robust.Shared.Maths.Color;
using Vector3 = Robust.Shared.Maths.Vector3;
using Vector4 = Robust.Shared.Maths.Vector4;
namespace Robust.Client.Graphics.Clyde
{
@@ -26,7 +29,7 @@ namespace Robust.Client.Graphics.Clyde
public IClydeWindow MainWindow { get; }
public Vector2i ScreenSize => (1280, 720);
public IEnumerable<IClydeWindow> AllWindows => _windows;
public Vector2 DefaultWindowScale => (1, 1);
public Vector2 DefaultWindowScale => new Vector2(1, 1);
public bool IsFocused => true;
private readonly List<IClydeWindow> _windows = new();
private int _nextWindowId = 2;

View File

@@ -1,9 +1,12 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using System.Runtime.CompilerServices;
using OpenToolkit.Graphics.OpenGL4;
using Robust.Shared.Maths;
using Robust.Shared.Utility;
using Vector3 = Robust.Shared.Maths.Vector3;
using Vector4 = Robust.Shared.Maths.Vector4;
namespace Robust.Client.Graphics.Clyde
{

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using System.Text;
using OpenToolkit.GraphicsLibraryFramework;
using Robust.Client.Input;
@@ -107,7 +108,7 @@ namespace Robust.Client.Graphics.Clyde
if (windowReg == null)
return;
var newPos = ((float) ev.XPos, (float) ev.YPos) * windowReg.PixelRatio;
var newPos = new Vector2((float) ev.XPos, (float) ev.YPos) * windowReg.PixelRatio;
var delta = newPos - windowReg.LastMousePos;
windowReg.LastMousePos = newPos;
@@ -178,7 +179,7 @@ namespace Robust.Client.Graphics.Clyde
return;
var eventArgs = new MouseWheelEventArgs(
((float) ev.XOffset, (float) ev.YOffset),
new((float) ev.XOffset, (float) ev.YOffset),
new ScreenCoordinates(windowReg.LastMousePos, windowReg.Id));
_clyde.SendScroll(eventArgs);
}
@@ -235,7 +236,7 @@ namespace Robust.Client.Graphics.Clyde
if (windowReg == null)
return;
windowReg.WindowScale = (ev.XScale, ev.YScale);
windowReg.WindowScale = new Vector2(ev.XScale, ev.YScale);
_clyde.SendWindowContentScaleChanged(new WindowContentScaleEventArgs(windowReg.Handle));
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Linq;
using System.Numerics;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using OpenToolkit.GraphicsLibraryFramework;
@@ -559,7 +560,7 @@ namespace Robust.Client.Graphics.Clyde
reg.FramebufferSize = (fbW, fbH);
GLFW.GetWindowContentScale(window, out var scaleX, out var scaleY);
reg.WindowScale = (scaleX, scaleY);
reg.WindowScale = new Vector2(scaleX, scaleY);
GLFW.GetWindowSize(window, out var w, out var h);
reg.PrevWindowSize = reg.WindowSize = (w, h);

View File

@@ -1,7 +1,7 @@
using System;
using System.Numerics;
using Robust.Client.Input;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using TerraFX.Interop.Windows;
using static SDL2.SDL;
using static SDL2.SDL.SDL_EventType;
@@ -141,7 +141,7 @@ internal partial class Clyde
return;
var eventArgs = new MouseWheelEventArgs(
(ev.XOffset, ev.YOffset),
new Vector2(ev.XOffset, ev.YOffset),
new ScreenCoordinates(windowReg.LastMousePos, windowReg.Id));
_clyde.SendScroll(eventArgs);
@@ -165,7 +165,7 @@ internal partial class Clyde
if (windowReg == null)
return;
var newPos = (ev.X, ev.Y) * windowReg.PixelRatio;
var newPos = new Vector2(ev.X, ev.Y) * windowReg.PixelRatio;
// SDL2 does give us delta positions, but I'm worried about rounding errors thanks to DPI stuff.
var delta = newPos - windowReg.LastMousePos;
windowReg.LastMousePos = newPos;
@@ -205,10 +205,11 @@ internal partial class Clyde
return;
windowReg.PixelRatio = windowReg.FramebufferSize / (Vector2)windowReg.WindowSize;
var newScale = new Vector2(ev.XScale, ev.YScale);
if (windowReg.WindowScale != (ev.XScale, ev.YScale))
if (!windowReg.WindowScale.Equals(newScale))
{
windowReg.WindowScale = (ev.XScale, ev.YScale);
windowReg.WindowScale = newScale;
_clyde.SendWindowContentScaleChanged(new WindowContentScaleEventArgs(windowReg.Handle));
}

View File

@@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Robust.Shared.Maths;
using TerraFX.Interop.Windows;
using static SDL2.SDL;
using static SDL2.SDL.SDL_EventType;

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using Robust.Shared.Map;
@@ -513,7 +514,7 @@ internal partial class Clyde
cmd.Tcs.TrySetResult(SDL_GetClipboardText());
}
private static (float h, float v) GetWindowScale(nint window)
private static Vector2 GetWindowScale(nint window)
{
// Get scale by diving size in pixels with size in points.
SDL_GetWindowSizeInPixels(window, out var pixW, out var pixH);
@@ -521,7 +522,7 @@ internal partial class Clyde
// Avoiding degenerate cases, not sure if these can actually happen.
if (pixW == 0 || pixH == 0 || pointW == 0 || pointH == 0)
return (1, 1);
return new Vector2(1, 1);
var scaleH = pixW / (float) pointW;
var scaleV = pixH / (float) pointH;
@@ -530,7 +531,7 @@ internal partial class Clyde
scaleH = MathF.Round(scaleH * 20) / 20;
scaleV = MathF.Round(scaleV * 20) / 20;
return (scaleH, scaleV);
return new Vector2(scaleH, scaleV);
}
private static void CheckWindowDisposed(WindowReg reg)

View File

@@ -1,5 +1,6 @@
using System;
using System.Diagnostics;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Robust.Shared.Maths;
@@ -99,7 +100,7 @@ namespace Robust.Client.Graphics
Color colorLinear = Color.FromSrgb(color);
for (var i = 0; i < output.Length; i++)
{
output[i] = new DrawVertexUV2DColor(input[i], (0.5f, 0.5f), colorLinear);
output[i] = new DrawVertexUV2DColor(input[i], new Vector2(0.5f, 0.5f), colorLinear);
}
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using System.Text;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Robust.Shared.Maths;
namespace Robust.Client.Graphics

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using JetBrains.Annotations;
using Robust.Shared.Maths;
@@ -235,7 +236,7 @@ namespace Robust.Client.Graphics
/// </summary>
public Vector2 GetContentOffset(Vector2 basePosition)
{
return basePosition + (GetContentMargin(Margin.Left), GetContentMargin(Margin.Top));
return basePosition + new Vector2(GetContentMargin(Margin.Left), GetContentMargin(Margin.Top));
}
/// <summary>

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using Robust.Shared.Maths;
using Robust.Shared.Utility;

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using System.Text;
using Robust.Client.ResourceManagement;
using Robust.Shared.IoC;

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Numerics;
using System.Threading.Tasks;
using Robust.Shared.Maths;
using SixLabors.ImageSharp;

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using JetBrains.Annotations;
using Robust.Shared.Maths;

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using Robust.Client.UserInterface.CustomControls;
using Robust.Shared.Map;
using Robust.Shared.Maths;

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using Robust.Shared.Map;
using Robust.Shared.Maths;

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.Maths;

View File

@@ -1,7 +1,10 @@
using System;
using System.Numerics;
using Robust.Shared.Maths;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.ViewVariables;
using Vector3 = Robust.Shared.Maths.Vector3;
using Vector4 = Robust.Shared.Maths.Vector4;
namespace Robust.Client.Graphics
{

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using Robust.Client.ResourceManagement;
using Robust.Shared.IoC;
using Robust.Shared.Log;
@@ -10,6 +11,8 @@ using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.Utility;
using Robust.Shared.ViewVariables;
using YamlDotNet.RepresentationModel;
using Vector3 = Robust.Shared.Maths.Vector3;
using Vector4 = Robust.Shared.Maths.Vector4;
namespace Robust.Client.Graphics
{

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using System.Text;
using Robust.Client.Graphics;
using Robust.Shared.Map;

View File

@@ -4,6 +4,7 @@ using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Numerics;
using System.Runtime.InteropServices;
using System.Text;
using JetBrains.Annotations;

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Client.ResourceManagement;
using Robust.Shared.Enums;

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Shared.Enums;
using Robust.Shared.GameObjects;

View File

@@ -138,10 +138,13 @@ public sealed partial class PhysicsSystem
continue;
}
var xformA = xformQuery.GetComponent(uidA);
var xformB = xformQuery.GetComponent(uidB);
if ((contact.Flags & ContactFlags.Filter) != 0x0)
{
if (!ShouldCollide(fixtureA, fixtureB) ||
!ShouldCollide(uidA, uidB, bodyA, bodyB, fixtureA, fixtureB))
!ShouldCollide(uidA, uidB, bodyA, bodyB, fixtureA, fixtureB, xformA, xformB))
{
contact.IsTouching = false;
continue;
@@ -157,9 +160,6 @@ public sealed partial class PhysicsSystem
continue;
}
var xformA = xformQuery.GetComponent(uidA);
var xformB = xformQuery.GetComponent(uidB);
if (xformA.MapUid == null || xformA.MapUid != xformB.MapUid)
{
contact.IsTouching = false;

View File

@@ -35,7 +35,7 @@ namespace Robust.Client.Physics
// Also need to suss out having the client build the island anyway and just... not solving it?
foreach (var body in component.AwakeBodies)
{
if (!body.SleepingAllowed || body.LinearVelocity.Length > LinearToleranceSqr / 2f || body.AngularVelocity * body.AngularVelocity > AngularToleranceSqr / 2f) continue;
if (!body.SleepingAllowed || body.LinearVelocity.Length() > LinearToleranceSqr / 2f || body.AngularVelocity * body.AngularVelocity > AngularToleranceSqr / 2f) continue;
body.SleepTime += frameTime;
if (body.SleepTime > TimeToSleep)
{

View File

@@ -1,4 +1,5 @@
using System.Linq;
using System.Numerics;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
@@ -33,7 +34,7 @@ namespace Robust.Client.Placement.Modes
var snapToEntities = EntitySystem.Get<EntityLookupSystem>().GetEntitiesInRange(MouseCoords, SnapToRange)
.Where(entity => pManager.EntityManager.GetComponent<MetaDataComponent>(entity).EntityPrototype == pManager.CurrentPrototype && pManager.EntityManager.GetComponent<TransformComponent>(entity).MapID == mapId)
.OrderBy(entity => (pManager.EntityManager.GetComponent<TransformComponent>(entity).WorldPosition - MouseCoords.ToMapPos(pManager.EntityManager)).LengthSquared)
.OrderBy(entity => (pManager.EntityManager.GetComponent<TransformComponent>(entity).WorldPosition - MouseCoords.ToMapPos(pManager.EntityManager)).LengthSquared())
.ToList();
if (snapToEntities.Count == 0)
@@ -65,7 +66,7 @@ namespace Robust.Client.Placement.Modes
};
var closestSide =
(from Vector2 side in sides orderby (side - MouseCoords.Position).LengthSquared select side).First();
(from Vector2 side in sides orderby (side - MouseCoords.Position).LengthSquared() select side).First();
MouseCoords = new EntityCoordinates(MouseCoords.EntityId, MouseCoords.Position);
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using Robust.Shared.GameObjects;
using Robust.Shared.Map;
using Robust.Shared.Maths;

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Shared.GameObjects;
using Robust.Shared.Map;

View File

@@ -1,4 +1,5 @@
using Robust.Shared.Map;
using System.Numerics;
using Robust.Shared.Map;
namespace Robust.Client.Placement.Modes
{
@@ -27,12 +28,12 @@ namespace Robust.Client.Placement.Modes
if (pManager.CurrentPermission!.IsTile)
{
MouseCoords = new EntityCoordinates(MouseCoords.EntityId, (CurrentTile.X + tileSize / 2,
MouseCoords = new EntityCoordinates(MouseCoords.EntityId, new Vector2(CurrentTile.X + tileSize / 2,
CurrentTile.Y + tileSize / 2));
}
else
{
MouseCoords = new EntityCoordinates(MouseCoords.EntityId, (CurrentTile.X + tileSize / 2 + pManager.PlacementOffset.X,
MouseCoords = new EntityCoordinates(MouseCoords.EntityId, new Vector2(CurrentTile.X + tileSize / 2 + pManager.PlacementOffset.X,
CurrentTile.Y + tileSize / 2 + pManager.PlacementOffset.Y));
}
}

View File

@@ -1,4 +1,5 @@
using Robust.Shared.GameObjects;
using System.Numerics;
using Robust.Shared.GameObjects;
using Robust.Shared.Map;
namespace Robust.Client.Placement.Modes
@@ -29,12 +30,12 @@ namespace Robust.Client.Placement.Modes
if (pManager.CurrentPermission!.IsTile)
{
MouseCoords = new EntityCoordinates(MouseCoords.EntityId,
(CurrentTile.X + tileSize / 2, CurrentTile.Y + tileSize / 2));
new Vector2(CurrentTile.X + tileSize / 2, CurrentTile.Y + tileSize / 2));
}
else
{
MouseCoords = new EntityCoordinates(MouseCoords.EntityId,
(CurrentTile.X + tileSize / 2 + pManager.PlacementOffset.X,
new Vector2(CurrentTile.X + tileSize / 2 + pManager.PlacementOffset.X,
CurrentTile.Y + tileSize / 2 + pManager.PlacementOffset.Y));
}
}

View File

@@ -1,4 +1,5 @@
using Robust.Shared.GameObjects;
using System.Numerics;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Map;
using Robust.Shared.Maths;
@@ -31,12 +32,12 @@ namespace Robust.Client.Placement.Modes
if (pManager.CurrentPermission!.IsTile)
{
MouseCoords = new EntityCoordinates(MouseCoords.EntityId,
(CurrentTile.X + tileSize / 2, CurrentTile.Y + tileSize / 2));
new Vector2(CurrentTile.X + tileSize / 2, CurrentTile.Y + tileSize / 2));
}
else
{
MouseCoords = new EntityCoordinates(MouseCoords.EntityId,
(CurrentTile.X + tileSize / 2 + pManager.PlacementOffset.X,
new Vector2(CurrentTile.X + tileSize / 2 + pManager.PlacementOffset.X,
CurrentTile.Y + tileSize / 2 + pManager.PlacementOffset.Y));
}
}

View File

@@ -1,4 +1,5 @@
using Robust.Shared.GameObjects;
using System.Numerics;
using Robust.Shared.GameObjects;
using Robust.Shared.Map;
namespace Robust.Client.Placement.Modes
@@ -29,12 +30,12 @@ namespace Robust.Client.Placement.Modes
if (pManager.CurrentPermission!.IsTile)
{
MouseCoords = new EntityCoordinates(MouseCoords.EntityId,
(CurrentTile.X + tileSize / 2, CurrentTile.Y + tileSize / 2));
new Vector2(CurrentTile.X + tileSize / 2, CurrentTile.Y + tileSize / 2));
}
else
{
MouseCoords = new EntityCoordinates(MouseCoords.EntityId,
(CurrentTile.X + tileSize / 2 + pManager.PlacementOffset.X,
new Vector2(CurrentTile.X + tileSize / 2 + pManager.PlacementOffset.X,
CurrentTile.Y + tileSize / 2 + pManager.PlacementOffset.Y));
}
}

View File

@@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.Linq;
using Robust.Shared.Map;
using Vector2 = Robust.Shared.Maths.Vector2;
using Vector2 = System.Numerics.Vector2;
namespace Robust.Client.Placement.Modes
{
@@ -35,11 +35,11 @@ namespace Robust.Client.Placement.Modes
}
var closestNode = (from Vector2 node in nodes
orderby (node - MouseCoords.Position).LengthSquared ascending
orderby (node - MouseCoords.Position).LengthSquared() ascending
select node).First();
MouseCoords = new EntityCoordinates(MouseCoords.EntityId,
closestNode + (pManager.PlacementOffset.X, pManager.PlacementOffset.Y));
closestNode + new Vector2(pManager.PlacementOffset.X, pManager.PlacementOffset.Y));
}
public override bool IsValidPosition(EntityCoordinates position)

View File

@@ -1,6 +1,6 @@
using System.Linq;
using Robust.Shared.Map;
using Vector2 = Robust.Shared.Maths.Vector2;
using Vector2 = System.Numerics.Vector2;
namespace Robust.Client.Placement.Modes
{
@@ -27,16 +27,17 @@ namespace Robust.Client.Placement.Modes
var offsets = new Vector2[]
{
(0f, 0.5f),
(0.5f, 0f),
(0, -0.5f),
(-0.5f, 0f)
new(0f, 0.5f),
new(0.5f, 0f),
new(0, -0.5f),
new(-0.5f, 0f)
};
var closestNode = offsets
.Select(o => tileCoordinates.Offset(o))
.OrderBy(node => node.TryDistance(pManager.EntityManager, MouseCoords, out var distance) ? distance : (float?) null)
.First();
.MinBy(node => node.TryDistance(pManager.EntityManager, MouseCoords, out var distance) ?
distance :
(float?) null);
MouseCoords = closestNode;
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.Input;

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Numerics;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.Input;

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Client.ResourceManagement;
using Robust.Client.UserInterface;
@@ -72,7 +73,7 @@ public sealed class LiveProfileViewControl : Control
{
DrawSample(in data, baseline, value.StringId, value.Value);
baseline += (0, data.Font.GetLineHeight(UIScale));
baseline += new Vector2(0, data.Font.GetLineHeight(UIScale));
}
private void DrawSample(
@@ -126,7 +127,7 @@ public sealed class LiveProfileViewControl : Control
var indentSize = 12 * UIScale;
var startBaseline = baseline;
baseline += (indentSize, data.Font.GetLineHeight(UIScale));
baseline += new Vector2(indentSize, data.Font.GetLineHeight(UIScale));
if (depth > MaxDepth)
{
@@ -163,7 +164,7 @@ public sealed class LiveProfileViewControl : Control
ref var cmdEnd = ref data.Buffer.Log(i).GroupEnd;
baseline -= (indentSize, 0);
baseline -= new Vector2(indentSize, 0);
DrawSample(in data, startBaseline, cmdEnd.StringId, cmdEnd.Value);
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using Robust.Client.Animations;
using Robust.Shared.Collections;
using Robust.Shared.Timing;
using static Robust.Client.Animations.AnimationPlaybackShared;
@@ -45,15 +46,21 @@ namespace Robust.Client.UserInterface
return;
}
// TODO: Get rid of this ToArray() allocation.
foreach (var (key, playback) in _playingAnimations.ToArray())
var toRemove = new ValueList<string>();
foreach (var (key, playback) in _playingAnimations)
{
var keep = UpdatePlayback(this, playback, args.DeltaSeconds);
if (!keep)
{
_playingAnimations.Remove(key);
AnimationCompleted?.Invoke(key);
}
if (keep)
continue;
toRemove.Add(key);
AnimationCompleted?.Invoke(key);
}
foreach (var key in toRemove)
{
_playingAnimations.Remove(key);
}
}
}

View File

@@ -3,6 +3,7 @@ using Robust.Shared.Input;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using System;
using System.Numerics;
namespace Robust.Client.UserInterface
{

View File

@@ -1,4 +1,5 @@
using System;
using System.Numerics;
using Robust.Client.Graphics;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Map;
@@ -335,8 +336,8 @@ namespace Robust.Client.UserInterface
/// <seealso cref="MinHeight"/>
public Vector2 MinSize
{
get => (_minWidth, _minHeight);
set => (MinWidth, MinHeight) = Vector2.ComponentMax(Vector2.Zero, value);
get => new(_minWidth, _minHeight);
set => (MinWidth, MinHeight) = Vector2.Max(Vector2.Zero, value);
}
/// <summary>
@@ -358,7 +359,7 @@ namespace Robust.Client.UserInterface
/// <seealso cref="SetHeight"/>
public Vector2 SetSize
{
get => (_setWidth, _setHeight);
get => new(_setWidth, _setHeight);
set => (SetWidth, SetHeight) = value;
}
@@ -374,7 +375,7 @@ namespace Robust.Client.UserInterface
/// <seealso cref="MaxHeight"/>
public Vector2 MaxSize
{
get => (_maxWidth, _maxHeight);
get => new(_maxWidth, _maxHeight);
set => (MaxWidth, MaxHeight) = value;
}
@@ -565,8 +566,8 @@ namespace Robust.Client.UserInterface
measured.Y = Math.Clamp(measured.Y, MinHeight, MaxHeight);
measured = _margin.Inflate(measured);
measured = Vector2.ComponentMin(measured, availableSize);
measured = Vector2.ComponentMax(measured, Vector2.Zero);
measured = Vector2.Min(measured, availableSize);
measured = Vector2.Max(measured, Vector2.Zero);
return measured;
}
@@ -580,7 +581,7 @@ namespace Robust.Client.UserInterface
foreach (var child in Children)
{
child.Measure(availableSize);
min = Vector2.ComponentMax(min, child.DesiredSize);
min = Vector2.Max(min, child.DesiredSize);
}
return min;
@@ -640,7 +641,7 @@ namespace Robust.Client.UserInterface
var arranged = ArrangeOverride(size);
size = Vector2.ComponentMin(arranged, size);
size = Vector2.Min(arranged, size);
switch (HorizontalAlignment)
{
@@ -708,7 +709,7 @@ namespace Robust.Client.UserInterface
minConstraint = float.IsNaN(setH) ? 0 : setH;
minH = MathHelper.Clamp(maxH, minConstraint, minH);
return (
return new Vector2(
Math.Clamp(avail.X, minW, maxW),
Math.Clamp(avail.Y, minH, maxH));
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using Avalonia.Metadata;
using JetBrains.Annotations;
using Robust.Client.Graphics;
@@ -88,7 +89,7 @@ namespace Robust.Client.UserInterface
ThemeUpdateRecursive(Parent?.Theme ?? UserInterfaceManager.CurrentTheme);
}
}
protected virtual void OnThemeUpdated()
{
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using Robust.Client.GameObjects;
using Robust.Client.Placement;
using Robust.Client.ResourceManagement;
@@ -214,7 +215,7 @@ public sealed class EntitySpawningUIController : UIController
_shownEntities.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.Ordinal));
_window.PrototypeList.TotalItemCount = _shownEntities.Count;
_window.PrototypeScrollContainer.SetScrollValue((0, 0));
_window.PrototypeScrollContainer.SetScrollValue(new Vector2(0, 0));
UpdateVisiblePrototypes();
}

Some files were not shown because too many files have changed in this diff Show More