1
0

DisplacementMapSystem.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using Content.Shared.DisplacementMap;
  2. using Robust.Client.GameObjects;
  3. using Robust.Client.Graphics;
  4. using Robust.Shared.Serialization.Manager;
  5. namespace Content.Client.DisplacementMap;
  6. public sealed class DisplacementMapSystem : EntitySystem
  7. {
  8. [Dependency] private readonly ISerializationManager _serialization = default!;
  9. public bool TryAddDisplacement(DisplacementData data, SpriteComponent sprite, int index, string key, HashSet<string> revealedLayers)
  10. {
  11. if (data.ShaderOverride != null)
  12. sprite.LayerSetShader(index, data.ShaderOverride);
  13. var displacementKey = $"{key}-displacement";
  14. if (!revealedLayers.Add(displacementKey))
  15. {
  16. Log.Warning($"Duplicate key for DISPLACEMENT: {displacementKey}.");
  17. return false;
  18. }
  19. //allows you not to write it every time in the YML
  20. foreach (var pair in data.SizeMaps)
  21. {
  22. pair.Value.CopyToShaderParameters??= new()
  23. {
  24. LayerKey = "dummy",
  25. ParameterTexture = "displacementMap",
  26. ParameterUV = "displacementUV",
  27. };
  28. }
  29. if (!data.SizeMaps.ContainsKey(32))
  30. {
  31. Log.Error($"DISPLACEMENT: {displacementKey} don't have 32x32 default displacement map");
  32. return false;
  33. }
  34. // We choose a displacement map from the possible ones, matching the size with the original layer size.
  35. // If there is no such a map, we use a standard 32 by 32 one
  36. var displacementDataLayer = data.SizeMaps[EyeManager.PixelsPerMeter];
  37. var actualRSI = sprite.LayerGetActualRSI(index);
  38. if (actualRSI is not null)
  39. {
  40. if (actualRSI.Size.X != actualRSI.Size.Y)
  41. Log.Warning($"DISPLACEMENT: {displacementKey} has a resolution that is not 1:1, things can look crooked");
  42. var layerSize = actualRSI.Size.X;
  43. if (data.SizeMaps.ContainsKey(layerSize))
  44. displacementDataLayer = data.SizeMaps[layerSize];
  45. }
  46. var displacementLayer = _serialization.CreateCopy(displacementDataLayer, notNullableOverride: true);
  47. displacementLayer.CopyToShaderParameters!.LayerKey = key;
  48. sprite.AddLayer(displacementLayer, index);
  49. sprite.LayerMapSet(displacementKey, index);
  50. revealedLayers.Add(displacementKey);
  51. return true;
  52. }
  53. }