]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add ImplicitRoofComponent (#36112)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Sun, 18 May 2025 07:47:35 +0000 (17:47 +1000)
committerGitHub <noreply@github.com>
Sun, 18 May 2025 07:47:35 +0000 (17:47 +1000)
* Add ImplicitRoofComponent

So shuttles get marked as rooved.

* Early-out

So the new render doesn't suck up perf unnecessarily.

Content.Client/Light/RoofOverlay.cs
Content.Server/Shuttles/Systems/ShuttleSystem.cs
Content.Shared/Light/Components/ImplicitRoofComponent.cs [new file with mode: 0644]

index 894463016936be9a2163132fb0a92bf0e364e058..6e43466c24fed8eebab766f9506cc7e367cb74fe 100644 (file)
@@ -43,7 +43,7 @@ public sealed class RoofOverlay : Overlay
 
     protected override void Draw(in OverlayDrawArgs args)
     {
-        if (args.Viewport.Eye == null)
+        if (args.Viewport.Eye == null || !_entManager.HasComponent<MapLightComponent>(args.MapUid))
             return;
 
         var viewport = args.Viewport;
@@ -55,23 +55,41 @@ public sealed class RoofOverlay : Overlay
         var target = lightoverlay.EnlargedLightTarget;
 
         _grids.Clear();
-        _mapManager.FindGridsIntersecting(args.MapId, bounds, ref _grids);
+        _mapManager.FindGridsIntersecting(args.MapId, bounds, ref _grids, approx: true, includeMap: true);
+        var lightScale = viewport.LightRenderTarget.Size / (Vector2) viewport.Size;
+        var scale = viewport.RenderScale / (Vector2.One / lightScale);
 
-        for (var i = _grids.Count - 1; i >= 0; i--)
-        {
-            var grid = _grids[i];
+        worldHandle.RenderInRenderTarget(target,
+            () =>
+            {
+                for (var i = 0; i < _grids.Count; i++)
+                {
+                    var grid = _grids[i];
 
-            if (_entManager.HasComponent<RoofComponent>(grid.Owner))
-                continue;
+                    if (!_entManager.TryGetComponent(grid.Owner, out ImplicitRoofComponent? roof))
+                        continue;
 
-            _grids.RemoveAt(i);
-        }
+                    var invMatrix = target.GetWorldToLocalMatrix(eye, scale);
 
-        if (_grids.Count == 0)
-            return;
+                    var gridMatrix = _xformSystem.GetWorldMatrix(grid.Owner);
+                    var matty = Matrix3x2.Multiply(gridMatrix, invMatrix);
 
-        var lightScale = viewport.LightRenderTarget.Size / (Vector2) viewport.Size;
-        var scale = viewport.RenderScale / (Vector2.One / lightScale);
+                    worldHandle.SetTransform(matty);
+
+                    var tileEnumerator = _mapSystem.GetTilesEnumerator(grid.Owner, grid, bounds);
+                    var color = roof.Color;
+
+                    while (tileEnumerator.MoveNext(out var tileRef))
+                    {
+                        var local = _lookup.GetLocalBounds(tileRef, grid.Comp.TileSize);
+                        worldHandle.DrawRect(local, color);
+                    }
+
+                    // Don't need it for the next stage.
+                    _grids.RemoveAt(i);
+                    i--;
+                }
+            }, null);
 
         worldHandle.RenderInRenderTarget(target,
             () =>
index 4eb96692980ed462db47c3c502d1af8e0cd6dced..4b0e076a4f2a0bf28140f54f3bff3af77e88a1cf 100644 (file)
@@ -11,6 +11,7 @@ using Content.Server.Stunnable;
 using Content.Shared.Buckle.Components;
 using Content.Shared.Damage;
 using Content.Shared.GameTicking;
+using Content.Shared.Light.Components;
 using Content.Shared.Inventory;
 using Content.Shared.Mobs.Systems;
 using Content.Shared.Movement.Events;
@@ -121,7 +122,8 @@ public sealed partial class ShuttleSystem : SharedShuttleSystem
         if (HasComp<MapComponent>(ev.EntityUid))
             return;
 
-        EntityManager.EnsureComponent<ShuttleComponent>(ev.EntityUid);
+        EnsureComp<ShuttleComponent>(ev.EntityUid);
+        EnsureComp<ImplicitRoofComponent>(ev.EntityUid);
     }
 
     private void OnShuttleStartup(EntityUid uid, ShuttleComponent component, ComponentStartup args)
diff --git a/Content.Shared/Light/Components/ImplicitRoofComponent.cs b/Content.Shared/Light/Components/ImplicitRoofComponent.cs
new file mode 100644 (file)
index 0000000..b457bac
--- /dev/null
@@ -0,0 +1,13 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Light.Components;
+
+/// <summary>
+/// Assumes the entire attached grid is rooved.
+/// </summary>
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class ImplicitRoofComponent : Component
+{
+    [DataField, AutoNetworkedField]
+    public Color Color = Color.Black;
+}