From 666bfacfccf0d16ca27f61f9a6ce45019debc932 Mon Sep 17 00:00:00 2001 From: zach Date: Sun, 19 Apr 2026 20:30:43 +0200 Subject: [PATCH] edit blob shader --- Plugins/ZShell/Blobs/blobshape.cpp | 10 ++-- Plugins/ZShell/Blobs/blobshape.hpp | 2 + Plugins/ZShell/Blobs/shaders/blob.frag | 69 -------------------------- 3 files changed, 9 insertions(+), 72 deletions(-) diff --git a/Plugins/ZShell/Blobs/blobshape.cpp b/Plugins/ZShell/Blobs/blobshape.cpp index b6103fd..d284a5e 100644 --- a/Plugins/ZShell/Blobs/blobshape.cpp +++ b/Plugins/ZShell/Blobs/blobshape.cpp @@ -72,11 +72,15 @@ void BlobShape::geometryChange(const QRectF& newGeometry, const QRectF& oldGeome // Accumulate sub-pixel drift so slow movements don't desync the shader m_pendingDx += static_cast(newGeometry.x() - oldGeometry.x()); m_pendingDy += static_cast(newGeometry.y() - oldGeometry.y()); - const auto dw = std::abs(newGeometry.width() - oldGeometry.width()); - const auto dh = std::abs(newGeometry.height() - oldGeometry.height()); - if (std::abs(m_pendingDx) > 0.5f || std::abs(m_pendingDy) > 0.5f || dw > 0.5 || dh > 0.5) { + m_pendingDw += static_cast(newGeometry.width() - oldGeometry.width()); + m_pendingDh += static_cast(newGeometry.height() - oldGeometry.height()); + + if (std::abs(m_pendingDx) > 0.5f || std::abs(m_pendingDy) > 0.5f || + std::abs(m_pendingDw) > 0.5f || std::abs(m_pendingDh) > 0.5f) { m_pendingDx = 0; m_pendingDy = 0; + m_pendingDw = 0; + m_pendingDh = 0; m_group->markShapeDirty(this); } } diff --git a/Plugins/ZShell/Blobs/blobshape.hpp b/Plugins/ZShell/Blobs/blobshape.hpp index aa1d018..f130c23 100644 --- a/Plugins/ZShell/Blobs/blobshape.hpp +++ b/Plugins/ZShell/Blobs/blobshape.hpp @@ -85,6 +85,8 @@ QVector m_cachedRects; int m_cachedMyIndex = -2; float m_pendingDx = 0; float m_pendingDy = 0; +float m_pendingDw = 0; +float m_pendingDh = 0; bool m_cachedHasInverted = false; float m_cachedInvertedRadius = 0; float m_cachedInvertedOuter[4] = {}; diff --git a/Plugins/ZShell/Blobs/shaders/blob.frag b/Plugins/ZShell/Blobs/shaders/blob.frag index f9d8503..4f3bd45 100644 --- a/Plugins/ZShell/Blobs/shaders/blob.frag +++ b/Plugins/ZShell/Blobs/shaders/blob.frag @@ -138,75 +138,6 @@ void main() { d *= scale; } - // Rect-to-rect edge sinks: track the same edge of neighboring rects - { - float rectSinkValue = 0.0; - vec2 iHalf = sh.xy; - float preOff = smoothFactor * (1.0 / 6.0); - - for (int j = 0; j < rectCount; j++) { - if (j == i) - continue; - - vec4 jRect = rectData[j * 5]; - vec4 jProps = rectData[j * 5 + 1]; - vec2 jSh = rectData[j * 5 + 3].xy; - vec2 jCtr = jRect.xy + jProps.yz; - - // Per-edge containment: the other rect's full span on the - // perpendicular axis must be inside this rect for that edge. - bool hInside = (jCtr.y - jSh.y) >= (center.y - iHalf.y) && - (jCtr.y + jSh.y) <= (center.y + iHalf.y); - bool vInside = (jCtr.x - jSh.x) >= (center.x - iHalf.x) && - (jCtr.x + jSh.x) <= (center.x + iHalf.x); - - // Top/Bottom: other rect's height must be inside this rect - float topPen = - hInside ? clamp((center.y - iHalf.y) - (jCtr.y - jSh.y) - preOff, - 0.0, smoothFactor) - : 0.0; - float botPen = - hInside ? clamp((jCtr.y + jSh.y) - (center.y + iHalf.y) - preOff, - 0.0, smoothFactor) - : 0.0; - - // Left/Right: other rect's width must be inside this rect - float leftPen = - vInside ? clamp((center.x - iHalf.x) - (jCtr.x - jSh.x) - preOff, - 0.0, smoothFactor) - : 0.0; - float rightPen = - vInside ? clamp((jCtr.x + jSh.x) - (center.x + iHalf.x) - preOff, - 0.0, smoothFactor) - : 0.0; - - // Lateral distance from pixel to other rect's extent along each edge - float hLat = max(abs(pixel.x - jCtr.x) - jSh.x, 0.0); - float vLat = max(abs(pixel.y - jCtr.y) - jSh.y, 0.0); - - // Perpendicular proximity: full strength at edge, fade inside - float topZone = - 1.0 - smoothstep(center.y - iHalf.y, - center.y - iHalf.y + smoothFactor, pixel.y); - float botZone = smoothstep(center.y + iHalf.y - smoothFactor, - center.y + iHalf.y, pixel.y); - float leftZone = - 1.0 - smoothstep(center.x - iHalf.x, - center.x - iHalf.x + smoothFactor, pixel.x); - float rightZone = smoothstep(center.x + iHalf.x - smoothFactor, - center.x + iHalf.x, pixel.x); - - float s = smoothFactor * 2.0; - float sink = max(max(topPen * smoothstep(s, 0.0, hLat) * topZone, - botPen * smoothstep(s, 0.0, hLat) * botZone), - max(leftPen * smoothstep(s, 0.0, vLat) * leftZone, - rightPen * smoothstep(s, 0.0, vLat) * rightZone)); - rectSinkValue = max(rectSinkValue, sink); - } - - d -= rectSinkValue; - } - mergedSdf = smin(mergedSdf, d, smoothFactor); if (d < smoothFactor && d < minDist) { minDist = d;