Masterwork From Distant Lands
ActivePublic

Authored by dkazakov on May 12 2016, 4:31 PM.
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<qreal> 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++;
dkazakov edited the content of this paste. (Show Details)May 12 2016, 4:31 PM
dkazakov changed the title of this paste from untitled to Masterwork From Distant Lands.