summaryrefslogtreecommitdiffstats
path: root/src/render/raycasting
diff options
context:
space:
mode:
authorMike Krus <mike.krus@kdab.com>2015-12-08 12:06:12 +0000
committerMike Krus <mike.krus@kdab.com>2016-01-25 09:03:41 +0000
commit4ad00b344bc79e34f2ba2f8355e65c7948791389 (patch)
tree277ff0f997b962ccb6034728e780cbf77f60c643 /src/render/raycasting
parentd798eb52ae1b22fa38d398cdae0012a34cb51922 (diff)
Expose picking details to front end
Intersection (world and local) and distance added to pick event Modified test so that it includes the event Change-Id: I8631d626e5108d2e044374ee3425625f5588c38c Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/raycasting')
-rw-r--r--src/render/raycasting/qabstractcollisionqueryservice.cpp4
-rw-r--r--src/render/raycasting/qabstractcollisionqueryservice_p.h2
-rw-r--r--src/render/raycasting/qcollisionqueryresult.cpp17
-rw-r--r--src/render/raycasting/qcollisionqueryresult_p.h42
-rw-r--r--src/render/raycasting/qraycastingservice.cpp4
5 files changed, 47 insertions, 22 deletions
diff --git a/src/render/raycasting/qabstractcollisionqueryservice.cpp b/src/render/raycasting/qabstractcollisionqueryservice.cpp
index e28b3a7ea..8f756b2ce 100644
--- a/src/render/raycasting/qabstractcollisionqueryservice.cpp
+++ b/src/render/raycasting/qabstractcollisionqueryservice.cpp
@@ -57,9 +57,9 @@ void QAbstractCollisionQueryService::setResultHandle(QCollisionQueryResult &resu
result.d_func()->setHandle(handle);
}
-void QAbstractCollisionQueryService::addEntityHit(QCollisionQueryResult &result, const Qt3DCore::QNodeId &entity)
+void QAbstractCollisionQueryService::addEntityHit(QCollisionQueryResult &result, const Qt3DCore::QNodeId &entity, const QVector3D& intersection, float distance)
{
- result.d_func()->addEntityHit(entity);
+ result.d_func()->addEntityHit(entity, intersection, distance);
}
} // Qt3DRender
diff --git a/src/render/raycasting/qabstractcollisionqueryservice_p.h b/src/render/raycasting/qabstractcollisionqueryservice_p.h
index 8a6042bf7..051946d5e 100644
--- a/src/render/raycasting/qabstractcollisionqueryservice_p.h
+++ b/src/render/raycasting/qabstractcollisionqueryservice_p.h
@@ -92,7 +92,7 @@ protected:
QAbstractCollisionQueryService(QAbstractCollisionQueryServicePrivate &dd);
void setResultHandle(QCollisionQueryResult &result, const QQueryHandle &handle);
- void addEntityHit(QCollisionQueryResult &result, const Qt3DCore::QNodeId &entity);
+ void addEntityHit(QCollisionQueryResult &result, const Qt3DCore::QNodeId &entity, const QVector3D &intersection, float distance);
private:
Q_DECLARE_PRIVATE(QAbstractCollisionQueryService)
diff --git a/src/render/raycasting/qcollisionqueryresult.cpp b/src/render/raycasting/qcollisionqueryresult.cpp
index cf2ea0a9a..e4dc24ebd 100644
--- a/src/render/raycasting/qcollisionqueryresult.cpp
+++ b/src/render/raycasting/qcollisionqueryresult.cpp
@@ -48,13 +48,13 @@ QCollisionQueryResultPrivate::QCollisionQueryResultPrivate()
QCollisionQueryResultPrivate::QCollisionQueryResultPrivate(const QCollisionQueryResultPrivate &copy)
: QSharedData(copy)
, m_handle(copy.m_handle)
- , m_entitiesHit(copy.m_entitiesHit)
+ , m_hits(copy.m_hits)
{
}
-void QCollisionQueryResultPrivate::addEntityHit(const Qt3DCore::QNodeId &entity)
+void QCollisionQueryResultPrivate::addEntityHit(const Qt3DCore::QNodeId &entity, const QVector3D& intersection, float distance)
{
- m_entitiesHit.append(entity);
+ m_hits.append(QCollisionQueryResult::Hit(entity, intersection, distance));
}
void QCollisionQueryResultPrivate::setHandle(const QQueryHandle &handle)
@@ -82,10 +82,19 @@ QCollisionQueryResult &QCollisionQueryResult::operator=(const QCollisionQueryRes
return *this;
}
+QVector<QCollisionQueryResult::Hit> QCollisionQueryResult::hits() const
+{
+ Q_D(const QCollisionQueryResult);
+ return d->m_hits;
+}
+
QVector<Qt3DCore::QNodeId> QCollisionQueryResult::entitiesHit() const
{
Q_D(const QCollisionQueryResult);
- return d->m_entitiesHit;
+ QVector<Qt3DCore::QNodeId> result;
+ Q_FOREACH (const Hit& hit, d->m_hits)
+ result << hit.m_entityId;
+ return result;
}
/*!
diff --git a/src/render/raycasting/qcollisionqueryresult_p.h b/src/render/raycasting/qcollisionqueryresult_p.h
index c4eb164ff..21035e6a8 100644
--- a/src/render/raycasting/qcollisionqueryresult_p.h
+++ b/src/render/raycasting/qcollisionqueryresult_p.h
@@ -51,6 +51,7 @@
#include <Qt3DRender/qt3drender_global.h>
#include <Qt3DCore/qnodeid.h>
#include <QVector>
+#include <QVector3D>
#include <QSharedData>
QT_BEGIN_NAMESPACE
@@ -58,23 +59,19 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender {
typedef int QQueryHandle;
-
-class QCollisionQueryResultPrivate : public QSharedData
-{
-public:
- explicit QCollisionQueryResultPrivate();
- explicit QCollisionQueryResultPrivate(const QCollisionQueryResultPrivate &copy);
-
- void setHandle(const QQueryHandle &handle);
- void addEntityHit(const Qt3DCore::QNodeId &entity);
-
- QQueryHandle m_handle;
- QVector<Qt3DCore::QNodeId> m_entitiesHit;
-};
+class QCollisionQueryResultPrivate;
class QT3DRENDERSHARED_EXPORT QCollisionQueryResult
{
public:
+ struct Hit {
+ Hit() : m_distance(-1.f) { }
+ Hit(const Qt3DCore::QNodeId &entity, const QVector3D &intersection, float distance) : m_entityId(entity), m_intersection(intersection), m_distance(distance) { }
+ Qt3DCore::QNodeId m_entityId;
+ QVector3D m_intersection;
+ float m_distance;
+ };
+
QCollisionQueryResult();
QCollisionQueryResult(const QCollisionQueryResult &);
~QCollisionQueryResult();
@@ -94,6 +91,7 @@ public:
}
QQueryHandle handle() const;
+ QVector<Hit> hits() const;
QVector<Qt3DCore::QNodeId> entitiesHit() const;
private:
@@ -110,6 +108,24 @@ private:
}
};
+class QCollisionQueryResultPrivate : public QSharedData
+{
+public:
+ explicit QCollisionQueryResultPrivate();
+ explicit QCollisionQueryResultPrivate(const QCollisionQueryResultPrivate &copy);
+
+ void setHandle(const QQueryHandle &handle);
+ void addEntityHit(const Qt3DCore::QNodeId &entity, const QVector3D& intersection, float distance);
+
+ QQueryHandle m_handle;
+ QVector<QCollisionQueryResult::Hit> m_hits;
+};
+
+inline bool operator==(const QCollisionQueryResult::Hit& left, const QCollisionQueryResult::Hit& right)
+{
+ return left.m_entityId == right.m_entityId;
+}
+
} // Qt3DRender
Q_DECLARE_SHARED(Qt3DRender::QCollisionQueryResult)
diff --git a/src/render/raycasting/qraycastingservice.cpp b/src/render/raycasting/qraycastingservice.cpp
index 8e897ec14..0b183f087 100644
--- a/src/render/raycasting/qraycastingservice.cpp
+++ b/src/render/raycasting/qraycastingservice.cpp
@@ -130,12 +130,12 @@ QCollisionQueryResult QRayCastingServicePrivate::collides(const Qt3DCore::QRay3D
if (mode == QAbstractCollisionQueryService::FirstHit) {
Hit firstHit = QtConcurrent::blockingMappedReduced<Hit>(volumes, gathererFunctor, reduceToFirstHit);
if (firstHit.intersects)
- q->addEntityHit(result, firstHit.id);
+ q->addEntityHit(result, firstHit.id, firstHit.intersection, firstHit.distance);
} else {
QVector<Hit> hits = QtConcurrent::blockingMappedReduced<QVector<Hit> >(volumes, gathererFunctor, reduceToAllHits);
std::sort(hits.begin(), hits.end(), compareHitsDistance);
Q_FOREACH (const Hit &hit, hits)
- q->addEntityHit(result, hit.id);
+ q->addEntityHit(result, hit.id, hit.intersection, hit.distance);
}
return result;