Fix Qt3DAnimation::Animation::Clock::playbackRate

Fixes a small bug, removes unused properties from the clock
node (`startTime`) and changes the type of the `playbackRate` property
from `float` to `double` to match the rest of the animation aspect.
QClockPrivate is no longer responsible for emitting the
playbackRateChanged signal. Tests updated to account for this.

[ChangeLog][Qt3DAnimation][Bugfix] The backend node
(`Qt3DAnimation::Animation::Clock`) had an incorrect return type
specified (`int` instead of `float`) which was narrowing the actual
value during the evaluation of associated animation clips.

Change-Id: I53ec78ba289cafcd2055582bee23ff1fc3481317
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
This commit is contained in:
Chip Collier 2017-07-24 17:06:44 +02:00 committed by Sean Harmer
parent 2dcc0f8fdd
commit 4392fa4df4
8 changed files with 26 additions and 52 deletions

1
.gitignore vendored
View File

@ -4,6 +4,7 @@ doc/qt3d
*~
*.user
*.user.*
.dir-locals.el
src/quick3d/qt3dquickversion.h
src/threed/qt3dversion.h
tmp

View File

@ -48,7 +48,6 @@ namespace Animation {
Clock::Clock()
: BackendNode(ReadOnly)
, m_startGlobalTime(0)
, m_playbackRate(1.f)
{
}
@ -62,7 +61,6 @@ void Clock::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change
void Clock::cleanup()
{
m_startGlobalTime = 0;
m_playbackRate = 1.f;
}

View File

@ -63,17 +63,13 @@ public:
void cleanup();
void setPlaybackRate(float playbackRate) { m_playbackRate = playbackRate; }
int playbackRate() const { return m_playbackRate; }
void setStartTime(qint64 globalTime) { m_startGlobalTime = globalTime; }
qint64 startTime() const { return m_startGlobalTime; }
void setPlaybackRate(double playbackRate) { m_playbackRate = playbackRate; }
double playbackRate() const { return m_playbackRate; }
private:
void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_FINAL;
qint64 m_startGlobalTime;
float m_playbackRate;
double m_playbackRate;
};
} // namespace Animation

View File

@ -48,16 +48,6 @@ QClockPrivate::QClockPrivate()
{
}
void QClockPrivate::setPlaybackRate(float playbackRate)
{
if (qFuzzyCompare(playbackRate, m_playbackRate))
return;
Q_Q(QClock);
m_playbackRate = playbackRate;
emit q->playbackRateChanged(playbackRate);
}
QClock::QClock(Qt3DCore::QNode* parent)
: Qt3DCore::QNode(*new QClockPrivate, parent)
{
@ -72,27 +62,19 @@ QClock::~QClock()
{
}
float QClock::playbackRate() const
double QClock::playbackRate() const
{
Q_D(const QClock);
return d->m_playbackRate;
}
void QClock::setPlaybackRate(float playbackRate)
void QClock::setPlaybackRate(double playbackRate)
{
Q_D(QClock);
d->setPlaybackRate(playbackRate);
}
void QClock::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change)
{
if (change->type() == Qt3DCore::PropertyUpdated) {
Qt3DCore::QPropertyUpdatedChangePtr e = qSharedPointerCast<Qt3DCore::QPropertyUpdatedChange>(change);
if (e->propertyName() == QByteArrayLiteral("playbackRate")) {
Q_D(QClock);
d->setPlaybackRate(e->value().toFloat());
}
}
if (qFuzzyCompare(playbackRate, d->m_playbackRate))
return;
d->m_playbackRate = playbackRate;
emit playbackRateChanged(playbackRate);
}
Qt3DCore::QNodeCreatedChangeBasePtr QClock::createNodeCreationChange() const

View File

@ -49,21 +49,20 @@ class QClockPrivate;
class QT3DANIMATIONSHARED_EXPORT QClock : public Qt3DCore::QNode
{
Q_OBJECT
Q_PROPERTY(float playbackRate READ playbackRate WRITE setPlaybackRate NOTIFY playbackRateChanged)
Q_PROPERTY(double playbackRate READ playbackRate WRITE setPlaybackRate NOTIFY playbackRateChanged)
public:
explicit QClock(Qt3DCore::QNode *parent = nullptr);
~QClock();
float playbackRate() const;
void setPlaybackRate(float playbackRate);
double playbackRate() const;
void setPlaybackRate(double playbackRate);
Q_SIGNALS:
void playbackRateChanged(float playbackRate);
void playbackRateChanged(double playbackRate);
protected:
QClock(QClockPrivate &dd, Qt3DCore::QNode *parent = nullptr);
void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) Q_DECL_OVERRIDE;
private:
Q_DECLARE_PRIVATE(QClock)

View File

@ -62,14 +62,12 @@ public:
Q_DECLARE_PUBLIC(QClock)
void setPlaybackRate(float playbackRate);
float m_playbackRate;
double m_playbackRate;
};
struct QClockData
{
float playbackRate;
double playbackRate;
};
} // namespace Qt3DAnimation

View File

@ -47,7 +47,7 @@ private Q_SLOTS:
Qt3DAnimation::Animation::Clock backendClock;
Qt3DAnimation::QClock clock;
clock.setPlaybackRate(10.f);
clock.setPlaybackRate(10.5);
// WHEN
simulateInitialization(&clock, &backendClock);
@ -62,18 +62,18 @@ private Q_SLOTS:
Qt3DAnimation::Animation::Clock backendClock;
// THEN
QCOMPARE(backendClock.playbackRate(), 1.f);
QCOMPARE(backendClock.playbackRate(), 1.0);
// GIVEN
Qt3DAnimation::QClock clock;
clock.setPlaybackRate(10.f);
clock.setPlaybackRate(10.5);
// WHEN
simulateInitialization(&clock, &backendClock);
backendClock.cleanup();
// THEN
QCOMPARE(backendClock.playbackRate(), 1.f);
QCOMPARE(backendClock.playbackRate(), 1.0);
}
};

View File

@ -53,7 +53,7 @@ private Q_SLOTS:
Qt3DAnimation::QClock clock;
// THEN
QCOMPARE(clock.playbackRate(), 1.f);
QCOMPARE(clock.playbackRate(), 1.0);
}
void checkPropertyChanges()
@ -62,8 +62,8 @@ private Q_SLOTS:
Qt3DAnimation::QClock clock;
// WHEN
QSignalSpy spy(&clock, SIGNAL(playbackRateChanged(float)));
const float newValue = 5.f;
QSignalSpy spy(&clock, SIGNAL(playbackRateChanged(double)));
const double newValue = 5.5;
clock.setPlaybackRate(newValue);
// THEN
@ -136,7 +136,7 @@ private Q_SLOTS:
{
// WHEN
clock.setPlaybackRate(10.f);
clock.setPlaybackRate(10.5);
QCoreApplication::processEvents();
// THEN
@ -144,14 +144,14 @@ private Q_SLOTS:
auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "playbackRate");
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
QCOMPARE(change->value().value<float>(), clock.playbackRate());
QCOMPARE(change->value().value<double>(), clock.playbackRate());
arbiter.events.clear();
}
{
// WHEN
clock.setPlaybackRate(10.f);
clock.setPlaybackRate(10.5f);
QCoreApplication::processEvents();
// THEN