summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@qt.io>2019-03-14 10:23:58 +0100
committerAapo Keskimolo <aapo.keskimolo@qt.io>2019-03-20 17:28:53 +0000
commite3c0ab60efae81a63e28e5507f5dc777aa13e753 (patch)
tree0fd4572519668fc752c7322b0c91619bf6268b30
parentb7df8c5e2bd9feb1090b649ce5f3daeb9dbd0b75 (diff)
Fix EOS logic in the animator
The logic was broken and in some cases we would not detect that we reached the end e.g, when the local time was equal to the duration, in this case we ended up in a no-op situation and the slide state would not change and the timeChangeCallback would never be called, which meant that visibility wasn't updated as expected. Fixes: QT3DS-3080 Change-Id: Ic6dcfd08ef13a18b769cf5eea3113ec31b776d95 Reviewed-by: Janne Kangas <janne.kangas@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
-rw-r--r--src/runtime/animator/q3dsanimator.cpp7
-rw-r--r--src/runtime/q3dsabstractslideplayer_p.h1
-rw-r--r--src/runtime/q3dsslideplayer.cpp5
-rw-r--r--src/runtime/q3dsslideplayer_p.h2
-rw-r--r--src/runtime/slideplayerng/q3dsslideplayerng.cpp5
-rw-r--r--src/runtime/slideplayerng/q3dsslideplayerng_p.h2
-rw-r--r--tests/auto/slideplayer/tst_q3dsslideplayer.cpp43
7 files changed, 62 insertions, 3 deletions
diff --git a/src/runtime/animator/q3dsanimator.cpp b/src/runtime/animator/q3dsanimator.cpp
index 3f0265e..eb9db08 100644
--- a/src/runtime/animator/q3dsanimator.cpp
+++ b/src/runtime/animator/q3dsanimator.cpp
@@ -187,10 +187,11 @@ void Q3DSAnimator::advance(float dt)
bool eos = false;
bool resetLocalTime = false;
- // 1. If localTime is > 0.0f and newTime == 0.0f => EOS
- // 2. If localTime is < duration and newTime == duration => EOS
+ // 1. +rate && newTime == duration => EOS
+ // 2. -rate && newTime == 0.0f => EOS
+ // 3. !rate => no-op
// Note that we only notify aboud EOS when we're not looping/pingponging.
- if ((localTime > 0.0f && qFuzzyCompare(newTime, 0.0f)) || (localTime < duration && qFuzzyCompare(newTime, duration))) {
+ if (((rate > 0.0f) && qFuzzyCompare(newTime, duration)) || ((rate < 0.0f) && qFuzzyCompare(newTime, 0.0f))) {
switch (playMode) {
case PlayMode::PlayThroughTo:
// We don't handle slide changes here, as that's a foreign concept,
diff --git a/src/runtime/q3dsabstractslideplayer_p.h b/src/runtime/q3dsabstractslideplayer_p.h
index 0ecf15f..409be28 100644
--- a/src/runtime/q3dsabstractslideplayer_p.h
+++ b/src/runtime/q3dsabstractslideplayer_p.h
@@ -103,6 +103,7 @@ public:
virtual void objectAddedToSlide(Q3DSGraphObject *obj, Q3DSSlide *slide) = 0;
virtual void objectRemovedFromSlide(Q3DSGraphObject *obj, Q3DSSlide *slide) = 0;
+ virtual float playbackRate() const = 0;
public Q_SLOTS:
virtual void play() = 0;
diff --git a/src/runtime/q3dsslideplayer.cpp b/src/runtime/q3dsslideplayer.cpp
index a2a001c..aad3ca1 100644
--- a/src/runtime/q3dsslideplayer.cpp
+++ b/src/runtime/q3dsslideplayer.cpp
@@ -1135,4 +1135,9 @@ void Q3DSSlidePlayer::objectRemovedFromSlide(Q3DSGraphObject *obj, Q3DSSlide *sl
evaluateDynamicObjectVisibility(obj);
}
+float Q3DSSlidePlayer::playbackRate() const
+{
+ return m_data.playbackRate;
+}
+
QT_END_NAMESPACE
diff --git a/src/runtime/q3dsslideplayer_p.h b/src/runtime/q3dsslideplayer_p.h
index 1de9d91..6178884 100644
--- a/src/runtime/q3dsslideplayer_p.h
+++ b/src/runtime/q3dsslideplayer_p.h
@@ -80,6 +80,8 @@ public:
void objectAddedToSlide(Q3DSGraphObject *obj, Q3DSSlide *slide) override;
void objectRemovedFromSlide(Q3DSGraphObject *obj, Q3DSSlide *slide) override;
+ float playbackRate() const override;
+
public Q_SLOTS:
void play() override;
void stop() override;
diff --git a/src/runtime/slideplayerng/q3dsslideplayerng.cpp b/src/runtime/slideplayerng/q3dsslideplayerng.cpp
index 854c72e..77a6194 100644
--- a/src/runtime/slideplayerng/q3dsslideplayerng.cpp
+++ b/src/runtime/slideplayerng/q3dsslideplayerng.cpp
@@ -941,4 +941,9 @@ void Q3DSSlidePlayerNg::objectRemovedFromSlide(Q3DSGraphObject *obj, Q3DSSlide *
Q3DSAnimationManagerNg::removeObject(slide, obj);
}
+float Q3DSSlidePlayerNg::playbackRate() const
+{
+ return m_data.playbackRate;
+}
+
QT_END_NAMESPACE
diff --git a/src/runtime/slideplayerng/q3dsslideplayerng_p.h b/src/runtime/slideplayerng/q3dsslideplayerng_p.h
index ec0d04f..9ab9773 100644
--- a/src/runtime/slideplayerng/q3dsslideplayerng_p.h
+++ b/src/runtime/slideplayerng/q3dsslideplayerng_p.h
@@ -77,6 +77,8 @@ public:
void objectAddedToSlide(Q3DSGraphObject *obj, Q3DSSlide *slide) override;
void objectRemovedFromSlide(Q3DSGraphObject *obj, Q3DSSlide *slide) override;
+ float playbackRate() const override;
+
public Q_SLOTS:
void play() override;
void stop() override;
diff --git a/tests/auto/slideplayer/tst_q3dsslideplayer.cpp b/tests/auto/slideplayer/tst_q3dsslideplayer.cpp
index e0ee1f3..85e033e 100644
--- a/tests/auto/slideplayer/tst_q3dsslideplayer.cpp
+++ b/tests/auto/slideplayer/tst_q3dsslideplayer.cpp
@@ -216,6 +216,49 @@ void tst_Q3DSSlidePlayer::tst_playModes()
QCOMPARE(slideChangedSpy.count(), 0);
QCOMPARE(player->slideDeck()->currentSlide(), m_stopAtEnd);
+ // STOP AT END (Already at the end, +rate)
+ // The player is now in paused state (StopAtEnd), changing the state to Playing should move it
+ // back into paused state (StopAtEnd).
+ stateChangeSpy.clear();
+ slideChangedSpy.clear();
+
+ QCOMPARE(player->position(), player->duration());
+
+ player->play();
+ QTRY_COMPARE(player->state(), Q3DSSlidePlayer::PlayerState::Playing);
+ QTRY_COMPARE(player->state(), Q3DSSlidePlayer::PlayerState::Paused);
+
+ // paused -> playing -> paused
+ QCOMPARE(stateChangeSpy.count(), 2);
+ QCOMPARE(slideChangedSpy.count(), 0);
+ QCOMPARE(player->position(), player->duration());
+ QCOMPARE(player->slideDeck()->currentSlide(), m_stopAtEnd);
+
+ // STOP AT END (Already at the end(start), -rate)
+ // Seek to the start and set the rate to a negative value, changing the state to Playing should
+ // move it back into paused state (StopAtEnd).
+ stateChangeSpy.clear();
+ slideChangedSpy.clear();
+
+ player->seek(0.0f);
+ player->setPlaybackRate(-0.5f);
+ QCOMPARE(player->playbackRate(), -0.5f);
+ QCOMPARE(player->position(), 0.0f);
+
+ player->play();
+ QTRY_COMPARE(player->state(), Q3DSSlidePlayer::PlayerState::Playing);
+ QTRY_COMPARE(player->state(), Q3DSSlidePlayer::PlayerState::Paused);
+
+ // paused -> playing -> paused
+ QCOMPARE(stateChangeSpy.count(), 2);
+ QCOMPARE(slideChangedSpy.count(), 0);
+ QCOMPARE(player->position(), 0.0f);
+ QCOMPARE(player->slideDeck()->currentSlide(), m_stopAtEnd);
+
+ // Reset the playback rate!!!
+ player->setPlaybackRate(1.0f);
+ QCOMPARE(player->playbackRate(), 1.0f);
+
// PLAY TO PREVIOUS
player->stop();
QTRY_COMPARE(player->state(), Q3DSSlidePlayer::PlayerState::Stopped);