summaryrefslogtreecommitdiffstats
path: root/src/render/raycasting/qraycastingservice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/raycasting/qraycastingservice.cpp')
-rw-r--r--src/render/raycasting/qraycastingservice.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/render/raycasting/qraycastingservice.cpp b/src/render/raycasting/qraycastingservice.cpp
index 8debeac6a..a0f21aa41 100644
--- a/src/render/raycasting/qraycastingservice.cpp
+++ b/src/render/raycasting/qraycastingservice.cpp
@@ -133,11 +133,23 @@ QCollisionQueryResult QRayCastingServicePrivate::collides(const QRay3D &ray, QBo
gathererFunctor.ray = ray;
if (mode == QAbstractCollisionQueryService::FirstHit) {
+#if QT_CONFIG(concurrent)
Hit firstHit = QtConcurrent::blockingMappedReduced<Hit>(volumes, gathererFunctor, reduceToFirstHit);
+#else
+ Hit firstHit;
+ for (const QBoundingVolume *volume : volumes)
+ firstHit = reduceToFirstHit(firstHit, gathererFunctor(volume));
+#endif
if (firstHit.intersects)
q->addEntityHit(result, firstHit.id, firstHit.intersection, firstHit.distance, firstHit.uvw);
} else {
+#if QT_CONFIG(concurrent)
QVector<Hit> hits = QtConcurrent::blockingMappedReduced<QVector<Hit> >(volumes, gathererFunctor, reduceToAllHits);
+#else
+ QVector<Hit> hits;
+ for (const QBoundingVolume *volume : volumes)
+ hits = reduceToAllHits(hits, gathererFunctor(volume));
+#endif
std::sort(hits.begin(), hits.end(), compareHitsDistance);
for (const Hit &hit : qAsConst(hits))
q->addEntityHit(result, hit.id, hit.intersection, hit.distance, hit.uvw);
@@ -182,9 +194,13 @@ QQueryHandle QRayCastingService::query(const QRay3D &ray,
// Blocking mapReduce
+#if QT_CONFIG(concurrent)
FutureQueryResult future = QtConcurrent::run(d, &QRayCastingServicePrivate::collides,
ray, provider, mode, handle);
d->m_results.insert(handle, future);
+#else
+ d->m_results.insert(handle, d->collides(ray, provider, mode, handle));
+#endif
return handle;
}
@@ -200,7 +216,11 @@ QCollisionQueryResult QRayCastingService::fetchResult(const QQueryHandle &handle
{
Q_D(QRayCastingService);
+#if QT_CONFIG(concurrent)
return d->m_results.value(handle).result();
+#else
+ return d->m_results.value(handle);
+#endif
}
QVector<QCollisionQueryResult> QRayCastingService::fetchAllResults() const
@@ -210,8 +230,13 @@ QVector<QCollisionQueryResult> QRayCastingService::fetchAllResults() const
QVector<QCollisionQueryResult> results;
results.reserve(d->m_results.size());
+#if QT_CONFIG(concurrent)
for (const FutureQueryResult &future : d->m_results)
results.append(future.result());
+#else
+ for (const QCollisionQueryResult &result : d->m_results)
+ results.append(result);
+#endif
return results;
}