diff --git a/Plugins/ZShell/Blobs/blobrect.cpp b/Plugins/ZShell/Blobs/blobrect.cpp index aeedae1..dc03432 100644 --- a/Plugins/ZShell/Blobs/blobrect.cpp +++ b/Plugins/ZShell/Blobs/blobrect.cpp @@ -14,6 +14,8 @@ BlobRect::~BlobRect() { } void BlobRect::updatePolish() { + BlobShape::updatePolish(); + if (m_physicsActive) { // Check if deformation is visually imperceptible float totalDelta = std::abs(m_dm00 - 1.0f) + std::abs(m_dm01) + std::abs(m_dm11 - 1.0f); @@ -39,8 +41,6 @@ void BlobRect::updatePolish() { Qt::QueuedConnection); } } - - BlobShape::updatePolish(); } void BlobRect::updatePhysics() { diff --git a/Plugins/ZShell/Blobs/blobshape.cpp b/Plugins/ZShell/Blobs/blobshape.cpp index 40a7eab..d284a5e 100644 --- a/Plugins/ZShell/Blobs/blobshape.cpp +++ b/Plugins/ZShell/Blobs/blobshape.cpp @@ -68,8 +68,21 @@ void BlobShape::componentComplete() { void BlobShape::geometryChange(const QRectF& newGeometry, const QRectF& oldGeometry) { QQuickItem::geometryChange(newGeometry, oldGeometry); updateCenteredDeformMatrix(); - if (m_group && newGeometry != oldGeometry) { - m_group->markShapeDirty(this); + if (m_group) { + // 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()); + 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 4acfe1d..f130c23 100644 --- a/Plugins/ZShell/Blobs/blobshape.hpp +++ b/Plugins/ZShell/Blobs/blobshape.hpp @@ -82,9 +82,13 @@ float m_cachedPaddedW = 0; float m_cachedPaddedH = 0; QRectF m_localPaddedRect; QVector m_cachedRects; - int m_cachedMyIndex = -2; - bool m_cachedHasInverted = false; - float m_cachedInvertedRadius = 0; +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] = {}; float m_cachedInvertedInner[4] = {}; };