summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire350@gmail.com>2015-08-06 19:05:26 +0200
committerPaul Lemire <paul.lemire@kdab.com>2015-08-07 19:43:17 +0000
commit0e8b923ec0f9ab07ba542b86b284234df91486e4 (patch)
treea58727b760d8eca2343bf7731070879dd4b964e3
parent1f8e2ee5fd8b66f6a10440166134972016a78c21 (diff)
RenderGeometryRenderer/GeometryFunctor: everything is now hooked up
Change-Id: I70bcd536ef7d4fbeb3b5ad8a9593af7bd984a0af Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/backend/jobs/loadgeometryjob.cpp3
-rw-r--r--src/render/backend/qrenderaspect.cpp3
-rw-r--r--src/render/backend/renderbuffer.cpp1
-rw-r--r--src/render/backend/renderer.cpp5
-rw-r--r--src/render/backend/rendergeometryrenderer.cpp18
-rw-r--r--src/render/backend/rendergeometryrenderer_p.h1
6 files changed, 28 insertions, 3 deletions
diff --git a/src/render/backend/jobs/loadgeometryjob.cpp b/src/render/backend/jobs/loadgeometryjob.cpp
index ed5af49ea..a5efb5d00 100644
--- a/src/render/backend/jobs/loadgeometryjob.cpp
+++ b/src/render/backend/jobs/loadgeometryjob.cpp
@@ -57,7 +57,8 @@ LoadGeometryJob::~LoadGeometryJob()
void LoadGeometryJob::run()
{
RenderGeometryRenderer *geometryRenderer = m_renderer->geometryRendererManager()->data(m_handle);
- // TO DO: Do something
+ if (geometryRenderer != Q_NULLPTR)
+ geometryRenderer->executeFunctor();
}
} // Render
diff --git a/src/render/backend/qrenderaspect.cpp b/src/render/backend/qrenderaspect.cpp
index af1284b81..3e8f46638 100644
--- a/src/render/backend/qrenderaspect.cpp
+++ b/src/render/backend/qrenderaspect.cpp
@@ -302,6 +302,9 @@ QVector<QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time)
const QVector<QAspectJobPtr> bufferJobs = d->m_renderer->createRenderBufferJobs();
jobs.append(bufferJobs);
+ const QVector<QAspectJobPtr> geometryJobs = d->m_renderer->createGeometryRendererJobs();
+ jobs.append(geometryJobs);
+
// Create jobs to update transforms and bounding volumes
// We can only update bounding volumes once all world transforms are known
d->m_boundingVolumeJob->addDependency(d->m_worldTransformJob);
diff --git a/src/render/backend/renderbuffer.cpp b/src/render/backend/renderbuffer.cpp
index 423255786..d7ff4bca4 100644
--- a/src/render/backend/renderbuffer.cpp
+++ b/src/render/backend/renderbuffer.cpp
@@ -76,6 +76,7 @@ void RenderBuffer::setManager(BufferManager *manager)
void RenderBuffer::executeFunctor()
{
+ Q_ASSERT(m_functor);
m_data = (*m_functor)();
}
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp
index cfe88ddc3..1c285a045 100644
--- a/src/render/backend/renderer.cpp
+++ b/src/render/backend/renderer.cpp
@@ -75,6 +75,7 @@
#include <Qt3DRenderer/private/vsyncframeadvanceservice_p.h>
#include <Qt3DRenderer/private/buffermanager_p.h>
#include <Qt3DRenderer/private/loadbufferjob_p.h>
+#include <Qt3DRenderer/private/loadgeometryjob_p.h>
#include <Qt3DRenderer/private/geometryrenderermanager_p.h>
#include <Qt3DCore/qcameralens.h>
@@ -792,7 +793,9 @@ QVector<QAspectJobPtr> Renderer::createGeometryRendererJobs()
Q_FOREACH (const QNodeId &geoRendererId, dirtyGeometryRenderers) {
HGeometryRenderer geometryRendererHandle = m_geometryRendererManager->lookupHandle(geoRendererId);
if (!geometryRendererHandle.isNull()) {
- // TO DO: Create new job
+ LoadGeometryJobPtr job(new LoadGeometryJob(geometryRendererHandle));
+ job->setRenderer(this);
+ dirtyGeometryRendererJobs.push_back(job);
}
}
diff --git a/src/render/backend/rendergeometryrenderer.cpp b/src/render/backend/rendergeometryrenderer.cpp
index cac9aa8c9..08ff49768 100644
--- a/src/render/backend/rendergeometryrenderer.cpp
+++ b/src/render/backend/rendergeometryrenderer.cpp
@@ -37,6 +37,7 @@
#include "rendergeometryrenderer_p.h"
#include <Qt3DCore/qscenepropertychange.h>
#include <Qt3DRenderer/private/geometryrenderermanager_p.h>
+#include <Qt3DCore/qbackendscenepropertychange.h>
QT_BEGIN_NAMESPACE
@@ -45,7 +46,7 @@ namespace Qt3D {
namespace Render {
RenderGeometryRenderer::RenderGeometryRenderer()
- : QBackendNode(ReadOnly)
+ : QBackendNode(ReadWrite)
, m_instanceCount(0)
, m_primitiveCount(0)
, m_baseVertex(0)
@@ -163,6 +164,21 @@ void RenderGeometryRenderer::sceneChangeEvent(const QSceneChangePtr &e)
// Add to dirty list in manager
}
+void RenderGeometryRenderer::executeFunctor()
+{
+ Q_ASSERT(m_functor);
+ QGeometry *geometry = (*m_functor)();
+
+ QBackendScenePropertyChangePtr e(new QBackendScenePropertyChange(NodeUpdated, peerUuid()));
+ e->setPropertyName("geometry");
+ // The Frontend element has to perform the clone
+ // So that the objects are created in the main thread
+ e->setValue(QVariant::fromValue(geometry));
+ e->setTargetNode(peerUuid());
+ notifyObservers(e);
+ // Maybe we could also send a status to help troubleshoot errors
+}
+
void RenderGeometryRenderer::unsetDirty()
{
m_dirty = false;
diff --git a/src/render/backend/rendergeometryrenderer_p.h b/src/render/backend/rendergeometryrenderer_p.h
index 8c77821d1..baa81048c 100644
--- a/src/render/backend/rendergeometryrenderer_p.h
+++ b/src/render/backend/rendergeometryrenderer_p.h
@@ -59,6 +59,7 @@ public:
void setManager(GeometryRendererManager *manager);
void updateFromPeer(QNode *peer) Q_DECL_OVERRIDE;
void sceneChangeEvent(const QSceneChangePtr &e) Q_DECL_OVERRIDE;
+ void executeFunctor();
inline QNodeId geometryId() const { return m_geometryId; }
inline int instanceCount() const { return m_instanceCount; }