Skip to content

Commit 52e8f01

Browse files
PJB3005taydeo
authored andcommitted
Fix displacement map rendering in UI (#38042)
Fix displacement map rendering 918709c changed the way humans work to completely remove the stencil mask thing for clothing cutouts, in favor of displacement maps. Except it didn't actually remove the stencil parameters from the shader prototype, so this caused the shader to render incorrectly in SpriteView instances. I introduced a new DisplacedDraw shader that doesn't have the stencil in use, as removing the old one would probably be a more annoying breaking change. Fixes #37629
1 parent 0c0a18b commit 52e8f01

3 files changed

Lines changed: 25 additions & 16 deletions

File tree

Content.Client/Holopad/HolopadSystem.cs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public sealed class HolopadSystem : SharedHolopadSystem
2727
{
2828
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
2929
[Dependency] private readonly IGameTiming _timing = default!;
30+
[Dependency] private readonly SpriteSystem _sprite = default!;
3031

3132
public override void Initialize()
3233
{
@@ -72,26 +73,25 @@ private void UpdateHologramSprite(EntityUid hologram, EntityUid? target)
7273
return;
7374

7475
// Remove all sprite layers
75-
for (int i = hologramSprite.AllLayers.Count() - 1; i >= 0; i--)
76-
hologramSprite.RemoveLayer(i);
76+
for (var i = hologramSprite.AllLayers.Count() - 1; i >= 0; i--)
77+
_sprite.RemoveLayer((hologram, hologramSprite), i);
7778

7879
if (TryComp<SpriteComponent>(target, out var targetSprite))
7980
{
8081
// Use the target's holographic avatar (if available)
8182
if (TryComp<HolographicAvatarComponent>(target, out var targetAvatar) &&
8283
targetAvatar.LayerData != null)
8384
{
84-
for (int i = 0; i < targetAvatar.LayerData.Length; i++)
85+
for (var i = 0; i < targetAvatar.LayerData.Length; i++)
8586
{
86-
var layer = targetAvatar.LayerData[i];
87-
hologramSprite.AddLayer(targetAvatar.LayerData[i], i);
87+
_sprite.AddLayer((hologram, hologramSprite), targetAvatar.LayerData[i], i);
8888
}
8989
}
9090

9191
// Otherwise copy the target's current physical appearance
9292
else
9393
{
94-
hologramSprite.CopyFrom(targetSprite);
94+
_sprite.CopySprite((target.Value, targetSprite), (hologram, hologramSprite));
9595
}
9696
}
9797

@@ -101,25 +101,27 @@ private void UpdateHologramSprite(EntityUid hologram, EntityUid? target)
101101
if (string.IsNullOrEmpty(holopadhologram.RsiPath) || string.IsNullOrEmpty(holopadhologram.RsiState))
102102
return;
103103

104-
var layer = new PrototypeLayerData();
105-
layer.RsiPath = holopadhologram.RsiPath;
106-
layer.State = holopadhologram.RsiState;
104+
var layer = new PrototypeLayerData
105+
{
106+
RsiPath = holopadhologram.RsiPath,
107+
State = holopadhologram.RsiState
108+
};
107109

108-
hologramSprite.AddLayer(layer);
110+
_sprite.AddLayer((hologram, hologramSprite), layer, null);
109111
}
110112

111113
// Override specific values
112-
hologramSprite.Color = Color.White;
113-
hologramSprite.Offset = holopadhologram.Offset;
114-
hologramSprite.DrawDepth = (int)DrawDepth.Mobs;
114+
_sprite.SetColor((hologram, hologramSprite), Color.White);
115+
_sprite.SetOffset((hologram, hologramSprite), holopadhologram.Offset);
116+
_sprite.SetDrawDepth((hologram, hologramSprite), (int)DrawDepth.Mobs);
115117
hologramSprite.NoRotation = true;
116118
hologramSprite.DirectionOverride = Direction.South;
117119
hologramSprite.EnableDirectionOverride = true;
118120

119121
// Remove shading from all layers (except displacement maps)
120-
for (int i = 0; i < hologramSprite.AllLayers.Count(); i++)
122+
for (var i = 0; i < hologramSprite.AllLayers.Count(); i++)
121123
{
122-
if (hologramSprite.TryGetLayer(i, out var layer) && layer.ShaderPrototype != "DisplacedStencilDraw")
124+
if (_sprite.TryGetLayer((hologram, hologramSprite), i, out var layer, false) && layer.ShaderPrototype != "DisplacedDraw")
123125
hologramSprite.LayerSetShader(i, "unshaded");
124126
}
125127

Content.Shared/DisplacementMap/DisplacementData.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ public sealed partial class DisplacementData
1515
public Dictionary<int, PrototypeLayerData> SizeMaps = new();
1616

1717
[DataField]
18-
public string? ShaderOverride = "DisplacedStencilDraw";
18+
public string? ShaderOverride = "DisplacedDraw";
1919
}

Resources/Prototypes/Shaders/displacement.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,10 @@
1313
func: NotEqual
1414
params:
1515
displacementSize: 127
16+
17+
- type: shader
18+
id: DisplacedDraw
19+
kind: source
20+
path: "/Textures/Shaders/displacement.swsl"
21+
params:
22+
displacementSize: 127

0 commit comments

Comments
 (0)