diff options
Diffstat (limited to 'src/render/backend/renderviewbuilder.cpp')
-rw-r--r-- | src/render/backend/renderviewbuilder.cpp | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/render/backend/renderviewbuilder.cpp b/src/render/backend/renderviewbuilder.cpp index 2237802d8..7d2d7ab03 100644 --- a/src/render/backend/renderviewbuilder.cpp +++ b/src/render/backend/renderviewbuilder.cpp @@ -178,7 +178,9 @@ public: const RenderableEntityFilterPtr &renderableEntityFilterJob, const ComputableEntityFilterPtr &computableEntityFilterJob, const QVector<MaterialParameterGathererJobPtr> &materialGathererJobs, - const QVector<RenderViewBuilderJobPtr> &renderViewBuilderJobs) + const QVector<RenderViewBuilderJobPtr> &renderViewBuilderJobs, + Renderer *renderer, + FrameGraphNode *leafNode) : m_renderViewJob(renderViewJob) , m_frustumCullingJob(frustumCullingJob) , m_filterEntityByLayerJob(filterEntityByLayerJob) @@ -188,6 +190,8 @@ public: , m_computableEntityFilterJob(computableEntityFilterJob) , m_materialGathererJobs(materialGathererJobs) , m_renderViewBuilderJobs(renderViewBuilderJobs) + , m_renderer(renderer) + , m_leafNode(leafNode) {} void operator()() @@ -211,14 +215,18 @@ public: // Filter out entities that weren't selected by the layer filters std::sort(renderableEntities.begin(), renderableEntities.end()); + auto &filterEntityByLayerCache = m_renderer->m_cache.leafNodeCache[m_leafNode].filterEntityByLayerData; + // Remove all entities from the compute and renderable vectors that aren't in the filtered layer vector - const QVector<Entity *> filteredEntities = m_filterEntityByLayerJob->filteredEntities(); - RenderViewBuilder::removeEntitiesNotInSubset(renderableEntities, filteredEntities); + if (m_renderer->dirtyBits() & AbstractRenderer::LayersDirty) + filterEntityByLayerCache = m_filterEntityByLayerJob->filteredEntities(); + + RenderViewBuilder::removeEntitiesNotInSubset(renderableEntities, filterEntityByLayerCache); // Set the light sources, with layer filters applied. QVector<LightSource> lightSources = m_lightGathererJob->lights(); for (int i = 0; i < lightSources.count(); ++i) { - if (!filteredEntities.contains(lightSources[i].entity)) + if (!filterEntityByLayerCache.contains(lightSources[i].entity)) lightSources.removeAt(i--); } rv->setLightSources(lightSources); @@ -261,6 +269,8 @@ private: ComputableEntityFilterPtr m_computableEntityFilterJob; QVector<MaterialParameterGathererJobPtr> m_materialGathererJobs; QVector<RenderViewBuilderJobPtr> m_renderViewBuilderJobs; + Renderer *m_renderer; + FrameGraphNode *m_leafNode; }; class SetClearDrawBufferIndex @@ -353,7 +363,9 @@ RenderViewBuilder::RenderViewBuilder(Render::FrameGraphNode *leafNode, int rende m_renderableEntityFilterJob, m_computableEntityFilterJob, m_materialGathererJobs, - m_renderViewBuilderJobs), + m_renderViewBuilderJobs, + m_renderer, + leafNode), JobTypes::SyncRenderViewCommandBuilding); m_syncRenderViewCommandBuildersJob = SynchronizerJobPtr::create(SyncRenderViewCommandBuilders(m_renderViewJob, @@ -493,8 +505,10 @@ QVector<Qt3DCore::QAspectJobPtr> RenderViewBuilder::buildJobHierachy() const jobs.push_back(m_syncRenderViewInitializationJob); // Step 2 jobs.push_back(m_syncFrustumCullingJob); // Step 3 - jobs.push_back(m_filterEntityByLayerJob); // Step 3 + if (m_renderer->dirtyBits() & AbstractRenderer::LayersDirty) + jobs.push_back(m_filterEntityByLayerJob); // Step 3 jobs.push_back(m_filterProximityJob); // Step 3 + jobs.push_back(m_setClearDrawBufferIndexJob); // Step 3 for (const auto &materialGatherer : qAsConst(m_materialGathererJobs)) // Step3 |