diff options
author | Antti Määttä <antti.maatta@qt.io> | 2016-10-25 10:12:58 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2017-01-24 16:22:20 +0000 |
commit | fc142f59a364c47818356fc6bf13471fec49ea99 (patch) | |
tree | 7738d2ae3494ea3034fe04014e35d014a4c817b6 /src/render/raycasting | |
parent | 1ce5d53260ae1acc792b693a7af2288bbe3cb85a (diff) |
Retrieve uvw parameters when picking
The uvw can be used to interpolate coordinates on the intersection point.
Change-Id: I725ef572a78ad7766000270622f3ac85edd11071
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/raycasting')
6 files changed, 21 insertions, 11 deletions
diff --git a/src/render/raycasting/qabstractcollisionqueryservice.cpp b/src/render/raycasting/qabstractcollisionqueryservice.cpp index 4c59b6aab..32878ebd0 100644 --- a/src/render/raycasting/qabstractcollisionqueryservice.cpp +++ b/src/render/raycasting/qabstractcollisionqueryservice.cpp @@ -60,9 +60,11 @@ void QAbstractCollisionQueryService::setResultHandle(QCollisionQueryResult &resu result.d_func()->setHandle(handle); } -void QAbstractCollisionQueryService::addEntityHit(QCollisionQueryResult &result, Qt3DCore::QNodeId entity, const QVector3D& intersection, float distance) +void QAbstractCollisionQueryService::addEntityHit(QCollisionQueryResult &result, Qt3DCore::QNodeId entity, + const QVector3D& intersection, float distance, + const QVector3D& uvw) { - result.d_func()->addEntityHit(entity, intersection, distance); + result.d_func()->addEntityHit(entity, intersection, distance, uvw); } } // Qt3DRender diff --git a/src/render/raycasting/qabstractcollisionqueryservice_p.h b/src/render/raycasting/qabstractcollisionqueryservice_p.h index d26eacb98..f6f3bf334 100644 --- a/src/render/raycasting/qabstractcollisionqueryservice_p.h +++ b/src/render/raycasting/qabstractcollisionqueryservice_p.h @@ -95,7 +95,8 @@ protected: QAbstractCollisionQueryService(QAbstractCollisionQueryServicePrivate &dd); void setResultHandle(QCollisionQueryResult &result, const QQueryHandle &handle); - void addEntityHit(QCollisionQueryResult &result, Qt3DCore::QNodeId entity, const QVector3D &intersection, float distance); + void addEntityHit(QCollisionQueryResult &result, Qt3DCore::QNodeId entity, const QVector3D &intersection, + float distance, const QVector3D &uvw); private: Q_DECLARE_PRIVATE(QAbstractCollisionQueryService) diff --git a/src/render/raycasting/qboundingvolume_p.h b/src/render/raycasting/qboundingvolume_p.h index a69530246..0e5f6e45d 100644 --- a/src/render/raycasting/qboundingvolume_p.h +++ b/src/render/raycasting/qboundingvolume_p.h @@ -70,7 +70,8 @@ public: }; virtual Qt3DCore::QNodeId id() const = 0; - virtual bool intersects(const QRay3D &ray, QVector3D *q = nullptr) const = 0; + virtual bool intersects(const QRay3D &ray, QVector3D *q = nullptr, + QVector3D *uvw = nullptr) const = 0; virtual Type type() const = 0; }; diff --git a/src/render/raycasting/qcollisionqueryresult.cpp b/src/render/raycasting/qcollisionqueryresult.cpp index e4a6afa69..ad150d9a2 100644 --- a/src/render/raycasting/qcollisionqueryresult.cpp +++ b/src/render/raycasting/qcollisionqueryresult.cpp @@ -55,9 +55,10 @@ QCollisionQueryResultPrivate::QCollisionQueryResultPrivate(const QCollisionQuery { } -void QCollisionQueryResultPrivate::addEntityHit(Qt3DCore::QNodeId entity, const QVector3D& intersection, float distance) +void QCollisionQueryResultPrivate::addEntityHit(Qt3DCore::QNodeId entity, const QVector3D& intersection, + float distance, const QVector3D& uvw) { - m_hits.append(QCollisionQueryResult::Hit(entity, intersection, distance)); + m_hits.append(QCollisionQueryResult::Hit(entity, intersection, distance, uvw)); } void QCollisionQueryResultPrivate::setHandle(const QQueryHandle &handle) diff --git a/src/render/raycasting/qcollisionqueryresult_p.h b/src/render/raycasting/qcollisionqueryresult_p.h index 81bca98b6..fe96bfe48 100644 --- a/src/render/raycasting/qcollisionqueryresult_p.h +++ b/src/render/raycasting/qcollisionqueryresult_p.h @@ -69,12 +69,14 @@ class QT3DRENDERSHARED_EXPORT QCollisionQueryResult public: struct Hit { Hit() : m_distance(-1.f), m_triangleIndex(0) { m_vertexIndex[0] = m_vertexIndex[1] = m_vertexIndex[2] = 0; } - Hit(Qt3DCore::QNodeId entity, const QVector3D &intersection, float distance) : m_entityId(entity), m_intersection(intersection), m_distance(distance) { } + Hit(Qt3DCore::QNodeId entity, const QVector3D &intersection, float distance, const QVector3D &uvw) + : m_entityId(entity), m_intersection(intersection), m_distance(distance), m_uvw(uvw) { } Qt3DCore::QNodeId m_entityId; QVector3D m_intersection; float m_distance; uint m_triangleIndex; uint m_vertexIndex[3]; + QVector3D m_uvw; }; QCollisionQueryResult(); @@ -122,7 +124,8 @@ public: explicit QCollisionQueryResultPrivate(const QCollisionQueryResultPrivate ©); void setHandle(const QQueryHandle &handle); - void addEntityHit(Qt3DCore::QNodeId entity, const QVector3D& intersection, float distance); + void addEntityHit(Qt3DCore::QNodeId entity, const QVector3D& intersection, float distance, + const QVector3D& uvw); QQueryHandle m_handle; QVector<QCollisionQueryResult::Hit> m_hits; diff --git a/src/render/raycasting/qraycastingservice.cpp b/src/render/raycasting/qraycastingservice.cpp index 6dfb1c57a..9f3a52380 100644 --- a/src/render/raycasting/qraycastingservice.cpp +++ b/src/render/raycasting/qraycastingservice.cpp @@ -67,6 +67,7 @@ struct Hit float distance; Qt3DCore::QNodeId id; QVector3D intersection; + QVector3D uvw; }; bool compareHitsDistance(const Hit &a, const Hit &b) @@ -77,7 +78,7 @@ bool compareHitsDistance(const Hit &a, const Hit &b) Hit volumeRayIntersection(const QBoundingVolume *volume, const QRay3D &ray) { Hit hit; - if ((hit.intersects = volume->intersects(ray, &hit.intersection))) { + if ((hit.intersects = volume->intersects(ray, &hit.intersection, &hit.uvw))) { hit.distance = ray.projectedDistance(hit.intersection); hit.id = volume->id(); } @@ -133,12 +134,12 @@ QCollisionQueryResult QRayCastingServicePrivate::collides(const QRay3D &ray, QBo if (mode == QAbstractCollisionQueryService::FirstHit) { Hit firstHit = QtConcurrent::blockingMappedReduced<Hit>(volumes, gathererFunctor, reduceToFirstHit); if (firstHit.intersects) - q->addEntityHit(result, firstHit.id, firstHit.intersection, firstHit.distance); + q->addEntityHit(result, firstHit.id, firstHit.intersection, firstHit.distance, firstHit.uvw); } else { QVector<Hit> hits = QtConcurrent::blockingMappedReduced<QVector<Hit> >(volumes, gathererFunctor, reduceToAllHits); std::sort(hits.begin(), hits.end(), compareHitsDistance); for (const Hit &hit : qAsConst(hits)) - q->addEntityHit(result, hit.id, hit.intersection, hit.distance); + q->addEntityHit(result, hit.id, hit.intersection, hit.distance, hit.uvw); } return result; @@ -153,6 +154,7 @@ QCollisionQueryResult::Hit QRayCastingServicePrivate::collides(const QRay3D &ray result.m_distance = hit.distance; result.m_entityId = hit.id; result.m_intersection = hit.intersection; + result.m_uvw = hit.uvw; } return result; } |