summaryrefslogtreecommitdiffstats
path: root/src/render/jobs/pickboundingvolumeutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/jobs/pickboundingvolumeutils.cpp')
-rw-r--r--src/render/jobs/pickboundingvolumeutils.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/render/jobs/pickboundingvolumeutils.cpp b/src/render/jobs/pickboundingvolumeutils.cpp
index 22b92a3f2..5a32f0203 100644
--- a/src/render/jobs/pickboundingvolumeutils.cpp
+++ b/src/render/jobs/pickboundingvolumeutils.cpp
@@ -52,6 +52,8 @@
#include <Qt3DRender/private/segmentsvisitor_p.h>
#include <Qt3DRender/private/pointsvisitor_p.h>
+#include <vector>
+
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
@@ -565,27 +567,29 @@ bool HierarchicalEntityPicker::collectHits(Entity *root)
m_entities.clear();
QRayCastingService rayCasting;
- QVector<Entity *> worklist;
- worklist << root;
+ std::vector<std::pair<Entity *, bool>> worklist;
+ worklist.push_back({root, !root->componentHandle<ObjectPicker, 16>().isNull()});
while (!worklist.empty()) {
- Entity *current = worklist.takeLast();
+ auto current = worklist.back();
+ worklist.pop_back();
// first pick entry sub-scene-graph
QCollisionQueryResult::Hit queryResult =
- rayCasting.query(m_ray, current->worldBoundingVolumeWithChildren());
+ rayCasting.query(m_ray, current.first->worldBoundingVolumeWithChildren());
if (queryResult.m_distance < 0.f)
continue;
// if we get a hit, we check again for this specific entity
- queryResult = rayCasting.query(m_ray, current->worldBoundingVolume());
- if (queryResult.m_distance >= 0.f) {
- m_entities.push_back(current);
+ queryResult = rayCasting.query(m_ray, current.first->worldBoundingVolume());
+ if (queryResult.m_distance >= 0.f && current.second) {
+ m_entities.push_back(current.first);
m_hits.push_back(queryResult);
}
// and pick children
- worklist << current->children();
+ for (auto child: current.first->children())
+ worklist.push_back({child, current.second || !child->componentHandle<ObjectPicker, 16>().isNull()});
}
return !m_hits.empty();