[calligra/krita-animation-pentikainen] krita/plugins/paintops/libpaintop: [FEATURE] Reimplement fuzzy rotation sensor

Dmitry Kazakov dimula73 at gmail.com
Thu Jul 23 11:08:54 UTC 2015


Git commit 59a5809bf7d066c1059f98f4f2799eea530f3baa by Dmitry Kazakov.
Committed on 23/07/2015 at 10:21.
Pushed by dkazakov into branch 'krita-animation-pentikainen'.

[FEATURE] Reimplement fuzzy rotation sensor

Now you can combine fuzzy brush rotation with other sensors like
"Drawing Angle" or 	"Tilt Direction" and the fuzzy noise will be
added to your stylus angle according to the chosen curve.

CC:kimageshop at kde.org

M  +19   -2    krita/plugins/paintops/libpaintop/kis_curve_option.cpp
M  +10   -2    krita/plugins/paintops/libpaintop/kis_dynamic_sensor.cc
M  +2    -0    krita/plugins/paintops/libpaintop/kis_dynamic_sensor.h
M  +6    -18   krita/plugins/paintops/libpaintop/kis_pressure_rotation_option.cpp
M  +6    -19   krita/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_fuzzy.cpp
M  +1    -3    krita/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_fuzzy.h

http://commits.kde.org/calligra/59a5809bf7d066c1059f98f4f2799eea530f3baa

