Skip to content

Commit 1eef1aa

Browse files
committed
Why
1 parent 47940dc commit 1eef1aa

File tree

4 files changed

+54
-75
lines changed

4 files changed

+54
-75
lines changed

Robust.Client/GameObjects/Components/Renderable/SpriteComponent.cs

Lines changed: 33 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ public bool Visible
7474

7575
private SpriteSystem? _sys;
7676
private SpriteTreeSystem? _treeSys;
77-
private SpriteSystem Sys => _sys ??= entities.System<SpriteSystem>();
78-
private SpriteTreeSystem TreeSys => _treeSys ??= entities.System<SpriteTreeSystem>();
77+
private SpriteSystem Sys => _sys ??= (entities.Started ? entities.System<SpriteSystem>() : null)!;
78+
private SpriteTreeSystem TreeSys => _treeSys ??= (entities.Started ? entities.System<SpriteTreeSystem>() : null)!;
7979

8080
[DataField("drawdepth", customTypeSerializer: typeof(ConstantSerializer<DrawDepthTag>))]
8181
internal int drawDepth = DrawDepthTag.Default;
@@ -456,14 +456,6 @@ public void RemoveLayer(object layerKey)
456456
RemoveLayer(layer);
457457
}
458458

459-
[Obsolete("Use SpriteSystem.RebuildBounds() instead.")]
460-
internal void RebuildBounds()
461-
{
462-
// I Love ISerializationHooks & inconsistent initialization ordering between server, client, and tests.
463-
if (entities.Started && entities.TrySystem(out SpriteSystem? sys))
464-
sys.RebuildBounds((Owner, this));
465-
}
466-
467459
/// <summary>
468460
/// Fills in a layer's values using some <see cref="PrototypeLayerData"/>.
469461
/// </summary>
@@ -595,7 +587,8 @@ private void LayerSetData(Layer layer, int index, PrototypeLayerData layerDatum)
595587
layer.CopyToShaderParameters = null;
596588
}
597589

598-
RebuildBounds();
590+
// ReSharper disable once ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
591+
Sys?.RebuildBounds((Owner, this));
599592
}
600593

601594
private object ParseKey(string keyString)
@@ -682,8 +675,8 @@ public void LayerSetTexture(int layer, Texture? texture)
682675
return;
683676
theLayer.SetTexture(texture);
684677

685-
QueueUpdateIsInert();
686-
RebuildBounds();
678+
Sys.QueueUpdateIsInert((Owner, this));
679+
Sys.RebuildBounds((Owner, this));
687680
}
688681

689682
public void LayerSetTexture(object layerKey, Texture texture)
@@ -735,7 +728,7 @@ public void LayerSetState(int layer, RSI.StateId stateId)
735728
if (!TryGetLayer(layer, out var theLayer, true))
736729
return;
737730
theLayer.SetState(stateId);
738-
RebuildBounds();
731+
Sys.RebuildBounds((Owner, this));
739732
}
740733

741734
public void LayerSetState(object layerKey, RSI.StateId stateId)
@@ -774,8 +767,8 @@ public void LayerSetState(int layer, RSI.StateId stateId, RSI? rsi)
774767
}
775768
}
776769

777-
QueueUpdateIsInert();
778-
RebuildBounds();
770+
Sys.QueueUpdateIsInert((Owner, this));
771+
Sys.RebuildBounds((Owner, this));
779772
}
780773

781774
public void LayerSetState(object layerKey, RSI.StateId stateId, RSI rsi)
@@ -819,7 +812,7 @@ public void LayerSetRSI(int layer, RSI? rsi)
819812
if (!TryGetLayer(layer, out var theLayer, true))
820813
return;
821814
theLayer.SetRsi(rsi);
822-
RebuildBounds();
815+
Sys.RebuildBounds((Owner, this));
823816
}
824817

825818
public void LayerSetRSI(object layerKey, RSI rsi)
@@ -863,7 +856,7 @@ public void LayerSetScale(int layer, Vector2 scale)
863856
if (!TryGetLayer(layer, out var theLayer, true))
864857
return;
865858
theLayer.Scale = scale;
866-
RebuildBounds();
859+
Sys.RebuildBounds((Owner, this));
867860
}
868861

869862
public void LayerSetScale(object layerKey, Vector2 scale)
@@ -880,7 +873,7 @@ public void LayerSetRotation(int layer, Angle rotation)
880873
if (!TryGetLayer(layer, out var theLayer, true))
881874
return;
882875
theLayer.Rotation = rotation;
883-
RebuildBounds();
876+
Sys.RebuildBounds((Owner, this));
884877
}
885878

886879
public void LayerSetRotation(object layerKey, Angle rotation)
@@ -913,8 +906,7 @@ public void LayerSetColor(int layer, Color color)
913906
return;
914907

915908
theLayer.Color = color;
916-
917-
RebuildBounds();
909+
Sys.RebuildBounds((Owner, this));
918910
}
919911

