summaryrefslogtreecommitdiffstats
path: root/src/gui/math3d/qvector4d.h
diff options
context:
space:
mode:
authorGiuseppe D'Angelo <giuseppe.dangelo@kdab.com>2020-02-06 00:58:22 +0100
committerLars Knoll <lars.knoll@qt.io>2020-11-19 12:28:45 +0100
commit5a61c88e1fee77db5c99837bf2d59630777b671a (patch)
treebcf98c37a00d69c3c1f0084115bf9094f23f9998 /src/gui/math3d/qvector4d.h
parentb4c17476129e07dd3bf52c6aac8a51cf30c2dd3a (diff)
Clean up QVector2D/3D/4D
In random order: * Remove code marked for removal in Qt 6. * Inline as much as possible. This should give us a massive speed boost in some simple operations where the function call overhead as much as the cost of body of the function itself (lengthSquared, dotProduct, etc.). * Plaster constexpr and noexcept, as much as possible; follow Lakos' rule. * Unexport the classes; selectively export only the symbols still defined out of line. * Add [[nodiscard]] to any non-trivial mathematical operation (e.g. calculate the length). * To avoid circular dependencies, centralize their implementation in one file. Leave the existing headers for compatibility with existing #include statements. * Change all the signatures of the classes' members to take QVectorND, QPointF, etc. objects by value, not by const ref. Usage in other classes (e.g. QMatrix4x4) has not been adjusted. Change-Id: Iaf5a4b5289fcdf704e77656793390b8e772e94a5 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src/gui/math3d/qvector4d.h')
-rw-r--r--src/gui/math3d/qvector4d.h277
1 files changed, 4 insertions, 273 deletions
diff --git a/src/gui/math3d/qvector4d.h b/src/gui/math3d/qvector4d.h
index 327c6f01d3..fc42579918 100644
--- a/src/gui/math3d/qvector4d.h
+++ b/src/gui/math3d/qvector4d.h
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtGui module of the Qt Toolkit.
@@ -37,278 +38,8 @@
**
****************************************************************************/
-#ifndef QVECTOR4D_H
-#define QVECTOR4D_H
-
-#include <QtGui/qtguiglobal.h>
-#include <QtCore/qpoint.h>
-#include <QtCore/qmetatype.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QMatrix4x4;
-class QVector2D;
-class QVector3D;
-
-#ifndef QT_NO_VECTOR4D
-
-class Q_GUI_EXPORT QVector4D
-{
-public:
- constexpr QVector4D();
- explicit QVector4D(Qt::Initialization) {}
- constexpr QVector4D(float xpos, float ypos, float zpos, float wpos);
- constexpr explicit QVector4D(const QPoint& point);
- constexpr explicit QVector4D(const QPointF& point);
-#ifndef QT_NO_VECTOR2D
- QVector4D(const QVector2D& vector);
- QVector4D(const QVector2D& vector, float zpos, float wpos);
-#endif
-#ifndef QT_NO_VECTOR3D
- QVector4D(const QVector3D& vector);
- QVector4D(const QVector3D& vector, float wpos);
-#endif
-
- bool isNull() const;
-
- constexpr float x() const;
- constexpr float y() const;
- constexpr float z() const;
- constexpr float w() const;
-
- void setX(float x);
- void setY(float y);
- void setZ(float z);
- void setW(float w);
-
- float &operator[](int i);
- float operator[](int i) const;
-
- float length() const;
- float lengthSquared() const; //In Qt 6 convert to inline and constexpr
-
- [[nodiscard]] QVector4D normalized() const;
- void normalize();
-
- QVector4D &operator+=(const QVector4D &vector);
- QVector4D &operator-=(const QVector4D &vector);
- QVector4D &operator*=(float factor);
- QVector4D &operator*=(const QVector4D &vector);
- QVector4D &operator/=(float divisor);
- inline QVector4D &operator/=(const QVector4D &vector);
-
- static float dotProduct(const QVector4D& v1, const QVector4D& v2); //In Qt 6 convert to inline and constexpr
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_FLOAT_COMPARE
- constexpr friend inline bool operator==(const QVector4D &v1, const QVector4D &v2) noexcept
- {
- return v1.v[0] == v2.v[0] && v1.v[1] == v2.v[1] && v1.v[2] == v2.v[2] && v1.v[3] == v2.v[3];
- }
-
- constexpr friend inline bool operator!=(const QVector4D &v1, const QVector4D &v2) noexcept
- {
- return v1.v[0] != v2.v[0] || v1.v[1] != v2.v[1] || v1.v[2] != v2.v[2] || v1.v[3] != v2.v[3];
- }
-QT_WARNING_POP
-
- constexpr friend inline const QVector4D operator+(const QVector4D &v1, const QVector4D &v2);
- constexpr friend inline const QVector4D operator-(const QVector4D &v1, const QVector4D &v2);
- constexpr friend inline const QVector4D operator*(float factor, const QVector4D &vector);
- constexpr friend inline const QVector4D operator*(const QVector4D &vector, float factor);
- constexpr friend inline const QVector4D operator*(const QVector4D &v1, const QVector4D& v2);
- constexpr friend inline const QVector4D operator-(const QVector4D &vector);
- constexpr friend inline const QVector4D operator/(const QVector4D &vector, float divisor);
- constexpr friend inline const QVector4D operator/(const QVector4D &vector, const QVector4D &divisor);
-
- constexpr friend inline bool qFuzzyCompare(const QVector4D& v1, const QVector4D& v2);
-
-#ifndef QT_NO_VECTOR2D
- QVector2D toVector2D() const;
- QVector2D toVector2DAffine() const;
-#endif
-#ifndef QT_NO_VECTOR3D
- QVector3D toVector3D() const;
- QVector3D toVector3DAffine() const;
-#endif
-
- constexpr QPoint toPoint() const;
- constexpr QPointF toPointF() const;
-
- operator QVariant() const;
-
-private:
- float v[4];
-
- friend class QVector2D;
- friend class QVector3D;
-#ifndef QT_NO_MATRIX4X4
- friend QVector4D operator*(const QVector4D& vector, const QMatrix4x4& matrix);
- friend QVector4D operator*(const QMatrix4x4& matrix, const QVector4D& vector);
-#endif
-};
-
-Q_DECLARE_TYPEINFO(QVector4D, Q_PRIMITIVE_TYPE);
-
-constexpr inline QVector4D::QVector4D() : v{0.0f, 0.0f, 0.0f, 0.0f} {}
-
-constexpr inline QVector4D::QVector4D(float xpos, float ypos, float zpos, float wpos) : v{xpos, ypos, zpos, wpos} {}
-
-constexpr inline QVector4D::QVector4D(const QPoint& point) : v{float(point.x()), float(point.y()), 0.0f, 0.0f} {}
-
-constexpr inline QVector4D::QVector4D(const QPointF& point) : v{float(point.x()), float(point.y()), 0.0f, 0.0f} {}
-
-inline bool QVector4D::isNull() const
-{
- return qIsNull(v[0]) && qIsNull(v[1]) && qIsNull(v[2]) && qIsNull(v[3]);
-}
-
-constexpr inline float QVector4D::x() const { return v[0]; }
-constexpr inline float QVector4D::y() const { return v[1]; }
-constexpr inline float QVector4D::z() const { return v[2]; }
-constexpr inline float QVector4D::w() const { return v[3]; }
-
-inline void QVector4D::setX(float aX) { v[0] = aX; }
-inline void QVector4D::setY(float aY) { v[1] = aY; }
-inline void QVector4D::setZ(float aZ) { v[2] = aZ; }
-inline void QVector4D::setW(float aW) { v[3] = aW; }
-
-inline float &QVector4D::operator[](int i)
-{
- Q_ASSERT(uint(i) < 4u);
- return v[i];
-}
-
-inline float QVector4D::operator[](int i) const
-{
- Q_ASSERT(uint(i) < 4u);
- return v[i];
-}
-
-inline QVector4D &QVector4D::operator+=(const QVector4D &vector)
-{
- v[0] += vector.v[0];
- v[1] += vector.v[1];
- v[2] += vector.v[2];
- v[3] += vector.v[3];
- return *this;
-}
-
-inline QVector4D &QVector4D::operator-=(const QVector4D &vector)
-{
- v[0] -= vector.v[0];
- v[1] -= vector.v[1];
- v[2] -= vector.v[2];
- v[3] -= vector.v[3];
- return *this;
-}
-
-inline QVector4D &QVector4D::operator*=(float factor)
-{
- v[0] *= factor;
- v[1] *= factor;
- v[2] *= factor;
- v[3] *= factor;
- return *this;
-}
-
-inline QVector4D &QVector4D::operator*=(const QVector4D &vector)
-{
- v[0] *= vector.v[0];
- v[1] *= vector.v[1];
- v[2] *= vector.v[2];
- v[3] *= vector.v[3];
- return *this;
-}
-
-inline QVector4D &QVector4D::operator/=(float divisor)
-{
- v[0] /= divisor;
- v[1] /= divisor;
- v[2] /= divisor;
- v[3] /= divisor;
- return *this;
-}
-
-inline QVector4D &QVector4D::operator/=(const QVector4D &vector)
-{
- v[0] /= vector.v[0];
- v[1] /= vector.v[1];
- v[2] /= vector.v[2];
- v[3] /= vector.v[3];
- return *this;
-}
-
-constexpr inline const QVector4D operator+(const QVector4D &v1, const QVector4D &v2)
-{
- return QVector4D(v1.v[0] + v2.v[0], v1.v[1] + v2.v[1], v1.v[2] + v2.v[2], v1.v[3] + v2.v[3]);
-}
-
-constexpr inline const QVector4D operator-(const QVector4D &v1, const QVector4D &v2)
-{
- return QVector4D(v1.v[0] - v2.v[0], v1.v[1] - v2.v[1], v1.v[2] - v2.v[2], v1.v[3] - v2.v[3]);
-}
-
-constexpr inline const QVector4D operator*(float factor, const QVector4D &vector)
-{
- return QVector4D(vector.v[0] * factor, vector.v[1] * factor, vector.v[2] * factor, vector.v[3] * factor);
-}
-
-constexpr inline const QVector4D operator*(const QVector4D &vector, float factor)
-{
- return QVector4D(vector.v[0] * factor, vector.v[1] * factor, vector.v[2] * factor, vector.v[3] * factor);
-}
-
-constexpr inline const QVector4D operator*(const QVector4D &v1, const QVector4D& v2)
-{
- return QVector4D(v1.v[0] * v2.v[0], v1.v[1] * v2.v[1], v1.v[2] * v2.v[2], v1.v[3] * v2.v[3]);
-}
-
-constexpr inline const QVector4D operator-(const QVector4D &vector)
-{
- return QVector4D(-vector.v[0], -vector.v[1], -vector.v[2], -vector.v[3]);
-}
-
-constexpr inline const QVector4D operator/(const QVector4D &vector, float divisor)
-{
- return QVector4D(vector.v[0] / divisor, vector.v[1] / divisor, vector.v[2] / divisor, vector.v[3] / divisor);
-}
-
-constexpr inline const QVector4D operator/(const QVector4D &vector, const QVector4D &divisor)
-{
- return QVector4D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1], vector.v[2] / divisor.v[2], vector.v[3] / divisor.v[3]);
-}
-
-constexpr inline bool qFuzzyCompare(const QVector4D& v1, const QVector4D& v2)
-{
- return qFuzzyCompare(v1.v[0], v2.v[0]) &&
- qFuzzyCompare(v1.v[1], v2.v[1]) &&
- qFuzzyCompare(v1.v[2], v2.v[2]) &&
- qFuzzyCompare(v1.v[3], v2.v[3]);
-}
-
-constexpr inline QPoint QVector4D::toPoint() const
-{
- return QPoint(qRound(v[0]), qRound(v[1]));
-}
-
-constexpr inline QPointF QVector4D::toPointF() const
-{
- return QPointF(qreal(v[0]), qreal(v[1]));
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QVector4D &vector);
-#endif
-
-#ifndef QT_NO_DATASTREAM
-Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QVector4D &);
-Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QVector4D &);
-#endif
-
-#endif
-
-QT_END_NAMESPACE
+#include <QtGui/qvectornd.h>
+#if 0
+#pragma qt_sync_stop_processing
#endif