summaryrefslogtreecommitdiffstats
path: root/src/render/frontend
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-11-23 12:33:09 +0100
committerAndy Nichols <andy.nichols@theqtcompany.com>2015-11-24 16:53:24 +0000
commite088dde9105c42542d966903dc0e8891d6a870f6 (patch)
tree2abbe88e146e9538b0a8a025c6669b850d576e37 /src/render/frontend
parent28fccfbe715251f307d407b03b64cb4936fee9e7 (diff)
QRenderAspect/Renderer: refactored to use the AbstractRenderer interface
Change-Id: I662577e6dd337b1f056f73b4a11262e902d4dde2 Reviewed-by: Andy Nichols <andy.nichols@theqtcompany.com>
Diffstat (limited to 'src/render/frontend')
-rw-r--r--src/render/frontend/qrenderaspect.cpp191
-rw-r--r--src/render/frontend/qrenderaspect.h3
-rw-r--r--src/render/frontend/qrenderaspect_p.h12
3 files changed, 141 insertions, 65 deletions
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index bcfdddde5..46e82a448 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -103,6 +103,12 @@
#include <Qt3DRender/private/boundingvolumedebug_p.h>
#include <Qt3DRender/private/nodemanagers_p.h>
#include <Qt3DRender/private/calcgeometrytrianglevolumes_p.h>
+#include <Qt3DRender/private/handle_types_p.h>
+#include <Qt3DRender/private/buffermanager_p.h>
+#include <Qt3DRender/private/geometryrenderermanager_p.h>
+#include <Qt3DRender/private/loadbufferjob_p.h>
+#include <Qt3DRender/private/loadgeometryjob_p.h>
+#include <Qt3DRender/private/qsceneparserfactory_p.h>
#include <Qt3DCore/qentity.h>
#include <Qt3DCore/qtransform.h>
@@ -135,20 +141,23 @@ namespace Qt3DRender {
*/
QRenderAspectPrivate::QRenderAspectPrivate(QRenderAspect::RenderType type)
: QAbstractAspectPrivate()
- , m_renderer(new Render::Renderer(type))
- , m_surfaceEventFilter(new Render::PlatformSurfaceFilter(m_renderer))
+ , m_nodeManagers(new Render::NodeManagers())
+ , m_renderer(Q_NULLPTR)
+ , m_surfaceEventFilter(new Render::PlatformSurfaceFilter())
, m_surface(Q_NULLPTR)
, m_time(0)
, m_initialized(false)
- , m_framePreparationJob(new Render::FramePreparationJob(m_renderer->nodeManagers()))
- , m_cleanupJob(new Render::FrameCleanupJob(m_renderer))
+ , m_framePreparationJob(new Render::FramePreparationJob(m_nodeManagers))
+ , m_cleanupJob(new Render::FrameCleanupJob(m_nodeManagers))
, m_worldTransformJob(new Render::UpdateWorldTransformJob())
, m_updateBoundingVolumeJob(new Render::UpdateBoundingVolumeJob())
- , m_calculateBoundingVolumeJob(new Render::CalculateBoundingVolumeJob(m_renderer->nodeManagers()))
- , m_pickBoundingVolumeJob(new Render::PickBoundingVolumeJob(m_renderer))
+ , m_calculateBoundingVolumeJob(new Render::CalculateBoundingVolumeJob(m_nodeManagers))
{
initResources();
+ // Load the scene parsers
+ loadSceneParsers();
+
// Create jobs to update transforms and bounding volumes
// We can only update bounding volumes once all world transforms are known
m_updateBoundingVolumeJob->addDependency(m_worldTransformJob);
@@ -156,7 +165,12 @@ QRenderAspectPrivate::QRenderAspectPrivate(QRenderAspect::RenderType type)
// All world stuff depends on the RenderEntity's localBoundingVolume
m_worldTransformJob->addDependency(m_calculateBoundingVolumeJob);
- m_pickBoundingVolumeJob->addDependency(m_updateBoundingVolumeJob);
+
+ // Create property renderer implementation given
+ // a targeted rendering API -> only OpenGL for now
+ m_renderer = new Render::Renderer(type);
+ m_renderer->setNodeManagers(m_nodeManagers);
+ m_surfaceEventFilter->setRenderer(m_renderer);
}
void QRenderAspectPrivate::setSurface(QSurface *surface)
@@ -219,50 +233,51 @@ QRenderAspect::QRenderAspect(QRenderAspectPrivate &dd, QObject *parent)
void QRenderAspect::registerBackendTypes()
{
Q_D(QRenderAspect);
- Qt3DRender::Render::NodeManagers *nodeManagers = d->m_renderer->nodeManagers();
-
- registerBackendType<Qt3DCore::QEntity>(QBackendNodeFunctorPtr(new Render::RenderEntityFunctor(nodeManagers)));
- registerBackendType<Qt3DCore::QTransform>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Transform, Render::TransformManager>(nodeManagers->transformManager())));
- registerBackendType<QMaterial>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Material, Render::MaterialManager>(nodeManagers->materialManager())));
- registerBackendType<QTechnique>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Technique, Render::TechniqueManager>(nodeManagers->techniqueManager())));
- registerBackendType<QAbstractTextureProvider>(QBackendNodeFunctorPtr(new Render::TextureFunctor(nodeManagers->textureManager(), nodeManagers->textureImageManager(), nodeManagers->textureDataManager())));
- registerBackendType<QShaderProgram>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Shader, Render::ShaderManager>(nodeManagers->shaderManager())));
- registerBackendType<QEffect>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Effect, Render::EffectManager>(nodeManagers->effectManager())));
- registerBackendType<QAnnotation>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Annotation, Render::CriterionManager>(nodeManagers->criterionManager())));
- registerBackendType<Qt3DCore::QCameraLens>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::CameraLens, Render::CameraManager>(nodeManagers->cameraManager())));
- registerBackendType<QLayer>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Layer, Render::LayerManager>(nodeManagers->layerManager())));
- registerBackendType<QRenderPass>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::RenderPass, Render::RenderPassManager>(nodeManagers->renderPassManager())));
- registerBackendType<QAbstractSceneLoader>(QBackendNodeFunctorPtr(new Render::RenderSceneFunctor(nodeManagers->sceneManager())));
- registerBackendType<QRenderTarget>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::RenderTarget, Render::RenderTargetManager>(nodeManagers->renderTargetManager())));
- registerBackendType<QRenderAttachment>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::RenderAttachment, Render::AttachmentManager>(nodeManagers->attachmentManager())));
- registerBackendType<QSortCriterion>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::SortCriterion, Render::SortCriterionManager>(nodeManagers->sortCriterionManager())));
- registerBackendType<QClearBuffer>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::ClearBuffer, QClearBuffer>(nodeManagers->frameGraphManager())));
- registerBackendType<QTechniqueFilter>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::TechniqueFilter, QTechniqueFilter>(nodeManagers->frameGraphManager())));
- registerBackendType<QViewport>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::ViewportNode, QViewport>(nodeManagers->frameGraphManager())));
- registerBackendType<QRenderPassFilter>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::RenderPassFilter, QRenderPassFilter>(nodeManagers->frameGraphManager())));
- registerBackendType<QCameraSelector>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::CameraSelector, QCameraSelector>(nodeManagers->frameGraphManager())));
- registerBackendType<QRenderTargetSelector>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::RenderTargetSelector, QRenderTargetSelector>(nodeManagers->frameGraphManager())));
- registerBackendType<QLayerFilter>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::LayerFilterNode, QLayerFilter>(nodeManagers->frameGraphManager())));
- registerBackendType<QSortMethod>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::SortMethod, QSortMethod>(nodeManagers->frameGraphManager())));
- registerBackendType<QFrameGraphSelector>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::FrameGraphSubtreeSelector, QFrameGraphSelector>(nodeManagers->frameGraphManager())));
+
+ registerBackendType<Qt3DCore::QEntity>(QBackendNodeFunctorPtr(new Render::RenderEntityFunctor(d->m_nodeManagers)));
+ registerBackendType<Qt3DCore::QTransform>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Transform, Render::TransformManager>(d->m_nodeManagers->transformManager())));
+ registerBackendType<QMaterial>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Material, Render::MaterialManager>(d->m_nodeManagers->materialManager())));
+ registerBackendType<QTechnique>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Technique, Render::TechniqueManager>(d->m_nodeManagers->techniqueManager())));
+ registerBackendType<QAbstractTextureProvider>(QBackendNodeFunctorPtr(new Render::TextureFunctor(d->m_nodeManagers->textureManager(), d->m_nodeManagers->textureImageManager(), d->m_nodeManagers->textureDataManager())));
+ registerBackendType<QShaderProgram>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Shader, Render::ShaderManager>(d->m_nodeManagers->shaderManager())));
+ registerBackendType<QEffect>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Effect, Render::EffectManager>(d->m_nodeManagers->effectManager())));
+ registerBackendType<QAnnotation>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Annotation, Render::CriterionManager>(d->m_nodeManagers->criterionManager())));
+ registerBackendType<Qt3DCore::QCameraLens>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::CameraLens, Render::CameraManager>(d->m_nodeManagers->cameraManager())));
+ registerBackendType<QLayer>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Layer, Render::LayerManager>(d->m_nodeManagers->layerManager())));
+ registerBackendType<QRenderPass>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::RenderPass, Render::RenderPassManager>(d->m_nodeManagers->renderPassManager())));
+ registerBackendType<QAbstractSceneLoader>(QBackendNodeFunctorPtr(new Render::RenderSceneFunctor(d->m_nodeManagers->sceneManager())));
+ registerBackendType<QRenderTarget>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::RenderTarget, Render::RenderTargetManager>(d->m_nodeManagers->renderTargetManager())));
+ registerBackendType<QRenderAttachment>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::RenderAttachment, Render::AttachmentManager>(d->m_nodeManagers->attachmentManager())));
+ registerBackendType<QSortCriterion>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::SortCriterion, Render::SortCriterionManager>(d->m_nodeManagers->sortCriterionManager())));
+ registerBackendType<QClearBuffer>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::ClearBuffer, QClearBuffer>(d->m_nodeManagers->frameGraphManager())));
+ registerBackendType<QTechniqueFilter>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::TechniqueFilter, QTechniqueFilter>(d->m_nodeManagers->frameGraphManager())));
+ registerBackendType<QViewport>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::ViewportNode, QViewport>(d->m_nodeManagers->frameGraphManager())));
+ registerBackendType<QRenderPassFilter>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::RenderPassFilter, QRenderPassFilter>(d->m_nodeManagers->frameGraphManager())));
+ registerBackendType<QCameraSelector>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::CameraSelector, QCameraSelector>(d->m_nodeManagers->frameGraphManager())));
+ registerBackendType<QRenderTargetSelector>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::RenderTargetSelector, QRenderTargetSelector>(d->m_nodeManagers->frameGraphManager())));
+ registerBackendType<QLayerFilter>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::LayerFilterNode, QLayerFilter>(d->m_nodeManagers->frameGraphManager())));
+ registerBackendType<QSortMethod>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::SortMethod, QSortMethod>(d->m_nodeManagers->frameGraphManager())));
+ registerBackendType<QFrameGraphSelector>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::FrameGraphSubtreeSelector, QFrameGraphSelector>(d->m_nodeManagers->frameGraphManager())));
registerBackendType<QFrameGraph>(QBackendNodeFunctorPtr(new Render::FrameGraphComponentFunctor(d->m_renderer)));
- registerBackendType<QParameter>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Parameter, Render::ParameterManager>(nodeManagers->parameterManager())));
- registerBackendType<QShaderData>(QBackendNodeFunctorPtr(new Render::RenderShaderDataFunctor(nodeManagers->shaderDataManager())));
- registerBackendType<QAbstractTextureImage>(QBackendNodeFunctorPtr(new Render::TextureImageFunctor(nodeManagers->textureManager(), nodeManagers->textureImageManager(), nodeManagers->textureDataManager())));
- registerBackendType<QStateSet>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::StateSetNode, QStateSet>(nodeManagers->frameGraphManager())));
- registerBackendType<QNoDraw>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::NoDraw, QNoDraw>(nodeManagers->frameGraphManager())));
- registerBackendType<QBuffer>(QBackendNodeFunctorPtr(new Render::BufferFunctor(nodeManagers->bufferManager())));
- registerBackendType<QAttribute>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Attribute, Render::AttributeManager>(nodeManagers->attributeManager())));
- registerBackendType<QGeometry>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Geometry, Render::GeometryManager>(nodeManagers->geometryManager())));
- registerBackendType<QGeometryRenderer>(QBackendNodeFunctorPtr(new Render::GeometryRendererFunctor(nodeManagers->geometryRendererManager())));
- registerBackendType<QObjectPicker>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::ObjectPicker, Render::ObjectPickerManager>(nodeManagers->objectPickerManager())));
- registerBackendType<QBoundingVolumeDebug>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::BoundingVolumeDebug, Render::BoundingVolumeDebugManager>(nodeManagers->boundingVolumeDebugManager())));
+ registerBackendType<QParameter>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Parameter, Render::ParameterManager>(d->m_nodeManagers->parameterManager())));
+ registerBackendType<QShaderData>(QBackendNodeFunctorPtr(new Render::RenderShaderDataFunctor(d->m_nodeManagers->shaderDataManager())));
+ registerBackendType<QAbstractTextureImage>(QBackendNodeFunctorPtr(new Render::TextureImageFunctor(d->m_nodeManagers->textureManager(), d->m_nodeManagers->textureImageManager(), d->m_nodeManagers->textureDataManager())));
+ registerBackendType<QStateSet>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::StateSetNode, QStateSet>(d->m_nodeManagers->frameGraphManager())));
+ registerBackendType<QNoDraw>(QBackendNodeFunctorPtr(new Render::FrameGraphNodeFunctor<Render::NoDraw, QNoDraw>(d->m_nodeManagers->frameGraphManager())));
+ registerBackendType<QBuffer>(QBackendNodeFunctorPtr(new Render::BufferFunctor(d->m_nodeManagers->bufferManager())));
+ registerBackendType<QAttribute>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Attribute, Render::AttributeManager>(d->m_nodeManagers->attributeManager())));
+ registerBackendType<QGeometry>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::Geometry, Render::GeometryManager>(d->m_nodeManagers->geometryManager())));
+ registerBackendType<QGeometryRenderer>(QBackendNodeFunctorPtr(new Render::GeometryRendererFunctor(d->m_nodeManagers->geometryRendererManager())));
+ registerBackendType<QObjectPicker>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::ObjectPicker, Render::ObjectPickerManager>(d->m_nodeManagers->objectPickerManager())));
+ registerBackendType<QBoundingVolumeDebug>(QBackendNodeFunctorPtr(new Render::NodeFunctor<Render::BoundingVolumeDebug, Render::BoundingVolumeDebugManager>(d->m_nodeManagers->boundingVolumeDebugManager())));
}
void QRenderAspect::renderInitialize(QOpenGLContext *context)
{
Q_D(QRenderAspect);
- d->m_renderer->initialize(context);
+ if (d->m_renderer->api() == Render::AbstractRenderer::OpenGL)
+ static_cast<Render::Renderer *>(d->m_renderer)->setOpenGLContext(context);
+ d->m_renderer->initialize();
}
void QRenderAspect::renderSynchronous()
@@ -300,13 +315,14 @@ QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time)
if (d->m_renderer != Q_NULLPTR && d->m_renderer->isRunning()) {
Render::NodeManagers *manager = d->m_renderer->nodeManagers();
+ QAspectJobPtr pickBoundingVolumeJob = d->m_renderer->pickBoundingVolumeJob();
// Create the jobs to build the frame
- d->m_framePreparationJob->setRoot(d->m_renderer->renderSceneRoot());
- d->m_worldTransformJob->setRoot(d->m_renderer->renderSceneRoot());
- d->m_updateBoundingVolumeJob->setRoot(d->m_renderer->renderSceneRoot());
- d->m_calculateBoundingVolumeJob->setRoot(d->m_renderer->renderSceneRoot());
- d->m_pickBoundingVolumeJob->setRoot(d->m_renderer->renderSceneRoot());
+ d->m_framePreparationJob->setRoot(d->m_renderer->sceneRoot());
+ d->m_worldTransformJob->setRoot(d->m_renderer->sceneRoot());
+ d->m_updateBoundingVolumeJob->setRoot(d->m_renderer->sceneRoot());
+ d->m_calculateBoundingVolumeJob->setRoot(d->m_renderer->sceneRoot());
+ d->m_cleanupJob->setRoot(d->m_renderer->sceneRoot());
const QVector<QNodeId> texturesPending = manager->textureDataManager()->texturesPending();
Q_FOREACH (const QNodeId &textureId, texturesPending) {
@@ -319,43 +335,44 @@ QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time)
// Another for jobs that can span across multiple frames (Scene/Mesh loading)
const QVector<Render::LoadSceneJobPtr> sceneJobs = manager->sceneManager()->pendingSceneLoaderJobs();
Q_FOREACH (Render::LoadSceneJobPtr job, sceneJobs) {
- job->setRenderer(d->m_renderer);
+ job->setNodeManagers(d->m_nodeManagers);
+ job->setSceneParsers(d->m_sceneParsers);
jobs.append(job);
}
// Clear any previous temporary dependency
d->m_calculateBoundingVolumeJob->clearNullDependencies();
- const QVector<QAspectJobPtr> bufferJobs = d->m_renderer->createRenderBufferJobs();
+ const QVector<QAspectJobPtr> bufferJobs = createRenderBufferJobs();
Q_FOREACH (const QAspectJobPtr bufferJob, bufferJobs)
d->m_calculateBoundingVolumeJob->addDependency(bufferJob);
jobs.append(bufferJobs);
- const QVector<QAspectJobPtr> geometryJobs = d->m_renderer->createGeometryRendererJobs();
+ const QVector<QAspectJobPtr> geometryJobs = createGeometryRendererJobs();
jobs.append(geometryJobs);
- // Clear any previous dependency not valid anymore
- d->m_pickBoundingVolumeJob->clearNullDependencies();
const QVector<QNodeId> geometryRendererTriangleUpdates = manager->geometryRendererManager()->geometryRenderersRequiringTriangleDataRefresh();
Q_FOREACH (const QNodeId geomRendererId, geometryRendererTriangleUpdates) {
Render::CalcGeometryTriangleVolumesPtr triangleComputeJob(new Render::CalcGeometryTriangleVolumes(geomRendererId, manager));
triangleComputeJob->addDependency(d->m_framePreparationJob);
- d->m_pickBoundingVolumeJob->addDependency(triangleComputeJob);
+ pickBoundingVolumeJob->addDependency(triangleComputeJob);
jobs.append(triangleComputeJob);
}
+ pickBoundingVolumeJob->addDependency(d->m_updateBoundingVolumeJob);
+
// Add all jobs to queue
jobs.append(d->m_calculateBoundingVolumeJob);
jobs.append(d->m_worldTransformJob);
jobs.append(d->m_updateBoundingVolumeJob);
jobs.append(d->m_framePreparationJob);
- jobs.append(d->m_pickBoundingVolumeJob);
+ jobs.append(pickBoundingVolumeJob);
// Do not create any more RenderView jobs when the platform surface is gone.
if (d->m_renderer->surface()) {
// Traverse the current framegraph and create jobs to populate
// RenderBins with RenderCommands
- QVector<QAspectJobPtr> renderBinJobs = d->m_renderer->createRenderBinJobs();
+ QVector<QAspectJobPtr> renderBinJobs = d->m_renderer->renderBinJobs();
// TODO: Add wrapper around ThreadWeaver::Collection
for (int i = 0; i < renderBinJobs.size(); ++i) {
QAspectJobPtr renderBinJob = renderBinJobs.at(i);
@@ -398,7 +415,7 @@ void QRenderAspect::setRootEntity(Qt3DCore::QEntity *rootObject)
Q_D(QRenderAspect);
QNodeVisitor visitor;
visitor.traverse(rootObject, this, &QRenderAspect::visitNode);
- d->m_renderer->setSceneGraphRoot(d->m_renderer->nodeManagers()->lookupResource<Render::Entity, Render::EntityManager>(rootObject->id()));
+ d->m_renderer->setSceneRoot(d->m_renderer->nodeManagers()->lookupResource<Render::Entity, Render::EntityManager>(rootObject->id()));
}
void QRenderAspect::onInitialize(const QVariantMap &data)
@@ -411,8 +428,10 @@ void QRenderAspect::onInitialize(const QVariantMap &data)
// Register the VSyncFrameAdvanceService to drive the aspect manager loop
// depending on the vsync
if (d->m_aspectManager) {
- services()->registerServiceProvider(Qt3DCore::QServiceLocator::FrameAdvanceService,
- d->m_renderer->vsyncFrameAdvanceService());
+ QAbstractFrameAdvanceService *advanceService = d->m_renderer->frameAdvanceService();
+ if (advanceService)
+ services()->registerServiceProvider(Qt3DCore::QServiceLocator::FrameAdvanceService,
+ advanceService);
}
d->m_renderer->setQRenderAspect(this);
@@ -452,6 +471,56 @@ void QRenderAspect::visitNode(Qt3DCore::QNode *node)
QAbstractAspect::createBackendNode(node);
}
+// Returns a vector of jobs to be performed for dirty buffers
+// 1 dirty buffer == 1 job, all job can be performed in parallel
+QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::createRenderBufferJobs()
+{
+ Q_D(QRenderAspect);
+ const QVector<QNodeId> dirtyBuffers = d->m_nodeManagers->bufferManager()->dirtyBuffers();
+ QVector<QAspectJobPtr> dirtyBuffersJobs;
+
+ Q_FOREACH (const QNodeId &bufId, dirtyBuffers) {
+ Render::HBuffer bufferHandle = d->m_nodeManagers->lookupHandle<Render::Buffer, Render::BufferManager, Render::HBuffer>(bufId);
+ if (!bufferHandle.isNull()) {
+ // Create new buffer job
+ Render::LoadBufferJobPtr job(new Render::LoadBufferJob(bufferHandle));
+ job->setNodeManager(d->m_nodeManagers);
+ dirtyBuffersJobs.push_back(job);
+ }
+ }
+
+ return dirtyBuffersJobs;
+}
+
+QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::createGeometryRendererJobs()
+{
+ Q_D(QRenderAspect);
+ Render::GeometryRendererManager *geomRendererManager = d->m_nodeManagers->geometryRendererManager();
+ const QVector<QNodeId> dirtyGeometryRenderers = geomRendererManager->dirtyGeometryRenderers();
+ QVector<QAspectJobPtr> dirtyGeometryRendererJobs;
+
+ Q_FOREACH (const QNodeId &geoRendererId, dirtyGeometryRenderers) {
+ Render::HGeometryRenderer geometryRendererHandle = geomRendererManager->lookupHandle(geoRendererId);
+ if (!geometryRendererHandle.isNull()) {
+ Render::LoadGeometryJobPtr job(new Render::LoadGeometryJob(geometryRendererHandle));
+ job->setNodeManagers(d->m_nodeManagers);
+ dirtyGeometryRendererJobs.push_back(job);
+ }
+ }
+
+ return dirtyGeometryRendererJobs;
+}
+
+void QRenderAspectPrivate::loadSceneParsers()
+{
+ QStringList keys = QSceneParserFactory::keys();
+ Q_FOREACH (QString key, keys) {
+ QAbstractSceneParser *sceneParser = QSceneParserFactory::create(key, QStringList());
+ if (sceneParser != Q_NULLPTR)
+ m_sceneParsers.append(sceneParser);
+ }
+}
+
} // namespace Qt3DRender
QT_END_NAMESPACE
diff --git a/src/render/frontend/qrenderaspect.h b/src/render/frontend/qrenderaspect.h
index 7c1119a32..eb548a917 100644
--- a/src/render/frontend/qrenderaspect.h
+++ b/src/render/frontend/qrenderaspect.h
@@ -88,6 +88,9 @@ protected:
void visitNode(Qt3DCore::QNode *node);
+ QVector<Qt3DCore::QAspectJobPtr> createRenderBufferJobs();
+ QVector<Qt3DCore::QAspectJobPtr> createGeometryRendererJobs();
+
private:
friend class Render::Renderer;
};
diff --git a/src/render/frontend/qrenderaspect_p.h b/src/render/frontend/qrenderaspect_p.h
index 418def4cc..b8f103cf0 100644
--- a/src/render/frontend/qrenderaspect_p.h
+++ b/src/render/frontend/qrenderaspect_p.h
@@ -56,7 +56,6 @@
#include <Qt3DRender/private/framepreparationjob_p.h>
#include <Qt3DRender/private/framecleanupjob_p.h>
#include <Qt3DRender/private/platformsurfacefilter_p.h>
-#include <Qt3DRender/private/pickboundingvolumejob_p.h>
QT_BEGIN_NAMESPACE
@@ -64,8 +63,11 @@ class QSurface;
namespace Qt3DRender {
+class QAbstractSceneParser;
+
namespace Render {
-class Renderer;
+class AbstractRenderer;
+class NodeManagers;
}
class QRenderAspectPrivate : public Qt3DCore::QAbstractAspectPrivate
@@ -76,8 +78,10 @@ public:
Q_DECLARE_PUBLIC(QRenderAspect)
void setSurface(QSurface *surface);
+ void loadSceneParsers();
- Render::Renderer *m_renderer;
+ Render::NodeManagers *m_nodeManagers;
+ Render::AbstractRenderer *m_renderer;
// The filter has affinity with the main thread so we have to delete it there
// via QScopedPointerDeleteLater
@@ -91,7 +95,7 @@ public:
Render::UpdateWorldTransformJobPtr m_worldTransformJob;
Render::UpdateBoundingVolumeJobPtr m_updateBoundingVolumeJob;
Render::CalculateBoundingVolumeJobPtr m_calculateBoundingVolumeJob;
- Render::PickBoundingVolumeJobPtr m_pickBoundingVolumeJob;
+ QList<QAbstractSceneParser *> m_sceneParsers;
};
}