Layering for atmospheric pipes (#36124)
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Co-authored-by: Kevin Zheng <kevinz5000@gmail.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using Content.Client.SubFloor;
|
||||
using Content.Shared.Atmos;
|
||||
using Content.Shared.Atmos.Components;
|
||||
using Content.Shared.Atmos.EntitySystems;
|
||||
using Content.Shared.Atmos.Piping;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
@@ -8,7 +9,7 @@ using Robust.Client.GameObjects;
|
||||
namespace Content.Client.Atmos.EntitySystems;
|
||||
|
||||
[UsedImplicitly]
|
||||
public sealed class AtmosPipeAppearanceSystem : EntitySystem
|
||||
public sealed partial class AtmosPipeAppearanceSystem : SharedAtmosPipeAppearanceSystem
|
||||
{
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly SpriteSystem _sprite = default!;
|
||||
@@ -26,26 +27,37 @@ public sealed class AtmosPipeAppearanceSystem : EntitySystem
|
||||
if (!TryComp(uid, out SpriteComponent? sprite))
|
||||
return;
|
||||
|
||||
var numberOfPipeLayers = GetNumberOfPipeLayers(uid, out _);
|
||||
|
||||
foreach (var layerKey in Enum.GetValues<PipeConnectionLayer>())
|
||||
{
|
||||
var layer = _sprite.LayerMapReserve((uid, sprite), layerKey);
|
||||
_sprite.LayerSetRsi((uid, sprite), layer, component.Sprite.RsiPath);
|
||||
_sprite.LayerSetRsiState((uid, sprite), layer, component.Sprite.RsiState);
|
||||
_sprite.LayerSetDirOffset((uid, sprite), layer, ToOffset(layerKey));
|
||||
for (byte i = 0; i < numberOfPipeLayers; i++)
|
||||
{
|
||||
var layerName = layerKey.ToString() + i.ToString();
|
||||
var layer = _sprite.LayerMapReserve((uid, sprite), layerName);
|
||||
_sprite.LayerSetRsi((uid, sprite), layer, component.Sprite[i].RsiPath);
|
||||
_sprite.LayerSetRsiState((uid, sprite), layer, component.Sprite[i].RsiState);
|
||||
_sprite.LayerSetDirOffset((uid, sprite), layer, ToOffset(layerKey));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void HideAllPipeConnection(Entity<SpriteComponent> entity)
|
||||
private void HideAllPipeConnection(Entity<SpriteComponent> entity, AtmosPipeLayersComponent? atmosPipeLayers, int numberOfPipeLayers)
|
||||
{
|
||||
var sprite = entity.Comp;
|
||||
|
||||
foreach (var layerKey in Enum.GetValues<PipeConnectionLayer>())
|
||||
{
|
||||
if (!_sprite.LayerMapTryGet(entity.AsNullable(), layerKey, out var key, false))
|
||||
continue;
|
||||
for (byte i = 0; i < numberOfPipeLayers; i++)
|
||||
{
|
||||
var layerName = layerKey.ToString() + i.ToString();
|
||||
|
||||
var layer = sprite[key];
|
||||
layer.Visible = false;
|
||||
if (!_sprite.LayerMapTryGet(entity.AsNullable(), layerName, out var key, false))
|
||||
continue;
|
||||
|
||||
var layer = sprite[key];
|
||||
layer.Visible = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,33 +73,45 @@ public sealed class AtmosPipeAppearanceSystem : EntitySystem
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_appearance.TryGetData<PipeDirection>(uid, PipeVisuals.VisualState, out var worldConnectedDirections, args.Component))
|
||||
var numberOfPipeLayers = GetNumberOfPipeLayers(uid, out var atmosPipeLayers);
|
||||
|
||||
if (!_appearance.TryGetData<int>(uid, PipeVisuals.VisualState, out var worldConnectedDirections, args.Component))
|
||||
{
|
||||
HideAllPipeConnection((uid, args.Sprite));
|
||||
HideAllPipeConnection((uid, args.Sprite), atmosPipeLayers, numberOfPipeLayers);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_appearance.TryGetData<Color>(uid, PipeColorVisuals.Color, out var color, args.Component))
|
||||
color = Color.White;
|
||||
|
||||
// transform connected directions to local-coordinates
|
||||
var connectedDirections = worldConnectedDirections.RotatePipeDirection(-Transform(uid).LocalRotation);
|
||||
|
||||
foreach (var layerKey in Enum.GetValues<PipeConnectionLayer>())
|
||||
for (byte i = 0; i < numberOfPipeLayers; i++)
|
||||
{
|
||||
if (!_sprite.LayerMapTryGet((uid, args.Sprite), layerKey, out var key, false))
|
||||
continue;
|
||||
// Extract the cardinal pipe orientations for the current pipe layer
|
||||
// '15' is the four bit mask that is used to extract the pipe orientations of interest from 'worldConnectedDirections'
|
||||
// Fun fact: a collection of four bits is called a 'nibble'! They aren't natively supported :(
|
||||
var pipeLayerConnectedDirections = (PipeDirection)(15 & (worldConnectedDirections >> (PipeDirectionHelpers.PipeDirections * i)));
|
||||
|
||||
var layer = args.Sprite[key];
|
||||
var dir = (PipeDirection)layerKey;
|
||||
var visible = connectedDirections.HasDirection(dir);
|
||||
// Transform the connected directions to local-coordinates
|
||||
var connectedDirections = pipeLayerConnectedDirections.RotatePipeDirection(-Transform(uid).LocalRotation);
|
||||
|
||||
layer.Visible &= visible;
|
||||
foreach (var layerKey in Enum.GetValues<PipeConnectionLayer>())
|
||||
{
|
||||
var layerName = layerKey.ToString() + i.ToString();
|
||||
|
||||
if (!visible)
|
||||
continue;
|
||||
if (!_sprite.LayerMapTryGet((uid, args.Sprite), layerName, out var key, false))
|
||||
continue;
|
||||
|
||||
layer.Color = color;
|
||||
var layer = args.Sprite[key];
|
||||
var dir = (PipeDirection)layerKey;
|
||||
var visible = connectedDirections.HasDirection(dir);
|
||||
|
||||
layer.Visible &= visible;
|
||||
|
||||
if (!visible)
|
||||
continue;
|
||||
|
||||
layer.Color = color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user