revert blobs

This commit is contained in:
2026-05-19 03:55:48 +02:00
parent 5eb32fc30c
commit cb1df5078b
3 changed files with 10 additions and 34 deletions
+8 -32
View File
@@ -67,48 +67,24 @@ void BlobGroup::markDirty() {
}
}
void BlobGroup::markShapeDirty(BlobShape* source, const QRectF& oldGeometry) {
void BlobGroup::markShapeDirty(BlobShape* source) {
m_physicsUpdated = false;
source->polish();
source->update();
// Use cached padded rects to find spatial neighbors
const float pad = static_cast<float>(m_smoothing) * 2.0f;
const QRectF srcRect(static_cast<double>(source->m_cachedPaddedX - pad),
static_cast<double>(source->m_cachedPaddedY - pad), static_cast<double>(source->m_cachedPaddedW + pad * 2.0f),
static_cast<double>(source->m_cachedPaddedH + pad * 2.0f));
// Compute the source's dirty rect in scene space using its old position
const QPointF oldScene(oldGeometry.x(), oldGeometry.y());
const QRectF oldDirtyRect(oldScene.x() - static_cast<double>(pad),
oldScene.y() - static_cast<double>(pad),
static_cast<double>(oldGeometry.width() + pad * 2.0),
static_cast<double>(oldGeometry.height() + pad * 2.0));
// Compute the source's dirty rect using its new position (fresh from polish)
const QRectF newDirtyRect(static_cast<double>(source->m_cachedPaddedX - pad),
static_cast<double>(source->m_cachedPaddedY - pad),
static_cast<double>(source->m_cachedPaddedW + pad * 2.0),
static_cast<double>(source->m_cachedPaddedH + pad * 2.0));
// Mark shapes near the old position as dirty (prevents ghost blobs after panel moves)
for (auto* shape : std::as_const(m_shapes)) {
if (shape == source)
continue;
const QPointF shapeScene = shape->mapToScene(QPointF(0, 0));
const QRectF shapeRect(shapeScene.x(), shapeScene.y(),
static_cast<double>(shape->width()), static_cast<double>(shape->height()));
if (oldDirtyRect.intersects(shapeRect)) {
shape->polish();
shape->update();
}
}
// Mark shapes near the new position as dirty
for (auto* shape : std::as_const(m_shapes)) {
if (shape == source)
continue;
const QPointF shapeScene = shape->mapToScene(QPointF(0, 0));
const QRectF shapeRect(shapeScene.x(), shapeScene.y(),
static_cast<double>(shape->width()), static_cast<double>(shape->height()));
if (newDirtyRect.intersects(shapeRect)) {
const QRectF otherRect(static_cast<double>(shape->m_cachedPaddedX), static_cast<double>(shape->m_cachedPaddedY),
static_cast<double>(shape->m_cachedPaddedW), static_cast<double>(shape->m_cachedPaddedH));
if (srcRect.intersects(otherRect)) {
shape->polish();
shape->update();
}
+1 -1
View File
@@ -45,7 +45,7 @@ BlobInvertedRect* invertedRect() const {
}
void markDirty();
void markShapeDirty(BlobShape* source, const QRectF& oldGeometry);
void markShapeDirty(BlobShape* source);
void ensurePhysicsUpdated();
signals:
+1 -1
View File
@@ -77,7 +77,7 @@ void BlobShape::geometryChange(const QRectF& newGeometry, const QRectF& oldGeome
if (std::abs(m_pendingDx) > 0.5f || std::abs(m_pendingDy) > 0.5f || dw > 0.5 || dh > 0.5) {
m_pendingDx = 0;
m_pendingDy = 0;
m_group->markShapeDirty(this, oldGeometry);
m_group->markShapeDirty(this);
}
}
}