From 1bd5e315200f5303d933106ab1bfe58a559756a4 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sun, 26 Mar 2023 18:06:17 +0200 Subject: [PATCH] Update shaders and DrawNodes --- Directory.Build.props | 2 +- .../Mods/SentakkiModHidden.cs | 25 ++++++++++++++++--- .../Resources/Shaders/sh_PlayfieldMask.fs | 15 +++++++---- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 7e55cac0a..bd56ff373 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 9.0 + 10.0 true true true diff --git a/osu.Game.Rulesets.Sentakki/Mods/SentakkiModHidden.cs b/osu.Game.Rulesets.Sentakki/Mods/SentakkiModHidden.cs index 5cc0c8fc5..17dc73f29 100644 --- a/osu.Game.Rulesets.Sentakki/Mods/SentakkiModHidden.cs +++ b/osu.Game.Rulesets.Sentakki/Mods/SentakkiModHidden.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.InteropServices; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -6,6 +7,7 @@ using osu.Framework.Graphics.Rendering; using osu.Framework.Graphics.Rendering.Vertices; using osu.Framework.Graphics.Shaders; +using osu.Framework.Graphics.Shaders.Types; using osu.Framework.Localisation; using osu.Game.Graphics.OpenGL.Vertices; using osu.Game.Rulesets.Mods; @@ -192,6 +194,8 @@ private class PlayfieldMaskDrawNode : DrawNode private IShader shader = null!; private Quad screenSpaceDrawQuad; + private IUniformBuffer? maskParameters; + private Vector2 maskPosition; private Vector2 maskRadius; @@ -222,6 +226,14 @@ public override void Draw(IRenderer renderer) { base.Draw(renderer); + maskParameters = renderer.CreateUniformBuffer(); + + maskParameters.Data = maskParameters.Data with + { + MaskPosition = maskPosition, + MaskRadius = maskRadius + }; + if (quadBatch == null) { quadBatch = renderer.CreateQuadBatch(1, 1); @@ -233,9 +245,7 @@ public override void Draw(IRenderer renderer) } shader.Bind(); - - shader.GetUniform("maskPosition").UpdateValue(ref maskPosition); - shader.GetUniform("maskRadius").UpdateValue(ref maskRadius); + shader.BindUniformBlock("m_maskParameters", maskParameters); renderer.DrawQuad(renderer.WhitePixel, screenSpaceDrawQuad, DrawColourInfo.Colour, vertexAction: addAction); @@ -245,8 +255,17 @@ public override void Draw(IRenderer renderer) protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing); + maskParameters?.Dispose(); quadBatch?.Dispose(); } + + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + private record struct MaskParameters + { + public UniformVector2 MaskPosition; + public UniformVector2 MaskRadius; + } } } } diff --git a/osu.Game.Rulesets.Sentakki/Resources/Shaders/sh_PlayfieldMask.fs b/osu.Game.Rulesets.Sentakki/Resources/Shaders/sh_PlayfieldMask.fs index 51aa67df2..a1b99815a 100644 --- a/osu.Game.Rulesets.Sentakki/Resources/Shaders/sh_PlayfieldMask.fs +++ b/osu.Game.Rulesets.Sentakki/Resources/Shaders/sh_PlayfieldMask.fs @@ -1,11 +1,16 @@ -varying highp vec2 v_Position; -varying lowp vec4 v_Colour; +layout(location = 0) in highp vec2 v_Position; +layout(location = 1) in lowp vec4 v_Colour; -uniform highp vec2 maskPosition; -uniform highp vec2 maskRadius; +layout(std140, set = 0, binding = 0) uniform m_maskParameters +{ + highp vec2 maskPosition; + highp vec2 maskRadius; +}; const mediump float smoothness = 2.0; +layout(location = 0) out vec4 o_Colour; + // highp precision is necessary for vertex positions to prevent catastrophic failure on GL_ES platforms lowp vec4 getColourAt(highp vec2 diff, highp vec2 size, lowp vec4 originalColour) { @@ -17,5 +22,5 @@ lowp vec4 getColourAt(highp vec2 diff, highp vec2 size, lowp vec4 originalColour void main(void) { - gl_FragColor = mix(getColourAt(maskPosition - v_Position, maskRadius, v_Colour), vec4(0.0, 0.0, 0.0, 1.0), 0.0); + o_Colour = mix(getColourAt(maskPosition - v_Position, maskRadius, v_Colour), vec4(0.0, 0.0, 0.0, 1.0), 0.0); }