summaryrefslogtreecommitdiffstats
path: root/src/render/raycasting
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2016-10-25 10:12:58 +0300
committerAntti Määttä <antti.maatta@qt.io>2017-01-24 16:22:20 +0000
commitfc142f59a364c47818356fc6bf13471fec49ea99 (patch)
tree7738d2ae3494ea3034fe04014e35d014a4c817b6 /src/render/raycasting
parent1ce5d53260ae1acc792b693a7af2288bbe3cb85a (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')
-rw-r--r--src/render/raycasting/qabstractcollisionqueryservice.cpp6
-rw-r--r--src/render/raycasting/qabstractcollisionqueryservice_p.h3
-rw-r--r--src/render/raycasting/qboundingvolume_p.h3
-rw-r--r--src/render/raycasting/qcollisionqueryresult.cpp5
-rw-r--r--src/render/raycasting/qcollisionqueryresult_p.h7
-rw-r--r--src/render/raycasting/qraycastingservice.cpp8
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 &copy);
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;
}