diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2017-03-15 10:17:05 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2018-02-02 13:58:34 +0000 |
commit | 437a33de9336a5c50711e63dd6dfcd86ad28d5a5 (patch) | |
tree | 6f6cbf6fa5285a79cda6a849a0b96e744ec840c6 /src/render/raycasting | |
parent | 46319648436814afb5a77755dde6681e304befaf (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.h | 3 | ||||
-rw-r--r-- | src/render/raycasting/qabstractcollisionqueryservice.cpp | 4 | ||||
-rw-r--r-- | src/render/raycasting/qabstractcollisionqueryservice_p.h | 4 | ||||
-rw-r--r-- | src/render/raycasting/qboundingvolume_p.h | 5 | ||||
-rw-r--r-- | src/render/raycasting/qcollisionqueryresult.cpp | 4 | ||||
-rw-r--r-- | src/render/raycasting/qcollisionqueryresult_p.h | 12 | ||||
-rw-r--r-- | src/render/raycasting/qray3d.cpp | 43 | ||||
-rw-r--r-- | src/render/raycasting/qray3d_p.h | 32 | ||||
-rw-r--r-- | src/render/raycasting/qraycastingservice.cpp | 4 |
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 ©); 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) |