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;
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,
() =>
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;
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)
--- /dev/null
+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;
+}