summaryrefslogtreecommitdiffstats
path: root/src/gui/math3d/qquaternion.cpp
diff options
context:
space:
mode:
authorKonstantin Ritt <ritt.ks@gmail.com>2015-02-20 03:38:32 +0400
committerKonstantin Ritt <ritt.ks@gmail.com>2015-02-26 11:02:59 +0000
commitb7d4e4ffebf91ff539e705abef9941073667f373 (patch)
treef8882212752ebdb7794bfb0aa1612505a0425b99 /src/gui/math3d/qquaternion.cpp
parente628c80dc38f00efd5a7821a8be61eadcf838b62 (diff)
Optimize quaternion to rotation matrix convertion
Rearrange operands to get rid of 50% of multiplications (i.e. `2 * (x * x + z * z)` -> `(x + x) * x + (z + z) * z`). Change-Id: Ib5279425ead999fc571b4964ac1681b6e22f9a7e Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/gui/math3d/qquaternion.cpp')
-rw-r--r--src/gui/math3d/qquaternion.cpp41
1 files changed, 22 insertions, 19 deletions
diff --git a/src/gui/math3d/qquaternion.cpp b/src/gui/math3d/qquaternion.cpp
index 6e9d17d1e1..4f07d82a25 100644
--- a/src/gui/math3d/qquaternion.cpp
+++ b/src/gui/math3d/qquaternion.cpp
@@ -592,25 +592,28 @@ QMatrix3x3 QQuaternion::toRotationMatrix() const
QMatrix3x3 rot3x3(Qt::Uninitialized);
- const float xx = xp * xp;
- const float xy = xp * yp;
- const float xz = xp * zp;
- const float xw = xp * wp;
- const float yy = yp * yp;
- const float yz = yp * zp;
- const float yw = yp * wp;
- const float zz = zp * zp;
- const float zw = zp * wp;
-
- rot3x3(0, 0) = 1.0f - 2.0f * (yy + zz);
- rot3x3(0, 1) = 2.0f * (xy - zw);
- rot3x3(0, 2) = 2.0f * (xz + yw);
- rot3x3(1, 0) = 2.0f * (xy + zw);
- rot3x3(1, 1) = 1.0f - 2.0f * (xx + zz);
- rot3x3(1, 2) = 2.0f * (yz - xw);
- rot3x3(2, 0) = 2.0f * (xz - yw);
- rot3x3(2, 1) = 2.0f * (yz + xw);
- rot3x3(2, 2) = 1.0f - 2.0f * (xx + yy);
+ const float f2x = xp + xp;
+ const float f2y = yp + yp;
+ const float f2z = zp + zp;
+ const float f2xw = f2x * wp;
+ const float f2yw = f2y * wp;
+ const float f2zw = f2z * wp;
+ const float f2xx = f2x * xp;
+ const float f2xy = f2x * yp;
+ const float f2xz = f2x * zp;
+ const float f2yy = f2y * yp;
+ const float f2yz = f2y * zp;
+ const float f2zz = f2z * zp;
+
+ rot3x3(0, 0) = 1.0f - (f2yy + f2zz);
+ rot3x3(0, 1) = f2xy - f2zw;
+ rot3x3(0, 2) = f2xz + f2yw;
+ rot3x3(1, 0) = f2xy + f2zw;
+ rot3x3(1, 1) = 1.0f - (f2xx + f2zz);
+ rot3x3(1, 2) = f2yz - f2xw;
+ rot3x3(2, 0) = f2xz - f2yw;
+ rot3x3(2, 1) = f2yz + f2xw;
+ rot3x3(2, 2) = 1.0f - (f2xx + f2yy);
return rot3x3;
}