diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-11-08 11:02:03 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-11-13 07:32:37 +0100 |
commit | 8de836c63eb0a0e484ae4c9e02f0a5f23ef49b65 (patch) | |
tree | 93a67e6c63a799f1fe87e641fa9f754fc2fc568d | |
parent | 53a780960aa5245eb3e534e6bd0c268c050c52fa (diff) |
FilterProximityJob: only run it if our RV requires proximity filtering
Which is only very rarely required by user applications.
Avoid useless memory allocations every frame
Change-Id: I69ea73ebfffdbe928f99333b4d1dd90cf4ada430
Reviewed-by: Mike Krus <mike.krus@kdab.com>
3 files changed, 13 insertions, 6 deletions
diff --git a/src/render/jobs/filterproximitydistancejob.cpp b/src/render/jobs/filterproximitydistancejob.cpp index 80a9e4777..02b712fc2 100644 --- a/src/render/jobs/filterproximitydistancejob.cpp +++ b/src/render/jobs/filterproximitydistancejob.cpp @@ -57,9 +57,9 @@ void FilterProximityDistanceJob::run() // Fill m_filteredEntities // If no filtering needs to be done, this will be the output value // otherwise it will be used as the base list of entities to filter - selectAllEntities(); if (hasProximityFilter()) { + selectAllEntities(); QVector<Entity *> entitiesToFilter = std::move(m_filteredEntities); FrameGraphManager *frameGraphManager = m_manager->frameGraphManager(); EntityManager *entityManager = m_manager->renderNodesManager(); diff --git a/src/render/renderers/opengl/renderer/renderviewbuilder.cpp b/src/render/renderers/opengl/renderer/renderviewbuilder.cpp index 40179fbd6..96fa55c47 100644 --- a/src/render/renderers/opengl/renderer/renderviewbuilder.cpp +++ b/src/render/renderers/opengl/renderer/renderviewbuilder.cpp @@ -310,7 +310,8 @@ public: if (rv->frustumCulling()) renderableEntities = RenderViewBuilder::entitiesInSubset(renderableEntities, m_frustumCullingJob->visibleEntities()); // Filter out entities which didn't satisfy proximity filtering - renderableEntities = RenderViewBuilder::entitiesInSubset(renderableEntities, m_filterProximityJob->filteredEntities()); + if (!rv->proximityFilterIds().empty()) + renderableEntities = RenderViewBuilder::entitiesInSubset(renderableEntities, m_filterProximityJob->filteredEntities()); } // Filter out Render commands for which the Entity wasn't selected because diff --git a/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp b/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp index 1bed9fc44..ad12ffad0 100644 --- a/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp +++ b/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp @@ -117,14 +117,20 @@ private Q_SLOTS: { Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity(); - Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity); - Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity); - Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity); + Qt3DCore::QEntity *targetEntity = new Qt3DCore::QEntity(rootEntity); + Qt3DCore::QEntity *childEntity1 = buildEntityAtDistance(50.0f, rootEntity); + Qt3DCore::QEntity *childEntity2 = buildEntityAtDistance(25.0f, rootEntity); + Qt3DCore::QEntity *childEntity3 = buildEntityAtDistance(75.0f, rootEntity); + + Qt3DRender::QProximityFilter *proximityFilter = new Qt3DRender::QProximityFilter(rootEntity); + proximityFilter->setDistanceThreshold(200.0f); + proximityFilter->setEntity(targetEntity); QTest::newRow("ShouldSelectAll") << rootEntity - << Qt3DCore::QNodeIdVector() + << (Qt3DCore::QNodeIdVector() << proximityFilter->id()) << (Qt3DCore::QNodeIdVector() << rootEntity->id() + << targetEntity->id() << childEntity1->id() << childEntity2->id() << childEntity3->id() |