Use f64 version of reciprocal_squareroot in quaternion::normalize for more precision.

The f32 version jumped around more on gcc/linux (didn't do so with VisualStudio, mabye sqrt on VS already uses double internally).


git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6036 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
cutealien 2020-01-03 17:09:39 +00:00
parent 34d09f7c63
commit 5d0b042a65
3 changed files with 9 additions and 9 deletions

View File

@ -140,7 +140,7 @@ class quaternion
quaternion& makeInverse(); quaternion& makeInverse();
//! Set this quaternion to the linear interpolation between two quaternions //! Set this quaternion to the linear interpolation between two quaternions
/** NOTE: lerp result is *not* a normalized quaternion. In most cases /** NOTE: lerp result is *not* a normalized quaternion. In most cases
you will want to use lerpN instead as most other quaternion functions expect you will want to use lerpN instead as most other quaternion functions expect
to work with a normalized quaternion. to work with a normalized quaternion.
\param q1 First quaternion to be interpolated. \param q1 First quaternion to be interpolated.
@ -152,7 +152,7 @@ class quaternion
quaternion& lerp(quaternion q1, quaternion q2, f32 time); quaternion& lerp(quaternion q1, quaternion q2, f32 time);
//! Set this quaternion to the linear interpolation between two quaternions and normalize the result //! Set this quaternion to the linear interpolation between two quaternions and normalize the result
/** /**
\param q1 First quaternion to be interpolated. \param q1 First quaternion to be interpolated.
\param q2 Second quaternion to be interpolated. \param q2 Second quaternion to be interpolated.
\param time Progress of interpolation. For time=0 the result is \param time Progress of interpolation. For time=0 the result is
@ -585,7 +585,7 @@ inline quaternion& quaternion::normalize()
{ {
// removed conditional branch since it may slow down and anyway the condition was // removed conditional branch since it may slow down and anyway the condition was
// false even after normalization in some cases. // false even after normalization in some cases.
return (*this *= reciprocal_squareroot ( X*X + Y*Y + Z*Z + W*W )); return (*this *= (f32)reciprocal_squareroot ( (f64)(X*X + Y*Y + Z*Z + W*W) ));
} }
// Set this quaternion to the result of the linear interpolation between two quaternions // Set this quaternion to the result of the linear interpolation between two quaternions

View File

@ -18,7 +18,7 @@ inline bool compareQ(const core::vector3df& v, const core::vector3df& turn=core:
logTestString("Inequality before quat.toEuler(): %f,%f,%f\n", v.X,v.Y,v.Z); logTestString("Inequality before quat.toEuler(): %f,%f,%f\n", v.X,v.Y,v.Z);
return false; return false;
} }
q.toEuler(v2); q.toEuler(v2);
v2*=core::RADTODEG; v2*=core::RADTODEG;
v2=v2.rotationToDirection(turn); v2=v2.rotationToDirection(turn);
@ -110,7 +110,7 @@ bool testQuatEulerMatrix()
core::vector3df v6 = mat.getRotationDegrees()*core::DEGTORAD; core::vector3df v6 = mat.getRotationDegrees()*core::DEGTORAD;
// make sure comparison matrix is correct // make sure comparison matrix is correct
result &= v4.equals(v6); result &= v4.equals(v6);
core::matrix4 mat2 = q1.getMatrix(); core::matrix4 mat2 = q1.getMatrix();
result &= mat.equals(mat2, 0.0005f); result &= mat.equals(mat2, 0.0005f);

View File

@ -1,4 +1,4 @@
Tests finished. 72 tests of 72 passed. Tests finished. 72 tests of 72 passed.
Compiled as DEBUG Compiled as DEBUG
Test suite pass at GMT Fri Jan 03 14:40:24 2020 Test suite pass at GMT Fri Jan 3 17:05:41 2020