From 64960e4dcd2d63de4ca8fbe16be3d2394b89a70c Mon Sep 17 00:00:00 2001 From: bbedward Date: Sun, 19 Oct 2025 12:49:57 -0400 Subject: [PATCH] wallpaper: support different fill modes --- Common/SettingsData.qml | 10 ++- Modules/Settings/PersonalizationTab.qml | 50 +++++++++++++++ Modules/WallpaperBackground.qml | 48 ++++++++++---- Shaders/frag/wp_disc.frag | 80 ++++++++++++------------ Shaders/frag/wp_fade.frag | 65 ++++++++++--------- Shaders/frag/wp_iris_bloom.frag | 49 +++++++++++---- Shaders/frag/wp_pixelate.frag | 58 ++++++++++++----- Shaders/frag/wp_portal.frag | 55 +++++++++++----- Shaders/frag/wp_stripes.frag | 80 ++++++++++++------------ Shaders/frag/wp_wipe.frag | 80 ++++++++++++------------ Shaders/qsb/wp_disc.frag.qsb | Bin 5385 -> 6151 bytes Shaders/qsb/wp_fade.frag.qsb | Bin 4333 -> 5123 bytes Shaders/qsb/wp_iris_bloom.frag.qsb | Bin 5502 -> 6549 bytes Shaders/qsb/wp_pixelate.frag.qsb | Bin 5792 -> 6704 bytes Shaders/qsb/wp_portal.frag.qsb | Bin 5555 -> 6456 bytes Shaders/qsb/wp_stripes.frag.qsb | Bin 8072 -> 8873 bytes Shaders/qsb/wp_wipe.frag.qsb | Bin 5457 -> 6262 bytes 17 files changed, 368 insertions(+), 207 deletions(-) diff --git a/Common/SettingsData.qml b/Common/SettingsData.qml index ff9410f6..b5600f86 100644 --- a/Common/SettingsData.qml +++ b/Common/SettingsData.qml @@ -64,6 +64,7 @@ Singleton { property bool useFahrenheit: false property bool nightModeEnabled: false property int animationSpeed: SettingsData.AnimationSpeed.Short + property string wallpaperFillMode: "Fill" property bool showLauncherButton: true property bool showWorkspaceSwitcher: true @@ -486,6 +487,7 @@ Singleton { widgetBackgroundColor = settings.widgetBackgroundColor !== undefined ? settings.widgetBackgroundColor : "sch" surfaceBase = settings.surfaceBase !== undefined ? settings.surfaceBase : "s" screenPreferences = settings.screenPreferences !== undefined ? settings.screenPreferences : ({}) + wallpaperFillMode = settings.wallpaperFillMode !== undefined ? settings.wallpaperFillMode : "Fill" animationSpeed = settings.animationSpeed !== undefined ? settings.animationSpeed : SettingsData.AnimationSpeed.Short acMonitorTimeout = settings.acMonitorTimeout !== undefined ? settings.acMonitorTimeout : 0 acLockTimeout = settings.acLockTimeout !== undefined ? settings.acLockTimeout : 0 @@ -648,6 +650,7 @@ Singleton { "hideBrightnessSlider": hideBrightnessSlider, "widgetBackgroundColor": widgetBackgroundColor, "surfaceBase": surfaceBase, + "wallpaperFillMode": wallpaperFillMode, "notificationTimeoutLow": notificationTimeoutLow, "notificationTimeoutNormal": notificationTimeoutNormal, "notificationTimeoutCritical": notificationTimeoutCritical, @@ -722,7 +725,7 @@ Singleton { "dankBarGothCornersEnabled", "dankBarBorderEnabled", "dankBarBorderColor", "dankBarBorderOpacity", "dankBarBorderThickness", "popupGapsAuto", "popupGapsManual", "dankBarPosition", "lockScreenShowPowerActions", "enableFprint", "maxFprintTries", - "hideBrightnessSlider", "widgetBackgroundColor", "surfaceBase", + "hideBrightnessSlider", "widgetBackgroundColor", "surfaceBase", "wallpaperFillMode", "notificationTimeoutLow", "notificationTimeoutNormal", "notificationTimeoutCritical", "notificationPopupPosition", "osdAlwaysShowValue", "powerActionConfirm", "customPowerActionLock", "customPowerActionLogout", "customPowerActionSuspend", @@ -1055,6 +1058,11 @@ Singleton { saveSettings() } + function setWallpaperFillMode(mode) { + wallpaperFillMode = mode + saveSettings() + } + function setShowLauncherButton(enabled) { showLauncherButton = enabled saveSettings() diff --git a/Modules/Settings/PersonalizationTab.qml b/Modules/Settings/PersonalizationTab.qml index d1ec6c70..069935e1 100644 --- a/Modules/Settings/PersonalizationTab.qml +++ b/Modules/Settings/PersonalizationTab.qml @@ -410,6 +410,56 @@ Item { } } + Item { + width: parent.width + height: fillModeGroup.height + visible: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath + return currentWallpaper !== "" && !currentWallpaper.startsWith("#") + } + + DankButtonGroup { + id: fillModeGroup + anchors.horizontalCenter: parent.horizontalCenter + model: ["Stretch", "Fit", "Fill", "Tile", "Tile V", "Tile H", "Pad"] + selectionMode: "single" + buttonHeight: 28 + minButtonWidth: 48 + buttonPadding: Theme.spacingS + checkIconSize: 0 + textSize: Theme.fontSizeSmall + checkEnabled: false + currentIndex: { + const modes = ["Stretch", "Fit", "Fill", "Tile", "TileVertically", "TileHorizontally", "Pad"] + return modes.indexOf(SettingsData.wallpaperFillMode) + } + onSelectionChanged: (index, selected) => { + if (selected) { + const modes = ["Stretch", "Fit", "Fill", "Tile", "TileVertically", "TileHorizontally", "Pad"] + SettingsData.setWallpaperFillMode(modes[index]) + } + } + + Connections { + target: SettingsData + function onWallpaperFillModeChanged() { + const modes = ["Stretch", "Fit", "Fill", "Tile", "TileVertically", "TileHorizontally", "Pad"] + fillModeGroup.currentIndex = modes.indexOf(SettingsData.wallpaperFillMode) + } + } + + Connections { + target: personalizationTab + function onSelectedMonitorNameChanged() { + Qt.callLater(() => { + const modes = ["Stretch", "Fit", "Fill", "Tile", "TileVertically", "TileHorizontally", "Pad"] + fillModeGroup.currentIndex = modes.indexOf(SettingsData.wallpaperFillMode) + }) + } + } + } + } + // Per-Mode Wallpaper Section - Full Width Rectangle { width: parent.width diff --git a/Modules/WallpaperBackground.qml b/Modules/WallpaperBackground.qml index ffe4b11c..9c96f4de 100644 --- a/Modules/WallpaperBackground.qml +++ b/Modules/WallpaperBackground.qml @@ -40,6 +40,7 @@ Variants { property bool isColorSource: source.startsWith("#") property string transitionType: SessionData.wallpaperTransition property string actualTransitionType: transitionType + property bool isInitialized: false Connections { target: SessionData @@ -71,7 +72,7 @@ Variants { } } property real transitionProgress: 0 - property real fillMode: 1.0 + property real shaderFillMode: getFillMode(SettingsData.wallpaperFillMode) property vector4d fillColor: Qt.vector4d(0, 0, 0, 1) property real edgeSmoothness: 0.1 @@ -86,11 +87,34 @@ Variants { property bool hasCurrent: currentWallpaper.status === Image.Ready && !!currentWallpaper.source property bool booting: !hasCurrent && nextWallpaper.status === Image.Ready + function getFillMode(modeName) { + switch(modeName) { + case "Stretch": return Image.Stretch + case "Fit": + case "PreserveAspectFit": return Image.PreserveAspectFit + case "Fill": + case "PreserveAspectCrop": return Image.PreserveAspectCrop + case "Tile": return Image.Tile + case "TileVertically": return Image.TileVertically + case "TileHorizontally": return Image.TileHorizontally + case "Pad": return Image.Pad + default: return Image.PreserveAspectCrop + } + } + WallpaperEngineProc { id: weProc monitor: modelData.name } + Component.onCompleted: { + if (source) { + const formattedSource = source.startsWith("file://") ? source : "file://" + source + setWallpaperImmediate(formattedSource) + } + isInitialized = true + } + Component.onDestruction: { weProc.stop() } @@ -109,9 +133,9 @@ Variants { } else if (isColor) { setWallpaperImmediate("") } else { - // Always set immediately if there's no current wallpaper (startup) - if (!currentWallpaper.source) { + if (!isInitialized || !currentWallpaper.source) { setWallpaperImmediate(source.startsWith("file://") ? source : "file://" + source) + isInitialized = true } else { changeWallpaper(source.startsWith("file://") ? source : "file://" + source) } @@ -211,7 +235,7 @@ Variants { asynchronous: true smooth: true cache: true - fillMode: Image.PreserveAspectCrop + fillMode: root.getFillMode(SettingsData.wallpaperFillMode) } Image { @@ -223,7 +247,7 @@ Variants { asynchronous: true smooth: true cache: true - fillMode: Image.PreserveAspectCrop + fillMode: root.getFillMode(SettingsData.wallpaperFillMode) onStatusChanged: { if (status !== Image.Ready) @@ -275,7 +299,7 @@ Variants { property variant source1: root.hasCurrent ? currentWallpaper : transparentSource property variant source2: nextWallpaper property real progress: root.transitionProgress - property real fillMode: root.fillMode + property real fillMode: root.shaderFillMode property vector4d fillColor: root.fillColor property real imageWidth1: Math.max(1, root.hasCurrent ? source1.sourceSize.width : modelData.width) property real imageHeight1: Math.max(1, root.hasCurrent ? source1.sourceSize.height : modelData.height) @@ -296,7 +320,7 @@ Variants { property real progress: root.transitionProgress property real smoothness: root.edgeSmoothness property real direction: root.wipeDirection - property real fillMode: root.fillMode + property real fillMode: root.shaderFillMode property vector4d fillColor: root.fillColor property real imageWidth1: Math.max(1, root.hasCurrent ? source1.sourceSize.width : modelData.width) property real imageHeight1: Math.max(1, root.hasCurrent ? source1.sourceSize.height : modelData.height) @@ -319,7 +343,7 @@ Variants { property real aspectRatio: root.width / root.height property real centerX: root.discCenterX property real centerY: root.discCenterY - property real fillMode: root.fillMode + property real fillMode: root.shaderFillMode property vector4d fillColor: root.fillColor property real imageWidth1: Math.max(1, root.hasCurrent ? source1.sourceSize.width : modelData.width) property real imageHeight1: Math.max(1, root.hasCurrent ? source1.sourceSize.height : modelData.height) @@ -342,7 +366,7 @@ Variants { property real aspectRatio: root.width / root.height property real stripeCount: root.stripesCount property real angle: root.stripesAngle - property real fillMode: root.fillMode + property real fillMode: root.shaderFillMode property vector4d fillColor: root.fillColor property real imageWidth1: Math.max(1, root.hasCurrent ? source1.sourceSize.width : modelData.width) property real imageHeight1: Math.max(1, root.hasCurrent ? source1.sourceSize.height : modelData.height) @@ -365,7 +389,7 @@ Variants { property real centerX: 0.5 property real centerY: 0.5 property real aspectRatio: root.width / root.height - property real fillMode: root.fillMode + property real fillMode: root.shaderFillMode property vector4d fillColor: root.fillColor property real imageWidth1: Math.max(1, root.hasCurrent ? source1.sourceSize.width : modelData.width) property real imageHeight1: Math.max(1, root.hasCurrent ? source1.sourceSize.height : modelData.height) @@ -385,7 +409,7 @@ Variants { property variant source2: nextWallpaper property real progress: root.transitionProgress property real smoothness: root.edgeSmoothness - property real fillMode: root.fillMode + property real fillMode: root.shaderFillMode property vector4d fillColor: root.fillColor property real imageWidth1: Math.max(1, root.hasCurrent ? source1.sourceSize.width : modelData.width) property real imageHeight1: Math.max(1, root.hasCurrent ? source1.sourceSize.height : modelData.height) @@ -411,7 +435,7 @@ Variants { property real aspectRatio: root.width / root.height property real centerX: root.discCenterX property real centerY: root.discCenterY - property real fillMode: root.fillMode + property real fillMode: root.shaderFillMode property vector4d fillColor: root.fillColor property real imageWidth1: Math.max(1, root.hasCurrent ? source1.sourceSize.width : modelData.width) property real imageHeight1: Math.max(1, root.hasCurrent ? source1.sourceSize.height : modelData.height) diff --git a/Shaders/frag/wp_disc.frag b/Shaders/frag/wp_disc.frag index 0fc21229..f44fa1b4 100644 --- a/Shaders/frag/wp_disc.frag +++ b/Shaders/frag/wp_disc.frag @@ -16,67 +16,69 @@ layout(std140, binding = 0) uniform buf { float smoothness; // Edge smoothness (0.0 to 1.0, 0=sharp, 1=very smooth) float aspectRatio; // Width / Height of the screen - // Fill mode parameters - float fillMode; // 0=no(center), 1=crop(fill), 2=fit(contain), 3=stretch - float imageWidth1; // Width of source1 image - float imageHeight1; // Height of source1 image - float imageWidth2; // Width of source2 image - float imageHeight2; // Height of source2 image - float screenWidth; // Screen width - float screenHeight; // Screen height - vec4 fillColor; // Fill color for empty areas (default: black) + float fillMode; // 0=stretch, 1=fit, 2=crop, 3=tile, 4=tileV, 5=tileH, 6=pad + float imageWidth1; + float imageHeight1; + float imageWidth2; + float imageHeight2; + float screenWidth; + float screenHeight; + vec4 fillColor; } ubuf; -// Calculate UV coordinates based on fill mode vec2 calculateUV(vec2 uv, float imgWidth, float imgHeight) { - float imageAspect = imgWidth / imgHeight; - float screenAspect = ubuf.screenWidth / ubuf.screenHeight; vec2 transformedUV = uv; - + if (ubuf.fillMode < 0.5) { - // Mode 0: no (center) - No resize, center image at original size - // Convert UV to pixel coordinates, offset, then back to UV in image space - vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); - vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; - vec2 imagePixel = screenPixel - imageOffset; - transformedUV = imagePixel / vec2(imgWidth, imgHeight); - } + transformedUV = uv; + } else if (ubuf.fillMode < 1.5) { - // Mode 1: crop (fill/cover) - Fill screen, crop excess (default) + float scale = min(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); + vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; + vec2 offset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - scaledImageSize) * 0.5; + vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); + vec2 imagePixel = (screenPixel - offset) / scale; + transformedUV = imagePixel / vec2(imgWidth, imgHeight); + } + else if (ubuf.fillMode < 2.5) { float scale = max(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; vec2 offset = (scaledImageSize - vec2(ubuf.screenWidth, ubuf.screenHeight)) / scaledImageSize; transformedUV = uv * (vec2(1.0) - offset) + offset * 0.5; } - else if (ubuf.fillMode < 2.5) { - // Mode 2: fit (contain) - Fit inside screen, maintain aspect ratio - float scale = min(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); - vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; - vec2 offset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - scaledImageSize) * 0.5; - - // Convert screen UV to pixel coordinates + else if (ubuf.fillMode < 3.5) { + transformedUV = fract(uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight)); + } + else if (ubuf.fillMode < 4.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(uv.x, fract(tileUV.y)); + } + else if (ubuf.fillMode < 5.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(fract(tileUV.x), uv.y); + } + else { vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); - // Adjust for offset and scale - vec2 imagePixel = (screenPixel - offset) / scale; - // Convert back to UV coordinates in image space + vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; + vec2 imagePixel = screenPixel - imageOffset; transformedUV = imagePixel / vec2(imgWidth, imgHeight); } - // Mode 3: stretch - Use original UV (stretches to fit) - // No transformation needed for stretch mode - + return transformedUV; } -// Sample texture with fill mode and handle out-of-bounds vec4 sampleWithFillMode(sampler2D tex, vec2 uv, float imgWidth, float imgHeight) { vec2 transformedUV = calculateUV(uv, imgWidth, imgHeight); - - // Check if UV is out of bounds - if (transformedUV.x < 0.0 || transformedUV.x > 1.0 || + + if (ubuf.fillMode >= 2.5 && ubuf.fillMode <= 5.5) { + return texture(tex, transformedUV); + } + + if (transformedUV.x < 0.0 || transformedUV.x > 1.0 || transformedUV.y < 0.0 || transformedUV.y > 1.0) { return ubuf.fillColor; } - + return texture(tex, transformedUV); } diff --git a/Shaders/frag/wp_fade.frag b/Shaders/frag/wp_fade.frag index 47aa7c67..7b42139f 100644 --- a/Shaders/frag/wp_fade.frag +++ b/Shaders/frag/wp_fade.frag @@ -13,7 +13,7 @@ layout(std140, binding = 0) uniform buf { float progress; // Fill mode parameters - float fillMode; // 0=no(center), 1=crop(fill), 2=fit(contain), 3=stretch + float fillMode; // 0=stretch, 1=fit, 2=crop, 3=tile, 4=tileV, 5=tileH, 6=pad float imageWidth1; // Width of source1 image float imageHeight1; // Height of source1 image float imageWidth2; // Width of source2 image @@ -23,56 +23,59 @@ layout(std140, binding = 0) uniform buf { vec4 fillColor; // Fill color for empty areas (default: black) } ubuf; -// Calculate UV coordinates based on fill mode vec2 calculateUV(vec2 uv, float imgWidth, float imgHeight) { - float imageAspect = imgWidth / imgHeight; - float screenAspect = ubuf.screenWidth / ubuf.screenHeight; vec2 transformedUV = uv; - + if (ubuf.fillMode < 0.5) { - // Mode 0: no (center) - No resize, center image at original size - // Convert UV to pixel coordinates, offset, then back to UV in image space - vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); - vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; - vec2 imagePixel = screenPixel - imageOffset; - transformedUV = imagePixel / vec2(imgWidth, imgHeight); - } + transformedUV = uv; + } else if (ubuf.fillMode < 1.5) { - // Mode 1: crop (fill/cover) - Fill screen, crop excess (default) + float scale = min(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); + vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; + vec2 offset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - scaledImageSize) * 0.5; + vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); + vec2 imagePixel = (screenPixel - offset) / scale; + transformedUV = imagePixel / vec2(imgWidth, imgHeight); + } + else if (ubuf.fillMode < 2.5) { float scale = max(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; vec2 offset = (scaledImageSize - vec2(ubuf.screenWidth, ubuf.screenHeight)) / scaledImageSize; transformedUV = uv * (vec2(1.0) - offset) + offset * 0.5; } - else if (ubuf.fillMode < 2.5) { - // Mode 2: fit (contain) - Fit inside screen, maintain aspect ratio - float scale = min(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); - vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; - vec2 offset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - scaledImageSize) * 0.5; - - // Convert screen UV to pixel coordinates + else if (ubuf.fillMode < 3.5) { + transformedUV = fract(uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight)); + } + else if (ubuf.fillMode < 4.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(uv.x, fract(tileUV.y)); + } + else if (ubuf.fillMode < 5.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(fract(tileUV.x), uv.y); + } + else { vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); - // Adjust for offset and scale - vec2 imagePixel = (screenPixel - offset) / scale; - // Convert back to UV coordinates in image space + vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; + vec2 imagePixel = screenPixel - imageOffset; transformedUV = imagePixel / vec2(imgWidth, imgHeight); } - // Mode 3: stretch - Use original UV (stretches to fit) - // No transformation needed for stretch mode - + return transformedUV; } -// Sample texture with fill mode and handle out-of-bounds vec4 sampleWithFillMode(sampler2D tex, vec2 uv, float imgWidth, float imgHeight) { vec2 transformedUV = calculateUV(uv, imgWidth, imgHeight); - - // Check if UV is out of bounds - if (transformedUV.x < 0.0 || transformedUV.x > 1.0 || + + if (ubuf.fillMode >= 2.5 && ubuf.fillMode <= 5.5) { + return texture(tex, transformedUV); + } + + if (transformedUV.x < 0.0 || transformedUV.x > 1.0 || transformedUV.y < 0.0 || transformedUV.y > 1.0) { return ubuf.fillColor; } - + return texture(tex, transformedUV); } diff --git a/Shaders/frag/wp_iris_bloom.frag b/Shaders/frag/wp_iris_bloom.frag index 56275b07..74cc42c4 100644 --- a/Shaders/frag/wp_iris_bloom.frag +++ b/Shaders/frag/wp_iris_bloom.frag @@ -16,7 +16,7 @@ layout(std140, binding = 0) uniform buf { float smoothness; float aspectRatio; - float fillMode; + float fillMode; // 0=stretch, 1=fit, 2=crop, 3=tile, 4=tileV, 5=tileH, 6=pad float imageWidth1; float imageHeight1; float imageWidth2; @@ -28,35 +28,58 @@ layout(std140, binding = 0) uniform buf { vec2 calculateUV(vec2 uv, float imgWidth, float imgHeight) { vec2 transformedUV = uv; + if (ubuf.fillMode < 0.5) { - vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); - vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; - vec2 imagePixel = screenPixel - imageOffset; - transformedUV = imagePixel / vec2(imgWidth, imgHeight); + transformedUV = uv; } else if (ubuf.fillMode < 1.5) { + float scale = min(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); + vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; + vec2 offset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - scaledImageSize) * 0.5; + vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); + vec2 imagePixel = (screenPixel - offset) / scale; + transformedUV = imagePixel / vec2(imgWidth, imgHeight); + } + else if (ubuf.fillMode < 2.5) { float scale = max(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; vec2 offset = (scaledImageSize - vec2(ubuf.screenWidth, ubuf.screenHeight)) / scaledImageSize; transformedUV = uv * (vec2(1.0) - offset) + offset * 0.5; } - else if (ubuf.fillMode < 2.5) { - float scale = min(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); - vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; - vec2 offset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(scaledImageSize)) * 0.5; + else if (ubuf.fillMode < 3.5) { + transformedUV = fract(uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight)); + } + else if (ubuf.fillMode < 4.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(uv.x, fract(tileUV.y)); + } + else if (ubuf.fillMode < 5.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(fract(tileUV.x), uv.y); + } + else { vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); - vec2 imagePixel = (screenPixel - offset) / scale; + vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; + vec2 imagePixel = screenPixel - imageOffset; transformedUV = imagePixel / vec2(imgWidth, imgHeight); } + return transformedUV; } vec4 sampleWithFillMode(sampler2D tex, vec2 uv, float imgWidth, float imgHeight) { - vec2 tuv = calculateUV(uv, imgWidth, imgHeight); - if (tuv.x < 0.0 || tuv.x > 1.0 || tuv.y < 0.0 || tuv.y > 1.0) { + vec2 transformedUV = calculateUV(uv, imgWidth, imgHeight); + + if (ubuf.fillMode >= 2.5 && ubuf.fillMode <= 5.5) { + return texture(tex, transformedUV); + } + + if (transformedUV.x < 0.0 || transformedUV.x > 1.0 || + transformedUV.y < 0.0 || transformedUV.y > 1.0) { return ubuf.fillColor; } - return texture(tex, tuv); + + return texture(tex, transformedUV); } void main() { diff --git a/Shaders/frag/wp_pixelate.frag b/Shaders/frag/wp_pixelate.frag index d5f5e030..2b6fb536 100644 --- a/Shaders/frag/wp_pixelate.frag +++ b/Shaders/frag/wp_pixelate.frag @@ -16,8 +16,7 @@ layout(std140, binding = 0) uniform buf { float smoothness; // controls starting block size (0..1) float aspectRatio; // (unused) - // Fill mode parameters - float fillMode; // 0=no(center), 1=crop, 2=fit, 3=stretch + float fillMode; // 0=stretch, 1=fit, 2=crop, 3=tile, 4=tileV, 5=tileH, 6=pad float imageWidth1; float imageHeight1; float imageWidth2; @@ -29,17 +28,11 @@ layout(std140, binding = 0) uniform buf { vec2 calculateUV(vec2 uv, float imgWidth, float imgHeight) { vec2 transformedUV = uv; + if (ubuf.fillMode < 0.5) { - vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); - vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; - vec2 imagePixel = screenPixel - imageOffset; - transformedUV = imagePixel / vec2(imgWidth, imgHeight); - } else if (ubuf.fillMode < 1.5) { - float scale = max(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); - vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; - vec2 offset = (scaledImageSize - vec2(ubuf.screenWidth, ubuf.screenHeight)) / scaledImageSize; - transformedUV = uv * (vec2(1.0) - offset) + offset * 0.5; - } else if (ubuf.fillMode < 2.5) { + transformedUV = uv; + } + else if (ubuf.fillMode < 1.5) { float scale = min(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; vec2 offset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - scaledImageSize) * 0.5; @@ -47,13 +40,46 @@ vec2 calculateUV(vec2 uv, float imgWidth, float imgHeight) { vec2 imagePixel = (screenPixel - offset) / scale; transformedUV = imagePixel / vec2(imgWidth, imgHeight); } + else if (ubuf.fillMode < 2.5) { + float scale = max(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); + vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; + vec2 offset = (scaledImageSize - vec2(ubuf.screenWidth, ubuf.screenHeight)) / scaledImageSize; + transformedUV = uv * (vec2(1.0) - offset) + offset * 0.5; + } + else if (ubuf.fillMode < 3.5) { + transformedUV = fract(uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight)); + } + else if (ubuf.fillMode < 4.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(uv.x, fract(tileUV.y)); + } + else if (ubuf.fillMode < 5.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(fract(tileUV.x), uv.y); + } + else { + vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); + vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; + vec2 imagePixel = screenPixel - imageOffset; + transformedUV = imagePixel / vec2(imgWidth, imgHeight); + } + return transformedUV; } -vec4 sampleWithFillMode(sampler2D tex, vec2 uv, float w, float h) { - vec2 tuv = calculateUV(uv, w, h); - if (tuv.x < 0.0 || tuv.x > 1.0 || tuv.y < 0.0 || tuv.y > 1.0) return ubuf.fillColor; - return texture(tex, tuv); +vec4 sampleWithFillMode(sampler2D tex, vec2 uv, float imgWidth, float imgHeight) { + vec2 transformedUV = calculateUV(uv, imgWidth, imgHeight); + + if (ubuf.fillMode >= 2.5 && ubuf.fillMode <= 5.5) { + return texture(tex, transformedUV); + } + + if (transformedUV.x < 0.0 || transformedUV.x > 1.0 || + transformedUV.y < 0.0 || transformedUV.y > 1.0) { + return ubuf.fillColor; + } + + return texture(tex, transformedUV); } vec2 quantizeUV(vec2 uv, float cellPx) { diff --git a/Shaders/frag/wp_portal.frag b/Shaders/frag/wp_portal.frag index 0a2cc427..21e939c3 100644 --- a/Shaders/frag/wp_portal.frag +++ b/Shaders/frag/wp_portal.frag @@ -16,8 +16,7 @@ layout(std140, binding = 0) uniform buf { float smoothness; // 0..1 (edge softness) float aspectRatio; // width / height - // Fill mode parameters - float fillMode; // 0=no(center), 1=crop(fill), 2=fit(contain), 3=stretch + float fillMode; // 0=stretch, 1=fit, 2=crop, 3=tile, 4=tileV, 5=tileH, 6=pad float imageWidth1; float imageHeight1; float imageWidth2; @@ -31,18 +30,9 @@ vec2 calculateUV(vec2 uv, float imgWidth, float imgHeight) { vec2 transformedUV = uv; if (ubuf.fillMode < 0.5) { - vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); - vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; - vec2 imagePixel = screenPixel - imageOffset; - transformedUV = imagePixel / vec2(imgWidth, imgHeight); + transformedUV = uv; } else if (ubuf.fillMode < 1.5) { - float scale = max(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); - vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; - vec2 offset = (scaledImageSize - vec2(ubuf.screenWidth, ubuf.screenHeight)) / scaledImageSize; - transformedUV = uv * (vec2(1.0) - offset) + offset * 0.5; - } - else if (ubuf.fillMode < 2.5) { float scale = min(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; vec2 offset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - scaledImageSize) * 0.5; @@ -50,15 +40,46 @@ vec2 calculateUV(vec2 uv, float imgWidth, float imgHeight) { vec2 imagePixel = (screenPixel - offset) / scale; transformedUV = imagePixel / vec2(imgWidth, imgHeight); } - // else: stretch + else if (ubuf.fillMode < 2.5) { + float scale = max(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); + vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; + vec2 offset = (scaledImageSize - vec2(ubuf.screenWidth, ubuf.screenHeight)) / scaledImageSize; + transformedUV = uv * (vec2(1.0) - offset) + offset * 0.5; + } + else if (ubuf.fillMode < 3.5) { + transformedUV = fract(uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight)); + } + else if (ubuf.fillMode < 4.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(uv.x, fract(tileUV.y)); + } + else if (ubuf.fillMode < 5.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(fract(tileUV.x), uv.y); + } + else { + vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); + vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; + vec2 imagePixel = screenPixel - imageOffset; + transformedUV = imagePixel / vec2(imgWidth, imgHeight); + } return transformedUV; } -vec4 sampleWithFillMode(sampler2D tex, vec2 uv, float w, float h) { - vec2 tuv = calculateUV(uv, w, h); - if (tuv.x < 0.0 || tuv.x > 1.0 || tuv.y < 0.0 || tuv.y > 1.0) return ubuf.fillColor; - return texture(tex, tuv); +vec4 sampleWithFillMode(sampler2D tex, vec2 uv, float imgWidth, float imgHeight) { + vec2 transformedUV = calculateUV(uv, imgWidth, imgHeight); + + if (ubuf.fillMode >= 2.5 && ubuf.fillMode <= 5.5) { + return texture(tex, transformedUV); + } + + if (transformedUV.x < 0.0 || transformedUV.x > 1.0 || + transformedUV.y < 0.0 || transformedUV.y > 1.0) { + return ubuf.fillColor; + } + + return texture(tex, transformedUV); } void main() { diff --git a/Shaders/frag/wp_stripes.frag b/Shaders/frag/wp_stripes.frag index c2684ce4..62da21e2 100644 --- a/Shaders/frag/wp_stripes.frag +++ b/Shaders/frag/wp_stripes.frag @@ -16,67 +16,69 @@ layout(std140, binding = 0) uniform buf { float smoothness; // Edge smoothness (0.0 to 1.0, 0=sharp, 1=very smooth) float aspectRatio; // Width / Height of the screen - // Fill mode parameters - float fillMode; // 0=no(center), 1=crop(fill), 2=fit(contain), 3=stretch - float imageWidth1; // Width of source1 image - float imageHeight1; // Height of source1 image - float imageWidth2; // Width of source2 image - float imageHeight2; // Height of source2 image - float screenWidth; // Screen width - float screenHeight; // Screen height - vec4 fillColor; // Fill color for empty areas (default: black) + float fillMode; // 0=stretch, 1=fit, 2=crop, 3=tile, 4=tileV, 5=tileH, 6=pad + float imageWidth1; + float imageHeight1; + float imageWidth2; + float imageHeight2; + float screenWidth; + float screenHeight; + vec4 fillColor; } ubuf; -// Calculate UV coordinates based on fill mode vec2 calculateUV(vec2 uv, float imgWidth, float imgHeight) { - float imageAspect = imgWidth / imgHeight; - float screenAspect = ubuf.screenWidth / ubuf.screenHeight; vec2 transformedUV = uv; - + if (ubuf.fillMode < 0.5) { - // Mode 0: no (center) - No resize, center image at original size - // Convert UV to pixel coordinates, offset, then back to UV in image space - vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); - vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; - vec2 imagePixel = screenPixel - imageOffset; - transformedUV = imagePixel / vec2(imgWidth, imgHeight); - } + transformedUV = uv; + } else if (ubuf.fillMode < 1.5) { - // Mode 1: crop (fill/cover) - Fill screen, crop excess (default) + float scale = min(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); + vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; + vec2 offset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - scaledImageSize) * 0.5; + vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); + vec2 imagePixel = (screenPixel - offset) / scale; + transformedUV = imagePixel / vec2(imgWidth, imgHeight); + } + else if (ubuf.fillMode < 2.5) { float scale = max(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; vec2 offset = (scaledImageSize - vec2(ubuf.screenWidth, ubuf.screenHeight)) / scaledImageSize; transformedUV = uv * (vec2(1.0) - offset) + offset * 0.5; } - else if (ubuf.fillMode < 2.5) { - // Mode 2: fit (contain) - Fit inside screen, maintain aspect ratio - float scale = min(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); - vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; - vec2 offset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - scaledImageSize) * 0.5; - - // Convert screen UV to pixel coordinates + else if (ubuf.fillMode < 3.5) { + transformedUV = fract(uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight)); + } + else if (ubuf.fillMode < 4.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(uv.x, fract(tileUV.y)); + } + else if (ubuf.fillMode < 5.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(fract(tileUV.x), uv.y); + } + else { vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); - // Adjust for offset and scale - vec2 imagePixel = (screenPixel - offset) / scale; - // Convert back to UV coordinates in image space + vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; + vec2 imagePixel = screenPixel - imageOffset; transformedUV = imagePixel / vec2(imgWidth, imgHeight); } - // Mode 3: stretch - Use original UV (stretches to fit) - // No transformation needed for stretch mode - + return transformedUV; } -// Sample texture with fill mode and handle out-of-bounds vec4 sampleWithFillMode(sampler2D tex, vec2 uv, float imgWidth, float imgHeight) { vec2 transformedUV = calculateUV(uv, imgWidth, imgHeight); - - // Check if UV is out of bounds - if (transformedUV.x < 0.0 || transformedUV.x > 1.0 || + + if (ubuf.fillMode >= 2.5 && ubuf.fillMode <= 5.5) { + return texture(tex, transformedUV); + } + + if (transformedUV.x < 0.0 || transformedUV.x > 1.0 || transformedUV.y < 0.0 || transformedUV.y > 1.0) { return ubuf.fillColor; } - + return texture(tex, transformedUV); } diff --git a/Shaders/frag/wp_wipe.frag b/Shaders/frag/wp_wipe.frag index 46b21e6f..4960ef8f 100644 --- a/Shaders/frag/wp_wipe.frag +++ b/Shaders/frag/wp_wipe.frag @@ -14,67 +14,69 @@ layout(std140, binding = 0) uniform buf { float direction; // 0=left, 1=right, 2=up, 3=down float smoothness; // Edge smoothness (0.0 to 1.0, 0=sharp, 1=very smooth) - // Fill mode parameters - float fillMode; // 0=no(center), 1=crop(fill), 2=fit(contain), 3=stretch - float imageWidth1; // Width of source1 image - float imageHeight1; // Height of source1 image - float imageWidth2; // Width of source2 image - float imageHeight2; // Height of source2 image - float screenWidth; // Screen width - float screenHeight; // Screen height - vec4 fillColor; // Fill color for empty areas (default: black) + float fillMode; // 0=stretch, 1=fit, 2=crop, 3=tile, 4=tileV, 5=tileH, 6=pad + float imageWidth1; + float imageHeight1; + float imageWidth2; + float imageHeight2; + float screenWidth; + float screenHeight; + vec4 fillColor; } ubuf; -// Calculate UV coordinates based on fill mode vec2 calculateUV(vec2 uv, float imgWidth, float imgHeight) { - float imageAspect = imgWidth / imgHeight; - float screenAspect = ubuf.screenWidth / ubuf.screenHeight; vec2 transformedUV = uv; - + if (ubuf.fillMode < 0.5) { - // Mode 0: no (center) - No resize, center image at original size - // Convert UV to pixel coordinates, offset, then back to UV in image space - vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); - vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; - vec2 imagePixel = screenPixel - imageOffset; - transformedUV = imagePixel / vec2(imgWidth, imgHeight); - } + transformedUV = uv; + } else if (ubuf.fillMode < 1.5) { - // Mode 1: crop (fill/cover) - Fill screen, crop excess (default) + float scale = min(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); + vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; + vec2 offset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - scaledImageSize) * 0.5; + vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); + vec2 imagePixel = (screenPixel - offset) / scale; + transformedUV = imagePixel / vec2(imgWidth, imgHeight); + } + else if (ubuf.fillMode < 2.5) { float scale = max(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; vec2 offset = (scaledImageSize - vec2(ubuf.screenWidth, ubuf.screenHeight)) / scaledImageSize; transformedUV = uv * (vec2(1.0) - offset) + offset * 0.5; } - else if (ubuf.fillMode < 2.5) { - // Mode 2: fit (contain) - Fit inside screen, maintain aspect ratio - float scale = min(ubuf.screenWidth / imgWidth, ubuf.screenHeight / imgHeight); - vec2 scaledImageSize = vec2(imgWidth, imgHeight) * scale; - vec2 offset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - scaledImageSize) * 0.5; - - // Convert screen UV to pixel coordinates + else if (ubuf.fillMode < 3.5) { + transformedUV = fract(uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight)); + } + else if (ubuf.fillMode < 4.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(uv.x, fract(tileUV.y)); + } + else if (ubuf.fillMode < 5.5) { + vec2 tileUV = uv * vec2(ubuf.screenWidth, ubuf.screenHeight) / vec2(imgWidth, imgHeight); + transformedUV = vec2(fract(tileUV.x), uv.y); + } + else { vec2 screenPixel = uv * vec2(ubuf.screenWidth, ubuf.screenHeight); - // Adjust for offset and scale - vec2 imagePixel = (screenPixel - offset) / scale; - // Convert back to UV coordinates in image space + vec2 imageOffset = (vec2(ubuf.screenWidth, ubuf.screenHeight) - vec2(imgWidth, imgHeight)) * 0.5; + vec2 imagePixel = screenPixel - imageOffset; transformedUV = imagePixel / vec2(imgWidth, imgHeight); } - // Mode 3: stretch - Use original UV (stretches to fit) - // No transformation needed for stretch mode - + return transformedUV; } -// Sample texture with fill mode and handle out-of-bounds vec4 sampleWithFillMode(sampler2D tex, vec2 uv, float imgWidth, float imgHeight) { vec2 transformedUV = calculateUV(uv, imgWidth, imgHeight); - - // Check if UV is out of bounds - if (transformedUV.x < 0.0 || transformedUV.x > 1.0 || + + if (ubuf.fillMode >= 2.5 && ubuf.fillMode <= 5.5) { + return texture(tex, transformedUV); + } + + if (transformedUV.x < 0.0 || transformedUV.x > 1.0 || transformedUV.y < 0.0 || transformedUV.y > 1.0) { return ubuf.fillColor; } - + return texture(tex, transformedUV); } diff --git a/Shaders/qsb/wp_disc.frag.qsb b/Shaders/qsb/wp_disc.frag.qsb index 8e1705e73a0dbca41b23da0cf4982d3efe75fc9b..fc6324f9142ebf70351d87c40c8becbb9833b63d 100644 GIT binary patch literal 6151 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 ZKkLb347Pdr(Lv2}EJ9u${|C2r_54KZL=OM} literal 5385 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 diff --git a/Shaders/qsb/wp_fade.frag.qsb b/Shaders/qsb/wp_fade.frag.qsb index 3081ea8e74f8db9e0050785b607d7be861cd4dcf..a91469598420110aa396eac01d30734ca3f61e9d 100644 GIT binary patch literal 5123 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 literal 4333 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Π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 HMskgz(jGZD literal 5502 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 A)Bpeg diff --git a/Shaders/qsb/wp_pixelate.frag.qsb b/Shaders/qsb/wp_pixelate.frag.qsb index c784cc526cf4a3146d282591ee9230a52959a746..85236a5d702b86769b94332f0326e98df61c8761 100644 GIT binary patch literal 6704 zcmV-08qehb0HU~fob5dcbR5N%RX(xoIAFlsWWXFFTb4D0Bun@tHpT`U8*F?aobg!G zBMppZ6*zuIPuO<;_T5jPk2fouzNS%R%$4(n%&SYG@ouoP<& zeWS$9KEjJxE?_W)r3FEfbxGo^BvZjhFU-yC<2+0er3Kc!Ps|Moaj3;31x;;YgMW=rq(|tZa`hwE=f; z1Ezm!7)RJb0vm;}#RN7QVM_^Y48oQZ*jR+EBCv4?TSH*u5w@Pd_CnZM1U3O-n+U89 zVJQNeh_G$~n}o0|fqepDy#zKHVLPO4$FQTt&m+)Ix_u;RgHH}8?K8Q;=cG;XZ^8ai zq)q$ZApG_fSfix;(bDGdJXJh_4I|<{K;Vx@n~svOG16}1@rL#Ud>$wHjFa{nkM^B_ z_d(+Cy%EQpK)QX1kh>34F$8?4AbcOxV_&2nBjt=2%Q=&3VA4_Z(Mci@NuYSsF!G5Brfxw$3 z_~iwfPdigFr`z+HiZ_jaw#1Jt)a{+Jy<LQ;FsQ*}i@ujO80R z7KZrHe#U4&N5%^DugKmfO8lm94r9h?Jkt5^~+28g(ZD^6~BcVe=ApOj_$uiwBLFA?RmO=xoj_A zp!K=M(C1dJ))U>njjOdp)8DJ)FM#pA&eb}o$M-s}&7%qZn`n<#p%sinZ-s#KTLBr1 zv|xiZ+_NRvZUbpU|3=aV8zqePW}}@p+UFSUKBIlE(f+K_zRJ+&I-`BPfq$bhp3fQh zpEvNoV6^Wt+FvsGec9mmfPw#z(SFpRf5K>g9ozG8Ox`@LQ7LcOw2-1V6jN8LuV7(ELU-*+dbI6RLFyNjw_rV zg0scIDR4D!0e&&Uid@a@0>N{+;#b76LHxR8Y};^bTZycGuHbrX+sWAajj=)eZzufD zLw@bd<99w+@JYh!&>ld3fWH&_HT?xhKcCQF$Q4}E?=a{uBz+fQ-_a;%2aX%&xy-=1f-BhN1ZO8#Yk;=Zl_>K&)B)ClD+%q@T&)kfeGU3p z^SYMsx*BbM4f29@&f8dUPkj|03ewM)2?E3J&a=yXUUaH&AaJBYpx!>e!Z`5+1-X9j^9H9Yf#6 z7Y&A&A|AW#k}~KiE$o7yEYQJO@>@(Lww9a+!)a# zZqeg7glj!o5Y~)(%qDt3U#qygkasKLeLM^9*>e!C+jB8auE4!;9^%X;d={|a-n|gv zx_tu1nCA0o#5sX^d-x*e?cwtf2W-@aeVW&asFQ9lLEft{?oUFTB?Jd@Ex_km#94-T zOHsyRgy}JzVzJF~gln7?mT{koaIMQqq&t=PAM!aM?_$I`4e?eH{Z2>t4Ak#rglQgY zFov`)XIS)Ii*Svz&Z6&ngll~_ARWLjMcA1rZv*PG8ev)&$T6)Z?Tt*W1$um+L7a_5 zZUX(G6%jkrh|ap53NipWSKABTDK5nwPMVIIMp z=^{4lX2JQGLAaie=O7Gn6fhrqn7Uv-LLcPNZb05y!aHyAVK2fGo;=Mc0JNw$GjK@7{qW7 z#@P+TE;q7Z4Bv!s9mAhP805?#hHqu+f*6LrTf}`I^1g-WdmHnwOP{y+>2`!`oG)1X zbO*wCFFIFq*d=n_c9gxb=a@%dN11b zRvi0%WE}Tf?D}PdYr8&(um{kt4->mW-$UYl8F@cM?E0u-*RNRY`WV7B&f^xlK7nv; zk0+7t31Zi;qP!;w-Pa7eK4sYTX~cPo*!Ank>uI##BM1Zi;QaSZ9Mdy|@3RQkIL|Y6 z?t6~lynt}<6|`R@zIuV^^b+!Wk@)W=^xwm1w-K)W_bS3(LI1r@{0Dun ziTlUM`!(Xf?->4j)8fDHB3$FVW%1wJ2-jnL2kG7>{`(V@_YR@^Q^SAXGyL~`#Q7fa z-=86`@1yoPV^) z{sqFd?0-VKUl5#sHhlRnhA;mWaR9FOn}0)I(5Ls3e@D1JWBwdr+MfTx)H{`K|B9)1 zD$Vmh5$9J(|4W2v{QqL=olEQa--h15HuU}t;{2M#;Je7@HzWq$HDcg(=AY9KGyfWW zEA#J#JX1}>=8!Fx2+MD}OiyY^J(y*gq~;5wHwnk$$-6OSdi6zCfx?y;C38AEuFv+y3z z6sU@yB2uX(G`BaO%W85$WqN2Lm+xrt- z`D`7=!ep*+01mM-8F@_P-kP^J($MvCAFkkff7zES805Jg6gU9ek1IInJC*1Q@cqR- z6=m&DWF26Ubs$&pXHnKcT)}pt-87%6#BK+pY#7HuC{OEk2v_}}*I`62fFCOE!;s&h zM6bh9FS_o3iYvIbL4+&V6wI4xK8F##jzHOwpHt2dR$^$*76FmT@Ufk1>z8>{}8u3hw_Zi&F5jG+m z;;Ip8rjyugGGa4k#Aci;oEY+eHq8_2-Y3i^Q6m z>Us-KXGXTVGhN-ik#shnbms)XnVbOD72QH#ryJSam##anE+Vd;q}v?X;wDxk-9n~+ zj)X}L09@Id?98~^DYUnc? z)0u2`MLy+FSf(f0<*du3-0oNaywnkcbc1k-9uGnH!Hb;*$H__jAXwom_*SR0S?aea zpUoHM)C~x;_T@6^e4z*I8tD^%5sb52e+cUW? zkQfJdta17m<@1G96Z8SBGnwt|%O+jtjI~h-=-b**8fKRq3u&uC)T84izFSD>%OE0FXU+u~0FHVbJ?hAGg>B)IPp6BHD~P2J z0xDYcs*lVxWrF}=VXKlrxGK}{WTlA(V#RVS>}33FZc)m7CXS?Dm`zHMDjGaYmlJlg z!ma1=7$`lJ!XxN+TbRUYm;_0Ta7n}Td>@U?s%wY$jX+2c&l+DUENrwhqW zHyW*OQq-4=REyUK0+7H!!!@=IxY;(~a29Z>)jE@Ph|@-9z`^l`8C%KQ+SuQKc31i| zZnqiDZaBEC#w$O1n-N>Wj98u(T*R1a;_Vi5!euonHD)5#*k3P%ZWUGyXJt1mT%pFT z&?;mO>>(#Xd}#ovw7BLH?2W5l z?r@YV4PX_9ovj+v46Zj{vIR zINRbDPV>bvy=l;aN>bozQLwGuC%G+dk=!1Tyq%7roaA;XSr5-AxxLjd+2Y&wR*U4y z#wk6h-(7=@C}u{Q-Rc+tQcJx#FM~eEsWmve{MrzNx7eJNljj=VLKM z-*PKwr`UmPef}eoCkT()61~&OWTPm(o=oGeLM84i=GMz>EDAVKx6jCQq-}r^ddB$6Gsc*1lOBx|0|KKfO9+od1Ay?geHYJ=5 zdrolq#gqW9U!m(6ii0&UE10NlQ|DtEV45^Q#QL$p+0kBMy0;s=0y zxJ5r_FJBYFTfC32&ZP94`A7s)(M=ZIRsE7Q!LgRi?tuu);znl zr8VBt5TS@|h!<;*H?@md+0xQ9yDbJ-#X#JaB%xe6L}B%MGcpp#g~UcPm`rk-Lj!FK zM4C4@k%#tYbCAE>TDEQp3TO=mUp$C4+Y)?n5_~yln>d`53%WA5W7j-8K zy-p5z$@nO`POq4svs=QA*A`;D_KL<9YZ`oTOZu{9r&einZTg|TG|QUm{k+sHg{V+g zYtRDZiKsb>2B@cG`94>!%ngEYQe4bkr56q_v9g4y zFQx3tCYBVEU5k@$vZHAuFxTkQm2GLVS1h4M^0}XtuBp?!4kprz^C6R0C<47%iTuUF<(#N&*aV>pZ zOCQ(L$F=lvEqyH0$G4F5alMy5ZmFe@_x$v6CTGhW3;&~B5f&)7mQAi@lWW;z6MA#Vs<)!dTto%h5+ieAgZ@W8rUsC zT$1B9k!=c>PM9XHMPsrx1<);8(>=<-Z!O0>ZX(Pef0xbBfUbXD>wTVTAe6g5Vmh0_vao$?E3CU|tT)$}L z%F`D&DN|W^tn70QCPb{@uzGD`O|sDCxX1$K(Dye4Rq>LE6oXYP68?%sdc;Z=34h5V zU0uy0Q7#3Ys4xYMCJ0t7R7Vwc3*_WgE|7z%sztx>+C@4<+d%oE3Sm~3m6b50l8ycS zRn#xa*l~yzjD){}ksfLZV?^R7JcgvK3ZlqXQSil5cp;+-rw^}`A&yCD;r2la8R?O# zWF-8RjP!6y8Tf`=rK!sJZC6z@68>t2WzgX~;L?k^zo0R4bF zLX26S7hFE0lETLBFe_XkrX@!G7^@q>-N>tN40%5a5n|Lhs@q%3&1UO9TTY2xU+NfA zwCt8*2Odl<>4D%WUFKW;M{)tu$MFVj)9R0_BU%*+IRX#8E|M_nBI%(PMiNG0B)zLD zBaO;QQNMeJQ6=#Yd01tV!3Vv|>LeA2-c^N?!9@?XQj!>?Qc_tg43yqKNp3bUpZ%2+ z-)7-|$HJs`x*?Fp@G{(&}xKS^5)D5%8XB@`eN2VPn~f!ax0w@dFpgV#^sEk5BZ zqLeIUEu&Pp%9+`!@Ip!=SV+NjyrNQynV=a;aV6m^uB2s#JMG60mRHhPUr7&EU`ZGS z78`$SiDj4(=M`CmS$Zq2vZO03v!p}oEK(RPw4}Xa0S%stYb~XCtgPDNlQC$$B~ekm zB@rx1V2oB&aWRv9!>+-k%NlmDI!yU7m+CNO2VFrWCT!GYYBL^xHSuLE1 zc@(43vZ#BTfC5-VD-L%+s4-0ahb_7QHF;XEV9}F=RW#QX zNoA5Rh#tC#v{(LYE5spHHB1 z!TC)P5MgzNj*d?F8EvZHxY0tH$(5;UbaeC;okBF5@61thSvSe#vYDKC;Y%c4;mFN> zu9HYaqsi>H_9<(*xzIoK4^lvVS#%l3Yu$^;v z%kg**sko?E{(tg4N~7{_lsLEcUCJNXcPWF%z>t<0UsBR4-%+(ZIS^`(E`M2{Bkd6Dx5j3NT8 z_&Hk&wDP*vkUtQrrmjT|5?a&pZ8=_LOU2}_`*I(XO z*MDGCO~H#!)H1~`OZZm$*-=#muc3c&@IK1fnX<|j$PqL=NXB&7XV zKTFCR1)_4FCXt;juL?y_DHB?S14J3qwG!03cXCFzEG-;c(=Y*!Tr6Gaz0qFziBc#n~dQO_Y(lkw* zHl-x#De3$(-{}5#?v++r452-e&t2X5=YP#V|NJxe+iP10akda*fxH}fT_TPPPo%|! zaK((+Cd%?pRpdlM_RW)*_#r+b;zJ6~7kMd=5tB-|sKmAUSw$C#W1=p_g*Z!ooBMY& zu5*>Sonq5(nx?L%92<$uCV?PY`-ObpSO9!Uaba-M)igB05nh9Mbhg*~5aHTCz z>{AgdNEKRaqWRGClC3EJ?2*hlDXs+$HMdic&e5d1;-I|GDJPQ^Fodq!}oxxJcx^$!dtw4d`8AN8Fp7OQyBHJvGxOviDD;xk{-7n2TozY-(aDXA;r z!9vwu*k}{)GK*%u4b1^Ho<6%K|91~XMuJr zqn!=f?Tpp~T8`0{fHuWwOF=6#+G{|oFxokw-KS!^KwKlguST3qdj)G#(5__d1&-!- zSex^2MgKh3=KaT+z6&JRJY|2riaFh1B=0DOF?n4q`4=Om^Av4?irZpb)IJ;ci`1w16_BEhgDBG(LM;ha5v|rC+7YFYm^y_c+*|J>r z^f5WADoa^=Q0V+Ja>UTK!es7NJh83h>u8D3cJE_{cw-|r6TK-(;==xyV*E_m4 z82LTg{uUZv#nE-mjIV-PJD= zVYQc9?PXT`LaTk1)qb7T?z7s1mOsN*d!xm_$q9~Ui^adq;=jRa@3h*xEq!B_zFRE* zajSj6l7FMsz8&pR)JVtC`Mg=q){AJHzOx)XU(`qQLhbA1Y|{GgadgdC2!6_&C61;O zKh4_`#{U}dFJk=XIGRrUG_TYimZPLxJJ+H5tJf0QCVfl6OF45c(|ta4pT~4x;Ar|% zsgK&r9kb?jAJv2k#zr}`oXK9~=)5xRi_v~S+N1U*j^??T@myx{T<+*~OZ59eyTZ|H z`*Oy2rK9y-fw58kUdhIGHO3ZWwpKWrZpOBfjctWBHp>5%Oy4!omlD3dRgR`Fm9tLm z*F#?%dR8&{IOGSJe6OSFM*dn$zL)i_M&C8Cb1lYA>vA<4;~Gb=RTHPRj;8f9o`l7d zax^W;c-A?(2AEh4z%~t&OB7XFsvIp_I z8M0Id_p&kWWAURJxR3cf5i!R7j;0eo)yVyf|6s%z4>_7n{8U2^u`wQIVXJ_(_5HWKmh>74CAz`&QTJ0M|@XWB^>Q7s3*W$m|>VLb{ewWq$ zpw<3}2%bT%#&{`4F|zM8uK{f}=6|j5=YI|I_-4edpV>{quCcXF zg!je)&<)Re5#IkcfIf!#9D*Ft9{_C__J%Od1ZYO@NQCW8pc|gi2-}-MH@3GxZZqTA ziX1ZS>ySrA=6diD{eIB4K^OHs1lo4cS7QttK{N5Z5xHmDJCJ)u=T7kKfcy=h8U9^D z=VoKyvHZTt@_RRUi2fjGd!T1G%O|4Ix?YPMxS7RtZ$y5Lfo}3^A85BAzb06IQQx?{ zW}thV={^uKrw2iA>^m6agE+$+2G1d;=Zz8begt&Wz7?@CdX9qUR^gw$ZWI2w>@avJ zM*Gocblq;nJ!8fF7sp5s1awI30|bJ?%K z9*y~7v`yT89rmg3GiaN>-+({V_XygGQFP# z-PE+tf%cf1vjvLwdC;lGJ%LzKjU)Qw@_GVsdYsw%LWHf~0sXVE^}C=|Ft0`reLpWp zMm)a<+n0j>apu?Wqo4eGiupzKC*}1N^gYS^`UCj&MdsHZf^K5)N1#0hzl@%zm|uSk z+fRW1N#@tn=qJCPWquL;8F@Vmea|qz{v^V$KLy>y>(4+l@iKazWq$oRY(EA5XW++k z%n#!ElDwXS{FmSd;q-qgbglZb@SoGZ0y?d&uR!KG^waNT{z~ZeWODqg7|TJdzrP00 zSD}O2{8`QX4vKzPW7g#5!e571z~)uLUw2;5{VwBq9y|tb{4b&R-shPgFMv*$InR9$`d+~JzXh5Z@Ar`dru_qq-;CqG!9#S) zNoo)2-#{+F@4%^%6OCU>F8ln-6K=IuD3@Z%M53osb+ZN4nkr0ARbu&KIpd9l$c2(5 z_SC#;J?q7e)$=`f_r&C9I^zw*j(h1n8LwKH8BsK)frxu6nQXy3#i^BQd9v!(YMhpJ zOP*Uj6eb`j#{*-WkCX1#qGuTbXXe4$v}Q_i`ZR+!FAx(5q6Zz>rg?{wuL zy)a#|r<$+_=(TLsbxVprOxFCGe!|TTDF3#Vi{oFGcu{e#R-^@d7Q!LRx*sD6V zd_#wh&{$!{Eh-JMYZYC~v#9pP7zMtJ1XZcI*_+STTu-Wsx2-0&Mw|2p?GLwC`XgPB zvSfVbBUrZe<*xmNh1qMS5Q4zluu%oJVe!E|OO6dUP_??xz0 zx;GSgHjz?uZWoPgyl@xUXgV+%Q^g&jrQDc4Ti=@Y^P*S!YKaF;+4B)sd8acb*`J_{ z(2ht|t7CCEr80pH{dD85F+1U~N6k`-&r(>#nyqw_=BrRTbMw_~&XlEDXDyv?C#?r~5At@zg`)Aa~kqC4S5Bi(T)x>LWE5y=} z-z-aFVwOS*0n)`ewY^kgUBKROXd5FI*gM7jZEjBs_(KWUOD4EI$r`qoOf>AZH9jri z59M^j0Cm~=kzZRdQB?I^F}>W^5kL;A1$(Ou{bsp$TYp! z_^v_QlN?xJ0jmYm+ZT)KGlf5Rh%6Sd(<%0>TPVh1y_Y5FWVMi^B`>AQ)wtdYe2*Fn zo+Q+%(zoii}=`q8eYr~n*C>iCc5QrIbO)Q*f-BaGS$3H)f<~p8fW50KW$U;AxeFc1H*}Aa(yy6 zyl!YIVDjx7fgWC^u^jTzDSEW6hSHd2W$SnHR)e*;atpFtCE z^P!2sE;RA#hb9W8C{#kuKkUl1fZZ-q(M2k{NJST^=pq%dE>h7&D!NF8{&a{`ba9F< zPSM3Fx;RA_r|9Ao9pe;@r_qie3i{W$Qa(hn{G(aPpLeV3>3O3p!jlC#{nhxfgekPu z^2zjc<_@V`P2s@IfU=Qp;1*I$+PYI8@Z#BEK{2dw$Ko9b^P1vkbM~JK^8)(_vEJ2; z^>B#wWSG@2k{0)1n3o|aHglB2jYk-pH^O7KHHFwCyykn9#lOCl@|4XSI<61*I#dxl_SQX12{S7-j2}o(WU7;{2NkfxpHx8V01bo0Y=Ev3zF$ zS-KVAl5P`lX-upQk+m3IG)M+btzfbaCU~wuncVI3{WCKyV6yyNak6v}C(F+jC_5wb z)_m@itu|&a3M>oEp@y3}Ta?WJvwREhBQUc$6%|WyC%72`A`_=$&}`N!5YDx>U^8qG z5y$lKZmH0Y;MOQfW?Srwg|>|_x(1e)hOe2;=FA{$`Iic@i!-&-I}k45Ds8NIu9PhUW6X=JK2li_#wn&%MNq^8q>;mP)$_UA{etF5eWRQ^q(*m-m4t zo;+>ibd7v$52*{-m=&u_w}sWE!*CXIv@NvGeo%bL_+7qbU}wYdT93Jb;k6ue8z^40 zQMbVLeEoXit6T~}dkBjxaZ3qQQ; z-;{)a0b1&lZn{ACriusPfl6LtT{McsMQLk$u+Wgdu8ub#jUOA z=~-DQWs7xsMw)iLOfg;aa>c^2&5T|vOy}0pkN&C6Jw0_&5i4b;-I|QN8>I|1?em zBkjJ{)xm3B24)Jr*oENIU0nqg8$j%4XOp6ES#G(xgaYJrFyIa05=)p)U-Epc&$ zxfM#qLPqW^%D?xm5FDb(K0&hC5cV z2kR!iI#7L@F1IzxwpFSUbcmkK@-|sp;92``hs+9|wee!h?BLm}9Xp%TyJh)I&D*%~ zjJ{#^qXN)gt~bqK;??=C8RqXyzj5|T18HaU&9gRfw9el?n*)vpdvksR?d1Z~I^TC9 zkvH@ApmG{{1Mp^k`y?CV@~#@S-?Z4KPDYcb+Sr#~S+q`PP4}(1|C4XU_3JE+vm`ZG z-CPc33LBd?IWXeem$`hWRwS_DJmK$sy;TVbMobT zbupyBgBKY6L)e*Kkgu*+8edkhG(7Jw|LcvNK&E`5wt!0`(zo509y@|e=lA^RhJDY9%qjICabWIJ0~Lyd$rE>wjbZ%SHkOX7c> e7WzN17s3AncplnL7^rMpPBf8MpZ^79%qu2KRN=(XMLu}8bz-R{xtc8_*{zp|9>w(NW} z-$>t^H_w)wgV5^br%3ak@0#!XX5PGSq=Ydxjxjb$ytsHxVHYxwIcz<1Ss!a>dGV*f zQYJLXE%WBpmm^uWD$NEv}5^bG%O%%ihVScCh+hs-ZM=>l7V>nDm zc3Doyb_L5OBwt<``DP?v8Ag7jFrZt8!(&~7jheJ3jOl1G+@ctVD|C5mt@Kz%h)`_n z!-t+0WLfcNl^{+DcEzwMTu(+A2SIn)M)5f%jch`;^TODs5Vqywl@Xu11gmD;R-L{$ zvZbokry0A#^%aE&ArBy8WsQn08?KMCQH_eRCya4&DFEgq+Qmp-+b)=-hY7uTF?|X$ z#lV|UoOj&D;wO(2@)3h+s`MIz@2N60W6j7B)5n521Um$=^9VK$v26sa zLo7wG@rZR1Yyx6gf*p!j55W#YY?t)yC>9a#C!(Kpdm3p&Os10dT(0OjX;b=k>>oke zwEuM??+8IPLh2tWeGZ?G7N5X}V8=0nek}TQgv3Tkzm3Hgw8!D+F;dPL>94Wq-*Nal zR{T8?Y0L?v+s6yNlbFgOkUJUiNodCr$UjQz87r1^Cb7wet|@}z!`KJ3Q-uT=?}w4U z+Sd_i&k5)QkToCM5yXxX?Gv#Lq~85uWQM&9)NHeX@PS5*W*uaV!k!q5ZVc zewK_C_+OU2PnF~y%FFa%^GvRCAAIo zGl|T;XeQZQjNepM!cJ_qU-8$i3|tm#0}-Mh928*5jg{6w#CB3fJT9MBgVZ`gU`LYkik-#k*UM zcdW!N$MHtdp388|u#R3%?7GqtkE^)CHO;3iG*@$lYum3u+pi`zTuW>Knb)8Vuy$Wd z#&aE4>$`4W&(->_^Wg@rXs##myphE729yi;fE$VLK7+oynaI9{D;((I9&rolyOpc^ zhHl@6ZSCjVxuUs^(A;6r+{x8_{tn`sySUm5+)3!}=1SgO#Fo2>+MwGYs1`BND4Ce#5uPoj-*KYt2&;r{bwuJ%B>{WMp5 z8ZG-PT&05F0S7RdgyyWya0ne-V0<5FX5Q9UTD87Xf*AM#E!37?0A_g{AIM`>s(=w zS765;Vh8lSB3^q?_AA7WSJ9W+j#tqRO}mHCeuJyMmA30mwCfFG*IQiS*9jWn`6gF< zZ=nv@7X$Wt5rtOqnv3hgVai;&=Wh{ou#X&%pJCmaKt98>71##VQoZLqp85BLbC`cm zy4YwhGumex?G1*!jL}~-+WkiRA*21O(f*Oq{;ARa1@rG=KZO1OA0Cfw9fy;cio-Nk zj>8PZpTqo!A~qBA<78IO59q5GuLksMJ<&VM&XRUsf4DTsr$#V7T=tK zxTaZd8TSgrwJm2N-wG1{vzVGYdOx-j>CPhdtwMYz+P4fbEn_w2khW!w#omu1u4&d< z>|KYrws$@90e(4R=b*mzXv^7%X|;YL3gu_%%Y$TKBU`;I*N$tSYO1{{XviM zVvDanj<}{7u=wEpG3M#(cXT$sAs8s!zNJkPE|zAFjer;tzk>1xDgGPO4Z>>A{~nw4`HFv#I9%(H8WUp~!(IeZ=B zI)`sS3~Hv3!#6Q?K@LOTjpB6=%D$1iG$4cpUj2BYu4X^*v7b zzG(RMNyD#CAuiPdw& zrWa7&^CW&RVEi6LAHPWa^^zriUqf8S@9T)YjPct;;s<@Nh}REM_A4ZQuNm=s-4efV zAg*cNu*C08#Pt~8LcTXi{Jx3$-XeV8GUE4bBYxjOns1Z%eHUeY2mSXdVmdZ|#?&61 z#_xNG>)8A`iOu&2?_Z!lXk5RKxVGsB$p3v3zaL=y_Mne{NPPU4hL8Ws;^V(YT+{rG z#m7HJT-)&zbX#UBFDFT;FegjW98}u&w)khxS0U+}{E$a_RK=Rw&cxWaY4Xe3wI%NR#32j1Tn zBLSLGT-k6O(!Ymxj3IUa&1mr&gZ!hh1_S5uW4Vg0_V*!N#cU(y!Z@yI4&f?S#-WTc zyu9X(M;^LfPT&gH_m{)C!l3r`h@b)NaISE$cM`D|@QLCz33W{*x+Yt69l;g;0_r-F zE9^4#o0c<)`0Xgv4dXZx^=Z3~=Bgj;nnLUX{21|?g7S_bb{&g$(RKegu5j&xgRRq0AJ{R2*a0*riPsF|KMC!C?+8RO-)Hi2jj$eZ$g6tfnL%=MmXVtcMsCjL zilzZ&K)Y2Fnx>q_g>?H$MPp zassR?dWGH&FS5NiU3YO^L|olTFA=%Wb53pFZ{2J*Me-TJ| zznJXq$-0I3(nvAiTj+3wrGpa)+v;{C3;mf~CuodAIM%y;?fHBm6@xy&I+EFr-fYry z&)E=_K<|!*(l9&aSV&t9q8AgZSR|G5E)Hxd>3kAO#Vj`EVgMf(^yXqseP2HeCc-U$rFs{k;xmoFA zL0GXKi#VD8T3VC}pN%7_7jBapq=|+MGvq|vDdFBL%NQtqDy2s-?zS|E(=-XP80q3P zLBb^a_Fck+C5_ZHWZF1QA<~q~rI2V)^6bh(4N(gS2r4z>7nKR6GPkKQR$s~jr%8yM z6^WJ%l=*2mWx&_+MbsW5TV&^$k+rkhtWOt`9bPnA-K3}=EK@B}9|$0UfreXb8*sul z;BXOesnt4@bxF|n&47dB4Rf~Ax1+JI0sXG*Y3#Q-&F(n3tj-&J^fo6phdFU@QE(Aw zs)=_%+zFS}rPP^DQ)6GfP`X2SHC&Y4v2cYtw?eOw`+;=L-rR1i3grD_^|0=k;d9n@ z?+n*o9-V)*v#D{_#nC5sSlM9@X%HOy`RKA-uVKLxzz=VfSd&jVHp}?&x@QOlu{~1b7Q6=9Xz*Byu0zG zQ5g)M7wV}Tw7&&(_^2BD4F$|(vvX+PE)7;kN)7)x_ZCjH?b7f};@JY<*WXqn3Q%q^Fed^ROU1Pg0$jlt($oTQZvgQ|kZ79mH|)LV#bvN!u>_cug*a{6sNW#gp>w3Q7d zne{%d9-V^zq8Y%^9${t=*czQ9)kfpu4IrO{LNb-|C1kl3QY1VY46zF&$_*Q>>pxd9{y~uA@em%d7EN ztz>%OOQwSqOKWA)h@X_Yy;dfzl}T%5(ps6cRwk{LNo!@&TA8#~CJnUqs!UodkVa|+ z(prJERv@hvNNWYsT7k4yAT7<6KmG#gt)xIYzFZ(}t`$fR{sL(xXRD3odp*=EG6MD1 z>ZP@MX{}yrT(x>>tzKHIm)7c~wR-8Wy;7@}*6O9TdTHb!sF&8NrGL8B(ps&wRx7R5 zN^7;!TCKE_T4|{)R%w|O{+0W9xlDR&v_sIRMUF!SZ=P6-JB26QLUemfud;>wPNzG0 zzEC0ko9IhO9ZsosD%gas3)I7Mv?Jz=rzS;n4BAAHw&Vzd(#TIqi_<Jq_JvpH(;?Od3iMSdvx=;& zNH2|S?CYzdLO+NfhgqX{{5AUYaEtW&B!9wlNb0H}i)=M>UoM50>Z=I)-WBV`-Y6}? zK18WLy{~HZj=xr)-kV}Q*6OQt)gW=(U-f#&U$3_eI$Q=^dNKEx?DyTcD=*t?ou$J4 zfv?*;{HSsvZ&X2w`opsq=K%g8@6|!T(1YG@CjmpN-fu?%L#rO{S%5RdSwLmEpw9*1 z0oCyx4wNRf^?0Dd32YW(!Vd_X-~j4rcR?_?A4JF#@0KyT%~69vbAqJVsOra<(<(w3tIXE;X->59)5&|( zt5Pnc6pfa}yS&&dz@l17$jgQzqDUhh5~-<@TaaJC06jy2|0Q@r`3z;sis?NuR_E zJMQRQ2!0F_BCIsNWlIOVM`QI{w^}$exj_o^TekET-9j{*@5oVhS^Cf9vYDKCW^t09 z2;}x&&vl$=G@0F*>@Pa1v%cO|hWEM(ZZajNY)&j}s(+?@$_aMNB+on{y~15HHH*cSQz5c)y^7ql#>?^9{SNGk=s_OWtrRuNS@B3o@UVh;o z6KP+6?fzh>=5sh`? zQ^B^+Js{iTgXGXa$Y0 z!?>(C?crA=vJm6bCsyQj4 z@fzfmBshxq?PnK*9Fz?D(~F@FNicwZ3_4KU( literal 5555 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 BhOz(v diff --git a/Shaders/qsb/wp_stripes.frag.qsb b/Shaders/qsb/wp_stripes.frag.qsb index db496eaa5b10c2627de673c1ad7bec01da2bce11..e3d28b8aa2a7bfb8760721834453191af84c3d6e 100644 GIT binary patch literal 8873 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 r&l#uo==3@ti}1Qy%g0P!2-g- zS!{;*|Mc}k>pKfhqBGh9LlB$8ngkt`9mbl4Kj3fFv@?KzkTLcc2mdq)d^5;kO>807 zWG$N}zQbp_fTx$?X7nq?EyDj5jw5a*!37YvhTxhIx0c|hA#OdvO-I}&f}4T3VS;N$ z+*t%S6LIGf+#!fNkKkGmmms)Vh#Mie*@#OM+@Xle5!@WaK^&gWrit&$UkW~vz|bZO z2>b`6=LDwok7Id&z_c9NSIL{p0)lQKYZ5+(??u<%4iT|2!>0o&_;}XDj=&fKxkn=Y2()7^@M`iijugcl+1C^n6qggT%;ixEB<;{y0kLE0Il zycJ_a!CmM(fPoH162{nyc`U%X34V(}-?~D{uB+w8)L>wu=T5G zE5mYtzeZr7zf~*0ORL+@F_xijzreaFU;Pego6%PQKZrOe|2>w?#d2uFKM;K&|Bu+N z3VsCJSJ6MN(LaHGRl)zleyZv-jWd=#a_>?FPv?xi@2aboEBYB+jwcG9!{s=n=#LeF zx^k5&Kc36@g8G!WtdER=X>1R|w9PJ&fxc3~Z|02Meb-%sO5WSJ^r0&Mg4DMXG0nas0w8bwa_B2B3dlHva^N=t^7{@@K-eW>l*w` z4gOyZo)K`vvott}@F31F58?Q*oHdEqdWe+$8RHGg{)F%Mk4O*k{a3^T z{i6sg`oAIlBZU6%hzI(|5bkF)MPK`en7icI1iC@qV@UfjmMc5|P3(LUVWszJ)cXX{ z`wZfN{wahNJ#@rHIEE>D4xN)rda)4Y6*~i5+6iMK=mvQ}1GN9dawWSNWy5%Wd!*p6i|HW{Ss zL@viKC2tYRn}cP*1LM~s!gI35a|-etie>uD#{!+9b=8OR%V-Rgowl0SoC?%MqAbrnJ?4qcsZ9irDHwncsb$OpxN;Xv~>fqVIk}~kk7K{g2Gi)Wg&(`cchfAEYWgGhD9Kv(1 zX76^SIhWY`N-lY~6TXpU)TN{)&3K9BJ1&~(L7*AAj9!6k2;)ZfDT2ho-Uk(t!& zNO6f%Iz~`OityN)9p|I1HnHOZE_u%@TCxdcE2~Sqjl|z~=(RCr0yg5?m zJgGC-av>=zkTUR19^(Plj0K{*$mP0I!8^HJ=PFxvfh}C(fgjeGy9oVmF4vuE4!8*Q z&cw0|?gK97vJ7Ovy7Xd{0cEeowQ5%FDZzi7vCGhg*K&!2z0OTIhwtSQFUBs`B-XZj ziCveXT?&3Z*6WQZ^9@i(F7axe@kX?LF_weuBFcxgGL*x2SSP=k$bKuAYiR{v#^qXC z`S5ZsX)Z&4SXW<8=J&Vb{Qfo~;~iY$75q*v*W+Ks`oD`y8o4BgItMa?;&=)*T;^lxWp^?eQ1Y*-;Z_Oi*@|~#_sz`>|PCfVlK;WLHj?* zrR=NG{tpxTq3lDPv5%mQA0qY_(f$u(*++;i*Pv}c3wx7mNZH3VyFa1XeJ#rV1hM-% zF8QuSnXtdPj`-`7KK}X?mv{w#n#+BX((@TEX+BM8{)@}KlY+0;cy8d5=6VvppXE~4 z4a7HqqrQRvX{hWe7kFbi_|K^hB^MvL`jpmEkCvPOS-o)h@!xstN&0Na6 ziP(BGk^5yX_qtF9d&V!5vafQv&sFf(xZDRTeYZfL;1Un~u*bZG(BI1CK3v)I4d?@C zH_*c#^czSIarr;EPllMhox~*IZ{v*p0DXBI(eW+K#&2`Ew^ecU9WH6UO=!NW`Tq_s z_s0sp6J;p7@8S}736Xm@mwa~-y6I9i{3x#as9p}UVu+4mB?YyMN0i&2I?J z@3=fCQFG9PI0uDM2k`t3>j~!}4`My~V5-0CI&av;)pMA1CAa6F%elzra2+?>-53le2@TNIXH=zd2*iV4dK* zs>9P*C#Cmktp8I;`wX#TpN}1Ic)E|wpBxTT1JbWxM^m6;2b2W@j7<+n+3;Q2F)bi{ zsq6q4>;Qgo9vi6WY!1kFE}!QFWUQ!mJp|6%0ury*e=T_4I}OW051iWpUdfpqaF5A{ z0)If}5){oGIBO16V(hR$CB|+=9-vXS9FD#?40XcUAmEg|BLi}LQuK2J5(l{uW&1p0 zJCrN?jta=KO9=nbsP8C3cT7N@mmf{^9vhJ7l#1rKfW#d`>^zRp&qsQt=XlgJpS0nN z1M-}HBbzDCbWjHMfpciUmCuU;@@!hQUsP+qo`A$f ztF&J)(sUEQF7au!B=ST)f)V9 zgq5FPggz*rBcmVGzG4B=03Q5&JmOT_y##X(CleV##4DOMq-iBIixIE%v?Cwj#d$R1 zRNkW#+YQP(5LWU-D8Gxy4l3XOMUT9E?xB7z0DZr^7z+btd9fd~HSC7L2d6NqlX^-vsSJ z*=G^i+kD#eT*NDQJJwP4l~*Fob|NR{)9&XXUcsi;w|5{7;MF-{oRM==qyZnDgJnvV zrTIOn`8|a+NkRj^V>*Y#ij8z5s3Uk+Tu zH)t{ZMx=QIk@F^>wtF+;75o-0hTn=bZy_;!8OHF*sOPQf%ofX(thZ?~{B|vd-+?rM zFQ2>O9IV>rT}by%)NwiDRGqH$@y)vtuV~)mQ}6d8UfFUL^1YYD$@_5rSMl|Jq?34w z`vBtAczgxol#CB*^V^4f?ENs}70pL{?ENU>mA%&>-$zNTe+>0qgSK3aIAzNxaJ{17 zYjHiJ>USN|TubzR65B)R{S@LpN&4-lk@r)m_v46DdOm~eqVoBx78loRad89ETu*d- z7UkSP`r~J@KdL^nSL>f=YjaL7vFUTTwtR*K#CNr(g|#pI1_M6xaP11eQ#*>RZ;vKx z+GEJ~V^Pn1vL5_`wm!U3TW{W^!CxZlNBIAXs1NFVBf`pWH=}+iy9wd)886x+&Ug{- zXU#(9S8&}9@__G4NcROSQ#tcn(0-bW|2pE;nD!0C!5P7I>P#2$;!Kx}ae%*#F@Y0j zxb@#=RZ-$tCuNhmq+|36r>p!p8!o{#jm5xc&Nj$X&cBH?9*!4p!2fKbm>;n8faQ=((?jd&l*vGD) zAYS?Fr-)PjQgVJo?D`q%z7y&1K|Agvb^y)2a5jwm_o5x}d(mIwSOvc$ReQ<%5f6Rq ze&o3i%i(vxzry~cV*CND%U0}vzebt|P{yyZf5I^W{>EKB-hiip^Uqwg)5;g@Y{m$O zLM^$x6}JU6Vy8xOMlzi>odFNp&Nu@tEd?iEj624TVzT9;7Q--%QPYVU7do*Grjxfz z0|F-`0CHo_jN8r_#pd$aRNg8SD6Zh-?VPnbTLcvqw3$hzEf?KrHtURJG;Xtyv*ONX z)3LJ@owU>G4cUZCfIVuatgUv!83}vPYb`r9;)MOlBUQ*<_(D8ySs6j^MN4{#-)Y68 z!oJnnbT&WGvS*;BrI@jk+59MY)+p{MCJ9RVzhI8$(pEmQ#wcWq`M4Dx7>6J-(9*Kg z%#Ycb6ljbBIDDG@8S2HE*LSR{mR&09Wja8xz zjKMOK(N&@MI-^VuHSHvRGrA~B^I61j@@A$0RkjjmZUOe4vd~T%LBXdQ-B@OXI(u40 zp)|HELyF#Hm#nmqV6+K*P&cLBYf0;XTa>8!#$>W!L0y7%i!nN+%8G|8zHK$yz;r)N z%4S-F4r)Y&Np}?C@2aj_^6wGcJg{RYLMwk1W&^6gH!zHxRBc=UrB`O@iH0-eG3LkmZJ9{iVes}iX5JhngFLPu04rRkqevt5Z-Un1zF9ocN!h=u#RjX}4R&XSmFLX<2LLJ+#*Lg3OTA|UaRwA=_QNmU17 zWCf{|Qfcm^nj@i*kLEs)<}q4_TAG2iQazXEaF1JapI39Z$47I0br!6Z>g_43f+AfL z#%y^I#8s9zsI8Jy%v+H)K@p@b%UWfSXYGUmi|C*$GK)KnL2Wfvchm~2s;omR(OaQ% zElWkGi$irlluz%&r6GoI)o`v@8tblNYt(CN#7ouVV{1gWHB!sgh_bC)eTk|sYU+~; zN6lQ$N(_~^0Ah|R1w);oP&gz%(IwITCDER6cc`bkuRj`!M*4gEmh`k6q0Vke5f1l9 zLj94x{+^!DlD=@HM~&DOv28lWWkoEqB&w}B$?nBi4*kd*`Af>)^lWu%1ij!2N8H_m z?wG&_6@$p8X|tIy293O#u+2i#t0@Mw^f-7CXhAontW7+nH4^ww#sEm6?Jaz}Bkh2%nJS3KToD z$;#(&4Fi7=B(U7-5WIp}Vgzry0ZXvz<*n^T6(Qkqgpl%9EtX5lM6(oxzx_ASU&y3Q zl#RA23o%9;uua7t_JWKeU6)B%C75_KPB59yX7jFvIBXUt^`sF$3hQ z!6O{)4~4_M;c$Okq}|XGdFEu8$vGryk{@Lmh?~%aoG^zdnGtWeBUs zn=-vBmct^GR012nqil6+Yqg!6M}K+BuGrwR!z%&@r?_M9w1ylr4?8Ym%|KP+Q!~*2 zYa2dL+gi;L9n=h1UI#0h++}(l<-cC}8b);yg@92j*ey&BMnr$p%3Z-ZCS$rh`sqXB zW;2t*4Ye3UI@EyYj_`cS&KQGqkZ*%drB48xvIX0*vzba@lK!d3A!UGiD-#x@KG<7% zoe`{9y%>0eWx|;9kW)2`JsNRr?Mu7Dbm!S!sJuNL-!U=vuf}i=vR1!{+P$P+SFp@|$(npQNQ6q7rx_u*Y)JPmP5=V{1 z(X*d8YNU+7ZH<&sBW2V`88uQyjg(O%Wz08aJOMpWy5GDhA>D7@Y>@7^>WQFA-x)s#6sWxZ89pZ*72i=zCat_kPAoO@R?03oRzA2R zq^{%0XLrR$&GWN)*-p_?ROpD6FQhY;8aXq5fxJy87Jd*#y~jkXW&lo@Dg8CKWMER$TzReFtv zxC4;M%c%{{4wUf{4wcSCQ30r_dm)KDa3P| zo68_FHKRD~4#)|JGCGvv8uvgZ{S{8tRgg6dsB;ZXy&f)m-A!BlHpp15+XZ8F-Y!^f zSp7c88nyGk5fUZUx)X8&4LsRfA;X=aWM`>V<4(xrWG{uJtrc;#mY1j2t&mgFZq?gP z=&Gaj{BDMHwV}LQablga+U=0Z8rJ(<5ILzqMH4)cOCr%Boh5BCU&jrRylWM41)qCi;#eiMC@D|46P=@`_!`M7Q_&P&B$=GLnm=O)R=;)9wej=TV7z-L^_|at+(enS^0|7hqD)GC7Z$JB$LD^9BW zDUYeMe<%Kkld;Zz}fc@V}%oIq6#}lLz~nN|)*N+*27l`1e#M z@uJG)LA|Lm`JB3{GWqP^RhfJ~URIer;HhJ=)Y5auU_fW7R4TRB7`^;fLzB)OyT&Xr zd_QlJ$66c78A!jPGC5UuREjwrwN}l2CR_EGcU5D&EHWOX`{$99&)r0_@QD^q<7ASB zr>4T6werbje?BiV$|Qv=w%6Wtk$i`PClzHB95ZFbZ1}D=;jV<#Af@Q^*^^iH@Dkyp zT1vt|rKPLOSO=TwQ7Z$P!EDCJCJkrAGEQGVv|cQyTa9Ef z6NjR9W7misA2IBLQAoocK0Rh6Y)JT98OLx&%#5)C#2QJ#*Wy^CIXGln21bKwV;ElB zQ3l4Ax7eAqodLX1HC%!O+3;BX$+6nzs~v2m3Vt?KtSB=K8wt$<*r^P|&>LP7?dgv6 zM|vRDy2s~k)bbA-8ZX(K(8I1OH|&1g72ON{Cj@<}S|WMdHZfNRL#^Al`*7Ns8folp z+lmD%A53TC8Okmaf+VzFS*Oz$$s3NcyO+Ul31bw=`*nK0tnOu<2| zr-;*VZ^0?#Y`jXTbQG+gG6l!Xhb7m_8RnXV5keRigsKChAW#mp@7mG+qJOcm-tT(|84B;}wvNS3r)FRL^SJC%yg8ljN21s{i-Q~#%WY@<_uDj$`O|ZMEswLUoRL|Wfw%s}QdOTZSp54!v z-dww%FTMHptdB3N=iJ@>%3 W7GU_(vfOp^!N-qZeEuJ!6b#9356u7o diff --git a/Shaders/qsb/wp_wipe.frag.qsb b/Shaders/qsb/wp_wipe.frag.qsb index a7dc6b14ae7e97f5f5fea095db996e2349b3e0e1..83364542c7ae6ac3031a466305a00e5f5ea33463 100644 GIT binary patch literal 6262 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%0AMu(zss>4Q zqxV~fq`K(+)*`7cdZay)M3o*%ZMmTPCGdip@H9=zi`v>Ysc`|DrI_HxNy6Va!CO>K ztrN5MP_3Cl^{?7aNz~L%N%-3-)Piaa6|>4QiWZBY9;l_ql9o-Dbc?SNH_wCwbXn3t zZ5Gc&P@g4X^jXr_Xi1N-(~>YcExzi8TVPMWzr7Y2AhV>dq>6X5p`l2XyN1=`N@bUW zr`h6~PHO9Z(_QmDF7R7sbww?;gj$nf%)L{s`A}nW_`T%wR7JxNN{g%JgxBJV?Usbm zZt>S>)o%&->c634N!-X28MxL@Lr)dBi(<4|9**wAQ~@la6^FbWC?pDLrS2g$Yrw-t zyqCc+?IywhY<{TQO*;05IRk=4e=^jQP3C$-sZ6prmoGw9JR>d&PAW8e{?`6Xv6#vA z&KEc3Qogijz$wmdZl06L^<)QOIIL;u8F@~#*#s~pv$;K`iKqPcQ~*V+6ys6Nz4CyS-Ui^ueHjRVsF8KciOYU+Q~ z_q()p^*>Nb-JfraeG_DqA8=qIjrC_72SX=h|9;Maf_}R{=%~|M??W?Wlpl3e?S+ie z>{0YWetSResG%3K-`omEg4Q>6TlVrXmO>T^*(of3QN?3Kqj9CLq%r)D}9KrfH~2enYNT|ZN7W&i*H literal 5457 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