From e8c351478fe9f2b8bb5381480fbb3637855f145e Mon Sep 17 00:00:00 2001 From: Sean Harmer Date: Wed, 5 Apr 2017 16:10:59 +0100 Subject: Start adding support for programmatic clips to the backend node Change-Id: I7503f87550487528956cd97606a24e25cf2e5144 Reviewed-by: Mike Krus --- src/animation/backend/animationcliploader.cpp | 30 ++++++++++++++++++++++----- src/animation/backend/animationcliploader_p.h | 3 +++ src/animation/frontend/qanimationclip.cpp | 2 +- src/animation/frontend/qanimationclip_p.h | 2 +- src/animation/frontend/qanimationclipdata.cpp | 7 +++++++ src/animation/frontend/qanimationclipdata.h | 2 ++ 6 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/animation/backend/animationcliploader.cpp b/src/animation/backend/animationcliploader.cpp index 809fbbb69..2ea54acc8 100644 --- a/src/animation/backend/animationcliploader.cpp +++ b/src/animation/backend/animationcliploader.cpp @@ -35,7 +35,9 @@ ****************************************************************************/ #include "animationcliploader_p.h" +#include #include +#include #include #include #include @@ -56,6 +58,7 @@ AnimationClipLoader::AnimationClipLoader() : BackendNode(ReadWrite) , m_source() , m_status(QAnimationClipLoader::NotReady) + , m_clipData() , m_name() , m_channels() , m_duration(0.0f) @@ -64,11 +67,23 @@ AnimationClipLoader::AnimationClipLoader() void AnimationClipLoader::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) { - const auto typedChange = qSharedPointerCast>(change); - const auto &data = typedChange->data; - m_source = data.source; - if (!m_source.isEmpty()) - setDirty(Handler::AnimationClipDirty); + const auto loaderTypedChange = qSharedPointerDynamicCast>(change); + if (loaderTypedChange) { + const auto &data = loaderTypedChange->data; + m_source = data.source; + if (!m_source.isEmpty()) + setDirty(Handler::AnimationClipDirty); + return; + } + + const auto clipTypedChange = qSharedPointerDynamicCast>(change); + if (clipTypedChange) { + const auto &data = clipTypedChange->data; + m_clipData = data.clipData; + if (m_clipData.isValid()) + setDirty(Handler::AnimationClipDirty); + return; + } } void AnimationClipLoader::cleanup() @@ -76,6 +91,7 @@ void AnimationClipLoader::cleanup() setEnabled(false); m_handler = nullptr; m_source.clear(); + m_clipData.clearChannels(); m_status = QAnimationClipLoader::NotReady; m_channels.clear(); m_duration = 0.0f; @@ -103,6 +119,10 @@ void AnimationClipLoader::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) if (change->propertyName() == QByteArrayLiteral("source")) { m_source = change->value().toUrl(); setDirty(Handler::AnimationClipDirty); + } else if (change->propertyName() == QByteArrayLiteral("clipData")) { + m_clipData = change->value().value(); + if (m_clipData.isValid()) + setDirty(Handler::AnimationClipDirty); } break; } diff --git a/src/animation/backend/animationcliploader_p.h b/src/animation/backend/animationcliploader_p.h index f8ba72f40..077c543ae 100644 --- a/src/animation/backend/animationcliploader_p.h +++ b/src/animation/backend/animationcliploader_p.h @@ -49,6 +49,7 @@ // #include +#include #include #include #include @@ -92,6 +93,8 @@ private: QUrl m_source; QAnimationClipLoader::Status m_status; + QAnimationClipData m_clipData; + QString m_name; QVector m_channels; float m_duration; diff --git a/src/animation/frontend/qanimationclip.cpp b/src/animation/frontend/qanimationclip.cpp index d9a1eb979..c21d94b02 100644 --- a/src/animation/frontend/qanimationclip.cpp +++ b/src/animation/frontend/qanimationclip.cpp @@ -85,7 +85,7 @@ Qt3DCore::QNodeCreatedChangeBasePtr QAnimationClip::createNodeCreationChange() c auto creationChange = Qt3DCore::QNodeCreatedChangePtr::create(this); auto &data = creationChange->data; Q_D(const QAnimationClip); - // TODO: Send data members in creation change + data.clipData = d->m_clipData; return creationChange; } diff --git a/src/animation/frontend/qanimationclip_p.h b/src/animation/frontend/qanimationclip_p.h index 490c08a4e..514d568af 100644 --- a/src/animation/frontend/qanimationclip_p.h +++ b/src/animation/frontend/qanimationclip_p.h @@ -70,7 +70,7 @@ public: struct QAnimationClipChangeData { - // TODO: Add members that should be sent to the backend + QAnimationClipData clipData; }; } // namespace Qt3DAnimation diff --git a/src/animation/frontend/qanimationclipdata.cpp b/src/animation/frontend/qanimationclipdata.cpp index 4ae9f36d7..ef3b59012 100644 --- a/src/animation/frontend/qanimationclipdata.cpp +++ b/src/animation/frontend/qanimationclipdata.cpp @@ -109,6 +109,12 @@ void QAnimationClipData::clearChannels() d->m_channels.clear(); } +bool QAnimationClipData::isValid() const Q_DECL_NOTHROW +{ + // TODO: Perform more thorough checks + return !d->m_channels.isEmpty(); +} + QAnimationClipData::const_iterator QAnimationClipData::begin() const Q_DECL_NOTHROW { return d->m_channels.begin(); @@ -119,6 +125,7 @@ QAnimationClipData::const_iterator QAnimationClipData::end() const Q_DECL_NOTHRO return d->m_channels.end(); } + bool operator==(const QAnimationClipData &lhs, const QAnimationClipData &rhs) Q_DECL_NOTHROW { return lhs.d->m_name == rhs.d->m_name && diff --git a/src/animation/frontend/qanimationclipdata.h b/src/animation/frontend/qanimationclipdata.h index 433c80f94..605b17208 100644 --- a/src/animation/frontend/qanimationclipdata.h +++ b/src/animation/frontend/qanimationclipdata.h @@ -68,6 +68,8 @@ public: void removeChannel(int index); void clearChannels(); + bool isValid() const Q_DECL_NOTHROW; + // Iterator API typedef const QChannel *const_iterator; typedef std::reverse_iterator const_reverse_iterator; -- cgit v1.2.3