StencilOverlay.RestrictedRange.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System.Numerics;
  2. using Content.Shared.Salvage;
  3. using Robust.Client.Graphics;
  4. using Robust.Shared.Utility;
  5. namespace Content.Client.Overlays;
  6. public sealed partial class StencilOverlay
  7. {
  8. private void DrawRestrictedRange(in OverlayDrawArgs args, RestrictedRangeComponent rangeComp, Matrix3x2 invMatrix)
  9. {
  10. var worldHandle = args.WorldHandle;
  11. var renderScale = args.Viewport.RenderScale.X;
  12. // TODO: This won't handle non-standard zooms so uhh yeah, not sure how to structure it on the shader side.
  13. var zoom = args.Viewport.Eye?.Zoom ?? Vector2.One;
  14. var length = zoom.X;
  15. var bufferRange = MathF.Min(10f, rangeComp.Range);
  16. var pixelCenter = Vector2.Transform(rangeComp.Origin, invMatrix);
  17. // Something something offset?
  18. var vertical = args.Viewport.Size.Y;
  19. var pixelMaxRange = rangeComp.Range * renderScale / length * EyeManager.PixelsPerMeter;
  20. var pixelBufferRange = bufferRange * renderScale / length * EyeManager.PixelsPerMeter;
  21. var pixelMinRange = pixelMaxRange - pixelBufferRange;
  22. _shader.SetParameter("position", new Vector2(pixelCenter.X, vertical - pixelCenter.Y));
  23. _shader.SetParameter("maxRange", pixelMaxRange);
  24. _shader.SetParameter("minRange", pixelMinRange);
  25. _shader.SetParameter("bufferRange", pixelBufferRange);
  26. _shader.SetParameter("gradient", 0.80f);
  27. var worldAABB = args.WorldAABB;
  28. var worldBounds = args.WorldBounds;
  29. var position = args.Viewport.Eye?.Position.Position ?? Vector2.Zero;
  30. var localAABB = invMatrix.TransformBox(worldAABB);
  31. // Cut out the irrelevant bits via stencil
  32. // This is why we don't just use parallax; we might want specific tiles to get drawn over
  33. // particularly for planet maps or stations.
  34. worldHandle.RenderInRenderTarget(_blep!, () =>
  35. {
  36. worldHandle.UseShader(_shader);
  37. worldHandle.DrawRect(localAABB, Color.White);
  38. }, Color.Transparent);
  39. worldHandle.SetTransform(Matrix3x2.Identity);
  40. worldHandle.UseShader(_protoManager.Index<ShaderPrototype>("StencilMask").Instance());
  41. worldHandle.DrawTextureRect(_blep!.Texture, worldBounds);
  42. var curTime = _timing.RealTime;
  43. var sprite = _sprite.GetFrame(new SpriteSpecifier.Texture(new ResPath("/Textures/Parallaxes/noise.png")), curTime);
  44. // Draw the rain
  45. worldHandle.UseShader(_protoManager.Index<ShaderPrototype>("StencilDraw").Instance());
  46. _parallax.DrawParallax(worldHandle, worldAABB, sprite, curTime, position, new Vector2(0.5f, 0f));
  47. }
  48. }