diff --git a/krita/plugins/paintops/libpaintop/kis_curve_option.cpp b/krita/plugins/paintops/libpaintop/kis_curve_option.cpp
index 35a9ee0..4766414 100644
--- a/krita/plugins/paintops/libpaintop/kis_curve_option.cpp
+++ b/krita/plugins/paintops/libpaintop/kis_curve_option.cpp
@@ -326,12 +326,29 @@ double KisCurveOption::computeValue(const KisPaintInformation& info) const
     }
     else {
         qreal t = 1.0;
+
+        QVector<KisDynamicSensorSP> additiveSensors;
+
         foreach (KisDynamicSensorSP s, m_sensorMap.values()) {
-            ////qDebug() << "\tTesting" << s->name() << s->isActive();
             if (s->isActive()) {
-                t *= s->parameter(info);
+                if (!s->isAdditive()) {
+                    t *= s->parameter(info);
+                } else {
+                    // additive sensors should be
+                    // processed in the end
+                    additiveSensors.append(s);
+                }
             }
         }
+
+        // add up addivite sensors to the result
+        foreach (KisDynamicSensorSP s, additiveSensors) {
+            qreal t0 = t;
+            qreal v = s->parameter(info);
+
+            t = fmod(t + v, 1.0);
+        }
+
         if (m_separateCurveValue) {
             return t;
         }
diff --git a/krita/plugins/paintops/libpaintop/kis_dynamic_sensor.cc b/krita/plugins/paintops/libpaintop/kis_dynamic_sensor.cc
index b1ab369..e24c73a 100644
--- a/krita/plugins/paintops/libpaintop/kis_dynamic_sensor.cc
+++ b/krita/plugins/paintops/libpaintop/kis_dynamic_sensor.cc
@@ -19,6 +19,8 @@
 #include "kis_dynamic_sensor.h"
 #include <QDomElement>
 
+#include "kis_algebra_2d.h"
+
 #include "sensors/kis_dynamic_sensors.h"
 #include "sensors/kis_dynamic_sensor_distance.h"
 #include "sensors/kis_dynamic_sensor_drawing_angle.h"
@@ -402,8 +404,9 @@ qreal KisDynamicSensor::parameter(const KisPaintInformation& info)
 {
     qreal val = value(info);
     if (m_customCurve) {
-        int offset = qRound(256.0 * val);
-        return m_curve.floatTransfer(257)[qBound(0, offset, 256)];
+        int offset = qRound(256.0 * qAbs(val));
+        qreal newValue =  m_curve.floatTransfer(257)[qBound(0, offset, 256)];
+        return KisAlgebra2D::copysign(newValue, val);
     }
     else {
         return val;
@@ -436,6 +439,11 @@ bool KisDynamicSensor::dependsOnCanvasRotation() const
     return true;
 }
 
+bool KisDynamicSensor::isAdditive() const
+{
+    return false;
+}
+
 void KisDynamicSensor::setActive(bool active)
 {
     m_active = active;
diff --git a/krita/plugins/paintops/libpaintop/kis_dynamic_sensor.h b/krita/plugins/paintops/libpaintop/kis_dynamic_sensor.h
index 41ce978..6d2c37b 100644
--- a/krita/plugins/paintops/libpaintop/kis_dynamic_sensor.h
+++ b/krita/plugins/paintops/libpaintop/kis_dynamic_sensor.h
@@ -174,6 +174,8 @@ public:
 
     virtual bool dependsOnCanvasRotation() const;
 
+    virtual bool isAdditive() const;
+
     inline DynamicSensorType sensorType() const { return m_type; }
 
 
diff --git a/krita/plugins/paintops/libpaintop/kis_pressure_rotation_option.cpp b/krita/plugins/paintops/libpaintop/kis_pressure_rotation_option.cpp
index cc74ebf..5af8585 100644
--- a/krita/plugins/paintops/libpaintop/kis_pressure_rotation_option.cpp
+++ b/krita/plugins/paintops/libpaintop/kis_pressure_rotation_option.cpp
@@ -31,7 +31,6 @@ KisPressureRotationOption::KisPressureRotationOption()
           m_canvasAxisXMirrored(false),
           m_canvasAxisYMirrored(false)
 {
-
 }
 
 double KisPressureRotationOption::apply(const KisPaintInformation & info) const
@@ -53,23 +52,7 @@ double KisPressureRotationOption::apply(const KisPaintInformation & info) const
         1.0 - computeValue(info) :
         0.5 + computeValue(info);
 
-    /* Special Case for Fuzzy Sensor to provide for Positive and Negative Rotation */
-    KisDynamicSensorFuzzy *s = dynamic_cast<KisDynamicSensorFuzzy*>(sensor(FUZZY, true).data());
-    if (s && s->isActive()) {
-        if (s->rotationModeEnabled()) {
-            return rand()%2 == 0?fmod(rotationCoeff * 2.0 * M_PI + baseAngle, 2.0 * M_PI):
-                                 ((2.0*M_PI)-fmod(rotationCoeff * 2.0 * M_PI + baseAngle, -2.0 * M_PI));
-
-        }
-        else {
-            return fmod(rotationCoeff * 2.0 * M_PI + baseAngle, 2.0 * M_PI);
-        }
-    }
-    else { //If Fuzzy is not selected at all
-        return fmod(rotationCoeff * 2.0 * M_PI + baseAngle, 2.0 * M_PI);
-    }
-
-
+    return fmod(rotationCoeff * 2.0 * M_PI + baseAngle, 2.0 * M_PI);
  }
 
 void KisPressureRotationOption::readOptionSetting(const KisPropertiesConfiguration* setting)
@@ -79,6 +62,11 @@ void KisPressureRotationOption::readOptionSetting(const KisPropertiesConfigurati
 
     m_canvasAxisXMirrored = setting->getBool("runtimeCanvasMirroredX", false);
     m_canvasAxisYMirrored = setting->getBool("runtimeCanvasMirroredY", false);
+
+    KisDynamicSensorFuzzy *s = dynamic_cast<KisDynamicSensorFuzzy*>(sensor(FUZZY, true).data());
+    if (s) {
+        s->setRotationModeEnabled(true);
+    }
 }
 
 void KisPressureRotationOption::applyFanCornersInfo(KisPaintOp *op)
diff --git a/krita/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_fuzzy.cpp b/krita/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_fuzzy.cpp
index 80884ae..f555737 100644
--- a/krita/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_fuzzy.cpp
+++ b/krita/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_fuzzy.cpp
@@ -31,24 +31,7 @@ KisDynamicSensorFuzzy::KisDynamicSensorFuzzy()
 {
 }
 
-QWidget* KisDynamicSensorFuzzy::createConfigurationWidget(QWidget* parent, QWidget *ss)
-{
-    QWidget *w = new QWidget(parent);
-
-    QCheckBox *rotationModeEnabled = new QCheckBox(i18n("Positive and\nNegative\nRotation"), w);
-
-    connect(rotationModeEnabled, SIGNAL(stateChanged(int)), SLOT(setRotationModeEnabled(int)));
-    connect(rotationModeEnabled, SIGNAL(stateChanged(int)), ss, SIGNAL(parametersChanged()));
-
-    rotationModeEnabled->setChecked(m_rotationModeEnabled);
-
-    QVBoxLayout* l = new QVBoxLayout(w);
-    l->addWidget(rotationModeEnabled);
-
-    w->setLayout(l);
-    return w;
-}
-bool KisDynamicSensorFuzzy::rotationModeEnabled() const
+bool KisDynamicSensorFuzzy::isAdditive() const
 {
     return m_rotationModeEnabled;
 }
@@ -60,10 +43,14 @@ void KisDynamicSensorFuzzy::setRotationModeEnabled(int state)
 
 qreal KisDynamicSensorFuzzy::value(const KisPaintInformation &info) {
 
-    qreal result = 1.0;
+    qreal result = !m_rotationModeEnabled ? 1.0 : 0.0;
 
     if (!info.isHoveringMode()) {
         result = info.randomSource()->generateNormalized();
+
+        if (m_rotationModeEnabled) {
+            result = 2.0 * result - 1.0;
+        }
     }
 
     return result;
diff --git a/krita/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_fuzzy.h b/krita/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_fuzzy.h
index 683f63a..3fc2de0 100644
--- a/krita/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_fuzzy.h
+++ b/krita/plugins/paintops/libpaintop/sensors/kis_dynamic_sensor_fuzzy.h
@@ -35,20 +35,18 @@ class KisDynamicSensorFuzzy : public QObject, public KisDynamicSensor
     Q_OBJECT
 public:
     bool dependsOnCanvasRotation() const;
-    QWidget* createConfigurationWidget(QWidget* parent, QWidget*);
 
     using KisSerializableConfiguration::fromXML;
     using KisSerializableConfiguration::toXML;
     void toXML(QDomDocument&, QDomElement&) const;
     void fromXML(const QDomElement&);
 
-    bool rotationModeEnabled() const;
+    bool isAdditive() const;
 
     KisDynamicSensorFuzzy();
     virtual ~KisDynamicSensorFuzzy() {}
     qreal value(const KisPaintInformation &info);
 
-public Q_SLOTS:
     void setRotationModeEnabled(int state);
 
 private:


More information about the kimageshop mailing list