Skip to content

Commit

Permalink
Add support for overlays to draw controls (#5223)
Browse files Browse the repository at this point in the history
Co-authored-by: metalgearsloth <[email protected]>
  • Loading branch information
ElectroJr and metalgearsloth authored Jan 29, 2025
1 parent de55d1b commit acc7bf7
Show file tree
Hide file tree
Showing 13 changed files with 70 additions and 25 deletions.
7 changes: 5 additions & 2 deletions RELEASE-NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,14 @@ END TEMPLATE-->

### Breaking changes

*None yet*
* `IClydeViewport` overlay rendering methods now take in an `IRenderHandle` instead of a world/screen handle.
* The `OverlayDrawArgs` struct now has an internal constructor.

### New features

*None yet*
* Controls can now be manually restyled via `Control.InvalidateStyleSheet()` and `Control.DoStyleUpdate()`
* Added `IUserInterfaceManager.RenderControl()` for manually drawing controls.
* `OverlayDrawArgs` struct now has an `IRenderHandle` field such that overlays can use the new `RenderControl()` methods.

### Bugfixes

Expand Down
4 changes: 2 additions & 2 deletions Robust.Client/Graphics/Clyde/Clyde.HLR.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ private void RenderSingleWorldOverlay(Overlay overlay, Viewport vp, OverlaySpace
{
DebugTools.Assert(space != OverlaySpace.ScreenSpaceBelowWorld && space != OverlaySpace.ScreenSpace);

var args = new OverlayDrawArgs(space, null, vp, _renderHandle.DrawingHandleWorld, new UIBox2i((0, 0), vp.Size), vp.Eye!.Position.MapId, worldBox, worldBounds);
var args = new OverlayDrawArgs(space, null, vp, _renderHandle, new UIBox2i((0, 0), vp.Size), vp.Eye!.Position.MapId, worldBox, worldBounds);

if (!overlay.BeforeDraw(args))
return;
Expand Down Expand Up @@ -165,7 +165,7 @@ private void RenderOverlays(Viewport vp, OverlaySpace space, in Box2 worldBox, i
private void RenderOverlaysDirect(
Viewport vp,
IViewportControl vpControl,
DrawingHandleBase handle,
IRenderHandle handle,
OverlaySpace space,
in UIBox2i bounds)
{
Expand Down
4 changes: 2 additions & 2 deletions Robust.Client/Graphics/Clyde/Clyde.Viewport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -171,15 +171,15 @@ public Matrix3x2 GetWorldToLocalMatrix()
}

public void RenderScreenOverlaysBelow(
DrawingHandleScreen handle,
IRenderHandle handle,
IViewportControl control,
in UIBox2i viewportBounds)
{
_clyde.RenderOverlaysDirect(this, control, handle, OverlaySpace.ScreenSpaceBelowWorld, viewportBounds);
}

public void RenderScreenOverlaysAbove(
DrawingHandleScreen handle,
IRenderHandle handle,
IViewportControl control,
in UIBox2i viewportBounds)
{
Expand Down
4 changes: 2 additions & 2 deletions Robust.Client/Graphics/Clyde/ClydeHeadless.cs
Original file line number Diff line number Diff line change
Expand Up @@ -497,15 +497,15 @@ public Vector2 WorldToLocal(Vector2 point)
}

public void RenderScreenOverlaysBelow(
DrawingHandleScreen handle,
IRenderHandle handle,
IViewportControl control,
in UIBox2i viewportBounds)
{
// Nada
}

public void RenderScreenOverlaysAbove(
DrawingHandleScreen handle,
IRenderHandle handle,
IViewportControl control,
in UIBox2i viewportBounds)
{
Expand Down
4 changes: 2 additions & 2 deletions Robust.Client/Graphics/IClydeViewport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public interface IClydeViewport : IDisposable
/// Not relative to the current transform of <see cref="handle"/>.
/// </param>
public void RenderScreenOverlaysBelow(
DrawingHandleScreen handle,
IRenderHandle handle,
IViewportControl control,
in UIBox2i viewportBounds);

Expand All @@ -80,7 +80,7 @@ public void RenderScreenOverlaysBelow(
/// Not relative to the current transform of <see cref="handle"/>.
/// </param>
public void RenderScreenOverlaysAbove(
DrawingHandleScreen handle,
IRenderHandle handle,
IViewportControl control,
in UIBox2i viewportBounds);
}
Expand Down
12 changes: 9 additions & 3 deletions Robust.Client/Graphics/Overlays/OverlayDrawArgs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,23 +54,29 @@ public readonly ref struct OverlayDrawArgs
/// </summary>
public readonly Box2Rotated WorldBounds;

public readonly IRenderHandle RenderHandle;

public DrawingHandleScreen ScreenHandle => (DrawingHandleScreen) DrawingHandle;
public DrawingHandleWorld WorldHandle => (DrawingHandleWorld) DrawingHandle;

public OverlayDrawArgs(
internal OverlayDrawArgs(
OverlaySpace space,
IViewportControl? viewportControl,
IClydeViewport viewport,
DrawingHandleBase drawingHandle,
IRenderHandle renderHandle,
in UIBox2i viewportBounds,
in MapId mapId,
in Box2 worldAabb,
in Box2Rotated worldBounds)
{
DrawingHandle = space is OverlaySpace.ScreenSpace or OverlaySpace.ScreenSpaceBelowWorld
? renderHandle.DrawingHandleScreen
: renderHandle.DrawingHandleWorld;

Space = space;
ViewportControl = viewportControl;
Viewport = viewport;
DrawingHandle = drawingHandle;
RenderHandle = renderHandle;
ViewportBounds = viewportBounds;
MapId = mapId;
WorldAABB = worldAabb;
Expand Down
6 changes: 3 additions & 3 deletions Robust.Client/UserInterface/Control.Styling.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ internal void Restyle()
UserInterfaceManagerInternal.QueueStyleUpdate(this);
}

internal void StyleSheetUpdate()
public void InvalidateStyleSheet()
{
_stylesheetUpdateNeeded = true;

Expand All @@ -137,7 +137,7 @@ internal void StyleSheetUpdate()

internal void StylesheetUpdateRecursive()
{
StyleSheetUpdate();
InvalidateStyleSheet();

foreach (var child in Children)
{
Expand All @@ -149,7 +149,7 @@ internal void StylesheetUpdateRecursive()
}
}

internal void DoStyleUpdate()
public void DoStyleUpdate()
{
_styleProperties.Clear();

Expand Down
2 changes: 1 addition & 1 deletion Robust.Client/UserInterface/Control.cs
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,7 @@ protected internal virtual void Draw(DrawingHandleScreen handle)
{
}

internal virtual void DrawInternal(IRenderHandle renderHandle)
protected internal virtual void Draw(IRenderHandle renderHandle)
{
Draw(renderHandle.DrawingHandleScreen);
}
Expand Down
2 changes: 1 addition & 1 deletion Robust.Client/UserInterface/Controls/SpriteView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ private void UpdateSize()
_spriteSize = new Vector2(longestRotatedSide, longestRotatedSide);
}

internal override void DrawInternal(IRenderHandle renderHandle)
protected internal override void Draw(IRenderHandle renderHandle)
{
if (!ResolveEntity(out var uid, out var sprite, out var xform))
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,13 @@ protected internal override void KeyBindUp(GUIBoundKeyEventArgs args)

// -- Handlers: Out --

protected internal override void Draw(DrawingHandleScreen handle)
protected internal override void Draw(IRenderHandle handle)
{
base.Draw(handle);

if (Viewport == null)
{
handle.DrawRect(UIBox2.FromDimensions(new Vector2(0, 0), Size * UIScale), Color.Red);
handle.DrawingHandleScreen.DrawRect(UIBox2.FromDimensions(new Vector2(0, 0), Size * UIScale), Color.Red);
}
else
{
Expand All @@ -82,7 +82,7 @@ protected internal override void Draw(DrawingHandleScreen handle)
Viewport.RenderScreenOverlaysBelow(handle, this, viewportBounds);

Viewport.Render();
handle.DrawTextureRect(Viewport.RenderTarget.Texture,
handle.DrawingHandleScreen.DrawTextureRect(Viewport.RenderTarget.Texture,
UIBox2.FromDimensions(new Vector2(0, 0), (Vector2i) (Viewport.Size / _viewportResolution)));

Viewport.RenderScreenOverlaysAbove(handle, this, viewportBounds);
Expand Down
11 changes: 11 additions & 0 deletions Robust.Client/UserInterface/IUserInterfaceManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Robust.Shared;
using Robust.Shared.Audio.Sources;
using Robust.Shared.Map;
using Robust.Shared.Maths;

namespace Robust.Client.UserInterface
{
Expand Down Expand Up @@ -146,6 +147,16 @@ public partial interface IUserInterfaceManager
/// but not necessarily a new or existing control is rearranged.
/// </summary>
void UpdateHovered();

/// <summary>
/// Render a control and all of its children.
/// </summary>
void RenderControl(in Control.ControlRenderArguments args, Control control);

/// <summary>
/// Render a control and all of its children.
/// </summary>
void RenderControl(IRenderHandle handle, Control control, Vector2i position);
}

public readonly struct PostDrawUIRootEventArgs
Expand Down
2 changes: 1 addition & 1 deletion Robust.Client/UserInterface/UserInterfaceManager.Roots.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public WindowRoot CreateWindowRoot(IClydeWindow window)
_roots.Add(newRoot);
_windowsToRoot.Add(window.Id, newRoot);

newRoot.StyleSheetUpdate();
newRoot.InvalidateStyleSheet();
newRoot.InvalidateMeasure();
QueueMeasureUpdate(newRoot);
QueueArrangeUpdate(newRoot);
Expand Down
31 changes: 28 additions & 3 deletions Robust.Client/UserInterface/UserInterfaceManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,30 @@ public void FrameUpdate(FrameEventArgs args)
}
}

public void RenderControl(in Control.ControlRenderArguments args, Control control)
{
var _ = 0;
RenderControl(args.Handle,
ref _,
control,
args.Position,
args.Modulate,
args.ScissorBox,
args.CoordinateTransform);
}

public void RenderControl(IRenderHandle handle, Control control, Vector2i position)
{
var _ = 0;
RenderControl(handle,
ref _,
control,
position,
Color.White,
null,
Matrix3x2.Identity);
}

public void RenderControl(IRenderHandle renderHandle, ref int total, Control control, Vector2i position, Color modulate,
UIBox2i? scissorBox, Matrix3x2 coordinateTransform)
{
Expand Down Expand Up @@ -393,7 +417,7 @@ public void RenderControl(IRenderHandle renderHandle, ref int total, Control con
// Handle modulation with care.
var oldMod = handle.Modulate;
handle.Modulate = modulate * control.ActualModulateSelf;
control.DrawInternal(renderHandle);
control.Draw(renderHandle);
handle.Modulate = oldMod;
handle.UseShader(null);
}
Expand All @@ -409,10 +433,11 @@ public void RenderControl(IRenderHandle renderHandle, ref int total, Control con

control.PreRenderChildren(ref args);

foreach (var child in control.Children)
for (var index = 0; index < control.ChildCount; index++)
{
var child = control.GetChild(index);
var pos = position + (Vector2i)Vector2.Transform(child.PixelPosition, coordinateTransform);
control.RenderChildOverride(ref args, child.GetPositionInParent(), pos);
control.RenderChildOverride(ref args, index, pos);
}

control.PostRenderChildren(ref args);
Expand Down

0 comments on commit acc7bf7

Please sign in to comment.