From 8e585245bc1cb5a35269e7b5210b13a34ed886d3 Mon Sep 17 00:00:00 2001 From: Sean Harmer Date: Sun, 6 Dec 2015 14:58:41 +0000 Subject: Pass frame time delta through to the logic component frame update Allows for smoother animations in logic components. Change-Id: I2aad5055465b3afbac415e21a356e216701551ef Reviewed-by: Paul Lemire --- src/logic/executor.cpp | 7 ++++--- src/logic/executor_p.h | 10 ++++++++-- src/logic/manager.cpp | 3 ++- src/logic/manager_p.h | 3 +++ src/logic/qlogicaspect.cpp | 4 +++- src/logic/qlogiccomponent.cpp | 4 ++-- src/logic/qlogiccomponent.h | 4 ++-- 7 files changed, 24 insertions(+), 11 deletions(-) (limited to 'src/logic') diff --git a/src/logic/executor.cpp b/src/logic/executor.cpp index 95de46f0e..e34299fed 100644 --- a/src/logic/executor.cpp +++ b/src/logic/executor.cpp @@ -71,7 +71,8 @@ void Executor::enqueueLogicFrameUpdates(const QVector &nodeId bool Executor::event(QEvent *e) { if (e->type() == QEvent::User) { - processLogicFrameUpdates(); + FrameUpdateEvent *ev = static_cast(e); + processLogicFrameUpdates(ev->deltaTime()); e->setAccepted(true); return true; } @@ -83,7 +84,7 @@ bool Executor::event(QEvent *e) Called from context of main thread */ -void Executor::processLogicFrameUpdates() +void Executor::processLogicFrameUpdates(float dt) { Q_ASSERT(m_scene); Q_ASSERT(m_semaphore); @@ -91,7 +92,7 @@ void Executor::processLogicFrameUpdates() foreach (QNode *node, nodes) { QLogicComponent *logicComponent = qobject_cast(node); if (logicComponent) - logicComponent->onFrameUpdate(); + logicComponent->onFrameUpdate(dt); } // Release the semaphore so the calling Manager can continue diff --git a/src/logic/executor_p.h b/src/logic/executor_p.h index ec48a3e38..79effddb3 100644 --- a/src/logic/executor_p.h +++ b/src/logic/executor_p.h @@ -66,9 +66,15 @@ namespace Logic { class FrameUpdateEvent : public QEvent { public: - FrameUpdateEvent() + FrameUpdateEvent(float dt) : QEvent(QEvent::User) + , m_dt(dt) {} + + float deltaTime() const { return m_dt; } + +private: + float m_dt; }; class Executor : public QObject @@ -86,7 +92,7 @@ public Q_SLOTS: protected: bool event(QEvent *e); - void processLogicFrameUpdates(); + void processLogicFrameUpdates(float dt); private: QVector m_nodeIds; diff --git a/src/logic/manager.cpp b/src/logic/manager.cpp index e6ab804f8..6ef0f9364 100644 --- a/src/logic/manager.cpp +++ b/src/logic/manager.cpp @@ -51,6 +51,7 @@ namespace Logic { Manager::Manager() : m_logicHandlerManager(new HandlerManager) , m_semaphore(1) + , m_dt(0.0f) { m_semaphore.acquire(); } @@ -94,7 +95,7 @@ void Manager::triggerLogicFrameUpdates() // logic component and then wait until done. The Executor will // release the semaphore when it has completed its work. m_executor->enqueueLogicFrameUpdates(m_logicComponentIds); - qApp->postEvent(m_executor, new FrameUpdateEvent); + qApp->postEvent(m_executor, new FrameUpdateEvent(m_dt)); m_semaphore.acquire(); } diff --git a/src/logic/manager_p.h b/src/logic/manager_p.h index 8d62a20c2..25b9d958b 100644 --- a/src/logic/manager_p.h +++ b/src/logic/manager_p.h @@ -82,6 +82,8 @@ public: void triggerLogicFrameUpdates(); + void setDeltaTime(float dt) { m_dt = dt; } + private: QScopedPointer m_logicHandlerManager; QVector m_logicHandlers; @@ -89,6 +91,7 @@ private: QLogicAspect *m_logicAspect; Executor *m_executor; QSemaphore m_semaphore; + float m_dt; }; } // namespace Logic diff --git a/src/logic/qlogicaspect.cpp b/src/logic/qlogicaspect.cpp index a34dffe89..04f509ab1 100644 --- a/src/logic/qlogicaspect.cpp +++ b/src/logic/qlogicaspect.cpp @@ -94,8 +94,10 @@ void QLogicAspect::registerBackendTypes() QVector QLogicAspect::jobsToExecute(qint64 time) { Q_D(QLogicAspect); + const qint64 deltaTime = time - d->m_time; + const float dt = static_cast(deltaTime) / 1.0e9; + d->m_manager->setDeltaTime(dt); d->m_time = time; - // TODO: Ensure arbiter and postman are setup prior to invoking QAspectManager::initialize() // Create jobs that will get exectued by the threadpool QVector jobs; diff --git a/src/logic/qlogiccomponent.cpp b/src/logic/qlogiccomponent.cpp index 2b99f0e14..878bc24d7 100644 --- a/src/logic/qlogiccomponent.cpp +++ b/src/logic/qlogiccomponent.cpp @@ -99,11 +99,11 @@ QLogicComponent::~QLogicComponent() This virtual function will be called in a synchronous manner once each frame by the Logic aspect. */ -void QLogicComponent::onFrameUpdate() +void QLogicComponent::onFrameUpdate(float dt) { // Emit signal so that QML instances get the onFrameUpdate() signal // handler called - emit frameUpdate(); + emit frameUpdate(dt); } } // namespace Qt3DLogic diff --git a/src/logic/qlogiccomponent.h b/src/logic/qlogiccomponent.h index 500b1d85b..68d0bf69a 100644 --- a/src/logic/qlogiccomponent.h +++ b/src/logic/qlogiccomponent.h @@ -63,13 +63,13 @@ protected: QLogicComponent(QLogicComponentPrivate &dd, QNode *parent = 0); Q_SIGNALS: - void frameUpdate(); + void frameUpdate(float dt); private: Q_DECLARE_PRIVATE(QLogicComponent) QT3D_CLONEABLE(QLogicComponent) - virtual void onFrameUpdate(); + virtual void onFrameUpdate(float dt); friend class Logic::Executor; }; -- cgit v1.2.3