summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2019-03-12 14:43:53 +0200
committerKaj Grönholm <kaj.gronholm@qt.io>2019-03-13 13:04:09 +0000
commit986291112cf5e6b08c74b4e4c77ae9b6cfe09bb6 (patch)
tree8dc49ac11b7221ab237fa9ccf31384fedcfc66f3
parent243fabc5db3f6a78dc8a979d33d043c011f8be7c (diff)
Start animations at first frame
Delay starting the animations until first frame is rendered. This fixes issue where animations start progressing before user may see them. Also it makes sure all (sub)presentations start animating at the same time. Task-number: QT3DS-3134 Change-Id: I0edc093bfb07df5bda7ac237aeed151cfbe93846 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
-rw-r--r--src/runtime/q3dsengine.cpp13
-rw-r--r--src/runtime/q3dsengine_p.h3
-rw-r--r--src/runtime/q3dsscenemanager.cpp14
-rw-r--r--src/runtime/q3dsscenemanager_p.h1
4 files changed, 24 insertions, 7 deletions
diff --git a/src/runtime/q3dsengine.cpp b/src/runtime/q3dsengine.cpp
index 0ac262c..8f78694 100644
--- a/src/runtime/q3dsengine.cpp
+++ b/src/runtime/q3dsengine.cpp
@@ -741,11 +741,6 @@ void Q3DSEngine::finalizePresentations()
finishAsyncLoad(false);
- for (const UipPresentation &pres : m_uipPresentations) {
- if (pres.sceneManager)
- pres.sceneManager->prepareAnimators();
- }
-
Q3DSImageManager::instance().finishAsyncLoad();
m_loadTime = m_sourceLoadTimer.elapsed();
@@ -858,6 +853,14 @@ Q3DSSubPresentation Q3DSEngine::loadSubUipPresentation(const QString &subPresId)
return sp;
}
+void Q3DSEngine::startAnimations()
+{
+ for (const UipPresentation &pres : qAsConst(m_uipPresentations)) {
+ if (pres.sceneManager)
+ pres.sceneManager->prepareAnimators();
+ }
+}
+
void Q3DSEngine::SceneLoaderAsync::reparentChildren()
{
for (auto pair : qAsConst(m_parentChildPairs)) {
diff --git a/src/runtime/q3dsengine_p.h b/src/runtime/q3dsengine_p.h
index baf058b..f72191e 100644
--- a/src/runtime/q3dsengine_p.h
+++ b/src/runtime/q3dsengine_p.h
@@ -147,6 +147,9 @@ public:
// constructed scenes.
bool setPresentation(Q3DSUipPresentation *presentations);
+ // Start animating all uip presentations.
+ void startAnimations();
+
qint64 behaviorLoadTimeMsecs() const;
qint64 totalLoadTimeMsecs() const;
diff --git a/src/runtime/q3dsscenemanager.cpp b/src/runtime/q3dsscenemanager.cpp
index 391573b..cb7c7d2 100644
--- a/src/runtime/q3dsscenemanager.cpp
+++ b/src/runtime/q3dsscenemanager.cpp
@@ -59,6 +59,7 @@
#include <qmath.h>
#include <QTextLayout>
#include <QOpenGLContext>
+#include <QTimer>
#include <Qt3DCore/QEntity>
#include <Qt3DCore/QTransform>
@@ -650,7 +651,10 @@ void Q3DSSceneManager::uncacheLayers()
void Q3DSSceneManager::prepareAnimators()
{
- m_slidePlayer->sceneReady();
+ if (!m_animatorsInitialized) {
+ m_slidePlayer->sceneReady();
+ m_animatorsInitialized = true;
+ }
}
QDebug operator<<(QDebug dbg, const Q3DSSceneManager::SceneBuilderParams &p)
@@ -670,6 +674,8 @@ void Q3DSSceneManager::prepareEngineReset()
delete m_slidePlayer;
m_slidePlayer = nullptr;
+ m_animatorsInitialized = false;
+
#if QT_CONFIG(q3ds_profileui)
if (m_profileUi)
m_profileUi->releaseResources();
@@ -1002,7 +1008,6 @@ void Q3DSSceneManager::finalizeSubpresentationLoading(Q3DSSubPresentation *sp)
}
sp->sceneManager->setSubPresentations(m_subPresentations);
if (!m_inSetSubPresentations) {
- sp->sceneManager->prepareAnimators();
m_profiler->registerSubPresentationProfiler(sp->sceneManager->m_profiler);
Q3DSUipPresentation::forAllObjectsOfType(sp->sceneManager->m_presentation->scene(),
Q3DSGraphObject::Behavior,
@@ -9247,6 +9252,11 @@ void Q3DSFrameUpdater::frameAction(float dt)
// the time includes all subpresentations too)
m_sceneManager->m_profiler->reportTotalParseBuildTime(m_sceneManager->m_engine->totalLoadTimeMsecs());
}
+
+ // At this point do synchronized start of engine animations
+ QTimer::singleShot(0, [this]() {
+ m_sceneManager->engine()->startAnimations();
+ });
}
m_sceneManager->m_profiler->reportBehaviorStats(m_sceneManager->m_engine->behaviorLoadTimeMsecs(),
m_sceneManager->m_engine->behaviorHandles().count());
diff --git a/src/runtime/q3dsscenemanager_p.h b/src/runtime/q3dsscenemanager_p.h
index f8c836d..b9e9450 100644
--- a/src/runtime/q3dsscenemanager_p.h
+++ b/src/runtime/q3dsscenemanager_p.h
@@ -1029,6 +1029,7 @@ private:
bool m_inSetSubPresentations = false;
bool m_layerCaching = true;
bool m_layerUncachePending = false;
+ bool m_animatorsInitialized = false;
QSet<Q3DSSceneManager *> m_layerCacheDeps;
bool m_hasQmlSubPresAsTextureMap = false;
Q3DSViewportData m_viewportData;