diff options
author | Mike Krus <mike.krus@kdab.com> | 2015-12-08 12:06:12 +0000 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2016-01-25 09:03:41 +0000 |
commit | 4ad00b344bc79e34f2ba2f8355e65c7948791389 (patch) | |
tree | 277ff0f997b962ccb6034728e780cbf77f60c643 /src/render/raycasting | |
parent | d798eb52ae1b22fa38d398cdae0012a34cb51922 (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')
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 ©) : 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 ©); - - 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 ©); + + 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; |