summaryrefslogtreecommitdiffstats
path: root/src/logic
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2015-12-06 14:58:41 +0000
committerSean Harmer <sean.harmer@kdab.com>2015-12-07 19:07:29 +0000
commit8e585245bc1cb5a35269e7b5210b13a34ed886d3 (patch)
tree0cc0c05bc860ca2c10876a770aaf88d4b06cfa84 /src/logic
parentc807454297e171abc822e56dc5940d61a3d9abd3 (diff)
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 <paul.lemire@kdab.com>
Diffstat (limited to 'src/logic')
-rw-r--r--src/logic/executor.cpp7
-rw-r--r--src/logic/executor_p.h10
-rw-r--r--src/logic/manager.cpp3
-rw-r--r--src/logic/manager_p.h3
-rw-r--r--src/logic/qlogicaspect.cpp4
-rw-r--r--src/logic/qlogiccomponent.cpp4
-rw-r--r--src/logic/qlogiccomponent.h4
7 files changed, 24 insertions, 11 deletions
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<Qt3DCore::QNodeId> &nodeId
bool Executor::event(QEvent *e)
{
if (e->type() == QEvent::User) {
- processLogicFrameUpdates();
+ FrameUpdateEvent *ev = static_cast<FrameUpdateEvent *>(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<QLogicComponent *>(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<Qt3DCore::QNodeId> 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<HandlerManager> m_logicHandlerManager;
QVector<HHandler> 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<QAspectJobPtr> QLogicAspect::jobsToExecute(qint64 time)
{
Q_D(QLogicAspect);
+ const qint64 deltaTime = time - d->m_time;
+ const float dt = static_cast<const float>(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<QAspectJobPtr> 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;
};