summaryrefslogtreecommitdiffstats
path: root/src/render/raycasting
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/raycasting')
-rw-r--r--src/render/raycasting/qabstractcollisionqueryservice.cpp6
-rw-r--r--src/render/raycasting/qabstractcollisionqueryservice_p.h4
-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.h21
-rw-r--r--src/render/raycasting/qraycastingservice.cpp8
6 files changed, 35 insertions, 12 deletions
diff --git a/src/render/raycasting/qabstractcollisionqueryservice.cpp b/src/render/raycasting/qabstractcollisionqueryservice.cpp
index 132af00c9..993ad840e 100644
--- a/src/render/raycasting/qabstractcollisionqueryservice.cpp
+++ b/src/render/raycasting/qabstractcollisionqueryservice.cpp
@@ -61,9 +61,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);
}
} // RayCasting
diff --git a/src/render/raycasting/qabstractcollisionqueryservice_p.h b/src/render/raycasting/qabstractcollisionqueryservice_p.h
index e2f9fb65a..1c1261937 100644
--- a/src/render/raycasting/qabstractcollisionqueryservice_p.h
+++ b/src/render/raycasting/qabstractcollisionqueryservice_p.h
@@ -79,6 +79,7 @@ public:
class QT3DRENDERSHARED_EXPORT QAbstractCollisionQueryService : public Qt3DCore::QAbstractServiceProvider
{
+ Q_OBJECT
public:
enum QueryMode {
FirstHit,
@@ -96,7 +97,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 f29d08d52..8267c2b18 100644
--- a/src/render/raycasting/qboundingvolume_p.h
+++ b/src/render/raycasting/qboundingvolume_p.h
@@ -72,7 +72,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 4d887d287..62975200c 100644
--- a/src/render/raycasting/qcollisionqueryresult.cpp
+++ b/src/render/raycasting/qcollisionqueryresult.cpp
@@ -56,9 +56,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 18b45370a..e13dda74a 100644
--- a/src/render/raycasting/qcollisionqueryresult_p.h
+++ b/src/render/raycasting/qcollisionqueryresult_p.h
@@ -69,13 +69,27 @@ 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(const Qt3DCore::QNodeId &entity, const QVector3D &intersection, float distance) : m_entityId(entity), m_intersection(intersection), m_distance(distance) { }
+ 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, 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();
@@ -123,7 +137,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 e92234836..e0c7b6199 100644
--- a/src/render/raycasting/qraycastingservice.cpp
+++ b/src/render/raycasting/qraycastingservice.cpp
@@ -68,6 +68,7 @@ struct Hit
float distance;
Qt3DCore::QNodeId id;
QVector3D intersection;
+ QVector3D uvw;
};
bool compareHitsDistance(const Hit &a, const Hit &b)
@@ -78,7 +79,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();
}
@@ -134,12 +135,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;
@@ -154,6 +155,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;
}