summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/aspects/qabstractaspect.cpp22
-rw-r--r--src/core/aspects/qabstractaspect.h4
-rw-r--r--src/core/aspects/qaspectengine.cpp12
-rw-r--r--src/core/aspects/qaspectengine.h4
-rw-r--r--src/core/aspects/qaspectmanager.cpp2
-rw-r--r--src/core/aspects/qaspectmanager_p.h3
-rw-r--r--src/core/jobs/qaspectjob.cpp28
-rw-r--r--src/core/jobs/qaspectjob.h5
-rw-r--r--src/core/qscheduler.cpp4
9 files changed, 75 insertions, 9 deletions
diff --git a/src/core/aspects/qabstractaspect.cpp b/src/core/aspects/qabstractaspect.cpp
index 1e88e6216..f01124e19 100644
--- a/src/core/aspects/qabstractaspect.cpp
+++ b/src/core/aspects/qabstractaspect.cpp
@@ -393,6 +393,28 @@ void QAbstractAspect::onEngineShutdown()
{
}
+/*!
+ * Called in the main thread once all the jobs have been executed.
+ *
+ * \note This is called after QAspectJob::postFrame is called on every jobs.
+ *
+ * \sa QAspectJob::postFrame
+ */
+void QAbstractAspect::jobsDone()
+{
+ Q_D(QAbstractAspect);
+ d->jobsDone();
+}
+
+/*!
+ * Called in the main thread when the frame processing is complete.
+ */
+void QAbstractAspect::frameDone()
+{
+ Q_D(QAbstractAspect);
+ d->frameDone();
+}
+
void QAbstractAspect::scheduleSingleShotJob(const Qt3DCore::QAspectJobPtr &job)
{
Q_D(QAbstractAspect);
diff --git a/src/core/aspects/qabstractaspect.h b/src/core/aspects/qabstractaspect.h
index e15b987c1..4dcc59cec 100644
--- a/src/core/aspects/qabstractaspect.h
+++ b/src/core/aspects/qabstractaspect.h
@@ -93,9 +93,13 @@ private:
virtual void onEngineStartup();
virtual void onEngineShutdown();
+ virtual void jobsDone();
+ virtual void frameDone();
+
Q_DECLARE_PRIVATE(QAbstractAspect)
friend class QAspectEngine;
friend class QAspectManager;
+ friend class QScheduler;
};
template<class Frontend>
diff --git a/src/core/aspects/qaspectengine.cpp b/src/core/aspects/qaspectengine.cpp
index d73771910..946355d05 100644
--- a/src/core/aspects/qaspectengine.cpp
+++ b/src/core/aspects/qaspectengine.cpp
@@ -425,6 +425,18 @@ void QAspectEngine::processFrame()
d->m_aspectManager->processFrame();
}
+QNode *QAspectEngine::lookupNode(QNodeId id) const
+{
+ Q_D(const QAspectEngine);
+ return d->m_scene ? d->m_scene->lookupNode(id) : nullptr;
+}
+
+QVector<QNode *> QAspectEngine::lookupNodes(const QVector<QNodeId> &ids) const
+{
+ Q_D(const QAspectEngine);
+ return d->m_scene ? d->m_scene->lookupNodes(ids) : QVector<QNode *>{};
+}
+
/*!
* Sets the \a root entity for the aspect engine.
*/
diff --git a/src/core/aspects/qaspectengine.h b/src/core/aspects/qaspectengine.h
index 1d5d7e220..ac34e0c54 100644
--- a/src/core/aspects/qaspectengine.h
+++ b/src/core/aspects/qaspectengine.h
@@ -41,6 +41,7 @@
#define QT3DCORE_QASPECTENGINE_H
#include <Qt3DCore/qt3dcore_global.h>
+#include <Qt3DCore/qnodeid.h>
#include <QtCore/QObject>
#include <QtCore/QVector>
@@ -86,6 +87,9 @@ public:
void processFrame();
+ QNode *lookupNode(QNodeId id) const;
+ QVector<QNode *> lookupNodes(const QVector<QNodeId> &ids) const;
+
private:
Q_DECLARE_PRIVATE(QAspectEngine)
};
diff --git a/src/core/aspects/qaspectmanager.cpp b/src/core/aspects/qaspectmanager.cpp
index e93902c54..aac209588 100644
--- a/src/core/aspects/qaspectmanager.cpp
+++ b/src/core/aspects/qaspectmanager.cpp
@@ -541,7 +541,7 @@ void QAspectManager::processFrame()
// Tell the aspect the frame is complete (except rendering)
for (QAbstractAspect *aspect : qAsConst(m_aspects))
- QAbstractAspectPrivate::get(aspect)->frameDone();
+ aspect->frameDone();
}
} // namespace Qt3DCore
diff --git a/src/core/aspects/qaspectmanager_p.h b/src/core/aspects/qaspectmanager_p.h
index e0aefdfde..d3b3992fe 100644
--- a/src/core/aspects/qaspectmanager_p.h
+++ b/src/core/aspects/qaspectmanager_p.h
@@ -88,6 +88,9 @@ public:
explicit QAspectManager(QAspectEngine *parent = nullptr);
~QAspectManager();
+ QAspectEngine * engine() const { return m_engine; }
+ QScheduler *scheduler() const { return m_scheduler; }
+
void setRunMode(QAspectEngine::RunMode mode);
void enterSimulationLoop();
void exitSimulationLoop();
diff --git a/src/core/jobs/qaspectjob.cpp b/src/core/jobs/qaspectjob.cpp
index 0a2ee9841..557756581 100644
--- a/src/core/jobs/qaspectjob.cpp
+++ b/src/core/jobs/qaspectjob.cpp
@@ -40,6 +40,9 @@
#include "qaspectjob.h"
#include "qaspectjob_p.h"
+#include <Qt3DCore/qaspectengine.h>
+#include <Qt3DCore/private/qaspectengine_p.h>
+
#include <QtCore/QByteArray>
QT_BEGIN_NAMESPACE
@@ -91,7 +94,7 @@ QAspectJob::QAspectJob()
/*!
* \fn void Qt3DCore::QAspectJob::run()
- * Executes the job.
+ * Executes the job. This is called on a separate thread by the scheduler.
*/
/*!
@@ -146,11 +149,28 @@ QVector<QWeakPointer<QAspectJob> > QAspectJob::dependencies() const
return d->m_dependencies;
}
-void QAspectJob::postFrame(QAspectManager *aspectManager)
+/*!
+ * This is called, in the main thread, when all the jobs have completed.
+ * It's a good point to push changes back to the frontend.
+ */
+void QAspectJob::postFrame(QAspectEngine *aspectEngine)
+{
+ Q_D(QAspectJob);
+ if (aspectEngine) {
+ auto manager = QAspectEnginePrivate::get(aspectEngine)->m_aspectManager;
+ d->postFrame(manager);
+ }
+}
+
+/*!
+ * Should return true (default) if the job has actually something to do.
+ * If returning false, the job will not be scheduled (but it's dependencies
+ * will be).
+ */
+bool QAspectJob::isRequired()
{
Q_D(QAspectJob);
- if (aspectManager)
- d->postFrame(aspectManager);
+ return d->isRequired();
}
} // namespace Qt3DCore
diff --git a/src/core/jobs/qaspectjob.h b/src/core/jobs/qaspectjob.h
index 7cc784e0f..c618c3c19 100644
--- a/src/core/jobs/qaspectjob.h
+++ b/src/core/jobs/qaspectjob.h
@@ -49,7 +49,7 @@ QT_BEGIN_NAMESPACE
namespace Qt3DCore {
class QAspectJobPrivate;
-class QAspectManager;
+class QAspectEngine;
class Q_3DCORESHARED_EXPORT QAspectJob
{
@@ -63,7 +63,8 @@ public:
QVector<QWeakPointer<QAspectJob> > dependencies() const;
virtual void run() = 0;
- void postFrame(QAspectManager *aspectManager);
+ virtual void postFrame(QAspectEngine *aspectEngine);
+ virtual bool isRequired();
protected:
explicit QAspectJob(QAspectJobPrivate &dd);
diff --git a/src/core/qscheduler.cpp b/src/core/qscheduler.cpp
index c52445a35..6c63fc1c1 100644
--- a/src/core/qscheduler.cpp
+++ b/src/core/qscheduler.cpp
@@ -140,10 +140,10 @@ int QScheduler::scheduleAndWaitForFrameAspectJobs(qint64 time, bool dumpJobs)
QTaskLogger logger(m_aspectManager->serviceLocator()->systemInformation(), 4097, 0, QTaskLogger::AspectJob);
for (auto &job : qAsConst(jobQueue))
- QAspectJobPrivate::get(job.data())->postFrame(m_aspectManager);
+ job->postFrame(m_aspectManager->engine());
for (QAbstractAspect *aspect : aspects)
- QAbstractAspectPrivate::get(aspect)->jobsDone();
+ aspect->jobsDone();
}
return totalJobs;