diff --git a/libs/image/brushengine/kis_paint_information.cc b/libs/image/brushengine/kis_paint_information.cc index 0cf8872..1f80508 100644 --- a/libs/image/brushengine/kis_paint_information.cc +++ b/libs/image/brushengine/kis_paint_information.cc @@ -356,20 +356,32 @@ qreal KisPaintInformation::drawingAngle() const return atan2(diff.y(), diff.x()); } -void KisPaintInformation::lockCurrentDrawingAngle(qreal alpha) const +void KisPaintInformation::lockCurrentDrawingAngle(qreal alpha_unused) const { + Q_UNUSED(alpha_unused); + if (!d->currentDistanceInfo) { warnKrita << "KisPaintInformation::lockCurrentDrawingAngle()" << "Cannot access Distance Info last dab data"; return; } + const QVector2D diff(pos() - d->currentDistanceInfo->lastPosition()); + const qreal angle = atan2(diff.y(), diff.x()); - const qreal angle = drawingAngle(); qreal newAngle = angle; if (d->currentDistanceInfo->hasLockedDrawingAngle()) { - newAngle = (1.0 - alpha) * angle + - alpha * d->currentDistanceInfo->lockedDrawingAngle(); + const qreal stabilizingCoeff = 20.0; + const qreal dist = stabilizingCoeff * d->currentDistanceInfo->currentSpacing().scalarApprox(); + const qreal alpha = qMax(0.0, dist - d->currentDistanceInfo->scalarDistanceApprox()) / dist; + + const qreal oldAngle = d->currentDistanceInfo->lockedDrawingAngle(); + + if (shortestAngularDistance(oldAngle, newAngle) < M_PI / 6) { + newAngle = (1.0 - alpha) * oldAngle + alpha * newAngle; + } else { + newAngle = oldAngle; + } } d->currentDistanceInfo->setLockedDrawingAngle(newAngle); diff --git a/libs/image/kis_distance_information.cpp b/libs/image/kis_distance_information.cpp index ee8b5c0..cb9c972 100644 --- a/libs/image/kis_distance_information.cpp +++ b/libs/image/kis_distance_information.cpp @@ -30,7 +30,8 @@ struct Q_DECL_HIDDEN KisDistanceInformation::Private { Private() : lastDabInfoValid(false), - lastPaintInfoValid(false) {} + lastPaintInfoValid(false), + totalDistance(0.0) {} QPointF distance; KisSpacingInformation spacing; @@ -43,6 +44,7 @@ struct Q_DECL_HIDDEN KisDistanceInformation::Private { bool lastPaintInfoValid; QSharedPointer lockedDrawingAngle; + qreal totalDistance; }; KisDistanceInformation::KisDistanceInformation() @@ -132,6 +134,8 @@ bool KisDistanceInformation::isStarted() const void KisDistanceInformation::registerPaintedDab(const KisPaintInformation &info, const KisSpacingInformation &spacing) { + m_d->totalDistance += KisAlgebra2D::norm(info.pos() - m_d->lastPosition); + m_d->lastAngle = info.drawingAngleSafe(*this); m_d->lastPaintInformation = info; m_d->lastPaintInfoValid = true; @@ -244,3 +248,8 @@ void KisDistanceInformation::setLockedDrawingAngle(qreal angle) { m_d->lockedDrawingAngle = toQShared(new qreal(angle)); } + +qreal KisDistanceInformation::scalarDistanceApprox() const +{ + return m_d->totalDistance; +} diff --git a/libs/image/kis_distance_information.h b/libs/image/kis_distance_information.h index 4a756b1..5677e73 100644 --- a/libs/image/kis_distance_information.h +++ b/libs/image/kis_distance_information.h @@ -115,6 +115,8 @@ public: qreal lockedDrawingAngle() const; void setLockedDrawingAngle(qreal angle); + qreal scalarDistanceApprox() const; + private: qreal getNextPointPositionIsotropic(const QPointF &start, const QPointF &end); diff --git a/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_drawing_angle.cpp b/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_drawing_angle.cpp index 2eaf47c..31fb24a 100644 --- a/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_drawing_angle.cpp +++ b/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_drawing_angle.cpp @@ -55,7 +55,7 @@ qreal KisDynamicSensorDrawingAngle::value(const KisPaintInformation& info) if (!info.isHoveringMode() && m_lockedAngleMode) { if (!m_dabIndex) { info.lockCurrentDrawingAngle(1.0); - } else if (m_dabIndex < 3) { + } else { info.lockCurrentDrawingAngle(0.5); } m_dabIndex++;