20template <
typename Sensor,
typename Data,
typename... Args>
21void addSensor(std::vector<std::unique_ptr<KisDynamicSensor>> &sensors,
22 const Data &data, std::optional<KisCubicCurve> commonCurve, Args... args)
25 sensors.push_back(std::unique_ptr<KisDynamicSensor>(
new Sensor(data, commonCurve, args...)));
29std::vector<std::unique_ptr<KisDynamicSensor>> generateSensors(
const KisCurveOptionData &data)
31 std::vector<std::unique_ptr<KisDynamicSensor>> result;
33 std::optional<KisCubicCurve> commonCurve;
40 addSensor<KisDynamicSensorPressure>(result, sensorStruct.
sensorPressure, commonCurve);
41 addSensor<KisDynamicSensorPressureIn>(result, sensorStruct.
sensorPressureIn, commonCurve);
43 addSensor<KisDynamicSensorDrawingAngle>(result, sensorStruct.
sensorDrawingAngle, commonCurve);
44 addSensor<KisDynamicSensorXTilt>(result, sensorStruct.
sensorXTilt, commonCurve);
45 addSensor<KisDynamicSensorYTilt>(result, sensorStruct.
sensorYTilt, commonCurve);
46 addSensor<KisDynamicSensorTiltDirection>(result, sensorStruct.
sensorTiltDirection, commonCurve);
47 addSensor<KisDynamicSensorTiltElevation>(result, sensorStruct.
sensorTiltElevation, commonCurve);
48 addSensor<KisDynamicSensorRotation>(result, sensorStruct.
sensorRotation, commonCurve);
49 addSensor<KisDynamicSensorFuzzyPerDab>(result, sensorStruct.
sensorFuzzyPerDab, commonCurve);
51 addSensor<KisDynamicSensorSpeed>(result, sensorStruct.
sensorSpeed, commonCurve);
52 addSensor<KisDynamicSensorFade>(result, sensorStruct.
sensorFade, commonCurve);
53 addSensor<KisDynamicSensorDistance>(result, sensorStruct.
sensorDistance, commonCurve);
54 addSensor<KisDynamicSensorTime>(result, sensorStruct.
sensorTime, commonCurve);
55 addSensor<KisDynamicSensorPerspective>(result, sensorStruct.
sensorPerspective, commonCurve);
72 qWarning() <<
"rotationLikeValue returns NaN!" << normalizedBaseAngle << absoluteAxesFlipped;
80 hasAbsoluteOffset ? absoluteOffset : 1.0;
82 const qreal realScalingPart = hasScaling ? scaling : 1.0;
85 return qBound(minSizeLikeValue,
86 constant * offset * realScalingPart * realAdditivePart,
111 qreal valueFromCurve = s->
parameter(info);
113 components.
additive += valueFromCurve;
119 sensorValues << valueFromCurve;
124 if (sensorValues.count() == 1) {
125 components.
scaling = sensorValues.first();
126 }
else if (sensorValues.count() > 1) {
131 foreach (i, sensorValues) {
135 components.
scaling = *std::max_element(sensorValues.begin(), sensorValues.end());
138 components.
scaling = *std::min_element(sensorValues.begin(), sensorValues.end());
141 double max = *std::max_element(sensorValues.begin(), sensorValues.end());
142 double min = *std::min_element(sensorValues.begin(), sensorValues.end());
147 foreach (i, sensorValues) {
155 if (useStrengthValue) {
174 return components.
rotationLikeValue(baseValue, absoluteAxesFlipped, scalingPartCoeff, disableScalingPart);
float value(const T *src, size_t ch)
const KoID FuzzyPerStrokeId("fuzzystroke", ki18nc("Context: dynamic sensors", "Fuzzy Stroke"))
generate a random number
const KoID FuzzyPerDabId("fuzzy", ki18nc("Context: dynamic sensors", "Fuzzy Dab"))
generate a random number
qreal strengthMinValue() const
qreal computeRotationLikeValue(const KisPaintInformation &info, qreal baseValue, bool absoluteAxesFlipped, qreal scalingPartCoeff, bool disableScalingPart) const
qreal strengthValue() const
KisCurveOption(const KisCurveOptionData &data)
qreal computeSizeLikeValue(const KisPaintInformation &info, bool useStrengthValue=true) const
ValueComponents computeValueComponents(const KisPaintInformation &info, bool useStrengthValue) const
qreal strengthMaxValue() const
std::vector< std::unique_ptr< KisDynamicSensor > > m_sensors
qreal parameter(const KisPaintInformation &info) const
static qreal additiveToScaling(qreal x)
virtual bool isAdditive() const
static qreal scalingToAdditive(qreal x)
virtual bool isAbsoluteRotation() const
T wrapValue(T value, T wrapBounds)
std::vector< SensorData * > sensors(Data *data)
KisKritaSensorData & sensorStruct()
qreal rotationLikeValue(qreal normalizedBaseAngle, bool absoluteAxesFlipped, qreal scalingPartCoeff, bool disableScalingPart) const
qreal sizeLikeValue() const
KisSensorWithLengthData sensorTime
KisSensorData sensorYTilt
KisSensorWithLengthData sensorDistance
KisSensorData sensorTiltElevation
KisSensorData sensorPerspective
KisSensorData sensorTangentialPressure
KisSensorData sensorSpeed
KisSensorData sensorPressureIn
KisSensorData sensorRotation
KisSensorData sensorXTilt
KisSensorData sensorFuzzyPerStroke
KisSensorData sensorPressure
KisSensorData sensorTiltDirection
KisDrawingAngleSensorData sensorDrawingAngle
KisSensorData sensorFuzzyPerDab
KisSensorWithLengthData sensorFade