Skip to content

Commit 1907837

Browse files
Add before-lighting overlay rendering
Kinda eh but need some way to draw to overlays before lighting is run and all overlays come after.
1 parent 1c3ea96 commit 1907837

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

Robust.Client/Graphics/Clyde/Clyde.LightRendering.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using TKStencilOp = OpenToolkit.Graphics.OpenGL4.StencilOp;
1717
using Robust.Shared.Physics;
1818
using Robust.Client.ComponentTrees;
19+
using Robust.Shared.Enums;
1920
using Robust.Shared.Graphics;
2021
using static Robust.Shared.GameObjects.OccluderComponent;
2122
using Robust.Shared.Utility;
@@ -514,6 +515,8 @@ private void DrawLightsAndFov(Viewport viewport, Box2Rotated worldBounds, Box2 w
514515

515516
CheckGlError();
516517

518+
RenderOverlays(viewport, OverlaySpace.BeforeLighting, worldAABB, worldBounds);
519+
517520
if (_cfg.GetCVar(CVars.LightBlur))
518521
BlurLights(viewport, eye);
519522

Robust.Client/Graphics/IRenderTarget.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System;
2+
using System.Numerics;
3+
using Robust.Shared.Graphics;
24
using Robust.Shared.Maths;
35
using SixLabors.ImageSharp.PixelFormats;
46

@@ -9,6 +11,43 @@ namespace Robust.Client.Graphics
911
/// </summary>
1012
public interface IRenderTarget : IDisposable
1113
{
14+
public Vector2 LocalToWorld(IEye eye, Vector2 point, Vector2 scale)
15+
{
16+
var newPoint = point;
17+
18+
// (inlined version of UiProjMatrix^-1)
19+
newPoint -= Size / 2f;
20+
newPoint *= new Vector2(1, -1) / EyeManager.PixelsPerMeter;
21+
22+
// view matrix
23+
eye.GetViewMatrixInv(out var viewMatrixInv, scale);
24+
newPoint = Vector2.Transform(newPoint, viewMatrixInv);
25+
26+
return newPoint;
27+
}
28+
29+
public Vector2 WorldToLocal(Vector2 point, IEye eye, Vector2 scale)
30+
{
31+
var newPoint = point;
32+
33+
eye.GetViewMatrix(out var viewMatrix, scale);
34+
newPoint = Vector2.Transform(newPoint, viewMatrix);
35+
36+
// (inlined version of UiProjMatrix)
37+
newPoint *= new Vector2(1, -1) * EyeManager.PixelsPerMeter;
38+
newPoint += Size / 2f;
39+
40+
return newPoint;
41+
}
42+
43+
public Matrix3x2 GetWorldToLocalMatrix(IEye eye, Vector2 scale)
44+
{
45+
eye.GetViewMatrix(out var viewMatrix, scale * new Vector2(EyeManager.PixelsPerMeter, -EyeManager.PixelsPerMeter));
46+
viewMatrix.M31 += Size.X / 2f;
47+
viewMatrix.M32 += Size.Y / 2f;
48+
return viewMatrix;
49+
}
50+
1251
/// <summary>
1352
/// The size of the render target, in physical pixels.
1453
/// </summary>

Robust.Shared/Enums/OverlaySpaces.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ public enum OverlaySpace : ushort
5454
/// <summary>
5555
/// Overlay will be rendered below grids, entities, and everything else. In world space.
5656
/// </summary>
57-
WorldSpaceBelowWorld = 1 << 8
57+
WorldSpaceBelowWorld = 1 << 8,
58+
59+
/// <summary>
60+
/// Overlay will be drawn before lighting occurs. Used to apply changes to the lighting render target.
61+
/// </summary>
62+
BeforeLighting = 1 << 9,
5863
}
5964
}

0 commit comments

Comments
 (0)