DecalPlacementOverlay.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System.Numerics;
  2. using Robust.Client.GameObjects;
  3. using Robust.Client.Graphics;
  4. using Robust.Client.Input;
  5. using Robust.Shared.Enums;
  6. using Robust.Shared.Map;
  7. using Robust.Shared.Prototypes;
  8. namespace Content.Client.Decals.Overlays;
  9. public sealed class DecalPlacementOverlay : Overlay
  10. {
  11. [Dependency] private readonly IEyeManager _eyeManager = default!;
  12. [Dependency] private readonly IInputManager _inputManager = default!;
  13. [Dependency] private readonly IMapManager _mapManager = default!;
  14. private readonly DecalPlacementSystem _placement;
  15. private readonly SharedTransformSystem _transform;
  16. private readonly SpriteSystem _sprite;
  17. public override OverlaySpace Space => OverlaySpace.WorldSpaceEntities;
  18. public DecalPlacementOverlay(DecalPlacementSystem placement, SharedTransformSystem transform, SpriteSystem sprite)
  19. {
  20. IoCManager.InjectDependencies(this);
  21. _placement = placement;
  22. _transform = transform;
  23. _sprite = sprite;
  24. ZIndex = 1000;
  25. }
  26. protected override void Draw(in OverlayDrawArgs args)
  27. {
  28. var (decal, snap, rotation, color) = _placement.GetActiveDecal();
  29. if (decal == null)
  30. return;
  31. var mouseScreenPos = _inputManager.MouseScreenPosition;
  32. var mousePos = _eyeManager.PixelToMap(mouseScreenPos);
  33. if (mousePos.MapId != args.MapId)
  34. return;
  35. // No map support for decals
  36. if (!_mapManager.TryFindGridAt(mousePos, out var gridUid, out var grid))
  37. {
  38. return;
  39. }
  40. var worldMatrix = _transform.GetWorldMatrix(gridUid);
  41. var invMatrix = _transform.GetInvWorldMatrix(gridUid);
  42. var handle = args.WorldHandle;
  43. handle.SetTransform(worldMatrix);
  44. var localPos = Vector2.Transform(mousePos.Position, invMatrix);
  45. if (snap)
  46. {
  47. localPos = localPos.Floored() + grid.TileSizeHalfVector;
  48. }
  49. // Nothing uses snap cardinals so probably don't need preview?
  50. var aabb = Box2.UnitCentered.Translated(localPos);
  51. var box = new Box2Rotated(aabb, rotation, localPos);
  52. handle.DrawTextureRect(_sprite.Frame0(decal.Sprite), box, color);
  53. handle.SetTransform(Matrix3x2.Identity);
  54. }
  55. }