diff options
Diffstat (limited to 'src/extras/animations/qkeyframeanimation.cpp')
-rw-r--r-- | src/extras/animations/qkeyframeanimation.cpp | 262 |
1 files changed, 0 insertions, 262 deletions
diff --git a/src/extras/animations/qkeyframeanimation.cpp b/src/extras/animations/qkeyframeanimation.cpp deleted file mode 100644 index 425cbe0df..000000000 --- a/src/extras/animations/qkeyframeanimation.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the Qt3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL3$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPLv3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or later as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information to -** ensure the GNU General Public License version 2.0 requirements will be -** met: http://www.gnu.org/licenses/gpl-2.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qkeyframeanimation.h" -#include "Qt3DExtras/private/qkeyframeanimation_p.h" - -#include <cmath> - -QT_BEGIN_NAMESPACE - -namespace Qt3DExtras { - -QKeyframeAnimationPrivate::QKeyframeAnimationPrivate() - : QAbstractAnimationPrivate(QAbstractAnimation::KeyframeAnimation) - , m_minposition(0.0f) - , m_maxposition(0.0f) - , m_prevPosition(-1.0f) - , m_target(nullptr) - , m_startMode(QKeyframeAnimation::Constant) - , m_endMode(QKeyframeAnimation::Constant) -{ - -} - -QKeyframeAnimation::QKeyframeAnimation(QObject *parent) - : QAbstractAnimation(*new QKeyframeAnimationPrivate(), parent) -{ - Q_D(QKeyframeAnimation); - d->m_positionConnection = QObject::connect(this, &QAbstractAnimation::positionChanged, - this, &QKeyframeAnimation::updateAnimation); -} - - -void QKeyframeAnimation::setFramePositions(const QVector<float> &positions) -{ - Q_D(QKeyframeAnimation); - d->m_framePositions = positions; - d->m_prevPosition = -1.0f; - if (d->m_framePositions.size() == 0) { - d->m_minposition = d->m_maxposition = 0.0f; - return; - } - d->m_minposition = d->m_framePositions.first(); - d->m_maxposition = d->m_framePositions.last(); - float lastPos = d->m_minposition; - for (float p : d->m_framePositions) { - if (p < lastPos || p > d->m_maxposition) - qWarning() << "positions not ordered correctly"; - lastPos = p; - } - setDuration(d->m_maxposition); -} - -void QKeyframeAnimation::setKeyframes(const QVector<Qt3DCore::QTransform *> &keyframes) -{ - Q_D(QKeyframeAnimation); - d->m_keyframes = keyframes; -} - -// slerp which allows long path -QQuaternion lslerp(QQuaternion q1, QQuaternion q2, float t) -{ - QQuaternion ret; - // Handle the easy cases first. - if (t <= 0.0f) - return q1; - else if (t >= 1.0f) - return q2; - - float cos = qBound(-1.0f, QQuaternion::dotProduct(q1, q2), 1.0f); - float angle = std::acos(cos); - float sin = std::sin(angle); - if (!qFuzzyIsNull(sin)) { - float a = std::sin((1.0 - t) * angle) / sin; - float b = std::sin(t * angle) / sin; - ret = (q1 * a + q2 * b).normalized(); - } else { - ret = q1 * (1.0f-t) + q2 * t; - } - return ret; -} - -void QKeyframeAnimationPrivate::calculateFrame(float position) -{ - if (m_target && m_framePositions.size() > 0 - && m_keyframes.size() == m_framePositions.size() - && m_prevPosition != m_position) { - if (m_position >= m_minposition && m_position < m_maxposition) { - for (int i = 0; i < m_framePositions.size() - 1; i++) { - if (position >= m_framePositions.at(i) - && position < m_framePositions.at(i+1)) { - float ip = (position - m_framePositions.at(i)) - / (m_framePositions.at(i+1) - m_framePositions.at(i)); - float eIp = m_easing.valueForProgress(ip); - float eIip = 1.0f - eIp; - - Qt3DCore::QTransform *a = m_keyframes.at(i); - Qt3DCore::QTransform *b = m_keyframes.at(i+1); - - QVector3D s = a->scale3D() * eIip + b->scale3D() * eIp; - QVector3D t = a->translation() * eIip + b->translation() * eIp; - QQuaternion r = QQuaternion::slerp(a->rotation(), b->rotation(), eIp); - - m_target->setRotation(r); - m_target->setScale3D(s); - m_target->setTranslation(t); - return; - } - } - } else if (position < m_minposition) { - m_target->setRotation(m_keyframes.first()->rotation()); - m_target->setScale3D(m_keyframes.first()->scale3D()); - m_target->setTranslation(m_keyframes.first()->translation()); - } else { - m_target->setRotation(m_keyframes.last()->rotation()); - m_target->setScale3D(m_keyframes.last()->scale3D()); - m_target->setTranslation(m_keyframes.last()->translation()); - } - m_prevPosition = m_position; - } -} - -void QKeyframeAnimation::updateAnimation(float position) -{ - Q_D(QKeyframeAnimation); - d->calculateFrame(position); -} - -QVector<float> QKeyframeAnimation::framePositions() const -{ - Q_D(const QKeyframeAnimation); - return d->m_framePositions; -} - -QVector<Qt3DCore::QTransform *> QKeyframeAnimation::keyframeList() const -{ - Q_D(const QKeyframeAnimation); - return d->m_keyframes; -} - -void QKeyframeAnimation::setTarget(Qt3DCore::QTransform *target) -{ - Q_D(QKeyframeAnimation); - if (d->m_target != target) { - d->m_target = target; - emit targetChanged(d->m_target); - d->m_prevPosition = -1.0f; - - if (target) { - d->m_baseScale = target->scale3D(); - d->m_baseTranslation = target->translation(); - d->m_baseRotation = target->rotation(); - } - } -} - -QKeyframeAnimation::RepeatMode QKeyframeAnimation::startMode() const -{ - Q_D(const QKeyframeAnimation); - return d->m_startMode; -} - -QKeyframeAnimation::RepeatMode QKeyframeAnimation::endMode() const -{ - Q_D(const QKeyframeAnimation); - return d->m_endMode; -} - -void QKeyframeAnimation::setEasing(QEasingCurve::Type easing) -{ - Q_D(QKeyframeAnimation); - if (d->m_easing.type() != easing) { - d->m_easing.setType(easing); - emit easingChanged(easing); - } -} - -void QKeyframeAnimation::setTargetName(const QString &name) -{ - Q_D(QKeyframeAnimation); - d->m_targetName = name; - emit targetNameChanged(name); -} - -void QKeyframeAnimation::setStartMode(QKeyframeAnimation::RepeatMode mode) -{ - Q_D(QKeyframeAnimation); - if (d->m_startMode != mode) { - d->m_startMode = mode; - emit startModeChanged(mode); - } -} - -void QKeyframeAnimation::setEndMode(QKeyframeAnimation::RepeatMode mode) -{ - Q_D(QKeyframeAnimation); - if (mode != d->m_endMode) { - d->m_endMode = mode; - emit endModeChanged(mode); - } -} - -void QKeyframeAnimation::addKeyframe(Qt3DCore::QTransform *keyframe) -{ - Q_D(QKeyframeAnimation); - d->m_keyframes.push_back(keyframe); -} - -QString QKeyframeAnimation::targetName() const -{ - Q_D(const QKeyframeAnimation); - return d->m_targetName; -} - -QEasingCurve::Type QKeyframeAnimation::easing() const -{ - Q_D(const QKeyframeAnimation); - return d->m_easing.type(); -} - -Qt3DCore::QTransform *QKeyframeAnimation::target() const -{ - Q_D(const QKeyframeAnimation); - return d->m_target; -} - -} // Qt3DExtras - -QT_END_NAMESPACE |