From 58d47308142688f260736bd5bfe648d0bded5b12 Mon Sep 17 00:00:00 2001 From: ItsLemmy Date: Tue, 25 Nov 2025 20:25:01 -0500 Subject: [PATCH] Restore rounded_image shader for the SetupWizard for now. --- Shaders/frag/rounded_image.frag | 56 +++++++++++++++++++++++++++++ Shaders/qsb/rounded_image.frag.qsb | Bin 0 -> 2750 bytes 2 files changed, 56 insertions(+) create mode 100644 Shaders/frag/rounded_image.frag create mode 100644 Shaders/qsb/rounded_image.frag.qsb diff --git a/Shaders/frag/rounded_image.frag b/Shaders/frag/rounded_image.frag new file mode 100644 index 00000000..9d493b21 --- /dev/null +++ b/Shaders/frag/rounded_image.frag @@ -0,0 +1,56 @@ +#version 450 + +layout(location = 0) in vec2 qt_TexCoord0; +layout(location = 0) out vec4 fragColor; + +layout(binding = 1) uniform sampler2D source; + +layout(std140, binding = 0) uniform buf { + mat4 qt_Matrix; + float qt_Opacity; + // Custom properties with non-conflicting names + float itemWidth; + float itemHeight; + float cornerRadius; + float imageOpacity; +} ubuf; + +// Function to calculate the signed distance from a point to a rounded box +float roundedBoxSDF(vec2 centerPos, vec2 boxSize, float radius) { + vec2 d = abs(centerPos) - boxSize + radius; + return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0) - radius; +} + +void main() { + // Get size from uniforms + vec2 itemSize = vec2(ubuf.itemWidth, ubuf.itemHeight); + float cornerRadius = ubuf.cornerRadius; + float itemOpacity = ubuf.imageOpacity; + + // Normalize coordinates to [-0.5, 0.5] range + vec2 uv = qt_TexCoord0 - 0.5; + + // Scale by aspect ratio to maintain uniform rounding + vec2 aspectRatio = itemSize / max(itemSize.x, itemSize.y); + uv *= aspectRatio; + + // Calculate half size in normalized space + vec2 halfSize = 0.5 * aspectRatio; + + // Normalize the corner radius + float normalizedRadius = cornerRadius / max(itemSize.x, itemSize.y); + + // Calculate distance to rounded rectangle + float distance = roundedBoxSDF(uv, halfSize, normalizedRadius); + + // Create smooth alpha mask + float smoothedAlpha = 1.0 - smoothstep(0.0, fwidth(distance), distance); + + // Sample the texture + vec4 color = texture(source, qt_TexCoord0); + + // Apply the rounded mask and opacity + // Make sure areas outside the rounded rect are completely transparent + float finalAlpha = color.a * smoothedAlpha * itemOpacity * ubuf.qt_Opacity; + fragColor = vec4(color.rgb * finalAlpha, finalAlpha); +} \ No newline at end of file diff --git a/Shaders/qsb/rounded_image.frag.qsb b/Shaders/qsb/rounded_image.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..666f6434973c9fd0eb50651c6d43250023c55b53 GIT binary patch literal 2750 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 El;wG(X8-^I literal 0 HcmV?d00001