QQuaternion: perform some operations in memory order
The order of member variables is wp, xp, yp, zp. When performing operations that touch all members, do so in declaration (=memory) order. Might enable autovectorization. Probably leads to slightly better cache behavior. Change-Id: Id9541e5a8011c349f5d24c5e9322bb232a7607b6 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
84770d6375
commit
596e157d3c
@ -164,12 +164,12 @@ inline QQuaternion::QQuaternion(float aScalar, float xpos, float ypos, float zpo
|
|||||||
|
|
||||||
inline bool QQuaternion::isNull() const
|
inline bool QQuaternion::isNull() const
|
||||||
{
|
{
|
||||||
return xp == 0.0f && yp == 0.0f && zp == 0.0f && wp == 0.0f;
|
return wp == 0.0f && xp == 0.0f && yp == 0.0f && zp == 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool QQuaternion::isIdentity() const
|
inline bool QQuaternion::isIdentity() const
|
||||||
{
|
{
|
||||||
return xp == 0.0f && yp == 0.0f && zp == 0.0f && wp == 1.0f;
|
return wp == 1.0f && xp == 0.0f && yp == 0.0f && zp == 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline float QQuaternion::x() const { return xp; }
|
inline float QQuaternion::x() const { return xp; }
|
||||||
@ -184,16 +184,16 @@ inline void QQuaternion::setScalar(float aScalar) { wp = aScalar; }
|
|||||||
|
|
||||||
Q_DECL_CONSTEXPR inline float QQuaternion::dotProduct(const QQuaternion &q1, const QQuaternion &q2)
|
Q_DECL_CONSTEXPR inline float QQuaternion::dotProduct(const QQuaternion &q1, const QQuaternion &q2)
|
||||||
{
|
{
|
||||||
return q1.xp * q2.xp + q1.yp * q2.yp + q1.zp * q2.zp + q1.wp * q2.wp;
|
return q1.wp * q2.wp + q1.xp * q2.xp + q1.yp * q2.yp + q1.zp * q2.zp;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QQuaternion QQuaternion::inverted() const
|
inline QQuaternion QQuaternion::inverted() const
|
||||||
{
|
{
|
||||||
// Need some extra precision if the length is very small.
|
// Need some extra precision if the length is very small.
|
||||||
double len = double(xp) * double(xp) +
|
double len = double(wp) * double(wp) +
|
||||||
|
double(xp) * double(xp) +
|
||||||
double(yp) * double(yp) +
|
double(yp) * double(yp) +
|
||||||
double(zp) * double(zp) +
|
double(zp) * double(zp);
|
||||||
double(wp) * double(wp);
|
|
||||||
if (!qFuzzyIsNull(len))
|
if (!qFuzzyIsNull(len))
|
||||||
return QQuaternion(wp / len, -xp / len, -yp / len, -zp / len);
|
return QQuaternion(wp / len, -xp / len, -yp / len, -zp / len);
|
||||||
return QQuaternion(0.0f, 0.0f, 0.0f, 0.0f);
|
return QQuaternion(0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
@ -213,28 +213,28 @@ inline QQuaternion QQuaternion::conjugate() const
|
|||||||
|
|
||||||
inline QQuaternion &QQuaternion::operator+=(const QQuaternion &quaternion)
|
inline QQuaternion &QQuaternion::operator+=(const QQuaternion &quaternion)
|
||||||
{
|
{
|
||||||
|
wp += quaternion.wp;
|
||||||
xp += quaternion.xp;
|
xp += quaternion.xp;
|
||||||
yp += quaternion.yp;
|
yp += quaternion.yp;
|
||||||
zp += quaternion.zp;
|
zp += quaternion.zp;
|
||||||
wp += quaternion.wp;
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QQuaternion &QQuaternion::operator-=(const QQuaternion &quaternion)
|
inline QQuaternion &QQuaternion::operator-=(const QQuaternion &quaternion)
|
||||||
{
|
{
|
||||||
|
wp -= quaternion.wp;
|
||||||
xp -= quaternion.xp;
|
xp -= quaternion.xp;
|
||||||
yp -= quaternion.yp;
|
yp -= quaternion.yp;
|
||||||
zp -= quaternion.zp;
|
zp -= quaternion.zp;
|
||||||
wp -= quaternion.wp;
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QQuaternion &QQuaternion::operator*=(float factor)
|
inline QQuaternion &QQuaternion::operator*=(float factor)
|
||||||
{
|
{
|
||||||
|
wp *= factor;
|
||||||
xp *= factor;
|
xp *= factor;
|
||||||
yp *= factor;
|
yp *= factor;
|
||||||
zp *= factor;
|
zp *= factor;
|
||||||
wp *= factor;
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,16 +262,16 @@ inline QQuaternion &QQuaternion::operator*=(const QQuaternion &quaternion)
|
|||||||
|
|
||||||
inline QQuaternion &QQuaternion::operator/=(float divisor)
|
inline QQuaternion &QQuaternion::operator/=(float divisor)
|
||||||
{
|
{
|
||||||
|
wp /= divisor;
|
||||||
xp /= divisor;
|
xp /= divisor;
|
||||||
yp /= divisor;
|
yp /= divisor;
|
||||||
zp /= divisor;
|
zp /= divisor;
|
||||||
wp /= divisor;
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool operator==(const QQuaternion &q1, const QQuaternion &q2)
|
inline bool operator==(const QQuaternion &q1, const QQuaternion &q2)
|
||||||
{
|
{
|
||||||
return q1.xp == q2.xp && q1.yp == q2.yp && q1.zp == q2.zp && q1.wp == q2.wp;
|
return q1.wp == q2.wp && q1.xp == q2.xp && q1.yp == q2.yp && q1.zp == q2.zp;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool operator!=(const QQuaternion &q1, const QQuaternion &q2)
|
inline bool operator!=(const QQuaternion &q1, const QQuaternion &q2)
|
||||||
@ -311,10 +311,10 @@ inline const QQuaternion operator/(const QQuaternion &quaternion, float divisor)
|
|||||||
|
|
||||||
inline bool qFuzzyCompare(const QQuaternion& q1, const QQuaternion& q2)
|
inline bool qFuzzyCompare(const QQuaternion& q1, const QQuaternion& q2)
|
||||||
{
|
{
|
||||||
return qFuzzyCompare(q1.xp, q2.xp) &&
|
return qFuzzyCompare(q1.wp, q2.wp) &&
|
||||||
|
qFuzzyCompare(q1.xp, q2.xp) &&
|
||||||
qFuzzyCompare(q1.yp, q2.yp) &&
|
qFuzzyCompare(q1.yp, q2.yp) &&
|
||||||
qFuzzyCompare(q1.zp, q2.zp) &&
|
qFuzzyCompare(q1.zp, q2.zp);
|
||||||
qFuzzyCompare(q1.wp, q2.wp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef QT_NO_VECTOR3D
|
#ifndef QT_NO_VECTOR3D
|
||||||
|
Loading…
x
Reference in New Issue
Block a user