7#include <QtGui/qtguiglobal.h>
8#include <QtGui/qgenericmatrix.h>
9#include <QtGui/qvector3d.h>
10#include <QtGui/qvector4d.h>
15#ifndef QT_NO_QUATERNION
23 constexpr QQuaternion()
noexcept;
24 explicit QQuaternion(Qt::Initialization)
noexcept {}
25 constexpr QQuaternion(
float scalar,
float xpos,
float ypos,
float zpos)
noexcept;
27 constexpr QQuaternion(
float scalar,
const QVector3D &vector)
noexcept;
30 constexpr explicit QQuaternion(
const QVector4D &vector)
noexcept;
33 constexpr bool isNull()
const noexcept;
34 constexpr bool isIdentity()
const noexcept;
37 constexpr QVector3D vector()
const noexcept;
38 constexpr void setVector(
const QVector3D &vector)
noexcept;
40 constexpr void setVector(
float x,
float y,
float z)
noexcept;
42 constexpr float x()
const noexcept;
43 constexpr float y()
const noexcept;
44 constexpr float z()
const noexcept;
45 constexpr float scalar()
const noexcept;
47 constexpr void setX(
float x)
noexcept;
48 constexpr void setY(
float y)
noexcept;
49 constexpr void setZ(
float z)
noexcept;
50 constexpr void setScalar(
float scalar)
noexcept;
52 constexpr static float dotProduct(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
56 QT7_ONLY(Q_GUI_EXPORT)
float length()
const;
57 QT7_ONLY(Q_GUI_EXPORT)
float lengthSquared()
const;
59 [[nodiscard]] QT7_ONLY(Q_GUI_EXPORT) QQuaternion normalized()
const;
60 QT7_ONLY(Q_GUI_EXPORT)
void normalize();
62 constexpr QQuaternion inverted()
const noexcept;
64 [[nodiscard]]
constexpr QQuaternion conjugated()
const noexcept;
66 QT7_ONLY(Q_GUI_EXPORT) QVector3D rotatedVector(
const QVector3D &vector)
const;
68 constexpr QQuaternion &operator+=(
const QQuaternion &quaternion)
noexcept;
69 constexpr QQuaternion &operator-=(
const QQuaternion &quaternion)
noexcept;
70 constexpr QQuaternion &operator*=(
float factor)
noexcept;
71 constexpr QQuaternion &operator*=(
const QQuaternion &quaternion)
noexcept;
72 constexpr QQuaternion &operator/=(
float divisor);
75QT_WARNING_DISABLE_FLOAT_COMPARE
76 friend constexpr bool operator==(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
78 return q1.wp == q2.wp && q1.xp == q2.xp && q1.yp == q2.yp && q1.zp == q2.zp;
80 friend constexpr bool operator!=(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
86 friend constexpr QQuaternion operator+(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
87 friend constexpr QQuaternion operator-(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
88 friend constexpr QQuaternion operator*(
float factor,
const QQuaternion &quaternion)
noexcept;
89 friend constexpr QQuaternion operator*(
const QQuaternion &quaternion,
float factor)
noexcept;
90 friend constexpr QQuaternion operator*(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
91 friend constexpr QQuaternion operator-(
const QQuaternion &quaternion)
noexcept;
92 friend constexpr QQuaternion operator/(
const QQuaternion &quaternion,
float divisor);
94 friend constexpr bool qFuzzyCompare(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
97 constexpr QVector4D toVector4D()
const noexcept;
100 QT7_ONLY(Q_GUI_EXPORT) operator QVariant()
const;
102#ifndef QT_NO_VECTOR3D
103 inline void getAxisAndAngle(QVector3D *axis,
float *angle)
const;
104 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromAxisAndAngle(
const QVector3D &axis,
float angle);
106 QT7_ONLY(Q_GUI_EXPORT)
void getAxisAndAngle(
float *x,
float *y,
float *z,
float *angle)
const;
107 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromAxisAndAngle(
float x,
float y,
float z,
110#ifndef QT_NO_VECTOR3D
111 inline QVector3D toEulerAngles()
const;
112# if !QT_CORE_REMOVED_SINCE(6
, 11
)
115 static QQuaternion fromEulerAngles(
const QVector3D &angles)
116 {
return fromEulerAngles(angles.x(), angles.y(), angles.z()); }
119 template <
typename T>
124 QT7_ONLY(Q_GUI_EXPORT) EulerAngles<
float> eulerAngles()
const;
125 static QQuaternion fromEulerAngles(EulerAngles<
float> angles)
126 {
return fromEulerAngles(angles.pitch, angles.yaw, angles.roll); }
128 QT_GUI_INLINE_SINCE(6, 11)
129 void getEulerAngles(
float *pitch,
float *yaw,
float *roll)
const;
130 static QQuaternion fromEulerAngles(
float pitch,
float yaw,
float roll);
132 QT7_ONLY(Q_GUI_EXPORT) QMatrix3x3 toRotationMatrix()
const;
133 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromRotationMatrix(
const QMatrix3x3 &rot3x3);
135#ifndef QT_NO_VECTOR3D
140 QT7_ONLY(Q_GUI_EXPORT) Axes toAxes()
const;
141 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromAxes(Axes axes);
142 QT_GUI_INLINE_SINCE(6, 11)
143 void getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis)
const;
144 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromAxes(
const QVector3D &xAxis,
145 const QVector3D &yAxis,
146 const QVector3D &zAxis);
148 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromDirection(
const QVector3D &direction,
149 const QVector3D &up);
151 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion rotationTo(
const QVector3D &from,
152 const QVector3D &to);
155 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion slerp(
const QQuaternion &q1,
const QQuaternion &q2,
157 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion nlerp(
const QQuaternion &q1,
const QQuaternion &q2,
161 float wp, xp, yp, zp;
166constexpr QQuaternion::QQuaternion()
noexcept : wp(1.0f), xp(0.0f), yp(0.0f), zp(0.0f) {}
168constexpr QQuaternion::QQuaternion(
float aScalar,
float xpos,
float ypos,
float zpos)
noexcept
169 : wp(aScalar), xp(xpos), yp(ypos), zp(zpos) {}
172QT_WARNING_DISABLE_FLOAT_COMPARE
174constexpr bool QQuaternion::isNull()
const noexcept
176 return wp == 0.0f && xp == 0.0f && yp == 0.0f && zp == 0.0f;
179constexpr bool QQuaternion::isIdentity()
const noexcept
181 return wp == 1.0f && xp == 0.0f && yp == 0.0f && zp == 0.0f;
185constexpr float QQuaternion::x()
const noexcept {
return xp; }
186constexpr float QQuaternion::y()
const noexcept {
return yp; }
187constexpr float QQuaternion::z()
const noexcept {
return zp; }
188constexpr float QQuaternion::scalar()
const noexcept {
return wp; }
190constexpr void QQuaternion::setX(
float aX)
noexcept { xp = aX; }
191constexpr void QQuaternion::setY(
float aY)
noexcept { yp = aY; }
192constexpr void QQuaternion::setZ(
float aZ)
noexcept { zp = aZ; }
193constexpr void QQuaternion::setScalar(
float aScalar)
noexcept { wp = aScalar; }
195constexpr float QQuaternion::dotProduct(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
197 return q1.wp * q2.wp + q1.xp * q2.xp + q1.yp * q2.yp + q1.zp * q2.zp;
200constexpr QQuaternion QQuaternion::inverted()
const noexcept
203 double len =
double(wp) *
double(wp) +
204 double(xp) *
double(xp) +
205 double(yp) *
double(yp) +
206 double(zp) *
double(zp);
207 if (!qFuzzyIsNull(len))
208 return QQuaternion(
float(
double(wp) / len),
float(
double(-xp) / len),
209 float(
double(-yp) / len),
float(
double(-zp) / len));
210 return QQuaternion(0.0f, 0.0f, 0.0f, 0.0f);
213constexpr QQuaternion QQuaternion::conjugated()
const noexcept
215 return QQuaternion(wp, -xp, -yp, -zp);
218constexpr QQuaternion &QQuaternion::operator+=(
const QQuaternion &quaternion)
noexcept
227constexpr QQuaternion &QQuaternion::operator-=(
const QQuaternion &quaternion)
noexcept
236constexpr QQuaternion &QQuaternion::operator*=(
float factor)
noexcept
245constexpr QQuaternion
operator*(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
247 float yy = (q1.wp - q1.yp) * (q2.wp + q2.zp);
248 float zz = (q1.wp + q1.yp) * (q2.wp - q2.zp);
249 float ww = (q1.zp + q1.xp) * (q2.xp + q2.yp);
250 float xx = ww + yy + zz;
251 float qq = 0.5f * (xx + (q1.zp - q1.xp) * (q2.xp - q2.yp));
253 float w = qq - ww + (q1.zp - q1.yp) * (q2.yp - q2.zp);
254 float x = qq - xx + (q1.xp + q1.wp) * (q2.xp + q2.wp);
255 float y = qq - yy + (q1.wp - q1.xp) * (q2.yp + q2.zp);
256 float z = qq - zz + (q1.zp + q1.yp) * (q2.wp - q2.xp);
258 return QQuaternion(w, x, y, z);
261constexpr QQuaternion &QQuaternion::operator*=(
const QQuaternion &quaternion)
noexcept
263 *
this = *
this * quaternion;
267constexpr QQuaternion &QQuaternion::operator/=(
float divisor)
276constexpr QQuaternion
operator+(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
278 return QQuaternion(q1.wp + q2.wp, q1.xp + q2.xp, q1.yp + q2.yp, q1.zp + q2.zp);
281constexpr QQuaternion
operator-(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
283 return QQuaternion(q1.wp - q2.wp, q1.xp - q2.xp, q1.yp - q2.yp, q1.zp - q2.zp);
286constexpr QQuaternion
operator*(
float factor,
const QQuaternion &quaternion)
noexcept
288 return QQuaternion(quaternion.wp * factor, quaternion.xp * factor, quaternion.yp * factor, quaternion.zp * factor);
291constexpr QQuaternion
operator*(
const QQuaternion &quaternion,
float factor)
noexcept
293 return QQuaternion(quaternion.wp * factor, quaternion.xp * factor, quaternion.yp * factor, quaternion.zp * factor);
296constexpr QQuaternion
operator-(
const QQuaternion &quaternion)
noexcept
298 return QQuaternion(-quaternion.wp, -quaternion.xp, -quaternion.yp, -quaternion.zp);
301constexpr QQuaternion
operator/(
const QQuaternion &quaternion,
float divisor)
303 return QQuaternion(quaternion.wp / divisor, quaternion.xp / divisor, quaternion.yp / divisor, quaternion.zp / divisor);
306constexpr bool qFuzzyCompare(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
308 return qFuzzyCompare(q1.wp, q2.wp) &&
309 qFuzzyCompare(q1.xp, q2.xp) &&
310 qFuzzyCompare(q1.yp, q2.yp) &&
311 qFuzzyCompare(q1.zp, q2.zp);
314#if QT_GUI_INLINE_IMPL_SINCE(6
, 11
)
315void QQuaternion::getEulerAngles(
float *pitch,
float *yaw,
float *roll)
const
320 const auto angles = eulerAngles();
321 *pitch = angles.pitch;
327#ifndef QT_NO_VECTOR3D
329constexpr QQuaternion::QQuaternion(
float aScalar,
const QVector3D &aVector)
noexcept
330 : wp(aScalar), xp(aVector.x()), yp(aVector.y()), zp(aVector.z()) {}
332constexpr void QQuaternion::setVector(
const QVector3D &aVector)
noexcept
339constexpr QVector3D QQuaternion::vector()
const noexcept
341 return QVector3D(xp, yp, zp);
346 return quaternion.rotatedVector(vec);
349void QQuaternion::getAxisAndAngle(QVector3D *axis,
float *angle)
const
352 getAxisAndAngle(&aX, &aY, &aZ, angle);
353 *axis = QVector3D(aX, aY, aZ);
356QVector3D QQuaternion::toEulerAngles()
const
358 const auto angles = eulerAngles();
359 return QVector3D{angles.pitch, angles.yaw, angles.roll};
362#if QT_GUI_INLINE_IMPL_SINCE(6
, 11
)
363void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis)
const
368 const Axes axes = toAxes();
377constexpr void QQuaternion::setVector(
float aX,
float aY,
float aZ)
noexcept
384#ifndef QT_NO_VECTOR4D
386constexpr QQuaternion::QQuaternion(
const QVector4D &aVector)
noexcept
387 : wp(aVector.w()), xp(aVector.x()), yp(aVector.y()), zp(aVector.z()) {}
389constexpr QVector4D QQuaternion::toVector4D()
const noexcept
391 return QVector4D(xp, yp, zp, wp);
396#ifndef QT_NO_DEBUG_STREAM
397Q_GUI_EXPORT
QDebug operator<<(QDebug dbg,
const QQuaternion &q);
400#ifndef QT_NO_DATASTREAM
401Q_GUI_EXPORT
QDataStream &operator<<(QDataStream &,
const QQuaternion &);
402Q_GUI_EXPORT
QDataStream &operator>>(QDataStream &, QQuaternion &);
\inmodule QtCore\reentrant
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
QList< QGradientStop > QGradientStops
std::pair< qreal, QColor > QGradientStop
QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
void qRegisterGuiVariant()
QMatrix4x4 operator*(const QMatrix4x4 &m1, const QMatrix4x4 &m2)
QMatrix4x4 operator-(const QMatrix4x4 &matrix)
QMatrix4x4 operator*(const QMatrix4x4 &matrix, float factor)
QMatrix4x4 operator*(float factor, const QMatrix4x4 &matrix)
QMatrix4x4 operator-(const QMatrix4x4 &m1, const QMatrix4x4 &m2)
QDebug Q_GUI_EXPORT & operator<<(QDebug &s, const QVectorPath &path)
constexpr QQuaternion operator*(float factor, const QQuaternion &quaternion) noexcept
QVector3D operator*(const QQuaternion &quaternion, const QVector3D &vec)
constexpr QQuaternion operator-(const QQuaternion &q1, const QQuaternion &q2) noexcept
constexpr QQuaternion operator*(const QQuaternion &quaternion, float factor) noexcept
constexpr bool qFuzzyCompare(const QQuaternion &q1, const QQuaternion &q2) noexcept
constexpr QQuaternion operator/(const QQuaternion &quaternion, float divisor)
Q_DECLARE_TYPEINFO(QQuaternion, Q_PRIMITIVE_TYPE)
constexpr QQuaternion operator-(const QQuaternion &quaternion) noexcept
constexpr QQuaternion operator*(const QQuaternion &q1, const QQuaternion &q2) noexcept
constexpr QQuaternion operator+(const QQuaternion &q1, const QQuaternion &q2) noexcept
Q_DECLARE_TYPEINFO(QTextLength, Q_PRIMITIVE_TYPE)
void operator()(QBrushData *d) const noexcept
static const QtPrivate::QMetaTypeInterface * interfaceForType(int type)
static bool convert(const void *from, int fromTypeId, void *to, int toTypeId)