920912
public void LayerSetColor(object layerKey, Color color)
@@ -931,8 +923,7 @@ public void LayerSetDirOffset(int layer, DirectionOffset offset)
931923
return;
932924

933925
theLayer.DirOffset = offset;
934-
935-
RebuildBounds();
926+
Sys.RebuildBounds((Owner, this));
936927
}
937928

938929
public void LayerSetDirOffset(object layerKey, DirectionOffset offset)
@@ -981,8 +972,7 @@ public void LayerSetOffset(int layer, Vector2 layerOffset)
981972
return;
982973

983974
theLayer.Offset = layerOffset;
984-
985-
RebuildBounds();
975+
Sys.RebuildBounds((Owner, this));
986976
}
987977

988978
public void LayerSetOffset(object layerKey, Vector2 layerOffset)
@@ -1054,7 +1044,7 @@ public bool SnapCardinals
10541044
return;
10551045

10561046
_snapCardinals = value;
1057-
RebuildBounds();
1047+
Sys.RebuildBounds((Owner, this));
10581048
}
10591049
}
10601050

@@ -1156,21 +1146,6 @@ public int GetLayerDirectionCount(ISpriteLayer layer)
11561146
};
11571147
}
11581148

1159-
private void QueueUpdateRenderTree()
1160-
{
1161-
TreeSys.QueueTreeUpdate((Owner, this));
1162-
}
1163-
1164-
internal void QueueUpdateIsInert()
1165-
{
1166-
if (_inertUpdateQueued || !Owner.IsValid())
1167-
return;
1168-
1169-
// TODO whenever sprite comp gets ECS'd , just make this a direct method call.
1170-
var ev = new SpriteUpdateInertEvent();
1171-
entities.EventBus.RaiseComponentEvent(Owner, this, ref ev);
1172-
}
1173-
11741149
[Obsolete("Use SpriteSystem instead.")]
11751150
internal static RSI.State GetFallbackState(IResourceCache cache)
11761151
{
@@ -1343,7 +1318,7 @@ public Vector2 Scale
13431318

13441319
_scale = value;
13451320
UpdateLocalMatrix();
1346-
_parent.RebuildBounds();
1321+
_parent.Sys.RebuildBounds((_parent.Owner, _parent));
13471322
}
13481323
}
13491324
internal Vector2 _scale = Vector2.One;
@@ -1358,7 +1333,7 @@ public Angle Rotation
13581333

13591334
_rotation = value;
13601335
UpdateLocalMatrix();
1361-
_parent.RebuildBounds();
1336+
_parent.Sys.RebuildBounds((_parent.Owner, _parent));
13621337
}
13631338
}
13641339
internal Angle _rotation = Angle.Zero;
@@ -1374,8 +1349,9 @@ public bool Visible
13741349
return;
13751350
_visible = value;
13761351

1377-
_parent.QueueUpdateIsInert();
1378-
_parent.RebuildBounds();
1352+
// ReSharper disable once ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
1353+
_parent.Sys?.QueueUpdateIsInert((_parent.Owner, _parent));
1354+
_parent.Sys?.RebuildBounds((_parent.Owner, _parent));
13791355
}
13801356
}
13811357

@@ -1395,7 +1371,8 @@ public bool AutoAnimated
13951371
if (_autoAnimated == value)
13961372
return;
13971373
_autoAnimated = value;
1398-
_parent.QueueUpdateIsInert();
1374+
// ReSharper disable once ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
1375+
_parent.Sys?.QueueUpdateIsInert((_parent.Owner, _parent));
13991376
}
14001377
}
14011378

@@ -1409,7 +1386,8 @@ public Vector2 Offset
14091386

14101387
_offset = value;
14111388
UpdateLocalMatrix();
1412-
_parent.RebuildBounds();
1389+
// ReSharper disable once ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
1390+
_parent.Sys?.RebuildBounds((_parent.Owner, _parent));
14131391
}
14141392
}
14151393

@@ -1581,7 +1559,7 @@ public void SetAutoAnimated(bool value)
15811559
{
15821560
AutoAnimated = value;
15831561

1584-
_parent.QueueUpdateIsInert();
1562+
_parent.Sys.QueueUpdateIsInert((_parent.Owner, _parent));
15851563
}
15861564

15871565
public void SetRsi(RSI? rsi)
@@ -1613,8 +1591,8 @@ public void SetRsi(RSI? rsi)
16131591
}
16141592
}
16151593

1616-
_parent.QueueUpdateRenderTree();
1617-
_parent.QueueUpdateIsInert();
1594+
_parent.TreeSys.QueueTreeUpdate((_parent.Owner, _parent));
1595+
_parent.Sys.QueueUpdateIsInert((_parent.Owner, _parent));
16181596
}
16191597

16201598
public void SetState(RSI.StateId stateId)
@@ -1646,16 +1624,16 @@ public void SetState(RSI.StateId stateId)
16461624
AnimationTime = 0;
16471625
AnimationTimeLeft = state.GetDelay(0);
16481626

1649-
_parent.QueueUpdateIsInert();
1627+
_parent.Sys.QueueUpdateIsInert((_parent.Owner, _parent));
16501628
}
16511629

