summaryrefslogtreecommitdiffstats
path: root/src/animation/backend/fcurve.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/animation/backend/fcurve.cpp')
-rw-r--r--src/animation/backend/fcurve.cpp52
1 files changed, 40 insertions, 12 deletions
diff --git a/src/animation/backend/fcurve.cpp b/src/animation/backend/fcurve.cpp
index 809949472..4a2cf30fd 100644
--- a/src/animation/backend/fcurve.cpp
+++ b/src/animation/backend/fcurve.cpp
@@ -60,12 +60,35 @@ float FCurve::evaluateAtTime(float localTime) const
return m_keyframes.last().value;
} else {
// Find keyframes that sandwich the requested localTime
- int keyframe0 = m_rangeFinder.findLowerBound(localTime);
-
- BezierEvaluator evaluator(m_localTimes[keyframe0], m_keyframes[keyframe0],
- m_localTimes[keyframe0 + 1], m_keyframes[keyframe0 + 1]);
- return evaluator.valueForTime(localTime);
+ const int idx = m_rangeFinder.findLowerBound(localTime);
+
+ const float t0 = m_localTimes[idx];
+ const float t1 = m_localTimes[idx + 1];
+ const Keyframe &keyframe0(m_keyframes[idx]);
+ const Keyframe &keyframe1(m_keyframes[idx + 1]);
+
+ switch (keyframe0.interpolation) {
+ case QKeyFrame::ConstantInterpolation:
+ qWarning("Constant interpolation not implemented yet");
+ break;
+ case QKeyFrame::LinearInterpolation:
+ if (localTime >= t0 && localTime <= t1 && t1 > t0) {
+ float t = (localTime - t0) / (t1 - t0);
+ return (1 - t) * keyframe0.value + t * keyframe1.value;
+ }
+ break;
+ case QKeyFrame::BezierInterpolation:
+ {
+ BezierEvaluator evaluator(t0, keyframe0, t1, keyframe1);
+ return evaluator.valueForTime(localTime);
+ }
+ default:
+ qWarning("Unknown interpolation type %d", keyframe0.interpolation);
+ break;
+ }
}
+
+ return m_keyframes.first().value;
}
float FCurve::startTime() const
@@ -103,16 +126,21 @@ void FCurve::read(const QJsonObject &json)
float localTime = keyframeCoords.at(0).toDouble();
Keyframe keyframe;
- keyframe.interpolation = QKeyFrame::BezierInterpolation;
keyframe.value = keyframeCoords.at(1).toDouble();
- const QJsonArray leftHandle = keyframeData[QLatin1String("leftHandle")].toArray();
- keyframe.leftControlPoint[0] = leftHandle.at(0).toDouble();
- keyframe.leftControlPoint[1] = leftHandle.at(1).toDouble();
+ if (keyframeData.contains(QLatin1String("leftHandle"))) {
+ keyframe.interpolation = QKeyFrame::BezierInterpolation;
+
+ const QJsonArray leftHandle = keyframeData[QLatin1String("leftHandle")].toArray();
+ keyframe.leftControlPoint[0] = leftHandle.at(0).toDouble();
+ keyframe.leftControlPoint[1] = leftHandle.at(1).toDouble();
- const QJsonArray rightHandle = keyframeData[QLatin1String("rightHandle")].toArray();
- keyframe.rightControlPoint[0] = rightHandle.at(0).toDouble();
- keyframe.rightControlPoint[1] = rightHandle.at(1).toDouble();
+ const QJsonArray rightHandle = keyframeData[QLatin1String("rightHandle")].toArray();
+ keyframe.rightControlPoint[0] = rightHandle.at(0).toDouble();
+ keyframe.rightControlPoint[1] = rightHandle.at(1).toDouble();
+ } else {
+ keyframe.interpolation = QKeyFrame::LinearInterpolation;
+ }
appendKeyframe(localTime, keyframe);
}