forked from qt-creator/qt-creator
Improve particle system animation driver
- Do not automatically restart particle system animation when pressing the restart button if the animation is paused. - Use own QElapsedTimer in AnimationDriver and properly handle animation driver pausing. Change-Id: Ic2924fb66fddffb8878625be8fa766f06219ca61 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
@@ -31,8 +31,6 @@ AnimationDriver::AnimationDriver(QObject *parent)
|
|||||||
{
|
{
|
||||||
setProperty("allowNegativeDelta", true);
|
setProperty("allowNegativeDelta", true);
|
||||||
install();
|
install();
|
||||||
connect(this, SIGNAL(started()), this, SLOT(startTimer()));
|
|
||||||
connect(this, SIGNAL(stopped()), this, SLOT(stopTimer()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AnimationDriver::~AnimationDriver()
|
AnimationDriver::~AnimationDriver()
|
||||||
@@ -49,10 +47,13 @@ void AnimationDriver::timerEvent(QTimerEvent *e)
|
|||||||
// Provide same time for all users
|
// Provide same time for all users
|
||||||
if (m_seekerEnabled) {
|
if (m_seekerEnabled) {
|
||||||
m_seekerElapsed += (m_seekerPos * 100) / 30;
|
m_seekerElapsed += (m_seekerPos * 100) / 30;
|
||||||
if (m_seekerElapsed + m_elapsed < -100) // -100 to allow small negative value
|
if (m_seekerElapsed + m_elapsed - m_pauseTime < -100) // -100 to allow small negative value
|
||||||
m_seekerElapsed = -m_elapsed - 100;
|
m_seekerElapsed = -(m_elapsed - m_pauseTime) - 100;
|
||||||
} else {
|
} else {
|
||||||
m_elapsed = QAnimationDriver::elapsed();
|
if (!m_elapsedTimer.isValid())
|
||||||
|
m_elapsedTimer.restart();
|
||||||
|
else
|
||||||
|
m_elapsed = m_elapsedTimer.elapsed();
|
||||||
}
|
}
|
||||||
m_delta = elapsed() - old;
|
m_delta = elapsed() - old;
|
||||||
advance();
|
advance();
|
||||||
@@ -75,7 +76,7 @@ void AnimationDriver::setSeekerPosition(int position)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (!m_timer.isActive())
|
if (!m_timer.isActive())
|
||||||
restart();
|
startTimer();
|
||||||
|
|
||||||
m_seekerPos = position;
|
m_seekerPos = position;
|
||||||
}
|
}
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include <qabstractanimation.h>
|
#include <qabstractanimation.h>
|
||||||
#include <QtCore/qbasictimer.h>
|
#include <QtCore/qbasictimer.h>
|
||||||
|
#include <QtCore/qelapsedtimer.h>
|
||||||
#include <QtCore/qmath.h>
|
#include <QtCore/qmath.h>
|
||||||
|
|
||||||
class AnimationDriver : public QAnimationDriver
|
class AnimationDriver : public QAnimationDriver
|
||||||
@@ -46,17 +47,34 @@ public:
|
|||||||
}
|
}
|
||||||
void reset()
|
void reset()
|
||||||
{
|
{
|
||||||
stop();
|
m_elapsedTimer.invalidate();
|
||||||
|
m_pauseBegin = 0;
|
||||||
|
m_pauseTime = 0;
|
||||||
|
m_elapsed = 0;
|
||||||
|
m_seekerElapsed = 0;
|
||||||
stopTimer();
|
stopTimer();
|
||||||
}
|
}
|
||||||
void restart()
|
void restart()
|
||||||
{
|
{
|
||||||
start();
|
m_pauseTime = 0;
|
||||||
|
m_elapsed = 0;
|
||||||
|
m_seekerElapsed = 0;
|
||||||
|
startTimer();
|
||||||
|
}
|
||||||
|
void pause()
|
||||||
|
{
|
||||||
|
m_pauseBegin = m_elapsedTimer.elapsed();
|
||||||
|
stopTimer();
|
||||||
|
}
|
||||||
|
void play()
|
||||||
|
{
|
||||||
|
if (m_elapsedTimer.isValid())
|
||||||
|
m_pauseTime += m_elapsedTimer.elapsed() - m_pauseBegin;
|
||||||
startTimer();
|
startTimer();
|
||||||
}
|
}
|
||||||
qint64 elapsed() const override
|
qint64 elapsed() const override
|
||||||
{
|
{
|
||||||
return m_elapsed + m_seekerElapsed;
|
return m_elapsed + m_seekerElapsed - m_pauseTime;
|
||||||
}
|
}
|
||||||
void setSeekerPosition(int position);
|
void setSeekerPosition(int position);
|
||||||
void setSeekerEnabled(bool enable)
|
void setSeekerEnabled(bool enable)
|
||||||
@@ -79,10 +97,13 @@ private:
|
|||||||
Q_SLOT void stopTimer();
|
Q_SLOT void stopTimer();
|
||||||
|
|
||||||
QBasicTimer m_timer;
|
QBasicTimer m_timer;
|
||||||
|
QElapsedTimer m_elapsedTimer;
|
||||||
int m_interval = 16;
|
int m_interval = 16;
|
||||||
int m_seekerPos = 0;
|
int m_seekerPos = 0;
|
||||||
bool m_seekerEnabled = false;
|
bool m_seekerEnabled = false;
|
||||||
qint64 m_elapsed = 0;
|
qint64 m_elapsed = 0;
|
||||||
qint64 m_seekerElapsed = 0;
|
qint64 m_seekerElapsed = 0;
|
||||||
qint64 m_delta = 0;
|
qint64 m_delta = 0;
|
||||||
|
qint64 m_pauseTime = 0;
|
||||||
|
qint64 m_pauseBegin = 0;
|
||||||
};
|
};
|
||||||
|
@@ -2078,21 +2078,21 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c
|
|||||||
m_particleAnimationPlaying = command.isEnabled();
|
m_particleAnimationPlaying = command.isEnabled();
|
||||||
updatedState.insert("particlePlay", command.isEnabled());
|
updatedState.insert("particlePlay", command.isEnabled());
|
||||||
if (m_particleAnimationPlaying) {
|
if (m_particleAnimationPlaying) {
|
||||||
m_particleAnimationDriver->reset();
|
m_particleAnimationDriver->play();
|
||||||
m_particleAnimationDriver->restart();
|
|
||||||
m_particleAnimationDriver->setSeekerEnabled(false);
|
m_particleAnimationDriver->setSeekerEnabled(false);
|
||||||
m_particleAnimationDriver->setSeekerPosition(0);
|
m_particleAnimationDriver->setSeekerPosition(0);
|
||||||
} else {
|
} else {
|
||||||
m_particleAnimationDriver->reset();
|
m_particleAnimationDriver->pause();
|
||||||
m_particleAnimationDriver->setSeekerEnabled(true);
|
m_particleAnimationDriver->setSeekerEnabled(true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case View3DActionCommand::ParticlesRestart:
|
case View3DActionCommand::ParticlesRestart:
|
||||||
resetParticleSystem();
|
resetParticleSystem();
|
||||||
m_particleAnimationPlaying = true;
|
if (m_particleAnimationPlaying) {
|
||||||
m_particleAnimationDriver->restart();
|
m_particleAnimationDriver->restart();
|
||||||
m_particleAnimationDriver->setSeekerEnabled(false);
|
m_particleAnimationDriver->setSeekerEnabled(false);
|
||||||
m_particleAnimationDriver->setSeekerPosition(0);
|
m_particleAnimationDriver->setSeekerPosition(0);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case View3DActionCommand::ParticlesSeek:
|
case View3DActionCommand::ParticlesSeek:
|
||||||
m_particleAnimationDriver->setSeekerPosition(static_cast<const View3DSeekActionCommand &>(command).position());
|
m_particleAnimationDriver->setSeekerPosition(static_cast<const View3DSeekActionCommand &>(command).position());
|
||||||
|
@@ -305,12 +305,6 @@ void Edit3DView::createEdit3DActions()
|
|||||||
resetPuppet();
|
resetPuppet();
|
||||||
};
|
};
|
||||||
|
|
||||||
SelectionContextOperation particlesRestartTrigger = [this](const SelectionContext &) {
|
|
||||||
m_particlesPlayAction->action()->setChecked(true);
|
|
||||||
if (m_seeker)
|
|
||||||
m_seeker->setEnabled(false);
|
|
||||||
};
|
|
||||||
|
|
||||||
SelectionContextOperation particlesPlayTrigger = [this](const SelectionContext &) {
|
SelectionContextOperation particlesPlayTrigger = [this](const SelectionContext &) {
|
||||||
if (m_seeker)
|
if (m_seeker)
|
||||||
m_seeker->setEnabled(!m_particlesPlayAction->action()->isChecked());
|
m_seeker->setEnabled(!m_particlesPlayAction->action()->isChecked());
|
||||||
@@ -334,7 +328,7 @@ void Edit3DView::createEdit3DActions()
|
|||||||
QmlDesigner::Constants::EDIT3D_PARTICLES_RESTART, View3DActionCommand::ParticlesRestart,
|
QmlDesigner::Constants::EDIT3D_PARTICLES_RESTART, View3DActionCommand::ParticlesRestart,
|
||||||
QCoreApplication::translate("ParticlesRestartAction", "Restart Particles"),
|
QCoreApplication::translate("ParticlesRestartAction", "Restart Particles"),
|
||||||
QKeySequence(Qt::Key_E), false, false, Icons::EDIT3D_PARTICLE_RESTART.icon(),
|
QKeySequence(Qt::Key_E), false, false, Icons::EDIT3D_PARTICLE_RESTART.icon(),
|
||||||
Icons::EDIT3D_PARTICLE_RESTART.icon(), particlesRestartTrigger);
|
Icons::EDIT3D_PARTICLE_RESTART.icon());
|
||||||
m_particlesPlayAction->action()->setEnabled(particlemode);
|
m_particlesPlayAction->action()->setEnabled(particlemode);
|
||||||
m_particlesRestartAction->action()->setEnabled(particlemode);
|
m_particlesRestartAction->action()->setEnabled(particlemode);
|
||||||
m_resetAction
|
m_resetAction
|
||||||
|
Reference in New Issue
Block a user