From 3ba55d07988315f7182cbdd4e9f5380b75aa7dfe Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Fri, 18 Feb 2022 10:31:11 +1300 Subject: [PATCH] Fix rotated pipe connection visuals (#6756) --- .../AtmosPipeAppearanceSystem.cs | 22 ++++++++++++++---- .../Components/PipeAppearanceComponent.cs | 2 +- .../Piping/Atmospherics/pipe.rsi/meta.json | 17 ++++---------- .../Atmospherics/pipe.rsi/pipeConnector.png | Bin 0 -> 1526 bytes .../pipe.rsi/pipeConnectorEast.png | Bin 1029 -> 0 bytes .../pipe.rsi/pipeConnectorNorth.png | Bin 1113 -> 0 bytes .../pipe.rsi/pipeConnectorSouth.png | Bin 1140 -> 0 bytes .../pipe.rsi/pipeConnectorWest.png | Bin 1047 -> 0 bytes .../Atmospherics/pipe.rsi/pipeFourway.png | Bin 2244 -> 4871 bytes 9 files changed, 23 insertions(+), 18 deletions(-) create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/pipeConnector.png delete mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/pipeConnectorEast.png delete mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/pipeConnectorNorth.png delete mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/pipeConnectorSouth.png delete mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/pipeConnectorWest.png diff --git a/Content.Client/Atmos/EntitySystems/AtmosPipeAppearanceSystem.cs b/Content.Client/Atmos/EntitySystems/AtmosPipeAppearanceSystem.cs index 38076ef5a6..44323d2af7 100644 --- a/Content.Client/Atmos/EntitySystems/AtmosPipeAppearanceSystem.cs +++ b/Content.Client/Atmos/EntitySystems/AtmosPipeAppearanceSystem.cs @@ -37,8 +37,9 @@ public sealed class AtmosPipeAppearanceSystem : EntitySystem sprite.LayerMapReserveBlank(layerKey); var layer = sprite.LayerMapGet(layerKey); sprite.LayerSetRSI(layer, rsi.RSI); - var layerState = component.BaseState + (PipeDirection) layerKey; + var layerState = component.State; sprite.LayerSetState(layer, layerState); + sprite.LayerSetDirOffset(layer, ToOffset(layerKey)); } } @@ -50,11 +51,12 @@ public sealed class AtmosPipeAppearanceSystem : EntitySystem if (!args.Component.TryGetData(PipeColorVisuals.Color, out Color color)) color = Color.White; - if (!args.Component.TryGetData(PipeVisuals.VisualState, out PipeDirection connectedDirections)) + if (!args.Component.TryGetData(PipeVisuals.VisualState, out PipeDirection worldConnectedDirections)) return; - var rotation = Transform(uid).LocalRotation; - + // transform connected directions to local-coordinates + var connectedDirections = worldConnectedDirections.RotatePipeDirection(-Transform(uid).LocalRotation); + foreach (PipeConnectionLayer layerKey in Enum.GetValues(typeof(PipeConnectionLayer))) { if (!sprite.LayerMapTryGet(layerKey, out var key)) @@ -68,11 +70,21 @@ public sealed class AtmosPipeAppearanceSystem : EntitySystem if (!visible) continue; - layer.Rotation = -rotation; layer.Color = color; } } + private SpriteComponent.DirectionOffset ToOffset(PipeConnectionLayer layer) + { + return layer switch + { + PipeConnectionLayer.NorthConnection => SpriteComponent.DirectionOffset.Flip, + PipeConnectionLayer.EastConnection => SpriteComponent.DirectionOffset.CounterClockwise, + PipeConnectionLayer.WestConnection => SpriteComponent.DirectionOffset.Clockwise, + _ => SpriteComponent.DirectionOffset.None, + }; + } + private enum PipeConnectionLayer : byte { NorthConnection = PipeDirection.North, diff --git a/Content.Shared/Atmos/Components/PipeAppearanceComponent.cs b/Content.Shared/Atmos/Components/PipeAppearanceComponent.cs index b7e4ac477c..f36ede3dfb 100644 --- a/Content.Shared/Atmos/Components/PipeAppearanceComponent.cs +++ b/Content.Shared/Atmos/Components/PipeAppearanceComponent.cs @@ -7,5 +7,5 @@ public sealed class PipeAppearanceComponent : Component public string RsiPath = "Structures/Piping/Atmospherics/pipe.rsi"; [DataField("baseState")] - public string BaseState = "pipeConnector"; + public string State = "pipeConnector"; } diff --git a/Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/meta.json b/Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/meta.json index 727ffdb390..b4968add2a 100644 --- a/Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/meta.json +++ b/Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/meta.json @@ -20,23 +20,16 @@ "directions":4 }, { - "name":"pipeFourway", + "name": "pipeFourway", + "directions":4 }, { "name":"pipeStraight", "directions":4 }, { - "name":"pipeConnectorSouth", - }, - { - "name":"pipeConnectorNorth", - }, - { - "name":"pipeConnectorEast", - }, - { - "name":"pipeConnectorWest", + "name":"pipeConnector", + "directions":4 } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/pipeConnector.png b/Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/pipeConnector.png new file mode 100644 index 0000000000000000000000000000000000000000..9f5ad1cbd9bde8102bfa2f4fe40ac03741764737 GIT binary patch literal 1526 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|edgLe!eCHH<1WQ5)j>Dh6Z*Q>2-vT?GbWf5= zX8JKEZETPQs0tMc^S^&R{DX^Qi6N@xR8l%{;k|IhLq5*ytm%mRzOQ(7;r*^X+&UOd zf?CekG%x##c76T8t`Df)w+HK&pL{vGI$j*g8kzBM+2zZT@Yzn+dnng;HNIKS_4CfV zTie<7_#O?x7z%&Ffv1ohxTiIWtRG9=bw!Wy*}9(3JHH>haC>|R-tFljc1OM1J{V&*K78xSB>9uyqdh$MiMd5w*4jJ7Q+pUp@u074~+0h%HeV8y85 zkHriQRTYgvRg;=#En1VLm^7tiY2~PDV$sx+nPn?hv*egHr))Xrl5622NMTx1u~2d; zrB)1D;kx4M3X57BH)*kHOU+ttrPU7l^w_nhZaw$X>);^++kd2CVdPOpoistE8K=%P zZRS~Kb#TqaqpK%3&tAOVP`gmQM~xnk`y4g8P+N$_ZD+5jq1o)k1+8?V3o{_bk$|`@ z1VCtBm>rp7?n*)p$ybW7dV3!Vn8rXVs*M<_ln%7xCM>h!i_&dE-dJtfm~S7 zUC8~4+dHU@x)nt>Kx-GSm>%LtY)CeStJ<%+h9W+ylO24baR}Ft0?S>pDP8%&rQ>$zcuOSV{ilf1Sip~xd z^9&&a%phs19(f^|0lzs&j4Z*l8KW~FGOhN(+|rywJqkF&@VQwIn{sSARM%C7_Uh0U0gpNM5I`Wevh0OsVae52jd@o}$dwOf&zOPL&xMfX}yIL#u zk}84gPL+$mBOWvrc@2j-csxQ|)Sd;q!r`ysgECi!B%nP~quLsI&X@^UHkK2pg?rLE zrM}71;R$*FOO76N;BIkuN)Ya(;9dzn(g9xw5u}l=0@z<$2f`a6_$wUJiWEcgbU=+|CjAqtRfHm43T?FtdU`tC&z^j0xqoV<@0-iHx4p8QX cQ81(d06%*Tbst-`H2?qr07*qoM6N<$f_ss$IsgCw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/pipeConnectorEast.png b/Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/pipeConnectorEast.png deleted file mode 100644 index c26ad0b9cac12e98efe2f1f24feb419ffecefb73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1029 zcmV+g1p51lP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KHmLn$&hTmC5mVj>$g}4@KK;kJCMw z%v)S^l_()3&>3P_PL*Qs604AGB+?-x+IY^w+%p7p~+FQbO#nJ4b%i` zzKw-;+`Qv8N{HMEmP~L)i{^82uav)1ZjR<$OP9!}TdpuJUaJPfSmf3dRscftgoxipQ#eN(hMTl(}3<(JMKw=cgN9IU` zJSOld7&(h_1pzYSPHuvYNC2F~D>nK>+O}+bsd2Obgh`MHG+7E@sT$T#)PyxuOiZ1b z1&fv}TL}_0SO_78bw-saQKQ8WV@xr}k|b%e6jDqnIRvVaAzep5;dEP<^CEPvpL)Mu*xWrrR#wsX-m%hYMQAi7jRz#!4U_7Xd72Ud*tc zRe6zH%zS2S3S&?sTW~rpVj!r4*e2cB-N}8)&6)lyZv0Q=+(P#|$hn2?ko%F_3u?XW zUliGZ)-GH*^)hj=;Rq_6@Q3sG*QNWf4&IL5j{dKXa8h^zMWDoR-`Wql&PmX5zM z_*r>(RC^w^1+JsujP`>thB3lwn;GZIH~!pj8qnQQt+Nczh1Lkv3fDHvYKcZ_>m&GU z>Ao}gS^0MKcJy}iTH+(VG@o(FIL_Ee%b8qXSKV=L{h;hB*KLfouX_gQMG%00000NkvXXu0mjfo{!BP diff --git a/Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/pipeConnectorNorth.png b/Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/pipeConnectorNorth.png deleted file mode 100644 index 30c6e83d71e8e4c619ca6f5b1c8ba8ab41f54a1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1113 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 P0000