16521630
public void SetTexture(Texture? texture)
16531631
{
16541632
State = default;
16551633
Texture = texture;
16561634

1657-
_parent.QueueUpdateRenderTree();
1658-
_parent.QueueUpdateIsInert();
1635+
_parent.TreeSys.QueueTreeUpdate((_parent.Owner, _parent));
1636+
_parent.Sys.QueueUpdateIsInert((_parent.Owner, _parent));
16591637
}
16601638

16611639
/// <inheritdoc/>
@@ -1723,7 +1701,8 @@ public Box2 CalculateBoundingBox()
17231701
/// </summary>
17241702
internal void UpdateActualState()
17251703
{
1726-
_parent.QueueUpdateIsInert();
1704+
// ReSharper disable once ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
1705+
_parent.Sys?.QueueUpdateIsInert((_parent.Owner, _parent));
17271706
if (!State.IsValid)
17281707
{
17291708
_actualState = null;
@@ -2078,10 +2057,4 @@ public static IRsiStateLike GetPrototypeIcon(EntityPrototype prototype, IResourc
20782057
return result;
20792058
}
20802059
}
2081-
2082-
2083-
[ByRefEvent]
2084-
internal struct SpriteUpdateInertEvent
2085-
{
2086-
}
20872060
}

Robust.Client/GameObjects/EntitySystems/SpriteSystem.Component.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Collections.Generic;
23
using System.Linq;
34
using Robust.Shared.GameObjects;
@@ -86,6 +87,9 @@ public void CopySprite(SpriteComponent source, SpriteComponent target)
8687

8788
public void RebuildBounds(Entity<SpriteComponent> sprite)
8889
{
90+
// Maybe the bounds calculation should be deferred?
91+
// The tree update is already deferred anyways.
92+
8993
var bounds = new Box2();
9094
foreach (var layer in sprite.Comp.Layers)
9195
{
@@ -96,4 +100,19 @@ public void RebuildBounds(Entity<SpriteComponent> sprite)
96100
sprite.Comp._bounds = bounds.Scale(sprite.Comp.Scale);
97101
_tree.QueueTreeUpdate(sprite);
98102
}
103+
104+
/// <summary>
105+
/// Adds a sprite to a queue that will update <see cref="SpriteComponent.IsInert"/> next frame.
106+
/// </summary>
107+
public void QueueUpdateIsInert(Entity<SpriteComponent> sprite)
108+
{
109+
if (sprite.Comp._inertUpdateQueued)
110+
return;
111+
112+
sprite.Comp._inertUpdateQueued = true;
113+
_inertUpdateQueue.Enqueue(sprite);
114+
}
115+
116+
[Obsolete("Use QueueUpdateIsInert")]
117+
public void QueueUpdateInert(EntityUid uid, SpriteComponent sprite) => QueueUpdateIsInert(new (uid, sprite));
99118
}

Robust.Client/GameObjects/EntitySystems/SpriteSystem.Layer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public bool RemoveLayer(
8080
}
8181

8282
RebuildBounds(sprite!);
83-
sprite.Comp.QueueUpdateIsInert();
83+
QueueUpdateIsInert(sprite!);
8484
return true;
8585
}
8686

@@ -112,7 +112,7 @@ public int AddLayer(Entity<SpriteComponent?> sprite, Layer layer, int? index = n
112112
}
113113

114114
RebuildBounds(sprite!);
115-
sprite.Comp.QueueUpdateIsInert();
115+
QueueUpdateIsInert(sprite!);
116116
return index.Value;
117117
}
118118

Robust.Client/GameObjects/EntitySystems/SpriteSystem.cs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ public override void Initialize()
6363
UpdatesAfter.Add(typeof(SpriteTreeSystem));
6464

6565
SubscribeLocalEvent<PrototypesReloadedEventArgs>(OnPrototypesReloaded);
66-
SubscribeLocalEvent<SpriteComponent, SpriteUpdateInertEvent>(QueueUpdateInert);
6766
SubscribeLocalEvent<SpriteComponent, ComponentInit>(OnInit);
6867

6968
Subs.CVar(_cfg, CVars.RenderSpriteDirectionBias, OnBiasChanged, true);
@@ -87,18 +86,6 @@ private void OnBiasChanged(double value)
8786
SpriteComponent.DirectionBias = value;
8887
}
8988

90-
private void QueueUpdateInert(EntityUid uid, SpriteComponent sprite, ref SpriteUpdateInertEvent ev)
91-
=> QueueUpdateInert(uid, sprite);
92-
93-
public void QueueUpdateInert(EntityUid uid, SpriteComponent sprite)
94-
{
95-
if (sprite._inertUpdateQueued)
96-
return;
97-
98-
sprite._inertUpdateQueued = true;
99-
_inertUpdateQueue.Enqueue(sprite);
100-
}
101-
10289
private void DoUpdateIsInert(SpriteComponent component)
10390
{
10491
component._inertUpdateQueued = false;

0 commit comments

Comments
 (0)