summaryrefslogtreecommitdiffstats
path: root/src/render/raycasting
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2017-03-15 10:17:05 +0100
committerPaul Lemire <paul.lemire@kdab.com>2018-02-02 13:58:34 +0000
commit437a33de9336a5c50711e63dd6dfcd86ad28d5a5 (patch)
tree6f6cbf6fa5285a79cda6a849a0b96e744ec840c6 /src/render/raycasting
parent46319648436814afb5a77755dde6681e304befaf (diff)
Render: Use SIMD Vectors and Matrices in the backend
Change-Id: I19b3b2f8fcb06eb2bc600ebe370465dd15a8eabc Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/raycasting')
-rw-r--r--src/render/raycasting/boundingsphere_p.h3
-rw-r--r--src/render/raycasting/qabstractcollisionqueryservice.cpp4
-rw-r--r--src/render/raycasting/qabstractcollisionqueryservice_p.h4
-rw-r--r--src/render/raycasting/qboundingvolume_p.h5
-rw-r--r--src/render/raycasting/qcollisionqueryresult.cpp4
-rw-r--r--src/render/raycasting/qcollisionqueryresult_p.h12
-rw-r--r--src/render/raycasting/qray3d.cpp43
-rw-r--r--src/render/raycasting/qray3d_p.h32
-rw-r--r--src/render/raycasting/qraycastingservice.cpp4
9 files changed, 57 insertions, 54 deletions
diff --git a/src/render/raycasting/boundingsphere_p.h b/src/render/raycasting/boundingsphere_p.h
index 63bd8a562..bcffbaa19 100644
--- a/src/render/raycasting/boundingsphere_p.h
+++ b/src/render/raycasting/boundingsphere_p.h
@@ -53,6 +53,7 @@
#include <Qt3DRender/qt3drender_global.h>
#include <Qt3DRender/private/qboundingvolume_p.h>
+#include <Qt3DCore/private/vector3d_p.h>
QT_BEGIN_NAMESPACE
@@ -65,7 +66,7 @@ public:
BoundingSphere();
~BoundingSphere();
- virtual QVector3D center() const = 0;
+ virtual Vector3D center() const = 0;
virtual float radius() const = 0;
};
diff --git a/src/render/raycasting/qabstractcollisionqueryservice.cpp b/src/render/raycasting/qabstractcollisionqueryservice.cpp
index 993ad840e..5148df911 100644
--- a/src/render/raycasting/qabstractcollisionqueryservice.cpp
+++ b/src/render/raycasting/qabstractcollisionqueryservice.cpp
@@ -62,8 +62,8 @@ void QAbstractCollisionQueryService::setResultHandle(QCollisionQueryResult &resu
}
void QAbstractCollisionQueryService::addEntityHit(QCollisionQueryResult &result, Qt3DCore::QNodeId entity,
- const QVector3D& intersection, float distance,
- const QVector3D& uvw)
+ const Vector3D& intersection, float distance,
+ const Vector3D& uvw)
{
result.d_func()->addEntityHit(entity, intersection, distance, uvw);
}
diff --git a/src/render/raycasting/qabstractcollisionqueryservice_p.h b/src/render/raycasting/qabstractcollisionqueryservice_p.h
index 1c1261937..fa35792d0 100644
--- a/src/render/raycasting/qabstractcollisionqueryservice_p.h
+++ b/src/render/raycasting/qabstractcollisionqueryservice_p.h
@@ -97,8 +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, const QVector3D &uvw);
+ void addEntityHit(QCollisionQueryResult &result, Qt3DCore::QNodeId entity, const Vector3D &intersection,
+ float distance, const Vector3D &uvw);
private:
Q_DECLARE_PRIVATE(QAbstractCollisionQueryService)
diff --git a/src/render/raycasting/qboundingvolume_p.h b/src/render/raycasting/qboundingvolume_p.h
index 8267c2b18..b63463f23 100644
--- a/src/render/raycasting/qboundingvolume_p.h
+++ b/src/render/raycasting/qboundingvolume_p.h
@@ -53,6 +53,7 @@
#include <Qt3DRender/qt3drender_global.h>
#include <Qt3DCore/qnodeid.h>
+#include <Qt3DCore/private/vector3d_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
@@ -72,8 +73,8 @@ public:
};
virtual Qt3DCore::QNodeId id() const = 0;
- virtual bool intersects(const QRay3D &ray, QVector3D *q = nullptr,
- QVector3D *uvw = nullptr) const = 0;
+ virtual bool intersects(const QRay3D &ray, Vector3D *q = nullptr,
+ Vector3D *uvw = nullptr) const = 0;
virtual Type type() const = 0;
};
diff --git a/src/render/raycasting/qcollisionqueryresult.cpp b/src/render/raycasting/qcollisionqueryresult.cpp
index 62975200c..9d1e484b6 100644
--- a/src/render/raycasting/qcollisionqueryresult.cpp
+++ b/src/render/raycasting/qcollisionqueryresult.cpp
@@ -56,8 +56,8 @@ QCollisionQueryResultPrivate::QCollisionQueryResultPrivate(const QCollisionQuery
{
}
-void QCollisionQueryResultPrivate::addEntityHit(Qt3DCore::QNodeId entity, const QVector3D& intersection,
- float distance, const QVector3D& uvw)
+void QCollisionQueryResultPrivate::addEntityHit(Qt3DCore::QNodeId entity, const Vector3D& intersection,
+ float distance, const Vector3D& uvw)
{
m_hits.append(QCollisionQueryResult::Hit(entity, intersection, distance, uvw));
}
diff --git a/src/render/raycasting/qcollisionqueryresult_p.h b/src/render/raycasting/qcollisionqueryresult_p.h
index 1a430e019..24371d30e 100644
--- a/src/render/raycasting/qcollisionqueryresult_p.h
+++ b/src/render/raycasting/qcollisionqueryresult_p.h
@@ -53,8 +53,8 @@
#include <Qt3DRender/qt3drender_global.h>
#include <Qt3DCore/qnodeid.h>
+#include <Qt3DCore/private/vector3d_p.h>
#include <QVector>
-#include <QVector3D>
#include <QSharedData>
QT_BEGIN_NAMESPACE
@@ -84,7 +84,7 @@ public:
m_vertexIndex[0] = m_vertexIndex[1] = m_vertexIndex[2] = 0;
}
- Hit(Qt3DCore::QNodeId entity, const QVector3D &intersection, float distance, const QVector3D &uvw)
+ Hit(Qt3DCore::QNodeId entity, const Vector3D &intersection, float distance, const Vector3D &uvw)
: m_entityId(entity)
, m_intersection(intersection)
, m_distance(distance)
@@ -94,11 +94,11 @@ public:
Qt3DCore::QNodeId m_entityId;
HitType m_type;
- QVector3D m_intersection;
+ Vector3D m_intersection;
float m_distance;
uint m_primitiveIndex;
uint m_vertexIndex[3];
- QVector3D m_uvw;
+ Vector3D m_uvw;
};
QCollisionQueryResult();
@@ -146,8 +146,8 @@ public:
explicit QCollisionQueryResultPrivate(const QCollisionQueryResultPrivate &copy);
void setHandle(const QQueryHandle &handle);
- void addEntityHit(Qt3DCore::QNodeId entity, const QVector3D& intersection, float distance,
- const QVector3D& uvw);
+ void addEntityHit(Qt3DCore::QNodeId entity, const Vector3D& intersection, float distance,
+ const Vector3D& uvw);
QQueryHandle m_handle;
QVector<QCollisionQueryResult::Hit> m_hits;
diff --git a/src/render/raycasting/qray3d.cpp b/src/render/raycasting/qray3d.cpp
index 3f136deb8..40d16bc73 100644
--- a/src/render/raycasting/qray3d.cpp
+++ b/src/render/raycasting/qray3d.cpp
@@ -93,7 +93,7 @@ QRay3D::QRay3D()
QRay3D thruAB(pointA, pointB - pointA);
\endcode
*/
-QRay3D::QRay3D(const QVector3D &origin, const QVector3D &direction, float distance)
+QRay3D::QRay3D(const Vector3D &origin, const Vector3D &direction, float distance)
: m_origin(origin)
, m_direction(direction)
, m_distance(distance)
@@ -110,7 +110,7 @@ QRay3D::~QRay3D()
\sa setOrigin(), direction()
*/
-QVector3D QRay3D::origin() const
+Vector3D QRay3D::origin() const
{
return m_origin;
}
@@ -122,7 +122,7 @@ QVector3D QRay3D::origin() const
\sa origin(), setDirection()
*/
-void QRay3D::setOrigin(const QVector3D &value)
+void QRay3D::setOrigin(const Vector3D &value)
{
m_origin = value;
}
@@ -134,7 +134,7 @@ void QRay3D::setOrigin(const QVector3D &value)
\sa setDirection(), origin()
*/
-QVector3D QRay3D::direction() const
+Vector3D QRay3D::direction() const
{
return m_direction;
}
@@ -146,7 +146,7 @@ QVector3D QRay3D::direction() const
\sa direction(), setOrigin()
*/
-void QRay3D::setDirection(const QVector3D &value)
+void QRay3D::setDirection(const Vector3D &value)
{
if (value.isNull())
return;
@@ -164,12 +164,12 @@ void QRay3D::setDistance(float distance)
m_distance = distance;
}
-QVector3D QRay3D::point(float t) const
+Vector3D QRay3D::point(float t) const
{
return m_origin + t * m_direction;
}
-QRay3D &QRay3D::transform(const QMatrix4x4 &matrix)
+QRay3D &QRay3D::transform(const Matrix4x4 &matrix)
{
m_origin = matrix * m_origin;
m_direction = matrix.mapVector(m_direction);
@@ -177,7 +177,7 @@ QRay3D &QRay3D::transform(const QMatrix4x4 &matrix)
return *this;
}
-QRay3D QRay3D::transformed(const QMatrix4x4 &matrix) const
+QRay3D QRay3D::transformed(const Matrix4x4 &matrix) const
{
return QRay3D(matrix * m_origin, matrix.mapVector(m_direction));
}
@@ -195,12 +195,12 @@ bool QRay3D::operator!=(const QRay3D &other) const
/*!
Returns true if \a point lies on this ray; false otherwise.
*/
-bool QRay3D::contains(const QVector3D &point) const
+bool QRay3D::contains(const Vector3D &point) const
{
- QVector3D ppVec(point - m_origin);
+ Vector3D ppVec(point - m_origin);
if (ppVec.isNull()) // point coincides with origin
return true;
- const float dot = QVector3D::dotProduct(ppVec, m_direction);
+ const float dot = Vector3D ::dotProduct(ppVec, m_direction);
if (qFuzzyIsNull(dot))
return false;
return qFuzzyCompare(dot*dot, ppVec.lengthSquared() * m_direction.lengthSquared());
@@ -213,7 +213,7 @@ bool QRay3D::contains(const QVector3D &point) const
*/
bool QRay3D::contains(const QRay3D &ray) const
{
- const float dot = QVector3D::dotProduct(m_direction, ray.direction());
+ const float dot = Vector3D ::dotProduct(m_direction, ray.direction());
if (!qFuzzyCompare(dot*dot, m_direction.lengthSquared() * ray.direction().lengthSquared()))
return false;
return contains(ray.origin());
@@ -247,11 +247,11 @@ bool QRay3D::contains(const QRay3D &ray) const
\sa point(), project()
*/
-float QRay3D::projectedDistance(const QVector3D &point) const
+float QRay3D::projectedDistance(const Vector3D &point) const
{
Q_ASSERT(!m_direction.isNull());
- return QVector3D::dotProduct(point - m_origin, m_direction) /
+ return Vector3D ::dotProduct(point - m_origin, m_direction) /
m_direction.lengthSquared();
}
@@ -264,10 +264,10 @@ float QRay3D::projectedDistance(const QVector3D &point) const
\sa projectedDistance()
*/
-QVector3D QRay3D::project(const QVector3D &vector) const
+Vector3D QRay3D::project(const Vector3D &vector) const
{
- QVector3D norm = m_direction.normalized();
- return QVector3D::dotProduct(vector, norm) * norm;
+ Vector3D norm = m_direction.normalized();
+ return Vector3D ::dotProduct(vector, norm) * norm;
}
/*!
@@ -277,7 +277,7 @@ QVector3D QRay3D::project(const QVector3D &vector) const
\sa point()
*/
-float QRay3D::distance(const QVector3D &point) const
+float QRay3D::distance(const Vector3D &point) const
{
float t = projectedDistance(point);
return (point - (m_origin + t * m_direction)).length();
@@ -350,8 +350,8 @@ QDebug operator<<(QDebug dbg, const QRay3D &ray)
*/
QDataStream &operator<<(QDataStream &stream, const QRay3D &ray)
{
- stream << ray.origin();
- stream << ray.direction();
+ stream << convertToQVector3D(ray.origin());
+ stream << convertToQVector3D(ray.direction());
return stream;
}
@@ -364,9 +364,10 @@ QDataStream &operator<<(QDataStream &stream, const QRay3D &ray)
QDataStream &operator>>(QDataStream &stream, QRay3D &ray)
{
QVector3D origin, direction;
+
stream >> origin;
stream >> direction;
- ray = QRay3D(origin, direction);
+ ray = QRay3D(Vector3D(origin), Vector3D(direction));
return stream;
}
diff --git a/src/render/raycasting/qray3d_p.h b/src/render/raycasting/qray3d_p.h
index 7c1156b76..c5e2be078 100644
--- a/src/render/raycasting/qray3d_p.h
+++ b/src/render/raycasting/qray3d_p.h
@@ -53,8 +53,8 @@
//
#include <Qt3DRender/qt3drender_global.h>
-#include <QtGui/qvector3d.h>
-#include <QtGui/qmatrix4x4.h>
+#include <Qt3DCore/private/matrix4x4_p.h>
+#include <Qt3DCore/private/vector3d_p.h>
QT_BEGIN_NAMESPACE
@@ -65,37 +65,37 @@ class QT3DRENDERSHARED_EXPORT QRay3D
{
public:
QRay3D();
- explicit QRay3D(const QVector3D &origin, const QVector3D &direction = QVector3D(0.0f, 0.0f, 1.0f), float distance = 1.0f);
+ explicit QRay3D(const Vector3D &origin, const Vector3D &direction = Vector3D(0.0f, 0.0f, 1.0f), float distance = 1.0f);
~QRay3D();
- QVector3D origin() const;
- void setOrigin(const QVector3D &value);
+ Vector3D origin() const;
+ void setOrigin(const Vector3D &value);
- QVector3D direction() const;
- void setDirection(const QVector3D &value);
+ Vector3D direction() const;
+ void setDirection(const Vector3D &value);
float distance() const;
void setDistance(float distance);
- bool contains(const QVector3D &point) const;
+ bool contains(const Vector3D &point) const;
bool contains(const QRay3D &ray) const;
- QVector3D point(float t) const;
- float projectedDistance(const QVector3D &point) const;
+ Vector3D point(float t) const;
+ float projectedDistance(const Vector3D &point) const;
- QVector3D project(const QVector3D &vector) const;
+ Vector3D project(const Vector3D &vector) const;
- float distance(const QVector3D &point) const;
+ float distance(const Vector3D &point) const;
- QRay3D &transform(const QMatrix4x4 &matrix);
- QRay3D transformed(const QMatrix4x4 &matrix) const;
+ QRay3D &transform(const Matrix4x4 &matrix);
+ QRay3D transformed(const Matrix4x4 &matrix) const;
bool operator==(const QRay3D &other) const;
bool operator!=(const QRay3D &other) const;
private:
- QVector3D m_origin;
- QVector3D m_direction;
+ Vector3D m_origin;
+ Vector3D m_direction;
float m_distance;
};
QT3D_DECLARE_TYPEINFO_2(Qt3DRender, RayCasting, QRay3D, Q_MOVABLE_TYPE)
diff --git a/src/render/raycasting/qraycastingservice.cpp b/src/render/raycasting/qraycastingservice.cpp
index e0c7b6199..8debeac6a 100644
--- a/src/render/raycasting/qraycastingservice.cpp
+++ b/src/render/raycasting/qraycastingservice.cpp
@@ -67,8 +67,8 @@ struct Hit
bool intersects;
float distance;
Qt3DCore::QNodeId id;
- QVector3D intersection;
- QVector3D uvw;
+ Vector3D intersection;
+ Vector3D uvw;
};
bool compareHitsDistance(const Hit &a, const Hit &b)