diff options
author | Jonas Karlsson <jonas.karlsson@qt.io> | 2020-06-23 13:25:39 +0200 |
---|---|---|
committer | Jonas Karlsson <jonas.karlsson@qt.io> | 2020-06-29 15:24:12 +0200 |
commit | bd1c28a82c2ff955e0d154fac2e2df8d5a110dd7 (patch) | |
tree | 499f56b6a1d39f7ceb202b53a3f8a4d0bd530eb9 /src/quick/util | |
parent | a059aa2e2812fab98dc11da73a6241ba6937dce1 (diff) |
Reimplement UniformAnimator for ShaderEffect
Fixes: QTBUG-83976
Change-Id: I307e96be0d3d2edeb8d9065d100c1ef38c8824c7
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src/quick/util')
-rw-r--r-- | src/quick/util/qquickanimator.cpp | 2 | ||||
-rw-r--r-- | src/quick/util/qquickanimator_p.h | 4 | ||||
-rw-r--r-- | src/quick/util/qquickanimatorjob.cpp | 77 | ||||
-rw-r--r-- | src/quick/util/qquickanimatorjob_p.h | 14 |
4 files changed, 23 insertions, 74 deletions
diff --git a/src/quick/util/qquickanimator.cpp b/src/quick/util/qquickanimator.cpp index 3a7c3ef808..f53f7e2f39 100644 --- a/src/quick/util/qquickanimator.cpp +++ b/src/quick/util/qquickanimator.cpp @@ -504,7 +504,6 @@ QQuickRotationAnimator::RotationDirection QQuickRotationAnimator::direction() co return d->direction; } -#if 0 // QTBUG-83976 /*! \qmltype UniformAnimator \instantiates QQuickUniformAnimator @@ -582,7 +581,6 @@ QQuickAnimatorJob *QQuickUniformAnimator::createJob() const job->setUniform(u.toLatin1()); return job; } -#endif QT_END_NAMESPACE diff --git a/src/quick/util/qquickanimator_p.h b/src/quick/util/qquickanimator_p.h index a7c219ce1a..d34073c7ff 100644 --- a/src/quick/util/qquickanimator_p.h +++ b/src/quick/util/qquickanimator_p.h @@ -184,7 +184,6 @@ protected: QString propertyName() const override { return QStringLiteral("rotation"); } }; -#if 0 // QTBUG-83976 class QQuickUniformAnimatorPrivate; class Q_QUICK_PRIVATE_EXPORT QQuickUniformAnimator : public QQuickAnimator { @@ -207,7 +206,6 @@ protected: QQuickAnimatorJob *createJob() const override; QString propertyName() const override; }; -#endif QT_END_NAMESPACE @@ -217,7 +215,5 @@ QML_DECLARE_TYPE(QQuickYAnimator) QML_DECLARE_TYPE(QQuickScaleAnimator) QML_DECLARE_TYPE(QQuickRotationAnimator) QML_DECLARE_TYPE(QQuickOpacityAnimator) -#if 0 // QTBUG-83976 QML_DECLARE_TYPE(QQuickUniformAnimator) -#endif #endif // QQUICKANIMATOR_P_H diff --git a/src/quick/util/qquickanimatorjob.cpp b/src/quick/util/qquickanimatorjob.cpp index b46e2db258..1c2472dc49 100644 --- a/src/quick/util/qquickanimatorjob.cpp +++ b/src/quick/util/qquickanimatorjob.cpp @@ -43,12 +43,7 @@ #include "qquickanimator_p.h" #include "qquickanimator_p_p.h" #include <private/qquickitem_p.h> -#if 0 // QTBUG-83976 -# include <private/qquickopenglshadereffectnode_p.h> -# include <private/qquickopenglshadereffect_p.h> -# include <private/qquickshadereffect_p.h> -# include <QOpenGLContext> -#endif +#include <private/qquickshadereffect_p.h> #include <private/qanimationgroupjob_p.h> #include <qcoreapplication.h> @@ -595,28 +590,31 @@ void QQuickOpacityAnimatorJob::updateCurrentTime(int time) m_opacityNode->setOpacity(m_value); } - -#if 0 // QTBUG-83976 QQuickUniformAnimatorJob::QQuickUniformAnimatorJob() - : m_node(nullptr) - , m_uniformIndex(-1) - , m_uniformType(-1) { m_isUniform = true; } void QQuickUniformAnimatorJob::setTarget(QQuickItem *target) { - QQuickShaderEffect* effect = qobject_cast<QQuickShaderEffect*>(target); - if (effect && effect->isOpenGLShaderEffect()) + // Check target is of expected type + if (qobject_cast<QQuickShaderEffect *>(target) != nullptr) m_target = target; } -void QQuickUniformAnimatorJob::invalidate() +void QQuickUniformAnimatorJob::updateCurrentTime(int time) +{ + if (!m_effect) + return; + + m_value = m_from + (m_to - m_from) * progress(time); + m_effect->updateUniformValue(m_uniform, m_value); +} + +void QQuickUniformAnimatorJob::writeBack() { - m_node = nullptr; - m_uniformIndex = -1; - m_uniformType = -1; + if (m_target) + m_target->setProperty(m_uniform, value()); } void QQuickUniformAnimatorJob::postSync() @@ -626,52 +624,13 @@ void QQuickUniformAnimatorJob::postSync() return; } - m_node = static_cast<QQuickOpenGLShaderEffectNode *>(QQuickItemPrivate::get(m_target)->paintNode); - - if (m_node && m_uniformIndex == -1 && m_uniformType == -1) { - QQuickOpenGLShaderEffectMaterial *material = - static_cast<QQuickOpenGLShaderEffectMaterial *>(m_node->material()); - bool found = false; - for (int t=0; !found && t<QQuickOpenGLShaderEffectMaterialKey::ShaderTypeCount; ++t) { - const QVector<QQuickOpenGLShaderEffectMaterial::UniformData> &uniforms = material->uniforms[t]; - for (int i=0; i<uniforms.size(); ++i) { - if (uniforms.at(i).name == m_uniform) { - m_uniformIndex = i; - m_uniformType = t; - found = true; - break; - } - } - } - } - + m_effect = qobject_cast<QQuickShaderEffect *>(m_target); } -void QQuickUniformAnimatorJob::updateCurrentTime(int time) -{ - if (!m_controller) - return; - - if (!m_node || m_uniformIndex == -1 || m_uniformType == -1) - return; - - m_value = m_from + (m_to - m_from) * progress(time); - - QQuickOpenGLShaderEffectMaterial *material = - static_cast<QQuickOpenGLShaderEffectMaterial *>(m_node->material()); - material->uniforms[m_uniformType][m_uniformIndex].value = m_value; - // As we're not touching the nodes, we need to explicitly mark it dirty. - // Otherwise, the renderer will abort repainting if this was the only - // change in the graph currently rendering. - m_node->markDirty(QSGNode::DirtyMaterial); -} - -void QQuickUniformAnimatorJob::writeBack() +void QQuickUniformAnimatorJob::invalidate() { - if (m_target) - m_target->setProperty(m_uniform, value()); + m_effect = nullptr; } -#endif QT_END_NAMESPACE diff --git a/src/quick/util/qquickanimatorjob_p.h b/src/quick/util/qquickanimatorjob_p.h index eaec1946ba..0ec1253118 100644 --- a/src/quick/util/qquickanimatorjob_p.h +++ b/src/quick/util/qquickanimatorjob_p.h @@ -69,7 +69,6 @@ class QQuickAbstractAnimation; class QQuickAnimatorController; class QQuickAnimatorProxyJobPrivate; -class QQuickShaderEffectNode; class QSGOpacityNode; @@ -289,7 +288,9 @@ public: private: QSGOpacityNode *m_opacityNode; }; -#if 0 // QTBUG-83976 + +class QQuickShaderEffect; + class Q_QUICK_PRIVATE_EXPORT QQuickUniformAnimatorJob : public QQuickAnimatorJob { public: @@ -300,21 +301,16 @@ public: void setUniform(const QByteArray &uniform) { m_uniform = uniform; } QByteArray uniform() const { return m_uniform; } - void postSync() override; - void updateCurrentTime(int time) override; void writeBack() override; + void postSync() override; void invalidate() override; private: QByteArray m_uniform; - QQuickOpenGLShaderEffectNode *m_node; - - int m_uniformIndex : 8; - int m_uniformType : 8; + QQuickShaderEffect *m_effect = nullptr; }; -#endif QT_END_NAMESPACE |